Spring

Spring MVC 구조 뜯어보기(2) - Spring MVC 사용

쭈녁 2024. 1. 21. 04:21

 

 

Spring 프레임 워크의 MVC 기능을 활용한 컨트롤러 모습을 알아보자.

 

 

ModelAndView를 반환하는 방식

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

@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberFormControllerV2 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/new-form")
    public ModelAndView process() {
        return new ModelAndView("new-form");
    }

    @RequestMapping("/save")
    public ModelAndView save(HttpServletRequest request) {
        String name = request.getParameter("name");
        int age = Integer.parseInt(request.getParameter("age"));
        Member member = new Member(name, age);
        Member saved = memberRepository.save(member);

        ModelAndView mv = new ModelAndView("save-result");
        mv.addObject("member", saved);

        return mv;
    }

    @RequestMapping()
    public ModelAndView list() {
        List<Member> members = memberRepository.findAll();
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
        return mv;
    }
}

 

컨트롤러에서 ModelAndView를 만들어서 리턴으로 던져주는 방식이다 서블릿에서 받아온 request에 담긴 정보를 기반으로 로직을 수행하고 ModelAndView를 세팅하여 디스패쳐서블릿에 ModelAndView를 반환하면 리턴된 값을 기반으로 View 페이지에 Model객체 안의 값을 랜더링 하여 준다.

 

 

디스패쳐 서블릿의 Model을 받아 세팅해주고 View 주소값을 문자열로 반환하는 방식

@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberFormControllerV3 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

//    @RequestMapping(value = "/new-form", method = RequestMethod.GET)
    @GetMapping("/new-form")
    public String process() {
        return "new-form";
    }

//    @RequestMapping(value = "/save", method = RequestMethod.POST)
    @PostMapping("/save")
    public String save(
            @RequestParam("name") String name
            , @RequestParam("age") int age
            , Model model) {
        Member member = new Member(name, age);
        Member saved = memberRepository.save(member);
        model.addAttribute("member", saved);
        return "save-result";
    }

//    @RequestMapping(method = RequestMethod.GET)
    @GetMapping
    public String list(Model model) {

        List<Member> members = memberRepository.findAll();
        model.addAttribute("members", members);
        return "members";
    }
}

 

해당 방식은 디스패처 서블릿이 가지고 있는 Model 객체를 받아 컨트롤러가 객체를 세팅해 주고

반환 값으로는 view의 주소값을 리턴한다.

디스패쳐 서블릿은 세팅 받은 자신의 Model와 컨트롤러가 리턴한 View의 주소(문자열) 값을 찾아 랜더링 해준다.

@ModelAttribute로 현재 디스패처 서블릿이 가지고 있는 Model에서 타입에 맞는 값을 파라미터로 받아올 수도 있다.

 

이러한 구조가 현재  스프링 프레임워크가 구조화한 MVC모델의 모습이다.

 

코드 출처 및 참고 자

인프런 / 김영한 / 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard