728x90
반응형
JPA에서 Entity 설계 시 유의할 점
- 1 : N 관계에서는 N에 해당되는 엔티티에 FK가 있어야 한다. (회원-주문의 관계라면 주문이 회원이 FK를 가진다.)
- 1 : 1 관계에서는 둘 중 어디든 FK를 둘 수 있지만 이왕이면 더 많이 조회하는 엔티티에 둔다.
- N : N 관계(@ManyToMany)는 만들지 않는다. N : N인 경우 매핑 테이블이 필요한데 이 테이블에는 등록일, 수정일 같은 필드를 두기가 어려워 운영에 좋지 않다.
- 값 타입(임베디드 타입)은 변경하면 안된다. 생성시에만 값을 주고 변경 불가능하도록 해야 한다. 값 타입에는 @Embeddable, 사용 필드에는 @Embedded 를 달아준다.
- 엔티티는 가급적 변경 불가능하게 설계한다. (Setter 사용 금지. 생성자를 통해서만 생기도록. default 생성자는 protected 로 만들어 안전하게)
- 모든 연관 관계의 FetchType은 LazyLoading 으로 설정한다. (EAGER 즉시 로딩은 예측이 어렵고 어떤 SQL이 실행될지 추적이 어렵다. em.find 를 통해 하나만 조회하는 경우 큰 문제가 없겠지만, JPQL로 가져올 경우 fetchType이 EAGER로 지정되면 쿼리가 1개가 날아가는 것이 아니고 N+1 가 날아갈 수 있다. FK 조회해와야 하니까...!)
- @XToOne(OneToOne, MayToOne)의 경우 EAGER가 default 이므로 직접 LAZY로 설정해줘야 한다.
- 연관관계에 필요한 entity를 한 번에 가져와야 한다면 FETCH JOIN을 사용하자. (fetchType = EAGER 는 고려하지 말것)
- Collection은 필드에서 초기화한다. NPE 걱정이 없고, 생성자에서 초기화하는 경우 hibernate가 collection의 변경 사항을 제대로 추적하지 못할 수 있다. (생성자, setter XXXXXX)
728x90
반응형
'기타 CS' 카테고리의 다른 글
(기술 면접 기출) GC종류, 가비지 컬렉션 종류, 설정 명령어 (0) | 2023.03.26 |
---|---|
웹/백엔드 개발자 기술 면접 준비 (0) | 2023.03.18 |
쿠버네티스란 무엇인가 (0) | 2023.03.15 |
Redis (0) | 2023.03.06 |
Java 기반 웹 백엔드 엔지니어 기술 면접 예상 질문 (feat. chat GPT) (0) | 2023.03.05 |