@ManyToOne, @OneToMany, @OneToOne, @ManyToMany는 객체 간 관계를 정의하는 어노테이션
데이터베이스의 외래키(FK)와 1:N, N:1 같은 개념을 자바 객체에서도 표현해주는 것
예를들어
회사(COMPANY) 와 직원(EMPLYOEE)의 관계를 생각해보면,
1. @ManyToOne (N:1 관계)
많은 객체가 하나의 객체를 참조함
@Entity
public class Employee {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "company_id") // FK 컬럼 이름
private Company company; // 직원은 하나의 회사에 소속
}
이렇게 하면 DB에는 employee 테이블에 company_id FK가 생김
2. @OneToMany (1:N 관계)
하나의 객체가 여러 개를 참조함
@Entity
public class Company {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "company") // 상대방 필드명
private List<Employee> employees = new ArrayList<>();
}
mappedBy는 연관관계 주인이 아님을 명시하는 것. (DB에 FK 안 만들어짐)
둘 다 연결하면?
@Entity
public class Person {
@Id
private Long id;
@OneToOne
@JoinColumn(name = "card_id")
private IDCard idCard;
}
@Entity
public class IDCard {
@Id
private Long id;
private String cardNumber;
}
이렇게 하면 양방향 관계가 되고, JPA는 이를 기반으로 쿼리를 생성함.
3. @OneToOne (1:1 관계)
@Entity
public class Person {
@Id
private Long id;
@OneToOne
@JoinColumn(name = "card_id")
private IDCard idCard;
}
@Entity
public class IDCard {
@Id
private Long id;
private String cardNumber;
}
사람 한 명은 주민등록증 하나. @OneToOne은 두 객체가 서로 1:1 대응될 때 사용함.
4. @ManyToMany (N:N 관계)
@Entity
public class Student {
@Id
private Long id;
@ManyToMany
@JoinTable(
name = "student_subject",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "subject_id")
)
private List<Subject> subjects;
}
@Entity
public class Subject {
@Id
private Long id;
private String name;
@ManyToMany(mappedBy = "subjects")
private List<Student> students;
}
이 경우 중간 테이블(student_subject)이 자동으로 생성됨
요약 표
관계 설명 JPA 어노테이션
1:N 회사 - 직원 @OneToMany, @ManyToOne
1:1 사람 - 주민등록증 @OneToOne
N:N 학생 - 과목 @ManyToMany
실제 개발 시 팁
대부분 실무에서는 @ManyToOne을 주로 사용 (N:1 구조가 많음)
@OneToMany는 단독으로 사용하면 성능상 불리할 수 있음 (즉시 로딩, N+1 이슈 등)
양방향보다 단방향 관계로 설계하고, 필요한 경우만 양방향 사용
DTO로 관계 객체는 필요에 따라 제한적으로 넘겨야 함 (무한 루프 방지)
'데이터베이스' 카테고리의 다른 글
데이터베이스 이중화(티베로,tibero 이중화), failover 힘겹게 성공 (1) | 2023.11.23 |
---|---|
오라클 설치 및 데이터베이스 기초 (1) | 2023.09.04 |
SecureCRT 8.7 무료사용방법 (0) | 2023.08.29 |
[MyBatis]SQL <!cdata[ 사용이유 (0) | 2023.05.11 |
CASE WHEN (0) | 2023.03.22 |