티스토리 뷰

dataaccess를 혁신적으로 편하게 만들어준 MyBatis. SI를 수행하는 사람은 모르는 사람이 없는 스킬셋이다.

이 MyBatis를 사용할때 성능을 꽤 올릴수 있는 방법들이 있다. 


대량데이터를 조회하는 query 설정에 fetchSize 를 넣어주자.

 

결론부터 얘기하자면 테스트하는 환경마다 다르겠지만 약 만건의 데이터를 넣고 조회하는 로직을 수행했을때 fetchSize를 넣은것과 안넣은것은 성능차이는 내가 테스트해본 환경에서는 15배정도 났다.

대용량 조회를 할 경우 fetchSize를 꼭 넣어주자. 

 

visualVM 으로 구간별 속도를 측정을 해봤을때 MyBatis의 DefaultResultSetHandler.shouldProcessMoreRows() 가 거의 대부분의 시간을 차지하고 있었다. 메소드명에서 유추할수 있듯이 다음 row를 찾는 작업들이 오래걸리는 것이다. 이런 시간을 줄이는 것이 fetchSize이고 fetchSize를 적용을 하면 한번에 10개씩 가져오던것을 1000개(1000으로 설정시)씩 가져오다보니 WAS와 DB의 트래픽을 줄여줘서 큰 성능향상을 가져올수 있다. 

 

fetchSize를 설정하는 방법은 다음과 같다. (매우간단)

<select id="selectLargeData" resultType="sample.mybatis.TestVO" fetchSize="1000">
    SELECT * FROM SAMPLE_LARGEDATA
</select>

얼만큼씩 가져올지 설정을 해주면 된다. 프로젝트마다 상황이 다르고 조회건수도 달라 명확한 기준은 없지만 대용량 조회시 fetchSize를 1000~2000정도로 설정하면 적당할듯 싶다. 


성능이 중요하다면 mapUnderscoreToCamelCase 사용을 지양하자.

mapUnderscoreToCamelCase는 UnderscoreCase의 문자열을 CamelCase로 바꿔주는 역할을 하는 설정값이다. Underscore는 sample_mybatis 이런식으로 표현을 하는것이고 CamelCase는 sampleMybatis 로 표현을 하는 것이다. 보통 SQL을 정의할때는 underscore case로 정의하고 자바에서는 camel case로 정의를 하기 때문에 이 둘을 매핑시켜주기 편하게 하기 위해 MyBatis에서 제공을 하는 옵션이다. 하지만 편한만큼 이것들을 파싱을 하는데 많은 리소스가 들어가는듯 하다. 많이 귀찮겠지만 성능이 중요하다면 이 옵션을 사용하지 않고 alias를 이용해 직접 매핑을 해준다면 큰 성능 향상을 가져올수 있다. (테스트 했을때는 약 30프로정도의 성능이 개선되었다. )

 

mapUnderscoreToCamelCase를 해제하는 방법은 설정을 안하는 것이다. (기본이 false)

<settings>
   ...
    <setting name="mapUnderscoreToCamelCase" value="false"/>
   ...
</settings>

 

기본설정(아무것도 안썼을때)이 false이므로 위의 설정으로 넣어주거나 위 구문을 지워주면 된다. 


워낙 잘 만들어진 framework이라 이것으로 인해 골치썩을 일은 거의 없지만 그래도 성능개선이 필요하다면 한번쯤은 시도해보자. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31