728x90
반응형
이 포스트는 김영한님의 스프링부트와 JPA 활용1 강의 내용 기반으로 요약하였다.
엔티티 설계시 주의점
1. 외래 키가 있는 곳을 연관관계의 주인으로 정할 것
- 연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제
- 비즈니스상 우위에 있다고 주인으로 정하면 안됨
- ex) 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다쪽에 외래 키가 있으므로 외래 키가 있는 바퀴를 연관관계의 주인으로 정함
- 물론 자동차를 연관관계의 주인으로 정하는 것이 불가능 한 것은 아니지만, 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래 키 값이 업데이트 되므로 관리와 유지보수가 어렵고, 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제도 있다.
2. 엔티티에는 가급적 Setter 사용하지 말 것
- Setter가 모두 열려있으면 변경 포인트가 너무 많아서 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거
3. 모든 연관관계는 지연로딩으로 설정하기
- 즉시로딩(EAGER)은 예측이 어려움 + 어떤 SQL이 실행될지 추적하기 어려움 (N+1 문제)
- N+1 문제?
- 첫번째 날린 쿼리결과 N개가 먼저 실행되는 문제
- 지연로딩(LAZY)로 설정하기
- 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.
- @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다.
4. 컬렉션은 필드에서 초기화 하기
- 필드에서 바로 초기화 하는 것이 안전하다.
- null 문제에서 안전하다.
- Hibernate는 엔티티를 영속화 할 때, 컬랙션을 감싸서 Hibernate가 제공하는 내장 컬렉션으로 변경한다.
Member member = new Member();
System.out.println(member.getOrders().getClass());
em.persist(member);
System.out.println(member.getOrders().getClass());
//출력 결과
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag
- 만약 getOrders() 처럼 임의의 메서드에서 컬력션을 잘못 생성하면 Hibernate 내부 메커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는 것이 가장 안전하고, 코드도 간결하다.
728x90
반응형
'Tech > Spring' 카테고리의 다른 글
[Spring] 스프링 주요 어노테이션, Update(수정) 시 save() 메서드를 호출하는 것이 좋을까? (2) | 2023.04.10 |
---|---|
[Spring Data JPA] 스프링 테이블, 컬럼명 생성 전략 (0) | 2023.03.22 |
[Spring] jasypt로 암호화하기, docker, ec2 및 CI/CD 연동하기 (0) | 2023.01.19 |
[Spring] java: cannot find symbol class Badge 에러 해결 방법, QueryDSL 해결 방법 (0) | 2023.01.07 |
[스프링 핵심 원리] 웹 스코프 (0) | 2022.02.06 |