No enum constant org.example.luvbackend.entity.AlbumType.main
몽고DB의 Collection Field값을 Enum으로 역직렬화중에 뜨는 에러이다.
public enum AlbumType {
ALL("all"),
GEN_3040("3040"),
...
GEN_3040
등으로 바꾸기보다Spring Data MongoDB는 JPA(Object-Relational Mapper)와 비슷한
MongoDB의 Document ↔ Java 객체(Object) 매핑을 담당하는
ODM(Object-Document Mapper)
이다.
여기서 Document는 실제 데이터 객체 1개이다.
RDB에서는 테이블의 하나의 열과 같은 뜻이다.
이건 JPA도 그런거 같기도..? 쨋든 기본전략이기 때문에 Enum.필드값()으로 바꾸지 못하는 듯하다 ㅠ
내부적으로 MappingMongoConverter가 BSON ↔ Entity 매핑한다.
안된다..
bson4jackson
플러그인을 따로 추가하면 지원된다고 한다.MongoCustomConversions(Bean)에 커스텀 Converter 등록
Converter<String, AlbumType>
(DB String → Enum.value() 매핑)Converter<AlbumType, String>
(Enum → DB 저장 시 value 사용)import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
@Configuration
public class MongoConverterConfig {
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(List.of(
// DB -> Enum
new Converter<String, AlbumType>() {
@Override
public AlbumType convert(String albumType) {
return AlbumType.deserialize(albumType);
}
},
// Enum -> DB
new Converter<AlbumType, String>() {
@Override
public String convert(AlbumType albumType) {
return albumType.getValue();
}
}
));
}
}
커스텀 컨버터가 많아질 수도 있는 데이터 구조일 경우, 다른 방법(DB 데이터 변경 등)을 고려해보는 것도 좋다고 생각한다.
나의 경우 커스텀 컨버터가 추후에도 추가된다 할지라도 몇개 추가 안될꺼라 생각해서 적용하였다!
MongoDB Collection~
Jackson 라이브러리
@JsonCreator로 Enum 역직렬화하기
Spring boot with MongoDB - Spring Data MongoDB