[Spring] 연관 관계 Mapping

이연우·2025년 7월 29일

TIL

목록 보기
70/100

➡️ 단방향 연관 관계 (Unidirectional Relationship)란?

  • 한 객체만 다른 객체를 참조하고, 반대 방향으로는 참조하지 않는 관계
    → 설정이 단순함
    → 유지 보수가 쉬움
    → 불필요한 데이터 접근을 방지

🛠️ 1. 데이터베이스 중심의 객체 설계 (FK 직접 매핑)

  • 관계: Tutor(N) → Company(1), N:1 연관 관계

  • 특징:

    • Tutor 엔티티가 FK(companyId)를 직접 필드로 가짐
    • tutor.getCompany()처럼 객체를 참조하듯 사용할 수 없음 (객체 지향적이지 않음)

🗒️ 예시 코드:

@Column(name = "company_id")
private Long companyId;
Tutor tutor = new Tutor("wonuk");
tutor.setCompanyId(company.getId()); // 직접 ID 설정

🧭 2. 객체 지향 중심의 설계 (연관 관계 매핑 사용)

  • 관계: @ManyToOne + @JoinColumn으로 Company를 참조

  • 장점:

    • 객체 지향스럽게 tutor.getCompany() 로 Company 접근 가능
    • 연관 관계를 엔티티 자체로 관리

🗒️ 예시 코드:

@ManyToOne
@JoinColumn(name = "company_id")
private Company company;
Tutor tutor = new Tutor("wonuk");
tutor.setCompany(company); // 객체 자체를 참조

↔️ 양방향 연관 관계 (Bidirectional Relationship)란?

  • 양쪽 엔티티가 서로를 참조하는 구조
    → 양방향 탐색 가능 (tutor → company, company → tutors)
    → 서비스 계층에서 탐색 범위가 유연해짐
    → 관계를 한쪽에서만 설정하면 영속성 컨텍스트의 일관성이 깨짐

🧬 1. 테이블 구조 (변화 없음)
→ 테이블은 방향 개념이 없음
Tutor 테이블에 company_id FK 존재

🧩 2. 객체 구조

Tutor (N:1 연관 관계, 주인)

@ManyToOne
@JoinColumn(name = "company_id")
private Company company;

Company (1:N 연관 관계, 비주인)

@OneToMany(mappedBy = "company")
private List<Tutor> tutors = new ArrayList<>();
  • mappedBy는 연관 관계의 주인이 아님을 의미하며,
    DB에 FK를 직접 매핑하지 않음

🗒️ 예시 코드(양방향 탐색):

// 조회: tutor → company
Company findCompany = findTutor.getCompany();

// 반대 조회: company → tutors
List<Tutor> tutors = findCompany.getTutors();

🧑‍⚖️ 양방향 연관 관계의 주인 (Owner of Relationship)이란?

  • JPA는 양방향 연관 관계에서 누가 외래 키를 관리할지 지정해야 함
  • mappedBy를 통해 비주인(읽기 전용)을 명시
  • 실제 DB의 FK를 가진 쪽이 주인

⚖️ 양방향 연관 관계의 주인

1. TutorCompany를 수정할 때 FK가 수정

2. CompanyTutor를 수정할 때 FK가 수정

  • Tutor가 새로운 Company를 간다면?
    • Tutor의 참조값 Company 수정
    • Company의 참조값 List tutors 수정
    • DB 입장에서는 FK만 수정되면 됨
  • 결국, 둘 중 하나로만 외래 키를 관리해야 함

  1. 두 개의 Entity 중 하나를 연관 관계의 주인으로 설정해야 함

  2. 연관 관계의 주인은 mappedBy 속성을 사용하지 않음

  3. 연관 관계의 주인이 아니라면 mappedBy 속성 사용

  4. 연관 관계의 주인이 아니라면 조회만 가능

  5. 연관 관계의 주인만 외래 키를 관리(등록, 수정)할 수 있음

🎯 주인 설정 규칙

조건설명
✅ 연관 관계의 주인은 mappedBy를 사용하지 않음외래키를 직접 관리
✅ 비주인은 mappedBy를 반드시 설정읽기 전용
✅ 연관 관계 변경 시, 반드시 주인을 통해 해야 함그래야 DB 반영

🧠 왜 FK가 있는 쪽이 주인인가?

  • TutorFK(company_id)를 가짐
  • Company.getTutors()만 수정해도 DB는 변경되지 않음
  • 실제 DB 반영은 Tutor.setCompany(...)를 통해서만 가능

⚠️ 예시: 참조 변경 시

// FK 관리하는 주인만 DB 반영 가능
tutor.setCompany(newCompany); // DB 반영 OK
company.getTutors().add(tutor); // DB 반영 ❌ (mappedBy 측)

🧠 요약 정리

항목설명
주인FK를 가지고 있으며 mappedBy를 사용하지 않음
비주인연관관계 주인이 아니며 mappedBy를 반드시 설정
연관 관계 설정항상 주인을 통해 설정해야 DB에 반영됨
기준항상 FK가 있는 쪽이 주인이 되어야 함

0개의 댓글