➡️ 단방향 연관 관계 (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는 연관 관계의 주인이 아님을 의미하며,🗒️ 예시 코드(양방향 탐색):
// 조회: tutor → company
Company findCompany = findTutor.getCompany();
// 반대 조회: company → tutors
List<Tutor> tutors = findCompany.getTutors();
🧑⚖️ 양방향 연관 관계의 주인 (Owner of Relationship)이란?
- JPA는 양방향 연관 관계에서 누가 외래 키를 관리할지 지정해야 함
mappedBy를 통해 비주인(읽기 전용)을 명시- 실제 DB의 FK를 가진 쪽이 주인
⚖️ 양방향 연관 관계의 주인

1. Tutor의 Company를 수정할 때 FK가 수정
2. Company의 Tutor를 수정할 때 FK가 수정
Tutor가 새로운 Company를 간다면?Tutor의 참조값 Company 수정Company의 참조값 List tutors 수정
두 개의 Entity 중 하나를 연관 관계의 주인으로 설정해야 함
연관 관계의 주인은 mappedBy 속성을 사용하지 않음
연관 관계의 주인이 아니라면 mappedBy 속성 사용
연관 관계의 주인이 아니라면 조회만 가능
연관 관계의 주인만 외래 키를 관리(등록, 수정)할 수 있음
🎯 주인 설정 규칙
| 조건 | 설명 |
|---|---|
✅ 연관 관계의 주인은 mappedBy를 사용하지 않음 | 외래키를 직접 관리 |
✅ 비주인은 mappedBy를 반드시 설정 | 읽기 전용 |
| ✅ 연관 관계 변경 시, 반드시 주인을 통해 해야 함 | 그래야 DB 반영 |
🧠 왜 FK가 있는 쪽이 주인인가?
Tutor가 FK(company_id)를 가짐Company.getTutors()만 수정해도 DB는 변경되지 않음Tutor.setCompany(...)를 통해서만 가능⚠️ 예시: 참조 변경 시
// FK 관리하는 주인만 DB 반영 가능
tutor.setCompany(newCompany); // DB 반영 OK
company.getTutors().add(tutor); // DB 반영 ❌ (mappedBy 측)
🧠 요약 정리
| 항목 | 설명 |
|---|---|
| 주인 | FK를 가지고 있으며 mappedBy를 사용하지 않음 |
| 비주인 | 연관관계 주인이 아니며 mappedBy를 반드시 설정 |
| 연관 관계 설정 | 항상 주인을 통해 설정해야 DB에 반영됨 |
| 기준 | 항상 FK가 있는 쪽이 주인이 되어야 함 |