package javax.persistence;
public interface AttributeConverter<X,Y> {
public Y convertToDatabaseColumn (X attribute);
public X convertToEntityAttribute (Y dbData);
public class CharacterEntity {
...
@Column(length = 12, nullable = false)
private String playableClass;
...
}
먼저 Enum클래스를 생성해준다 작성해준다.
@AllArgsConstructor
@Getter
public enum PlayableClassType {
WARRIOR("전사",1),
PALADIN("성기사", 2),
HUNTER("사냥꾼",3),
ROGUE("도적",4),
PRIEST("사제",5),
DEATH_KNIGHT("죽음의 기사",6),
SHAMAN("주술사",7),
MAGE("마법사",8),
WARLOCK("흑마법사", 9),
MONK("수도사", 10),
DRUID("드루이드",11),
DEMON_HUNTER("악마사냥꾼", 12),
EVOKER("기원사", 13);
private final String playableClassName;
private final int playableClassId;
public static PlayableClassType getTypeByName(String playableClassName) {
return Arrays.stream(PlayableClassType.values())
.filter(targetType -> targetType.getPlayableClassName().equals(playableClassName))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("There is no described playble class."));
}
public static PlayableClassType getTypeById(int playableClassId) {
return Arrays.stream(PlayableClassType.values())
.filter(targetValue -> targetValue.getPlayableClassId() == playableClassId)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("There is no described playble class."));
}
}
그리고 오늘의 목표인 Converter를 구현해준다.
public class PlaybleClassConverter implements AttributeConverter<String, Integer> {
/**
* 전달된 playableClassName에 해당하는 PlayableClassType을 검색하고 이와 맵핑되는 playableClassId를 데이터베이스 컬럼으로 반환합니다.
* 해당하는 PlayableClassType이 없을 경우 IllegalArgumentException이 발생합니다.
*
* @param playableClassName playable class type의 name
* @return 데이터베이스에 맵핑되는 playableClassId
* @throws IllegalArgumentException playableClassName이 PlayableClassType에 존재하지 않을 경우 발생
*/
@Override
public Integer convertToDatabaseColumn(String playableClassName) {
return PlayableClassType.getTypeByName(playableClassName).getPlayableClassId();
}
;
/**
* 전달된 playableClassId에 해당하는 플레이어블 클래스 이름을 반환합니다.
* 해당하는 PlayableClassType이 없을 경우 IllegalArgumentException이 발생합니다.
*
* @param playableClassId 플레이어블 클래스 타입의 ID
* @return 플레이어블 클래스 타입의 이름
* @throws IllegalArgumentException playableClassId가 PlayableClassType에 존재하지 않을 경우 발생
*/
@Override
public String convertToEntityAttribute(Integer playableClassId) {
return PlayableClassType.getTypeById(playableClassId).getPlayableClassName();
}
}
이제 해당 컬럼에 Converter를 적용해주자
public class CharacterEntity {
...
@Convert(converter = PlaybleClassConverter.class)
@Column(length = 12, nullable = false)
private String playableClass;
...
}