ASH84

Software Engineer/Developer, co-founder of Payhere. Ex-Banksalad. Intereseted in iteroperability, bootstrap company, writting.

[JAVA] HashTable 을 이용한 로컬캐쉬(LocalCache)

created:2011-11-30
updated:2017-04-25
edit

자바 프로그래머도 아니면서 자꾸 자바 소스코드를 내놓게 되는데 사실 환경만 구축되어 있으면, 이것만큼 쉽게 프로토타입핑을 쉽게 해 볼수 있는 언어도 드문것 같다. 오늘 소개한 코드는 일명 로컬캐쉬(LocalCache) 라는 것이다. 만든 취지는 원래 회사에서 캐쉬관련 모듈이 있는데, 캐쉬라는것은 한 마디로 미리 저장해 놓는 개념이라고 볼수 있다. 그래서 자바의 HastTable 을 이용해서 로컬캐쉬 즉, 프로그램 내에서 싱글턴의 형태로 존재하면서 무엇인가를 저장하고 있다가 요청하게 되면 반환해 주는 것이다. 여러가지로 활용될수 있는 여지가 있다고 생각되어 진다. 특정 API 관련된 결과를 다시 호출할 필요없이 일정기간 내에서는 로컬 캐쉬내에서 찾아서 보여준다면 빠르지 않을까?

1. 용량제한 장치

– 사실 엄청 많은 데이터를 넣을수는 있지만, 메모리 부족 문제가 생길수 있다. 그리고 해쉬테이블 상 Java 의 Object 형을 인자로 받기 때문에 모든 형들이 다 들어갈수 있다. 원래 취지는 데이터 사이즈를 고려해서 특정 데이터 사이즈 이상은 넣지 않는 것으로 할려 했으나, C에서 처럼 sizeof() 함수가 없기 때문에 건수 자체(limitchcheentry )를 지정하는 방식으로 되어 있다.

2. 타이머 기능

– 타이머 기능은 당연히, 특정 시간 동안에만 캐쉬를 유지하는 기능이다. 너무 오랫동안 유지할 경우, 메모리 부족의 문제도 있기 때문에 시간을 둔것이다. 사용자가 설정한 시간이 지나면 저절로 해쉬테이블 내의 모든 데이터를 초기화 시킨다.

3. 멀티스레드 기능

– 당연히 멀티스레드를 생각했었고, 처음부터 멀티유저 동시 접속시의 성능향상을 위해서 만든 것이다. 때문에 멀티스레드를 위한 다양한 장치를 했는데 우선 본 클래스의 인스턴스 생성은 아예 한번만 이루어지고, 해당 인스턴스를 빌려서 쓰게 만드는 방식을 사용했다. 사실은 getInstance() 함수에서 Null 인지를 체크하고 널인 경우에만 인스턴스를 생성해서 반환하는 방식을 사용했는데 멀티쓰레드의 보장 문제가 테스트 할때 발견이 되어서 급히 수정했다.

그리고 또 한가지는 바로 setCache() 함수시의 내부에서 선 진입스레드가 수행하고 후 진입 스레드는 계속 대기(waiting)하는 것이 아니라, 대기하면서 계속 해쉬테이블 안에 키가 있는지 확인하는 과정을 거치게 만들었다. 선진입한 스레드와 후 진입한 스레드가 동일한 데이터를 쓰려고 하면 문제가 발생하는것은 아니지만, 후 진입한 스레드의 입장에서는 시간낭비이기 떄문이다.

사실 이 로컬캐쉬 코드와 쌍으로 이루어서 쓸수 있는것은 전에 포스팅에서 했던 MD5를 만드는 자바코드이다. 사실 해쉬테이블은 키-값, 키벨류 방식의 사전(Dictionary) 형태이기 때문에 하나의 데이터를 넣기 위해서는 고유한 키가 필요하다. 때문에 MD5 코드를 통해서 특정한 string 값을 입력하면 MD5의 형태로 문자열을 출력하고, 그 문자열을 해쉬테이블의 키 값으로 사용하는 것이다. MD5가 완벽하게 확실한 키 값을 추출해 준다고 말할수는 없겠지만, 테스트 결과 같은 문자열을 넣으면, 같은 MD5 키를 추출해 주었다.

좀더 좋은 의견이나 개선사항이 있으면, 무조건 댓글 달아 주시라.^^


#An Seong Hyun  #Cache  #dev  #Hashtable  #Java  #local cache  #MD5  #안성현  #자바  #캐쉬  #프로그래밍  #해쉬테이블