본문 바로가기

SpringMVC

[인프런 강의 복습]스프링 MVC 1편 - View 분리

■ View 분리 -v2

모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 발생하고 깔끔 X
뷰를 처리할 수 있는 View 객체를 생성하자

- ControllerV2의 반환 타입은 MyView이다. 
- 프론트 컨트롤러의 호출 결과 반환 받은 MyView 객체의 render()를 호출하면 forward 로직을 수행해서 JSP가 실행

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

public class MyView {

    private String viewPath;

    public MyView(String viewPath) {
        this.viewPath = viewPath;
    }

    public void render(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.MyView;
import hello.servlet.web.frontcontroller.v2.ControllerV2;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class MemberListControllerV2 implements ControllerV2 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    public MyView process(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        List<Member> members = memberRepository.findAll();

        //Model에 데이터 보관한다.
        request.setAttribute("members", members);

        return new MyView("/WEB-INF/views/members.jsp");
    }
}
import hello.servlet.web.frontcontroller.MyView;
import hello.servlet.web.frontcontroller.v1.ControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberFormControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberListControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberSaveControllerV1;
import hello.servlet.web.frontcontroller.v2.controller.MemberFormControllerV2;
import hello.servlet.web.frontcontroller.v2.controller.MemberListControllerV2;
import hello.servlet.web.frontcontroller.v2.controller.MemberSaveControllerV2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet(name = "frontControllerServletV2", urlPatterns = "/front-controller/v2/*")
public class FrontControllerServletV2 extends HttpServlet {

    private Map<String, ControllerV2> controllerMap = new HashMap<>();

    //설정정보, servlet이 생성될 때 Map이 생성
    public FrontControllerServletV2() {
        controllerMap.put("/front-controller/v2/members/new-form", 
                new MemberFormControllerV2());
        controllerMap.put("/front-controller/v2/members/save", 
                new MemberSaveControllerV2());
        controllerMap.put("/front-controller/v2/members", 
                new MemberListControllerV2());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String requestURI = request.getRequestURI();
        ControllerV2 controller = controllerMap.get(requestURI);    //다형성을 활용
        if(controller == null){
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);   //404 에러를 호출
            return;
        }

        MyView view = controller.process(request, response);
        view.render(request, response);
    }
}

 

[출처 : 인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]