스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 19

Spring 정리 2022. 4. 3. 16:26

인프런 강의 36일차.

 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 1 (김영한 강사님)

 - 서블릿, JSP, MVC 패턴

 - 서블릿으로 1차 구현

   -> 서블릿으로 구현했을 때 불편한 점 개선을 위해 JSP로 2차 구현

   -> JSP로도 불편한 점을 개선하기 위해 MVC 패턴으로 3차 구현

 

3. 스프링 MVC - 구조 이해

 3.9 스프링 mvc 컨트롤러 통합

  > @RequestMapping 을 잘 보면 클래스 단위가 아니라 메서드 단위에 적용된 것을 확인할 수 있다. 따라서 컨트롤러 클래스를 유연하게 하나로 통합할 수 있다.

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;
import java.util.Map;

@Controller("/springmvc/v2/members")
public class SpringMemberControllerV2 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    //Controller에서 매핑된 주소가 prefix로 붙게된다.
    @RequestMapping("/new-form")
    public ModelAndView newForm() {
        return new ModelAndView("new-form");
    }

    @RequestMapping("/save")
    public ModelAndView save(Map<String, String> paramMap) {
        List<Member> members = memberRepository.findAll();
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);   //mv.getModel().put("members", members);      //members 리스트로 저장
        return mv;
    }

    @RequestMapping
    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);     //mv.getModel().put("member", member);    //멤버 모델에 저장

        return mv;
    }
}

  - web.springmvc.v2.SpringMemberControllerV2

  - v1에서 각 클래스로 나누어져 있던 기능을 하나의 Controller 파일에 통합해서 구현하였다.

  - 최초 v1 메소드 복사 시 각 메소드의 매핑이 절대경로로 되어 있었으나 "/spring/mvc/v1/members" 부분은 중복이므로 해당 url은 Class단으로 올려서 Contoller에 정의해주면 prefix로 조합된다.

  - class url + method url 이 최종 메소드 호출 url이 된다.