👣 개요
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 |