본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[DesignPattern] Design Pattern에서 성능 향상에 Critical한 Cache Management Pattern에 대해 파헤쳐 봅시다.

by 돼지왕왕돼지 2012. 1. 23.

0. History


- 이 글은 2012-01-23 초안 작성 시작하였습니다.
- 오래된 정보, 잘못된 정보, 오타가 있으면 Comment 남겨주세요. 확인 후 수정 하겠습니다.
- 이 글은 2012-01-23 초안 작성 완료하였습니다.




1. Information


Cache Management Pattern 이 뭔지 설명해주세요?


Cache 의 정의를 먼저 간단히 짚고 넘어가 보죠.
Cache 라는 것은 자주 사용하는 것들을 가까이(?) 두어 빠르게 접근 할 수 있도록 하는 것이죠.
Memory 관점에서 볼 때, CPU 에서 Memory 에 접근하는 것이 Hard Disk를 접근하는 것보다 빠르죠?
이와 같은 맥락으로 CPU와 Memory 사이에도 L1 Cache, L2 Cache 라는 memory space 를 두어
더 빠르게 접근하는 것이 Cache의 형태입니다.


여기서 다룰 Cache Management Pattern 도 비슷한 개념입니다.
"자주 사용하는 것들을 미리 memory에 올려 놓는 것" 또는 "오래 걸리는 작업 결과를 별도의 저장장치에 저장해 놓는 것" 입니다.



요즘은 Hardware도 빠른데 Memory 에 올려 놓는 것이 그렇게 큰 효과가 있나요?


네, 큰 효과가 있습니다.
아무리 Hardware 가 발달했다고 해도, I/O ( Input & Output ) 에 대한 속도는 매우 느린 편입니다.
따라서 "접근에 시간이 많이 소모되는 객체들",
다시 말해 Network 를 통해 다운을 받거나, 오래 걸리는 계산 결과, 데이타 베이스 query 결과 등을
Memory 상에 유지하여 다시 사용하려 할 때, 불필요한 network 연결, 재계산, 재 query 를 피할 수 있습니다.

이런 오래 걸리는 작업들이 불리는 횟수가 많으면 많을 수록 이 cache 의 효과는 더욱 더 커지며,
Mobile device 같이 UI 가 있는 플랫폼에서 무거운 작업을 하면 UI Event 처리를 방해할 가능성도 매우 높습니다.



그럼 이 Cache Management Pattern 은 어떻게 쓰는 건가요?


이 Cache Management Pattern 은 방법론이며 딱 '이렇게 쓰세요~' 라는 guide 는 없습니다.
Memory상에 올리고 싶으면, HashTable, HashMap 을 써도 좋고, 간단히 한가지에 결과에 대한 cache를 할 경우
global variable 하나로도 충분합니다.

반면에 Internet 그림파일들에 대한 Cache의 경우는 Memory에 모두 들고 있을 경우 메모리 부족현상이 나타날 수도 있습니다.
이럴 때는 Hard Disk 에 저장하는 방식도 좋은 방식입니다.

여기서 제가 제안할 수 있는 것은 Cache Management Pattern에 주로 사용되는 구조입니다.
Java 기준으로 제시하겠습니다.

CacheManager.java : 캐쉬 전체를 관리하고 외부에 인터페이스를 제공하는 class.
CacheConstant.java : 캐쉬 관련된 상수들을 정의하는 class.
CacheFetcher.java : Cache에 객체가 존재하지 않을 때, Cache용 객체를 생성하는 fetcher.
ObjectID.java : Cache의 키로 사용되는 객체입니다. Simple 하게 int나 long 값을 사용한다면 필요 없습니다.
HashTable, Vector : Caching 되고 있는 객체들을 보관하는 Collections.




손가락 추천 꾸욱~ 더 좋은 글로 보답하겠습니다.



2. Summary


- Cache Management Pattern 은 자주 사용하는 것들과 시간이 오래 걸려 도출되는 결과물들을 Memory 상에 보관하여, 빠르게 재사용 할 수 있도록 하는 pattern 을 말합니다.

- Cache Management Pattern 은 "이렇게 하세요" 라는 guide 보다는 "이렇기 때문에 이런 방법을 적용해보세요" 라는 방법론에 가깝습니다. 일반적인 class 구성은 CacheManager.java, CacheConstant.java, CacheFetcher.java, ObjectID.java, Collections 입니다. 




3. Tags

 





댓글0