스프링(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)을 참조하지만, 직원을 부서를 참조하지 않는 경우가 있을 수 있습니다.
특징
- 객체 그래프 탐색이 한 방향으로만 가능합니다.
- 단방향 관계는 단순하며, 필요할 때만 참조를 추가할 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring] JWT 인증 처리 로직 클래스 설계 (0) | 2024.08.29 |
---|---|
[Spring] Filter | Filter Interface (1) | 2024.08.29 |
[Spring] 3 Layer Architecture | Spring 3 Layer (0) | 2024.08.21 |
[Spring] Spring MVC | Spring MVC의 개념 (0) | 2024.08.20 |
[Spring] Spring Boot Transaction 트랜잭션 개념 이해하기 (0) | 2024.08.19 |