[Spring Framework]Spring Framework에서 chcache를 사용해보자!

 

회사에서 프로젝트를 진행하면서 메뉴관리 부분을 개발을 하게 됐다. 
관리자가 상단이나 좌우측 메뉴 등을 수정하고 순서도 변경할 수 있게 조작할 수 있어야 하며

새로운 페이지가 생성되면 연결도 할 수 있게 메뉴 추가도 삭제 수정 등이 진행되어야 한다.

 

개발을 하면서 막히는 부분은 없었지만 갑작스럽게 생각이 난 부분이 있다. 

메뉴는 모든 페이지마다 붙게 되는데 메뉴를 DB에서 불러올 때마다 쿼리를 걸친다면..?

걸치지만 Select 되는 게 한두 개가 아니면..? 이용자 수가 많아지면서 페이지 요청이 많아지면..?

 

갑작스럽게 생각난 부분이지만 꽤 문제가 될 거 같아 그냥 만들면 안 될 거라고 생각했다.

그래서 검색을 해봤다 

 

okky.kr/article/722118

 

OKKY | 스프링 웹 프젝 헤더.jsp에 db값 불러오는 법

안녕하세요 제가 개인 프로젝트를 하고있는데요 어떻게 해야 할지 감이 안 와서 구글도 많이 검색해 보았는데 원하는 글이 안 보여서 질문 올립니다 헤더와 푸터를 include file을 이용하여 짰는데

okky.kr

역시 동일한 고민을 가지는 선배님이 계셨다.

 

해당 글의 댓글 내용에는 쿠키, 혹은 세션 또는 캐시를 사용하는 답변을 남겨주셨다.

캐시가 가장 효율이 좋고 기능에 맞는 거 같아서 캐시로 결정하게 됐다.

 

EHCache로 캐시 사용

 

EHCache를 선택한 건 사용하기 쉬워 보여서 이다.
Redis나 Memcached를 모르기도 하고 언제 서버를 구성하고 구현할까..?

 

그래서 예제도 많고 쉬워 보이는 EHCache를 사용하기로 했다. 사실 기본도 못하고 붙여 넣고 사용했다는 게 웃기다. 완성해놓은 결과물도 옳은 것인지가 판단이 안된다.

 

1. pom.xml에 추가한다.

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.9</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

 

2. 캐시 설정을 담당하는 xml을 추가한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">

    <defaultCache
            eternal="false"
            maxElementsInMemory="50"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="100"
            timeToLiveSeconds="200"
            memoryStoreEvictionPolicy="LRU" />

    <cache
            name="globalMenuCache" //캐시의 이름이다. @Cacheable("캐시의 이름") 와 일치시켜줘야한다. 
            eternal="false" //한번 캐시하면 영원히 유지할 것인지의 여부 
            maxElementsInMemory="100" //메모리에 보유할 최대 오브젝트 수 
            overflowToDisk="false" //메모리저장공간이 부족할때 Disk 사용여부( true,false ) 
            diskPersistent="false" //flush시에 파일로 저장 여부 ( trun , false ) 
            timeToIdleSeconds="0" //데이터가 지정된 시간(초단위)동안 재호출되지 않으면 휘발됨 
            timeToLiveSeconds="0" //한번 저장된 데이터의 최대 저장 유지 시간(초단위) 
            memoryStoreEvictionPolicy="LRU" /> //FIFO-가장 먼저 적재된 페이지 교체, LFU-가장 적은 참조횟수를 갖는 페이지를 교체, LRU 가장 오랫동안 참조되지 않은 페이지를 교체

</ehcache>

 

3. context-cache.xml추가

 

context-cache.xml을 해당 위치에 생성한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:util="http://www.springframework.org/schema/util"
	   xmlns:cache="http://www.springframework.org/schema/cache"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
		http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

	<cache:annotation-driven />

	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
		<property name="cacheManager" ref="ehcache"/>
	</bean>

	<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation" value="classpath:egovframework/config/menuEhcache.xml"/>
	</bean>

</beans>

4. 캐시를 사용하는 로직 추가

package admin.com.dao;

import egovframework.com.cmm.ComDefaultVO;
import egovframework.com.cmm.service.impl.EgovComAbstractDAO;
import egovframework.com.sym.mnu.mpm.service.MenuManageVO;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 관리자 메뉴관리 캐시 DAO Description :
 * https://wlsufld.tistory.com/115
 * Modification Information
 * 수정일			수정자		수정내용
 * -----------------------------------
 * 2021.02.08       이준수       최초생성
 */
@Repository("adminMenuListCachingDAO")
public class AdminMenuListCachingDAO extends EgovComAbstractDAO {

    @Cacheable(value = "globalMenuCache")
    public List<MenuManageVO> selectMenuList(){
        ComDefaultVO vo  = new ComDefaultVO();
        return selectList("AdminMenu.selectMenuList", vo);
    }

}

 

@Cacheable를 통해 xml에 만들었던 캐시를 불러올 수 있다.

해당 메서드는 실행하게 되면 캐시로 진행되는 걸 확인할 수 있다.

메서드는 DB의 Select 문장이 만들어져 있고 서버 실행하고 접속 후 최초 1회 실행 이후 페이지를 이동하면서 불러도

SQL은 타지 않고 나오는 걸 확인할 수 있다.