[JSP] MVC-1 Front Controller

UnKnown12·2022년 10월 25일
0

JSP

목록 보기
7/7

📌 Front Controller

  • 1,2,..n 개의 Controller 영역에 있는 공통 로직을 하나의 Controller 영역에 담아
    공통로직을 여러개의 Controller 영역에 보내는 별도의 Controller 영역

  • Servlet Java 클래스를 통해 사용자(클라이언트) 요청을 받고
    해당 요청에 맞는 Controller 영역을 호출한다

  • 사용자 요청처리 를 제외한 나머지는 실행할 필요가 없다.

❗ 회원가입_View 영역

외부영역

<title>Insert title here</title>
</head>
<body>
	<h1>회원가입 페이지</h1>	
	<form action="/user/UserJoin.us" method="post">
		<p>
			아이디 <input type="text" name="userid"><br>
		</p>
		<p>
			비밀번호 <input type="password" name="userpw"><br>
		</p>
		<p>
			이름 <input type="text" name="username"><br>
		</p>
		<p>
			전화번호 <input type="text" name="userphone"><br>
		</p>
		<p>
			주소 <input type="text" name="useraddr"><br>
		</p>
		<p>
			<input type="submit" value="회원가입"><br>
		</p>
	</form>
</body>

회원가입_View 영역으로 이동한 후,
회원가입에 필요한 데이터를 사용자에게 전달받고

"/user/UserJoin.us" 경로로 이동하여 ( JSP -> JAVA )
사용자의 회원가입 요청을 처리하기 위해
[ View -> Controller ] 영역으로 이동하기 전에,

Front Controller 로 이동하여 공통 로직을 담당

❗ ActionForward.java

외부영역

Front Controller 에서 다른 영역으로 이동할 경로를 담은 Class* 파일

public class ActionForward {
	// Redirect 방식으로 할건지 유무 확인 변수 
	// 페이지 이동이 forward 인가? Redirect 인가? 
	private boolean isRedirect;	
	// 페이지 이동 경로 
	private String path;
	public ActionForward() {}	
	public ActionForward( boolean isRedirect , String path) {
		super();
		this.isRedirect = isRedirect;
		this.path = path;
	}	
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public boolean isRedirect() {
		return isRedirect;
	}
	public void setRedirect(boolean isRedirect) {
		this.isRedirect = isRedirect;
	};	
}

변수 1 - 이동방식이 forward 인지 Redirect 인지 구별하는 Boolean 타입 변수
변수 2 - 이동경로

❗ Action.java

ActionForward 메소드를 .Interface* 파일로 담아

여러개의 Controller 영역이 Front Controller 를 사용할 수 있게

공통 로직 저장 파일

public interface Action {
	public ActionForward execute(HttpServletRequest req , HttpServletResponse resp);
}

모든 Controller 가 SQL문를 사용하기에 SQL문을 사용할 수있는
statement 객체 - execute 메소드를 호출하고
사용자 요청 , 서버 응답을 파라미터로 담는다

❗ Front Controller 영역

회원가입_view -> FrontColler

@WebServlet("*.us")
public class UserFrontController extends HttpServlet{
	@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);
	}	
	public void doProcess( HttpServletRequest req , HttpServletResponse resp) throws ServletException, IOException {		
		String requestURI = req.getRequestURI();
		ActionForward forward = null ;		
		if ( requestURI.equals("/user/UserJoin.us")) {
			System.out.println("프론트 컨트롤러 도착 ");
			forward = new UserJoinAction().execute( req, resp);
			// -> UserJoinAction.java 로 이동 
		} 
		// 페이지 이동 일괄처리		
		if ( forward != null){
			if ( forward.isRedirect()) {
				// isRedirect = true = redirect 페이지 이동 방식 
				resp.sendRedirect(forward.getPath());
			} else {
				// 아니라면 forward 페이지 이동 방식
				RequestDispatcher disp = req.getRequestDispatcher(forward.getPath());
				disp.forward(req, resp);
			}			
		}
	}

먼저 View 영역에서 입력한 사용자의 요청을
GET - POST 2가지 방식 모두 담을 수 있게
doProcess() 메소드 생성

		String requestURI = req.getRequestURI();
		ActionForward forward = null ;		

사용자가 어떤 요청이 와도
필요한 Controller 영역에 이동할 수 있게 RequestURI 를
하나의 변수로 담는다

		if ( requestURI.equals("/user/UserJoin.us")) {
			System.out.println("프론트 컨트롤러 도착 ");
			forward = new UserJoinAction().execute( req, resp);
			// -> UserJoinAction.java 로 이동 
		} 

만약 사용자의 요청이 회원가입 요청이라면
생성했던 Action(.Interface*) 에서
공통로직 - statement 객체의 execute 메소드를 호출하여
처리한다.

❗ 회원가입 Controller

Front Controller -> 회원가입_Controller

public class UserJoinAction implements Action{
	@Override
	public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("execute 도착");
		// DB 접근 객체 DAO  , 저장- 전송 객체 호출 DTO  
		UserDAO udao = new UserDAO();
		UserDTO udto = new UserDTO();		
		// 페이지 경로 설정 함수 호출 
		ActionForward forward = new ActionForward();		
		// view 영역의 파라미터 값을 udto ( 전송객체 ) 에 저장 
		udto.setUserid(req.getParameter("userid"));
		udto.setUserpw(req.getParameter("userpw"));
		udto.setUsername(req.getParameter("username"));
		udto.setUserphone(req.getParameter("userphone"));
		udto.setUseraddr(req.getParameter("useraddr"));		
		if( udao.join(udto)) {
			// 회원가입 성공 -> redirect 방식으로 이동 ->  app/user/login_view.jsp 			
			forward.setRedirect(true);
			forward.setPath("/app/user/loginview.jsp");
		} else {
			// 회원가입 실패 -> redirect 방식으로 ->  index.jsp 			
			forward.setRedirect(true);
			forward.setPath("/index.jsp");			
		}	
		return forward;
	}

DB 접근 객체 - DAO
Data 저장 + 전송 객체 DTO 를 호출하고
사용자의 요청정보 를 -> DTO 에 담는다
담겨진 DTO 는 DAO 로 이동 ( DTO -> DAO)

DAO 에서 DB(Mybatis = SQL ) 접근한 후
사용자의 요청을 SQL문으로 실행하여 DB에 저장
DB에 성공적으로 저장되어있으면 public boolean join() 메소드를 재전송

이후 회원가입 결과에 따라
아래의 .jsp* 파일로 이동한다

		if( udao.join(udto)) {
			// 회원가입 성공 -> redirect 방식으로 이동 ->  app/user/login_view.jsp 			
			forward.setRedirect(true);
			forward.setPath("/app/user/loginview.jsp");
		} else {
			// 회원가입 실패 -> redirect 방식으로 ->  index.jsp 			
			forward.setRedirect(true);
			forward.setPath("/index.jsp");			
		}	
		return forward;

DAO

public class UserDAO {
` **SQL 연결 및 처리**
	SqlSessionFactory factory = SqlMapConfig.getFactory();
	SqlSession sqlsession;
`	
	public UserDAO() {
		sqlsession = factory.openSession(true);
		// true : auto commit
	}
`
	public boolean join(UserDTO udto) {
		boolean result = false;
`		
		// ( User xml 객체에 , DTO 전송 ) 
		// ( to  , from ) 
`		
		// 결과값이 있다 =  회원가입 ok 		
		if( sqlsession.insert("User.join" , udto) != 0 ) {
			result = true; 
		} 
`		
		return result;
	}

Mybatis - SQL

Java - Mybatis 에서 SQL 구문 실행

<mapper namespace="User">
	<insert id="join" parameterType="userdto" >
		INSERT INTO "USER" VALUES (#{userid},#{userpw},#{username},#{userphone},#{useraddr} )
	</insert>
</mapper>

❗ FrontController -> View 영역

사용자의 요청이 모두 처리한 후 다시 View 으로 마무리 이동

최종적으로 회원가입_Controller 처리에 따라
담겨진 이동경로 ( forward.path ) 와 ( forward.이동방식) 에 따라
사용자의 View 영역이 forward 담긴 변수에 맞춰서 이동한다.

		if ( forward != null){
			if ( forward.isRedirect()) {
				// isRedirect = true = redirect 페이지 이동 방식 
				resp.sendRedirect(forward.getPath());
			} else {
				// 아니라면 forward 페이지 이동 방식
				RequestDispatcher disp = req.getRequestDispatcher(forward.getPath());
				disp.forward(req, resp);
			}			
		}
profile
Hyobin12

0개의 댓글