50DAYS) [Spring MVC] JPA 기반 데이터 액세스 계층 - 연관 관계 매핑

nacSeo (낙서)·2022년 12월 28일
0

◉ 학습목표

1. JPA 기반의 엔티티 간 연관 관계를 매핑할 수 있다.
  1. JPA 기반 엔티티 간 연관 관계 매핑

⦿ 학습내용

☞ 연관 관계 매핑

✔︎ 엔티티 클래스 간의 관계를 만들어주는 것

☞ Spring Data JDBC 🆚 JPA

✔︎ Spring Data JDBC

  • 엔티티 간 단방향 매핑만 지원

✔︎ JPA

  • 단방향, 양방향 매핑 모두 지원
  • 엔티티 간에 일대다, 다대일, 다대다, 일대일 연관 관계 매핑 지원

☞ 단방향 연관 관계

✔︎ 한쪽 클래스만 다른 쪽 클래스의 참조 정보를 가지고 있는 관계
✔︎ 예시

☞ 양방향 연관 관계

✔︎ 양쪽 클래스가 서로의 참조 정보를 가지고 있는 관계
✔︎ 예시

☞ 일대다 단방향 연관 관계

✔︎ 일대다 관계 : 일(1)에 해당하는 클래스가 다(N)에 해당하는 객체를 참조할 수 있는 관계
✔︎ 예시
<클래스 간 관계>
<테이블 간 관계>
✔︎ 일대다 관계는 외래키를 가지고 있어야 할 엔티티에 외래키 역할을 하는 객체 참조가 없기 때문에 가급적 사용 ❌
✔︎ 다대일 단방향 매핑을 먼저 한 후에 필요한 경우, 일대다 단방향 매핑을 추가해서 양방향 연관 관계를 만드는 것이 일반적

☞ 다대일 연관 관계

✔︎ 다(N)에 해당하는 클래스가 일(1)에 해당하는 객체를 참조할 수 있는 관계
✔︎ 예시
✔︎ 테이블이 외래키를 가지듯 클래스 역시 Member 객체를 외래키처럼 가지고 있음
✔︎ 테이블의 관계처럼 자연스러운 매핑 방식이기 때문에 JPA의 엔티티 연관 관계 중에서 가장 기본으로 사용되는 매핑 방식
✔︎ 다대일 단방향 연관 관계 매핑 코드 작성 시

  • 다대일 매핑(@ManyToOne)은 다대일에서 '다'에 해당하는 엔티티에서 사용
    • @JoinColumn 애너테이션은 다대일 매핑(@ManyToOne)에서 사용
    • @JoinColumn 애너테이션의 name 애트리뷰트 값에는 테이블 조인 시 사용되는 외래키가 저장되는 컬럼명을 지정

✔︎ 일대다 단방향 연관 관계를 추가하여 양방향 매핑 시

  • 일대다(@OneToMany) 양방향 매핑은 다대일에서 '일'에 해당하는 엔티티에서 사용
    • @OneToMany의 mappedBy 애트리뷰트의 값으로 외래키 역할을 하는 객체의 필드이름을 지정
  • mappedBy의 값으로 무얼 지정해야할 지 모르겠다면⁉️ 🚨
    • 두 객체들 간에 외래키의 역할을 하는 필드는 무엇인가❓
    • 외래키의 역할을 하는 필드는 다(N)에 해당하는 클래스 안에 있다❗️

☞ 다대다 연관 관계

✔︎ 중간에 테이블 하나를 추가해서 두 개의 일대다 관계를 만들어주는 것이 일반적 방법
✔︎ 예시
✔︎ 일대다 단방향 매핑은 외래키를 포함하지 않기 때문에, 두 개의 다대일 단방향 매핑 적용
✔︎ 다대일 매핑을 통해 객체 그래프 탐색으로 원하는 객체를 조회할 수 없을 때 일대다 양방향 매핑 적용
🚨 객체 그래프 탐색

  • 객체를 통해 다른 객체의 정보를 얻을 수 있는 것
  • 예시
findOrder.getMember().getMemberId()

☞ 일대일 연관 관계

✔︎ 다대일 단방향 연관 관계 매핑과 동일
✔︎ @ManyToOne 애너테이션이 아닌 @OneToOne 애너테이션을 사용한다는 차이
✔︎ 양방향 매핑을 추가하는 법도 동일

☞ 엔티티 간의 연관 관계 매핑 권장 방법

✔︎ 일대다 매핑 사용 ❌
✔︎ 제일 먼저 다대일 단방향 매핑부터 적용
✔︎ 다대일 단방향 매핑을 통해 객체 그래프 탐색으로 조회할 수 없는 정보가 있는 경우, 비로소 양방향 매핑 적용

◉ 느낀 점

☞ JPA 기반 엔티티 간 연관 관계를 매핑하는 법에 대해 공부했다. 항상 일대다가 입에 붙었는데 JPA에서는 다대일이 기본이라고 한다. 다대다와 일대일 관련해서는 따로 학습 내용에서보다 실습 과제에서 연습할 수 있었다. mappedBy에 어떤 값을 집어 넣어야하는지, JpaTest를 구현할 때 나 스스로 영속성 컨텍스트에 넣고 테이블에 저장시켜 원하는 값을 조회할 수 있는지 아직 많이 헷갈리고 어려운 게 사실이다. 내가 직접 생각해낸 내용을 코드로 구현하는 연습을 더 해보기로 했다. 하루하루 발전해나가는 사람이 되자.

◉ 내일의 키워드

・ Spring Data JPA을 통한 데이터 액세스 계층 구현
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글