처음 엔티티를 만들고 JPA를 통해 DB와 연동을 할 때, @OneToMany 와 ManyToOne 을 적용하면서 힘들었던 기억이 난다.
이 부분에서 가장 어려웠던 부분은 이전까지는 잘 되던 프로젝트가 엔티티 간의 연관관계를 맺고 다시 실행하니 갑자기 컴파일 오류가 발생했던 것이었다.
엔티티 생성만 하는 것은 문제가 없었지만, 값을 가져올 때 문제가 생겼다.
이는 @OneToMany 의 기본 FetchType 이 LAZY이기 때문에 발생한 것이다.
해당 부분에 대해서는 이전에 Proxy 포스팅에서 정리해두었다.
그 외에도 @OneToMany 를 달아줄 때 옵션으로 달았던 mappedBy나, 연관관계와 연관관계의 주인 등 헷갈리는 개념들이 많이 등장했다.
그래서 이번에는 연관관계와 mappedBy 옵션에 대해서 정리해보고자 한다.
연관관계에 대해 정리하기에 앞서, 간단하게 엔티티의 정의를 먼저 살펴보자.
@Entity 어노테이션을 사용하여 정의‼️ Tip
1) mappedBy 로 필드를 지정하지 않을 경우
2) mappedBy 로 필드를 지정할 경우
@Entity
public class User {
// 생략
@OneToOne
@JoinColumn // @JoinColumn은 필드명이 테이블과 같다면 생략 가능
private Profile profile;
}
@Entity
public class Profile {
// 생략
@OneToOne(mappedBy = "profile")
private User user;
}
mappedBy 옵션으로 연관관계 주인의 외래 키 필드명인 profile을 지정@Entity
public class Team {
// 생략
@OneToMany(mappedBy = "team")
private List<Member> members;
}
public class Member {
// 생략
@ManyToOne
private Team team;
}
mappedBy 옵션으로 지정해준 team이 외래 키를 관리@Entity
public class Memeber {
// 생략
@ManyToOne
private Team team;
}
@Entity
public class Team {
// 생략
}
@Entity
public class Student {
// 생략
@ManyToMany
private List<Course> courses;
}
@Entity
public class Course {
// 생략
@ManyToMnay(mappedBy = "course")
private List<Student> students
}
mappedBy 로 지정된 course 필드가 있는 Student 클래스가 연관관계의 주인@ManyToMany의 경우 항상 중간 테이블을 생성Course 는 중간 테이블의 참조만 가능할 뿐, 갱신 등의 작업은 진행할 수 없음참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/