연관관계 매핑 기초: 일대일(1:1) 관계 및 다대다(N) 관계
1. 일대일(1:1) 관계
외래키 어디에 넣을까?
- 일대일 관계에서 외래키는 어느 엔티티에나 넣어도 됩니다.
- 하지만 일반적으로 조회 빈도가 더 높은 쪽에 외래키를 넣는 것이 성능상 유리합니다.
단방향 일대일 관계
예를 들어, Member와 Locker가 있을 경우 Member에 locker_id를 넣어서 일대일 관계를 표현할 수 있습니다.
@Entity
public class Member {
@OneToOne
@JoinColumn(name = "locker_id")
private Locker locker;
// Getter, Setter
}
양방향 일대일 관계
양방향 관계를 만들고 싶다면 Locker에도 Member를 추가하면 됩니다.
@Entity
public class Locker {
@OneToOne(mappedBy = "locker")
private Member member;
// Getter, Setter
}
데이터베이스 설계
일대일 관계에서 데이터베이스 설계 시 외래키에 UNIQUE 제약 조건을 추가해야 합니다.
ALTER TABLE Member
ADD CONSTRAINT UK_Locker UNIQUE (locker_id);
2. 다대다(N) 관계
다대다 관계는 쓰지 말라
- 다대다 관계는 실무에서 사용하지 않는 것이 좋습니다.
- 다대다 관계를 사용하면 복잡성과 성능 문제를 유발할 수 있습니다.
- 대신, 다대다 관계를 1대N과 N대1로 분해하여 새로운 엔티티를 생성하면 해결할 수 있습니다.
다대다 관계 분해 예시
예를 들어, Student와 Course가 다대다 관계를 맺고 있다면, 중간 테이블 Enrollment를 생성하여 관계를 분해할 수 있습니다.
@Entity
public class Student {
@OneToMany(mappedBy = "student")
private List<Enrollment> enrollments = new ArrayList<>();
// Getter, Setter
}
@Entity
public class Course {
@OneToMany(mappedBy = "course")
private List<Enrollment> enrollments = new ArrayList<>();
// Getter, Setter
}
@Entity
public class Enrollment {
@ManyToOne
@JoinColumn(name = "student_id")
private Student student;
@ManyToOne
@JoinColumn(name = "course_id")
private Course course;
// Getter, Setter
}
결론
- 일대일 관계: 외래키는 어느 엔티티에나 넣을 수 있으며, 조회 빈도가 높은 쪽에 넣는 것이 좋습니다. 양방향 관계를 설정할 때는 mappedBy 속성을 사용합니다.
- 다대다 관계: 다대다 관계는 사용하지 않고, 중간 테이블을 생성하여 1대N과 N대1로 분해하는 것이 좋습니다.
'JAVA > JPA' 카테고리의 다른 글
인프런 JPA 10화 객체지향 쿼리 언어1 - 기본 문법 "김영한 강사" -PlusUltraCode- (1) | 2024.07.20 |
---|---|
인프런 JPA 7화 고급 매핑 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |
인프런 JPA 5화 연관관계 매핑 기초 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |
인프런 JPA 4화 필드 컬럼 "김영한 강사" -PlusUltraCode- (1) | 2024.07.19 |
인프런 JPA 3화 영속성 컨텍스트 "김영한 강사" -PlusUltraCode- (0) | 2024.07.19 |