Spring

[Spring] 연관관계 유형

Paragon53 2025. 4. 16. 17:01

minecraft-font

#연관관계 유형

💡 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:1 연관관계에 있는 객체간 참조 방향을 어떻게할지 잘 결정해야한다!
    2. 정말 물리적으로 분리되어야하는 테이블인지 고민해봐야한다! (데이터의 생명주기 혹은 사용패턴을 토대로 고민해볼 수 있다)
  • @ManyToMany
    → 중간 엔티티(StudentCourse 등) 만들어서 ManyToOne * 2로 쪼개는 게 정석