스프링 MVC의 뷰 분리 - V2

최지환·2022년 4월 10일
0

스프링

목록 보기
2/12
post-thumbnail

스프링 MVC의 뷰 분리 - V2

이전에는 스프링 MVC와 유사한 MVC를 만들기 위해 Servlet을 프론트 패턴으로 처리하는 V1을 만들어 보았다.

이번에는 이런 V1을 리팩토링 하고, MVC 형태에 가깝게 하기 위해 뷰를 분리하여 V2 버전을 만들어보자

우선 이전 방식에 어떤 문제점이 있는지 살펴보자.

V1의 Save,Form,List 컨트롤러를 확인해보자.

MemberFormControllerV1

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);
    }
}

MemberSaveControllerV1

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);

        request.setAttribute("member", member);

        String viewPath = "/WEB-INF/views/save-result.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}

MemberListControllerV1

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);
    }
}

위의 form,list,save 코드를 살펴보면 중복이 있음을 확인 할 수있다.

컨트롤러에서 뷰로 이동하는 부분에 중복이 있다.

중복 코드

String viewPath = "이동경로";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);

이러한 중복을 제거하기 위해서 별도로 view 를 처리 하는 객체를 만들자.

MyView - view에 대한 로직 처리 객체

public class MyView {
    private final 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);
    }
}

MyView는 생성자 주입으로 viewPath를 입력받고, render함수를 통해 뷰를 생성해준다.

이제 MyView를 사용허여 중복 코드를 없앤 각 컨트롤러드를 살펴 보자.

MemberFormControllerV2

public class MemberFormControllerV2 implements ControllerV2 {
    @Override
    public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        return new MyView("/WEB-INF/views/new-form.jsp");
    }
}

MemberListControllerV2

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();
        request.setAttribute("members", members);

        return new MyView("/WEB-INF/views/members.jsp");
    }
}

MemberSaveControllerV2

public class MemberSaveControllerV2 implements ControllerV2 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    public MyView 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);
        request.setAttribute("member", member);

        return new MyView("/WEB-INF/views/save-result.jsp");
    }
}

이로써 각 컨트롤러들에 대해 중복된 코드를 제거 할 수 있었다.

또한 View에 대해 관리하는 MyView 객체를 만듦으로써 각 컨트롤러들이 뷰를 만들어야한다는 책임을 낮출 수 있게 되었다.

0개의 댓글