Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- http
- QueryDSL
- 인프런
- transaction
- 스프링
- Android
- 김영한
- 백준
- 스프링 핵심 원리
- pointcut
- Greedy
- spring
- 자바
- JPQL
- 알고리즘
- Exception
- java
- 스프링 핵심 기능
- JDBC
- kotlin
- Spring Boot
- Proxy
- Servlet
- SpringBoot
- 그리디
- springdatajpa
- Thymeleaf
- AOP
- db
- jpa
Archives
- Today
- Total
개발자되기 프로젝트
엔티티 설계 시 주의점 본문
1. 엔티티에는 가급적 Setter를 사용하지 말자
- Setter가 모두 열려있으면 변경 포인트가 많아서 유지보수가 어려워진다..
2. 모든 연관관계는 지연로딩으로 설정!
- 엄!청!중!요!
- EAGER타입은 예측이 어렵고, 어떤 SQL이 실행되는지 추적하기 어렵다.
- 특히 JPQ을 실행할 때 N+1 이슈가 발생한다.
- 만약 A와 B가 일대다 관계인데, EAGER 타입이다?
- A불러오는 쿼리 실행하고 n개의 B를 불러오는 쿼리 바로 실행됨 ㄷㄷ
- 실무에서 모든 연관관계는 LAZY 타입으로 설정해야 한다.
- Lazy는 필요한 시점에 연관 엔티티 불러옴
- 딱 필요한 시첨에 가져옴 언제? getter로 불러올때 - 연관된 엔티티를 DB에서 함께 조회해야 하면, fetch join 또는 엔티티 그래프 사용
- @XToOne은 기본적으로 EAGER가 기본 설정이다.
@ManyToOne EAGER @OneToMany LAZY @OneToOne EAGER
3. 컬렉션은 필드에서 초기화 하자.
- 컬렉션은 필드에서 바로 초기화 하는 것이 안전함
- null 문제에서 안전해짐!!!!
- hibernate는 엔티티를 영속화 할 때, 컬렉션을 감사서 hibernate가 제공한는 내장 컬렉션으로 변환
- hibernate에서 내장 컬렉션으로 만들었는데 누가 밖에서 set으로 변경한다면..?..ㄷ
- hibernate 내부 매커니즘에 문제 발생 가능.
- 컬렉션을 만들었으면 바꾸지 말고 그대로 사용.
- 따라서 필드에서 초기화 하자..
private List<OrderItem> orderItems = new ArrayList<>()
4. 테이블 컬럼명 생성 전략
- SpringPhysicalNamingStrategy
- 스프링 부트 신규 설정 : entity(필드) -> table(컬럼)
- 카멜 케이스 -> 언더 스코어(memberRepository -> member_repository)
- .(점) -> _(언더스코어)
- 대문자 -> 소문자 - 적용 2단계
- 논리명 생성 : 명시적으로 컬럼, 테이블 명을 직접 적지 않으면 ImplicitNamingStrategy 사용
SpringPhysicalNamingStrategy
- 물리명 적용 : 모든 논리명에 적용되는 전략, 실제 테이블에 적용. ex)회사 표준 적용
spring.jpa.hibernate.naming.physical-strategy
5. Cascade(영속성 전이)
- Order class
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>();
- Cascade ?
- cascade는 영속성 전이를 의미.
- Entity의 상태(생애주기)변화가 있을 때 연관 관계의 entity에 상태변화를 전파함
- 즉 위의 경우 order entity가 persist되면 연관 entity인 orderItem도 persist됨.
6. 연관관계 편의 메서드
- 양방향 연관관계는 연관관계 생성을 위해 객체를 양 방향으로 넣어줘야 한다.
- 즉 A와 B가 양방향 연관관계라고 할 때, A에서 B를 add or set 했다고 하자.
- 그렇다면 B에도 A를 넣어줘야 한다.
- 아래와 같이 set 또는 add 메서드 하나로 양방향으로 넣어줄 수 있다.
- 즉 양쪽 세팅을 한 코드로 엮어서 처리함.
- Order class
public void setMember(Member member){ this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery){ this.delivery = delivery; delivery.setOrder(this); }
- 그렇다면 연관관계인 두 클래스 중 어디다가 메서드를 만들어야해..?
- 주로 CONTROL하는 쪽에 두는 것이 좋음.
- 파악하기도 쉽고 관리하기 쉬울 듯. - 다른 좋은점은..?
- 실수도 줄일 수 있고 코드도 짧아짐 ㅋㅋ
7. GitHub : 210805 엔티티 설계시 주의사항
'인프런 > [인프런] Springboot와 JPA활용 1' 카테고리의 다른 글
MemberService 개발 (0) | 2021.08.06 |
---|---|
회원 도메인 개발 (0) | 2021.08.06 |
엔티티 클래스 개발 (0) | 2021.08.05 |
도메인 모델 , 테이블 설계 (0) | 2021.08.05 |
도메인 분석 설계 (0) | 2021.08.05 |
Comments