현의 개발 블로그

[MVC 프레임워크 만들기] 실용적인 컨트롤러 본문

스프링부트 이론/MVC

[MVC 프레임워크 만들기] 실용적인 컨트롤러

hyun2371 2023. 7. 3. 17:49

 

아래 글과 이어집니다.

 

[MVC 프레임워크 만들기] Model 추가

이전 버전에서 컨트롤러가 servlet 기술을 전혀 사용하지 않도록 변경해보자. 이전 버전 [MVC 프레임워크 만들기] View 분리하기 모든 컨트롤러에서 뷰로 이동하는 로직이 중복된다. String viewPath = "/W

hyun-keepdeving.tistory.com

 

 

이전 글에서 서블릿 종속성을 제거하고 뷰 경로의 중복을 제거했었다.

그런데 ModelView 객체를 생성하고 반환하는 부분이 번거롭다.

 

좋은 프레임워크는 아키텍처도 중요하지만, 개발자가 쉽고 편리하게 사용할 수 있어야 한다.

 

V3를 변경해서 쉽게 구현할 수 있는 V4 버전을 개발할 것이다.

 

V4
v3

V4는 컨트롤러가 ModelView를 반환하지 않고, ViewName만 반환한다.

frontController에서 controller를 호출할 때, paramMap 뿐만 아니라 model도 파라미터 값으로 넣는다.

 

ControllerV4

public interface ControllerV4 {
	String process(Map<String, String> paramMap, Map<String, Object> model);
}

controller에서 호출할 인터페이스를 생성한다. 

front controller가 빈 모델을 만들어서 넘겨주므로, controller는 모델을 생성할 필요가 없다.

 

호출 결과로 뷰의 이름을 반환한다.

 

Controller

MemberFormControllerV4

public class MemberFormControllerV4 implements ControllerV4 {
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        return "new-form";
    }
}

 

MemberSaveControllerV4

public class MemberSaveControllerV4 implements ControllerV4 {
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        String username = paramMap.get("username");
        int age = Integer.parseInt(paramMap.get("username"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        model.put("member", member);
        return "save-result";
    }
}

모델이 파라미터로 전달되기 때문에, 기존 모델에 값만 넣어준다.

 

 

MemberListControllerV4

public class MemberListControllerV4 implements ControllerV4 {
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        List<Member> members = memberRepository.findAll();

        model.put("members", members);
        return "members";
    }
}

 

Front Controller

V3와 거의 동일하다. 형광펜 친 부분이 변경된 부분이다.

모델 객체 전달

Map<String, Object> model = new HashMap<>();

프론트 컨트롤러가 모델 객체를 생성해서 넘겨준다.

컨트롤러에서 해당 모델 객체에 값을 담는다.

 

뷰의 논리 이름을 직접 반환

컨트롤러가 직접 뷰의 논리 이름을 반환한다.

해당 값을 이용해 viewResolver가 물리 경로로 변환한다.

 

 

 

 


Reference

 

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

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

www.inflearn.com

 

Comments