Spring/인프런_개념

[Spring]스프링 MVC 1편 - 구조 이해2

빙응이 2024. 1. 12. 17:03

📝@RequestMapping

스프링은 애노테이션을 활용한 매우 유연하고, 실용적인 컨트롤러를 만들었다. 이것이 바로 @RequestMapping이다.

@RequestMapping

  • RequestMappingHandlerMapping - 핸들러 매핑
  • RequestMappingHandlerAdapter  - 핸들러 어댑터 
@Controller
public class SpringMemberFormControllerV1 {

  @RequestMapping("/springmvc/v1/members/new-form")
  public ModelAndView process(){
    return new ModelAndView("new-form");
  }
}
  • @Controller 
    • 스프링이 자동으로 스프링 빈으로 등록한다. 
    • 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다. -> 핸들러 매핑, 어댑터가 핸들러 정보로 취급 
  • @RequestMapping: 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다.

참고!

스프링 MVC의 RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller가 
붙어 있는 경우에 매핑 정보로 인식한다. 

 

실습 코드 
@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 mav = new ModelAndView("save-result");
    mav.addObject("member", member);
    return mav;
  }

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

 

📝스프링 MVC 실용적인 방식

MVC도 v4 방식처럼 실용적인 개선이 가능하다. 

해당 방식은 실무에서 사용 

 

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

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

  @RequestMapping("/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
  public String members(Model model) {
    List<Member> members = memberRepository.findAll();
    model.addAttribute("members",members);
    return "members";
  }
}
  • V4때처럼 이름만 리턴해도 매핑을 해준다. 
  • @RequestParam()은 파라미터 값을 가져오게 해준다.
  • Model은 View에 전달할 request.addAttribute()와 같은 의미로 View에서 사용할 데이터를 저장한다. 
HTTP 메소드 별로 제한하기 
@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";
  }
}
  • 애노테이션으로 차이를 둬서 HTTP별 메소드 응답을 가져올 수 있다.