들어가기 앞서서 키워드 정리
엔티티들은 대부분 다른 엔티티와의 연관관계를 가지고 있다. 예를 들면, 주문 엔티티는 상품 엔티티와 연관이 있고 상품 엔티티는 카테고리, 재고 등과 연관이 되어있다.
ORM과 관계형 DB의 차이에서 정리한 적 있는데 객체와 테이블은 관계를 맺는 방식이 다르다. 객체는 참조를 통해 관계를 맺고 테이블은 외래키를 이용하여 관계를 맺는다.
이 둘은 완전히 다른 특징을 가지기 때문에 이것을 ORM 맵핑으로 처리하는 것은 가장 어려운 부분이다.
이번 [연관관계 매핑 기초]를 통해 객체의 참조와 테이블의 외래 키를 매핑하는 방법을 학습하는 것이 목표이다.
핵심 키워드
- 방향(Direction): 단방향과 양방향이 있다.
- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
- 연관관계의 주인(owner): 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다.
단방향 연관관계
단방향 연관관계를 설명하기 위한 시나리오이다.
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다.
다음은 다대일 관계에 대한 관계를 객체 지향 모델링(객체의 연관관계 사용)을 나타낸 그림이다.
해당 관계를 보면 알 수 있듯이 회원은 팀 객체를 참조하고 테이블은 외래 키를 이용하여 연관매핑을 하는 것을 알 수 있다.
객체 연관 관계
아래 예제코드는 JPA를 활용하여 회원과 팀을 매핑한 코드이다.
@Entity
public class Member {
@Id
@Colunm(name = "MEMBER_ID")
private String id;
private String username;
//연관관계 매핑
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
//연관관계 설정
private void setTeam(Team team) {
this.team = team;
}
//Getter, Setter
}
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
//Getter, Setter
}
회원 객체는 Member.team 필드로 Team 객체와 연관관계를 맺는다. 이러한 관계를 회원 객체와 팀 객체는 단방향 관계로 매핑되어 있다고 한다.
단방향 관계는 회원 입장에서는 Member.team 필드를 통해 팀의 정보를 알 수 있지만, 반대로 팀 객체는 회원에 대한 정보를 확인할 수 없다.
member -> team 조회 시 member.getTeam()으로 가능하며,
team -> member는 접근하는 필드가 존재하지 않아 불가능하다.
테이블 연관관계
위 이미지를 참고하면 테이블 TEAM_ID라는 외래키가 회원 테이블에 매핑되어 있다. 해당 외래키는 팀 테이블의 식별자로 구성되어 있어 이 경우 양방향 관계가 매핑이 된다.
회원 테이블에서는 TEAM_ID라는 외래키로 팀 테이블을 조회할 수 있고, 반대로 팀 테이블을 본인의 식별자로 회원 테이블을 조인하여 조회할 수 있다.
회원 테이블을 기준으로 조회
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
팀 테이블을 기준으로 조회
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
여기서 알 수 있는 객체와 테이블의 차이
객체 참조를 통한 연관관계는 언제나 단방향이다. 결국 이 말은 객체에서 테이블과 같이 양방향 구성을 하기 위해선 반대쪽 클래스에도 필드를 추가하여 참조를 추가매핑해줘야 한다.
이렇게 서로 참조하게 만드는 것을 양방향 연관관계라고 한다. 하지만 정확히 말하면 양뱡향 관계가 아니다 서로 다른 단방향 관계 2개이다.
반면에 테이블은 외래 키 하나로 양방향을 구성할 수 있는 차이가 있다.
정리
- 객체는 참조(주소)로 연관관계를 맺는다.
- 테이블은 외래 키로 연관관계를 맺는다.
객체는 연관데이터 조회 시 참조(a.getB())를 사용하지만 테이블은 조인을 활용한다.
- 참조는 사용하는 객체의 연관관계는 단방향이다.
- 외래키를 사용하는 테이블의 연관관계는 양방향이다.
궁긍적으로, 객체를 양방향으로 구성하기 위해선 단방형 연관관계를 2개를 만들어야 한다.
참조
김영한님의 인프런 강의와 책으로 참조하였습니다.
https://www.yes24.com/Product/Goods/19040233
자바 ORM 표준 JPA 프로그래밍 - 예스24
자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA 기초 이론과 핵심 원리, 그리고
www.yes24.com
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com
'Framework > JPA' 카테고리의 다른 글
[JPA] 양방향 연관관계와 연관관계의 주인(with mappedBy) (0) | 2024.04.26 |
---|---|
[JPA] 객체 관계 매핑에 필요한 @JoinColum 속성 알아보기 (0) | 2024.04.26 |
[JPA] 엔티티 매핑 - 기본 키 매핑 (0) | 2024.03.15 |
[JPA] 엔티티 매핑 - 필드와 컬럼 매핑 (0) | 2024.03.14 |
[JPA] 엔티티 매핑 - 데이터베이스 스키마 자동 생성 (0) | 2024.03.14 |