Cache Strategy
·
Spring
캐시란?캐시란, 데이터 접근속도를 높이기 위해 원본 데이터를 복사하여 미리 저장해두는것을 의미한다.메모리 Hireachy에 따라, 상단으로 올라갈수록 접근 속도가 높은 대신 저장공간이 작으며, 하단으로 내려갈수록 속도가 낮은 대신 저장공간이 크다. 원본 데이터는 일반적으로 보조 기억 장치 레벨에 저장되며, 이에따라 접근 속도는 현저히 떨어진다. 캐시는 보조 기억 장치에 저장되는 데이터들을 메모리 레벨에 미리 저장해둠으로써 응답속도를 비약적으로 개선한다.하지만, 다음과 같은 세가지 쟁점이 뒤따른다.캐시 저장 데이터캐싱을 사용함으로써 빠른 접근속도를 가지는 대신, 작은 저장공간을 가진다.따라서, 어떤 데이터를, 얼마나, 어떻게 저장할지 고민해야한다.데이터 불일치원본 데이터를 복사하여 저장됨에 따라, 캐시에..
Embedded Tomcat - NIO
·
Spring
Tomcat 대표적 외부설정 종류스프링 MVC에서 Web Application Server 로 사용되는 Tomcat은 외부 설정을 통해 구성하고자 하는 서버의 목적에 맞게 변경할 수 있다. 1. server.tomcat.max-connections서버가 한번에 맺을 수 있는 커넥션의 최대 갯수를 의미한다. 2. server.tomcat.accept-count서버가 맺은 커넥션의 갯수가 server.tomcat.max-connections를 초과했을 때, OS가 TCP/IP 스택에서 대기시킬 커넥션의 최대 갯수 3. server.tomcat.threads.max스레드 풀의 크기 4. server.tomcat.threads.min-spare항상 활성화 시켜놓을 스레드의 갯수BIO 에서 바뀐 NIO가 어떻게 ..
[Spring boot] Repository의 메소드 노출
·
Spring/SpringBoot
🙈 1. 문제 파악현재 Account 도메인에선, soft delete 방식으로 계정 삭제를 구현하고 있다.하지만, JpaRepository를 사용하고 있는 만큼 delete메소드의 오용으로 잘못된 동작을 유발할 수 있음을 알게됐다.이점을 해결하고자 한다. 또한, 간단한테스트를 위해 Spring Data JPA를 사용하는 상황에선, 기존 delete메소드를 오버라이드 하고자 할때, 처리하는데 어려움을 겪게 된다.💡 2. 해결 방안공식문서를 통해, JPA의 시그니처 기반 쿼리 생성 로직이 Repository 마커 인터페이스를 상속했는지 여부를 기준으로 판단되는 점을 발견했다.Central repository marker interface. Captures the domain type to manage ..
Spring boot - @Transactional 전파 주의 사항
·
Spring/SpringBoot
주제 ( 전체 트랜잭션이 롤백되는 상황에 대한 해결책 )이번 포스팅에서는 @Transactional의 propagation 속성을 사용시 집중해볼만한 부분을 살펴본다.주 내용은 마지막으로, @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용할 때, 전체 트랜잭션이 롤백되는 상황에 대한 해결책을 얘기한다.테스트를 위한 코드 작성테스트를 위해 다음과 같은 6 가지 클래스를 작성한다.이 상황에서 수정하며 테스트할 클래스는 TransactionDisabledService, TransactionEnabledService 둘이다.Parent ( Entity )@Entity@NoArgsConstructor@Getterpublic class Parent { @..
Spring boot - Cache (2) 페이지 조회 캐싱
·
Spring/SpringBoot
이전 포스팅에서 스프링부트의 캐싱을 사용방법을 알아봤다.이번 포스팅에서는 페이징 처리에 캐시를 도입하기 위한 방법을 살펴본다.어느 부분을 캐싱할래?캐시는 key-value로 캐시 메모리에 저장된다.페이징 조회에서 사용되는 key는 Pageable에서 사용되는 sort,size, offset임으로, 특정 레코드의 데이터가 변경됐을 때, 이 데이터가 포함된 캐시를 갱신할 수 없다.예시를 들어보자. // 1. id 를 이용해 특정 사용자의 이름을 수정하는 메소드 @Caching( put = @CachePut(key = "#id"), evict = @CacheEvict("'all'") ) @Transactional(readOnly = false) ..
Spring boot - Cache
·
Spring/SpringBoot
스프링 부트 CacheConcurrentMapCacheManager스프링 부트에서는 @EnableCaching 사용 시, 인메모리 캐싱이 활성화 된다.이를 이용해 어플리케이션 내에 ConCurrentHashMap을 활용한 캐싱이 간단하게 이루어진다.@Configuration@EnableCachingpublic class CacheConfig { @Bean CacheManager cacheManager() { return new ConcurrentMapCacheManager(); }}다만,캐싱되는 데이터의 유효기간을 설정하지 못한다는 단점.다른 어플리케이션과 캐싱 데이터를 공유하지 못한다는 단점.두 가지가 크게 작용한다.RedisCacheManager@Configuration@..
[SpringBoot] 스프링의 에러처리 탐구
·
Spring/SpringBoot
스프링은 어플리케이션에서 발생가능한 에러들에 대해 다양한 처리방법을 제공합니다. 어플리케이션 내부에서 발생되는 에러를 감지하고 각각에 대한 적절한 처리를 하기 위해, 서블릿의 에러 처리 플로우에 대해 알아볼 필요가 있습니다. 이번 포스팅에서 이에 대해 중점적으로 다뤄 보겠습니다. Spring MVC에서 모든 요청은 디스패쳐 서블릿을 통합니다. 디스패쳐 서블릿은 요청에 따라 HandlerMapping 객체를 통해 적절한 컨트롤러를 실행합니다. 이 과정은 디스패쳐 서블릿의 doDispatch() 함수 내에서 실행됩니다. 함수내에 try-catch문 을 통해 감지된 에러는 적절한 HandlerExceptionResolver를 선택해 에러를 처리하게 됩니다. 따라서, 아래와 같은 워크 플로우를 가집니다. 1. ..
[Spring] Spring Security 인증 구성
·
Spring/SpringBoot
스프링 시큐리티는 스프링 컨테이너 외부인 서블릿에 대해 필터를 추가함으로써 그 기능을 수행합니다. 개발자가 직접 이 필터들을 서블릿 컨테이너에 개발하는 대신 FilterChainProxy를 이용해 스프링 컨테이너 내에 존재하는 빈을 필터로 등록할 수 있도록 했습니다. 이번 포스팅에서는 더 나아가 이 필터 중 인증 관련 필터를 스프링 시큐리티가 어떻게 구성했는지, 개발자는 이를 어떻게 확장할 수 있을지에 대해 알아보겠습니다. 스프링 시큐리티 인증 처리 과정 첫번째로, 요청에 대한 인증입니다. HTTP의 Stateless특성으로 HTTP를 사용하는 서버는 매 순간의 접속이 어떤 클라이언트의 요청인지에 대한 상태를 저장하지 않습니다. 서버는 이 요청이 리소스에 대한 권한을 가지고 있는지만을 판단함으로써 접근을..