[개발 일기] 2025.05.25 - 일대일 관계에서 연관 관계의 주인

2025. 5. 25. 18:41·개발 일기

💡 개요

 

보통 다대일 관계일 때는 다쪽이 연관 관계의 주인이기 때문에 다쪽에 외래 키가 있다.

 

 

그렇다면 일대일 관계에선 어떨까?

 

 

 

🛠️ 일대일 관계

 

위에서 언급한 것 처럼 연관 관계 주인이란 외래 키를 관리하는 테이블이나 엔티티를 말한다.

 

 

보통 다 쪽에서 외래 키를 관리하는 데 이유는 다음 예시를 보면 쉽게 알 수 있다.

 

  • 사용자와 게시글의 관계
@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
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.05.27 - Security Password 가 뭐지
  • [개발 일기] 2025.05.26 - 쿼리 파라미터 vs Path Variable
  • [개발 일기] 2025.05.24 - REST API의 URL에 대한 개인적인 생각
  • [개발 일기] 2025.05.23 - LocalDateTime vs Long (에포크 타임)
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.05.25 - 일대일 관계에서 연관 관계의 주인
상단으로

티스토리툴바