쌓고 쌓다

Spring MVC 사용 방식 본문

프로그래밍/spring

Spring MVC 사용 방식

승민아 2023. 8. 8. 10:11

핸들러와 핸들러 어댑터에서 우선순위가 가장 높은 것은

RequestMappingHandlerMapping과 RequestMappingHandlerAdapter이다.

 

이 핸들러와 핸들러 어댑터는 어노테이션 기반의 컨트롤러를 지원한다.

@RequestMapping 기반으로 컨트롤러를 구성해보자.

 

V1 (Save)

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

HttpServletRequest

폼 데이터로 넘어온 정보를 getParameter를 통해 꺼낼 수 있다.

 

@Controller

내부에 @Component 어노테이션이 존재하므로 컴포넌트 스캔으로 스프링 빈으로 등록된다.

스프링 MVC에서 어노테이션 기반 컨트롤러로 인식된다.

 

@RequestMapping

요청 정보를 매핑하여 이 URL로 메서드가 호출된다.

 

MovelAndView

생성자로 뷰 이름을 줄 수 있으며 모델에 정보를 담을 수 있다.

addObject(이름, 데이터)로 모델에 맵 형식으로 데이터를 넣을 수 있다.

 

V1 (Form 페이지)

@Controller
public class SpringMemberFormControllerV1 {

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

}

 

꼭 @RequestMapping에서 꼭 파라미터가 존재해야하는것은 아니다.

 

V2 (클래스 레벨 @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 members(HttpServletRequest request, HttpServletResponse response) {
        ...
    }

}

@RequestMapping은 메서드 단위로 적용되므로 하나의 컨트롤러에 여러 요청 정보를 매핑할 수 있다.

클래스 레벨에 @RequestMapping을 사용하여

메서드 레벨의 @RequestMapping과 조합할 수 있다.

"/springmvc/v2/members" + "/new-form" => "/springmvc/v2/members/new-form"

 

 

V3 (주로 사용하는 방식)

모델뷰를 직접 생성하지 않고 Model 파라미터로 받아 사용하면서 뷰의 논리 이름을 반환하여 사용할 수 있다.

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

    //@GetMapping("/new-form")
    @RequestMapping(value = "/new-form", method = RequestMethod.GET)
    public String newForm() {
        return "new-form";
    }
    //@PostMappnig("/save")
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public String members(
            @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
    @RequestMapping(method = RequestMethod.GET)
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
        model.addAttribute("members", members);
        return "members";
    }



}

@RequestParam

@RequestParam은 요청 파라미터를 받아 처리하는 어노테이션인데

GET 쿼리 파라미터, POST Form 둘다 요청 파라미터이라 두 방식 다 지원하기에 폼 데이터를 이 어노테이션으로 받을 수 있다.

method 속성으로 요청 방식을 지정할 수 있다.

 

@GetMapping, @PostMapping

@RequestMapping(value = "/new-form", method = RequestMethod.GET)을 아래와 같이 작성할 수 있다.

@GetMapping("/new-form")

물론 @PostMapping도 가능하다.

 

사실 @GetMapping에 @RequestMapping(method = RequestMethod.GET)이 포함되어있다.

 

Model 파라미터

@RequestMapping(method = RequestMethod.GET)
public String members(Model model) {
    List<Member> members = memberRepository.findAll();
    model.addAttribute("members", members); // 모델 파라미터 사용
    ...
}

Model 파라미터를 사용할 수 있다. 모델뷰를 직접 생성하지 않아도 모델에 값을 넣을 수 있다.

 

viewName 직접 반환

@RequestMapping(method = RequestMethod.GET)
public String members(Model model) {
    ...
    return "members";
}

뷰의 논리 이름을 반환할 수 있다.

 

 

 

 

 

 

Comments