MultipleBagFetchException 피하는 방법

주요 포인트!

Set 으로 바꾼다고 해결되지 않을 수 있다. Cartesian Product 로 인해서 어떤 상황에서는 문제가 더 커진다.

따라서 가장 올바른 해결 방법은 1번 쿼리에 1개의 association 만 조회하기!

참고: https://vladmihalcea.com/hibernate-multiplebagfetchexception/

P6SPY – SQL 파라미터 값 바인딩하여 편하게 보는 Library

P6SPY

  • SQL 파라미터 값 바인딩하여 편하게 보는 Library

설정 방법

build.gradle

implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1")

결과

2023-02-11 14:15:58.653 DEBUG 54753 --- [           main] org.hibernate.SQL                        : 
    /* insert datajpa.entity.Member
        */ insert 
        into
            member
            (username, id) 
        values
            (?, ?)
2023-02-11 14:15:58.654  INFO 54753 --- [           main] p6spy                                    : #1676092558654 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa
/* insert datajpa.entity.Member */ insert into member (username, id) values (?, ?)
/* insert datajpa.entity.Member */ insert into member (username, id) values ('memberA', 1);
2023-02-11 14:15:58.655  INFO 54753 --- [           main] p6spy                                    : #1676092558655 | took 0ms | commit | connection 3| url jdbc:h2:tcp://localhost/~/datajpa

참고

application.yml 에서 logging.level.org.hibernate.type: trace 는 생략해도 된다.

p6spy 사용하기 때문에 파라미터가 중복되서 출력이 된다.

주의 사항

운영환경에서 성능 확인하고 사용할지 말지 결정하기

기타

spring-boot 2.7.8 에 p6spy 1.9.1 버전을 사용할 경우 로그에 파라미터가 바인딩되지 않는 현상이 있음.

H2 DB

로컬 설치 후 처음에 접속 안될 때, 파일로 직접 접근

jdbc:h2:~/[database_name]

ex) 
jdbc:h2:~/h2db
  • 파일에 데이터를 만들어주게 된다.
  • 그런 후에는 jdbc:h2:tcp://localhost/~/h2db 처럼 네트워크 통해서 원격으로 접속하면 된다.
    • 계속 파일로 접근할 경우, 락이 잡힐 수 있기 때문에 여러 군데에서 동시 접근이 안 될 수 있기 때문이다.

네트워크 통해서 원격 접속

jdbc:h2:tcp://localhost/~/[database_name]

ex)
jdbc:h2:tcp://localhost/~/h2db