
/api/users/{id} → /api/users/aaron@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") String id) {
return userService.findUserById(id);
}에러 해결:
@PathVariable Integer id → @PathVariable("id") Integer id/api/users?id=3@GetMapping("/users")
public User getUser(@RequestParam("id") Integer id) {
return userService.findUserById(id);
}옵션:
@RequestParam(required = false) → 필수 여부 설정@RequestParam(defaultValue = "원하는 값을 String으로 명시") → 기본값 설정다수의 HTTP 요청 파라미터나 multipart/form-data 형태의 파라미터를 받아 객체로 받고 싶을 때 사용.
즉, @ModelAttribute는 URL의 쿼리 파라미터를 객체 필드에 값을 매핑해줌
실습 코드
@PostMapping("/users")
public User createUser(@ModelAttribute UserCreateRequestDto dto) {
return userService.createUser(dto);
}POST 요청 http://localhost:8080/users?name=Daron&age=40&job=POGET 요청 값이 들어갔는지 확인 http://localhost:8080/users/data?id=4사용자의 요청 데이터를 객체로 자동 바인딩하는 역할
즉, Controller에서 DTO(객체)로 변환하는 과정을 도와주는 기능!
Spring은 @ModelAttribute를 사용해서 객체를 만들 때, 객체를 생성한 후(기본 생성자로 객체 생성), setter를 이용해 값을 채워 넣음.
이 때문에 @ModelAttribute를 사용할 때는 기본 생성자(@NoArgsConstructor + @Setter)가 반드시 필요
- 만약
@Setter가 없으면?
@ModelAttribute가 setter를 호출할 수 없어서, 필드에 값이 들어가지 않고null이 저장될 가능성이 큼.
- DTO 클래스에 직접만든 생성자만 있고 기본생성자(
public UserCreateRequestDto()혹은@NoArgsConstructor)가 없으면?
- Spring이 기본 생성자가 없어서 객체를 만들 수 없어 에러가 발생할 수도 있음.
JSON 데이터를 받아서 객체로 변환할 때 사용.
POST 요청에서 사용됨.
예: { "name": "Daron", "age": 40, "job": "PO" }
실습 코드
@PostMapping("/users")
public User createUser(@RequestBody UserCreateRequestDto dto) {
return userService.createUser(dto);
}POST 요청{
"name": "Daron",
"age": 40,
"job": "PO"
}GET 요청 값이 들어갔는지 확인 http://localhost:8080/users/data?id=4주의:
@RequestBody 는 GET 요청에서는 사용할 수 없음.Query Parameter (@ModelAttribute) → URL에 ?key=value형식으로 보냄
@ModelAttribute → 폼 데이터 (application/x-www-form-urlencoded)JSON Body (@RequestBody) → HTTP 요청의 Body에 JSON 형식으로 보냄
@RequestBody → JSON 데이터 (application/json)@RequestBody는 POST 같은 요청에서만 사용할 수 있음.GET 요청에서는 JSON Body를 전달할 수 없음.POST, PUT, PATCH에서만 사용 가능.@ModelAttribute)를 사용해야 함.POST 요청을 테스트할 때는 브라우저에서 직접 실행할 수 없음.GET 요청만 지원하므로, JSON 데이터를 보낼 수 없음.GET 요청을 보낼 땐
@ModelAttribute를 사용하고,
POST 요청을 보낼 땐@RequestBody를 사용해야 한다!
URL의 Query Parameter로 데이터를 보낼 수 있음.
예제:
curl -X POST "http://localhost:8080/users" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "name=Daron&age=40&job=PO"
@ModelAttribute를 사용하면 Spring이 자동으로 객체(UserCreateRequestDto)에 값 매핑
하지만 단점:
GET 요청에서도 사용 가능.URL이 아니라, HTTP 요청 Body에 JSON 형식으로 데이터를 보냄
예제:
curl -X POST "http://localhost:8080/users" \
-H "Content-Type: application/json" \
-d '{"name": "Daron", "age": 40, "job": "PO", "specialty": "App"}'
@RequestBody를 사용하면 Spring이 JSON을 객체 UserCreateRequestDto)로 변환해줌
장점:
POST, PUT, PATCH 요청에서만 사용 가능(GET은 지원 안됨)@PathVariable / @RequestParam / @RequestBody 에 대한 값 유효성 검증@Valid → 자바 JSR(Java Specification Request) 표준 스펙 상 검증 어노테이션@Validated → Spring 프레임워크 자체 제공 검증 어노테이션@PostMapping("/users")
public User createUser(@Valid @RequestBody UserCreateRequestDto dto) {
return userService.createUser(dto);
}
필수 설정:
implementation 'org.springframework.boot:spring-boot-starter-validation'
build.gradle 에 검증 라이브러리 추가해야 함.JsonInclude 를 통해 반환하려는 객체가 null 값이 JSON 응답에서 포함될지 여부를 설정.@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserResponseDto {
private String name;
private String job;
private String specialty;
}
결과:
null 값이면 응답에서 제외됨.| 어노테이션 | 사용 목적 | 예제 |
|---|---|---|
@PathVariable | URL 경로 변수 | /users/{id} → /users/2 |
@RequestParam | 쿼리스트링 값 받기 | ?id=3 |
@ModelAttribute | 여러 파라미터를 객체로 변환 | ?name=Daron&age=40 |
@RequestBody | JSON 요청 데이터 받기 | { "name": "Daron" } |
@Valid / @Validated | 유효성 검증 | @NotNull, @Min(10) 등 |
@JsonInclude | JSON 응답에서 null 제외 | Include.NON_NULL |