즉시로딩과 지연로딩
연관관계 매핑을 통해 @ManyToOne, @OneToMany등으로 설정된 변수에 (fetch = FetchType.LAZY) 로 설정하면 지연로딩으로 설정되어 부모객체(참조를 가지고 있는 객체)를 조회할 때 참조에 프록시 객체를 만들어 집어넣는다.
프록시 객체는 실제객체를 상속받아 만들어지고, 실제 데이터를 조회하려고 할때 데이터베이스를 조회한다.
즉시로딩의 문제점
- 예상하지 못한 SQL 발생
연관관계가 복잡해지면, 예상할 수 없는 조인이 수없이 연결되어 심각한 성능 저하를 발생시킬 수 있다.
- N + 1 문제
jpql을 통해 조회를 할 경우, SQL문으로 변환되어 실행된다. SQL문 실행 후 즉시로딩되어있는 객체에는 꼭 데이터를 채워줘야하므로 추가적인 SQL을 발생시킨다.
기본적으로 지연로딩을 사용하고, 즉시로딩이 필요할 경우 JPQL fetch 조인이나, 엔티티그래프 어노테이션을 활용해야 한다고 한다. 이 부분은 나중에 다시 공부할 것이다.
어쨌든 기본적으로 지연로딩을 무조건 사용할 것!!!!
XXXToOne 은 기본 즉시로딩, XXXToMany 는 기본 지연로딩으로 세팅되어있다/
영속성 전의 CASCADE
- cascade 옵션을 통해 특정 엔티티를 영속화할 때 연관관계에 있는 엔티티도 동시에 영속화 할 수 있다.
- 연관관계를 매핑하는것과 관계없다.
- 연관관계에서 연관된 엔티티가 하나일 때(단일 소유자일 때), 라이프사이클이 동일할때만 사용해야 한다.
고아 객체
- orphanRemoval = true 를 통해 사용할 수 있다.
- 고아 객체로 설정된 엔티티는 참조가 제거됐을 때 삭제한다.
- @OneToXXX 에서만 사용
- 참조하는 곳이 하나일 때만 사용
- 특정 엔티티가 단일 소유일 때만 사용한다. (다른 여러 곳에서 참조하고 있으면 안된다!!)
CascadeType.ALL, orphanRemovel=true 두 옵션을 모두 사용하면 엔티티의 생명주기 자체를 부모 엔티티를 통해서 관리할 수 있다. 이부분이 DDD의 어떤 개념을 구현할 때 유용하다고 한다. 조금 위험해 보이기도하고 아직 DDD에 대해 잘모르기 때문에 일단은 기억만 하고 가야겠다.
참고
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
프로그래머스 level 2 - 소수 찾기
https://programmers.co.kr/learn/courses/30/lessons/42839
코딩테스트 연습 - 소수 찾기
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이
programmers.co.kr
순열을 활용해야하는 문제였다. 제대로 이해하고 풀고싶어서 코드를 배끼지 않고 한줄한줄 풀었더니 시간이 더 오래 걸리고 코드가 깔끔하지 않은 느낌이다. 내일도 순열문제를 찾아 한번 다시 풀어봐서 체화시키도록 해야겠다.
풀이코드
GitHub - unannn/CodingTestPractice: 코딩테스트 연습 문제 풀이 Repo 입니다.
코딩테스트 연습 문제 풀이 Repo 입니다. Contribute to unannn/CodingTestPractice development by creating an account on GitHub.
github.com
'TIL' 카테고리의 다른 글
[TIL 2022-2-25] JPA 값 타입, PriorityQueue (0) | 2022.02.26 |
---|---|
[TIL 2022-2-25] JPA, DFS (0) | 2022.02.25 |
[TIL 2022-02-22] JPA 프록시에 대해서, Set의 equals (0) | 2022.02.23 |
[TIL 2022-2-20] JPA 연관관계 매핑, 프로그래머스 (0) | 2022.02.21 |
[TIL 2022-2-15]JPA 양방향 매핑 (0) | 2022.02.15 |