프로그래밍 노트/SPRING

[Spring] @ModelAttribute, @RequestAttribute

깡냉쓰 2019. 7. 17. 23:12
728x90
반응형

Controller 파라미터에 붙는 자주사용되는 위 두개의 어노테이션을 정리해보자


@ModelAttribute

@ModelAttribute와 @RequestParam의 다른 점은 RequestParam은 파라미터를 1:1로 받는 반면, ModelAttribute는 도메인 모델이나 DTO 같은 모델을 받는 타입이다.

@RestController
public class SampleController{
    @GetMapping("/sample")
    public String hello(@ModelAttribute Post post){
        return "hello";
    }
}

ModelAttribute는 메서드에 작성할 수도 있고 파라미터에 작성할 수 있다. 두 가지 동작 방식이 조금 다르다.

  1. 메소드의 매개변수로 선언
    • 파라미터가 Command객체에 맵핑되어 넘어오게 된다.
      => 스프링 컨테이너가 생성하는 Command 객체의 이름은 클래스 이름의 첫 글자를 소문자로 변경한 이름이 자동으로 설정된다.따라서 Command 객체의 이름을 변경하고 싶다면 @ModelAttribute("이름")으로 사용한다.
  2. 메소드에 선언
    • View에서 사용할 데이터를 설정하는 용도로 사용
    • @ModelAttribute가 설정된 메소드는 @RequestMapping 어노테이션이 적용된 메소드보다 먼저 호출
    • @ModelAttribute 메소드 실행 결과로 리턴되는 객체는 자동으로 Model에 저장
    • @ModelAttribute 메소드 실행 결과로 리턴된 객체를 View 페이지에서 사용 가능

메소드에 선언되었을 경우 작동 방식

@RequestMapping(value = "getBoardList.do")
public String getBoardList(Model model){
    model.addAttribute("post", new Post());
    return "boardList";
}

@ModelAttribute("commonCodeMap")
public Map<String, String> commonCodeMap(){
    Map<String, String> commonCodeMap = new HashMap<>();
    commonCodeMap.put("code1", "codeValue1");
    commonCodeMap.put("code2", "codeValue2");
    return commonCodeMap;
}
  1. 클라이언트 getBoardList.do 요청
  2. @ModelAttribute가 설정된 commonCodeMap 실행, return된 값 Model객체에 저장
  3. 이 후 getBoardList() 메소드 실행
  4. boardList 뷰가 띄어지면 뷰에서는 post와, commonCodeMap attribute를 사용할 수 있게 된다. (즉, Model 객체에 두 개의 attribute가 저장됨)

만약에 프로젝트에서 사용하는 모든 뷰에 특정 code를 갖고있어야 한다라고 하면 @ModelAttribute가 붙은 메소드에 code를 리턴하는 클래스를 만든 후, 모든 Controller에서 이 클래스를 상속받으면 반복적인 코딩을 하지않고도, view에서 code를 꺼내쓸 수 있게된다.

@RequestAttribute

@RequestAttribute는 request객체의 attribute를 갖고올 수 있는 어노테이션이다.

@GetMapping("/sample")
public String sample(@RequestAttribute String id){
    System.out.println(id);
}

이런식으로 reuqest객체의 attribute를 손쉽게 사용할 수 있다.

728x90
반응형