강의에서 컨트롤러를 점점 완성시켜 나가는 형식으로 만들어 가는데 전 강의에서 소개한 컨트롤러는 서블릿 종속성 제거와 경로 중복 제거 등 잘 설계는 했지만 ModelView 객체를 생성하고 반환해야 하는 부분에 대한 번거로움이 있다.
강의에서는 좋은 아키텍처도 중요하지만 개발자가 편하게 사용할 수 있는 것도 중요하다고 강조한다. 때문에 전에 번거로웠던 부분을 조금 더 개선한 버전의 컨트롤러를 코딩을 해본다.
먼저 구조는 이렇다. 클라이언트가 HTTP를 프론트 컨트롤러에 요청한다. 프론트 컨트롤러는 매핑 정보를 통해 컨트롤러를 조회하고 알맞는 컨트롤러에 paramMap, model을 파라미터로 호출하고 컨트롤러는 ViewName을 반환해준다. 그럼 프론트 컨트롤러는 다시 viewResolver를 호출하고 viewResolver는 MyView를 반환해준다. 다시 프론트 컨트롤러는 render(model)을 호출해 MyView는 HTML 응답을 하게 된다.
전에 진행했던 V3와 구조는 같지만 컨트롤러가 ModelView를 반환하지 않고 ViewName만 반환하는 특징이 있다.
public interface ControllerV4 {
/**
*
* @param paramMap
* @param model
* @return viewName
*/
String process(Map<String, String> paramMap, Map<String, Object> model);
}
인터페이스에 paramMap과 model을 파라미터로 전달 받을 수 있게 인터페이스 컨트롤러를 만들어주었다.
public class MemberFormControllerV4 implements ControllerV4 {
@Override
public String process(Map<String, String> paramMap, Map<String, Object> model) {
return "new-form";
}
}
회원 정보를 등록하는 form 컨트롤러를 보면 뷰의 논리 이름만 반환해 주고 있다.
코드가 매우 간단해 졌다.
@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으로 넣어주고 리턴을 논리 이름만 반환해주면 끝이다.
다른 컨트롤러도 비슷하게 고쳐나간다.
//paraMap 을 넘겨줘야 한다.
Map<String, String> paramMap = createParamMap(request);
Map<String, Object> model = new HashMap<>(); //추가
// 컨트롤 알트 M
String viewName = controller.process(paramMap, model);
MyView view = viewResolver(viewName);
view.render(model, request, response);
프론트 컨트롤러에서 추가한 부분이다.
모델 객체를 전달하는 부분이 추가가 되었다. 모델 객체를 프론트 컨트롤러에서 생성해서 넘겨주고 컨트롤러에서 모델 객체에 값을 담으면 여기에 그대로 담겨있게 된다.
아래 보면 뷰의 논리 이름을 직접 반환하고 있다. 이 값을 통해 실제 물리 뷰를 찾을 수 있게 된다.
강의에서는 프레임워크나 공통 기능이 수고로워야 사용하는 개발자가 편리해진다고 말하고 있다. 그리고 지금 이 컨트롤러 또한 완성이 아닌 프레임워크가 발전하는 과정이기때문에 앞으로 조금 더 효율적인 코드를 공부하게 될 것이라고 한다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : Spring MVC 구조 확인하기 (0) | 2022.01.24 |
---|---|
[Spring Boot] : Controller를 여러 방식으로 구현하기 위해 사용한 Adapter pattern (0) | 2022.01.23 |
[Spring Boot] : Model 추가해서 Front Controller에서만 Servlet 사용하기 (0) | 2022.01.22 |
[Spring Boot] : Controller에서 View 이동 시 중복되는 부분 리펙터링하기 (0) | 2022.01.22 |
[Spring Boot] : Front Controller 구현해보기 (0) | 2022.01.22 |
댓글