Spring Boot 성능 개선: Ehcache와 Redis로 페이지 로딩 속도 향상하기
시스템이 느려졌다..
우선 springboot web framework를 사용하여 개발중이기 때문에 backend 에서 모든 정보가 model 에 들어간 뒤에야 web 페이지 로딩이 시작된다 이 문제를 해결하기 위해서는 제일 먼저 backend 최적화였기에 여러가지 방법을 찾아봤다. 우선 당연히 2중 for문, 자료구조를 활용하여 최적화를 진행했지만 이런 방법으로도 해결되지 않는 느림이 있었다…
그것은 바로! DB접근이었다! 이를 해결하기위해 spring cache 를 도입했다.
spring cache
spring 은 cache 를 지원한다! 내가 알고 있는 그런 cache 와는 조금 달랐지만 method cache (이름은 내맘대로) 를 지원했다. 아래와 같은 꼴이다.
1
2
3
4
5
6
7
8
9
public CacheableUtils {
@Cacheable(cacheNames = "cacheName")
public add (int a, int b) {
return a + b;
}
@CacheEvict(allEntries = true, value= "cacheName")
public evictAdd () {}
}
위처럼 선언하게 되면
1
2
3
4
5
cacheableUtils.add(1, 2); // 실제로 method 호출
cacheableUtils.add(1, 2); // method 호출 되지 않고 3 리턴
cacheableUtils.add(1, 3); // 실제로 method 호출
cacheableUtils.evictAdd(); // Cache Reset~
cacheableUtils.add(1, 2); // 실제로 method 호출
이렇게 동작하게 된다! 지금은 더하기뿐이지만 저 안에 DB에 접근하는 부분이 들어간다면 DB에 직접 접근하지 않고도 빠르게 정보를 가져 올 수가 있다. 그 정보가 update 되는 시점에서는 evict 를 해주면 동기화도 되고 아주 편하다 Q&A 플랫폼을 만들고 있기때문에 글이 수정되는 이벤트는 엄청 많지 않아서 이렇게 cache 를 도입하는것은 매우 큰 도움이 되었다.
ehcache.xml
캐시의 설정은 ehcache.xml 을 통해서 할 수 있다. 버전마다 다르지만 아래와 같다 ttl 은 그 cache 가 살아있을 시간이다 (tti 라고 사용되지 않은 idle시간으로도 설정 할 수 있다) heap entries 는 저장하고 싶은 cache entry 개수의 max 이다
1
2
3
4
5
6
7
8
<cache alias="cacheName">
<expiry>
<ttl unit="hours">24</ttl>
</expiry>
<resources>
<heap unit="entries">20</heap>
</resources>
</cache>
실제로 이렇게 개선을 진행하였더니 꿈에 그리던 페이지 로딩시간 100ms 를 달성 해 낼수 있었다!
Redis
ehcache 는 서비스 안에 저장되는 것이다. 따라서 global cache 를 사용하기 위해서는 Redis 서비스를 따로 띄운다음 spirng 과 연결을 해주면 된다. 사용 방법은 기본적으로 같고 ehcache.xml 만 삭제되고 redis config 를 지정해주면 아주 간단하게 변경이 가능하다! 아직 운영에 반영하지는 못했지만 우리에게 자원이 더 주어진다면 당장 Redis 를 사용할것이다!