티스토리 뷰

Spring Boot는 RESTful API와 웹 애플리케이션 개발을 쉽게 만들어주는 강력한 프레임워크입니다. 클라이언트로부터 데이터를 받을 때 자주 사용되는 어노테이션인 @RequestBody, @RequestParam, @ModelAttribute는 각각의 역할과 사용 시나리오가 다릅니다. 이 포스팅에서는 이 세 가지 어노테이션의 차이점을 명확히 짚어보고, HTTP 요청의 속성과 연관 지어 어떻게 동작하는지 알아보겠습니다. 또한, 각 어노테이션에 대한 간단한 예제 코드를 통해 실무에서 어떻게 활용할 수 있는지 살펴보겠습니다.

1. @RequestBody(@ResponseBody)

 

설명

  • @RequestBody: HTTP 요청의 본문(body)에 포함된 데이터를 Java 객체로 변환합니다. 주로 JSON이나 XML 형식의 데이터를 처리하며, POST나 PUT 같은 HTTP 메서드와 잘 어울립니다. HTTP 요청 본문은 클라이언트가 서버로 데이터를 보낼 때 사용되며, Content-Type 헤더(예: application/json)에 따라 데이터 형식이 결정됩니다.
  • @ResponseBody: 컨트롤러 메서드의 반환 값을 HTTP 응답 본문으로 직접 전송합니다. View를 렌더링하지 않고, JSON이나 XML 같은 형식으로 클라이언트에 데이터를 반환할 때 사용됩니다. 이는 RESTful API에서 주로 활용되며, Accept 헤더를 통해 클라이언트가 원하는 응답 형식을 지정할 수 있습니다.

 

예제

 - 컨트롤러

@RestController // @Controller + @ResponseBody를 포함

public class UserController {

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // 요청 본문에서 받은 데이터를 처리
        return user; // @ResponseBody로 인해 JSON으로 반환
    }
    
}

class User {
    private String id;
    private String gender;
    private String bitrh;
    
    // Getter, Setter 생략
}

 - HTTP 요청

POST /users HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{"id": "zerobin", "gender": "m", "birth": "1220"}

- HTTP 응답

HTTP/1.1 200 OK
Content-Type: application/json

{"id": "zerobin", "gender": "m", "birth": "1220"}
  • @RequestBody: 클라이언트가 보낸 JSON 데이터를 User 객체로 변환합니다.
  • @ResponseBody: 메서드에서 반환된 User 객체를 다시 JSON으로 직렬화하여 응답 본문에 담아 보냅니다.
    @RestController@Controller@ResponseBody를 결합한 어노테이션으로, 모든 메서드에 @ResponseBody가 기본 적용됩니다.

2. @RequestParam(@PathVariable)

설명

  • @RequestParam: URL의 쿼리 파라미터나 폼 데이터에서 개별 값을 추출합니다. 주로 GET 요청에서 쿼리 문자열을 처리하거나, POST 요청에서 application/x-www-form-urlencoded 형식의 데이터를 받을 때 사용됩니다. HTTP에서 쿼리 파라미터는 URL에 ? 뒤에 key-value 쌍으로 추가되며, 간단한 데이터 전송에 적합합니다.
  • @PathVariable: URL 경로에 포함된 변수를 추출합니다. RESTful API에서 자원의 식별자를 가져올 때 주로 사용되며, GET, DELETE, PUT 등 다양한 HTTP 메서드와 잘 어울립니다. HTTP에서 경로 변수는 URL 구조를 통해 데이터를 전달하는 방식으로, 깔끔하고 직관적인 API 설계를 돕습니다.

 

예제

 - 컨트롤러

@RestController
public class UserController {

    @GetMapping("/users/{username}/detail")
    public String getUserDetail(
            @PathVariable String username,
            @RequestParam String gender,
            @RequestParam int birth) {
        return "User Detail - Username: " + username + 
               ", Gender: " + gender + 
               ", Birth: " + birth;
    }
    
}

 - HTTP 요청

GET /users/zerobin/detail?gender=m&birth=1220 HTTP/1.1
Host: localhost:8080

- HTTP 응답

"User Detail - Username: zerobin, Gender: m, Birth: 1220"
  • @PathVariable은 URL 경로에 포함된 변수를 추출합니다. 주어진 URL에서 /users/zerobin/detail 부분을 보면, zerobin이 경로 변수로 사용될 수 있습니다. 이는 RESTful API에서 자원을 식별하는 데 유용하며, 주로 고유 식별자나 특정 엔드포인트를 나타낼 때 사용됩니다.
  • @RequestParam은 URL의 쿼리 파라미터에서 값을 추출합니다. 주어진 URL에서 ?gender=m&birth=1220 부분은 쿼리 파라미터로, genderbirth라는 키에 각각 m1220 값이 포함되어 있습니다. 이는 검색 조건이나 추가 정보를 전달할 때 적합합니다.

3. @ModelAttribute

설명

  • @ModelAttribute는 주로 HTML 폼 데이터를 객체로 바인딩할 때 사용됩니다. GET/POST 요청에서 복잡한 데이터를 한 번에 객체로 매핑하며, Spring MVC에서 View와 Controller 간 데이터를 전달하는 데 유용합니다. HTTP에서는 주로 application/x-www-form-urlencoded 형식의 폼 데이터를 처리하며, 객체의 필드 이름과 폼의 입력 이름이 일치해야 합니다.

 

예제

 - 컨트롤러

@Controller
public class UserController {
    @PostMapping("/users")
    public String createUser(@ModelAttribute User user) {
        return "User created: " + user.getId();
    }
}

class User {
    private String id;
    private String gender;
    private String bitrh;
    
    // Getter, Setter 생략
}

 - HTTP 요청

POST /users HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

id=zerobin&gender=m&birth=1220

 - HTTP 응답

User created: zerobin
  • 복잡한 데이터를 객체로 맵핑할 수 있습니다.

정리

어노테이션 역할 데이터 위치 HTTP 메서드 데이터 형식 사용 예시
@RequestBody
요청 본문(body)을 객체로 매핑
요청 본문
POST, PUT
JSON, XML
(application/json)
REST API 데이터 수신
@ResponseBody
반환 값을 응답 본문으로 전송
응답 본문
모든 메서드
JSON, XML
(application/json)
REST API 데이터 반환
@RequestParam
쿼리 파라미터나 폼 데이터 추출
쿼리 파라미터/폼
GET, POST
쿼리 문자열, URL-encoded
검색 조건, 간단한 입력
@PathVariable
URL 경로 변수 추출
URL 경로
GET, DELETE,
PUT
경로에 포함된 값
자원 식별 (ID 등)
@ModelAttribute
폼 데이터를 객체로 바인딩
폼 데이터
POST
URL-encoded
(폼 데이터)
회원가입 폼 처리
  • @RequestBody@ResponseBody: RESTful API에서 요청과 응답을 JSON/XML로 주고받을 때 핵심적인 역할을 합니다. HTTP의 Content-TypeAccept 헤더에 따라 데이터 형식이 결정됩니다.
  • @RequestParam@PathVariable: 둘 다 GET 요청과 잘 어울리지만, @RequestParam은 유연한 필터링에, @PathVariable은 자원 식별에 강점을 가집니다.
  • @ModelAttribute: Spring MVC에서 폼 데이터를 처리하며, HTTP POST 요청과 application/x-www-form-urlencoded 형식에 적합합니다.

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday