JSP와 서블릿을 이용한 간단한 로그인, 자동로그인 및 회원가입, 회원 정보조회 기능이 있는 웹페이지 만들기입니다. 이번글은 DAO, DTO에 대한 코드입니다. 뷰와 컨트롤러는 이전글을, Command 역할의 클스는 다음글을 참조 부탁드립니다.
[· JSP & Servlet/- 기본 문법] - MCV 패턴의 자동 로그인, 회원가입 만들기 [1/3]
[· JSP & Servlet/- 기본 문법] - MCV 패턴의 자동 로그인, 회원가입 만들기 [3/3]
전체 코드는 깃허브에 올려놨습니다. 게시판 로직을 추가할 예정이라 commit 코멘트가 "First commit"인 부분으로 되돌리면 현재 코드로 돌아옵니다.
https://github.com/codevang/hssweb.git
[ db.userInfoDTO ]
MAP을 쓸까 DTO를 쓸까 고민하다 DTO로 구성했습니다. MAP을 사용하면 코드를 조금 더 짧게 쓸 수 있는데, 데이터 구조에 대한 가시성은 꽤 줄어들게 됩니다. 이 부분에 대해서는 사람들마다 의견과 취향이 다른 것 같습니다. 저는 개인적으로 DTO를 사용하는 것이 시간은 좀 더 걸리되 안정적인 유지보수에 더 유리하지 않나 생각합니다.
package db;
public class UserInfoDTO {
private String userID;
private String userPW;
private String userPW2;
private String userName;
private String userEmail;
private String userPhone;
private String userGender;
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getUserPW() {
return userPW;
}
public void setUserPW(String userPW) {
this.userPW = userPW;
}
public String getUserPW2() {
return userPW2;
}
public void setUserPW2(String userPW2) {
this.userPW2 = userPW2;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public String getUserGender() {
return userGender;
}
public void setUserGender(String userGender) {
this.userGender = userGender;
}
public String getUserPhone() {
return userPhone;
}
public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}
}
[ db.UserInfoDAO ]
회원정보에 대한 DB 처리 역할을 하는 DAO 클래스입니다. DB연결과 DB해제를 따로 메소드화하여 코드를 줄일 수 있습니다. 모든 클래스는 리턴값을 int로 하여, 컨트롤러에서 지정된 상수를 반납하도록 합니다. 예외 발생 시 예외 페이지로 리다이렉트하기 위함입니다. 리턴 타입을 좀 더 강제하고 싶다면 Enum(열거형) 클래스를 활용하면 됩니다.
2019/12/10 - [· JAVA/- 기본 문법] - 열거형 클래스 (Enum Class)
DB 작업은 쿼리만 쓸 줄 알면 크게 어려운 건 없는데 자원 해제에 신경을 써줘야 합니다. 예외 처리의 경우에도 private 메소드에서는 예외를 throws 하고, 최종 처리를 담당하는 public 메소드에서 예외 처리를 해주면 좀 더 코드를 깔끔하게 작성할 수 있을 것 같습니다. 물론 각 과정마다 추적이 필요하거나 다른 로직으로 처리가 필요하다면 모두 따로 처리해줘야 합니다. DB 작업에 대한 내용은 아래 링크글을 참조 부탁드립니다.
[· JSP & Servlet/- 기본 문법] - JDBC를 이용한 DB작업_기초 SQL 문법 [1/3]
[· JSP & Servlet/- 기본 문법] - JDBC를 이용한 DB작업_DB 연동 및 데이터 작업 [2/3]
[· JSP & Servlet/- 기본 문법] - JDBC를 이용한 DB작업_커넥션풀(Connection Pool) [3/3]
package db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import control.Ctrl;
public class UserInfoDAO {
private HttpServletRequest request;
private Context context;
private DataSource datasource;
private Connection conn;
private Statement stmt;
private PreparedStatement preStmt;
private ResultSet result;
/* 생성자 */
public UserInfoDAO(HttpServletRequest request) {
this.request = request;
}
/* 회원가입 정보 DB 입력 */
public int registerUserInfo(UserInfoDTO dto) {
try {
int check = isUserID(dto);
// 이미 존재하는 ID일 경우
if (check == Ctrl.TRUE) {
return Ctrl.FALSE;
// 존재하지 않는 경우 등록
} else if (check == Ctrl.FALSE) {
preStmt = conn.prepareStatement(
"insert into ORG_USER values (?,?,?,?,?,?)");
preStmt.setString(1, dto.getUserID());
preStmt.setString(2, dto.getUserPW());
preStmt.setString(3, dto.getUserName());
preStmt.setString(4, dto.getUserEmail());
preStmt.setString(5, dto.getUserPhone());
preStmt.setString(6, dto.getUserGender());
// 커밋하고 리턴
preStmt.executeUpdate();
conn.commit();
return Ctrl.TRUE;
}
// DB접속 및 쿼리 과정에서 예외 발생 시 롤백 수행
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception rollbackEx) {
System.out.println("rollback Exception");
rollbackEx.printStackTrace();
}
System.out.println("DB Working Exception");
e.printStackTrace();
// 최종 자원 해제
} finally {
dbClose();
}
// 여기까지 리턴이 넘어왔으면 예외 발생의 경우
return Ctrl.EXCEPT;
}
/* 로그인 검증 */
public int loginAccept() {
try {
dbConnect();
stmt = conn.createStatement();
String userID = request.getParameter("userID");
String userPW = request.getParameter("userPW");
String query = "select userID, userPW from ORG_USER "
+ "where userID = " + "'" + userID + "'";
result = stmt.executeQuery(query);
// 있으면 TRUE
while (result.next()) {
if (result.getString("USERID").equals(userID)
&& result.getString("USERPW").equals(userPW)) {
return Ctrl.TRUE;
}
}
// 없으면 FALSE
return Ctrl.FALSE;
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
// 리턴이 여기까지 왔다면 예외 발생 상황
return Ctrl.EXCEPT;
}
/* 회원정보 출력 */
public int getUserInfo() {
try {
HttpSession session = request.getSession();
dbConnect();
stmt = conn.createStatement();
String query = "select * from ORG_USER where userID = " + "'"
+ session.getAttribute("userID") + "'";
result = stmt.executeQuery(query);
UserInfoDTO dto = new UserInfoDTO();
while (result.next()) {
dto.setUserID(result.getString("userID"));
dto.setUserName(result.getString("userName"));
dto.setUserEmail(result.getString("userEmail"));
dto.setUserPhone(result.getString("userPhone"));
}
// 세션에 dto 객체 추가
session.setAttribute("userInfo", dto);
return Ctrl.TRUE;
} catch (Exception e) {
System.out.println("UserInfo DB Select Fail");
e.printStackTrace();
} finally {
dbClose();
}
// 예외 발생
return Ctrl.EXCEPT;
}
/* ID 존재 여부 확인 */
private int isUserID(UserInfoDTO dto) throws Exception {
// DB 연결
dbConnect();
String query = "select userID from ORG_USER " + "where userID = " + "'"
+ dto.getUserID() + "'";
stmt = conn.createStatement();
result = stmt.executeQuery(query);
// userID가 있다면
if (result.next()) {
return Ctrl.TRUE;
// userID가 없다면
} else {
return Ctrl.FALSE;
}
}
/* DB 연결 */
private void dbConnect() throws Exception {
context = new InitialContext();
datasource = (DataSource) context
.lookup("java:comp/env/jdbc/Oracle11g");
conn = datasource.getConnection();
conn.setAutoCommit(false); // 오토커밋 해제
}
/* DB close (모든 객체 자원 해제) */
private void dbClose() {
if (result != null) {
try {
result.close();
} catch (Exception resultCloseEx) {
resultCloseEx.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (Exception resultCloseEx) {
resultCloseEx.printStackTrace();
}
}
if (preStmt != null) {
try {
preStmt.close();
} catch (Exception resultCloseEx) {
resultCloseEx.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception resultCloseEx) {
resultCloseEx.printStackTrace();
}
}
}
}
'▸JSP & Servlet > 기본 문법' 카테고리의 다른 글
MVC 패턴의 게시판 만들기_계층형 게시판 로직 설계 [1/5] (4) | 2020.02.28 |
---|---|
MCV 패턴의 자동 로그인, 회원가입 만들기 [3/3] (0) | 2020.02.24 |
MCV 패턴의 자동 로그인, 회원가입 만들기 [1/3] (0) | 2020.02.24 |
쿠키 이용 시 유의 사항 (자동로그인 로직 구현 등) (0) | 2020.02.23 |
sendRedirect 작동 방식 및 예외 처리에서의 사용 (0) | 2020.02.23 |
댓글