CodeClover
Servlet 본문
Servlet / JSP 의 기본적인 흐름
Servlet : 컨트롤러의 역할이라고 생각하면 된다.
JSP : view 페이지
[ 흐름 ]
1. 모든 요청은 컨트롤러에 필수적으로 요청되어야 함.
2. 컨트롤러는 request 메소드의 값에 따라서 각각 다른 흐름을 갖는다.
● request 메소드값 - get : 비즈니스 로직 처리 후 view으로 forward
● request 메소드값 - post : 비즈니스 로직 처리 후 controller으로 redirect
* JSP 파일의 위치는 보통 /WEB-INF/views 폴더 아래에 위치하는 경우가 대부분이다.
( why ? JSP 파일을 해당 위치에 위치하는 이유는 view 페이지를 직접 요청하지 못하게 해서 보안적 이점을 갖는다. )
이때 해당 위치는 redirect가 불가능한 위치이므로 즉, 무조건 Servlet을 통과하게 하면 servlet에서 모든 인증 절차를 통과한 이후에만 view으로 이동하게 된다.
이 과정에서 시스템 기능을 구현할때, 예를들어 3개의 기능이 있다고 하면 ,,,
( 예시 )
- 기능 01 : get 방식 요청
- 기능 02 : post 방식 요청
- 기능 03 : post 방식 요청
각 요청을 처리하는 Servlet을 각각 따로 만드는은 유지보수성이 떨어지기 때문에 한번에 처리하는 1개의 컨트롤러를 구현하면 어떨까 ? ☞ 1개의 Servlet(=컨트롤러)에서 처리하기 위해서는 각각 요청을 구분 할 수 있게 구현해야함.
각 요청을 구분하는 방식은 크게 2가지로 나누어 볼 수 있다.
가. action / cmd / URI 등 파라미터 이용해서 요청을 구분하는 방식
ex ) 흐름을 예로 들어서 표현해보면
우선 요청을 해야겠지 ? http://localhost/member.do?action=insert 이런식으로 URL을 작성하면
→ Servlet에서 String action = request.getParameter("action"); 코드를 이용해서 요청하는 값이 어떤 상태인지 확인하고
→ if(action.equals("insert")({ }) 요기 if 블록 안에서 ⓐ 비즈니스 메서드 호출 ⓑ request와 Session을 model에 담아서 데이터 저장하고 ⓒ view으로 요청 방식에 따라서 forward/redirect 하기 위해서 지정한다.
나. if 블록안의 코드 - 클래스로 분리해서 각각 Handler(=컨트롤러) 생성하는 방식
ex )
public interface XXXHandler {
String process(HttpServletRequest request, HttpServletResponse response);
}
우선, 이렇게 핸들러 만들어서 각 기능마다 핸들러 구현한 클래스 작성하기
→ 서블릿에서 if 블록 구현한 메서드 변경
if(action.equals("insert"){
handler = new XXXHandler();
}
위의 방식을 자동적으로 처리할 수 있는 방법에 대해서 고민하다가 탄생한것이 DispatcherServlet 이다.
3. 핸들러 클래스 만들고 - 그 내용을 설정파일에 작성하면 알아서 객체를 만들어주는 서블릿 ( = DispatcherServlet )
요청에 따른 핸들러 클래스가 정해져 있는 상태에서 요청을 URL으로 구분하고 CommandHandler 인터페이스 구현한다.
● 기능 구현 과정에서
● 요청 URI와 클래스 이름을 설정파일 ( properties == 위의 2번 방식에서 XXXHandler 의미) 에 기록한다.
● 서블릿이 가지고 있는 메서드는 크게 아래와 같이 3가지가 있다.
○ init() : 설정파일 로드 → 설정파일에 작성한대로 URI와 클래스 이용해서 만든 commandHandler 타입 인스턴스 Map에 저장하기
○ service 실행 → doget() , dopost() : get방식, post방식 요청에 따라서 XXXHandler클래스 만들어놨으니 요청 URI를 읽어서 Map에서 URI에 따른 인스턴스 찾기 → process() 메서드를 호출한다. → view으로 forward/redirect 처리
○ destroy() : 아무작업 안해도 ok
개발자가 핸들러 클래스 만들고 - 요청 uri 설정파일에 저장하면 - servlet이 메소드를 호출하는데,,, init에서 설정파일을 읽어서 설정파일에 있는대로 요청하는 uri로 클래스 만들겠고 (commandHandler타입의 인스턴스 생성하겠지 )
위의 방식으로 생성한 서블릿을 무조건 지나가야함 그래서 해당 서블릿을 프론트 컨트롤러라고 부른다. (=프론트 컨트롤러라고 부르고 DispatcherServlet이라고 작성... )
즉, 해당 서블릿은 모든 요청을 front에서 dispatch 하는 Servlet이다. 그러니까 DispatcherServlet만 있으면 Servlet을 만들 필요는 더이상 없겠지 ?!
※ 1차 실무 면접에서 DispatcherServlet에 대해서 아는지 질문이 들어왔었는데 ,, 그 당시 단순하게 Spring에서 Controller 처리해주는 방식으로 알고 있다고 답변했었는데,,
→ " Servlet / JSP 에 대해서 간단하게 설명하고 Java Spring에서는 Servelt을 하나하나 만들지 않고 FrontController으로 하나만 만들어 주는데 이때 만들어주는 Servlet이 DispatcherServlet이다. " 라고 답변할 수 있겠군 !