Spring Boot JSON 데이터 처리 과정 완벽 이해하기

Spring Boot에서 JSON 데이터를 주고받는 전체 과정을 처음부터 끝까지 이해할 수 있도록 정리해 드립니다. RequestBody, ResponseBody, DTO, Jackson, 직렬화와 역직렬화 원리까지 실제 코드 흐름 중심으로 자세히 설명해 드립니다.

Spring Boot를 처음 배우기 시작하면 가장 많이 접하는 데이터 형식이 바로 JSON(JavaScript Object Notation)입니다. 대부분의 REST API는 JSON을 이용하여 데이터를 주고받으며, 모바일 앱과 웹 프론트엔드 역시 대부분 JSON 기반으로 통신합니다.

하지만 많은 개발자분들께서는 단순히 @RequestBody만 사용하면서 내부에서 어떤 과정으로 객체가 생성되고 다시 JSON으로 변환되는지는 정확하게 이해하지 못하는 경우가 많습니다.

이번 글에서는 Spring Boot JSON 데이터 처리 과정을 처음부터 끝까지 순서대로 살펴보면서 spring boot json 데이터 받기, spring boot json 데이터 보내기, spring boot json 처리 방식까지 함께 이해하실 수 있도록 자세하게 설명해 드리겠습니다.

01. JSON이 필요한 이유

Spring Boot에서 JSON이 왜 사용되는지 먼저 이해하시면 이후 내용을 훨씬 쉽게 이해하실 수 있습니다.

✓ JSON이란 무엇인가요?

JSON은 텍스트 기반 데이터 교환 형식입니다.

사람도 읽기 쉽고 컴퓨터도 쉽게 분석할 수 있기 때문에 현재 대부분의 REST API에서는 JSON을 기본 데이터 형식으로 사용합니다.

예를 들어 회원가입 요청은 다음과 같이 전달됩니다.

 
{
  "name":"Kim",
  "age":30,
  "email":"kim@test.com"
}
 

HTML Form 방식보다 구조적인 데이터를 표현하기 쉽고, 객체와 거의 동일한 형태이기 때문에 Java 객체와도 매우 잘 연결됩니다.

02. Spring Boot에서 JSON 처리 전체 흐름

이번 글에서 가장 중요한 부분입니다.

✓ 전체 처리 과정

Spring Boot에서 JSON이 처리되는 순서는 다음과 같습니다.

순서처리 내용

1 클라이언트가 JSON 생성
2 HTTP Body에 JSON 포함
3 Spring DispatcherServlet 수신
4 HttpMessageConverter 실행
5 Jackson이 JSON → DTO 변환
6 Controller에서 DTO 사용
7 서비스 로직 수행
8 DTO 또는 객체 반환
9 Jackson이 객체 → JSON 변환
10 클라이언트에게 JSON 응답

결국 핵심은 Jackson이 Java 객체와 JSON 사이를 서로 변환해 준다는 점입니다.

03. JSON 데이터를 받는 과정

이번에는 spring boot json 데이터 받기 과정을 자세히 살펴보겠습니다.

✓ 클라이언트 요청

프론트엔드에서는 다음과 같이 요청합니다.

 
{
  "name":"Lee",
  "age":25
}
 

HTTP Body 안에는 JSON 문자열이 들어 있습니다.

✓ DTO 생성

먼저 DTO를 작성합니다.

 
public class UserDto {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
 

DTO는 JSON 데이터를 저장하는 역할을 합니다.

✓ Controller 작성

 
@PostMapping("/user")
public String saveUser(@RequestBody UserDto dto){

    System.out.println(dto.getName());
    System.out.println(dto.getAge());

    return "success";
}
 

여기서 핵심은 @RequestBody입니다.

이 어노테이션이 있으면 HTTP Body 안의 JSON을 자동으로 DTO로 변환해 줍니다.

04. JSON은 어떻게 DTO가 되는 걸까요?

여기부터가 많은 분들께서 가장 궁금해하시는 부분입니다.

✓ DispatcherServlet

모든 요청은 먼저 DispatcherServlet으로 들어옵니다.

DispatcherServlet은 어떤 Controller를 실행해야 하는지 찾습니다.

그 후 Controller를 실행하기 전에 필요한 파라미터를 준비합니다.

✓ HttpMessageConverter

Spring Boot에는 여러 종류의 Message Converter가 존재합니다.

JSON 요청이라면 다음 Converter가 선택됩니다.

MappingJackson2HttpMessageConverter
 

이 Converter가 Jackson 라이브러리를 호출합니다.

✓ Jackson 실행

Jackson은 JSON 문자열을 읽어 다음 과정을 수행합니다.

  1. JSON 분석
  2. DTO 생성
  3. Setter 호출
  4. 객체 완성

즉,

JSON
↓

Jackson

↓

DTO 객체
 

라는 흐름으로 동작합니다.

개발자가 직접 객체를 생성하지 않아도 되는 이유가 바로 여기에 있습니다.

05. JSON 데이터를 보내는 과정

이번에는 spring boot json 데이터 보내기 과정을 살펴보겠습니다.

✓ Controller

 
@GetMapping("/user")
public UserDto getUser(){

    UserDto dto = new UserDto();
    dto.setName("Kim");
    dto.setAge(30);

    return dto;

}
 

객체를 그대로 반환했을 뿐인데 JSON이 응답됩니다.

왜 이런 결과가 나올까요?

✓ Jackson의 직렬화

Controller가 객체를 반환하면 Spring Boot는 다시 Message Converter를 호출합니다.

이번에는 반대로

DTO 객체

↓

Jackson

↓

JSON
 

변환이 수행됩니다.

이를 직렬화(Serialization)라고 부릅니다.

✓ 실제 응답

클라이언트에서는 다음 JSON을 받게 됩니다.

 
{
  "name":"Kim",
  "age":30
}
 

06. 직렬화와 역직렬화 차이

이번 내용을 이해하면 Spring Boot JSON 처리 구조가 한 번에 정리됩니다.

✓ 비교 표

구분설명

직렬화(Serialization) Java 객체 → JSON
역직렬화(Deserialization) JSON → Java 객체

즉,

요청은 역직렬화, 응답은 직렬화라고 이해하시면 됩니다.

07. Spring Boot JSON 처리에서 DTO를 사용하는 이유

DTO는 단순히 데이터를 담는 객체가 아닙니다.

✓ Entity를 그대로 사용하지 않는 이유

Entity를 그대로 노출하면

  • 불필요한 데이터가 함께 전달될 수 있습니다.
  • 내부 구조가 외부에 공개될 수 있습니다.
  • 보안 문제가 발생할 가능성이 있습니다.
  • API 변경 시 영향 범위가 커질 수 있습니다.

DTO를 사용하면 필요한 데이터만 전달할 수 있습니다.

✓ 좋은 DTO 작성 방법

다음 사항을 고려하여 DTO를 작성하시는 것이 좋습니다.

  • 요청 DTO와 응답 DTO를 분리합니다.
  • 필요한 필드만 포함합니다.
  • 검증이 필요한 경우 Validation을 함께 사용합니다.
  • Entity와 역할을 구분합니다.

08. JSON 처리 시 자주 발생하는 오류

실무에서도 자주 만나는 문제들입니다.

✓ JSON 필드명이 다른 경우

예를 들어

 
{
 "user_name":"Kim"
}
 

DTO는

 
private String userName;
 

이라면 자동 매핑되지 않을 수 있습니다.

필드명을 맞추거나 Jackson 관련 어노테이션을 사용하는 방법을 검토하시면 됩니다.

✓ Getter와 Setter가 없는 경우

Jackson은 일반적으로 Getter와 Setter를 이용하여 데이터를 읽고 저장합니다.

따라서 접근 메서드가 없으면 정상적으로 변환되지 않을 수 있습니다.

✓ Content-Type 오류

JSON 요청이라면

Content-Type: application/json
 

으로 요청해야 합니다.

다른 형식으로 전송하면 @RequestBody가 정상적으로 동작하지 않을 수 있습니다.

✓ DTO 구조가 JSON과 다른 경우

JSON 구조와 DTO 구조가 일치하지 않으면 일부 값이 매핑되지 않거나 예외가 발생할 수 있습니다.

API 명세와 DTO를 함께 관리하시는 것이 좋습니다.

09. Spring Boot JSON 처리 과정 한눈에 정리

지금까지의 흐름을 간단히 정리하면 다음과 같습니다.

브라우저

↓

JSON 생성

↓

HTTP 요청

↓

DispatcherServlet

↓

HttpMessageConverter

↓

Jackson

↓

DTO 생성

↓

Controller

↓

Service

↓

DTO 반환

↓

Jackson

↓

JSON 생성

↓

브라우저 응답
 

이 흐름만 정확하게 이해하셔도 Spring Boot REST API 개발의 기본 원리를 훨씬 쉽게 익히실 수 있습니다.

10. 실무에서 꼭 기억해야 하는 핵심 포인트

이번 글의 내용을 실무 관점에서 정리하면 다음과 같습니다.

✓ 핵심 정리

  • JSON 요청은 @RequestBody를 통해 DTO로 변환됩니다.
  • JSON 응답은 객체를 반환하면 자동으로 생성됩니다.
  • 실제 변환 작업은 Jackson이 수행합니다.
  • Spring Boot는 MappingJackson2HttpMessageConverter를 통해 Jackson을 호출합니다.
  • DTO는 Entity와 분리하여 사용하는 것이 유지보수와 보안 측면에서 유리합니다.
  • 직렬화와 역직렬화 개념을 이해하면 대부분의 JSON 처리 과정을 쉽게 이해하실 수 있습니다.

REST API 개발에서는 JSON이 사실상 표준 데이터 형식으로 사용됩니다. 따라서 Spring Boot의 JSON 처리 흐름을 정확히 이해해 두시면 API 설계와 디버깅, 유지보수 과정에서 큰 도움이 됩니다.

FAQ

Q1. Spring Boot에서는 JSON 변환을 직접 작성해야 하나요?

아닙니다. 기본적으로 Jackson 라이브러리와 HttpMessageConverter가 자동으로 JSON과 Java 객체를 서로 변환해 줍니다.

Q2. @RequestBody는 언제 사용하나요?

HTTP Body에 포함된 JSON 데이터를 Java 객체로 변환하여 받고 싶을 때 사용합니다. 주로 POST, PUT, PATCH 요청에서 많이 사용됩니다.

Q3. 객체를 반환하면 왜 JSON으로 응답되나요?

Spring Boot가 반환된 객체를 MappingJackson2HttpMessageConverter와 Jackson을 이용해 자동으로 JSON으로 직렬화하기 때문입니다.

Q4. JSON과 DTO의 필드명이 다르면 어떻게 되나요?

필드명이 서로 다르면 자동 매핑이 되지 않을 수 있습니다. 필드명을 일치시키거나 Jackson에서 제공하는 매핑 관련 어노테이션을 사용하는 방법을 검토하시면 됩니다.

Q5. JSON 처리 속도는 Jackson만 영향을 주나요?

Jackson의 성능도 중요한 요소이지만 객체 구조, 데이터 크기, 네트워크 환경, JVM 설정, 응답 데이터의 양 등 다양한 요소가 함께 영향을 미칠 수 있습니다.