▸JSP & Servlet/기본 문법

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

코데방 2020. 2. 24.
728x90

JSP와 서블릿을 이용한 간단한 로그인, 자동로그인 및 회원가입, 회원 정보조회 기능이 있는 웹페이지 만들기입니다. 이번글은 Command를 구현하는 클래스들에 대한 코드입니다. 뷰와 컨트롤러, DAO, DTO는 이전글들을 참조 부탁드립니다. 

 

[· JSP & Servlet/- 기본 문법] - MCV 패턴의 자동 로그인, 회원가입 만들기 [1/3]

[· JSP & Servlet/- 기본 문법] - MCV 패턴의 자동 로그인, 회원가입 만들기 [2/3]

 

 

 

 

전체 코드는 깃허브에 올려놨습니다. 게시판 로직을 추가할 예정이라 commit 코멘트가 "First commit"인 부분으로 되돌리면 현재 코드로 돌아옵니다.

https://github.com/codevang/hssweb.git

 

 


 

[ Ctrl.Commad.java ]

 

Command 역할의 모든 클래스가 상속받아야 할 인터페이스입니다. 추상메소드 int execute() 메소드를 강제해서 실제 실행되는 최종 메소드를 통일하도록 합니다. 

 

또한 인터페이스로 구현할 경우 컨트롤러에서 기능을 구현할 때 좀 더 깔끔하게 Command 타입의 변수 하나에 모든 클래스를 넣어줄 수 있습니다. 이전글에 컨트롤러 코드를 참조부탁드립니다. 

 

package control;

import java.io.IOException;

public interface Command {
	
	// 기능을 수행하는 클래스가 꼭 구현해야할 메소드
	abstract public int execute();
	
}

 

 


 

 

[ login.LoginAction.java ]

 

DAO를 통해 로그인 유효성을 검증하고, 성공하면 세션을 생성해줍니다. 만약 자동 로그인에 체크가 돼 있으면 쿠키도 생성해서 줍니다. 이 때 유의사항은 꼭 쿠키 경로를 지정해줘야 로직이 꼬이지 않는다는 점입니다. setPath("/")를 지정하면 루트 URL에 쿠키가 저장될 수 있도록 해줍니다. 아래 링크글을 보면 좀 더 자세한 설명이 있습니다. 

 

또한 실패했을 경우는 화면에 출력해줄 내용을 세션 객체에 넣어줘 사용자가 실패를 알 수 있게 해줍니다. 로그인 입력을 받는 login.jsp 에서 가져다 쓰는 값입니다.

 

[· JSP & Servlet/- 기본 문법] - 쿠키 이용 시 유의 사항 (자동로그인 로직 구현 등)

package login;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import control.Command;
import control.Ctrl;
import db.UserInfoDAO;

public class LoginAction implements Command {

	HttpServletRequest request;
	HttpServletResponse response;
	public LoginAction
	(HttpServletRequest request, HttpServletResponse response) {
		this.request = request;
		this.response = response;
	}

	@Override
	public int execute() {

		HttpSession session = request.getSession();
		// 이미 로그인 돼있는경우
		if (session.getAttribute("userID") != null) {
			return Ctrl.TRUE;
		}
		
		UserInfoDAO dao = new UserInfoDAO(request);
		int result = dao.loginAccept();

		// 로그인 성공 시 세션 및 쿠키 설정
		if (result == Ctrl.TRUE) {
			String userID = request.getParameter("userID");
			session.setAttribute("userID", userID);
			
			// 자동로그인 체크됐다면 쿠키 추가
			String isAuto = request.getParameter("isAutoLogin"); 
			if (isAuto != null && isAuto.equals("true")) {
				Cookie cookie = new Cookie("userID", userID);
				cookie.setMaxAge(60*2); // 테스트를 위해 2분으로 설정
				cookie.setPath("/");	// 쿠키 저장 위치
				response.addCookie(cookie);
			}
			
			return Ctrl.TRUE;

		// 실패 시
		} else if (result == Ctrl.FALSE) {
			session.setAttribute
			("loginMsg", "로그인에 실패했습니다. 계정을 확인해주세요.");
			return Ctrl.FALSE;

		// 예외 발생 시
		} else {
			return Ctrl.EXCEPT;
		}
	}
}

 

 

 


 

 

[ login.LogoutAction.java ]

 

로그아웃 구현입니다. 어려운 건 없지만 이 부분도 쿠키 유효 시간을 재설정해 response에 담아주기 전 setPath("/") 메소드를 통해 절대경로를 지정해주는게 좋습니다. 폴더와 패키지가 복잡해질 수록 경로가 꼬여 쿠키 검색이 되지 않는 경우가 생깁니다. 아래 링크를 참조하시면 됩니다.

 

[· JSP & Servlet/- 기본 문법] - 쿠키 이용 시 유의 사항 (자동로그인 로직 구현 등)

 

package login;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import control.Command;
import control.Ctrl;

public class LogoutAction implements Command {

	HttpServletRequest request;
	HttpServletResponse response;

	public LogoutAction(HttpServletRequest request, HttpServletResponse response) {
		this.request = request;
		this.response = response;
	}

	@Override
	public int execute() {
		// userID 네임의 쿠키 찾아서 무효화
		Cookie[] cookie = request.getCookies();

		if (cookie != null) {
			for (int i = 0; i < cookie.length; i++) {
				if (cookie[i].getName().equals("userID")) {
					cookie[i].setMaxAge(0);
					cookie[i].setPath("/"); // 패스 설정
					response.addCookie(cookie[i]);
					break;
				}
			}
			request.getSession().invalidate();
			return Ctrl.TRUE;
		}
		return Ctrl.FALSE;
	}
}

 

 


 

 

[ loing.RegisterAction.java ]

 

회원가입을 처리하는 클래스입니다. 전달된 request 객체를 이용해 DTO를 만들고 이를 DAO로 전달하여 DB에 입력하는 로직을 수행합니다. 이 때도 가입에 성공했을 때와 실패했을 때 화면에 출력해줄 문자열을 session 객체에 추가해줍니다. 성공했을 경우는 로그인 화면으로 리다이렉트 시 성공 메세지를 출력하고 실패했을 경우는 다시 회원가입 페이지에서 실패 메세지를 띄워줍니다.

 

package login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import control.Command;
import control.Ctrl;
import db.UserInfoDAO;
import db.UserInfoDTO;

public class RegisterAction implements Command {

	HttpServletRequest request;
	UserInfoDTO dto;
	
	// 생성자
	public RegisterAction(HttpServletRequest request) {
		this.request = request;
		
		// DTO 객체 생성
		dto = new UserInfoDTO();
		dto.setUserID(request.getParameter("userID"));
		dto.setUserPW(request.getParameter("userPW"));
		dto.setUserPW2(request.getParameter("userPW2"));
		dto.setUserName(request.getParameter("userName"));
		dto.setUserEmail(request.getParameter("userEmail"));
		dto.setUserPhone(request.getParameter("userPhone"));
		dto.setUserGender(request.getParameter("userGender"));
	}

	
	@Override
	public int execute() {

		HttpSession session = request.getSession();
		
		// 비밀번호 확인이 일치하지 않을 경우
		if(!dto.getUserPW().equals(dto.getUserPW2())) {
			
			session.setAttribute("formMsg", "비밀번호를 확인해주세요.");
			return Ctrl.FALSE;
			
		} else {
			
			UserInfoDAO dao = new UserInfoDAO(request);
			int result = dao.registerUserInfo(dto);
			
			// 성공
			if(result == Ctrl.TRUE) {
				// 로그인 화면에서 출력해줄 메세지 추가
				session.setAttribute
				("loginMsg", "회원가입에 성공했습니다. 로그인해주세요");
				return Ctrl.TRUE;
				
			// 실패
			} else if(result == Ctrl.FALSE) {
				// 로그인 화면해서 출력해줄 메세지 추가
				session.setAttribute("formMsg", "이미 존재하는 ID 입니다.");
				return Ctrl.FALSE;

			// 예외 발생
			} else {
				return Ctrl.EXCEPT;
			}
		}
	}
}

 

 


 

 

[ userInfo.GetUserInfo.java]

 

회원정보 보기 기능을 수행합니다. 정상적으로 DB에서 회원 정보를 가져왔다면 DTO 객체를 세션에 추가해줍니다. 또한 중복으로 DB를 검색하는 것을 막기 위해 세션에 이미 DTO 객체가 있는지를 먼저 확인해줘야 합니다. 만약 로그인 없이 페이지 URL로 직접 접속한 경우라면 로그인 페이지로 리다이렉트 시키면서 출력할 메세지를 넣어줍니다.

 

package userInfo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import control.Command;
import control.Ctrl;
import db.UserInfoDAO;

public class GetUserInfo implements Command {

	HttpServletRequest request;

	public GetUserInfo(HttpServletRequest request) {
		this.request = request;
	}

	@Override
	public int execute() {

		HttpSession session = request.getSession();

		// 이미 세션에 userInfo가 담겨 있는 경우라면
		if (session.getAttribute("userInfo") != null) {
			return Ctrl.TRUE;

			// 로그인된 세션이 맞는지 한번 더 확인
		} else if (session.getAttribute("userID") != null) {
			UserInfoDAO dao = new UserInfoDAO(request);
			int result = dao.getUserInfo();

			// 결과 그대로 리턴
			return result;
		}
		
		return Ctrl.EXCEPT;
	}
}

 

 


 

 

이것으로 간단한 로그인 인증 로직 구성이 끝났습니다. 계속 이어서 게시판 기능을 추가해 붙여보도록 하겠습니다. 

728x90

댓글

💲 추천 글