OneToMany 단방향 맵핑
JPA의 연관관계 설정에는 OneToOne,OneToMany,ManyToOne,ManyToMany가 있는데,
그 중 OneToMany의 단방향 맵핑에 대한 것을 공부했다.
@OneToMany 단방향 매핑 단점을 검색하면 많은 내용이 있는데 , 그 내용을 요약하면
1. 관계 테이블 사용
단방향 OneToMany 매핑에서는 관계 테이블이 생성된다. 이는 외래 키가 자식 테이블이 아닌 부모 테이블에 존재하게 되며, 이는 다음과 같은 문제를 초래할 수 있다.
- 추가적인 테이블 생성: 불필요한 중간 테이블이 생성되며, 이는 성능 및 관리 측면에서 부담이 될 수 있다.
- 성능 저하: 관계 테이블을 통해 조회를 하게 되면 조인이 추가적으로 필요해져 성능이 저하될 수 있다.
2. 데이터베이스 스키마 제약
단방향 OneToMany 매핑을 사용할 경우 데이터베이스 스키마 설계가 복잡해질 수 있다.
- 외래 키 제약: 부모 테이블에 외래 키 제약이 설정되므로, 데이터 무결성을 유지하는 것이 어려울 수 있다.
- 데이터 일관성 문제: 자식 테이블에서 부모 테이블로의 참조를 유지하기 어렵기 때문에 데이터 일관성 문제를 발생시킬 수 있다.
3. 엔티티 관리의 복잡성
단방향 매핑을 사용할 경우 엔티티 관리가 복잡해질 수 있다.
- 역방향 탐색 불가: 단방향 매핑에서는 자식 엔티티에서 부모 엔티티를 참조할 수 없으므로, 양방향 매핑에 비해 객체 그래프 탐색이 제한된다.
- 연관 관계 설정 어려움: 관계 설정 및 관리가 양방향 매핑에 비해 어려울 수 있다.
4. 캐시 및 성능 문제
JPA의 캐시 메커니즘과 결합될 경우 성능 문제가 발생할 수 있습니다.
- 추가적인 쿼리 발생: 단방향 매핑에서는 연관된 엔티티를 로드하기 위해 추가적인 쿼리가 발생할 수 있다.
- N+1 문제: 자식 엔티티를 로드할 때 N+1 쿼리 문제가 발생할 수 있다.
해결 방안
이러한 문제점을 해결하기 위해서는 양방향 매핑을 사용하는 것이 일반적이다. 양방향 매핑을 사용하면 데이터베이스 설계가 단순해지고, 객체 그래프 탐색이 용이해지며, JPA의 캐시 메커니즘을 효과적으로 활용할 수 있다.
( 일대다 단방향 관계)
// 일대다 단방향 관계
@Entity(name = "parent")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany
@JoinColumn(name = "parent_id")
private List<Child> childList;
}
@Entity(name = "child")
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "parent_id")
private Long parentId;
}
다대일 양방향 관계
// 일대다 양방향 관계는 없음!
// 대신, 다대일 양방향 관계
@Entity(name = "parent")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy="parent")
private List<Child> childList;
}
@Entity(name = "child")
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
'TIL' 카테고리의 다른 글
2024.06.20.수 JPA에서 엔티티 기본생성자가 반드시 있어야 하는 이유 (0) | 2024.06.20 |
---|---|
2024.06.18.화 테스트 어노테이션 정리 (1) | 2024.06.19 |
2024.06.14.금 테스트 코드 작성 (0) | 2024.06.17 |
2024.06.13.목 자바 스프링 테스트 (0) | 2024.06.14 |
2024.06.12.수 Spring AOP (1) | 2024.06.13 |