일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 스프링 부트
- Java
- 웹 서버
- spring cloud
- mysql
- 데이터베이스
- 배포
- 스프링 배치
- vm
- CS
- 스프링
- 영속성 컨텍스트
- Spring Security
- ORM
- 백엔드
- 도커
- spring boot
- HTTP
- 스프링 시큐리티
- spring batch
- Container
- 컨테이너
- web server
- CI/CD
- JPA
- virtualization
- Spring
- 가상화
- computer science
- 자바
- Today
- Total
개발 일기
[섹션 6] 다양한 연관관계 매핑 본문
연관관계 매핑시 고려사항 3가지
모두 앞서 다룬 내용들이다. 그래도 한번 정리해보자면,
- 다중성
다대일(@ManyToOne), 일대다(@OneToMany), 일대일(@OneToOne), 다대다(@ManyToMany) - 단방향, 양방향
테이블은 외래 키 하나로 양쪽 조인이 가능하여 방향이라는 개념이 없지만 객체는 참조용 필드가 있는 쪽으로만 참조 가능하다. 그래서 한쪽만 참조하면 단방향 양쪽으로 서로 참조하면 양방향이다. - 연관관계의 주인
객체 양방향 관계는 참조가 2군데 있어서 둘 중 테이블의 외래키를 관리할 곳을 지정해야하는데 이때 연관관계의 주인은 외래 키를 관리(등록 및 조회 등)하는 참조가 되고 주인의 반대편은 외래 키에 영향을 주지 않고 단순 조회만 가능하다.
다대일 [N:1]
다대일 단방향
앞서 다뤘던 것들로
다대일의 반대가 일대다 이다.
다대일 양방향
외래키가 있는 곳이 연관관계의 주인
양쪽이 서로 참조 되도록 개발.
!! 일대다를 쓰지 말고 다대일 단/양방향 매핑을 사용하자 !!
일대일 [1:1]
@OneToOne
일대일 관계는 그 반대도 일대일이다.
주 테이블이나 대상 테이블 중에 외래 키 선택 가능하다. 즉, 어디에다가 둬도 상관 없다는 뜻이다.
이때, 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가되어야 한다.
아래에 회원이 하나의 Locker(사물함)을 가질때를 회원 한명 당 하나의 사물함을 가진다고 가정하는 예시이다.
주 테이블에 외래 키
주 테이블에 FK 단방향
다대일 단방향 매핑과 유사하며 member 테이블에 locker_id인 FK를 들고있으며 이때 UNIQUE 제약조건을 통해 일대일 대응을 이룰 수 있다.
주 테이블에 FK 양방향
다대일 양방향 매핑과 같이 외래 키가 있는 곳이 연관관계의 주인이 되고 그 반대편에 mappedBy를 적용해 준다.
대상 테이블에 외래 키
대상 테이블에 FK 단방향
단방향 관계는 JPA 지원X
대상 테이블에 FK 양방향
사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같음
일대일 관계에서 FK를 맴버, 락커 중 누가 들고 있는게 나을까?
당연히 무조건적인 정답은 없다.
만약 당장에는 일대일이지만 시간이 흘러 한사람이 2개 이상의 락커를 들고 있을 수 있다고 요구사항이 변경될 수 있는데 이 경우 locker 테이블에서 FK를 관리하는게 유리하지만
당장에 성능을 따지면 맴버에서 FK를 관리하는 것이 유리하다. 왜냐하면 웬만한 비즈니스 로직에서 멤버를 조회하는 경우가 대부분이기 때문에 맴버 조회하면 쿼리 한방으로 락커에 대한 정보까지 끌어올 수 있기 때문에 유리한 것이다.
위와 같이 각각에 Trade-Off가 존재한다.
그래서 영한님은 너무 먼 미래를 생각하지않고 당장의 성능을 우선 시 한다고 한다.
다대다 [N:M]
객체는 컬렉션을 사용해서 객체 2개로 다대다 관계가능
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함
- 단방향으로 하려면 한쪽에서 @ManyToMany 사용하고 @JoinTable로 연결 테이블을 지정하여 다대다를 이룰 수 있다. 양방향으로 하려면 반대쪽에도 똑같이 해주면 된다.
- 이러한 방법은 편리해보이지만 실무에서는 사용하지 않는다. 단순히 연결이 문제가 아니라 주문시간, 수량 같은 데이터가 들어올 수 있다.
- 그렇기 때문에 연결 테이블용 엔티티 추가(연결 테이블을 엔티티로 승격)
- @ManyToMany -> @OneToMany, @ManyToOne
실전
'Back-End > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[섹션 8] 프록시와 연관관계 관리 (0) | 2024.04.08 |
---|---|
[섹션 7] 고급 매핑 (0) | 2024.04.02 |
[섹션5] 연관관계 매핑 기초 (0) | 2024.04.01 |
[섹션4] 엔티티 매핑 (1) | 2024.03.25 |
[섹션3] 영속성 관리 - 내부 동작 방식 (0) | 2024.03.25 |