JVM/JPA

PostgreSQL Array 타입 JPA 연동

kyoulho 2023. 11. 12. 11:42

Hibernate는 기본적으로 PostgreSQL의 Array 데이터 타입을 지원해 주지 않는다.

 

vladmihalcea 라이브러리를 추가

implementation("com.vladmihalcea:hibernate-types-60:2.20.0")

type-60은 하이버네이트 6.0 이상부터 지원하는 라이브러리다. 각자 상황의 맞는 버전을 추가하면 된다.

 

 

스키마

create table job_offer
(
    job_offer_id    bigserial primary key,
    days            varchar(50)[]     not null,
);

 

엔티티

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class JobOffer extends BaseTime {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long jobOfferId;

    @Type(value = ListArrayType.class,
    		parameters = @Parameter(name = AbstractArrayType.SQL_ARRAY_TYPE,
            				value = "varchar"))
    private List<Day> days;
}

여러 타입들을 지원해주는데 기본적으로 배열을 위주로 지원해주고 있다. 예를 들어 StringArrayType.class 는 자바 String[]을 지원해주는 타입이다.

나는 List로 관리하고 싶었기에 ListArrayType.class를 사용했다. 여러 테스트 결과 List에 무엇을 담아도 ListArrayType을 사용하면 잘 작동되었다. Day는 Enum 클래스이다. 특별히 @Enumerate(String)을 사용하지 않아도 String으로 저장하고 변환해 준다.

 

@Parameter 의 name은 "sql_array_type"을 사용해도 되고 위에처럼 상수를 사용해도 된다.

value 에는 데이터베이스에 어떤 데이터 타입이 배열로 들어가게 되는지 넣어주면 된다.

 

주의

QueryDSL 을 사용해서 조회할 때 일반적인 일대다 관계처럼 생각하고 코드를 짜다 보면 실행이 안되는 경우가 많다.
예를 들어 랜덤으로 하나만 가져오거나 그러기는 힘들고 배열 전체를 가져와서 하나를 꺼내는 식으로 해야된다.

 

 

 

 

 

728x90

'JVM > JPA' 카테고리의 다른 글

2차 캐시  (0) 2023.07.05
낙관적 락과 비관적 락  (0) 2023.07.05
트랜잭션을 지원하는 쓰기 지연  (0) 2023.07.04
SQL 쿼리 힌트 사용  (0) 2023.07.04
읽기 전용 쿼리의 성능 최적화  (0) 2023.07.04