Today I Learned - 53
Spring - 13
- JPA 연관관계 설정
JPA 연관관계
-
연관 관계를 맺는다?
객체, 즉 엔티티끼리 연관 관계를 설정(매핑)하는 것은 중요함
- like, DB에서 테이블끼리 외래키를 통해 관계 맺음..
JPA 연관관계 - (1) 매핑 종류
-
1 : 1 매핑: @OneToOne
ex. 회원 - 장바구니
-
1 : N 매핑: @OneToMany
ex. 장바구니 - N개의 상품
JPA 연관관계 - (2) 방향성
- 참고, ‘즉시로딩’
-
단방향
ex. 1:1 단방향 : 장바구니(cart) → 회원(member)
⇒ 장바구니 엔티티 조회하면서, 회원 엔티티의 정보도 동시에 가져옴!
@Entity @Table(name = "cart") @Getter @Setter @ToString public class Cart { @Id @Column(name = "cart_id") @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @OneToOne **// FetchType 기본값 = EAGER(즉시로딩)** @JoinColumn(name="member_id") **// 외래키(**이름='member_id'**) 지정** private Member member; }
ex. N:1 단방향 : 상품(item) → 장바구니(cart)
@Entity @Getter @Setter @Table(name="cart_item") public class CartItem extends BaseEntity { @Id @GeneratedValue @Column(name = "cart_item_id") private Long id; @ManyToOne **// FetchType 기본값 = EAGER(즉시로딩)** @JoinColumn(name="cart_id") **// 외래키(**이름='cart_id'**) 지정** private Cart cart;
-
양방향
‘2개의 단방향 매핑’ 과 같다
양방향 매핑 주의사항
- 연관관계 주인 설정
- 연관관계 주인 = 외래키가 있는 곳
- 연관관계 주인이 외래키를 관리(등록, 수정, 삭제)
- 주인이 아닌 쪽, 연관관계 매핑 시 ‘mappedBy’ 속성값으로 연관관계 주인 표시
- 주인이 아닌 쪽, 읽기만 가능
N:1 or 1:N 양방향
ex : 장바구니 상품(cart_item) ↔ 장바구니(cart)
ex : 주문상품(order_item) ↔ 주문(order)
- ex. Order.java - 주문(order) ← 1 : N → 주문상품(order_item)
@Entity @Table(name = "orders") @Getter @Setter public class Order extends BaseEntity { @Id @GeneratedValue @Column(name = "order_id") private Long id; @OneToMany(mappedBy = "order") private List<OrderItem> orderItems = new ArrayList<>();
- 연관관계 주인 설정
N : N (다대다) 매핑
- 실무에서 사용하지 않는다.
- 관계형 데이터베이스에서는 정규화 된 테이블 2개로 다대다 표현할 수 없기 때문!
JPA 연관관계 - (3) 영속성 전이(cascade)
-
영속성 전이란?
엔티티 상태를 변경할 때, 연관된 엔티티에도 상태 변화를 전파시키는 옵션!
ex.
- Order 엔티티 저장할 때 → 담겨있던 Order_Item 엔티티를 한 번에 저장
- Cart 엔티티 삭제 → 담겨있던 Cart_Item 함께 삭제
- 영속성 전이(cascade) 종류
- persist : 부모 엔티티 영속화 될 때, 자식 엔티티도 영속화 됨
- merge : “ 병합될 때, “ 병합됨
- remove : “ 삭제될 때, “ 삭제됨
- refresh : “ refresh될 때, “ refresh됨
- detach : “ detach 될 때, “ detach 됨
- all : 부모 엔티티 영속성 상태 변화를 자식 엔티티에 모두 전이
- 고아 객체 제거
-
고아객체?
부모 엔티티와 연관 관계가 끊어진 자식 엔티티!
-
주의사항!
-
참조하는 곳은 반드시 하나여야 함 (다른 곳에서도 참조하는 엔티티를 삭제할 수 없음!)
⇒ @OneToOne, @OneToMany 에서만 사용
-
-
- 참고, ‘지연로딩’
- FetchType 기본값
- @xxToOne → EAGER(즉시 로딩)
- @xxToMany → LAZY(지연 로딩)
공지
- 스프링부트 시험 - 7/7(목)
- 필기
- 실기: board 프로젝트 관련 기능 구현