공부일기
[Spring Boot 입문] HTTP 요청이 DTO 객체가 되는 과정 (RequestBody / PathVariable / RequestParam) 본문
[Spring Boot 입문] HTTP 요청이 DTO 객체가 되는 과정 (RequestBody / PathVariable / RequestParam)
석새우 2026. 3. 8. 17:501. 이전 글에서 다룬 내용
이전 글에서는 MiniSNS 프로젝트를 통해 Spring Boot 백엔드의 기본 구조를 살펴보았다.
또한 다음 개념들을 정리했다.
- Controller의 역할
- Service와 트랜잭션
- Repository와 JPA
- Entity와 DB 매핑
이번 글에서는 Controller 계층에서 실제로 일어나는 일을 더 자세히 살펴보려고 한다.
특히 다음 질문을 해결하는 것이 목표다.
- HTTP 요청은 어떻게 Java 객체가 되는가?
- @RequestBody는 어떻게 JSON을 DTO로 변환하는가?
- @PathVariable은 URL 값을 어떻게 가져오는가?
- @RequestParam은 언제 사용하는가?
2. HTTP 요청과 REST API
Spring Boot에서 Controller는 HTTP 요청을 처리하는 역할을 한다.
예를 들어 클라이언트가 다음 요청을 보낸다고 하자.
POST /posts
Content-Type: application/json
{
"userId": 1,
"title": "hello",
"content": "first post"
}
Spring Boot는 다음 과정을 통해 이 요청을 처리한다.
HTTP 요청
↓
DispatcherServlet
↓
Controller 매핑
↓
DTO 객체 변환
↓
Service 호출
DispatcherServlet이란?
디스패처서블릿은 HTTP 요청들을 매핑된 컨트롤러로 배차해주는 역할을 수행하는 중앙 서블릿이다. 서블릿에 관한건 추후에 자세히...
암튼
이 과정에서 중요한 역할을 하는 것이 바로 다음 어노테이션들이다.
- @RequestBody
- @PathVariable
- @RequestParam
3. @RequestBody — JSON을 Java 객체로 변환하기
MiniSNS 프로젝트에서 게시글 생성 API는 다음과 같이 작성했다.
@PostMapping
public PostResponse create(@RequestBody CreatePostRequest request) {
return postService.create(
request.userId(),
request.title(),
request.content()
);
}
@RequestBody의 역할
Spring 공식 문서에 따르면 @RequestBody는
HTTP 요청 Body를 Java 객체로 변환하여 Controller 메서드 파라미터에 바인딩한다.
(Spring Framework Reference Documentation)
즉 다음 JSON 요청이 들어오면
{
"userId": 1,
"title": "hello",
"content": "first post"
}
Spring은 이를 자동으로 DTO 객체로 변환한다.
JSON → CreatePostRequest 객체
아! DTO는 record를 사용했다!!
public record CreatePostRequest(
Long userId,
String title,
String content
) {}
record를 사용하면
- 생성자 자동 생성
- getter 자동 생성
- 불변 객체
장점이 있어 DTO 작성이 간결해진다.
4. @PathVariable — URL 경로 값 가져오기
게시글 조회 API는 다음과 같이 구현했다.
@GetMapping("/posts/{id}")
public PostResponse getPost(@PathVariable("id") Long id) {
return postService.getPost(id);
}
여기서 {id}는 URL 경로 변수이다.
예를 들어 다음 요청이 들어오면
GET /posts/1
@PathVariable("id")
로 해당 값을 가져오는 것이다.
주의할 점
이름이 반드시 맞아야 한다.
예를 들어 다음 코드는 에러가 발생한다.
@GetMapping("/posts/{id}")
public PostResponse getPost(@PathVariable("idd") Long id)
왜냐면 URL 변수({id}) 와 "idd"가 다르기 때뭉이다.
5. @RequestParam — Query Parameter 받기
게시글 목록 조회 API에서는 페이징을 위해 Query Parameter를 사용했다.
예시 요청
GET /posts?page=0&size=10
이때 나오는 page 와 size가 쿼리 파라미터라고 한다,,,
이것을 이용해서 Page로 받아줬는데,,,
@GetMapping("/posts")
public PageResponse<PostResponse> getPosts(Pageable pageable) {
return PageResponse.from(postService.getPosts(pageable));
}
Pageable은 다음과 같은 파라미터들을 자동으로 처리해준다.
?page=0
?size=10
?sort=id,desc
@RequestParam을 직접 사용 예시
직접 사용할 경우 다음과 같이 작성할 수 있다.
@GetMapping("/posts")
public List<PostResponse> getPosts(
@RequestParam int page,
@RequestParam int size
) {
...
}
6. HTTP 요청이 객체로 변환되는 전체 과정
지금까지 내용을 정리하면 다음과 같다.
HTTP 요청
↓
DispatcherServlet
↓
Controller 매핑
↓
@PathVariable / @RequestParam / @RequestBody 처리
↓
DTO 객체 생성
↓
Controller 메서드 실행
7. 이번 글에서 배운 것
이번 글에서는 Spring Controller에서 HTTP 요청이 처리되는 과정을 살펴보았다.
핵심 개념은 다음과 같다.
- @RequestBody → JSON을 DTO로 변환
- @PathVariable → URL 경로 변수
- @RequestParam → Query Parameter
그리고 Spring MVC는 내부적으로
- DispatcherServlet
- Jackson ObjectMapper
를 사용해 이 과정을 자동으로 처리한다.