Spring

Spring Boot 에서 Snake Case 형식으로 JSON 응답하기

Griotold 2025. 1. 8. 11:04

1. Snake Case

 

Snake Case는 프로그래밍에서 변수, 함수, 파일명 등 이름을 작성할 때

단어 사이를 밑줄('_')로 구분하는 네이밍 규칙이다.

모든 문자를 소문자로 작성하며, 공백 대신 밑줄을 사용하는 것이 특징인데, 

 

예를 들어, 

user_name

phone_number

위와 같이 작성하면 Snake Case 를 따른 것이다.

 

일반적으로 JSON 데이터 포맷, 데이터베이스에서 주로 사용되는데, 

Java를 주로 쓰는 나로서는 Java의 기본 규칙인 Came Case와 충돌(?)하게 되어 문제가 될 때가 있다.

물론, 문제라고 할 것 까지는 없는데,

팀 프로젝트를 진행할 때는 코드 스타일을 정확하게 짚고 넘어가는 것이 협업하는 데 좋긴 할 것이다.

 

2. 팀 프로젝트

 

식당 예약, 줄서기 프로그램을 개발하는 팀프로젝트를 진행중이다.

https://github.com/BobJool/Waiting-Reservation-Service

 

GitHub - BobJool/Waiting-Reservation-Service

Contribute to BobJool/Waiting-Reservation-Service development by creating an account on GitHub.

github.com

 

팀 프로젝트를 진행할 때는 코드 스타일을 정하고 정확하게 준수하는 것이 중요하다.

 

우리 팀은 API 명세서를 작성하면서,

API endpoint, query parameter, path variable, JSON 형식에 대해서 규칙을 정했다.

 

  • API endpoint: 하이픈('-') 사용(Kebab Case)
  • query parameter: Camel Case 사용
  • path variable: Camel Case 사용
  • JSON: Snake Case

 

아래는 내가 맡은 결제 도메인의 모습이다.

 

 

 

`paymentId`

path variable은 Camel Case로 로 작성했고

 

`userId`

query parameter 도 마찬가지로 Camel Case 로 작성했다.

 

아래는 레스토랑 도메인의 모습인데

 

`is-reservation`

엔드 포인트가 Kebab Case 로 작성된 모습이다. 

 

JSON의 경우는 

 

POST /api/v1/payments
Authorization: Bearer jwt_token_string
Content-Type: application/json

{
  "revercation_id": "uuid",
  "user_id": 1,
  "amount": 20000,
  "method": "CARD",
  "pg_name": "TOSS",
}

 

이런 식으로 `reservation_id`, `user_id` 처럼 내려주기로 했다.

 

3. Spring Boot 에서 Snake Case 로 JSON 응답 내려주기

 

찾아보니까 여러 가지 방식이 있는 것 같다.

그 중 가장 간단한 방법이 application.yml에 global 로 지정하는 것이다.

 

아래 처럼 작성해주면 된다.

 

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

 

아주 간단하다.

서버에서는 Java의 규칙대로 Camel Case로 작성하고 JSON으로 변환할 때,

Jackson 라이브러리가 해당 설정을 보고 Snake Case로 바꿔준다.

너무 편리한걸?

 

그러니까 아래의 Java 객체가 내려줄 정보라면

 

package com.bobjool.reservation.application.dto.payment;

import com.bobjool.reservation.domain.entity.Payment;

import java.time.LocalDateTime;
import java.util.UUID;

public record PaymentResDto(
        UUID PaymentId,
        UUID reservationId,
        Long userId,
        Integer amount,
        String method,
        String pgName,
        String status,
        LocalDateTime createdAt,
        LocalDateTime updatedAt

) {
    public static PaymentResDto from(Payment payment) {
        return new PaymentResDto(
                payment.getId(),
                payment.getReservationId(),
                payment.getUserId(),
                payment.getAmount(),
                payment.getMethod().name(),
                payment.getPgName().name(),
                payment.getStatus().name(),
                payment.getCreatedAt(),
                payment.getUpdatedAt()
        );
    }

}

 

Camel Case로 작성되어 있어도 아래 처럼 JSON으로 응답이 내려갈 때는 Snake Case가 되는 것이다.

 

 

마무리

 

Spring이 편리하게 지원해준 덕분에 개발하기가 참 편하다.

 

References

https://docs.spring.io/spring-boot/appendix/application-properties/index.html