# Eager Loading

9개의 포스트
post-thumbnail

JPA 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)

✅JPA에서 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)는 엔티티 간의 관계를 마련할 때 데이터를 가져오는 전략을 결정하는 방법입니다. 이 두 가지 로딩 전략의 차이점에 대해 자세히 살펴보겠습니다. 👉지연 로딩(Lazy Loading) 지연 로딩은 관련된 엔티티를 실제로 사용할 때까지 로드를 연기하는 방법입니다. 엔티티를 처음 로드할 때 관련 연관 엔티티를 한 번에 가져오지 않고, 필요한 시점에 데이터베이스에서 추가적인 조회를 통해 가져옵니다. 이 방법은 성능상 이점이 있는 경우가 많습니다. 예를 들어, 게시물(Post)과 댓글(Comment)이 있는 상황에서 특정 게시물을 가져오고자 할 때, 지연 로딩 전략을 사용한다면 처음에는 게시물(Post)만 가져옵니다. 이후 댓글(Comment) 정보가 필요한 경우 데이터베이스에서 해당 정보를 로드합니다. 위 코드에서 Post 엔티티는 Comment 엔티

2023년 8월 11일
·
0개의 댓글
·

Eager/Lazy Loading 과 N+1 Problem

좋은 쿼리를 위해서는 적절한 쿼리문 생성, 인덱스 사용 등과 같이 쿼리 속도 향상을 위한 방법이 필요하다. 내가 작성한 PR 에서 "이렇게 하면 쿼리 속도가 느리지 않을까요?" 혹은 "쿼리가 이상해요!" 라는 코멘트를 받지 않으려면 N+1 Problem 이라는 개념을 꼭 알고 있어야 한다. N+1 Problem 이란? 한번의 쿼리로 가져올 수 있는 데이터에서 관련된 데이터를 가져오기 위해 N 번의 쿼리를 다시 질의해야 하는 문제이다. 예를 들어 아래 쿼리를 보자. 빌딩의 세입자를 가져오기 위해서 빌딩을 쿼리 질의 하고, 이어서 빌딩에 있는 모든 호수를 반복해서 질의한다. DB는 쿼리 질의가 비용과 연결되기 때문에, 매우매우 비효율적인 방법이라고 할 수 있다. N+1 Problem 을 해결하기 위해서는? join 을 사용 하면 쉽다! 하지만 우리는 어플리케이션 단에서 해결해보자고 한다. (라라벨 기준) **Lazy loading

2023년 7월 31일
·
0개의 댓글
·
post-thumbnail

즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)

즉시로딩(Eager Loading) vs 지연로딩(Lazy Loading) &nbsp Spring Data JPA에서 @XXXToOne으로 연관관계가 설정되어 있는경우 기본적으로 즉시로딩(Eager Loading)으로 처리하게 됩니다. 이는 불필요한 join 쿼리가 포함되기 때문에 지연로딩(Lazy Loading)의 사용이 권장됩니다. (단 @XXXToMany는 기본적으로 지연로딩(Lazy Loading)) 지연로딩(Lazy Loading)은 객체의 초기화를 지연시켜 로딩하는 방법으로써 실제 객체 대신 프록시 객체를 로딩 해두고 해당 객체를 실제 사용할 때만(ex. getter 메서드를 사용할 때) 영속성 컨텍스트를 통해 실체 객체를 호출하는 로딩입니다. 즉시로딩(Eager Loading) 예시 &nbsp Member엔티티와 Team엔티티는 N대1 관계 &nbsp 테스트 코드에서 확인 ![](https://velog.velc

2023년 6월 3일
·
0개의 댓글
·
post-thumbnail

Django, N+1 쿼리 문제

참고 https://scoutapm.com/blog/django-and-the-n1-queries-problem N+1 쿼리문제란 뭘까? 쿼리 한번으로 N건의 데이터를 가져왔을때, 원하는 데이터를 얻기위해 N건의 데이터를 가져온 데이터 수만큼 반복해서 2차적으로 쿼리를 수행하는 문제이다. 코드로 보면 먼저 Visitor model을 통해 오늘 방문한 방문객들의 Queryset을 생성했다. django의 lazy한 특성때문에, 해당 query는 아직 실행되지 않는다. 그 다음 선언한 visitors 를 for loop를 통해 순회한다. 각 visitor를 순회하며 코드를 실행한다. 이 때, django는 visitor에 할당된 foreign key person을 가져오지 않는다. person에 대한 정보를 가져오기 위해 해당 line에서 Person 객체에 대한 query를 실행한다. 이처럼 N개의 visitors를 순회하면서

2023년 1월 21일
·
0개의 댓글
·
post-thumbnail

Lazy Loading & Eager Loading

Lazy Loading 이란? > Django에서 Queryset으로 ORM 명령어를 통한 쿼리 요청시 어떤 데이터를 필요로 하는지 모르기에 일일이 쿼리를 보내는 방식 Lazy Loading 방식으로 인해 ORM으로 명령어를 실행할 때마다 Database에 접근해 데이터를 조작하는 것이 아니라 모든 명령 처리가 끝나고 실제 데이터를 접근해야 할 시점이 왔을 때 Database에 쿼리를 실행 예시 books.writer.name 으로 데이터 접근시에 쿼리 발생 Eager Loading > Lazy Loading과 반대로 하나의 Queryset을 가져올 때 사전에 쓸 데이터를 포함한 쿼리를 날려 관련 objects들을 불러오기에 비효율적으로 늘어나는 쿼리를 방지하는 방식 불러온 데이터들은 local data cache에 보관된다 Django에선 prefetchrelated() 또는 selectrelated()를 통해 Laz

2022년 12월 20일
·
0개의 댓글
·

[Python]generators, lazy evaluation

📍generators 값을 반환하고 종료하는 보통의 함수와 다르게 값을 반환한후 산출(yield)하는 함수 iterator를 생성해주는 함수 일반 함수 generator > ### 일반 함수에서 쓰는 return 자리에 있는 yield return처럼 값을 반환 후 next가 호출될때까지 현재의 상태에 머물고 있다가 next함수가 호출되면 이전의 상태에 이어서 다음 연산을 수행 iter을 호출한 후에 next를 호출해야되는 iterator과는 다르게 바로 next를 호출할 수 있다. iterator 예제 generator 예제 > ### 📍send함수 실행 중 send함수를 통해 값을 전달할 수 있다 gen이라는 함수를 생성 (generator_send 함수에는 입력값이 없다) 그리고 첫 element를 접근하기 위해 next(gen)으로 간 후 여기서 send로 함수에 인자

2022년 5월 28일
·
0개의 댓글
·

[django] select_related, prefetch_related

selectrelated / prefetchrelated django 공식문서 표현 대로, 위 2가지는 performance booster다. related objects를 미리 불러와서(caching) DB에 추가로 접근해야 하는 수고를 덜어준다. 사실 지금이야 프로젝트 규모가 작고 데이터 row가 10~20개정도 뿐이라, 큰 차이가 없다고 느낄 수 있지만 데이터가 몇 만 개 쌓이면 쿼리를 그만큼 많이 발생시켜야 한다. ORM의 대표적인 오류가 바로 이러한 N+1 problem 이다. >What is N+1 problem? 쿼리 1번으로 데이터 N건을 갖고왔는데(1 primary query), 참조 정보를 얻기 위해서 N건만큼 2차로 쿼리를 발생시키는 문제를 말한다. 발생 원인: django ORM은 lazy loading을 채택하고 있다. ORM을 명령할 때 데이터를 갖고 오는 것이 아니라, 해당 명령문이 끝나고

2022년 4월 9일
·
0개의 댓글
·
post-thumbnail

Django ORM 최적화

내가 만든 Django ORM(Queryset API)의 성능 테스트 실제 어느부분에서 쿼링이 이뤄지는지 코드를 실행하는 레벨에서 확인하거나, Shell 상에서도 해볼 수 있음 보통의 장고 프로젝트(페이지가 존재하는 경우)에는 django-debugger-toolbar라는 것을 사용 하지만 우리는 API를 만들뿐, 이를 위해 페이지를 구성해서 디버거를 실행시키는 것은 자원 낭비 로깅하는 방법 서버 실행시 코드 실행때마다 쿼리가 찍히게 설정. 예시) 파일로 저장하는 방법 아래와 같이 옵션을 추가하면 디버깅을 통해 볼 수 있음 예시) Queryset의 속성 Lazy Loading 쿼리셋.filter() 등을 쓴다고 해서 그 때 데이터베이스를 호출하지 않음 (대신 queryset.query 안에 호출 조건들의 속성값들을 저장) 그 뒤 쿼리셋.filter()[0], 반복문, list 등을 쓸 때 데이터베이스에 호출(쿼리셋을 평가)을 보냄

2022년 1월 14일
·
0개의 댓글
·
post-thumbnail

Eager Loading & Options in ORM

FriNov20 . . . 저번 글에서는 Lazy Loading과 Cache(Caching)에 대해 공부를 했다. QuerySet은 기본적으로 Lazy Loading 방식을 선택한다. 하지만 SQL로 한 번에 많은 데이터를 가져오고 싶을 때가 있을 것이다. 이를 ORM에서 Eager Loading이라고 부른다. Eager Loading은 즉시 로딩이라는 뜻이다. QuerySet에서는 이를 지원하기 위해 selectrelated와 prefetchrelated라는 메소드를 지원한다. ORM을 잘 이해하지 못하면 N+1문제가 자주 발생하게 된다. > 예를 들어보자. 현재 ERD의 상황은 user와 userinfo라는 테이블이 1:1 관계에 있다. > ` 이렇게 모든 유저의 정보를 가져온 후, 1:1관계인 userinfo의 정보를 가져온다고 가정하자. 여기서 바로 N+1의 문제가 발생하는 것이다. > 현재 users라는 QuerySet에는 모든 user의

2020년 11월 20일
·
0개의 댓글
·