Front-Controller 패턴
a.jsp -> web.xml -> servlet(UserFrontController) -> if,switch -> controller -> c.jsp(forward, redirect)
개발자가 정의한 확장자(.us, .do, .bo, ...)를 페이지 이동 주소에 작성하게 되면 파일이 아니기 때문에 web.xml에 가서 매핑되어 있는 서블릿으로 찾는다.
각 URL(UserJoin.us, UserLogin.us,...)을 전부 web.xml에 하나씩 매핑 해 놓게 되면 코드가 길어지기 떄문에 \*.us 형태로 하나의 서블릿에 매핑을 해놓는다. (어떤것이든 .us가 붙은 요청은 하나의 경로로 보내주도록 한다.)
이러한 경로를 통해 가게되는 서블릿 파일을 프론트 콘트롤러 라고 한다.
(가장 먼저 요청을 맞이하는 컨트롤러 라서 프론트 컨트롤러) 이 프론트 컨트롤러는 .us 앞에 있는 요청명으로 (USerJoin, UserLogin,...) 어떤 로직을 수행할지 판단하고 분기처리(if문 switch문)를 하게 된다.
프론트 컨트롤러 안에서 모든 비즈니스 로직을 구현해 놓게 되면 마찬가지로 코드가 길어지고 유지보수 및 재사용이 어렵기 때문에 요청별로 따로 COntroller(UserJoinOkAction, UserLoginAction)를 만들어 놓는다.
해당 Action 클래스 안에 execute() 메소드를 만들어서 그 내부에 비즈니스 로직을 구현하면 프론트 컨트롤러에서는 그 action 객체를 만든 후 execute() 메소드를 호출만 하면 된다.
모든 ~~ Action에 execute() 메소드를 구현해야 하기 때문에 Action 인터페이스를 만들고 그 안에 추상메소드로 execute()를 선언해 놓으면 각 Action들 마다 그 인터페이스를 받아서 재정희 하여 구현을 하면 편하다.
비즈니스 로직이 모두 완료되면 어떤 페이지로 이동할 것인지, 어떤 방식(Forward, Redirect)으로 이동할 것인지를 정해서 Front-Controller로 리턴을 하고 이 떄 리턴할 값이 두개이므로 그 둘을 담은 객체로 만들어서 리턴 해준다.
이 객체의 타입이 ActionTo 타입이다.
execute()는 저 결과들, 즉 ActionTo 타입의 객체를 리턴하고 그 리턴된 객체를 Front-Controller에서 일괄적으로 받아서 해석한 후 알맞은 View와 방식으로 페이지 이동을 해준다.
Model2의 페이지 이동 방식
JSP와 Servlet에서 페이지 이동을 처리할 떄 두가지 방식 중 하나를 사용한다
(시나리오 a.jsp -> c.jsp)
Forward
서버에서 c.do 요청 -> 서버는 처리 결과를 가지고 c.jsp로 전송 -> 전송받은 곳에서 클라이언트에게 페이지로 응답
클라이언트에게 request객체를 통해 값을 넘겨주어야 할 떄 혹은 단순 조회를 요청했을 때 사용한다.
Redirect보다 성능이 좋다.
(select)
Redirect
서버에게 c.do 요청 -> 서버는 "c.jsp로 갈 수 있는 요청"을 응답-> 응답받은 것을 이용해서 c.jsp 재요청 -> 페이지로 응답
클라이언트가 요청했을 때 이전의 req, resp 객체는 초기화 된다
시스템에 변화가 생기는 요청의 경우에는 redirect를 이용한다
(insert, update, delete)
위의 설명처럼 설계가 굉장히 복잡하기 때문에 대규모가 아닌 소규모 프로젝트에 반영했을 때에는
오히려 좋지 않은 결과를 초래한다.
따라서 맞는 목적으로 선택하여 설계해야 한다.
URL 작성 -> 해당하는 f-c -> 처리가 있는지? 페이지 이동인지? 판별 ->
1. 처리가 있다면
처리해줄 Action클래스, 내부의 ececute() 구현 -> 내부에서는 DB처리용 DAO메소드 호출(구현) -> DAO메소드 안에서는 mybatis 구현 -> ActionTo 객체 리턴
2. 처리가 없다면
ActionTO 객체 생성 , 세팅 -> transfer에 대입 혹은 리턴
'BACK-END' 카테고리의 다른 글
[Oracle] 오라클 데이터베이스 (0) | 2022.03.11 |
---|---|
[JSP]Front-Controller 패턴 실전 흐름 파악(로그인 기능) (0) | 2022.02.15 |
[JSP]MVC2 모델 (0) | 2022.02.08 |
[JSP] EL문과 JSTL (0) | 2022.02.04 |
[JSP] DB연결 ) Mybatis (0) | 2022.01.31 |