ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 @Controller 컨트롤러 리턴타입의 종류
    Spring 2018. 2. 18. 14:33
    반응형

     

    1. 자동 추가 모델 오브젝트와 자동생성 뷰 이름

    다음 4가지는 리턴 타입에 상관없이 조건만 맞으면 모델에 자동으로 추가 된다.

     

    1-1. @ModelAttribute 모델 오브젝트 또는 커맨드 오브젝트

     

    1
    2
    3
    4
    5
    public void add( @ModelAttribute("member") Member member)
    public void add( @ModelAttribute Member member)
    public void add( Member member)
     
     
    s

     

    위의 세 경우는 모두 'member'라는 이름으로 member 파라미터 오브젝트는 컨트롤러가 리턴하는 모델에 추가 해준다.

     

    1-2. Map, Model, ModelMap 파라미터

    컨트롤러 메소드에 Map, Model, ModelMap 타입의 파라미터를 사용하면 미리 생성된 모델 맵 오브젝트를 전달받아서 오브젝트를 추가 할 수 있다.

     

    1-3. @ModelAttribute 메소드

     

    검색조건 페이지(select 태그) 등의 참조정보가 필요한 경우 사용, 또는 카페의 카테고리 목록 등.

    뷰에서 참고정보로 사용되는 모델 오브젝트를 생성하는 메소드를 지정하기 위해 사용된다.

    모델 오브젝트 생성을 전담하는 메소드를 만들 수 있다.

    개별 컨트롤러에서 직접 모델에 추가 해 줄 수도 있지만, 같은 클래스 내의 모든 컨트롤러 메소드에서 공통적으로 활용하는 정보라면 

    @ModelAttribute 메소드를 사용하는 것이 편리 하다.

    1
    2
    3
    4
    5
    @ModelAttribute("code")
    public List<Code> code(){
        return codeService.getAllCode();
    }
     
    cs

     

    > 서비스 계층 오브젝트를 이용해 코드정보의 리스트를 받아서 리턴한다.

    > 리턴되는 오브젝트는 @ModelAttribute에 지정한 "code"라는 이름으로 다른 컨트롤러가 실행될 때 모델에 자동 추가된다.

     

    1-4. BindingResult

     

    jsp나 프리마커, 벨로시티 등의 뷰에 사용되는 커스텀 태그나 매크로에서 사용된다.

     

     

    2. ModelAndView

     

    1
    2
    3
    4
    5
    @RequestMapping("/hello")
    public ModelAndView hello(@RequestParam String name, Model model){
        model.addAttribute("name",name);
        return new ModelAndView("hello")
    }
    cs

     

    3. String

    메소드의 리턴 타입이 스트링이면 이 리턴 값은 뷰 이름으로 사용된다.

     

    1
    2
    3
    4
    5
    @RequestMapping("/hello")
    public String hello(@RequestParam String name, Model model){
        model.addAttribute("name",name);
        return "hello";
    }
    cs

     

     

    4. void 

     

    ReuqestToViewNameResolver 전략을 통해 자동생성되는 뷰 이름이 사용된다.

    URL과 뷰 이름을 일관되게 통일 할 수 있다면 void형의 사용을 적극 고려해 볼 수 있다.

    1
    2
    3
    4
    @RequestMapping("/hello")
    public void hello(@RequestParam String name, Model model){
        model.addAttribute("name",name);
    }
     
    cs

     

     

    5. 모델 오브젝트

     

    뷰 이름은 RequestToViewNameResolver로 자동생성되는 것을 사용하고 코드를 이용해 모델에 추가할 오브젝트가 하나뿐이라면,

    Model 파라미터를 받아서 저장하는 대신 모델 오브젝트를 바로 리턴해도 된다.

     

     

    1
    2
    3
    4
    @RequestMapping("/view")
    public Member view(@RequestParam int id){
        return memberService.getMember(id);
    }
     


    cs

     

     

    6. Map, Model, ModelMap

     

    주의가 필요, 근본적으로 피하는게 좋다.

    1
    2
    3
    4
    5
    @RequestMapping("/view")
    public Map view(@RequestParam int id){
        Map memberMap = memberSerivce.getMemberMap(id);
        return memberMap;
    }
     
    cs

    > 다음과 같이 사용하자.

    1
    2
    3
    4
    @RequestMapping("/view")
    public Map view(@RequestParam int id, Model model){
        model.addAttribute("memberMap", memberService.getMemberMap(id));
    }
    cs

     

    7. View

     

    8. @ResponseBody

     

    @ResponseBody가 메소드 레벨에 부여되면 메소드가 리턴하는 오브젝트는 뷰를 통해 결과를 만들어내는 모델로 사용되는 대신, 

    메세지 컨버터를 통해 바로 HTTP 응답의 메세지 본문으로 전환된다.

    리턴 값이 단일 모델 오브젝트이고 메세지 컨버터가 뷰와 같은 식으로 동작한다고 이해할 수 있다.

     

    1
    2
    3
    4
    5
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "<html><body>Hello Spring</body></html>";
    }
    cs

     

    내용의 출처 http://willrain.tistory.com/9

    반응형

    댓글

Designed by Tistory.