EhCache 사용해보기

지난번 강좌에서 우리는 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());
    }

}

pom.xml 에 ehcache dependency를 추가

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

src/main/resources 폴더에 ehcache.xml 생성

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd">
    <cache name="users"
           maxEntriesLocalHeap="200"
           timeToLiveSeconds="600">
    </cache>
</ehcache>

위 설저을 끝내고 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 라고 찍힘.

두번째 조회 시 SQL 재 실행 되지 않았다.

끝!

Last updated