Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

공부일기

[Spring Boot 입문] HTTP 요청이 DTO 객체가 되는 과정 (RequestBody / PathVariable / RequestParam) 본문

스프링 부트/개인 프로젝트

[Spring Boot 입문] HTTP 요청이 DTO 객체가 되는 과정 (RequestBody / PathVariable / RequestParam)

석새우 2026. 3. 8. 17:50

1. 이전 글에서 다룬 내용

이전 글에서는 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

를 사용해 이 과정을 자동으로 처리한다.