트러블 슈팅 : 디버거에서의 지연 로딩(Lazy Loading) 트랩

song yuheon·2023년 10월 19일
0

Trouble Shooting

목록 보기
35/57
post-thumbnail
post-custom-banner

문제 상황

코드를 진행 중 getbooks.get(0)을 사용해 특정 책 하나만을 조회하려고 했으나, 이상하게 전체 책을 조회하는 쿼리가 실행되었다는 문제가 발생했다.
특히나 디버거를 통해 실행할 때와 콘솔에서 직접 실행했을 때 쿼리의 결과가 다르게 나타났다.

콘솔

디버거


문제 탐색

문제를 해결하기 위해 디버거를 사용하여 코드의 실행을 중단하고 객체의 현재 상태를 확인해보았다.
그 결과 코드 실행은 멈춰있는 상태이지만 디버거로 이동해서 해당 객체를 클릭했을때 지연 로딩이 설정된 객체를 조회하기 위한 쿼리가 실행되는 것을 확인할 수 있었다.

원인 파악

이러한 현상은 "디버거 지연로딩 트랩"으로 알려져 있다.
Java와 ORM 프레임워크를 사용할 때 디버거를 통해 코드를 디버깅하면서 해당 객체의 상태를 확인하려 하면 그 객체에 설정된 지연 로딩이 동작하게 된다.
이로 인해 디버거는 실제 데이터를 로드하기 위해 데이터베이스에 쿼리를 요청하게 된다.

주의사항 및 해결 방법

  • 원치 않는 쿼리 발생
    코드 실행 도중에 예상하지 못한 쿼리가 실행될 수 있다.
    이는 디버깅 시 객체의 상태를 확인하면서 발생하므로 해당 객체에 지연 로딩이 설정되어 있는지 사전에 확인해야 한다.

  • 트랜잭션 이슈
    디버깅 중 발생하는 지연 로딩 쿼리는 기존의 트랜잭션 범위에서 실행되지 않을 수 있다.
    이로 인해 데이터의 무결성 문제가 발생할 가능성이 있다.

  • 데이터 접근 문제
    디버거로만 객체를 확인했을 때 실제 코드 상에서 필요한 데이터에 접근하지 못하는 문제가 발생할 수 있다.
    따라서 디버거 상에서의 데이터 상태와 실제 코드 실행 시의 데이터 상태가 다를 수 있음을 인지하고 있어야 한다.

정리

디버깅을 진행할 때는 지연 로딩의 동작 방식에 대한 이해가 필요합니다. 디버거를 사용하여 객체의 상태를 확인하면서 발생하는 데이터베이스 쿼리에 주의해야 하며, 이로 인한 부작용을 방지하기 위해 충분한 주의가 필요합니다.

profile
backend_Devloper
post-custom-banner

0개의 댓글