반응형
Controller 파라미터에 붙는 자주사용되는 위 두개의 어노테이션을 정리해보자
@ModelAttribute
@ModelAttribute와 @RequestParam의 다른 점은 RequestParam은 파라미터를 1:1로 받는 반면, ModelAttribute는 도메인 모델이나 DTO 같은 모델을 받는 타입이다.
@RestController
public class SampleController{
@GetMapping("/sample")
public String hello(@ModelAttribute Post post){
return "hello";
}
}
ModelAttribute는 메서드에 작성할 수도 있고 파라미터에 작성할 수 있다. 두 가지 동작 방식이 조금 다르다.
- 메소드의 매개변수로 선언
- 파라미터가 Command객체에 맵핑되어 넘어오게 된다.
=> 스프링 컨테이너가 생성하는 Command 객체의 이름은 클래스 이름의 첫 글자를 소문자로 변경한 이름이 자동으로 설정된다.따라서 Command 객체의 이름을 변경하고 싶다면 @ModelAttribute("이름")으로 사용한다.
- 파라미터가 Command객체에 맵핑되어 넘어오게 된다.
- 메소드에 선언
- 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;
}
- 클라이언트 getBoardList.do 요청
- @ModelAttribute가 설정된 commonCodeMap 실행, return된 값 Model객체에 저장
- 이 후 getBoardList() 메소드 실행
- 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를 손쉽게 사용할 수 있다.
반응형
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 모델 바인딩과 검증_2(Converter) (0) | 2019.12.26 |
---|---|
[Spring] 모델 바인딩과 검증_1 (0) | 2019.12.23 |
[Spring] junit을 활용한 스프링 테스트 (0) | 2018.09.21 |
[Spring] 팩토리빈과 팩토리메소드 (0) | 2018.09.09 |
[Spring] 빈(bean)생명주기 메소드 (0) | 2018.09.09 |