지난번 강좌에서 우리는 [ Thread내캐쉬사용 및 Cache 어노테이션 사용법 ] 을 알아보았다. 그럼 우리는 실제 springboot 프로젝트에서 어떤 캐쉬를 사용할것인지 고민하게 된다. 일단 springboot @EnableCaching 으로 자동으로 CacheManager 를 구성한다.
Springboot 아래순서대로 감지시도한다.
Generic
JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
EhCache 2.x
Hazelcast
Infinispan
Couchbase
Redis
Caffeine
Simple
지난번 강좌의 코드를 응용해보자. User 객체를 생성한다.
@Entity
@Data
@NoArgsConstructor
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
Interface 도 작성한다.
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable
User findByName(String name);
}
테스트 코드
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class CacheDemoApplicationTests {
@Autowired
private UserRepository userRepository;
@Autowired
private CacheManager cacheManager;
@Test
public void test() throws Exception {
userRepository.save(new User("AAA", 10));
User u1 = userRepository.findByName("AAA");
System.out.println("첫번째 조회 : " + u1.getAge());
User u2 = userRepository.findByName("AAA");
System.out.println("두번째 조회 : " + u2.getAge());
}
}
위 설저을 끝내고 test 코드를 돌리면 CacheManager가 EhCacheManager 로 바뀐것을 확인 할수 있다. 이로서 EhCahce 구동은 성공!
@Autowired
private CacheManager cacheManager;
@Test
public void test() throws Exception {
System.out.println("CacheManager type : " + cacheManager.getClass());
userRepository.save(new User("AAA", 10));
User u1 = userRepository.findByName("AAA");
System.out.println("첫번째 조회 : " + u1.getAge());
User u2 = userRepository.findByName("AAA");
System.out.println("두번째 조회 : " + u2.getAge());
}
찍힌 로그 확인
CacheManager type : class org.springframework.cache.ehcache.EhCacheCacheManager
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (age, name, id) values (?, ?, ?)
2020-07-14 18:09:28.465 INFO 58538 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
첫번째 조회 : 10
두번째 조회 : 10
첫번째 줄에 : org.springframework.cache.ehcache.EhCacheCacheManager 라고 찍힘.