단순하고 실용적인 컨트롤러 - v4

학습 페이지

앞서 만든 v3컨트롤러는 서블릿 종속성을 제거하고 뷰 경로의 경로의 중복을 제거하는 등, 잘 설계되었지 실제 컨트롤러 인터페이스를 구현하는 개발자 입장에선 항상 ModelView객체를 매번 생성하고 반환해야 하는 부분이 번거롭다.

좋은 프레임워크는 개발자가 단순하고 편리하게 사용할 수 있어야 한다.

V4 구조

Untitled

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";
    }
}