본 포스트는 스프링 MVC 1편(김영한, 인프런) 강의를 통해 학습한 내용을 작성자 임의 대로 요약 및 정리한 것입니다.
1. 단순하고 실용적인 컨트롤러 - v4
컨트롤러 인터페이스 구현하는 개발자 입장에서
항상 ModelView
객체를 생성 및 반환해야 하는 점이 번거로움!
==> 개발자가 단순, 편리하게 사용 가능하도록!!!
(즉, 실용성!)
1.1. V4의 구조
- 클라이언트의 HTTP 요청
- FrontController –> 매핑 정보
: URL 매핑 정보에서 컨트롤러 조회 - FrontController –> Controller
: 호출(paramMap
,model
) - Controller –> FrontController
:viewName
반환 - FrontController –> viewResolver
:viewResolver
호출 - viewResolver –> FrontController
:MyView
반환 - FrontController –> MyView
:render(model)
호출 - MyView
: HTML 응답
기본적 구조는 V3와 동일
But, 컨트롤러가 ModelView
반환하는 대신에,
ViewName
만 반환함.
1.2. ControllerV4
/servlet/web/frontcontroller/v4
에서
1
2
3
4
5
6
7
8
9
public interface ControllerV4 {
/**
*
* @param paramMap
* @param model
* @return
*/
String process(Map<String, String> paramMap, Map<String, Object> model);
}
V4에서는 인터페이스에 ModelView
없음!
model
객체는 패러미터로 전달되는 것.
결과로는 view
의 이름만 반환.
1.2.1 MemberFormControllerV4
- 회원 등록 폼
/servlet/web/frontcontroller/v4/controller
에서
1
2
3
4
5
6
7
8
9
10
11
12
public class MemberFormControllerV4
implements ControllerV4 {
@Override
public String process
(Map<String, String> paramMap,
Map<String, Object> model) {
// 여기선 model도 만들 필요가 없다!
// FrontController에서 만들어서 넘겨줄 거라서
return "new-form";
}
}
new-form
이라는
view의 논리적 이름만 반환함.
1.2.2. MemberSaveControllerV4
- 회원 저장
/servlet/web/frontcontroller/v4/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
public class MemberSaveControllerV4
implements ControllerV4 {
private MemberRepository memberRepository
= MemberRepository.getInstance();
@Override
public String process
(Map<String, String> paramMap,
Map<String, Object> model) {
String username
= paramMap.get("username");
int age
= Integer
.parseInt(paramMap
.get("age"));
Member member
= new Member(username, age);
memberRepository.save(member);
model.put("member", member);
return "save-result";
}
}
1.2.3 MemberListControllerV4
- 회원 목록
/servlet/web/frontcontroller/v4/controller
에서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MemberListControllerV4
implements ControllerV4 {
private final MemberRepository
memberRepository = MemberRepository.getInstance();
@Override
public String process
(Map<String, String> paramMap,
Map<String, Object> model) {
List<Member> members
= memberRepository.findAll();
model.put("members", members);
return "members";
}
}
1.2.4 FrontControllerServletV4
- 프론트 컨트롤러
/servlet/web/frontcontroller/v4
에서
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
@WebServlet(name = "frontControllerServletV4",
urlPatterns = "/front-controller/v4/*")
public class FrontControllerServletV4
extends HttpServlet {
private Map<String, ControllerV4>
controllerMap = new HashMap<>();
public FrontControllerServletV4() {
controllerMap
.put("/front-controller/v4/members/new-form",
new MemberFormControllerV4());
controllerMap
.put("/front-controller/v4/members/save",
new MemberSaveControllerV4());
controllerMap
.put("/front-controller/v4/members",
new MemberListControllerV4());
}
@Override
protected void service
(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String requestURI
= request.getRequestURI();
ControllerV4 controller
= controllerMap.get(requestURI);
if (controller == null) {
response
.setStatus(HttpServletResponse
.SC_NOT_FOUND);
return;
}
Map<String, String> paramMap
= createParamMap(request);
/* 추가된 부분 */
Map<String, Object> model
= new HashMap<>();
/* ----------- */
String viewName = controller
.process(paramMap, model);
MyView view
= viewResolver(viewName);
view.render(model,
request, response);
}
private MyView viewResolver(String viewName) {
return new MyView("/WEB-INF/views/"
+ viewName
+ ".jsp");
}
private Map<String, String> createParamMap
(HttpServletRequest request) {
Map<String, String> paramMap
= new HashMap<>();
request
.getParameterNames()
.asIterator()
.forEachRemaining(
paramName
-> paramMap
.put(paramName,
request
.getParameter(paramName)
)
);
return paramMap;
}
}
Map<String, Object> model = new HashMap<>()
: 모델 객체를
프론트 컨트롤러에서 생성하여 넘겨줌.