💡 개요
보통 다대일 관계일 때는 다쪽이 연관 관계의 주인이기 때문에 다쪽에 외래 키가 있다.
그렇다면 일대일 관계에선 어떨까?
🛠️ 일대일 관계
위에서 언급한 것 처럼 연관 관계 주인이란 외래 키를 관리하는 테이블이나 엔티티를 말한다.
보통 다 쪽에서 외래 키를 관리하는 데 이유는 다음 예시를 보면 쉽게 알 수 있다.
- 사용자와 게시글의 관계
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
...
}
@Entity
public class Post {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "member_id") // 외래 키
private Member member;
}
그렇다면 일대일 관계에선 어떻게 될까?
대표적인 일대일 관계의 예시는 사용자와 사용자의 프로필 간의 관계이다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@OneToOne
@JoinColumn(name = "profile_id") // 외래 키
private MemberProfile profile;
}
@Entity
public class MemberProfile {
@Id @GeneratedValue
private Long id;
@OneToOne(mappedBy = "mebmer") // 주인이 아님
private Member member;
}
일대일 관계에서 연관 관계의 주인을 선택하는 기준은 다음과 같다.
- 자주 조회하는 방향 : 자주 조회하는 쪽에 외래 키를 두는 것이 성능상 유리
- 삽입/수정 책임 : 수정이 자주 일어나는 쪽에 외래 키를 두는 게 관리하기 쉬움
- 의미상 주인 : 예: MemberProfile은 사용자에 종속적이므로 Member가 외래 키를 가지는 게 자연스러움
🤔 자주 조회하는 방향
자주 조회하는 쪽에 외래 키를 두면 쿼리 최적화나 조인 시 유리하다.
만약 Member ↔ MemberProfile 관계에서 MemberProfile보다 Member를 더 많이 조회한다면, Member 쪽에 MemberProfile의 외래키가 있어야 프로필 정보도 함께 조회하기 편하다.
SELECT *
FROM member m
JOIN member_profile mp ON m.profile_id = mp.id
🤔 삽입/수정 책임
변경이 자주 일어나는 쪽에 외래 키가 있으면, 변경 시 객체 상태만 수정하면 되므로 관리가 쉽다.
Member ↔ MemberProfile 관계에서, 프로필을 자주 바꾸는 경우, Member에 profile_id가 있다면 Member.setProfile() 한 줄로 끝난다.
외래 키를 가진 쪽만 업데이트 하면 되므로 코드가 단순해지고, 상태 관리도 쉬워진다.
🤔 의미상 주인
논리적으로 ‘누가 누구를 소유하는가?’를 기준으로 판단한다.
Member ↔ MemberProfile이라면, 프로필은 회원에 종속되어 있으므로 외래 키를 Member에 두는 게 자연스럽다.
왜냐하면 Member가 없으면 MemberProfile도 당연히 없는 것이기 때문이다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.05.27 - Security Password 가 뭐지 (0) | 2025.05.27 |
---|---|
[개발 일기] 2025.05.26 - 쿼리 파라미터 vs Path Variable (1) | 2025.05.26 |
[개발 일기] 2025.05.24 - REST API의 URL에 대한 개인적인 생각 (0) | 2025.05.24 |
[개발 일기] 2025.05.23 - LocalDateTime vs Long (에포크 타임) (0) | 2025.05.23 |
[개발 일기] 2025.05.22 - JavaScript 얕은 복사? (1) | 2025.05.22 |