Spring/Spring JPA

[JPA] JPA에서 관계를 매핑할 때 사용하는 어노테이션

개발자잡 2024. 11. 27. 17:02

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. 조인 테이블 관리
- 다대다 관계에서 생성되는 조인 테이블의 이름이나 컬럼 명을 명확히 정의하는 것이 좋습니다.