JSP무작정 해보기 - 게시판 만들기 - DB 만들기, DB 연동, 로그인 함수
저번 시간에 Login.jsp 페이지까지 만들었다.
이번 시간에는 회원가입 후 DB에 저장하기 위한 작업을 해보도록 하겠다.
우선 MYSQL을 키고 비밀번호를 입력한다.
그 후 회원가입 정보를 저장할 DB를 만든다.
CREATE DATABASE DB명;
다음과 같은 명령어를 입력하여 DB를 만든다. 나 같은 경우에는 JSP로 만들었다.
다음과 같이 만들고 SHOW DATABASES;를 입력하여 만들어진 DB를 확인한다.
SHOW DATABASES; 결과
다음과 같이 jsp라는 데이터 베이스가 생성된 걸 확인할 수 있다.
이제 jsp 파일을 사용하자
USE JSP;
use JSP; 라는 명령어를 이용하여 jsp를 사용한다.
다음으로는 jsp에 테이블을 생성하려고 한다.
create table USER(usrID varchar(20), userPassword varchar(20), userName varchar(20), userGender varchar(20), userEmail varchar(50), Primary key (userID));
create table이라는 명령어는 테이블을 만드는 명령어다.
테이블 안에는 회원가입으로 받을 값을 입력해주면 된다.
우선 user라는 테이블을 만든 뒤 user 테이블 안에 컬럼으로 사용할 것들을 적어준다.
˙ userID = 사용자로부터 받을 ID, 문자형으로 만들었음(20 글자)
˙ usePassword= 사용자로부터 받을 Password, 문자형으로 만들었음(20 글자)
˙ userName = 사용자로부터 받을 Name, 문자형으로 만들었음(20글자)
˙ userGender = 사용자로부터 받을 성별 문자형으로 만들었음(20글자)
˙ userEmail = 사용자로부터 받을 Email, 문자형으로 만들었음(50글자)
˙ Prumary key (userID) = ID가 겹치지 않게 하기 위해 userID에 Primary key 설정
다음과 같이 만들었다면 desc 명령어를 통해 한번 제대로 들어 갔는지 확인해 준다.
DESC user;
다음과 같이 만들어지면 된다.
이제 user라는 테이블 안에 값을 집어 넣어보자
INSERT INTO USER(userID, userPassword,userName,userGender, userEmail) VALUES('ID 값','비밀번호 값','이름 값','성별 값', 'Email 값');
다음과 같이 해서 값을 집어 넣은 후 SELECT * FROM USER; 를 입력해서 값이 제대로 들어갔는지 확인한다.
이렇게 되면 MYSQL의 기본 설정은 끝났다.
다음으로 eclipse에 들어가 Java Resources에 user라는 패키지를 만들어 준다.
user 패키지 만들기
Java Resources 오른쪽 마우스 클릭 -> new -> package 클릭 후 다음과 같이 user라는 패키지를 만들어 준다.
다음으로 User클래스를 만들어준다.
User 클래스 만들기
Java Resources 오른쪽 마우스 클릭 -> new -> class 클릭후 User라는 클래스를 만들어준다.
다음과 같이 클래스를 만든 후 DB에 만들었던 Field 명과 동일하게 변수를 만들어준다.
package user;
public class User {
//db에 만들었던 Field 명과 변수명 그대로 만들기
public String userID;
public String userPassword;
public String userName;
public String userGender;
public String userEmail;
만약 나와 동일하게 Field명을 입력하면 다음과 같이 작성하면 된다.
변수 초기화
다음으로 초기화를 위해 다음과 같이 작업을 해준다.
후
다음과 같이 select all을 선탤 후 Generate 버튼을 누르면
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserGender() {
return userGender;
}
public void setUserGender(String userGender) {
this.userGender = userGender;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
다음과 같은 코드가 작성된다.
DB 접근 객체 만들기
다음과 같이 작성하면 다음으로 DB 접근객체(DB 정보의 접근 및 정보를 집어 넣기 위한 객체)를 만들어보자
user package안에 userDAO라는 class를 만들어 주면 된다.
그 후 다음과 같이 코드를 입력해준다.
public class userDAO {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
˙ private Connection conn = DB 접속을 위해 만든 객체
˙ private PreparedStatement pstmt = sql injection 등 공격을 막기 위해 사용자에게 변수에 값만 받아서 구문을 실행함
˙ private ResultSet rs = SQL문 수행 후 그 결과를 담는 객체
DB에 연결하기 위한 코드 작성
다음과 같이 입력 후 DB 연결을 위한 코드를 작성해 준다.
public userDAO() {
//try catch 문을 통해 예외 처리
try {
String dbURL = "jdbc:mysql://localhost:8181/JSP";
String dbID = "DB ID";
String dbPassword = "DB 비밀번호";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dbURL,dbID,dbPassword);
} catch(Exception e) {
e.printStackTrace();
}
}
˙ try{} catch(Exception e){} = try catch문을 통해 예외 처리
˙ String dbURL = 연결할 DB, 만약 정확한 URL을 적어넣고도 에러가 발생한다면?serverTimezone=UTC를 입력해준다.
(serverTimezone 사용 이유 : MySQL JDBC Driver 5.1.X 버전 이후 버전부터 ‘KST’ 타임존을 인식불가로 인한 오류 발생.)
˙ String dbID = DB 처음 접속 시 만든 ID
˙ String dbPassword = DB 처음 접속 시 만든 Password
˙ Class.forName("com.mysql.jdbc.Driver") = mysql driver를 찾기 위해 작성(mysql 접속을 위한 매개체)
˙ conn = DriverManager.getConnection(dbURL,dbID, dbPassword) = DB의 접속하기 위한 코드
˙ e.printStackTrace = 만약 에러가 발생했을 시 무슨 에러가 발생했는지 알려줌
로그인 함수 만들기
다음과 같은 코드를 작성 한 후 로그인 함수를 만들어 준다.
public int login(String userID, String userPassword) {
String sql = "SELECT userPassword FROM USER WHERE userID=?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userID);
rs = pstmt.executeQuery();
if(rs.next()) {
if(rs.getString(1).contentEquals(userPassword)) {
return 1;
}
else
return 0;
}
return -1;
} catch(Exception e) {
e.printStackTrace();
}
return -2;
}
}
˙ String sql = "SELECT userPassword FROM USER WHERE userID = ?" = 로그인 함수 실행시 mysql에 입력할 sql문 입력
˙ pstmt = conn.prepareStatement(sql) = pstmt변수에 sql문을 집어 넣음
˙ pstmt.setString(1,userID) = sql문 중 첫번째 물음표에 userID를 집어 넣음
˙ rs = pstmt.executeQuery() = sql을 돌리고 그 결과를 rs라는 변수에 저장(executeQuery 같은 경우 결과 값을 숫자로 반환)
˙ if(rs.next()){ = 만약 아이디가 DB에 존재하는경우
˙ if(rs.getString(1).contentEqulas(userPassword)){ = 아이디에 해당하는 비밀번호가 일치하는 경우
˙ return 1 = 로그인 성공
˙ else return 0 = ID는 존재하지만 그에 맞는 패스워드가 틀림
˙ return -1 = 아이디도 DB에 존재하지 않는 경우
˙ return -2 = DB 오류
다음과 같이 입력하면 로그인 동작 함수까지 완성이 된다.
※ 전체적인 코드
package user;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
// db 접근 객체 실질적으로 db의 정보에 접근 or db에 정보를 집어넣기 위해 만듦
public class userDAO {
private Connection conn; // db에 접속을 위해 만든 객체
private PreparedStatement pstmt; // sql injection 등 공격을 막기 위해
private ResultSet rs; // 어떠한 정보를 담기 위한 객체
public userDAO() {
//try catch 문을 통해 예외 처리
try {
String dbURL = "jdbc:mysql://localhost:3306/JSP?serverTimezone=UTC";
String dbID = "DB ID";
String dbPassword = "DB비밀번호";
Class.forName("com.mysql.jdbc.Driver"); //mysql driver를 찾기 위해 작성(mysql 접속을 위한 매개체)
conn = DriverManager.getConnection(dbURL,dbID,dbPassword);
} catch(Exception e) {
e.printStackTrace(); // 오류 발생시 오류가 무엇인지 알려줌
}
}
public int login(String userID, String userPassword) {
String sql = "SELECT userPassword FROM USER WHERE userID=?";
try {
pstmt = conn.prepareStatement(sql); // pstmt변수에 sql문 집어넣기
pstmt.setString(1, userID); // sql 문에서 ?에 해당하는 값에 userID를 집어넣음 첫번째 물음표일 경우 1 두번째 물음표이면 2이런식으로
rs = pstmt.executeQuery(); // sql 수행결과를 rs에 저장(Boolean) 존재시 true 존재x = false
if(rs.next()) {
if(rs.getString(1).contentEquals(userPassword)) { // ?로 사용자에게 받은 ID와 비밀번호가 일치하는 경우
return 1; // 로그인 성공
}
else
return 0; // Password 오류
}// 만약 존재할시(true)
return -1; // ID 오류
} catch(Exception e) {
e.printStackTrace();
}
return -2; // db 오류
}
}