BackEnd/SpringBoot

SpringBoot @Converter @Convert 데이터 처리 시 활용

hyunki.Dev 2022. 12. 11. 18:02

코딩을 하다보면 java 에서는 CardStatus 와 같은 Card의 현 상태를 Enum을 사용해서 값(ACTIVE, USE, PAUSE)을 다루고 싶고

데이터베이스에는 해당 Status에 따른 표현 값("A", "U", "P")을 저장하고 싶은 경우가 있습니다.

 

java에서의 코딩할때의 표현 값과 DB에 실제 저장되는 값이 다르게 하는 것입니다.

public enum CardStatus {
  ACTIVE("A"), // 발행
  USE("U"), // 사용
  PAUSE("P");  //사용 정지

  private final String value;

  @JsonValue
  public String getValue() {
    return value;
  }

  CardStatus(String value) {
    this.value = value;
  }

  private final static ImmutableMap<String, CardStatus> values = ImmutableMap.copyOf(
      Stream.of(values()).collect(Collectors.toMap(CardStatus::getValue, Function.identity())));

  public static CardStatus find(final String value) {
    if (!values.containsKey(value)) {
      throw new ApiException();
    }

    return values.get(value);
  }
}

 

이럴 때 사용하게 되는 것이 @Converter, @Convert 어노테이션입니다.

 

@Converter 객체 생성

@Converter
public class CardStatusAttributeConverter implements AttributeConverter<CardStatus, String> {


  @Override
  public String convertToDatabaseColumn(CardStatus cardStatus) {

    if (cardStatus == null) {
      return null;
    } else {
      return cardStatus.getValue();
    }
  }


  @Override
  public CardStatus convertToEntityAttribute(String dbData) {
    if (StringUtils.isBlank(dbData)) {
      return null;
    } else {
      return CardStatus.find(dbData);
    }
  }
}

우선 @Converter 객체를 위와 같이 생성합니다. convertToDatabaseColumn(CardStatus cardStatus) 에서는 들어온

CardStatus가  ACTIVE 라면 'A', USE 라면 'U'로 값을 변환하여 Database 에 저장할 값을 만들어줍니다.

 

아래의 convertToEntityAttribute(String dbData)에서는 반대로 String 값으로 DB에 저장된 'A' , 'U'가

Java 의 CardStatus Enum값인 'ACTIVE', 'USE'로 변환되어 조회됩니다.

 

@Entity에 컨버터 적용

  @Column(name = "CARD_STATUS")
  @Convert(converter = CardStatusAttributeConverter.class)
  private CardStatus cardStatus;

마지막으로 적용할 Entity의 컬럼에 @Convert 어노테이션을 사용하여 적용하면 됩니다. @Converter와 헷갈리지 않게 주의해주세요.

 

이러한 @Converter  @Convert 어노테이션의 경우 DB와 Java가 표현해야 할 값이 복잡하고 다양해지는 경우에 많이 사용하게 됩니다.