-
JPA 활용 (1-3) - 엔티티 설계시 주의점Web/JPA 2024. 1. 4. 15:36
1. 엔티티는 가급적 Setter를 사용하지말자
-> Setter가 모두 열려있으면, 변경 포인트가 너무 많아서 유지보수가 어렵다.
1.2 모든 연관관계는 지연로딩으로 설정
> 즉시로딩은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1의 문제가 자주 발생함
> 실무에서 모든 연관관계는 지연로등으로 설정해야한다.
> 연관된 엔티티를 DB에서 조회하면 fetch join, 엔티티 그래프들을 사용하자
> @XToOne(OneToOne,ManyToOne)관계는 기본이 즉시 로딩이므로 직접 지연로딩으로 설정해야한다.
1.3 컬렉션은 필드에서 초기화하자
컬렉션은 필드에서 바로 초기화하는 것이 안전하다.
>null문제에서 안전함
> 하이버네이트는 엔티티를 영속화 할 때, 컬렉션을 감싸서 하이버네이트 제공하는 내장 컬렉션으로 변경함
만약 getOrders()처럼 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 매커니즘에 문제가 발생 할 수 있다. 필드레벨에서 생성하는 것이 안전하고 간결함
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
> 컬렉션은 객체를 생성할 때 한번만 생성하고 바꾸지 말기!
1.4 테이블,컬럼명 생성 전략
스프링 부트에서 하이버네이트 기본 매핑 전략을 변경해서 실제 테이블 필드명은 다르다. (PDF경로참고)
- 하이버네이트 기존 구현: 엔티티 필드명을 그대로 테이블 컬럼명으로 사용 (SpringPhysicalNamingStrategy)
(따로 테이블명 안적고 그럴때)
-스프링 부트 신규설정 (엔티티 필드 -> 테이블 컬럼)
1. 카멜케이스 > 언더스코어
2. . > 언더스코어
3 대문자 > 소문자
- 적용 2단계 (기본설정 변경법?)
1. 논리적 생성: 명시적으로 컬럼,테이블명을 적지않으면, ImplicitNamingStrategy 사용
> spring.jpa.hibernate.naming.implicit-strategy : 테이블이나, 컬럼명을 명시하지 않을 때 논리명 적용
2. 물리명 적용:
spring.jpa.hibernate.naming.physical-strategy : 모든 논리명에 적용됨, 실제 테이블에 적용 (username usernm 등으로 회사 룰로 바꿀 수 있음
-- 아직 무슨 얘기인지 잘 모르겠다--
스프링 부트 기본 설정 spring.jpa.hibernate.naming.implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy spring.jpa.hibernate.naming.physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
'Web > JPA' 카테고리의 다른 글
JPA (2) - API 개발 시 기본으로 지켜야 할 사항 (0) 2024.01.22 JPA (11) - 다형성 쿼리,엔티티 직접 사용,정적쿼리,벌크연산 (0) 2024.01.12 JPA - 프로젝트 생성 (0) 2024.01.11 JPA 활용 (1-2) - 도메인 분석 설계 (0) 2024.01.04 JPA 활용 (1) - 프로젝트 환경설정 (1) 2024.01.04