LazyInitializationException

ndy·2023년 12월 13일
0

데이터베이스에서 데이터를 가져올 때, '지연 로딩(Lazy Loading)'과 '즉시 로딩(Eager Loading)'이라는 두 가지 전략을 사용할 수 있습니다.

즉시 로딩(Eager Loading):
즉시 로딩은 이름 그대로 연관된 데이터를 객체를 조회하는 즉시 모두 불러오는 방식입니다. 예를 들어, '게시글'을 데이터베이스에서 조회할 때 '즉시 로딩'을 사용하면, 게시글 뿐만 아니라 그 게시글에 연관된 '댓글', '작성자 정보' 등도 함께 즉시 불러옵니다. 이 방식은 필요한 모든 정보를 한 번의 데이터베이스 쿼리로 가져올 수 있기 때문에 네트워크 비용이나 쿼리 호출 횟수는 줄일 수 있지만, 사용하지 않을 정보까지 불러오게 되어 메모리를 불필요하게 많이 사용할 수 있습니다.

지연 로딩(Lazy Loading):
지연 로딩은 객체가 실제로 필요할 때까지 데이터의 로딩을 미루는 방식입니다. 같은 예로 '게시글'을 조회할 때 '지연 로딩'을 설정하면, 처음에는 게시글 정보만 불러오고, 연관된 '댓글'이나 '작성자 정보'는 실제로 그 데이터에 접근(예: 메소드 호출)하는 시점에 데이터베이스에서 가져옵니다. 이 방식은 초기 쿼리에서는 필요한 최소한의 데이터만 불러오기 때문에 리소스를 절약할 수 있지만, 나중에 각각의 연관 데이터에 접근할 때마다 추가적인 쿼리가 발생하여 전체적인 성능이 저하될 수 있습니다.

LazyInitializationException 발생 이유:
Hibernate 같은 ORM(Object-Relational Mapping) 툴에서는 이 지연 로딩을 관리해주는데, 지연 로딩된 객체에 접근하려고 할 때 해당 객체의 데이터를 불러오기 위해 데이터베이스 세션이 필요합니다. 만약 해당 시점에 데이터베이스 세션이 이미 닫혀 있다면(예: 웹 요청 처리가 완료되어 세션이 종료된 상태), Hibernate는 더 이상 데이터베이스에서 데이터를 가져올 수 없고, 이 때 LazyInitializationException이 발생합니다.

간단히 말해서, 지연 로딩은 필요할 때까지 데이터를 가져오지 않다가, 실제로 그 데이터가 필요한 순간에 가져오는 방식입니다. 하지만 그 순간에 데이터베이스와의 연결이 이미 끊겨있다면, 데이터를 가져올 수 없어 오류가 발생하는 것입니다.

0개의 댓글