단순하고 실용적인 컨트롤러 - v4
앞서 만든 v3컨트롤러는 서블릿 종속성을 제거하고 뷰 경로의 경로의 중복을 제거하는 등, 잘 설계되었지만 실제 컨트롤러 인터페이스를 구현하는 개발자 입장에선 항상 ModelView객체를 매번 생성하고 반환해야 하는 부분이 번거롭다.
좋은 프레임워크는 개발자가 단순하고 편리하게 사용할 수 있어야 한다.
v4와 v3의 차이는 다음과 같다.
이제 컨트롤러는 ModelView를 반환하는게 아니라 ViewName만 반환한다.
구조를 그대로 살리면서 이렇게 바꿔보자.
이를 위해 컨트롤러 인터페이스는 이제 String을 반환한다.
package hello.servlet.web.frontcontroller.v4;
import java.util.Map;
public interface ControllerV4 {
/* @param paramMap
* @param model
* @return viewName
*/
String process(Map<String, String> paramMap, Map<String, Object> model);
}
컨트롤러를 구현해보자.
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";
}
}
개발자 입장에선 아주 편해졌다. 그냥 논리경로 String만 반환하면 되기 때문이다.
package hello.servlet.web.frontcontroller.v4.controller;
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.ModelView;
import hello.servlet.web.frontcontroller.v4.ControllerV4;
import java.util.List;
import java.util.Map;
public class MemberSaveControllerV4 implements ControllerV4 {
MemberRepository memberRepository = hello.servlet.domain.member.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";
}
}