관계형 데이터베이스를 사용한다면 연관관계 매핑을 어떻게 설정해주느냐가 객체 관리 및 퍼포먼스에 중요한 영향을 끼칠 수 있다.
이러한 연관관계 매핑을 JPA에서는 어노테이션으로 선언이 가능하다.
매핑을 원하는 column에 대해서 @OneToOne, @OneToMany etc... 등의 어노테이션을 달아주면 된다.
- @OneToOne = 1:1
- @OneToMany = 1:N
- @ManyToOne = N:1
- @ManyToMany = N:N
- @Embedded = Entity의 속성의 응집력을 높이기 위해 객체 형태 관리 하는 방식.
실제 사용에서는 다음과 같이 사용할 수 있다.
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "user", schema = "user")
@ToString(exclude = { "orderGroup" })
@Accessors(chain = true)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
@CreatedDate
private LocalDateTime createdAt;
@CreatedBy
private String createdBy;
@LastModifiedDate
private LocalDateTime updatedAt;
@LastModifiedBy
private String updatedBy;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
private Item item;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<OrderGroup> orderGroupList;
@ManyToOne(fetch = FetchType.LAZY)
private PricingPlan pricingPlan;
public class Status {
위와 같이 해당하는 column 에 어노테이션을 달아주면 된다.
어노테이션을 선언할 때는 필요에 따라서 parameter를 추가할 수 있다.
fetch 타입을 어떻게 할 것인지 혹은 cascade 타입을 어떻게 할 것인지 등을 정할 수 있다.
fetch param은 DB에서 어떻게 데이터를 가지고 올 것인지를 정하는 것이다.
해당 Entity를 가지고 왔을 때 연관관계 매핑이 된 다른 Entity를 같이 Join 해서 가져올 것인지 아닌지를 정할 수 있다.
JPA 에서 fetch 는 FetchType Enum을 통해서 설정된다.
타입은 두 가지가 존재한다.
LAZY: Entity를 호출해도 매핑된 다른 Entity는 프록시 객체로 채워서 실제 호출이 될 때까지 실제 호출이 일어나지 않는다. 이를 지연로딩이라고 한다.
EAGER: Entity가 호출되면 매핑된 다른 Entity도 모두 호출한다.
대부분 EAGER방식은 사용되지 않는다. 특히나 1:N 매핑에서 EAGER를 사용한다면 불필요하게 모든 매핑된 Entity를 가져오는 경우가 생길 수 있다.
cascade 는 Entity 의존성을 관리하는 방식을 정하는 param이다.
예를들어 특정 Entity가 Insert될 때 해당 Entity와 매핑된 Entity의 정보의 변경도 같이 반영을 할 것인지 아닌지 등을 설정한다.
JPA에서 cascade 는 5가지 타입으로 관리된다.
연관관계가 양방향 관계일 때 사용된다.
연관관계의 Owner가 해당 값을 선언해주면 된다.
MANY쪽이 OWNER 이며 mappedBy는 @OneToMany쪽의 컬렉션 칼럼에 기술하여 OWNER가 아님을 정의한다.
@OneToOne일 경우는 반대편의 FK를 소유하고 있는 쪽이 주인이 된다.
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<OrderGroup> orderGroupList;
https://en.wikibooks.org/wiki/Java_Persistence/Relationships#JPA_Relationship_Types