| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- jpa
- 프로그래머스
- 스프링
- 프런트엔드
- 오라클
- oracle
- 자바스크립트
- 코드 테스트
- 백엔드
- JavaScript
- web
- MySQL
- spring
- 자바
- java
- 정리
- SQL
- 서버
- 알고리즘
- 디자인 패턴
- jsp
- Next.js
- 코드테스트
- 프론트엔드
- 데이터베이스
- 스프링부트
- 미니정리
- BACK-END
- 쿼리
- node.js
- Today
- Total
참치코더의 꿈 메모장
JPA / 지연로딩(lazy loading), 즉시로딩(eager loading), 영속성 전이(cascading), 고아객체(Orphan) 정리 본문
JPA / 지연로딩(lazy loading), 즉시로딩(eager loading), 영속성 전이(cascading), 고아객체(Orphan) 정리
참치깡 2025. 10. 21. 15:39
지연 로딩 (Lazy Loading)
- 필요할 때만 연관 객체를 조회하는 방식
- 연관된 엔티티를 실제 사용할 때 SQL이 실행이 된다.
- 처음에는 프록시 객체(가짜 객체)로 들고 있다가, 해당 데이터를 접근할때 쿼리를 날려 값을 구하는 방식이다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY) // 지연로딩
private Team team;
}
|
cs |
장점
- 필요한 시점에만 데이터를 불러와서 성능 향상
- 불필요한 조인 방지
단점
- 트랜잭션 밖에서 프록시 접근 시 LazyInitializationException 발생 가능
즉시로딩 (Eager Loading)
- 엔티티를 조회할 때 연관된 엔티티도 함께 즉시 조회하는 방식
|
1
2
|
@ManyToOne(fetch = FetchType.EAGER) // 즉시로딩
private Team team;
|
cs |
- Member를 조회할때 JPA가 자동으로 JOIN을 사용해 Team까지 미리 불러오는 방식
장점
- 연관 객체를 바로 사용 가능하다.
단점
- 항상 JOIN이 발생해 성능 저하가 굉장히 심하다.
- 예측하기 힘든 SQL이 발생한다. (불필요한 데이터 까지 같이 조인될 수 있다.)
- 실무에서는 거의 항상 LAZY로 설정하고, 필요한 경우에만 fetch join이나 EntityGraph 사용을 한다.
영속성 전이 (Cascade)
- 부모 엔티티의 영속성 상태 변화를 자식에게 전이시키는 기능이다.
- 주로 게시글을 저장할 때 첨부 이미지들도 자동으로 저장되게 하고 싶을 때 사용한다.
(해당 자식이 확실하게 내것이다 판단이 될때 사용!!)
|
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
|
@OneToMany(mappedBy="board", cascade = CascadeType.ALL)
private List<BoardImage> imageList = new ArrayList<>();
/*
Cascade 종류
1. PERSIST : 부모 저장시 자식도 함께 저장
2. REMOVE : 부모 삭제 시 자식도 함께 삭제
3. MERGE : 부모 병합 시 자식도 병합
4. DETACH : 부모 준영속 시 자식도 준영속
5. REFRESH : 부모 새로고침 시 자식도 새로고침
3. ALL : Cascade 모든 동작 동작
*/
Board board = new Board();
BoardImage img1 = new BoardImage("a.png");
board.addImage(img1);
boardRepository.save(board); // cascade 덕분에 img1도 같이 저장됨
|
cs |
미아(고아) 객체 (Orphan Removal)
- 부모와의 관계가 끊어진 자식 객체를 자동으로 삭제
- orphanRemoval = true 옵션을 사용
- 부모 컬렉션에서 자식을 제거하면, DB에서도 DELETE 쿼리가 자동 실행된다.
|
1
2
3
4
|
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
private List<BoardImage> imageList = new ArrayList<>();
board.getImageList().remove(0); //DB에서 해당 이미지 자동 삭제
|
cs |
주의 해야하는 점....
- 부모가 자식을 완전히 소유하는 관계(의존적 생명주기), 에서만 사용해야 한다.
- 다른 엔티티에서 공유되는 객체에는 사용하면 안된다. (다른 테이블과 관계가 있는 객체는 사용 X)
'JPA' 카테고리의 다른 글
| JPA / 값 타입 컬렉션(Value Type Collection) 정리 (0) | 2025.10.27 |
|---|---|
| JPA / 기본값 타입, 임베디드 타입 정리, 불변객체란?, 그에 따른 비교 (0) | 2025.10.24 |
| JPA / @MappedSuperclass, 프록시 개념 정리 (0) | 2025.10.15 |
| JPA / 상속관계 매핑 (SINGLE_TABLE, JOINED, TABLE_PER_CLASS) (1) | 2025.10.13 |
| JPA / 일대일(OneToOne) 매핑, 다대다(ManyToMany) 매핑(코드 위주) (0) | 2025.10.10 |