컨트롤러를 작업하며 사용을 했던 @ModelAttribute, @RequestParam에 대해서 정리를 해볼까 한다.
두 어노테이션은 쿼리 파라미터에 있는 데이터를 파싱해주는 역할을 해준다.
큰 차이점으로는
@RequestParam의 경우, 1개의 인자를 받는다고 생각하면 되고
@ModelAttribute는 여러개의 인자들을 지정된 객체에 바인딩 시켜준다고 생각하면 된다.
crateBoardDto의 필드로는
title, content, writer가 있다고 가정을 하고
@ModelAttribute
@PostMapping("/board")
public ResponseEntity<CreateBoardDto> createBoard(@ModelAttribute CreateBoardDto createBoardDto){
Board board = boardService.createBoard(createBoardDto);
return new ResponseEntity<>(board, HttpStatus.CREATED);
}
대강 이런식의 코드가 있다고 하였을때,
url이 localhost:8080(도메인)/board?title=제목&content=내용&writer=작성자
들어왔을 때, CreateBoardDto에 자동으로 해당 쿼리의 내용들이 매핑된다고 생각하면 된다.
해당 객체로 매핑되는 원리는 다음과 같다.
- 객체에 NoArgsConstructor와 AllArgsConstructor가 둘 다 있는 경우
- NoArgsConstructor을 통해 기본 생성자를 생성하여 요청 파라미터의 이름으로 해당 객체의 프로퍼티를 찾아 Setter를 사용하여 객체에 매핑을 시켜줌.
- 여기서 Setter가 없는경우 매핑이 되지 않음에 주의
- 객체에 AllArgsConstructor만 있는 경우
- 요청 파라미터들의 이름으로 AllArgsConstructor을 불러 객체의 프로퍼티에 매핑하며 생성을 해줌.
@RequestParam
public ResponseEntity<CreateBoardDto> createBoard(@RequestParam("title") String title,
@RequestParam String content,
String writer){
CreateBoardDto board = boardService.createBoard(createBoardDto, membersId);
return new ResponseEntity<>(board, HttpStatus.CREATED);
}
RequestParam은 쿼리 파라미터의 키에 해당하는 값을 메서드 인자에 매핑을 시키는데, 위의 세가지의 경우로 매핑이 가능하다.
title 처럼 쿼리파라미터에 해당하는 키의 name을 RequestParam의 속성으로 직접 이름을 지정해주거나
content처럼 이름이 같은경우 해당 속성을 생략 할 수 있고,
String, int처럼 primitive 타입 (argument resolver로 지정해둔 타입) 인 경우에는 @RequestParam 어노테이션 자체를 생략 가능하다.
덧붙이자면
Spring Framework는 기본적으로 쿼리 파라미터가 있고, 해당 url에 해당하는 메서드에 인자로
argument resolver로 지정해둔 타입이 아닌 타입의 객체가 있다면
@ModelAttribute 어노테이션이 없어도 자동으로 어노테이션을 생성해서 사용해주고 매핑을 처리하고
String , int같은 primitive type이 인자로 있는경우 @RequestParam을 자동으로 생성해서 사용한다.
'💻Spring' 카테고리의 다른 글
Jenkins 파이프라인을 이용한 SpringBoot 자동배포 (환경설정) (1) | 2023.05.19 |
---|---|
Github에 프로젝트 민감정보 숨기기 (application.yml) (0) | 2023.04.26 |
Spring Security Jwt - 예외처리 커스터마이징 (0) | 2023.04.03 |
IntelliJ SpringBoot MySql 설정 오류 (0) | 2023.03.17 |
프로젝트 - 전자정부프레임워크 이미지 업로드 (0) | 2022.11.01 |