본 포스트는 스프링 MVC 1편(김영한, 인프런) 강의를 통해 학습한 내용을 작성자 임의 대로 요약 및 정리한 것입니다.
1. 프론트 컨트롤러 V1 도입
1.1. V1의 구조
- 클라이언트의 HTTP 요청
- FrontController –> 매핑 정보
: URL 매핑 정보에서 컨트롤러 조회 - FrontController –> Controller
: 컨트롤러 호출 - Controller –> JSP
: 컨트롤러에서 JSP forward - JSP는 HTML 응답.
1.2. ControllerV1
인터페이스
/servlet/web/frontcontroller/v1
에서
1
2
3
4
5
6
public interface ControllerV1 {
void process(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException;
}
서블릿과 비슷한 모양의 Controller 인터페이스 도입.
각 컨트롤러들은 이 인터페이스를 구현하면 됨.
==> 이 인터페이스 통하여 프론트 컨트롤러는
구현과 관계없이 로직의 일관성 가져갈 수 있음.
1.2.1 MemberFormControllerV1
- 회원 등록 컨트롤러
/servlet/web/frontcontroller/v1/controller
에서
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MemberFormControllerV1 implements ControllerV1 {
@Override
public void process(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String viewpath
= "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher
= request.getRequestDispatcher(viewpath);
dispatcher.forward(request, response);
}
}
1.2.2 MemberSaveControllerV1
- 회원 저장 컨트롤러
/servlet/web/frontcontroller/v1/controller
에서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MemberSaveControllerV1 implements ControllerV1 {
private MemberRepository memberRepository
= MemberRepository.getInstance();
@Override
public void process(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String username
= request.getParameter("username");
int age
= Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
//Model에 데이터 보관
request.setAttribute("member", member);
String viewPath
= "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher
= request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
1.2.3 MemberListControllerV1
- 회원 목록 컨트롤러
/servlet/web/frontcontroller/v1/controller
에서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MemberListControllerV1 implements ControllerV1 {
private MemberRepository memberRepository
= MemberRepository.getInstance();
@Override
public void process(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
List<Member> members
= memberRepository.findAll();
request.setAttribute("members", members);
String viewPath
= "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher
= request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
1.2.4 FrontControllerServletV1
- 프론트 컨트롤러
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@WebServlet(name = "frontControllerServletV1",
urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1
extends HttpServlet {
private Map<String, ControllerV1> controllerMap
= new HashMap<>();
public FrontControllerServletV1() {
controllerMap.put("/front-controller/v1/members/new-form",
new MemberFormControllerV1());
controllerMap.put("/front-controller/v1/members/save",
new MemberSaveControllerV1());
controllerMap.put("/front-controller/v1/members",
new MemberListControllerV1());
}
@Override
protected void service
(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("FrontControllerServletV1.service");
String requestURI
= request.getRequestURI();
ControllerV1 controller
= controllerMap.get(requestURI);
if (controller == null) {
response
.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
controller.process(request, response);
}
}
controllerMap
- key
: 매핑 URL - value
: 호출될 컨트롤러
(ControllerV1
)
- key
service()
- 먼저
requestURI
조회 - 실제 호출할 컨트롤러를
controllerMap
에서 찾음. - 없을 시엔
404
상태 코드 반환. - 컨트롤러 찾고
``controller.process(req, res) 호출하여
해당 컨트롤러 실행.
- 먼저