Spring
[Spring] 연관관계 유형
Paragon53
2025. 4. 16. 17:01
#연관관계 유형
💡 Spring 정리: 연관관계 유형
📘 개념 정리
관계 유형 설명 예시 실무 사용도 특징/주의점
관계 유형 | 설명 | 예시 | 실무 사용도 | 특징/주의점 |
1. @ManyToOne | 다대일 (N → 1) | 회원 → 팀 | ✅ 가장 많이 씀 | 외래 키는 Many 쪽에 존재 |
2. @OneToMany | 일대다 (1 → N) | 팀 → 회원 | ⛔ 비추 | 주인이 아닌 쪽이 외래 키를 가짐 → 제약 많음 |
3. @OneToOne | 일대일 (1 ↔ 1) | 유저 ↔ 프로필 | ✅ 사용함 | 외래 키 위치에 따라 주인 결정 |
4. @ManyToMany | 다대다 (N ↔ N) | 학생 ↔ 수업 | ⛔ 거의 안 씀 | 중간 테이블을 별도 엔티티로 만드는 게 실무 표준 |
⚠️ 실수 및 주의사항
외래키를 가져야 할 쪽이 누구인가?
소속되는 존재 | 외래 키를 가진다 → 연관관계 주인 | @JoinColumn 있어야 함 |
소속감의 대상 | 반대편 입장 → 연관관계 비주인 | mappedBy만 있어야 함 |
예: Member ↔ Team
- Member는 팀에 “소속되는 존재”
→ 외래 키 team_id를 가짐 → 주인 (@ManyToOne + @JoinColumn) - Team은 그 소속을 “받는 존재”
→ 여러 명의 멤버를 List<Member>로 가짐 → 비주인 (mappedBy = "team")
❗ 근데 이걸 반대로 잘못 매핑하면:
- Team 쪽에도 @JoinColumn 붙고
- 외래 키가 Team 테이블에 생기고
- 이상한 테이블 구조 + JPA 매핑 충돌 발생
✨ 팁 & 인사이트
- @ManyToOne 단방향이 기본값.
→ @JoinColumn 붙이고 쓰면 끝. 깔끔하고 실용적! - @OneToMany도 되긴 하지마
→ mappedBy 없는 단방향은 성능/쿼리 제어 어렵다.
→ 양방향 mappedBy 설정해서 사용하되, 외래 키는 항상 Many 쪽에 있음. - @OneToOne은 둘 중 누가 주인인지만 명확히 하면 문제 없음.
→ @JoinColumn 있는 쪽이 주인!
→ 고민해야할 포인트!- 1:1 연관관계에 있는 객체간 참조 방향을 어떻게할지 잘 결정해야한다!
- 정말 물리적으로 분리되어야하는 테이블인지 고민해봐야한다! (데이터의 생명주기 혹은 사용패턴을 토대로 고민해볼 수 있다)
- @ManyToMany
→ 중간 엔티티(StudentCourse 등) 만들어서 ManyToOne * 2로 쪼개는 게 정석