Spring Data JPA에서는 객체와 데이터베이스 간의 관계를 매핑하기 위해 다양한 애노테이션을 제공한다. 이 애노테이션은 테이블 간의 관계(1:1, 1:N, N:1, N:N)를 엔티티 클래스를 통해 정의할 수 있도록 돕는다. 각각의 애노테이션과 함께 자주 사용되는 @GeneratedValue, @JoinColumn 등의 애노테이션도 설명한다.
1. @ManyToOne
@ManyToOne은 여러 엔티티가 하나의 엔티티와 연결될 때 사용한다. 예를 들어, 여러 개의 주문(Order)이 하나의 사용자(User)와 연결되는 경우이다. 데이터베이스에서는 외래 키(Foreign Key)를 통해 관계를 설정한다.
예시: 사용자와 주문
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id") // 외래 키 설정
private User user;
private String productName;
// Getters and Setters
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
- @ManyToOne은 Order 엔티티에서 User 엔티티로 N:1 관계를 정의한다.
- @JoinColumn은 데이터베이스에서 외래 키를 매핑하는 데 사용되며, 여기서는 user_id를 외래 키로 사용한다.
- 한 명의 사용자가 여러 개의 주문을 가질 수 있다.
2. @OneToMany
@OneToMany는 한 엔티티가 여러 개의 엔티티와 연결될 때 사용한다. 이는 @ManyToOne의 반대 관계로, 예를 들어 한 명의 사용자가 여러 개의 주문을 가질 수 있는 경우를 나타낸다.
예시: 사용자와 주문
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user") // Order 엔티티의 user 필드와 매핑
private List<Order> orders = new ArrayList<>();
// Getters and Setters
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id") // 외래 키 설정
private User user;
private String productName;
// Getters and Setters
}
- @OneToMany는 User 엔티티에서 Order 엔티티로 1:N 관계를 정의한다.
- mappedBy 속성은 관계의 주인을 지정하며, 여기서는 Order 엔티티의 user 필드가 관계의 주인이다.
- 한 명의 사용자는 여러 개의 주문을 가질 수 있으며, User 엔티티에서 Order 리스트를 통해 주문 데이터를 참조할 수 있다.
3. @OneToOne
@OneToOne은 하나의 엔티티가 다른 하나의 엔티티와 연결될 때 사용한다. 예를 들어, 한 명의 사용자가 하나의 프로필(Profile)을 가질 때 사용된다.
예시: 사용자와 프로필
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "profile_id") // 외래 키 설정
private Profile profile;
// Getters and Setters
}
@Entity
public class Profile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String bio;
private String profileImage;
// Getters and Setters
}
- @OneToOne은 User 엔티티와 Profile 엔티티 간의 1:1 관계를 정의한다.
- @JoinColumn은 User 테이블에서 Profile 테이블과의 관계를 설정하며, 외래 키로 profile_id를 사용한다.
- 한 명의 사용자가 하나의 프로필만을 가질 수 있다.
4. @ManyToMany
@ManyToMany는 여러 엔티티가 서로 다수와 연결될 때 사용한다. 예를 들어, 여러 학생(Student)이 여러 강의(Course)에 등록될 수 있는 경우를 나타낸다. 중간 테이블을 생성해 관계를 관리한다.
예시: 학생과 강의
@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<>();
// Getters and Setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany(mappedBy = "courses") // 관계의 주인을 Student로 지정
private List<Student> students = new ArrayList<>();
// Getters and Setters
}
- @ManyToMany는 Student 엔티티와 Course 엔티티 간의 N:N 관계를 정의한다.
- @JoinTable은 중간 테이블의 이름과 외래 키를 지정하며, 여기서는 student_course가 중간 테이블이다.
- joinColumns는 현재 엔티티(Student)의 외래 키를, inverseJoinColumns는 대상 엔티티(Course)의 외래 키를 정의한다.
'공부 > Spring' 카테고리의 다른 글
예외(Exceptions), Spring boot에서 예외처리 (@RestControllerAdvice + @ExceptionHandler) (1) | 2025.02.18 |
---|---|
동적 쿼리란? - Querydsl (0) | 2025.02.10 |
Spring 데이터 접근 기술 (1) | 2025.02.10 |
WebClient 사용을 위한 배경지식 및 개념 (0) | 2024.03.01 |
객체 지향 프로그래밍 - IoC, DI (0) | 2024.02.27 |