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에 전달한다.
'BackEnd : Spring > Spring MVC' 카테고리의 다른 글
[Spring MVC] 스프링 부트 3.2 매개변수 이름 인식 문제 (0) | 2024.05.02 |
---|---|
[Spring MVC] FrontController : 유연한 컨트롤러 (0) | 2024.04.08 |
[Spring MVC] FrontController : Model 추가하기 (0) | 2024.04.06 |
[Spring MVC] FrontController : 뷰 분리하기 (0) | 2024.04.06 |
[Spring MVC] FrontController 패턴 생성하기 (0) | 2024.04.06 |