BackEnd : Spring/Spring MVC

[Spring MVC] FrontController : 단순하고 실용적인 컨트롤러

snoony 2024. 4. 8. 09:42

https://nymagicshop16.tistory.com/77

 

[Spring MVC] FrontController : Model 추가하기

서블릿 종속성 제거 https://nymagicshop16.tistory.com/76 [Spring MVC] FrontController : 뷰 분리하기 앞의 FrontController 구조에서 뷰를 분리하여 코드의 반복을 없앨 수 있다. MyView package hello.servlet.web.frontcontroller;

nymagicshop16.tistory.com

앞서 만든 v3 컨트롤러를 보면, 항상 ModelView 객체를 생성하고 반환해야 부분이 번거롭다.

V4 구조 (우리가 이름붙인 것이다) 는 컨트롤러가 ModelView를 반환하지 않고, ViewName만 반환한다.

기존의 V3 컨트롤러

ControllerV4

package hello.servlet.web.frontcontroller.v4;

import java.util.Map;

public interface ControllerV4 {
    /**
     *
     * @param paramMap
     * @param model
     * @return
     */
    String process(Map<String, String> paramMap, Map<String, Object> model);
}

ControllerV4 인터페이스에는 ModelView가 없다.

MemberFormControllerV4

package hello.servlet.web.frontcontroller.v4.controller;

import hello.servlet.web.frontcontroller.v4.ControllerV4;

import java.util.Map;

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

간단하게 "new-form"만 반환한다.

MemberSaveControllerV4

package hello.servlet.web.frontcontroller.v4.controller;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.v4.ControllerV4;

import java.util.Map;

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

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

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

모델이 파라미터로 전달되므로 모델을 직접 생성하지 않고 

model.put("member", member)로 전달한다.

MemberListControllerV4

package hello.servlet.web.frontcontroller.v4.controller;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.v4.ControllerV4;

import java.util.List;
import java.util.Map;

public class MemberListControllerV4 implements ControllerV4 {
    private MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    public String process(Map<String, String> paramMap, Map<String, Object> model) {
        List<Member> members = memberRepository.findAll();
        model.put("members", members);
        return "members";
    }
}

멤버 목록 조회 컨트롤러도 같은 로직이다.

FrontControllerServletV4

@Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FrontControllerServletV4.service");

        String requestURI = request.getRequestURI();

        ControllerV4 controller = controllerMap.get(requestURI);
        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        Map<String, String> paramMap = createParamMap(request);
        Map<String, Object> model = new HashMap<>(); //추가
        String viewName = controller.process(paramMap, model);
        MyView view = viewResolver(viewName);
        view.render(model, request, response);
    }

수정된 service 메소드이다.

모델 객체를 FrontController에서 생성해서 넘겨준다.

 viewName을 모델에서 받아오는 것이 아니라 controller에서 직접 반환하고, 이 viewName을 viewResolver에 전달한다.