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 |
Tags
- java참조자료형
- 컴파일
- 항해15기
- java 자료구조 활용
- java알고리즘문제풀이
- 프로그래머스제일작은수
- 코딩부트캠프후기
- java알고리즘
- 비전공자sqld
- java map 저장
- 노베이스부트캠프
- 격파르타장점
- java최솟값구하기
- java list 저장
- java기본자료형
- 격파르타비전공자
- java map
- java list 출력
- 프로그래머스
- 항해99후기
- java map 출력
- javaJVM
- sqld자격증합격
- 인터프린터언어
- 작은수제거하기
- java set 저장
- 격파르타합격후기
- 격파르타후기
- java set 출력
- javaJRE
Archives
- Today
- Total
코딩과 결혼합니다
[JPA] 엔티티 설계시 주의점 본문
728x90
엔티티에는 가급적 Setter를 사용하지 않는다.
- 캡슐화와 정보 은닉 - 세터를 제공하면 외부에서 엔티티의 상태를 직접 변경할 수 있다.
- 불변성 유지 - 상태를 변경할 수 있기 때문에 불변성을 유지하기 어렵다.
- 부작용 최소화 - 세터는 상태 변경 외에도 다른 동작을 수행할 수 있다. 이는 예기치 않은 부작용을 초래할 수 있으며, 코드의 복잡성을 증가시킬 수 있다.
세터를 대체하는 방법
일반적으로는 생성자를 통해 초기 상태를 설정하고, 필요에 따라 내부 메서드를 사용하여 상태를 변경할 수 있다.
모든 연관관계는 지연로딩으로 설정한다.
즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
연관된 엔티티를 함께 DB에서 조회해야 한다면, fetch join, 또는 엔티티 그래프 기능을 사용한다.
@XToOne 관계를 기본이 즉시로딩이므로 직접 지연로딩으로 설정한다.
즉시로딩을 사용하면 생기는 문제들
- 성능 저하 - 연관된 모든 데이터를 한 번에 가져오기 때문에, 필요하지 않은 데이터까지 불필요하게 로딩될 수 있다.
- 메모리 부담 - 연관된 모든 데이터를 메모리에 로딩하기 때문에 부담이 커질 수 있다.
컬렉션은 필드에서 초기화한다.
- NullPointerExeption 방지 : 필드를 선언할 때 컬렉션을 초기화하지 않으면, 해당 필드는 기본적으로 null로 설정된다. 나중에 해당 필드를 사용하는 곳에서 null 체크를 하지 않고 초기화하면 에러가 발생할 수 있다.
- 안정성과 편의성 : 해당 필드를 사용하는 코드에서 항상 컬렉션 객체를 사용할 수 있다.
- 하이버네이트는 엔티티를 영속화할 때, 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 만약 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다.
'2세 > JPA' 카테고리의 다른 글
[JPA] 아키텍처 패턴(+ 디자인 패턴) (0) | 2024.02.15 |
---|---|
[JPA] 상속관계 매핑 - 테이블 전략 (0) | 2024.02.14 |
[JPA] 기본키 생성 전략 (0) | 2024.02.12 |
[JPA] 데이터베이스 스키마 자동 생성, DDL 생성 기능 (0) | 2024.02.07 |
[JPA] 영속성 관리 - 내부 동작 방식 (0) | 2024.02.06 |