값 타입
엔티티에서 데이터 타입은 엔티티 타입과 값 타입으로 나눌 수 있습니다.
값 타입은 단순히 값을 의미하고, 고유한 식별자를 가지지 않습니다. 엔티티와 달리 고유한 식별자가 없고, 다른 엔티티와의 관계를 형성하지 않습니다. 값 타입의 데이터들이 고유한 식별자를 갖고 있지 않다고 해서 DB 테이블에 매핑되지 않는 것은 아닙니다. 똑같이 매핑되고 생명 주기도 해당 엔티티에 의존합니다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// ...
}
고유한 식별자를 갖고 있는 `id`는 엔티티 타입입니다.
고유한 식별자가 없고, 단순한 기본 타입을 갖고 있는 `name`과 age` 필드는 값 타입입니다.
일반적인 자바 기본 타입(예:int, long, double 등)과 String은 데이터베이스의 기본 타입과 일치하기 때문에 JPA에서 별도의 매핑 설정 없이도 자동 변환이 됩니다. 즉, JPA가 알아서 해당 타입들을 DB 컬럼 타입에 맞게 변환해줍니다. 하지만 별도의 클래스를 정의하여 매핑할 때는 별도의 처리를 해주어야합니다.
@Embeddable과 @Embedded
값 타입을 정의하여 사용할 수 있습니다.
값 타입을 정의할 때는 `@Embeddable` 어노테이션을 사용하여 해당 클래스가 값 타입임을 표시할 수 있습니다.
엔티티 클래스에서 해당값 타입을 속성으로 사용할 때는 `@Embedded` 어노테이션을 사용하여 값을 임베딩(embedding)합니다.
@Embeddable
public class Address {
private String city;
private String street;
private String zipCode;
// constructor, getter, setter 등
}
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
@Embedded
private Address address; // Address 값을 임베딩
// ...
}
@AttributeOverride
`@AttributeOverride` 어노테이션은 값 타입의 속성명을 변경할 때 사용됩니다.
상황 1)
다른 엔티티와의 관계로 중복되는 속성명이 있을 경우, 이 어노테이션을 사용하여 각각의 속성명을 다르게 지정할 수 있습니다.
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Embedded
@AttributeOverride(name = "city", column = @Column(name = "COMPANY_CITY"))
private Address address; // Company의 주소
}
상황 2)
한 엔티티 안에 타입은 같지만 나타내는 데이터가 다른 경우에도 사용할 수 있습니다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
@Embedded
Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", column = @Column(name = "COMPANY_CITY")),
@AttributeOverride(name = "street", column = @Column(name = "COMPANY_STREET")),
@AttributeOverride (name = "zipcode", column = @Column(name = "COMPANY_ZIPCODE"))
})
Address companyAddress;
}
@ElementCollection과 @CollectionTable
@ElementCollection:
값 타입의 컬렉션을 사용하기 위해선 `@ElementCollection` 어노테이션을 사용해야 합니다. 이를 통해 값 타입을 원하는 는 수만큼 저장할 수 있는 컬렉션을 만들 수 있습니다. (엔티티의 속성으로 컬렉션 값을 매핑하게 해줍니다.)
@CollectionTable
`@CollectionTable` 어노테이션은 컬렉션을 저장할 별도의 테이블을 생성할 수 있습니다.
@Entity
public class Library {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ElementCollection
@CollectionTable(name = "book", joinColumns = @JoinColumn(name = "library_id"))
private List<String> books;
@ElementCollection
@CollectionTable(name = "computer", joinColumns = @JoinColumn(name = "library_id"))
private List<Computer> computer;
// ...
}
books 같은 경우 String이기 때문에 기본적으로 타입이 DB와 매핑이 됩니다. 하지만 관계형 데이터베이스의 테이블은 컬럼 안에 컬렉션을 포함할 수 없기 때문에 @CollectionTable을 사용해 별도의 테이블을 추가하여 매핑해야 합니다.
'Spring Data > JPA' 카테고리의 다른 글
JPA Spring Data JPA: 스프링 프레임워크에서 JPA 편리하게 사용하기 (0) | 2023.08.25 |
---|---|
JPA JPQL(객체 지향 쿼리 언어)를 완벽히 이해해보자 (0) | 2023.08.23 |
JPA 영속성 전이(CASCADE)와 고아 객체 제거: 데이터 일관성과 관리 효율 높이는 전략(방법) (0) | 2023.08.23 |
JPA 프록시와 지연로딩: 성능 최적화를 위한 기술(방법) (0) | 2023.08.22 |
JPA 상속 관계 매핑 방법과 공통 매핑하는 방법 (0) | 2023.08.21 |