본문 바로가기
개발/Spring

[Spring] 스프링 부트에 캐시 적용하기

by devhooney 2022. 11. 24.
728x90

스프링 부트에 캐시 적용하기

 

728x90

 

캐시(Cache)

- 자주 사용하는 데이터를 미리 보관해둔 임시 장소

- 비교적 저장 공간이 적고, 전체적인 비용이 비쌈

- 빠른 IO를 통해 성능적 이점을 갖는다.

- 도중에 변경될 일이 없는 DB 조회 값이나 자주 호출되는 데이터에 사용

 

 

스프링 부트에서의 캐시

- 스프링 부트에서 사용할 수 있는 캐시는 대부분 JSR-107를 따른다.(JSR: Java Specification Requests, 자바 플랫폼에 대한 규격을 제안하거나 기술한 것을 의미, JSR-107은 JCACHE에 대한 내용)

- JSR-107을 따르는 캐시를 사용하면 어떤 구현체 캐시를 사용하는지에 관계없이 추상화를 지원

 

 

로컬 캐시와 글로벌 캐시

로컬 캐시

- 로컬에서만 사용하는 캐시

- 외부 서버와 트랜잭션 비용이 들지 않기 때문에 속도가 빠름

- 로컬에서만 사용하기 때문에 분산 서버의 구조에서 캐시를 공유하기 어려움

 

글로벌 캐시

- 여러 서버에서 접근할 수 있는 캐시 서버를 구축하여 사용하는 방식

- 네트워크를 통해 데이터를 가져오는 트랜잭션 비용이 있기 때문에 로컬 캐시에 비해 상대적으로 느림

- 별도의 서버로 운영되기 때문에 서버 간 데이터 공유에 용이함

 

 

코드 작성

나는 회사코드 중 정적인 데이터를 if문으로 확인하고, 없을 경우 데이터를 가져오고 있었는데,

스프링 캐시를 활용하여 if문 없이 정적인 데이터를 한 번 가져오고 계속 사용하게끔 수정했다.

 

 

- build.gradle

// Cahe 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-cache'

 

- 프로젝트 시작 application 파일

@EnableCaching 추가

@EnableJpaAuditing
@SpringBootApplication
@EnableJpaRepositories
@EnableCaching // 추가됨
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

 

- CacheConfig ( 캐시 관련 설정 파일)

@Configuration
public class CacheConfig {
    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<Cache> caches = new ArrayList<Cache>();
        caches.add(new ConcurrentMapCache("menu"));
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}

 

 

- 데이터 가져오는 곳 (기존 코드)

if (Constant.menuList == null) {
	Constant.menuList = menuService.findAllWithEbMenu();
}

@Transactional(readOnly = true)
public List<EbMenu> findAllWithEbMenu() {
    logger.debug("menu : find all");
    return  ebMenuRepository.findAll();
}

 

- 캐시 사용 후

Constant.menuList = menuService.findAllWithEbMenu();


@Transactional(readOnly = true)
@Cacheable("menu")
public List<EbMenu> findAllWithEbMenu() {
    logger.debug("menu : find all");
    return  ebMenuRepository.findAll();
}

 

 

 

- 참고

https://pamyferret.tistory.com/8

728x90