[JPA] JPA에서 관계를 매핑할 때 사용하는 어노테이션
JPA에서 관계를 매핑할 때 사용하는 어노테이션들에는 @OneToMany, @OneToOne, @ManyToOne, @ManyToMany가 있습니다. 이 어노테이션들은 엔티티 간의 관계를 정의하는 데 사용되며 데이터베이스 설계와 객체 모델 간의 연결을 제공합니다.
1. @OneToOne
의미: 두 엔티티 간의 1:1 관계를 나타냅니다.
특징:
- 주로 @JoinColumn을 사용해 외래 키를 설정합니다.
- 양방향 관계를 설정하려면 양쪽 엔티티에 어노테이션을 추가하고 mappedBy 속성을 사용합니다.
예시:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "profile_id") // 외래 키
private Profile profile;
}
@Entity
public class Profile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String bio;
}
2. @OneToMany
의미: 하나의 엔티티가 여러 개의 다른 엔티티와 관계를 맺습니다.
특징:
- mappedBy 속성을 사용하여 양방향 관계를 설정합니다.
- 기본적으로 Lazy Loading(지연 로딩)을 사용합니다.
- 관계를 설정할 때 List나 Set 컬렉션을 주로 사용합니다.
예시:
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department") // 양방향 관계
private List<Employee> employees = new ArrayList<>();
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id") // 외래 키
private Department department;
}
3. @ManyToOne
의미: 여러 엔티티가 하나의 엔티티와 관계를 맺습니다.
특징:
- 다대일 관계를 설정하며, 외래 키가 이 엔티티에 생성됩니다.
- 주로 @JoinColumn을 사용합니다.
예시:
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "customer_id") // 외래 키
private Customer customer;
}
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
4. @ManyToMany
의미: 두 엔티티 간의 다대다 관계를 나타냅니다.
특징:
- 기본적으로 조인 테이블을 생성하여 관계를 관리합니다.
- @JoinTable을 사용해 조인 테이블의 이름과 컬럼을 지정할 수 있습니다.
예시:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course", // 조인 테이블 이름
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses = new ArrayList<>();
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany(mappedBy = "courses")
private List<Student> students = new ArrayList<>();
}
관계 요약표
어노테이션 | 관계 | 외래 키 위치 | 대표적 사용 사례 |
@OneToOne | 1:1 | 주 엔티티에 생성 | 사용자와 프로필, 주문과 결제 정보 등 |
@OneToMany | 1:N | 다쪽 엔티티에 생성 | 부서와 직원, 카테고리와 상품 등 |
@ManyToOne | N:1 | N쪽 엔티티에 생성 | 주문과 고객, 댓글과 게시글 등 |
@ManyToMany | N:N | 조인 테이블 생성 | 학생과 강의, 태그와 게시글 등 |
관계 매핑 시 주의점
1. 양방향 관계
- 항상 한쪽은 mappedBy를 설정해 주인 엔티티를 명확히 합니다.
- 양방향 관계는 필요할 때만 설정하세요. 단방향 관계가 더 단순합니다.
2. 지연 로딩(Lazy Loading)
- JPA는 기본적으로 관계를 Lazy로 로드합니다.
- 성능 문제를 고려해 Fetch 전략을 적절히 설정하세요.
3. 조인 테이블 관리
- 다대다 관계에서 생성되는 조인 테이블의 이름이나 컬럼 명을 명확히 정의하는 것이 좋습니다.