스프링 MVC -4

김성훈·2022년 2월 26일
0

스프링 인프런강의

목록 보기
10/13
post-thumbnail

<출처>

스프링 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

스프링 MVC - 시작하기

스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서, 매우 유연하고 실용적이다. 과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아니다.

스프링 MVC - 컨트롤러 통합

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

스프링 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.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 응답이 나가게 된다

profile
"한 명이 걷는 천 걸음 보다 천 명이 함께 걷는 한 걸음이 성공의 시작이고 완성이다"

0개의 댓글

관련 채용 정보