파란하늘의 지식창고
반응형

3년 전 쯤에 했던 작업이라 상세한 내용을 적지는 않고 요약해서 정리만 한 글임.


Spring 을 사용하면 보통 web template engine을 thymeleaf를 많이 쓴다.

그런데 thymeleaf가 버전이 올라가면서 자체 성능이 올라갔다고 하지만 실제로 성능 테스트를 해보면 정말 느리고 많이 몰리면 서버가 다운된다.

왜 그런가 힙 덤프를 떠보니 문제가 되던 포인트는 groovy 였다.

groovy의 어느 위치인지 기억이 나지 않지만 자체 캐시 처리를 하는 코드에 synchronized 처리가 되어 있었고 해당 부분에 병목이 생기면서 데드락이 발생해 성능이 저하되었다. (아래 jira의 경우랑 비슷한거 같긴한데 저건 1.5.1 버전의 closed 된 jira라 관련 내용인지 확실하지 않다...)

https://issues.apache.org/jira/browse/GROOVY-2365

자체 코드의 문제가 아니고 오픈소스의 문제였고 그 때 당시 해당 코드에 대해 개발 중인 다음 버전의 groovy에서도 해결되지 않음을 확인하고 groovy 라이브러리를 참조하는 코드가 thymeleaf-layout-dialect 하나 뿐인 상태였고 때마침 thymeleaf-layout-dialect를 groovy 를 제거한 버전이 있어서 교체한 후 성능 테스트를 진행해서 관련 문제가 발생하지 않는 것을 확인하였었다.

https://github.com/ultraq/thymeleaf-layout-dialect/issues/98

spring boot를 사용하면 spring-boot-dependencies에는 다음 thymeleaf-layout-dialect를 참조한다.

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
    <version>${thymeleaf-layout-dialect.version}</version>
</dependency>

위 라이브러리는 groovy를 참조하고 있기 때문에 해당 라이브러리 대신 아래 라이브러리를 참조해야 한다. (버전 명시도 필요함)

<dependency>
    <groupId>com.github.zhanhb</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>

현재 Groovy 에서는 해당 문제가 해결되었는지 모르겠다.

예전에 작업할 때 어느 부분의 문제였는지 기록을 해뒀어야 했는데 찾질 못했다. 

혹 위에 언급한 groovy jira 이슈라면 2.4.x에는 관련 문제가 있었던 걸로보이고 2.5.x에서 관련 코드가 수정된 걸로 보인다. (왜 저 jira 는 1.5.1 버전에 대한 수정이슈인건지 모르겠다.)

하지만 해당 jira ticket에도 올해까지 성능관련 댓글과 관련 jira (이 글을 쓴 현재 시점에 오픈 상태임)가 연결되어 있는 걸로 봐선 아직 해결이 되지 않은 부분이 있는 듯하다.

thymeleaf-layout-dialect를 사용하는 경우 spring에서 관리해주는 ultraq대신 groovy가 제거된 zhanhb 의 라이브러리를 쓰는 것을 권장한다.

 

반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요