테이블 간의 관계 매핑 애노테이션

 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)의 외래 키를 정의한다.