Spring MVC

hoyong.eom·2023년 7월 12일
0

스프링

목록 보기
13/59
post-thumbnail

Spring

Spring MVC

스프링은 애노테이션 기반의 컨트롤러를 만드는데 @RequestMapping 애노테이션을 사용한다.

@RequestMapping 애노테이션이 있으면 RequestMappingHandlerMapping, RequestMappingHandlerAdapter가 사용되어 핸들러(컨트롤러)가 호출된다.

Spring MVC에서의 컨트롤러 코드는 아래와 같다.

@Controller
public class SpringMemberFormControllerV1 {

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

}

ModelAndView는 말그대로 Model(Map객체)와 논리적인 View를 갖고 있는 객체다.
나중에 ModelAndView는 뷰리졸버를 통해서 실제 물리적 뷰 경로를 갖고 있는 View객체가 반환되고, View 객체의 render 함수를 통해서 thymeleaf나 jsp로 제어권을 넘긴다.

  • @Controller : 이 애노테이션이 있으면 스프링이 자동으로 스프링빈으로 등록한다. 내부에 @Component 애노테이션이 있어 컴포넌트 스캔의 대상이 된다. 그리고 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.
    이게 무슨뜻이냐면, @Controller가 있으면 RequestMappingHandlerMapping(핸들러를 조회하는 객체)이가
    스프링빈중에서 @RequestMapping 또는 @Controller가 클래스 레벨에 붙어있는 경우에 맵핑정보로 인식한다.
    그래서 사실 @Controller는 @Component + @RequestMapping(클래스레벨에 있어야함)의 조합으로도 대체가 가능하다. 물론 @RequestMapping만 넣어놓고 스프링빈을 수동등록해도된다.

  • RequestMapping : 요청 정보를 맵핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션기반으로 동작하기 때문에 메서드 이름은 임의로 지어도 된다.

  • ModelAndView : 모델과 뷰정보를 담아서 변환한다.

스프링부트 3.0부터는 @RequestMapping이 클래스레벨에 있어도 스프링이 컨트롤러로 인식하지 않는다고 한다.오직 @Controller만 인식한다!

그리고 Controller에도 HttpServletRequest와 HttpServletResponse를 파라미터로 받아서 사용할 수 있다.

RequestMapping

RequestMapping은 클래스레벨과 메서드 레벨에 함께 사용함으로써 컨트롤러를 통합할 수 있다.


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

@RequestMapping("/new-form")
    public ModelAndView newForm()
    
@RequestMapping("/save")
    public ModelAndView save

위 코드를 보면 클래스 레벨에 붙어있는 값으로 메서드레벨의 중복값을 공통처리할 수 있다.

실용적인 Controller

ModelAndView를 반환하는게 아니라 좀 더 실용적인 방법으로 제공할 수 있도록 스프링에서 제공한다고 한다.

즉, ModelAndView를 반환해도 되고, 문자열로 뷰이름을 반환해도 된다.

또한, HttpServletRequest와 Response도 받을 수 고 있고, @RequestParam 애노테이션을 통해서 HttpRequest로 전달된 파라미터들을 직접 받을 수있다. 그리고
Model 파라미터를 통해서 직접 Model에 대한 데이터를 처리할 수 있다.

@RequestParam("username") 은 request.getParameter("username")와 같은 코드라고 볼 수 있다.
물론 @RequestParam은 Get 쿼리 파라미터와 Post Form 방식을 모두 지원한다.

    @GetMapping("/new-form")
    public String newForm() {
        return "new-form";
    }

    @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은 URL만 매칭하는게 아니라 HttpMethod도 구분할 수 있다.
위 코드들은 구분을 하고 있지 않다. 즉 Get으로 오든 Post로 오든 모두 받을 수 있다.

하지만, Get만 받기 위해서 제약을 걸 수 있다.

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

하지만 이 코드를
@GetMapping("/new-form") 
@PostMapping("/new-form")
으로 변경도 가능

참고

해당 포스팅은 아래의 강의를 학습 한 후 정리한 내용입니다.
김영한님의 스프링MVC

0개의 댓글