Spring

[Spring] 1대N 관계 | N대1 관계 | N대M | 양방향, 단방향 관계 정리

kimslab01 2024. 8. 28. 15:59

 

 

 

 

스프링(Spring Framework)에서 1대N, N대1, N대M 관계는 객체 관계 매핑(ORM)에서 많이 사용되며,

주로 JPA에서 엔티티 간의 관계를 설정할 때 사용됩니다.

이 관계들은 데이터베이스 테이블 간의 관계를 객체 모델에서 표현하는 방법입니다.

또한, 양방향과 단방향 관계는 엔티티 간의 데이터 접근 방법을 정의합니다.

 

 

 

1. 1대N (One-to-Many) 관계

 

설명: 하나의 엔티티가 여러 개의 다른 엔티티를 참조하는 관계입니다.

예시: 예를 들어, 하나의 부서(Department)가 여러 명의 직원(Employee)를 가질 수 있습니다.

 

구현 코드 예시

@Entity
public class Department {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees = new ArrayList<>();
}

@Entity
public class Employee {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

 

특징

  • Department는 여러 Employee를 가질 수 있으며, Employee는 하나의 Department에 속합니다.
  • mappedBy 속성은 양방향 관계에서 반대쪽 엔티티의 필드를 지정합니다.

 

 

 

 

2. N대1 (Many-to-One) 관계

 

설명: 여러 개의 엔티티가 하나의 다른 엔티티를 참조하는 관계입니다.

예시: 여러 직원(Employee)가 하나의 부서(Department)에 속할 수 있습니다.

 

구현 코드 예시

@Entity
public class Employee {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

@Entity
public class Department {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees = new ArrayList<>();
}

 

특징

  • Employee가 여러 명이라도 같은 Department를 가질 수 있습니다.
  • 보통 N대1 관계는 1대N 관계의 반대쪽이라고 생각할 수 있습니다.

 

 

 

 

3. N대M (Many-to-Many) 관계

 

설명:여러 개의 엔티티가 여러 개의 다른 엔티티를 참조하는 관계입니다.

예시: 학생(Student)과 수업(Course)의 관계에서 한 학생이 여러 수업을 들을 수 있고, 하나의 수업을 여러 학생이 들을 수 있고, 하나의 수업을 여러 학생이 들을 수 있습니다.

 

구현 코드 예시

@Entity
public class Student {
    @Id @GeneratedValue
    private Long id;

    @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
    private Long id;

    @ManyToMany(mappedBy = "courses")
    private List<Student> students = new ArrayList<>();
}

 

특징

  • @JoinTable은 중간 테이블(연결 테이블)을 명시적으로 정의할 수 있도록 합니다.
  • 양쪽 모두 서로 다수의 관계를 가질 수 있습니다.

 

 

 

 

4. 양방향 관계 (Bidirectional Relationship)

설명: 두 엔티티가 서로를 참조하는 관계입니다.

예시: 부서(Department)와 직원(Employee) 사이의 관계에서 Department는 여러 Employee를 가지고 있고, Employee는 하나의 Department에 속합니다.

 

특징

  • 객체 그래프 탐색이 양쪽으로 가능합니다. 즉, department.getEmployee()와 employee.getDepartment() 모두 사용할 수 있습니다.
  • 양방향 관계는 mappedBy 속성을 사용하여 반대편 엔티티의 필드를 매핑합니다.

 

 

 

 

5. 단방향 관계 (Unidirectional Relationship)

설명: 한 엔티티가 다른 엔티티를 참조하지만, 반대쪽은 참조하지 않는 관계입니다.

예시: 부서(Department)는 직원(Employee)을 참조하지만, 직원을 부서를 참조하지 않는 경우가 있을 수 있습니다.

 

특징

  • 객체 그래프 탐색이 한 방향으로만 가능합니다.
  • 단방향 관계는 단순하며, 필요할 때만 참조를 추가할 수 있습니다.