🌱 Spring/MVC ①

[Spring] MVC _ @RequestMapping (1)

Younngjun 2023. 7. 22. 13:38

@RequestMapping을 사용하면 RequestMappingHandlerMapping, RequestMappingHandlerAdapter를 사용한다는 의미이다.

 

# @Controller

- 스프링이 자동으로 스프링 빈으로 등록한다. @Controller은 @Component를 상속 받기 때문에 마찬가지로 컴포넌트 스캔의 대상이 된다.

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

 

# @RequestMapping

- 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 

- 어노테이션을 기반으로 동작하므로, 메서드 이름(process)는 임의로 지어도 된다.

 

# ModelAndView

-  모델과 뷰 정보를 담아서 반환하면 된다.

 

RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식한다. (중요)

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

 

다음 코드도 동일하게 동작한다.

@Component //컴포넌트 스캔을 통해 스프링 빈으로 등록 @RequestMapping
public class SpringMemberFormControllerV1 {
      @RequestMapping("/springmvc/v1/members/new-form")
      public ModelAndView process() {
          return new ModelAndView("new-form");
      }
}

 

컴포넌트 스캔 없이 스프링 빈으로 직접 등록해도 동작한다.

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

 

ModelAndView를 반환할 때는 "save-result"라는 반환하고자 하는 View와 member라는 Model을 addObject로 담아야 한다. 

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

 

@RequestMapping → 하나의 Class에 모으기 + 중복 URL 처리

 

@Controller 어노테이션을 붙인 하나의 객체에 여러 @RequestMapping들을 선언할 수 있다. 또한, 중복되는 URL의 경우 최상단 객체에 @RequestMapping을 함으로써 가독성을 높일 수 있다. 최상단 @RequestMapping 어노테이션의 URL에 더해지는 것이기 때문에 members 처럼 그대로 "springmvc/v2/members"의 경우 따로 URL을 추가하지 않아도 된다.

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

    private MemberRepository memberRepository = MemberRepository.getInstance();

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

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

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

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


}