[JPA] Relation Mapping

김지환·2022년 11월 19일
0

관계형 데이터베이스를 사용한다면 연관관계 매핑을 어떻게 설정해주느냐가 객체 관리 및 퍼포먼스에 중요한 영향을 끼칠 수 있다.

이러한 연관관계 매핑을 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

fetch param은 DB에서 어떻게 데이터를 가지고 올 것인지를 정하는 것이다.
해당 Entity를 가지고 왔을 때 연관관계 매핑이 된 다른 Entity를 같이 Join 해서 가져올 것인지 아닌지를 정할 수 있다.

JPA 에서 fetch 는 FetchType Enum을 통해서 설정된다.

타입은 두 가지가 존재한다.

LAZY: Entity를 호출해도 매핑된 다른 Entity는 프록시 객체로 채워서 실제 호출이 될 때까지 실제 호출이 일어나지 않는다. 이를 지연로딩이라고 한다.
EAGER: Entity가 호출되면 매핑된 다른 Entity도 모두 호출한다.

대부분 EAGER방식은 사용되지 않는다. 특히나 1:N 매핑에서 EAGER를 사용한다면 불필요하게 모든 매핑된 Entity를 가져오는 경우가 생길 수 있다.

cascade param

cascade 는 Entity 의존성을 관리하는 방식을 정하는 param이다.
예를들어 특정 Entity가 Insert될 때 해당 Entity와 매핑된 Entity의 정보의 변경도 같이 반영을 할 것인지 아닌지 등을 설정한다.

JPA에서 cascade 는 5가지 타입으로 관리된다.

  • PERSIST: 부모 Entity가 Transient 상태에서 Persistence 상태로 넘어갈 때 자손 Entity도 같이 Persistence 상태로 넘어간다.
  • MERGE: 부모 Entity가 Merge되면 자손 Entity도 Merge 된다.
  • REMOVE: 부모 Entity가 Removed 상태가 되면 자손 Entity도 Removed 상태가 된다.
  • REFRESH: 부모 Entity가 refresh 되면 자손 또한 refresh 된다.
  • ALL: 위 모든 타입을 적용 시킨다.

mappedBy param

연관관계가 양방향 관계일 때 사용된다.
연관관계의 Owner가 해당 값을 선언해주면 된다.
MANY쪽이 OWNER 이며 mappedBy는 @OneToMany쪽의 컬렉션 칼럼에 기술하여 OWNER가 아님을 정의한다.

@OneToOne일 경우는 반대편의 FK를 소유하고 있는 쪽이 주인이 된다.

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<OrderGroup> orderGroupList;

Reference

https://en.wikibooks.org/wiki/Java_Persistence/Relationships#JPA_Relationship_Types

profile
Developer

0개의 댓글