Home 섹션4) MVC 프레임워크 - v1. 프론트 컨트롤러 도입
Post
Cancel

섹션4) MVC 프레임워크 - v1. 프론트 컨트롤러 도입

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


1. 프론트 컨트롤러 V1 도입

1.1. V1의 구조

  1. 클라이언트의 HTTP 요청
  2. FrontController –> 매핑 정보
    : URL 매핑 정보에서 컨트롤러 조회
  3. FrontController –> Controller
    : 컨트롤러 호출
  4. Controller –> JSP
    : 컨트롤러에서 JSP forward
  5. 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)
  • service()
    1. 먼저 requestURI 조회
    2. 실제 호출할 컨트롤러를
      controllerMap에서 찾음.
    3. 없을 시엔
      404 상태 코드 반환.
    4. 컨트롤러 찾고
      ``controller.process(req, res) 호출하여
      해당 컨트롤러 실행.
Contents