레이지 로딩 (Lazy Loading)

허성재's avatar
Aug 23, 2024
레이지 로딩 (Lazy Loading)
Contents
예시
레이지 로딩(Lazy Loading)은 필요할 때까지 데이터를 지연해서 로드하는 프로그래밍 기법입니다. 이 방법은 특히 웹 애플리케이션에서 리소스 로딩을 최적화하고 성능을 향상시키는 데 유용합니다.

레이지 로딩의 주요 개념

  1. 필요할 때 로드: 레이지 로딩은 사용자가 특정 리소스를 요청하기 전까지 해당 리소스를 로드하지 않습니다. 예를 들어, 웹 페이지에서 사용자가 화면을 스크롤할 때까지 이미지를 로드하지 않는 경우가 이에 해당합니다.
  1. 성능 최적화: 초기 로딩 시 모든 리소스를 불필요하게 로드하지 않기 때문에, 페이지 로딩 속도가 빨라지고 서버 부하도 줄어듭니다.
  1. 리소스 절약: 사용자가 실제로 필요하지 않은 리소스를 로드하지 않음으로써 메모리 및 대역폭 사용을 절약할 수 있습니다.

레이지 로딩의 사용 예

  • 웹 이미지: 웹사이트에서 모든 이미지를 한 번에 로드하지 않고, 사용자가 스크롤을 내릴 때마다 이미지가 로드됩니다.
  • 데이터베이스 쿼리: 애플리케이션에서 모든 관련 데이터를 한 번에 가져오지 않고, 특정 데이터가 필요할 때만 데이터베이스 쿼리를 실행합니다.
  • 컴포넌트 로딩: 대형 웹 애플리케이션에서 모든 컴포넌트를 한 번에 로드하지 않고, 사용자가 특정 페이지나 기능을 요청할 때만 해당 컴포넌트를 로드합니다.

레이지 로딩의 장점

  • 초기 로딩 시간 단축: 초기 페이지 로딩이 더 빠릅니다.
  • 리소스 사용 최적화: 서버와 클라이언트 모두에서 리소스가 효율적으로 사용됩니다.
  • 사용자 경험 향상: 필요한 시점에만 로드되어 사용자의 경험을 방해하지 않습니다.

단점

  • 추가 구현 복잡성: 레이지 로딩을 구현하려면 더 많은 코드를 작성해야 하고, 로딩 타이밍을 관리하는 데 신경 써야 합니다.
  • 지연 시간 발생: 리소스가 즉시 로드되지 않기 때문에, 사용자가 리소스를 요청할 때 잠시 지연이 발생할 수 있습니다.
레이지 로딩은 효율적인 리소스 관리와 성능 향상을 위해 널리 사용되는 기법으로, 특히 대규모 애플리케이션에서 중요한 역할을 합니다.
 
 

예시

notion image
 
notion image
 
Board와 User테이블이 있다. board안에 User의 id로 fk를 설정
 
notion image
 
더미를 세팅하고
 
notion image
 
board의 전체를 조회 하였을때
 
notion image
 
Board객체 생성하고 데이터를 읽고 쓰는 과정에서 포레인 키를 만나 userid =1 과 userid=2 를 찾기 위해 User테이블을 두번이나 select하는 걸 볼수 있다.
근데 내가 굳이 Board안의 User객체의 모든 정보가 필요가 없을 경우엔 이런방식은 비효율 적이다. 그렇기에 내가 필요하다고 하기전까지 User안에 id값을 제외한 나머지 정보들을 찾지 않고 처리하기위해 Lazy loading을 쓴다.
 
spring 에서 Lazy loading을 쓰는법은
notion image
@ManyToOne(fetch = FetchType.LAZY)
를 붙혀주면 끝이다. 이렇게 하게되면 Board 전체를 조회 할때 User테이블을 select하지 않고 처리한다.
notion image
 
User객체안엔 Id밖에 없는 상황에서 만약 getUsername을 찾으면 어떻게 될까??
진짜 신기한게 이놈이 User객체 안에 없는 정보를 찾을때 select를 돌린다.
notion image
이렇게 테스트를 실행 하였을때
notion image
이렇게 나온다. 첫번째 조회에 서보면 board 테이블만 select하는걸 볼수 있고, User객체의 id도 들어가 있는 것을 볼 수 있다. 그리고 만약 lazy 로딩해서 데이터가 없는 getUsername()을 돌리면 늦깍이 user테이블에서 찾는 모습을 볼 수 있다.
 
notion image
만약 board 전체의 username을 다 찾게 되면 어떻게 될까?
 
notion image
결과는 이렇다. user의 정보를 캐싱해서 들고있는건 바로바로 써주고 없는친구는 다시 select해서 캐싱한다. 신기하지 않아?
 
Share article

heo-gom