본문 바로가기
Spring/10. rest-api

@PathVariable / @RequesteBody / @RequestParam

by 989898 2025. 3. 16.
질문 : @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