개발하는 두부

Spring Boot, MongoDB 프로젝트 네이밍 설정 방식

by 뚜부니

최근 Spring WebFlux, Kotlin, MongoDB를 사용해 개발하다가 네이밍 관련 문제를 만나게 되었어요..!!

JSON 직렬화/역직렬화와 MongoDB 필드 매핑에 대한 내용을 포함해 어떻게 네이밍을 설정했는지 공유드릴게요 🤗

 

1. HTTP 요청/응답을 Snake Case로 설정하기

Spring Boot에서 DTO(JSON) 필드 이름을 스네이크 케이스로 직렬화/역직렬화하기 위해 다음과 같이 application.yml에 Jackson의 프로퍼티 네이밍 전략을 설정할 수 있습니다.

jackson:
    property-naming-strategy: SNAKE_CASE

 

이 설정은 클라이언트와 서버 간의 데이터 교환에서 필드 이름 변환을 도와줍니다. 예를 들어, 클라이언트가 { "member_id": "123" }와 같은 JSON 데이터를 전송하면, 서버는 memberId라는 필드에 자동으로 매핑하여 DTO로 변환합니다.

이렇듯 DTO 클래스에 있는 카멜 케이스 필드(memberId, createdAt)가 JSON에서 스네이크 케이스(member_id, created_at)로 자동 변환됩니다.

 

2. MongoDB에 필드 저장 시 스네이크 케이스 사용하기

Jackson의 property-naming-strategy: SNAKE_CASE 설정은 HTTP 요청/응답에만 영향을 미치며, MongoDB에 데이터를 저장할 때는 적용되지 않습니다. Jackson은 HTTP 요청/응답을 처리할 때 JSON 직렬화/역직렬화를 담당하기 때문에, 웹 계층에서 클라이언트로부터 들어온 JSON 형태의 데이터를 자바 객체로 변환하거나 자바 객체를 JSON 형태로 응답하기 위한 도구로 사용됩니다.

반면, Spring Data MongoDB는 MongoDB와 직접적으로 연동하면서 자바 객체를 BSON 형태로 변환하거나 그 반대로 수행합니다. 따라서 기본적으로 데이터를 저장할 때는 자바 객체의 필드명이 그대로 MongoDB 문서의 필드명으로 매핑됩니다. 스네이크 케이스를 적용하려면 각 필드에 @Field 어노테이션을 사용하여 명시적으로 이름을 설정해야 합니다.

예를 들어, 다음과 같이 @Field 어노테이션을 사용하여 MongoDB에서 사용될 필드 이름을 지정할 수 있습니다:

@Document(collection = "post")
data class Post(
    @Id
    val id: String? = null,
    @Field("member_id")
    val memberId: String,
    val content: String,
    val photos: List<String>? = emptyList(),
    @CreatedDate @Field("created_at")
    var createdAt: LocalDateTime? = null,
    @LastModifiedDate @Field("updated_at")
    var updatedAt: LocalDateTime? = null
)

위 코드에서는 MongoDB에 데이터를 저장할 때 필드 이름을 스네이크 케이스로 지정하기 위해 @Field 어노테이션을 사용했습니다. 예를 들어, memberId 필드는 MongoDB에 member_id로 저장됩니다. 이를 통해 JSON과 MongoDB 간의 네이밍 규칙을 일관되게 유지할 수 있습니다.

 

참고

 

블로그의 정보

개발하는 두부

뚜부니

활동하기