안경잡이개발자

728x90
반응형

  이번 강의는 JSP 강의평가(Lecture Evaluation) 웹 사이트 개발하기의 다섯 번째 시간입니다. 이번 시간에는 지난 시간에 했었던 데이터베이스 설계를 토대로 서버 프로그램상에서 데이터를 모델링하려고 합니다. 일반적으로 데이터를 모델링할 때는 DTO(Data Transfer Object)와 DAO(Data Access Object)를 작성해주시면 됩니다. DTO는 말 그대로 데이터베이스 테이블과 거의 1:1 대응되어 개별 데이터 원소를 보관하기 위해 사용되는 객체이며 DAO는 데이터베이스와 실질적으로 통신하는 모듈입니다. 이번 시간에는 가장 먼저 회원 데이터를 모델링해보도록 하겠습니다.



  먼저 위와 같이 자바 소스코드 영역에 user 패키지를 생성해서 UserDAO와 UserDTO를 자바 파일로 생성합니다.


  ▶ UserDTO.java


package user;


public class UserDTO {


private String userID;

private String userPassword;

private String userEmail;

private String userEmailHash;

private boolean userEmailChecked;

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 getUserEmail() {

return userEmail;

}

public void setUserEmail(String userEmail) {

this.userEmail = userEmail;

}

public String getUserEmailHash() {

return userEmailHash;

}

public void setUserEmailHash(String userEmailHash) {

this.userEmailHash = userEmailHash;

}

public boolean isUserEmailChecked() {

return userEmailChecked;

}

public void setUserEmailChecked(boolean userEmailChecked) {

this.userEmailChecked = userEmailChecked;

}

public UserDTO(String userID, String userPassword, String userEmail,

String userEmailHash, boolean userEmailChecked) {

this.userID = userID;

this.userPassword = userPassword;

this.userEmail = userEmail;

this.userEmailHash = userEmailHash;

this.userEmailChecked = userEmailChecked;

}


}


  위 DTO 파일을 보시면 사실상 이전 시간에 작업했던 데이터베이스 부분과 거의 일치하는 것을 알 수 있습니다. MySQL 언어를 자바 소스코드 언어로 바꾼 것 뿐이지요.


  ▶ UserDAO.java


package user;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;


public class UserDAO {


private Connection conn;

private ResultSet rs;


public UserDAO() {

try {

String dbURL = "jdbc:mysql://localhost:3306/LectureEvaluation";

String dbID = "root";

String dbPassword = "root1234";

Class.forName("com.mysql.jdbc.Driver");

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 {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, userID);

rs = pstmt.executeQuery();

if(rs.next()) {

if(rs.getString(1).equals(userPassword))

return 1; // 로그인 성공

else

return 0; // 비밀번호 틀림

}

return -1; // 아이디 없음

} catch (SQLException e) {

e.printStackTrace();

}

return -2; // 데이터베이스 오류

}

public int join(UserDTO user) {

String SQL = "INSERT INTO USER VALUES (?, ?, ?, ?, false)";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, user.getUserID());

pstmt.setString(2, user.getUserPassword());

pstmt.setString(3, user.getUserEmail());

pstmt.setString(4, user.getUserEmailHash());

return pstmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}

return -1; // 회원가입 실패

}

public String getUserEmail(String userID) {

String SQL = "SELECT userEmail FROM USER WHERE userID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, userID);

rs = pstmt.executeQuery();

while(rs.next()) {

return rs.getString(1); // 이메일 주소 반환

}

} catch (SQLException e) {

e.printStackTrace();

}

return null; // 데이터베이스 오류

}

public boolean getUserEmailChecked(String userID) {

String SQL = "SELECT userEmailChecked FROM USER WHERE userID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, userID);

rs = pstmt.executeQuery();

while(rs.next()) {

return rs.getBoolean(1); // 이메일 등록 여부 반환

}

} catch (SQLException e) {

e.printStackTrace();

}

return false; // 데이터베이스 오류

}

public boolean setUserEmailChecked(String userID) {

String SQL = "UPDATE USER SET userEmailChecked = true WHERE userID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, userID);

pstmt.executeUpdate();

return true; // 이메일 등록 설정 성공

} catch (SQLException e) {

e.printStackTrace();

}

return false; // 이메일 등록 설정 실패

}

}


  UserDAO에서는 실제로 데이터베이스와 통신하는 부분이 들어있습니다. 보시면 생성자는 데이터베이스와 연동하는 부분임을 알 수 있습니다. 나머지 함수들은 각각 데이터베이스와 통신하는 유의미한 함수들입니다.

  - login(): 아이디와 비밀번호를 받아서, 로그인을 시도하는 함수입니다. 결과는 정수형으로 반환됩니다.
  - join(): 사용자의 정보를 입력 받아서 회원가입을 수행하는 함수입니다. 결과는 정수형으로 반환됩니다.

  - getUserEmail(): 사용자의 아이디를 이용해 이메일 주소를 알아냅니다. 결과는 문자열형으로 반환됩니다.

  - getUserEmailChecked(): 사용자가 현재 이메일 인증이 되었는지 확인하는 함수입니다. 결과는 참/값형으로 반환됩니다.
  - setUserEmailChecked(): 특정한 사용자의 이메일 인증을 수행해줍니다.

  또한 사실 이 DAO는 잘못 설계된 소스코드에요. 원래는 conn 객체를 매 함수마다 새롭게 초기화주어 사용하셔야 합니다. 지금 제 DAO 같은 경우는 접속자가 많은 경우 데이터베이스 연결 갯수 초과 오류가 뜰 수 있어요. 데이터베이스 커넥션 풀을 사용하는 방식으로 효과적으로 해결할 수도 있구요. 하지만 저는 이러한 문제를 알고도 그냥 진행하겠습니다. 왜냐면 귀찮거든요. 작은 프로젝트니까 그냥 넘어갈게요. ㅋㅋㅋ


  이제 데이터베이스 연동을 위해서 JDBC Connector를 설치해주도록 할게요. MySQL 전용 드라이버는 다음의 경로에서 구하실 수 있습니다.


  ▶ MySQL JDBC 드라이버 사이트: https://dev.mysql.com/downloads/connector/j/5.1.html



  위와 같이 프로젝트가 구성되도록 JDBC를 넣어주시면 된답니다. WEB-INF 폴더의 lib 폴더에 넣어주시면 자동으로 웹 어플리케이션이 구동되는 단계에서 해당 라이브러리를 사용할 수 있게 되서 문제가 없습니다.

728x90
반응형