MVC 프레임워크 만들기에서 v3은 ModelView를 개발자가 직접 생성해서 반환했기 때문에, 불편했던 기억이 날 것입니다. 물론 v4를 만들면서 실용적으로 개선한 기억도 날 것입니다.
스프링 MVC는 개발자가 편리하게 개발할 수 있도록 수 많은 편의 기능을 제공합니다.
실무에서는 지금부터 설명하는 방식을 주로 사용합니다.
package hello.servlet.web.springmvc.v3;
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public String newForm() {
return "new-form"; //...1
}
@RequestMapping("/save")
public String save(
@RequestParam("username") String username, //...2
@RequestParam("age") int age,
Model model) { //...3
Member member = new Member(username, age);
memberRepository.save(member);
model.addAttribute("member", member);
return "save-result";
}
@RequestMapping()
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members);
return "members";
}
}
ViewName 직접 반환
뷰의 논리 이름을 반환할 수 있습니다.
애노테이션 기반의 컨트롤러는 ModelAndView를 반환해도 되고 문자를 반환해도 됩니다.
인터페이스로 고정이 되어있지 않고 굉장히 유연하게 설계되어 있기 때문에 가능합니다.
문자로 반환해도 뷰 이름이라는 것을 알고 프로세스가 진행이 됩니다.
@RequestParam 사용
@RequestParam(”파라미터 이름”)
스프링은 HTTP 요청 파라미터를 @RequestParam 으로 받을 수 있습니다.
@RequestParam("username") 은 request.getParameter("username") 와 거의 같은 코드라 생각하면 됩니다.
애노테이션 기반의 컨트롤러는 엄청 유연합니다.
HttpServletRequest
도 받을 수 있고 HttpServletResponse
도 받을 수 있고, 파라미터를 직접 받을 수도 있습니다.
타입 캐스팅이나 타입 변환까지 자동으로 해줍니다.
@RequestParam("age") int age
까지만 해도 됩니다.
이전처럼 String으로 변환을 해줄 필요가 없습니다.
물론 GET 쿼리 파라미터, POST Form 방식을 모두 지원합니다.
→ 참고
Model 파라미터
→ 다른 예시 참고
Model 파라미터도 넘길 수 있습니다.
앞의 V3에서 model 만들었던 것과 똑같은 원리입니다. 스프링 MVC도 이런 편의 기능을 제공합니다.
→ 참고
<aside> ❗ Model, ModelMap, ModelAndView
Model, ModelMap vs ModelAndView 차이점
데이터만 저장한다 vs 데이터와 이동하고자 하는 View Page를 같이 저장한다
Model, ModelMap 공통점
Model, ModelMap 차이점
Model - 인터페이스
ModelMap - 클래스
Model 은 interface 이고 ModelMap은 구현체일 뿐이지 둘 다 Map 방식으로 서비스 됩니다.
그냥 원하는거 아무거나 쓰면 됩니다.