Question
- 연관관계 맵핑할 때 주로 몇대몇 관계를 사용하는가?
- 양방향 관계에서 연관관계의 주인은 어느 테이블이 가져가야 하는가
- 다대다 관계는 어떻게 해결이 가능한가?
연관관계 맵핑시 고려해야할 점 3가지
- 다중성
- 다대일, 일대다, 일대일, 다대다
- 단방향 양방향
- 테이블은 외래키 하나로 양쪽 조인이 가능하며, 사실상 방향성이라는 개념이 없음
- 객체는 참조용 필드가 있는 쪽으로만 참조 가능
- 연관관계의 주인
- 테이블은 외래 키 하나로 두 테이블의 관계를 맺어 주인이 따로 필요 없음
- 객체는 양방향일 경우 A->B, B->A 처럼 참조가 2군데
- 연관관계의 주인은 외래키를 관리하는 곳이 해야 함
- 주인의 반대편은 외래키에 영향을 주지 않고 단순 조회만 가능
다대일 단방향

- 가장 많이 사용하는 연관관계
- 왠만하면 이 관계를 사용하는게 가장 깔끔하고 안전
다대일 양방향

- 다대일 단방향으로 해결이 안될 때 추가로 사용 가능
- 외래 키가 있는 쪽이 연관관계의 주인이 되어야 함
일대다 단방향

- 다대일과 비슷해보이지만 실제로는 다름
- 일대다 단방향은 일대다에서 "일"이 연관관계의 주인이 됨
- 하지만, 테이블에서는 항상 "다"쪽에 외래키가 있음
- 객체와 테이블 패러다임이 정확하게 일치할 수가 없기 때문에, 반대편 테이블의 외래 키를 관리해야 하는 특이한 구조가 생김
- @JoinColumn을 꼭 사용해야 하며, 그렇지 않을 경우 조인 테이블 방식을 사용하게 됨(중간에 테이블 두는 구조)
- 연관관계 정리를 위해 추가로 UPDATE SQL을 실행함
- 구조가 복잡해 왠만하면 다대일을 사용해야 함
일대다 양방향
- 공식적으론 존재하지 않는 방법
- @JoinColumn(insertable=false, updatetable=false)
- 읽기 전용 필드를 사용해 양방향처럼 사용하는 방법
- 다대일 양방향을 사용하자
일대일 단방향

- 주 테이블과 대상 테이블이 같은 관계라 둘 중 아무나 외래 키 선택 가능
- 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가(1:1이기 때문에)
- 다대일 단방향 맵핑과 유사하게 동작
일대일 양방향
- 다대일 양방향 맵핑처럼 외래키가 있는 곳이 연관관계의 주인
- 반대편은 mappedBy 적용
다대다

- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음
- 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 함
- @ManyToMany를 사용하면 자동으로 중간 테이블을 만들어서 다대다 관계처럼 만들어주지만 좋은 방법이 아니므로 사용하지 말 것
- 결국 중간에 있는 테이블을 따로 만들어 주고, 다대일 관계 두 개를 만들어서 관리해야 함
'김영한의 ORM 표준 JPA 프로그래밍(기본편)' 카테고리의 다른 글
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 프록시, 지연로딩, Cascade, 고아 객체 (1) | 2025.02.07 |
|---|---|
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 상속관계 맵핑과 - @MappedSuperclass (1) | 2025.02.06 |
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계 단방향 맵핑, 양방향 맵핑 (1) | 2025.02.05 |
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계맵핑과 Primary Key (2) | 2025.02.05 |
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 영속성 컨텍스트와 플러시 (2) | 2025.02.05 |