안녕하세요. 미더덕입니다. 이번 시간엔 Spring MVC 프로젝트에서 WebClient를 사용 시 내부 동작이 어떻게 이루어지는 지에 대해 알아보도록 하겠습니다. 1. Spring MVC (톰캣 -서블릿 - 동기 멀티스레드) VS Spring WebFlux (네티 - 이벤트루프-비동기 단일/멀티스레드)우선 해당 상황을 이해하기 위해 Spring MVC의 기술적 바탕과 WebClient를 사용하기 위한 Spring WebFlux의 기술적 바탕이 다르다는 사실을 인지하고 있어야합니다. 2. Spring MVC - 톰캣 & 서블릿 기반의 동기 멀티스레드 기술 우리에게 익숙한 Spring MVC는 톰캣 서블릿 기반의 동기 멀티스레드 기술입니다. 톰캣 컨테이너는 스레드 풀에 미리 스레드를 생성시켜두고 HT..
안녕하세요. 이름을 바꿨습니다. 이제 미더덕이예요. 토이프로젝트에 적용해두었던 Lucy-XSS-Servlet-Filter가 Jakarta패키지를 지원하지 않음에 따라 XSS 방지 기능을 리팩토링하는 시간을 갖게 되었습니다. 이번 기간에 제가 부족한 부분을 많이 느껴 경험했던 이슈를 기초부터 자세히 정리하고 넘어가고자 합니다. 사실 이번 게시글은 XSS 방지에 대한 글이라기 보단 XSS 방지를 해결하기 위해 알아야할 선수 지식들에 대한 정리입니다. [이번 주제에서 다룰 내용들]1. HTTP - Method & Content-Type2. Spring Web Annotations3. HttpServletRequestWrapper 4. HttpMessageConverter 이번 게시글에선 가장 기초가 되는 ..
안녕하세요! 이번 게시글에선 일반적인 애플리케이션에서 Http 응답에 대한 방식을 어떻게 설정할지에 대해 알아보겠습니다. 스프링 프로젝트인 경우 보통 @ResponseBody 어노테이션, ResponseEntity 클래스, 커스텀 응답 클래스를 사용하는데요. 각각에 대해 설명해보겠습니다. @ResponseBody - HTTP 규격에 body만 지정할 수 있다. 스프링에서 제공해주는 @ResponseBody 어노테이션입니다. HTTP 규격에 맞춰 컨트롤러의 리턴 값을 Boby에 담아주는 역할을 합니다. 특히 API 서버로 구성된 프로젝트인 경우 컨트롤러에 @RestController 어노테이션을 설정하는 경우가 대부분인데@RestController 에 @ResponseBody가 부착되어 있으므로 해..
안녕하세요. 이번 게시글에선 기존 세션 기반 인증에서 jwt 토큰 인증으로 변환하는 방법을 작성해보겠습니다. 초기 목표는 기존 스프링 시큐리티 디폴트 구조를 크게 벗어나지 않고 약간의 설정 변경정도로 jwt를 구현하는 것이었습니다. jwt를 프로젝트를 적용하기 위해선 다음과 같은 목표가 필요합니다. 1. 로그인 (로그인 인증)- username, password를 DB검증 후 토큰을 생성하여 반환해야합니다.- 리프레시 토큰 정보는 DB에 저장합니다. 2. 토큰 검증 (토큰 인증 및 인가)- 전달받은 토큰을 인증 및 파싱하여 principal을 가져온 후 (username) 해당 정보로 DB에서 권한을 조회하여 인가합니다.- 리프레시 토큰이 만료되지 않았다면 리프레시 토큰을 갱신하여 DB에 저장합니다. ..
이번 게시글에선 저번에 분석한 스프링 시큐리티를 바탕으로 커스텀 구현을 해보겠습니다. 목표는 기존 폼 형식 로그인 방식을 Jwt 로그인 방식으로 변경하는 것입니다. 저번에 분석했던 스프링 시큐리티의 폼 로그인 흐름을 간략히 정리해볼까요? UsernamePasswordAuthenticationFilter폼 요청으로 미인증된 Authentication 생성, AuthenticationManager에 미인증 Authentication 전달 AuthenticationManager - ProviderManager AuthenticationProvider에 미인증 Authentication 전달 AuthenticationProvider - DaoAuthenticationProviderUserDetailsSer..
스프링 시큐리티에서 json 형식으로 로그인 하는 것을 구현해보려고 합니다. 그러기 위해서 먼저 스프링 시큐리티에서 제공하는 기본 형식인 폼 로그인(formLogin) 방식에 대해 먼저 분석해보고, 해당 구조를 커스텀해보겠습니다. 스프링 시큐리티가 구성된 프로젝트는 기본적으로 폼 로그인이 적용됩니다. 또한 개발자가 서블릿 기반 시큐리티 설정을 추가하게 되면 아래와 같이 폼 로그인을 별로도 설정할 수 있습니다. @Configuration@EnableWebSecuritypublic class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { ..
이번 게시글에선 동시성 요청에 대한 이슈처리를 하기 위한 방법으로 '락'(lock) 에 대해서 알아보겠습니다.일반적으로 '락'을 분류할 때 큰 범주로 비관적 락과 낙관적 락으로 분류합니다.각각의 락에 대해 정리해보겠습니다. 비관적 락비관적 락은 충돌이 잦은 환경에서 주로 사용하는 락이라는 관점에서 '비관적'이라는 명칭이 붙었습니다.공유 자원에 락을 걸고 진행비관적 락은 데이터베이스 환경에서의 락입니다.비관적 락은 충돌이 발생할 것을 예상하고 작업을 진행하기 때문에시작부터 데이터베이스의 '공유락', '배타락'을 사용하여 작업을 순차진행 시킵니다. 공유락과 배타락에 대해선 저번 게시글에서 정리해보았었습니다.비관적 락은 공유락과 배타락은 락을 걸고 진행하기 때문에성능 오버헤드 이슈가 있고 또한 데드락의 위..
안녕하세요. 이번 게시글에선 JPA 영속성 전이에 대해 분석해보고특히 복합키로 구성된 DB구조에서 어떻게 영속성 전이를 처리할지 알아보겠습니다. “영속성 콘텍스트”는 무엇일까요?영속성 컨텍스트(Persistence Context)는 JPA에서 엔티티(Entity) 인스턴스를 관리하는 환경을 말합니다. 이 환경은 영속성을 관리하고 엔티티의 생명주기를 추적하는데 사용됩니다. “영속성”이라는 개념을 실현시키기 위해 어플리케이션 안에서 구체화된 것이 “영속성 컨텍스트”입니다.엔티티의 생명주기를 추적하고, 엔티티의 상태를 데이터베이스와 일치시키는 영속성을 관리하는 기술적 “환경“입니다. 어플리케이션 환경에서 구체적으로 표현해보면 위와 같이 그려볼 수 있습니다.정리하자면 영속성 컨텍스트는 크게 두가지 작업을 한..
안녕하세요!! 이번 게시물은 저번 시간에 이어서 동시성 이슈처리를 위한 방안에 대해 알아보려고 합니다. 이번엔 트랜잭션 격리수준에 대해 중점적으로 알아보려고 하는데요,,동시성 이슈는 결국 여러 트랜잭션이 동시에 작업을 처리하게 되면서 생기는 문제이기 때문에트랜잭션 격리수준을 다르게 가져가면 해결해볼 수 있지 않을까? 라는 아이디어가 떠올랐습니다. 그럼 먼저 4가지 트랜잭션 격리수준에 대해 알아보겠습니다.일관성(Consistency)이 높은 순서대로 설명드리겠습니다. 1. SERIALIZABLE (직렬화 가능한)설명: 데이터에 접근할 때 기본적으로 s-lock을 획득한다. 쓰기 작업을 위해 x-lock을 획득해야 하므로 특정 데이터에 대해 조회 중인 다른 트랜잭션이 존재하면 쓰기 작업이 불가능하다..
안녕하십니까! 이번엔 저번 포스팅에 이어서 동시성 요청을 테스트하고 처리하는 방법에 대해 알아보겠습니다. 일단 원하는 테스트 방식에 대해 정리를 먼저 해볼까요?저는 많은 수의 요청을 동시에 수용할 수 있는 프로그램을 만들고 싶습니다.그러기 위해서 많은 수의 요청을 동시에 보내는 테스트 코드를 작성해야합니다. 위의 그림처럼 테스트 코드 구조를 정리해볼 수 있습니다. 많은 수의 N번 요청을 보낼 수 있어야 하고, 해당 요청들을 동시에 받은 후 처리해야합니다.저번시간에 알아봤던 스레드풀 프레임워크를 활용해서 빠르게 테스트를 작성해볼까요? @Testvoid 스레드풀_사용한_동시요청() throws InterruptedException { int n = 2000; ExecutorService ex..