본문 바로가기
Develop/Java

[MVC] View 분리

by 연로그 2021. 5. 10.
반응형

지난 글 까지는 MVC 패턴을 분리하고, Front Controller를 분리했다.

이제 View를 분리하는 작업을 해보겠다.

 

프로젝트 구조는 다음과 같다.

MyView는 이후 다른 버전에서도 사용할 것이므로 v2보다 상단인 frontcontroller에 위치 시켰다.

 

 

MyView

public class MyView {
	private String viewPath;
	
	public MyView(String viewPath) {
		this.viewPath = viewPath;
	}
	
	public void render(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
		dispatcher.forward(req, res);
	}
}
  • 앞 게시글에서 계속 반복하던 부분을 render 함수로 생성했다.
  • RequestDispatcher 생성 및  .forward() 호출

 

ControllerV2

public interface ControllerV2 {
	MyView process(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException;
}
  • V1과 마찬가지로 interface 생성
  • 반환형을 void가 아닌 MyView 형으로 설정

 

이제 Controller 3개를 생성해주자.

기본적인 로직은 기존과 같지만 RequestDispatcher을 사용하는 부분이 달라졌다.

 

MemberFormController

public class MemberFormControllerV2 implements ControllerV2{
	@Override
	public MyView process(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException {
		return new MyView("/WEB-INF/views/new-form.jsp");
	}
}
  • MyView를 return
  • MyView(String): MyView의 생성자. MyView라는 객체의 viewPath 변수에 String 값 저장

 

MemberSaveController

public class MemberSaveControllerV2 implements ControllerV2{
	MemberRepository memberRepository = MemberRepository.getInstance();
	
	@Override
	public MyView process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		String username = req.getParameter("username");
		int age = Integer.parseInt(req.getParameter("age"));
		
		Member member = new Member(username, age);
		memberRepository.save(member);
		req.setAttribute("member", member);
		
		return new MyView("/WEB-INF/views/save-result.jsp");
	}
}

 

MemberListcontroller

public class MemberListControllerV2 implements ControllerV2{
	MemberRepository memberRepository = MemberRepository.getInstance();
	
	@Override
	public MyView process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		List<Member> members = memberRepository.findAll();
		req.setAttribute("members", members);
		return new MyView("/WEB-INF/views/members.jsp");
	}
}

 

FrontControllerV2

@WebServlet(name = "frontControllerServletV2", urlPatterns = "/front-controller/v2/*")
public class FrontControllerServletV2 extends HttpServlet {
	
	private Map<String, ControllerV2> controllerMap = new HashMap<>();
	
	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 req, HttpServletResponse res) throws ServletException, IOException {
		System.out.println("FrontControllerServletV2.service");
		
		String reqURI = req.getRequestURI();
		ControllerV2 controller = controllerMap.get(reqURI);
		
		if(controller == null) {
			res.setStatus(HttpServletResponse.SC_NOT_FOUND);
			return;
		}
		
		MyView view = controller.process(req, res);
		view.render(req,res);
	}
}
  • V1와 유사한 방식으로 작동
  • 하지만 이제 controller.process의 return은 void가 아닌 MyView이다.
  • controller.process()의 결과를 MyView view에 저장하고, view.render()를 실행

 

기본적으로 큰 틀은 v1때와 동일하다.

Client들은 Front Controller를 통해 req 값에 따라 적절한 Controller를 실행한다.

 

(그림의 복잡도를 줄이기 위해 MemberSaveControllerV2 만으로 예시를 그렸다.)

  1. Client는 Front Controller를 통해 MemberSaveControllerV2에 접근한다.
  2. MemberSaveControllerV2는 MyView에 viewPath라는 데이터를 전달하고 이를 반환한다.
  3. Front Controller에서는 MemberSaveControllerV2가 반환한 MyView 데이터를 갖고 render() 함수를 실행시킨다.

 

그림상 구조가 다소 복잡해보이지만 코드가 훨씬 간결하고 직관적이게 됐다.

중복되는 코드가 거의 사라졌다.

 


본 게시글은 김영한 님의 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 구매 후 정리하기 위한 포스팅입니다.

내용을 임의로 추가, 수정, 삭제한 부분이 많으며 정확한 이해를 위해서 강의를 구매하시는 것을 추천 드립니다.

 

inf.run/B756

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

반응형

'Develop > Java' 카테고리의 다른 글

[MVC] Controller 단순화  (0) 2021.05.13
[MVC] Model 분리  (0) 2021.05.11
[MVC] 프론트 컨트롤러 패턴  (2) 2021.05.10
[MVC패턴] 회원 관리 웹 애플리케이션  (0) 2021.05.10
[JSP] 회원 관리 웹 애플리케이션  (0) 2021.05.07