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 간의 네이밍 규칙을 일관되게 유지할 수 있습니다.
참고
- https://docs.spring.io/spring-framework/reference/integration/jmx/naming.html#jmx-naming-metadata
- https://docs.spring.io/spring-data/mongodb/reference/mongodb/mapping/mapping.html
블로그의 정보
개발하는 두부
뚜부니