본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JPA Hibernate

[JPA] Entity와 Table간의 데이터 타입 변환

by 김코더 김주역 2022. 8. 24.
반응형

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

댓글