[TIL - 0827] 데이터 캐시, 도커

데이터 캐시하기(1) - 성능 차이보기

  • 데이터 캐시의 필요성 : 고정적인 데이터나 매번 변경되지않아도 되는 데이터에 대해 DBMS에 매번 요청(Read)하지말고 캐시해둘 필요성이 있음
  • 자바 캐시와 관련된 스펙 : JSP107(JCache) - API 표준(javax.cache)
    • 캐시 제공 벤더에 상관없이 캐시할 수 있도록 만들어진 API : 캐시 쪽에서의 JDBC
    • Map으로 구현 : key-value
    • 캐시 스펙 구현체 : EhCache(JCache Provider)
    • JSR : 자바 스펙에 추가된 기술에 대한 설명 공식 문서
  • 캐시 종류
    1. 로컬 캐시 : 어플리케이션 내부 메모리 사용
    2. 글로벌 캐시 : 외부 서버 사용(RDBMS보다 메모리 캐시를 하는 Redis와 같은 NOSQL 서버가 더 빠름)
  • 스프링에서 캐시 사용하기 : spring-boot-starter-cache(PSA - 캐시를 할 때 javax.cache를 사용하지않고 더 추상화된 레이어를 사용, 필요한 빈을 생성하지않고도 설정되어있음)
    • EhCache : 캐시 성능 측정해서 효과 눈으로 보기(커넥션을 직접 맺는 예제를 만든건 아니고 Thread Sleep 걸어뒀는데 캐시가 걸려있는 메소드 호출 시에는 캐시 체크부터 하고 캐시되어있을 때 메소드가 캐시되어있는 데이터를 리턴 후 종료(코드 실행x)
    • @Cacheable : 캐시 사용 구현되는 곳을 체크해둔 어노테이션(AOP), 호출 결과를 캐시
    • @CacheEvict : 캐시 만료 어노테이션(AOP)
    • @ResponseBody : html이 아닌 리턴타입이 json으로 맵핑되어 리턴됨(MessageConverter - Jackson)
    • 참고자료 : 이동욱님 기억보다 기록을 -
@EnableCaching
public class CacheTestApplication {
    
}

@Override
public Item findByNameNoCache(String name) {
    slowQuery(2000);
    return new Item(name);
}

@Override
@Cacheable(value = "findItemCache", key = "#name")
public Item findByNameCache(String name) {
    slowQuery(2000);
    return new Item(name);
}

@CacheEvict(value = "findItemCache", key = "#name") // 기존 캐시 데이터 삭제
public void refresh(String name) {
    log.debug("cache clear");
}

2018-08-27 19:46:37.863 [http-nio-8080-exec-4] DEBUG jinbro.cachetest.web.ItemController - 처리 시간 : 2002
2018-08-27 19:46:53.910 [http-nio-8080-exec-6] DEBUG jinbro.cachetest.web.ItemController - 처리 시간 : 2002
2018-08-27 19:47:21.715 [http-nio-8080-exec-8] DEBUG jinbro.cachetest.web.ItemController - 캐시된 데이터 : computer, 처리 시간 : 2004
2018-08-27 19:47:22.732 [http-nio-8080-exec-9] DEBUG jinbro.cachetest.web.ItemController - 캐시된 데이터 : computer, 처리 시간 : 0
  • 다음 해볼 것 : 스프링 캐시 여러 설정 파악하기, redis를 사용해서 캐시하기

docker(1) - 도커 알아보기

  • 배포, 운영을 편하게 하기위해서 특정 서비스를 패키징해주고 컨테이너 기술을 사용하여 실행시켜주는 프로그램
    • 도커 파일 작성 -> 도커 이미지 생성 -> 컨테이너
  • VM과는 다른 리눅스 컨테이너 기술을 사용함
    • VM은 호스트 OS에 게스트 OS 설치, 호스트를 거쳐 게스트로 전달(느림)
    • 핵심은 리눅스 컨테이너 기술인데, 이 부분에 대한 파악이 필요
  • github처럼 docker hub가 있어서 이미지를 pull 하고 run하면 됨
    • 개발 환경이나 배포 환경을 세팅해두고(도커 파일 작성) 이미지를 만든 다음 여러 서버 컴퓨터에 pull하고 run하면 빠르게 환경세팅이 가능할 것이라고 봄