본문 바로가기

Server Development/Data API

mappedBy, Cascade

 

 

단방향 : 한쪽 엔터티만 반대쪽을 아는 것.

양방향 : 서로 아는 것, 서로 참조하는 관계.

-> 조회나 수정을 각각 하는가 한번에 가능한가 차이.

 

 

 

mappedBy 배경

 

보통 RDBMS에서는 조인관계에 대해서 방향을 따지지 않는다.

이는 외래키를 통해 두 관계에 서로 접근이 가능하기 때문이다.

 

객체 관계에서는 @ManyToOne, @OneToMany @OneToOne 등을 이용해 관계를 정해서 매핑한다.

(하지만 이것만 적용하면 단방향 관계가 된다.)

 

예를 들어, 학교-학생 관계가 있다고 가정하자.

DBMS에서는 학생은 학교 아이디를 자신이 가지고 있고 이를 통해 학교에 대한 정보를 확인할 수 있다.

반대로, 학교는 학생 테이블에서 자신의 학교 아이디를 갖는 학생들을 조회할 수 있다.

하지만 객체에서는 학교는 학생의 아이디 정보를 모두 저장하지 않는 이상 확인할 수 없다.

 

 

이러한 경우, 학생 테이블에서 학교 아이디를 불러와 해당 학교 아이디를 이용해 학교 테이블에서 조회할 수 있다. 하지만 이보다는 한번에 관계성을 부여해 조회하는게 더 빠를 것이다. 이러한 경우에 양방향 관계를 설정해 조회할 수 있고 이 때, Mapped By를 사용한다.

 

 

 

 

 

MappedBy를 사용하는 이유 - 단방향 관계를 양방향 관계로 설정하기 위함, 애너테이션만 설정시 단방향 관계

  • 데이터 베이스 관리 : MappedBy를 사용하면 연관된 엔터티 간에 데이터 베이스 테이블에서 외래 키 관계를 제대로 설정할 수 있습니다. 주인이 아닌 엔터티의 필드에 설정하면 해당 필드는 데이터베이스 테이블에서 외래키로 관리되지 않습니다.
  • 양방향 관계의 일관성 : 양방향 관계에서 한 쪽 엔터티를 저장하면 다른 쪽 엔터티도 자동으로 저장됩니다. MappedBy를 사용하여 양방향 관계를 매핑하면 객체 간의 상호 참조를 일관되게 유지 가능하다. 하지만 만약 MappedBy를 사용하지 않는다면 일관성이 자동으로 유지되지 않기 때문에 항상 각각 수정을 해주어야 한다.
  • 코드 가독성 : 연관관계를 명시적으로 표현할 수 있으므로 코드의 가독성이 향상되고 유지보수가 쉬워진다.

 

 

 

 

 

연관 관계의 주인

- 만약 member의 학교를 변경하거나 학교에 member를 추가한다면? 주인을 정해서 연관성을 준다.

- 주인외래키를 관리하는 주체를 의미한다. 

- 주인이 아닌쪽은 읽기만 가능하고 주인만이 외래키를 등록 및 수정한다.

- 1 : N 인 경우, 부모테이블은 1, 자식테이블은 N이지만 관계의 주인은 N이 된다.

- mappedBy는 관계의 주인이 아닌 쪽에 관계에 주인은 내가 아니라고 명시해주는 것처럼 작성한다. 즉, 1에 작성한다.

 

 

 

 

예시

Post - Comment

-> Post의 아이디를 FK로서 Comment가 갖게 되고 Comment는 FK를 관리하는 주체가 된다. 

 

예를 들어, MappedBy 처리를 한 Post-Comment에서 Comment의 Post 엔터티를 수정시 Post DB에 반영이 된다. 하지만 MappedBy를 처리하지 않으면 각각 수정을 해주어야 한다.(단방향이기 때문에), 하지만 지정시 수정이 서로 반영된다.

추가적으로, 관계 저장시 Comment를 Post에 넣어주어야 한다. (관계의 주인을 넣어주어야 DB에 반영된다.)

 

 

 

 

Cascade

특정 엔터티를 저장 후, 연관된 엔터티도 함께 영속화하기 위해서는 영속성 전이가 필요하고 이를 관리해주는게 Cascade이다.

부모엔터티를 다룰 경우, 자식 엔터티까지 다룰 수 있다.

- 부모테이블에 작성을 한다.

 

cascade = CascadeType.Persist : 부모테이블 저장시 자식테이블도 함께 영속화

cascade = CascadeType.Remove : 부모테이블 삭제시 자식테이블도 함께 삭제, 자식 테이블 모두 삭제시 부모테이블도 삭제

cascade = CascadeType.ALL : Persist + remove

 

 

(+) orphanRemoval=true 옵션

만약 부모와 자식테이블의 연관관계가 삭제됐다면 자식 테이블은 고아테이블이 된다. 이 때, 만약 부모테이블을 삭제하면 해당 고아테이블도 삭제하게 도와준다.

 

 

 

'Server Development > Data API' 카테고리의 다른 글

JPA - Query DSL Method  (0) 2023.05.12
JPA - Query DSL  (0) 2023.05.11
JPA - Join  (0) 2023.05.09
Cache - Redis  (0) 2023.04.06
JPA - @Query with Spring JPA  (0) 2023.04.05