
이전 프로젝트를 진행하면서 가장 아쉬웠던 부분이 Enum을 관리하는 방법이었다. 우리가 진행하던 프로젝트에서는 수많은 Enum들이 사용되었지만, 시간 상의 제약으로(변명이지만) 따로 효율적으로 관리하는 방법을 생각하고 적용하지는 못했다.
그래서 이번에 새로운 프로젝트를 진행할 때는 이에 대해 더욱 고심하고 적용하고 싶었다. 그래서 구글링하던 중 아래 글을 발견했다.
JPA Entity Enum Converter를 좀 더 유연하게 관리하는 방법
재사용 가능한 컨버터 패턴을 적용하자
package com.coachcoach.catalog.entity.converter;
public interface CodedEnum<T> {
T getCode();
}
먼저 CodeEnum이라는 인터페이스를 정의해준다. 이를 정의함으로써 모든 Enum은 code라는 변수를 가지게 된다.
또한 모든 Enum은 이 인터페이스를 구현해야 한다.
public abstract class AbstractCodedEnumConverter<T extends Enum<T> & CodedEnum<E>, E> implements AttributeConverter<T, E> {
private final Class<T> clazz;
public AbstractCodedEnumConverter(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public E convertToDatabaseColumn(T attribute) {
return attribute.getCode();
}
@Override
public T convertToEntityAttribute(E dbData) {
if (Objects.isNull(dbData)) {
return null;
}
return Arrays.stream(clazz.getEnumConstants())
.filter(e -> e.getCode().equals(dbData))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Unknown code: " + dbData));
}
}
그리고 추상 컨버터를 정의해주는 것이다. T는 Enum이면서 CodedEnum을 구현해야한다.
@Converter(autoApply=true)를 적용해주었기 때문에 모든 Unit 타입 필드에 이 컨버터가 작동으로 적용된다. 필드마다 @Converter 어노테이션을 사용하지 않아도 된다는 것이다.
package com.coachcoach.catalog.entity.enums;
import com.coachcoach.catalog.entity.converter.AbstractCodedEnumConverter;
import com.coachcoach.catalog.entity.converter.CodedEnum;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum Unit implements CodedEnum<String> {
G("G", 100),
KG("KG", 1),
EA("EA", 1),
ML("ML", 100),
;
private final String code;
private final Integer baseQuantity;
@jakarta.persistence.Converter(autoApply = true)
static class Converter extends AbstractCodedEnumConverter<Unit, String> {
public Converter() {
super(Unit.class);
}
}
}
마지막으로 Enum을 정의해준다. code 필드는 기본으로 가지고 있고 추가적으로 Integer를 자료형으로 가지는 Unit 만의 필드를 하나 더 추가해주었다.
'자바 > 스프링부트' 카테고리의 다른 글
| 스프링부트 요청 형식 불일치 시 오류 처리 (0) | 2026.02.19 |
|---|---|
| Docker MySQL + Spring Boot 연결 오류 해결기 (feat. 포트 충돌) (0) | 2025.12.11 |
| java.lang.ClassNotFoundException 해결하기 (0) | 2025.12.10 |
| Github Actions + AWS EC2 로 간단하게 스프링 부트 프로젝트 CI/CD 파이프라인 구축하기 (0) | 2025.11.25 |
| Jenkins를 이용해 스프링 부트 프로젝트 CI/CD 파이프 라인 구축하기 (0) | 2025.11.20 |