공부하는 안경딸기

[JPA] 연관 관계 주인 본문

JPA

[JPA] 연관 관계 주인

안경딸기 2021. 8. 30. 15:41

JPA 정식 공부한건 아니고 일단 실습 강의부터 듣고 있는데 내 DB 지식과 코딩 하면서 살짝 느껴지는 기운을 가지고 야매로 정리해봄

(나중에 제대로 배우면 그때 다시 정리할듯?)

 

연관 관계 주인의 위치?

1 : N 이나 N : 1에서 연관 관계가 만들어 지는데 이때 연관 관계 주인의 위치를 정해야 함.

외래키(FK)가 있는 곳을 연관 관계의 주인으로 정해야 함.

외래키(FK)는 주로 1 : N 관계에서 N의 개체에 넣어줌.

FK가 없는 곳을 연과 관계의 주인으로 정하게 되면 나중에 추가적으로 별도의 UPDATE 쿼리가 발생하는 등의 성능 문제가 있음.

 

연관 관계 주인 표시 예시 코드

@Entity
@Getter @Setter
public class OrderItem { //Many
	@ManyToOne //하나의 주문이 여러 아이템 주문을 가짐 <-> 주문된 아이템은 하나의 주문을 가짐
	@JoinColumn(name = "order_id") //FK
	private Order order; //One
}




@Entity
@Table(name = "orders")
@Getter @Setter
public class Order { //One
	//하나의 주문이 여러 아이템 주문을 가짐 <-> 주문된 아이템은 하나의 주문을 가짐
	@OneToMany(mappedBy = "order")
	private List<OrderItem> orderItems = new ArrayList<>(); //Many
}

주문 내역의 입장에서는 하나의 주문(Order)을 가짐 (N : 1)

주문 입장에서는 여러개의 주문 내역(OrderItem)을 가질 수 있음 (1 : N)

주문 내역 개체가 주인

@ManyToOne

N : 1의 관계 매핑 정보를 나타내는 어노테이션

주문 내역의 입장에서 주문을 보면 N : 1임

@JoinColumn

외래키(FK)를 매핑할 때 사용하는 어노테이션

위의 코드에서는 OrderItem이라는 테이블에 order_id라는 FK를 만드는데 사용

@OneToMany

1 : N의 관계 매핑 정보를 나타내는 어노테이션

주문의 입장에서 주문 내역을 보면 1 : N임

mappedBy - 연관 관계 주인 정하는 속성

주인 테이블은 mappedBy 속성을 사용하지 않음.

주인 테이블이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 정할 수 있음.

@ManyToMany

N : M 관계일 때 매핑 정보를 나타내는 어노테이션

그치만 DB에 다대다 관계를 만드는 것은 있을 수 없는 일...

만든다고 해도 중간에 관계 테이블 또 만들어야 하는거라 이 어노테이션은 가능하면 사용을 지양할 것

그리고 사용한다고 해도 겁나 복잡...

@Entity
@Getter @Setter
public class Category {

    @ManyToMany
    @JoinTable(name = "category_item",//다대다 관계에서의 중간 테이블 필수임!! 알쥐ㅣㅣㅣㅣㅣㅣㅣㅣㅣ/.?
        joinColumns = @JoinColumn(name = "category_id"), //category table 쪽 column
            inverseJoinColumns = @JoinColumn(name = "item_id") //item table 쪽 column
    )
    private List<Item> items = new ArrayList<>();

    ///////////////////////////////////////////////////////////////
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();
}

대충 이런 느낌... ㅎㅎ

category_item이라는 중간 관계 테이블을 어노테이션으로 만들어서 그 안에 들어오는 속성이랑 반대쪽 개체로 가는 속성을 다 만들어 줘야함...

Comments