Entity와 Table을 매핑할 때 서로 다른 데이터 타입으로 매핑하고 싶다면 어떻게 할까?
이러한 고민을 해결해주는 AttributeConverter을 설명한 뒤에 예제를 통해 적용 방법을 이해해보자.
1. AttributeConverter 인터페이스
public interface AttributeConverter<X,Y> {
public Y convertToDatabaseColumn(X attribute);
public X convertToEntityAttribute(Y dbData);
}
- X에는 엔티티의 필드 타입, Y에는 테이블의 컬럼 타입이 들어간다.
- convertToDatabaseColumn() 메소드에는 엔티티의 필드를 테이블의 컬럼으로 변환하는 방법을 구현하면 되고, convertToEntityAttribute() 메소드에는 테이블의 컬럼을 엔티티의 필드로 변환하는 방법을 구현하면 된다.
2. @Converter 클래스 생성
- AttributeConverter 인터페이스를 구현할 컨버터 클래스에는 @Converter 어노테이션도 추가해야 한다.
- 아래 예제는 true, false가 저장되는 엔티티 필드와 "Y", "N"이 저장되는 테이블 컬럼간의 변환을 담당하는 컨버터 클래스다.
@Converter
public class BooleanConverter implements AttributeConverter<Boolean, String> {
@Override
public String convertToDatabaseColumn(Boolean attribute) {
return (attribute!=null&&attribute)?"Y":"N";
}
@Override
public Boolean convertToEntityAttribute(String dbData) {
return "Y".equals(dbData);
}
}
3. @Converter 클래스 적용
- 컨버터 클래스를 만들었다면 엔티티에 적용만 하면 된다.
1) 엔티티 필드에 적용하는 방법
@Convert(converter=BooleanConverter.class)
private boolean subscribed;
2) 엔티티 클래스에 적용하는 방법
- @Convert.attributeName 속성에 컨버터를 적용할 엔티티 필드의 이름을 명시하면 된다.
@Entity
@Convert(converter=BooleanConverter.class, attributeName="subscribed")
public class Member {
...
private boolean subscribed;
}
4. 글로벌 설정
- 컨버터 클래스에 붙은 @Converter 어노테이션의 autoApply 속성을 true로 주면 엔티티 필드나 클래스에 @Convert를 지정하지 않아도 모든 X(엔티티 필드)타입에 대해 자동으로 컨버터가 적용된다.
- 아래 예시에서는 모든 Boolean 타입에 대해 자동으로 컨버터가 적용된다.
@Converter(autoApply=true)
public class BooleanConverter implements AttributeConverter<Boolean, String> {...}
5. @Convert.disableConversion
- 글로벌 컨버터나 상속 받은 컨버터를 사용하지 않는다는 속성으로, 기본값은 false로 되어 있다.
@Convert(..., disableConversion=true)
● 참고자료 : 자바 ORM 표준 JPA 프로그래밍
'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글
[JPA] 엔티티 그래프 (0) | 2022.08.25 |
---|---|
[JPA] JPA 리스너 (0) | 2022.08.24 |
[JPA] JPA와 컬렉션 (0) | 2022.08.24 |
[JPA] 웹 애플리케이션에서의 영속성 관리 (0) | 2022.08.22 |
[JPA] Spring Data JPA(2) (0) | 2022.08.20 |
댓글