해당 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍을 참고하여 작성한 글입니다.
✅ 연관관계란?
- 연관관계란 두 도메인(객체, 테이블)이 서로 논리적인 의미를 갖고 양쪽을 참조하는 관계를 뜻한다.
- JPA에서의 연관관계는 데이터베이스의 테이블 간 관계를 객체지향 프로그래밍의 클래스 간 관계로 매핑하는 것을 의미한다.
- 객체지향 프로그램에서 객체들이 연관관계를 맺는 방법과 데이터베이스에서 테이블들이 연관관계를 맺는 방법이 다른데, 이 간극을 채워주기 위한 기술이 JPA이다.
✅ 연관관계가 필요한 이유
위와 같은 구조에서 연관관계가 없다면 찾고자 하는 회원의 팀을 찾는 코드는 다음과 같다.
Member findMember = em.find(Member.class, member.getId()); //찾고자 하는 member
Long findTeamId = findMember.getId(); //해당 member의 id
Team findTeam = em.find(Team.class, findTeamId); //해당 id로 찾고자 하는 member의 team
연관관계가 없다면 member의 team을 가져오는 과정에서 member을 추출하고, 해당 member의 id를 추출하고, 해당 id를 통해 찾고자 하는 member의 team을 가져오게 된다. 즉, 찾고자 하는 회원의 팀을 가져오기 위해 많은 비용이 들고, 결론적으로 객체지향스럽지 않은 코드가 된다.
- 객체를 테이블에 맞춰 데이터 중심으로 모델링 하면 협력 관계를 만들 수 없다.
- 테이블은 외래 키로 조인을 사용하여 연관된 테이블을 찾는다.
- 객체는 참조를 사용하여 연관된 객체를 찾는다.
협력 관계: 객체 지향 프로그래밍에서는 객체들이 서로 협력하여 작업을 수행하는데, 이때 객체들이 서로 메시지를 주고받거나 기능을 호출하며 협력하는 것을 말한다.
✅ 엔티티 연관관계 매핑 시 고려할 3가지
- 다중성
- 다대일(@ManyToOne)
- 일대다(@OneToMany)
- 일대일(@OneToOne)
- 다대다(@ManyToMany): 실무에서 거의 사용 X
- 단방향, 양방향
- 단방향 관계: 객체 관계에서 한쪽만 참조하는 것
- 양방향 관계: 객체 관계에서 양쪽이 서로 참조하는 것
테이블은 외래 키 하나로 조인을 사용해서 양방향으로 쿼리가 가능하므로 사실상 방향이라는 개념이 없지만, 반면 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있다.
- 연관관계의 주인
- 연관관계의 주인: 두 객체 연관관계 중 하나를 정해서 데이터베이스 외래 키를 관리하는 것
- 규칙
- 외래 키를 가진 테이블과 매핑한 엔티티가 외래키를 관리하는 것이 효율적이므로, 이곳을 연관관계 주인으로 선택한다.
- 주인이 아닌 방향은 외래 키를 변경할 수 없고 읽기만 가능하다.
- 연관관계 주인이 아니면 mappedBy 속성을 사용하여 연관관계의 주인 필드 이름을 값으로 입력해야 한다.
테이블은 외래 키 하나로 두 테이블의 연관관계를 맺지만, 반면 객체 양방향 관계는 참조가 2군데이다. (A->B, B->A)
📍 참고
'Programming > JPA' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 - 엔티티(Entity) 매핑 (6) (1) | 2024.07.25 |
---|---|
[JPA] 단방향 연관관계와 양방향 연관관계 - 엔티티(Entity) 매핑 (5) (1) | 2024.07.25 |
[JPA] 데이터베이스 스키마 자동 생성 (0) | 2024.07.25 |
[JPA] 필드와 컬럼 매핑 - 엔티티(Entity) 매핑 (3) (0) | 2024.07.25 |
[JPA] 기본 키 매핑 - 엔티티(Entity) 매핑 (2) (0) | 2024.07.25 |