Post

백엔드 웹 개발 노트4.2 - MVC 역사2 view

1. View 분리 - v2

기존 코드를 보면 뷰를 이렇게 출력해줬다.

1
2
3
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);

이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들어보자.

구조는 다음과 같다.

Controller가 이제 View에 대한 정보를 가진 MyView 객체를 반환할 것이다.

그러므로 MyView객체를 만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package hello.servlet.web.frontcontroller;

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

public class MyView {
    private String viewPath;

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

    public void render(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request,response);
    }
}

render()라는 함수가 중복되는 dispatcher부분을 담당하였다.

우리는 이 객체를 반환하기로 했으므로 Controller 인터페이스도 바꿔주자.

1
2
3
4
5
//이전 코드
void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;

//바뀐 코드
MyView process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;

이제 각 컨트롤러도 수정해주자.

1.1 MemberFormController 수정 - 회원 등록폼

1
2
3
4
 @Override
public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    return new MyView("/WEB-INF/views/new-form.jsp");
}

굉장히 간결해졌다.

1.2 MemberSaveController 수정 - 회원 저장

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    @Override
    public MyView process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

        String username = request.getParameter("username");
        int height = Integer.parseInt(request.getParameter("height"));
        int weight = Integer.parseInt(request.getParameter("weight"));

        Member member = new Member(username,height,weight);

        memberRepository.save(member);

        //모델 등록
        request.setAttribute("member",member);

        //수정한 부분
        return new MyView("/WEB-INF/views/save-result.jsp");
    }

마찬가지로 View부분만 수정해주면 된다.

1.3 MemberListController 수정 - 회원 목록

1
2
3
4
5
6
    @Override
    public MyView process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        List<Member> members = memberRepository.findByAll();
        request.setAttribute("members",members);
        return new MyView("/WEB-INF/views/members.jsp");
    }

3줄로 줄었다.

마지막으로 프론트 컨트롤러를 고쳐주자.

1.4 프론트 컨트롤러 수정

이 부분도 크게 다를건 없다.

1
2
3
4
5
//기존 코드
controllerV1.process(request,response);
//바뀐 코드
MyView myView = controllerV2.process(request, response);
myView.render(request,response);

결과를 확인해보자.

나의 경우 URL을 따로 지정해서 v2/~로 시작하게 된다. url을 수정하지 않았다면 v1/~로 나오는게 정상이다.!!

2. 한계

  • 서블릿 종속성을 제거
    • view에 관한 정보만 리턴하는 MemberFormController의 경우는 HttpServletRequest, HttpServletResponse객체가 필요가 없다. 어떻게 해결할 수 있을까?
  • 뷰 이름 중복 제거
    • ‘/WEB-INF/views/~’ 는 중복된 url이다. 다음에 이를 고쳐보도록 하겠다.
This post is licensed under CC BY 4.0 by the author.