📒 [실전! 스프링 부트와 JPA 활용 - 김영한] 프로젝트를 완성한 후 부족한 기능을 추가한 후 정리하는 글입니다.
select
member0_.member_id as member_i1_4_,
member0_.city as city2_4_,
member0_.street as street3_4_,
member0_.zipcode as zipcode4_4_,
member0_.email as email5_4_,
member0_.password as password6_4_,
member0_.username as username7_4_
from
member member0_ limit ? offset ?
select
count(member0_.member_id) as col_0_0_
from
member member0_
page=1
)에서 2번 페이지(page=2
)로 이동한 후 다시 1번 페이지로 이동할 때 총 3번의 쿼리 전송이 발생합니다.Cache
)를 활용하기로 결정였습니다.📒 [Spring 공식 문서] 의 Spring Cache를 적용하여 문제를 해결하였습니다.
@EnableCaching
과 @Cacheable
어노테이션을 이용하여 캐시를 생성하였습니다.@EnableCaching
은 사용하고자 하는 클래스에 작성합니다.@Cacheable
은 사용하고자 하는 메서드에 작성합니다.@Cacheable
어노테이션이 적용된 메서드는 반환하는 결과값을 캐시에 저장해 두었다가 같은 결과값을 반환해야할 경우 캐시에 있는 값을 반환합니다.Service
단계에 적용하여 코드를 작성하였습니다.@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@EnableCaching // 캐싱 기능 활성화
public class MemberService {
.
.
.
@Cacheable("memberTotalPages") // 캐시 채우기
public Page<MemberDto> findAll(Pageable pageable){
return memberRepository.findAll(pageable).map(m -> new MemberDto(m));
}
}
MemberService
클래스에 @EnableCaching
어노테이션을 적용하고, findAll(Pageable pageable)
메서드에 @Cacheable
어노테이션을 적용하였습니다.@CacheEvict
어노테이션과, Spring Scheduler
를 이용하기로 하였습니다.@CacheEvict
어노테이션은 캐시의 값을 제거합니다.@Scheduled
어노테이션은 Spring에서 제공하는 기능으로 fixedDelay
속성을 통해 반복적으로 수행될 수 있습니다.@SpringBootApplication
@EnableScheduling // 스케줄링 기능 활성화
@EnableCaching // 캐싱 기능 활성화
public class JpashopApplication {
.
.
.
@Scheduled(fixedDelay = 10000) // 10s에 한번씩 실행
@CacheEvict(value = "members", allEntries = true) // 캐시 제거
public void cacheInitialization(){}
}
Apllication
에 Scheduler
를 추가하여 10초에 한번씩 캐시를 삭제해주는 코드를 구현하였습니다.