본문 바로가기

👩‍💻 BackEnd/🌿 스프링 [Spring]

[Spring MVC] spring mvc 실용적인 방식

v2 방법 -> 하나의 컨트롤러에 메서드를 모아서 작성

요청마다 나눴던 컨트롤러의 메서드를 한 클래스에 모아서 사용이 가능하며

동일한 uri 주소는 컨트롤러에 @RequestMapping 어노테이션을 활용하여 클래스 레벨에 작성해주고,

고유한 uri 주소는 메서드 단에 @RequestMapping 어노테이션을 활용하여 작성해주면

컨트롤러가 실행되면서 두 uri 를 조합하여 사용하게 된다. 

@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
     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");
        // ModelAndView 에서 지원해주는 메서드
        mv.addObject("member", member);
        return mv;
    }
}

 


v3 방법 -> ModelAndView 객체를 반환하는 것이 아닌 String 으로 뷰의 이름만 반환함. 

@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {


    private MemberRepository memberRepository = MemberRepository.getInstance();

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

    @RequestMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
        model.addAttribute("members", members);
        return "members";
    }


    @RequestMapping("/save")
    public String save(
            @RequestParam ("username") String username,
            @RequestParam ("age") int age,
            Model model){

        Member member = new Member(username, age);
        memberRepository.save(member);

        // ModelAndView 에서 지원해주는 메서드
        model.addAttribute("member", member);
        return "save-result";
    }

}

 

  • 리턴 타입을 String 으로 변경 
    • String 을 return 하면 알아서 뷰의 이름으로 인식하고 해당 뷰를 찾아 렌더링 한다.
  • @RequestParam 어노테이션을 활용하여 파라미터를 간편하게 받아올 수 있다. 
    • request.getParmeter("username") 과 같은 코드라고 생각하면 됨. 
  • Model 객체를 활용 : addAttribute() 메서드를 활용하여 model 객체에 값을 키-값 쌍으로 넣어준다.

 

하지만 아직 GET, POST 등 HTTP method 를 사용하지 않았다.

 

 

이런 방식으로 http method 를 함께 정해준다. 

 

@RequestMapping 으로 모두 동일하게 해줘도 postman 으로 uri 요청 시 문제 없이 페이지를 불러오는 것을 볼 수 있다. 

(이때 GET, POST 등 어떻게 요청해도 모두 잘 불러와짐 / 두 가지 방식을 모두 지원함.) 

 

하지만! 

Http Method 로 구분을 명확하게 해주는 것이 좋은 설계다! 

           

HTTP method 를 정해주면 

해당 http method 가 아니라면 postman 요청 시 불러오지 못하게 된다! 

 

하지만 조금 너무 긴 것 같다... 

 

짠! 간단한 어노테이션으로 표현가능하다! 호호...