스프링 MVC - @RequestMapping

YH·2023년 4월 22일
0

✅ @RequestMapping

  • 이전 포스트에서 진행했던 HandlerMapping, HandlerAdapter 에서 이제는 @RequestMapping 을 사용해서 코드를 작성해본다.
  • 컨트롤러에 @RequestMapping 어노테이션을 사용하면 HandlerMapping은 RequestMappingHandlerMapping 을, HandlerAdapter는 RequestMappingHandlerAdapter 을 사용한다.
  • 실무에서는 거의 대부분 이 @RequestMapping을 사용한다.
  • RequestMappingHandlerMapping HandlerMapping 및 RequestMappingHandlerAdapter HandlerAdapter가 가장 우선순위가 높다.

🔽 회원 저장 폼

@Controller
public class SpringMemberFormControllerV1 {

    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
        return new ModelAndView("new-form");
    }
}
  • @Controller 어노테이션은 컴포넌트 스캔의 대상이므로 스프링이 해당 컨트롤러를 스프링 빈으로 등록한다.
  • @RequestMapping : 요청 정보를 매핑한다. 해당 URL 호출되면 이 메소드가 호출된다. 어노테이션 기반이기 때문에 메소드 이름은 임의로 지어주면 된다.
  • ModelAndView : 모델과 뷰 정보를 담아서 반환한다.

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

@Component //컴포넌트 스캔을 통해 스프링 빈으로 등록
@RequestMapping
public class SpringMemberFormControllerV1 {

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

주의

  • 스프링 부트 3.0(스프링 6.0) 이후 부터는 RequestMappingHandlerMapping클래스에 반드시 @Controller가 있어야 스프링 컨트롤러가 인식한다.
  • @Controller가 없이 @RequestMapping만 있으면 스프링 컨트롤러로 인식하지 않는다.

🔽 회원 저장

@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);
        System.out.println("member = " + member);
        memberRepository.save(member);

        ModelAndView mv = new ModelAndView("save-result");
        //스프링이 제공하는 ModelAndView를 통해 Model에 추가할 대는 addObject()를 사용하면 된다.
        mv.addObject("member", member);

        return mv;
    }
}

🔽 회원 목록 조회

@Controller
public class SpringMemberListControllerV1 {
    private MemberRepository memberRepository = MemberRepository.getInstance();
    
    @RequestMapping("/springmvc/v1/members")
    public ModelAndView process() {
        List<Member> members = memberRepository.findAll();

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

        return mv;
    }
}

✅ 컨트롤러 통합

  • 위의 회원 저장 폼, 회원 저장, 회원 목록 조회 핸들러를 하나의 컨트롤러로 통합할 수 있다.
@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 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;
    }
}
  • 위와 같이 클래스 레벨의 @RequestMapping 과 메소드 레벨의 @RequestMapping을 조합하여 하나의 컨트롤러로 통합하여 사용할 수도 있다.

✅ 실용적인 방식

  • 여기서는 실제 실무에서 사용하는 방식처럼 코드를 작성해본다.
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

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

    @GetMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();

        model.addAttribute("members", members);
        return "members";
    }
}
  • 스프링 MVC에서 Model 객체의 model.addAttribute()를 사용하여 model을 뷰로 넘겨줄 수 있다.
  • ModelAndView를 반환하지 않고 뷰의 논리 이름(String)으로 반환할 수 있다.
profile
하루하루 꾸준히 포기하지 말고

0개의 댓글