Home 섹션4) MVC 프레임워크 - v4. 단순, 실용적인 컨트롤러
Post
Cancel

섹션4) MVC 프레임워크 - v4. 단순, 실용적인 컨트롤러

본 포스트는 스프링 MVC 1편(김영한, 인프런) 강의를 통해 학습한 내용을 작성자 임의 대로 요약 및 정리한 것입니다.


1. 단순하고 실용적인 컨트롤러 - v4

    컨트롤러 인터페이스 구현하는 개발자 입장에서
항상 ModelView 객체를 생성 및 반환해야 하는 점이 번거로움!
==> 개발자가 단순, 편리하게 사용 가능하도록!!!
   (즉, 실용성!)

1.1. V4의 구조

  1. 클라이언트의 HTTP 요청
  2. FrontController –> 매핑 정보
    : URL 매핑 정보에서 컨트롤러 조회
  3. FrontController –> Controller
    : 호출(paramMap, model)
  4. Controller –> FrontController
    : viewName 반환
  5. FrontController –> viewResolver
    : viewResolver 호출
  6. viewResolver –> FrontController
    : MyView 반환
  7. FrontController –> MyView
    : render(model) 호출
  8. 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<>()
    : 모델 객체를
    프론트 컨트롤러에서 생성하여 넘겨줌.
Contents