코딩을 하는 이유적인 이유로, 실질적인 도움이 되는 무엇인가를 하는 행위는, 행위가 널리 알려지는것이 대체로 좋다는 결론에 도달했다. 그런이유(?)에서 현재의 블로그의 속도를 개선하기 위해 벼르고 벼르던 AppEngine MemCache와 DataStore를 이용한 캐시를 구현했다.
데이타 저장영역을 하나로 모아야 캐쉬하기가 쉬워서, ContentStore라는 영역을 추가했고, 캐싱된 자료에는 updatedTime을 두어서, 최신 업데이트 시간과 비교를 하도록 했다.
일차적으로 MemCache를 사용하고, 만일 MemCache에서 자료가 없어졌다면 DataStore를 읽고, 그것마저 없다면 원본이 있는 Cloud에서 자료를 로딩하도록 수정했다.
작업중에 알게된 몇가지 팁.
- XML을 이용한 Spring DI에는, DI후 최초 호출해줄 init-method라는 attribute가 있다. 이를 이용해, 내부 전략객체들이 다시 dependecy들을 배분하거나 DI후 최초 초기화를 용이하게 할 수 있다.
- DataStore의 Property의 저장용량이 굉장히 작다. 다만, Text라는 편리성 객체를 제공해 사용에는 큰 불편은 없다.
- 확실히 구조는 개발을 하는 과정에서 좋아진다. 레거시가 사실은 도메인을 알아가는 좋은 자산일수 있다.
- DataStore에 같은 kind - 다른 name (id)의 Entity를 추가하려면 cross-group 옵션으로 transaction을 생성해야 한다 (withXG(true)). 그럼에도 한번에 할 수 있는 cross-groups의 entity수가 매우 제한적이라, 그냥 하나의 entity를 추가할때마다 transaction을 만드는게 편리할 수 있다.
3s정도 걸리던것이 500ms정도로 단축되었으니, 꽤나 결과에 만족하고 있다. 계속 모니터링하면서 버그와 AppEngine instance 점유여부도 지켜봐야겠다.