JPA ENUM 사용법

2 min read

JPA ENUM 사용법

jpa에서 enum을 사용할때 기본적으로


	@Enumerated(EnumType.STRING)
	@Column(name = "jobtype")
	private JobType jobtype;

Enumerated 어너테이션을 사용하여 EnumType을 String으로 사용할건지 ORDINAL으로 사용할건지 선택을 한다.

여기서 코드와 맵핑시켜서 사용하면



import static java.util.stream.Collectors.toMap;

import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public enum UseMode {
	IN_CAR_TIME(2, "입차시점기준"),
	MIDNIGHT(1, "자정기준");

	private static final Map<Integer, UseMode> codeToEnum =
			Stream.of(values()).collect(toMap(UseMode::getCode, e -> e));

	@Getter
	private Integer code;
	private String description;

	UseMode(Integer code, String description) {
		this.code = code;
		this.description = description;
	}

	public static UseMode fromCode(Integer symbol) {
		UseMode useMode = codeToEnum.get(symbol);
		if (Objects.isNull(useMode)) {
			log.error("잘못된 UseMode 타입입니다. UseMode = {}", symbol);
			throw new IllegalArgumentException("잘못된 UseMode 타입입니다.");
		}
		return useMode;
	}

}


위와 같은 Enum을 만들어서 DB에는 code값이 들어가야 될때 converter를 선언해서 사용한다.



import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import kr.co.parkingcloud.local.integration.constants.UseMode;

@Converter
public class UseModeConverter implements AttributeConverter<UseMode, Integer> {

	@Override
	public Integer convertToDatabaseColumn(UseMode useMode) {
		return useMode.getCode();
	}

	@Override
	public UseMode convertToEntityAttribute(Integer integer) {
		return UseMode.fromCode(integer);
	}
}


AttributeConverter를 구현하면 간단하게 컨버터를 구현할수 있다.


	@Convert(converter = UseModeConverter.class)
	@Column(name = "use_mode")
	private UseMode useMode;

위에 처럼 지정해 주면 된다.

참조