참고:
https://kingchan223.tistory.com/128
https://ttl-blog.tistory.com/257
스프링부트 프로젝트 당시에는 프론트 단과 JSON 데이터를 주고받으면서 Controller에서 @RequestBody와 @PathVariable만 주로 사용했었다. 최근에는 @ModelAttribute 등 다양한 어노테이션을 사용해보게 되었고, 이러한 어노테이션들을 잘 아는 상태에서 활용하고자 정리해보기로 했다.
일단은 클라이언트 → 서버 방향의 데이터 전달 방식부터!
(@RequestParam, @ModelAttribute, @PathVariable, @RequestPart, @RequestBody)
1. GET 요청 파라미터 / HTML form 데이터
@RequestParam
URI 전송 시 쿼리 스트링을 추출해오는 방식
ex) http://www.x.com?id="id"&nickname="nickname"
public ResponseEntity<T> findFriends(Principal principal, @RequestParam(value = "id", required = false, defaultValue = "") String id, @RequestParam(value = "nickname", required = false, defaultValue = "") String nickname) {
Controller 파라미터에 어노테이션을 작성하지 않아도 String, int, Integer 등 기본값 타입에는 기본적으로 @RequestParam 이 적용된다. (권장 X)
어노테이션 작성 시 required, defaultValue 등 옵션들을 이용해 필수 여부, 기본값 등을 상세히 설정할 수 있다.
타입을 Map으로 해서 여러 요청 값들을 한번에 받을 수도 있다.
public ResponseEntity<T> getParams (@RequestParam Map<String, Object> params) {
log.info("username : ", parms.get("username"));
log.info("nickname : ", parms.get("nickname"));
...
@PathVariable
클라이언트가 약속된 데이터(숫자 또는 문자열)를 URI 뒤에 붙여 서버에 전달하는 방식
REST API 방식에서 주로 사용된다.
ex) http://www.x.com/1
서버는 해당 데이터를 받아 관련 로직을 수행한다.
@GetMapping("/challenge/{challengeId}")
public ResponseEntity<T> updateDajim(@PathVariable("challengeId") Long roomNumber, @RequestBody DajimUpdateRequestDto dajimUpdateRequestDto, Principal principal) {
위 코드에서는 challengeId라는 파라미터를 전달받아 서버에서는 roomNumber라는 새로운 변수명으로 받는 것을 볼 수 있다. (같은 변수명을 사용한다면 굳이 옵션을 작성할 필요는 없다.)
@PathVariable은 하나의 데이터를 전송할 때에는 직관적이지만, 2개 이상의 파라미터를 전송할 때에는 ".../1/username" 식의 파라미터가 만들어져 직관성이 떨어지므로 이 경우에는 @RequestParam이 더 적합할 수 있다.
@ModelAttribute
public void login(@ModelAttribute LoginDto logindto) {
데이터의 key 명과 @ModelAttribute 파라미터 타입명을 일치시키면 각 값들이 바인딩되어 하나의 자바 객체를 생성해준다.
이 때 세터나 생성자 메소드가 있어야 값이 제대로 바인딩된다. 하단 두 가지 방법을 이용하면 된다.
1. 기본생성자+setter
2. 커스텀 생성자
어노테이션 생략 시에도 기본값 타입 외의 타입은 @ModelAttribute 방식으로 저절로 객체 매핑된다.
3. 요청 메시지 바디
@RequestBody
메시지 바디에 있는 JSON 데이터를 받아 자바 객체로 매핑할 때 사용하는 어노테이션이다.
public ResponseEntity<?> updateDajim(@PathVariable("challengeId") Long roomNumber, @RequestBody DajimUpdateRequestDto dajimUpdateRequestDto, Principal principal) {
이때 어노테이션을 통해 매핑되는 객체 타입인 커스텀DTO에는 따로 Setter를 작성하지 않아도 된다. 대신 기본 생성자는 필수다. (@JsonProperty, @JsonAutoDetect, @JsonCreator 와 같은 위임 어노테이션을 사용하면 기본 생성자도 사용하지 않아도 된다. 동작 원리 참고: https://bbbicb.tistory.com/46)
'Programming > 스프링' 카테고리의 다른 글
[김영한 스프링 MVC 1] MVC 프레임워크 만들기 (0) | 2023.09.24 |
---|---|
[김영한 스프링 MVC 1] 서블릿, JSP, MVC 패턴 (0) | 2023.09.17 |
[김영한 스프링 MVC 1] 서블릿 (0) | 2023.08.13 |
[김영한 스프링 MVC 1] 웹 애플리케이션 이해 (0) | 2023.08.06 |
김영한 ORM 표준 JPA 프로그래밍 (기본) - 엔티티 매핑 (0) | 2022.10.27 |