연관관계 매핑
객체의 참조와 테이블의 외래키를 매핑하는 것
JPA에서는 연관관계에 있는 상대 테이블의 PK를 멤버 변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조
방향
단방향 : 두 엔티티가 관계를 맺을 때, 한쪽의 엔티티만 참조하고 있는 것
양방향 : 두 엔티티가 관계를 맺을 때, 양쪽이 서로 참조하고 있는 것
다중성
@ManyToOne : 다대일 (N : 1)
@OneToMany : 일대다 (1 : N)
@OneToOne : 일대일 (1 : 1)
@ManyToMany : 다대다 (N : N)
어떤 엔티티를 중심으로 상대 엔티티를 바라보느냐에 따라 다중성이 다르게 됨
연관관계의 주인
객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 함
연관관계를 갖는 두 테이블에서 외래키를 갖게 되는 테이블이 연관관계의 주인임
연관관계의 주인만이 외래키를 (등록, 수정, 삭제) 할 수 있고, 주인이 아닌 엔티티는 읽기만 가능
@ManyToOne - 단방향
public class Account{
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
}
@JoinColumn(name = "_ID")
외래키를 매핑할 때 사용
name속성에는 매핑할 외래키 이름을 지정
@OneToMany - 양방향
public class Member {
@OneToMany(mappedBy = "member")
private List<Account> account = new ArrayList<>();
}
연관관계의 주인을 정하기 위해 @OneToMany에 mappedBy속성을 추가
- 주인은 mappedBy 속성을 사용하지 않고, @JoinColumn을 사용
- 주인이 아닌 엔티티는 mappedBy속성을 사용해 주인을 정함
@OneToMany
외래키를 가지고 있는 테이블이 주 테이블
단방향
양방향
- 양방향일 경우 주인 클래스를 지정해야 함
@ManyToMany
실무 사용금지
중간 테이블이 숨겨져 있기 때문에 나도 모르는 복잡한 조인쿼리가 발생하는 경우가 발생
다대다를 일대다, 다대일로 풀어서 만들 것(중간에 매핑 테이블을 만드는 것)
연관관계에서는 ToString() 주의
엔티티 간의 연관관계를 지정하는 경우 ToString 주의
해당 클래스의 모든 변수를 출력
연관관계 매핑이 되어있을 경우 그 객체 역시 출력해야 하기 때문에 이때 데이터베이스 연결이 필요하게 됨
이러한 문제 때문에 @ToString()할 때 exclude속성을 사용하는 것이 좋음
exclude는 해당 속성값으로 지정된 필드는 toString()에서 제외해 줌
참고
'Spring Boot' 카테고리의 다른 글
[Spring Boot] QueryDSL이란? (1) | 2024.05.22 |
---|---|
[Spring Boot] file업로드 (0) | 2024.05.21 |
[Spring Boot] @RestControllerAdvice를 이용한 Spring 예외처리 (0) | 2024.05.21 |
[Spring Boot] @Component 어노테이션 (0) | 2024.05.20 |
[Spring Boot] @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (0) | 2024.05.15 |