TIL

[JPA] 값 타입 컬렉션

우성팔 2023. 12. 6.

JPA 데이터 타입

JPA에서 데이터 타입으로 2가지로 나눠보면

  • 엔티티 타입
    • @Entity 어노테이션을 이용해서 정의된 객체
    • Entity 타입은 데이터가 변경되어도 식별자로 추적이 가능

 

  • 값 타입
    • 식별자가 없고 값만 존재하므로 변경되면 추적이 불가능
    • 단순히 값으로 사용하는 자바 기본 타입이나 객체
      • 기본값 타입
        • 자바 기본 타입(int, double)
        • wrapper 클래스(Integer, Long)
        • String
      • 임베디드 타입
        • JPA에서 정의해서 사용
      • 컬렉션 값 타입
        • JPA에서 정의해서 사용
        • 컬렉션에 기본값 또는 임베디드 타입을 넣은 형태

 

값 타입 컬렉션(collection value type)이란?

값 타입을 컬렉션에 담아서 쓰는 것을 말하며 값 타입을 하나 이상 저장할 때 사용한다
연관관계 매핑에서 엔티티를 컬렉션으로 사용하는 것이 아니라 값 타입을 컬렉션에 쓰는 것이다

	@ElementCollection
	@CollectionTable(name = "oldPasswords", joinColumns = @JoinColumn(name = "user_id"))
	private List<String> oldPasswords = new ArrayList<>();

@ElementCollection

 - 엔티티 클래스에 컬렉션(이 코드에서는 List)을 포함시키기 위해 사용하며 엔티티가 아니라 별도의 테이블에 저장

 - 컬렉션 값 타입은 @ElementCollection(fetch = LAZY)를 default값으로 한다

 

fetch = LAZY?

더보기

JPA의 Fetch
 - Entity를 조회할때, Entity와 연관관계가 있는 다른 Entity의 정보를 가져오는 시점을 결정해줌
 
Fetch의 타입은 2가지가 있는데

  • LAZY Fetch Type(지연 로딩)
    • entity 조회할 때는 가져오지 않고 연관관계에 있는 entity를 참조할 때 가져옴
  • EAGER Fetch Type(즉시 로딩)
    • entity를 조회할때 연관관계에 있는 entity를 가져옴

 

어노테이션 이름에서 뒤쪽에 Many가 붙어있으면 지연로딩(해당 Entity 정보가 여러개 들어 있을 수도 있기때문에)

어노테이션 이름에서 뒤쪽에 One이 붙어있으면 즉시로딩(해당 Entity 정보가 한개만 들어오기때문에)

 

@CollectionTable(name = "oldPasswords", joinColumns = @JoinColumn(name = "user_id"))

 - oldPasswords라는 이름의 테이블을 생성하고, 이 테이블이 외부 테이블(이 코드에서는 user_id 컬럼을 가진 테이블)과 조인되도록 설정합니다

댓글