최근 Spring WebFlux, Kotlin, MongoDB를 사용해 개발하면서 네이밍 관련 문제를 마주하게 되었습니다. 어떠한 방식으로 네이밍을 설정했는지 공유드리려고 합니다.
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
)로 자동 변환됩니다. 이를 통해 클라이언트와 서버 간에 일관된 네이밍 규칙을 유지할 수 있습니다.
Jackson의 property-naming-strategy: SNAKE_CASE
설정은 HTTP 요청/응답에만 영향을 미치며, MongoDB에 데이터를 저장할 때는 적용되지 않습니다. Spring Data MongoDB는 Jackson의 설정을 사용하지 않고 자체적인 매핑 로직을 사용합니다. 따라서 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>,
@CreatedDate @Field("created_at")
var createdAt: LocalDateTime? = null,
@LastModifiedDate @Field("updated_at")
var updatedAt: LocalDateTime? = null
)
위 코드에서는 MongoDB에 데이터를 저장할 때 필드 이름을 스네이크 케이스로 지정하기 위해 @Field
어노테이션을 사용했습니다. 예를 들어, memberId
필드는 MongoDB에 member_id
로 저장됩니다. 이를 통해 JSON과 MongoDB 간의 네이밍 규칙을 일관되게 유지할 수 있습니다.
- HTTP 요청/응답 시 네이밍 전략 설정:
application.yml
에jackson.property-naming-strategy: SNAKE_CASE
를 설정하여 클라이언트와 서버 간의 JSON 필드 이름을 자동으로 변환합니다. - MongoDB 필드 이름 설정: MongoDB에 데이터를 저장할 때 필드 이름을 스네이크 케이스로 저장하기 위해
@Field
어노테이션을 사용해 명시적으로 이름을 설정합니다.
이와 같은 설정을 통해 JSON 데이터와 MongoDB 필드 간의 네이밍 불일치를 해결하고, 클라이언트-서버-데이터베이스 간의 일관성을 유지할 수 있습니다. 이를 통해 개발 과정에서 발생할 수 있는 불필요한 오류를 줄이고 유지보수성을 높일 수 있습니다.