개발자일지/Spring

Spring MVC 1편 - MVC 구조 이해

어쩌다한번 2022. 3. 10. 07:48
 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

김영한 님의 스프링 MVC 강의 1편을 바탕으로 공부한 내용을 정리한 것 입니다.

 


앞에서 만든 것들을 최선으로 다듬으면 스프링 MVC가 된다고 한다.

이제 진짜 스프링 MVC에 대해서 배워본다.

 

@RequestMapping

핸들러(컨트롤러)를 조회하고 어답터를 찾아내는것까지를 어노테이션으로 만들었다.

@Controller
public class SpringMemberSaveControllerV1 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView process(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 mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }
}

V3과 거의 동일한데 다른것이라면

파라미터를 request에서 직접 가져오고 ModelAndView로 반환한다는 것이다.

ModelAndView로 반환한 것은 InternalResourceViewResolver를 통해 URL화된다.

 


 

이제는 컨트롤러를 각각 만들어두고 사용할필요도 없다. 모든 컨트롤러를 한곳으로 모아준다

@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
    public ModelAndView save() {

        List<Member> members = memberRepository.findAll();

        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
        return mv;
    }
    @RequestMapping("/save")
    public ModelAndView members(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 mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }
}

같았던 메서드 이름을 변경하고 매핑에서 중복을 제거했다

클래스에 상위 경로를 입력하는 식으로 가능하다.

 

HTTP Method

@RequestMapping은 URL매칭 뿐만 아니라, HTTP Method도 구분 가능하다

@RequestMapping("/new-form", method = RequestMethod.GET)

조회만 한다면 GET으로 설정하는게 좋을 것이다

혹은

@GetMapping("/new-form")

@GetMapping이라는 애노테이션을 사용하면 더 간편하다

Put, Post, Patch, Delete 모두 애노테이션이 존재한다.

 

 

 


전체 정리

  • 첫번째. 요청이 들어오면 스프링 부트가 등록해 놓은 핸들러들을 조회한다.
  • 두번째. 조회한 핸들러를 처리할 수 있는 어댑터를 조회한다.
  • 세번째. 어댑터가 핸들러를 받아서 공정을 거치고 ModelAndView를 반환한다.
  • 네번째. viewResolver를 호출해서 View를 찾아낸다.
  • 다섯번째. render를 통해 요청받은 뷰를 응답한다.