▸JSP & Servlet/기본 문법

MCV 패턴의 자동 로그인, 회원가입 만들기 [2/3]

코데방 2020. 2. 24.
728x90

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();
			}
		}
	}
}
728x90

댓글

💲 추천 글