본문 바로가기

Spring Boot

[Spring Boot] Snake Case JSON 변환 전체 설정하기

728x90

Spring에서는 Java 클래스 필드가 기본적으로 camelCase로 지정되어 있으며, 이는 프론트엔드에서 주로 사용하는 snake_case와 다른 형식입니다.

예를 들어, 아래와 같은 필드가 있다고 가정해 봅시다:

// Java (Back-end)
String userName;
// JavaScript (Front-end)
let user_name;

 

이와 같은 형식 차이는 Spring으로 클라이언트 데이터를 주고받을 때 자동으로 매핑되지 않아, 프론트엔드와 백엔드 간에 불필요한 변환 작업을 발생시킵니다.

1. @JsonNaming을 이용한 수동 매핑

특정 클래스에서만 snake_case 변환을 적용하려면 @JsonNaming 애노테이션을 사용할 수 있습니다:

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class User {
    private String userName;

    // getters and setters
}

위와 같이 설정하면 userName 필드는 user_name으로 매핑됩니다. 하지만, 모든 클래스에 @JsonNaming을 추가하는 것은 비효율적입니다.

 

 

2. 전체 프로젝트에 snake_case 설정 적용하기

이 문제를 해결하기 위해 Spring Boot 전체에서 자동으로 camelCase를 snake_case로 변환하도록 설정할 수 있습니다. Spring Boot는 Jackson의 ObjectMapper를 사용하여 JSON 데이터를 직렬화 및 역직렬화합니다. 프로젝트 전체에 snake_case가 적용되도록 Jackson 설정을 변경할 수 있습니다.

 

ObjectMapperConfig 설정 클래스는 일반적으로 프로젝트의 최상위 패키지, 즉 프로젝트의 메인 패키지 구조 안에 위치하게 됩니다.

예를 들어, 패키지 구조가 com.example.myproject라면 설정 파일의 위치는 com.example.myproject.config와 같은 구조로 만들어, config 패키지 내에 ObjectMapperConfig 클래스를 두는 방식입니다.

설정 코드 예제

package com.example.api.config.objectmapper;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ObjectMapperConfig {

    /**
     * 프로젝트 전체에 snake_case를 적용하는 ObjectMapper 설정을 정의합니다.
     * JSON 직렬화 및 역직렬화 시 모든 필드명을 자동으로 변환하여 Spring과 클라이언트 간 데이터 형식 차이를 해결합니다.
     */
    @Bean
    public ObjectMapper objectMapper() {
        var objectMapper = new ObjectMapper();

        // Jdk8Module과 JavaTimeModule 등록으로 Optional, LocalDate와 같은 Java 8 클래스 직렬화 지원
        objectMapper.registerModule(new Jdk8Module());
        objectMapper.registerModule(new JavaTimeModule());

        // JSON 필드명을 Snake Case로 변환하도록 설정
        objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());

        // 알 수 없는 필드 무시
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        // 날짜 형식을 ISO-8601로 설정
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        return objectMapper;
    }
}

 

 

최종 결과 예시

위 설정을 적용하면, 예를 들어 User 클래스의 userName 필드는 JSON 변환 시 user_name으로 자동 변환됩니다. 이를 통해 모든 JSON 데이터를 snake_case 형식으로 프론트엔드에 전달할 수 있어, 클라이언트와의 데이터 형식 불일치 문제를 해결할 수 있습니다.

728x90