본문 바로가기

프로그래밍/Spring

Spring Framework에서의 독특한 ehcache 사용기... (3)

지난 글에서는 ehcache를 사용하여 cache 데이터를 넣거나 조회하는 서비스 코드에 대해 설명했다. 이제 이 사용기의 마지막으로 앞에서 만든 서비스 코드를 사용했던 코드와 그리고 이 코드를 리뷰하면서 갖게된 개선점을 얘기해보고자 한다. 앞에서 만든 코드도 엄연히 Spring에 등록되는 bean이기 때문에 @Autowired 어노테이션을 통해 해당 서비스 객체를 받을수가 있다. 그리고 캐시 서비스를 사용하는 곳은 사용자가 만든 서비스에서 사용되므로 다음과 같이 작성하였다(이것은 예제용 코드로 내가 실제로 작업한 코드와는 차이가 있다)

 

@Service
public class MyImpl implements MyService {

	private final Log logger = LogFactory.getLog(this.getClass());
	
	@Autowired
	MyDao dao;
	
	@Autowired
	CacheService cacheservice;
	
	
	@Override
	// @Transactional(readOnly=true)
	public int getCount(String my_id, String my_code) throws Exception {
		// TODO Auto-generated method stub
		long interval = Long.parseLong(MyProperties.getProperty("myinterval"));
		
		List<MyVO> dbresult = (List<MyVO>)cacheservice.getCache(dao
				, "getMyInfo"
				, MyProperties.getProperty("MyInfo.cacheKey")
				, interval
				, my_id
				, my_code
				);
		int result = 0;
		if(dbresult != null){
			result = dbresult.size(); 
		}
		
		return result;
	}
}

 

이 코드에서는 캐시 서비스를 사용한 다음의 코드를 보면 된다

 

List<MyVO> dbresult = (List<MyVO>)cacheservice.getCache(dao
		, "getMyInfo"
		, MyProperties.getProperty("MyInfo.cacheKey")
		, interval
		, my_id
		, my_code
);

 

getCache 함수는 캐시의 갱신 기간이 지났을 경우 다시 DB에서 조회해서 이를 캐시에 넣어야 하기 때문에 가져오고자 하는 데이터를 DB에서 조회하는 서비스 객체가 들어가야 한다. 그래서 첫번째 파라미터로 @Autowired로 받은 dao가 들어간다. 그리고 dao에서 조회하는 함수를 실행해야 하기 때문에 두번째 파라미터로 조회하는 함수 이름인 getMyInfo가 들어가고 세번째 파라미터로는 프로퍼티에서 조회된 캐시키가, 네번째 파라미터엔 시스템에서 정해진 캐시 갱신 기간인 interval이, 다섯번째와 여섯번째는 getMyInfo 함수를 실행할때 사용할 파라미터인 my_id와 my_code가 들어가게 된다. 이를 정리하면 캐시 데이터를 조회하여 정해진 interval 시간 보다 초과되었을 경우 캐시 서비스가  내부적으로 dao.getMyInfo(my_id, my_code)를 대신 실행하여 그 결과를 다시 캐시에 넣은뒤 새로이 조회된 결과를 리턴하게 된다. 만약 interval 시간 이하인 경우엔 캐시에 있는 데이터를 그대로 리턴하게 된다.

 

그리고 소스를 보면 @Transactional이 주석처리 되어 있다. DB를 조회하는 것이라 @Transactional을 굳이 넣을 필요는 없지만 일관성을 유지할려고 그 코드를 넣었었는데 오류가 났었던 것으로 기억이 난다. 몇개월이 지난 뒤라 왜 오류가 났는지 기억은 나지 않지만 혹 이 코드를 보고 직접 만드는 사람이 있다면 일단 넣어서 테스트 해보기를 바란다.

 

이제 이 사용기의 마지막으로 개선점을 얘기해보고자 한다. 지금까지 설명한 내용을 보면 캐시 서비스가 기존의 사용자 서비스 함수를 대신 실행하여 그 결과를 캐시에 넣는데 이 부분은 Spring에서 AOP 기능을 활용하면 된다. 하지만 변명아닌 변명을 해보자면 개발 기간이 정해져 있었던 데다가 내 스스로 Spring 내공이 깊질 못해 미처 거기에 생각을 못해 생각이 나는 대로 개발하였는데 만약 이 글을 보고 이러한 기능을 개발한다면 AOP를 활용해서 개발해보길 권장한다. Spring Framework를 사용하여 개발한다면 최대한 Spring에서 제공하는 기능을 활용하여 개발하는 것이 맞기 때문이다.