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
'Spring' 카테고리의 다른 글
Spring @RequestParam vs. @RequestPart (0) | 2024.12.21 |
---|---|
Kotlin + Spring 프로젝트 MongoDB 설정 (0) | 2024.11.30 |
Spring 프로젝트 내부에 React 설정 및 Build (Gradle) (0) | 2023.01.15 |
Spring DI (0) | 2022.11.27 |
properties로 Spring Boot log를 설정해보자! (0) | 2022.04.23 |
블로그의 정보
개발하는 두부
뚜부니