SEB_BE_43 / 23.02.24 회고

rse·2023년 2월 24일
0

코드스테이츠_BE_43

목록 보기
42/65

오늘

  • Entity 와 Entity의 연관 관계 매핑

연관 관계 매핑

Entity와 Entity를 매핑하려면 어떻게 해야할까?

JPA에서는 어떻게 하는지 알아보자.

다대일 연관 관계

@ManyToOne 애너테이션으로 다대일 이라는 관계 명시.
@JoindColumn 애너테이션으로 ORDERS 테이블에서 외래키에 해당하는 컬럼명 작성.

다대일 단방향 관계이기에 설정 끝.

member에 값을 넣어줬지만 order에서 memberId를 외래키로 가지고 있으니 order 테이블에도 값이 성공적으로 들어가짐.

findOrder.getMember().getMemberId 처럼 다른 객체를 통해서 정보를 얻는 것을 객체 그래프 탐색이라고 한다.

이번에는 member에도 orderId를 외래키로 넣어서 양방향 연관관계를 매핑해주자.

@OnToMany(meppedBy = "member")
meppedBy 의 값은 관계를 소유하고 있는 필드를 지정한다고 볼 수 있다.

현재 member 테이블과 order 테이블의 관계에서 order 외래키로 memberId를 지정하고 있다.
그리고 memberId는 member테이블의 기본키 이다.
order 클래스에서 외래키의 역할을 하는 것은 member필드다.

정리하자면 meppedBy 값으로 지정할 때 기억해야 하는 것

1. 두 객체들 간에 외래키의 역할을 하는 필드는 무엇인지?
2. 외래키의 역할을 하는 필드는 다(n)에 해당하는 클래스 안에 있다

모든 관계의 중심을 외래키부터 시작하면 연관 관계 매핑이 쉬워진다고 한다.

member 객체에 order 객체를 추가하는 이유는 추가를 해주지 않아도 member테이블에는 order의 정보가 저장이 된다. 하지만 find로 조회 할 때 member 객체로 order를 탐색하면 order 객체를 찾을 수 없다.

이유는 find 메서드가 1차 캐시에서 member 객체를 조회하는데 member에서 order를 추가하지 않으면 1차 캐시에 order가 추가되지 않아서 보이지 않는다.

1차 캐시 주기

1차캐시 : 애플리케이션 종료 시점, 트랜젝션이 끝나는 시점에 주기가 사라짐.

다대다 연관 관계

일단 N:N의 다대다 관계일 경우 JDBC 할 때처럼 1대 N대 1의 관계를 만들어줄 필요가 있다.
다대다 의 테이블 사이에 둘을 이어주는 테이블 하나를 만들어서 1대 N 대 1의 관계를 만드는 것이다.

테이블 표를 보면 이렇다.

다대다 도 그렇고 다대일도 그렇고 N(다)의 테이블에 먼저 외래키를 가져온다.

OrderCoffee 테이블은 Order 랑도 이어져야하고, Coffee랑도 이어져야한다.

여기서 복잡하게 생각하지 말고 단순히 Order와 OrderCoffee 만 보자.

Order와 OrderCoffee 의 관계는 1:N이 될 것이다.

그렇다면 OrderCoffee에 먼저 ManyToOne 애너테이션으로 다대일 중 다 에 해당된다고 지정해주고,
JoinColumn 으로 외래키를 들고 올 컬럼 명을 적어준다.
그리고 왠만하면 클래스를 들고오자.
targetEntity 을 이용해서 들고오는 방법도 있겠지만 그럴경우 코드가 복잡해지기에 별로 추천하는 방식은 아니라고 함.

ManyToOne은 N(다)의 입장이다.

그리고 이제 Order에 가서 OrderCoffee 클래스의 값을 참조할 수 있도록 해야한다.
그래야 주문에서 커피까지 확인 할 수 있을테니.

OneToMany 를 사용해서 일대다 관계에서 일의 입장이라는 것을 알려준다.
그리고 mappedBy 안에 들어가는 이름은 ManyToOne에서 정의해줬던 클래스 명과 같아야한다.
( 연관관계를 맺고 있는 필드에서 외래키를 갖고 있는 클래스가 누구인지
거기 지정되어있는 클래스 이름. )

아까 여기서 private Order order 이 부분. order로 정의해줬기 때문에 order로 mappedBy에 넣어준 것이다.

이렇게 하면 양방향 매핑이 된 것이다!

Coffee도 똑같이 해준다.

그리고 List로 받는 이유는 값이 한 컬럼일지 여러개일지 모르기 때문에.

실행시키면 콘솔에 결과가 이렇게 나온다.

일대일 연관 관계

이번에는 Member에 스탬프를 적립한다고 생각해보자.

일단 멤버에 stamp를 조인해준다.
이유는 회원이 스탬프를 몇개 모았는지 확인 할 수 있지만 스탬프 입장에서는 누구의 도장이 찍혔는지 알 필요 없기 때문이다.

그래서 스탬프 클래스에는 아무것도 해주지 않는다.

이렇게 하면 Member 입장에서 스탬프를 조회할 수 있다.

일대일 연관 관계를 쓰는 이유

유지보수 하기 쉽기 때문에.

ManyToMany 를 안 쓰는 이유

ManyToMany를 쓰면 편하지 않나? 라고 생각할 수 있지만
ManyToMany는 컬럼 추가가 되지 않는다.

그러니까 아까 Order 과 Coffee 클래스를 생각해보자.
중간에 quantity 라는 커피 수량 체크하는 객체가 새로 생겼는데,
ManyToMany는 그 객체 추가가 안된다.

그렇기에 쓰는 일이 드물다고 한다.

profile
기록을 합시다

0개의 댓글