본문 바로가기
BACK-END

[JSP]Front-Controller 패턴 실전 흐름 파악(로그인 기능)

by 지에스정 2022. 2. 15.

 

Front-Controller 패턴 사용

 

a.jsp -> web.xml -> servlet(UserFrontController) -> if,switch -> controller -> c.jsp(forward, redirect)

 

위의 루트만 생각하고 있으면 크게 어렵지 않다.

 

1. a.jsp 단계에서  loginview.jsp를 만들어 낸다

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
	<c:set var="cp" value="${pageContext.request.contextPath}"> </c:set>
	<c:if test="${not empty param.login}">
			<script>alert("로그인 실패!")</script>
	</c:if>
	<div id="wrap">
		<form name="loginForm" action="${cp}/user/UserLoginOk.us" method="post">
			<table>
				<tr>
					<th>아이디</th>
					<td>
						<input type="text" name="userid">
					</td>
				</tr>			
				<tr>
					<th>비밀번호</th>
					<td>
						<input type="password" name="userpw">
					</td>
				</tr>
				<tr>
					<th colspan="2"><input type="submit" value="로그인"></th>
				</tr>
			</table>
			<a href="${cp}/user/UserJoin.us">회원가입</a>
		</form>
	</div>
</body>
</html>

 

2. 로그인 버튼을 누르게 되면 UserLoginOk.us로 이동하도록 링크를 걸어주고, 클릭시 web.xml파일에 들어가 .us가 나타내는 front-controller를 검색한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>board_mvc2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>UserFrontController</servlet-name>
  	<servlet-class>com.project.app.user.UserFrontController</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>UserFrontController</servlet-name> // .us를 찾아 userfrontcontroller를 연결해준다
  	<url-pattern>*.us</url-pattern>
  </servlet-mapping>
</web-app>

 

 

3. servlet(UserFrontController)에서 해당 주소값인 UserLoginOk.us와 일치하는 case를 찾고 해당 조건을 실행한다.

 

즉,  if,switch 에서 해당하는  controller 를 실행 해준다.

 

package com.project.app.user;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.project.action.ActionTo;

public class UserFrontController extends HttpServlet {


	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req,resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req,resp);
	}
	
	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String requestURI = req.getRequestURI();
		String contextPath = req.getContextPath();
		String command = requestURI.substring(contextPath.length());
		ActionTo transfer = new ActionTo();
		switch(command) {
		case "/user/UserLogin.us":
			transfer = new ActionTo();
			transfer.setPath("/app/user/loginview.jsp");
			transfer.setRedirect(false);
			break;
		case "/user/UserLoginOk.us":
			try {
				transfer = new UserLoginOkAction().execute(req, resp);
			} catch (Exception e) {
				System.out.println("UserLoginOk :" + e);
			}
			break;
		case "/user/UserLogoutOk.us":
			
			transfer = new ActionTo();
			transfer.setRedirect(false);
			transfer.setPath("/user/UserLogin.us");
			req.getSession().removeAttribute("loginUser");
			break;
		}
		
		//일괄처리 (어디인지, 어떤방식인지 몰라도 그냥 transfer 객체에 담겨있는
		//정보대로 페이지를 이동시키는 코드)
		if(transfer != null) {
			if(transfer.isRedirect()) {
				resp.sendRedirect(transfer.getPath());
			}else {
				RequestDispatcher disp = req.getRequestDispatcher(transfer.getPath());
				disp.forward(req, resp);
			}
		}
	}
}

 

4.   위 루트에 해당하는 action 클래스를 실행하고 DAO / DTO 를 사용하여  DB에 원하는  로그인 정보를 확인하고, session에 유저의 정보를 넣어서 보내주게 된다.

 

그리고 c.jsp(forward, redirect)  에 해당하는 새로운 페이지로 이동할 링크를 설정해주며, 로그인은 큰 변화가 없는 상태이기 때문에 forward를 이용해준다(redirect를 false로 주고 기존 루트에 바로 연결해준다)

 

package com.project.app.user;

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

import com.project.action.Action;
import com.project.action.ActionTo;
import com.project.app.user.dao.UserDAO;
import com.project.app.user.dao.UserDTO;

public class UserLoginOkAction implements Action{
	@Override
	public ActionTo execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// 입력한 데이터 DB처(Mybatis)
        UserDAO udao = new UserDAO();
		String userid = req.getParameter("userid");
		String userpw = req.getParameter("userpw");
		HttpSession session = req.getSession();
		
		UserDTO loginUser = udao.login(userid, userpw);
		ActionTo transfer = new ActionTo();
		if(loginUser != null) {
        	// 로그인 성공 
			session.setAttribute("loginUser", loginUser);
            // 어떤 방식으로 이동할지 세팅
			transfer.setRedirect(false);
            // 어디로 이동할지 세팅 (forward 앞의 cp가 남아 있음 / redirect 재요청이라 cp가 날아감)
			transfer.setPath("/board/BoardList.bo");
		}
		else {
        	//로그인 실패 
			transfer.setRedirect(false);
			transfer.setPath("/user/UserLogin.us?login=f");
		}
		return transfer;
	}
}

 

위의 코드들은 front-controller 패턴의 흐름을 위해서 기본적인 파트만 나타내었고, ActionTo 클래스를 만들어주거나 DAO/DTO와 mapper , mybatis 연결은 생략해 놓았다. 

 

처음 접하면 흐름이 복잡해 보일 수 있으나, controller를 통해 구현하고자 하는 기능들을 나누어서 데이터를 연결해주기 때문에 큰 규모로 개발을 하기에 적합하다고 볼 수 있다.

 

 

'BACK-END' 카테고리의 다른 글

[Spring]스프링 프레임워크란 ?  (0) 2022.03.18
[Oracle] 오라클 데이터베이스  (0) 2022.03.11
[JSP]Front-Controller 패턴  (0) 2022.02.09
[JSP]MVC2 모델  (0) 2022.02.08
[JSP] EL문과 JSTL  (0) 2022.02.04