스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 /인프런 강의/ 김영한
5.스프링 MVC- 구조 이해 - 스프링 MVC - 시작하기
5.스프링 MVC- 구조 이해 - 스프링 MVC - 컨트롤러 통합
5.스프링 MVC- 구조 이해 - 스프링 MVC - 실용적인 방식
5.스프링 MVC- 구조 이해 - 정리
관련코드
https://github.com/sunghoonking/spring-mvc-inflearn/tree/main/src/main/java/hello/servlet/web
스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서, 매우 유연하고 실용적이다. 과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아니다.
SpringMemberControllerV2
package hello.servlet.web.springmvc.v2;
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 클래스 단위 -> 메서드 단위
* @RequestMapping 클래스 레벨과 메서드 레벨 조합
*/
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public ModelAndView newForm() {
return new ModelAndView("new-form");
}
@RequestMapping("/save")
public ModelAndView save(HttpServletRequest request, HttpServletResponse
response) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
ModelAndView mav = new ModelAndView("save-result");
mav.addObject("member", member);
return mav;
}
@RequestMapping
public ModelAndView members() {
List<Member> members = memberRepository.findAll();
ModelAndView mav = new ModelAndView("members");
mav.addObject("members", members);
return mav;
}
}
실무에서 사용하는 방식
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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* v3
* Model 도입
* ViewName 직접 반환
* @RequestParam 사용
* @RequestMapping -> @GetMapping, @PostMapping
*/
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@GetMapping("/new-form")
public String newForm() {
return "new-form";
}
@PostMapping("/save")
public String save(
@RequestParam("username") String username,
@RequestParam("age") int age,
Model model) {
Member member = new Member(username, age);
memberRepository.save(member);
model.addAttribute("member", member);
return "save-result";
}
@GetMapping
public String members(Model model) {
List<Member> members = memberRepository.findAll();
model.addAttribute("members", members);
return "members";
}
}
'
1. HTTP 요청이 오면 Dispatcher Servlet에게 온다
2. 핸들러 매핑에서 핸들러 조회를 한다
(여러개의 핸들러를 스프링 부트가 등록해두었고 그 중에서 순차적으로 찾아서 핸들러 매핑이 처리할 수 있는 핸들러를 찾아준다)
3. 찾아서 핸들러 어댑터 목록에 떤져주고 핸들러 어댑터는 처리할 수 있다고 하면 핸들러 어댑터를 통해서 실제 핸들러를 호출하고 ModelAndView를 반환 한다
4.그리고 ViewResolver를 호출해서 실제 View를 찾는다
5. View가 렌더가 되면서 실제 고객에게 HTTP 응답이 나가게 된다