질문 : @PathVariable이랑@RequestBody도 설명해줘 얘네 두개는 rest api 설계할 때 꼭 필요한 애들이지?
답변 : 네, 맞습니다. REST API를 설계할 때 @PathVariable과 @RequestBody는 반드시 알아야 하는 핵심 애너테이션입니다.
각각의 역할과 사용법을 명확히 설명해 드리겠습니다.
📌 1. @PathVariable
✅ 개념
- URL 경로에서 동적인 값을 추출하여 메서드의 파라미터로 전달하는 데 사용됩니다.
- 주로 리소스 식별자(ID)를 전달할 때 많이 사용됩니다.
✅ 사용법
예를 들어, 다음과 같은 URL이 있다고 가정해 봅시다.
GET /api/users/123
이 URL에서 123이라는 값은 사용자 ID를 나타내는 동적인 값입니다.
이 값을 컨트롤러에서 받아 처리하려면 @PathVariable을 사용합니다.
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<?> getUser(@PathVariable Long id) {
// URL의 {id} 부분이 메서드의 id 파라미터로 전달됨
System.out.println("요청된 사용자 ID: " + id);
return ResponseEntity.ok().build();
}
}
위 코드에서 {id}는 URL 경로에 있는 값을 의미하며,
@PathVariable Long id를 통해 URL에서 추출한 값을 Java 메서드의 인자로 전달받습니다.
✅ 여러 개의 PathVariable 사용하기
URL에 여러 개의 동적 값을 넣을 수도 있습니다:
// 예시 URL: GET /api/users/123/posts/456
@GetMapping("/users/{userId}/posts/{postId}")
public ResponseEntity<?> getPost(
@PathVariable Long userId,
@PathVariable Long postId) {
System.out.println("User ID: " + userId);
System.out.println("Post ID: " + postId);
return ResponseEntity.ok().build();
}
📌 2. @RequestBody
✅ 개념
- HTTP 요청 본문(body)에 담긴 데이터(JSON)를 Java 객체로 변환(역직렬화)하여 메서드 파라미터로 전달할 때 사용합니다.
- 주로 POST, PUT, PATCH 요청에서 JSON 데이터를 받을 때 사용됩니다.
✅ 사용법
클라이언트가 다음과 같은 JSON 데이터를 보낸다고 가정해 봅시다:
{
"name": "John Doe",
"email": "john.doe@example.com"
}
이 데이터(JSON)를 Java 객체로 받아 처리하려면 @RequestBody를 사용합니다:
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping
public ResponseEntity<?> createUser(@RequestBody User user) {
// JSON 데이터가 자동으로 User 객체로 변환됨
System.out.println("사용자 이름: " + user.getName());
System.out.println("사용자 이메일: " + user.getEmail());
return ResponseEntity.status(HttpStatus.CREATED).body(user);
}
}
위 코드에서 클라이언트가 보낸 JSON 데이터는 자동으로 Java 객체(User)로 변환됩니다.
✅ JSON ↔ Java 객체 변환 과정
- 클라이언트가 JSON 데이터를 HTTP 요청 본문에 담아 서버에 보냅니다.
- Spring MVC는 등록된 메시지 컨버터(MappingJackson2HttpMessageConverter)를 사용하여 JSON 데이터를 Java 객체로 역직렬화합니다.
- 역직렬화된 Java 객체는 메서드의 파라미터로 전달됩니다.
📌 🎯 정리 및 요약
| 애너테이션 | 역할 | 언제 쓰나요? | 예시 |
| @PathVariable | URL 경로에서 동적 값 추출 | GET, PUT, DELETE 등 리소스 식별자 전달 시 | /users/{id} |
| @RequestBody | 요청 본문의 JSON 데이터를 Java 객체로 변환 | POST, PUT 등 데이터 생성 및 수정 시 | { "name": "...", "email": "..." } |
📌 실제 REST API 설계 시 자주 사용되는 예시
다음은 두 가지 애너테이션을 함께 사용하는 실제 REST API 예시입니다:
@RestController
@RequestMapping("/api/users")
public class UserController {
// 사용자 생성 (POST)
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// 사용자 생성 로직...
return ResponseEntity.status(HttpStatus.CREATED).body(user);
}
// 특정 사용자 조회 (GET)
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
// 사용자 조회 로직...
User user = new User(id, "John Doe", "john.doe@example.com");
return ResponseEntity.ok(user);
}
// 특정 사용자 수정 (PUT)
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
// 사용자 수정 로직...
updatedUser.setId(id);
return ResponseEntity.ok(updatedUser);
}
// 특정 사용자 삭제 (DELETE)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
// 사용자 삭제 로직...
return ResponseEntity.noContent().build();
}
}
📌 🎯 결론
- @PathVariable: URL 경로에서 동적인 값(주로 리소스 ID)을 추출하여 메서드 파라미터에 전달합니다.
- @RequestBody: 클라이언트가 보낸 요청 본문의 JSON 데이터를 Java 객체로 변환하여 메서드 파라미터에 전달합니다.
이 두 가지 애너테이션은 REST API 설계와 구현에서 매우 자주 사용되며, 반드시 알아야 하는 핵심 기능입니다! 😊
@RequestParam은 Spring Framework에서 HTTP 요청 파라미터를 컨트롤러 메서드의 파라미터로 바인딩하기 위해 사용되는 어노테이션입니다. 이를 통해 클라이언트가 보낸 요청 데이터를 간편하게 처리할 수 있습니다.
기본 사용법
@RequestParam은 HTTP 요청의 쿼리 스트링 또는 폼 데이터를 받아 메서드 파라미터에 매핑합니다.
@GetMapping("/test")
public String getTest(@RequestParam("name") String name) {
return name;
}
- 위 코드에서 ?name=John과 같은 요청이 들어오면, name 변수에 "John"이 바인딩됩니다.
옵션
- 필수 여부 설정
- 기본적으로 @RequestParam은 필수값입니다. 값이 없으면 예외가 발생합니다.
- 필수값을 해제하려면 required = false를 설정합니다.
@GetMapping("/test")
public String getTest(@RequestParam(required = false) String name) {
return name; // 값이 없으면 null 반환
}
- 기본값 설정
- 값이 없을 때 사용할 기본값을 지정할 수 있습니다.
@GetMapping("/test")
public String getTest(@RequestParam(defaultValue = "default") String name) {
return name; // 값이 없으면 "default" 반환
}
- 파라미터 이름 생략
- HTTP 요청 파라미터 이름과 변수 이름이 같으면 @RequestParam의 value 속성을 생략할 수 있습니다.
@GetMapping("/test")
public String getTest(@RequestParam String name) {
return name;
}
- 생략 가능
- 단순 타입(String, int 등)의 경우, @RequestParam 자체를 생략할 수도 있습니다.
@GetMapping("/test")
public String getTest(String name) {
return name;
}
추가 기능
- Map으로 파라미터 받기
- 여러 개의 파라미터를 동적으로 처리하려면 Map<String, Object>를 사용할 수 있습니다.
@GetMapping("/test")
public String getTest(@RequestParam Map<String, Object> params) {
return params.toString(); // 모든 파라미터를 key-value 형태로 반환
}
- 배열 및 리스트 처리
- 동일한 이름의 파라미터가 여러 개일 경우 배열이나 리스트로 받을 수 있습니다.
@GetMapping("/test")
public String getTest(@RequestParam List<String> names) {
return names.toString();
}
요약
- @RequestParam은 HTTP 요청 데이터를 컨트롤러 메서드에 쉽게 매핑하기 위한 도구입니다.
- 필수 여부, 기본값 설정, 생략 가능 등의 옵션을 통해 유연하게 사용할 수 있습니다.
- 단순 타입은 어노테이션 없이도 자동으로 매핑됩니다.
'Spring > 10. rest-api' 카테고리의 다른 글
| ResponseEntity 작성 규칙 + build()가 붙는 경우 (0) | 2025.03.17 |
|---|---|
| ResponseEntity의 메서드들 (0) | 2025.03.16 |
| REST API 예제 (0) | 2025.03.14 |
| HttpMessageConverter (0) | 2025.03.14 |
| REST API (0) | 2025.03.14 |