[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를 사용하는 서버는 매 순간의 접속이 어떤 클라이언트의 요청인지에 대한 상태를 저장하지 않습니다. 서버는 이 요청이 리소스에 대한 권한을 가지고 있는지만을 판단함으로써 접근을..
[Spring] 다수의 SecurityFilterChain 구성 방법
·
Spring/SpringBoot
SecurityFilterChain 빈을 스프링 컨테이너에 등록함으로써 저희는 서블릿에 필터를 적용할 수 있음을 저번 포스팅에서 다뤘습니다. 또한, 여러 SecurityFilterChain 을 구성함과 동시에 요청에 부합하는 단 하나의 SecurityFilterChain을 실행시킬 수 있음을 알았습니다. FilterChainProxy에 등록되는 SecurityFilterChain은 이를 결정하기 위해 SecurityMatcher를 사용하며, FilterChainProxy는 이를 바탕으로 요청에 따라 실행될 SecurityFilterChain을 선택합니다. FilterChainProxy는 이전 포스팅에서 언급했듯이 여러 SecurityFilterChain을 관리하는 스프링 컨테이너의 빈입니다. 서블릿 컨테..
[Spring] Spring Security Architecture
·
Spring/SpringBoot
이번 포스팅에서는 스프링 프레임워크의 하위 프레임워크인 Spring Security의 아키텍쳐에 대해 알아보겠습니다. 이 글을 명확하게 이해하기 위해선 서블릿 컨테이너에 의해 관리되는 디스패쳐 서블릿, 스프링 컨테이너와 디스패쳐 서블릿의 관계, Proxy 패턴에 대한 선수지식이 필요합니다. Spring Security - Filter 이름에서도 알 수 있듯이 Spring Security는 Spring 어플리케이션에 보안 서비스를 제공하는 프레임워크 입니다. Spring Security가 제 기능을 하려면 네트워크를 통해 스프링 어플리케이션에 접근하는 모든 request들에 대해 적용되어야 하므로 이는 모든 네트워크 요청을 수신하고 그에 대해 응답하는 Dispatcher Servlet에 대하여 이루어 져야..