[DEBUG] JPA/Hibernate LazyLoading이 설정이 안 먹을 때 간단한 추적 방법 프로그래밍

JPA나 Hibernate에서 특정 필드를 분명히 Lazy Loading 설정하였고, 독립된 코드로 실행할 때는 분명히 LazyLoading이 잘 되는 것을 확인 하였으나, 실제로 작동하는 코드에 넣었더니 Lazy Loading이 안 먹고 어디선가 SQL query를 날리더라 하는 경우가 발생할 것이다.

즉, Lazy Loading 설정을 잘 마쳤으나, 분명히 Lazy Loading이 되어야 할 웹 페이지 호출 단계의 (컨트롤러나 서비스, 웹페이지) 어딘가에서 Lazy Loading 설정된 필드의 Getter 메소드가 호출된 상황일 경우가 많이 발생한다.

이 때 도대체 어디서 이노무 것이 호출 되었는지 알아내기가 번잡스럽다면 다음 방법을 써본다. 여기서는 엔티티 객체의 contents 필드가 Lazy Loading 설정되어진 상태라고 간주한다.

public String getContents() {
    try {
        throw new NullPointerException("getContents Lazy Loadign 추적");
    } catch(Exception ex) {
        ex.printStackTrace();
    }

    return contents;
}


즉, 일부러 예외를 발생시켜 getContents()가 호출 될 당시의 StackTrace를 통해서 getContents()를 호출한 코드의 계층 구조를 파악하는 것이다. 당연히 저 코드는 테스트후에 제거해야 한다. 안그러면 성능상에 상당한 불이익을 당하게 될 것이다.

StackTrace 읽는 것이야 다들 아실테니 패스.

그리고, 저기 보면 String에 대해서 Lazy Loading을 한 것처럼 했는데, 실제 Hibernate에서는 일반적인 방법으로는 String 필드의 Lazy Loading은 불가능하다. 이에 관해서는 네가지 정도의 방법이 있는데, 나는 주로 JPA One-To-One 게시판 형태에서 게시글에 대해 @ElementCollection을 사용한 LazyLoading 구현을 사용한다. 이 외에도 여러 방법이 있지만 복잡도가 높아지므로 @ElementCollection 방법을 권장한다.