[Spring] 일대일 연관관계

이연우·2025년 8월 19일

TIL

목록 보기
84/100

➡️ 1:1 단방향 연관관계

🖼️ 그림으로 이해

Tutor(1) ────▶ Address(1)
  • 두 엔티티가 @OneToOne으로 연결되어 한쪽에서만 상대방을 참조하는 관계
  • 외래 키(FK)의 주인을 선택할 수 있음
  • 반드시 UNIQUE 제약 조건을 걸어야 함 → 그래야 1:1이 보장

💻 코드 예시

@Entity
@Table(name = "tutor")
public class Tutor {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToOne
    @JoinColumn(name = "address_id", unique = true) // UNIQUE 제약조건
    private Address address;
}
  • TutorAddress를 참조
  • Tutor 테이블에 address_id FK 컬럼이 생성됨

⚠️ 주의

  • 대상 테이블(Address)에 FK를 두고 관리하는 건 JPA에서 지원하지 않음
    → FK는 반드시 연관관계 주인이 관리해야 함

↔️ 1:1 양방향 연관관계

🖼️ 그림으로 이해

Tutor(1) ◀───▶ Address(1)
  • 서로 참조가 가능한 구조로, N:1 양방향과 비슷함
  • FK는 Tutor가 가짐 (주인)
  • AddressmappedBy를 통해 읽기 전용으로 Tutor를 참조

💻 코드 예시

@Entity
@Table(name = "address")
public class Address {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToOne(mappedBy = "address") // 읽기 전용
    private Tutor tutor;
}

📚 대상 테이블에 외래 키 양방향

👉 즉, TutorFK를 관리하고 Address단순히 참조만 함


💡 외래 키 위치 선택

  • 1:1 관계에서는 외래 키를 어느 쪽에 두어도 되지만,
    선택에 따라 장단점이 달라짐

🔹 주 테이블(FK 보유)
→ 예: Tutor 테이블이 address_id를 FK로 가짐

✅ 장점

  • Tutor만 조회해도 Address 바로 접근 가능
  • 객체지향적으로 다루기 편리
  • 성능상 이점이 있음 (JOIN 줄어듦)

❌ 단점

  • Address 없는 Tutor일 경우 FK에 null 들어감 → 무결성 깨짐
  • 삭제 시 FK 관리 신경 써야 함

🔹 대상 테이블(FK 보유)
→ 예: Address 테이블이 tutor_id를 FK로 가짐

✅ 장점

  • DB 무결성 보장 (Address 없으면 Tutor도 FK가 없음)
  • 구조 변경에도 안정적

❌ 단점

  • 조회 성능 떨어짐 (항상 JOIN 필요)
  • 매핑 복잡해짐
  • 심지어 JPA에서는 지연 로딩으로 설정해도 즉시 로딩됨 (중요 ✔️)

📄 요구 사항 변경 시
→ 예: 한 Tutor가 여러 Address를 가질 수 있게 바뀐다면?

  • 기존 1:1UNIQUE 제약 조건만 제거하면 N:1 관계로 자연스럽게 변경 가능
  • 따라서 처음 설계할 때 FK 위치를 잘 잡아야 나중에 유연하게 바꿀 수 있음

🧠 요약 정리

구분단방향 1:1양방향 1:1
🔗 참조 방향한쪽만 참조양쪽 모두 참조
🔑 연관관계 주인FK 보유한 쪽FK 보유한 쪽(Tutor)
📂 FK 위치주 테이블 or 대상 테이블 선택 가능FK는 주인이 관리, 반대쪽은 mappedBy
장점단순하고 직관적양방향 탐색 가능, 유연성 ↑
단점반대쪽 탐색 불가관리 복잡, FK 위치 선택 중요
실무 팁보통 주 테이블에 FK 두는 방식 선호FK 주인은 반드시 한쪽으로만 관리

0개의 댓글