스프링 MVC- 구조 이해

최주영·2024년 2월 6일
0

✅ 프론트 컨트롤러 패턴

  • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
  • 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
  • 입구를 1개
  • 공통 처리 가능
  • 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨
    EX) 스프링 웹 MVC의 프론트 컨트롤러 패턴 -> DispatcherServlet



DispatcherServlet

  • 부모클래스에서 HttpServlet을 상속 받아서 사용하고, 서블릿으로 동작한다
    -> DispathcerServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet
    -> 스프링부트는 Dispatcher 서블릿을 자동으로 등록하면서 모든경로(urlPatterns="/") 대해서 매핑함
  • 스프링 MVC의 프런트 컨트롤러는 DispatcherServlet 이다
  • 스프링의 핵심이다
  • 서블릿이 호출



Controller

  • 스프링이 자동으로 스프링 빈으로 등록한다
  • 내부에 Component 어노테이션이 있어서 컴포넌트 스캔의 대상이 됨
  • 스프링 MVC에서 어노테이션 기반 컨트롤러로 인식함

@RequestMapping

  • 요청 정보를 매핑한다
  • 해당 URL이 호출되면 이 메소드가 호출된다
  • 어노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지어도 된다
  • RequestMappingHandlerMapping, RequestMappingHandlerAdapter
    -> 스프링에서 주로 사용하는 어노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑어댑터

ModelAndView

  • 모델과 뷰 정보를 담아서 반환하면 된다
    (반환형이 ModelAndView 타입)

RequestMappingHandlerMapping

  • RequestMapping 또는 @Controller 가 클래스 레벨이 붙어 있는 경우에 매핑 정보로 인식
@Controller
public class SpringMemberSaveControllerV1 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/member/save") // 매칭 url 적기
    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 -> 데이터를 전송시킬 수 있는 리턴 타입

        ModelAndView mv = new ModelAndView("save-result"); // 매칭 jsp 뷰 파일 이름 적기
        mv.addObject("member",member); // 데이터값 저장 (키, 값) 형태
        return mv;
    }
}

✅ 컨트롤러 통합 및 조합

  • 공통되는 주소를 클래스 위에 @RequestMapping 을 통해 먼저 통일하기
  • 공통 주소 + 각 메소드의 매핑 주소를 합쳐서 연결 가능
@Controller
@RequestMapping("/springmvc/v2/members")  // 이 주소 매핑 +  밑에 있는 메소드 매핑 주소를 합침
public class SpringMemberControllerV2 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

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

    @RequestMapping
    public ModelAndView members(){
        List<Member> members = memberRepository.findAll();

        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members",members);
        return mv;
    }
}

✅ 스프링 MVC - 실용적인 방식 (실무에서 쓰이는 방식)
@RequestParam

  • 스프링은 HTTP 요청 파라미터를 @RequestParam으로 받을 수 있음
  • GET 쿼리 파라미터, POST 폼 방식을 모두 지원함
  • @RequestParam("username") = @request.getParameter("username")

RequestMapping

  • URL 매칭만 하는 것이 아닌, HTTP Method도 구분 가능 (GET or POST)

@GetMapping , PostMapping

  • URL과 HTTP Method를 한번에 적을 때 RequestMapping 보다 더 편하게 사용할 수 있는 방법
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping(value = "/new-form", method = RequestMethod.GET) // get 방식으로만 받음 (post는 허용 x)
    // @GetMapping("/new-form")   // 위 방식과 동일함 (더 간단해짐)
    public String newForm(){
        return "new-form";
    }

    @RequestMapping(value = "/save", method = RequestMethod.POST)
    // @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";
    }

    @RequestMapping(method = RequestMethod.GET)
    // @GetMapping
    public String members(Model model){
        List<Member> members = memberRepository.findAll();

        model.addAttribute("members",members);
        return "members";
    }
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글