컨버터를 사용하면 Entity의 Data를 변환해서 DB에 저장할 수 있습니다.
ENUM 이나 Boolean 값에 따라 0 이나 1 대신 Y 또는 N을 저장하고 싶다면 Converter를 사용하면됩니다.
@Data
public class BookStatus {
private int code;
private String description;
public BookStatus(int code) {
this.code = code;
this.description = parseDescription(code);
}
private String parseDescription(int code) {
switch (code) {
case 100:
return "판매종료";
case 200:
return "판매중";
case 300:
return "판매보류";
default:
return "미지원";
}
}
public boolean isDisplayed() {
return code == 200;
}
}
위와 같이 BookStatus라는 현재 책의 판매 상태를 나타내는 클래스를 생성합니다.
(Getter 와 Setter를 사용하기 위해 @DATA 어노테이션 사용)
@Converter
public class BookStatusConverter implements AttributeConverter<BookStatus, Integer> {
@Override
public Integer convertToDatabaseColumn(BookStatus attribute) {
return null;
}
@Override
public BookStatus convertToEntityAttribute(Integer dbData) {
return null;
}
}
먼저 converter를 사용할 수 있도록 BookStatusConverter라는 클래스를 만든후
AttributeConverter<BookStatus, Integer> 를 implements 한후
convertToDatabaseColumn 와 convertToEntityAttribute 메소드를 정의 해 주어야 합니다.
@Override
public Integer convertToDatabaseColumn(BookStatus attribute) {
return attribute.getCode();
}
@Override
public BookStatus convertToEntityAttribute(Integer dbData) {
return dbData != null ? new BookStatus(dbData) : null;
}
@Converter 어노테이션과 함께
위와 같은 로직으로 작성해줍니다.
그 이후에 Converter를 적용할 컬럼에
@Convert(converter = BookStatusConverter.class)
private BookStatus status; // 판매상태
@Convert 어노테이션과 Converter 클래스를 적용시켜줍니다.
@DisplayName("1. converterTest")
@Test
void test_5(){
bookRepository.findAll().forEach(System.out::println);
}
위와 같은 Test생성하고 실행시키면
status=BookStatus(code=100, description=판매종료)
status=BookStatus(code=200, description=판매중)
위의 결과로 결과가 저장 되어지는것을 확인 할 수 있습니다.