2 minute read

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.

    1. Order 엔티티 저장할 때 → 담겨있던 Order_Item 엔티티를 한 번에 저장
    2. Cart 엔티티 삭제 → 담겨있던 Cart_Item 함께 삭제
  • 영속성 전이(cascade) 종류
    • persist : 부모 엔티티 영속화 될 때, 자식 엔티티도 영속화 됨
    • merge : “ 병합될 때, “ 병합됨
    • remove : “ 삭제될 때, “ 삭제됨
    • refresh : “ refresh될 때, “ refresh됨
    • detach : “ detach 될 때, “ detach 됨
    • all : 부모 엔티티 영속성 상태 변화를 자식 엔티티에 모두 전이
  • 고아 객체 제거
    • 고아객체?

      부모 엔티티와 연관 관계가 끊어진 자식 엔티티!

    • 주의사항!

      • 참조하는 곳은 반드시 하나여야 함 (다른 곳에서도 참조하는 엔티티를 삭제할 수 없음!)

        ⇒ @OneToOne, @OneToMany 에서만 사용

  • 참고, ‘지연로딩’
  • FetchType 기본값
    • @xxToOne → EAGER(즉시 로딩)
    • @xxToMany → LAZY(지연 로딩)






공지

  • 스프링부트 시험 - 7/7(목)
    • 필기
    • 실기: board 프로젝트 관련 기능 구현




nice!

Updated: