반응형
1:1, 1:N, N:M 관계란?
- 두 엔티티가 서로 관계를 맺을 때, 1:1, 1:N, N:M 형태의 관계를 맺을 수 있음
- 1:1 (일대일) 관계 : 국가-수도, 남편-아내 등과 같은 관계
- 한 국가가 여러 수도를 가질 수 없고 한 도시는 여러 국가의 수도일 수 없음
- 1:N (일대다) 관계 => 부모-자식, 학생-학교 등과 같은 관계
- 한 부모는 여러 자식을 가질 수 있지만 자식은 여러 부모를 가질 수 없음
- N:M (다대다) 관계 => 고객-상품, 학생-학원 등과 같은 관계
- 한 고객은 여러 상품을 시킬 수 있고, 한 상품은 여러 고객에게 시켜질 수 있음
연관관계 매핑이란?
- 객체의 참조와 테이블의 외래키를 매핑하는 것
- ex) X팀에 선수 A, B, C가 속한 상황
- Java에서의 관점
- Team Class, Player Class 생성
- Team에 List<Player> players 이런 식의 리스트 생성 후 Player A, B, C를 넣어주면 됨
- 반대로 Player에서는 Team team 이런 식의 객체 생성 후 Team X를 넣어주면 됨
- DB에서의 관점
- 하지만 DB에서는 객체 자체를 넣을 수 없음
- 따라서 이런 상황에서 DB에 값을 넣기 위해서 연관관계 주인과 방향, 다중성(1:1, 1:N, N:M)을 정해줘야 함
- 위에서 가정한 상황에서는 Player Table에 team_id 라는 column을 만들어 Team X의 id를 넣는 방식 등을 사용할 수 있음
- Java에서의 관점
방향
- 연관관계 매핑 시에는 아래와 같이 2가지 방향이 존재
- 단방향 매핑 : 하나의 Entity만 다른 Entity를 참조
- 양방향 매핑 : 두개의 Entity가 서로 참조
- 방향은 객체 관계에서만 존재하고, 테이블은 항상 양방향
- ex) X팀에 선수 A, B, C가 속한 상황
- 이 상황에서 단방향 매핑을 한다면 Team X에 Player A, B, C를 넣어주거나 Player A, B, C에 각각 Team X를 넣어줌
- 이 상황에서 양방향 매핑을 한다면 Team X에 Player A, B, C를 넣어주고 Player A, B, C에도 각각 Team X를 넣어줌
- 양방향 매핑 시 Team -> Player 조회, Player -> Team 조회가 모두 가능하다는 장점이 있지만 더 많은 연관관계를 맺게 되어서 더 복잡해 질 수 있다는 단점도 존재
연관관계 주인
- 양방향 연관관계로 매핑 시 연관관계 주인을 정해야 함
- 연관관계를 맺는 두 객체 중 한 객체를 연관관계 주인으로 지정
- 연관관계의 주인만이 외래키 관리 (등록, 수정)
- 주인은 mappedBy 속성 사용 X
- @JoinColumn을 통해 주인이 아닌 객체의 id를 FK로 받을 때 사용될 column명 지정
- 주인이 아닌 쪽은 읽기만 가능
- 주인이 아닌 쪽에서 mappedBy 속성 사용
- 보통 연관관계 주인은 외래키가 있는 객체를 주인으로 지정
- ex) X팀에 선수 A, B, C가 속한 상황
- 이 상황에서 Team과 Player가 양방향 매핑을 했다고 가정
- 연관관게 주인을 정해야 함
- Team Table에 Player의 id들을 넣는 것 보다는 Player에 Team id를 넣어 주는것이 더 좋음 => Player Table에 team_id column 생성
- 따라서 이 상황에서는 Player가 연관관계 주인이 됨
예제
반응형
'Spring Boot > 문법 정리' 카테고리의 다른 글
[Spring Boot] 연관관계 매핑 - 1:1 관계 예제 (+ @PostConstruct를 사용한 초기 데이터 생성) (0) | 2023.01.01 |
---|---|
[Spring Boot] 연관관계 매핑 - 1:N 관계 예제 (+FetchType.LAZY) (0) | 2022.12.31 |
[Spring Boot] Swagger 3.0 적용 (0) | 2022.07.09 |
[Spring Boot] JpaRepository를 사용한 CRUD 예제 (0) | 2022.07.08 |
[Spring Boot] 관계형 DB - 순환 참조 해결 방법 ( DTO활용 방법 등 ) (0) | 2022.07.03 |