인프런 커뮤니티 질문&답변

김종호님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V4: JPA에서 DTO 직접 조회

@lob 관련하여 질문 드립니다.

해결된 질문

작성

·

1.2K

3

안녕하세요!
JPA를 활용하여 여러가지 조회테스트를 해보고 있는데 @lob 컬럼이 존재하는 경우 select시 쿼리가 매우 느린현상을 발견했습니다. @lob 컬럼이 존재하는 경우에 쿼리를 빠르게 수행할 수 있는 방법이 있을까요?

답변 6

2

김영한님의 프로필 이미지
김영한
지식공유자

종호님 추천을 해드리고 싶은데... 제가 공부했던 시절의 책들이 다 절판되었네요...(오래되었네요 ㅎㅎ)

이 부분은 서점에 한번 가셔서 본인에게 맞는 가장 쉬운책을 찾는 것을 추천합니다^^

감사합니다.

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 종호님

@Lob 컬럼은 보통 데이터 사이즈가 크기 때문에 조회시 성능저하가 발생하게 됩니다.

특히 데이터 조회가 많은 리스트에서는 @Lob를 제외하고, 상세 화면에서만 @Lob를 조회하는 상황이 많은데요.

이런 경우 JPA를 사용할 때는 다음과 같은 해결방법이 있습니다.

1. @Lob 컬럼을 원본 테이블과 분리해서 별도의 테이블로 만들고 @Lazy로 사용한다.(그래서 꼭 필요할 때 조회한다.)

2. 원본 테이블을 조회할 때 DTO로 조회하고, 이때 @Lob컬럼은 제외한다. 이후에 @Lob는 꼭 필요할 때 따로 조회해서 사용한다.

3. @Basic을 활성화 하는 방법(설정이 복잡해서 비추천) 참고: https://vladmihalcea.com/the-best-way-to-lazy-load-entity-attributes-using-jpa-and-hibernate/

감사합니다.

1

김종호님의 프로필 이미지
김종호
질문자

넵! 감사합니다~

1

김영한님의 프로필 이미지
김영한
지식공유자

네 종호님

@Lob가 DB에 따라 다르겠지만, 보통 내부에서 추가로 한번 더 별도의 조회가 일어납니다. 그래서 더 느립니다.

그리고 index는 이게 딱 정답이 없습니다. 그냥 조건이 7개면 7개 모두 인덱스를 거셔도 됩니다. 하지만 이렇게 되면 write 성능이 느려집니다. write시에 7개의 인덱스를 모두 갱신해야 하니까요. 최대한 순서에 맞는 composite를 잘 활용하고, 보통 자주 사용하는 것 위주로 걸어줍니다. 추가로 데이터베이스 성능 관련 책을 한번 보시면 어느정도 감이 오실거에요^^

감사합니다.

0

김종호님의 프로필 이미지
김종호
질문자

감사합니다! 마지막으로 데이터베이스 성능 관련 책을 추천해주실수 있으실까요?

0

김종호님의 프로필 이미지
김종호
질문자

답변 정말 감사합니다! @Lob 컬럼에 데이터 사이즈가 크지 않더라도 성능 저하에 큰 영향을 끼치는 것 같습니다 ㅠㅠ
한가지 더 궁금한점이 있습니다. 다양한 Query 조건이 다양한 경우 예를 들어서 SearchQuery같이 where절에 들어가는 조건들이 아주 많을 경우에 어떤 col을 기준으로 index를 걸면 좋을지 궁금합니다.(조건이 7개라고 하면 그중에서 가장 중요한 col에 단일 index를 걸거나 자주 사용되는 조건이 3개면 해당하는 조건 3개를 대상으로 composite index를 거는지 등등)