JPA

9장 값 타입

iksadnorth 2023. 9. 3. 23:53

해당 게시물은 책 '자바 ORM 표준 프로그래밍'을 읽고 작성했습니다.

👣 개요

JPA가 인식하는 데이터 타입은 다음과 같이 3분류로 나눌 수 있다.

1. 기본값 타입 - 자바 기본 타입(Ex. int, Integer, double)
2. 임베디드 타입 - 복합 값 타입
3. 컬렉션 값 타입

이 중 1번은 이미 알고 있는 내용이기에 2번, 3번에 대해서만 서술한다.

 

👣 임베디드 타입

임베디드 타입은 DB에는 반영되지 않지만, OOP에서
좀 더 OOP 스럽게 코드를 구성하기 위해 사용하는 도구다.
예를 들어, 집 주소를 표현하는 필드가 도, 시, 동이라는 3개의 필드가 있을 때,
응집성을 높이기 위해 3개의 필드를 위치라는 클래스에 담고 위치 클래스 타입의 필드 1개로
치환하는 것이다.

변경 전 코드

@Entity
public class Member {
    @Id
    private Long id;
    private String name;
    
    private String dou;
    private String si;
    private String dong;
}

변경 후 코드

@Entity
public class Member {
    @Id
    private Long id;
    private String name;
    
    @Embedded
    private Location loc;
}
@Embeddable
public class Location {
    private String dou;
    private String si;
    private String dong;
}

단, 주의할 것은 @EmbeddedId 어노테이션과 @Embedded 어노테이션은 다른 어노테이션이다.

위와 같이 구성하므로서 좀더 응집력있는 코드를 작성할 수 있게 된다.

 

👣 값 타입 컬렉션

다대다 연관관계를 이용할 때, @JoinTable이라는
어노테이션을 이용해서 별도의 테이블을 만들지 않아도 되듯

일대다 연관관계에서도, @CollectionTable라는 
어노테이션을 이용해서 별도의 테이블을 만들지 않아도 된다.

@Entity
public class Member {
    @Id
    private Long id;
    private String name;
    
    ...
    
    @ElementCollection
    @CollectionTable(
        joinColumns=@JoinColumn(name="MEMBER_ID")
    )
    private List<Location> address = new ArrayList<>();;
}
@Embeddable
public class Location {
    private String dou;
    private String si;
    private String dong;
}

위와 같이 원래는 Address라는 엔티티를 만들어서 일대다를 구현해야 하지만
편의에 따라서 위와 같이 구성해도 무방하다.

당연하지만 이렇게 하면 제약사항을 세밀하게 제어할 수 없기 때문에 지양하는 것이 좋다.

'JPA' 카테고리의 다른 글

QueryDSL  (0) 2023.09.06
10장 객체지향 쿼리 언어  (0) 2023.09.04
8장 프록시와 연관관계 관리  (0) 2023.08.31
7장 고급 매핑  (0) 2023.08.31
6장 다양한 연관관계 매핑  (0) 2023.08.31