어떤 프로덕트를 개발할 때 로깅의 개념은 굉장히 중요하다 로그는 Application, Network, …등에서 발생하는 모든 이벤트에 대한 기록이다 이러한 로그를 바탕으로 모니터링, 오류 추적, ..등을 진행할 수 있다 WAS 요청 흐름 위의 흐름은 WAS로 요청이 들어오고 응답이 될때까지의 간략한 흐름이다 필자는 다음과 같이 로깅 메커니즘을 구현할 예정이다 Spring AOP 메커니즘을 활용해서 전역적인 컴포넌트의 In/Out 데이터 로깅 MDC 기반 요청별 흐름 추적 MDC (Mapped Diagnostic Context) 일반적으로 웹 애플리케이션은 멀티 쓰레드 기반으로 Client의 요청을 처리한다 이 과정에서 Client들의 요청을 구분지을 수 있는 수단없이 단순하게 로그만 남긴다면 해당 로그..
본 블로그의 모든 Spring Security 포스팅은 Spring Boot 3 이상 버전을 기준으로 작성됩니다 이 포스팅은 기본적인 Form-Login Based 인증 프로세스를 디버깅을 통해서 알아보는 포스팅으로써 기본적인 Security 설정은 SpringBootWebSecurityConfiguration의 자동 설정을 그대로 따른다 0. Security 기본 제공 계정 이처럼 Spring Security에서는 기본적인 인증 계정을 제공해주고 현재 글의 목적인 인증 프로세스간 디버깅간에도 해당 계정을 사용할 예정 현재 Spring Security의 기본 Config를 따르고 있기 때문에 모든 Request에 대해서는 authenticated → 즉, 인증이 필요하다 따라서 DefaultLoginPa..
본 블로그의 모든 Spring Security 포스팅은 Spring Boot 3 이상 버전을 기준으로 작성됩니다 Authentication Spring Security에서의 Authentication은 인증 및 인가 프로세스 전역적으로 사용되는 토큰의 개념이라고 생각하면 된다 인증 프로세스 → 여러 인증 절차를 거친 후 AuthenticationToken을 통해서 최종적으로 인증이 되었는지 판별 인가 프로세스 → 인증된 AuthenticationToken & FilterInvocation & GrantedAuthority 기반 자원에 대한 인가 처리 public interface Authentication extends Principal, Serializable { /** * Application에서 부..
본 블로그의 모든 Spring Security 포스팅은 Spring Boot 3 이상 버전을 기준으로 작성됩니다 DelegatingFilterProxy Spring Security는 Servlet Filter 레벨에서 인증 및 인가를 처리하기 위한 프레임워크이다 여기서 Servlet Filter 레벨이라는 부분에 포커스를 맞추면 스프링 빈은 Spring IoC Container에서 관리되는 컴포넌트이고 Servlet Level과는 분리된 개념이기 때문에 Servlet Filter에서는 스프링 빈을 주입받아서 활용할 수 없다 하지만 결론부터 말하자면 Spring Security에서 활용되는 여러 컴포넌트들은 스프링 빈으로 등록해서 관리되고 여러 빈들을 주입받아서 상호작용해서 동작하게 된다 그렇다면 Serv..
[Spring] @ModelAttribute 처리 흐름 ArgumentResolver Spring Framework에서 ArgumentResolver는 굉장히 중요한 핵심 개념이다 사용자의 Request가 들어오는 순간 처리 메커니즘을 간단하게 알아보자 1. 사용자의 Request가 DispatcherServlet으로 들어온다 sjiwon-dev.tistory.com 이전에는 @ModelAttribute에 대한 처리 흐름에 대해서 알아보았다 이번에는 @ModelAttribute와 마찬가지로 Request Binding에서 굉장히 많이 활용되는 @RequestBody에 대해서 알아보자 @RestController public class TestController { @PostMapping("/hello")..
동시성 처리 웹 서비스를 개발하다보면 수많은 종류의 동시성 문제를 경험해볼 수 있다 주문 도메인 상품 재고 동시성 처리 선착순 쿠폰 동시성 처리 … 동시성 문제는 공유 자원을 동시에 접근하는 과정에서 Critical Section에서 발생하는 Race Condition으로 인한 문제를 의미한다 본 포스팅에서는 JVM 환경에서 제공하는 synchronized 키워드를 사용하여 동시성을 제어하고 한계에 대해 설명할 예정이다 Process? Thread? synchronized 키워드에 대해 알아보기전에 먼저 Process와 Thread의 개념부터 알아보자 idea64.exe는 디스크에 저장된 실행 가능한 코드와 관련 데이터 파일로 구성된 프로그램이다 이 idea64.exe를 더블클릭하게 되면 디스크에 존재하..
ArgumentResolver Spring Framework에서 ArgumentResolver는 굉장히 중요한 핵심 개념이다 사용자의 Request가 들어오는 순간 처리 메커니즘을 간단하게 알아보자 1. 사용자의 Request가 DispatcherServlet으로 들어온다 2. DispatcherServlet은 들어온 Request를 처리할 수 있는 Handler를 조회 3. 조회한 Handler를 컨트롤할 수 있는 HandlerAdapter 조회 4. HandlerAdapter가 본인이 컨트롤하는 Handler를 invoke 4단계 :: Handler를 invoke하는 프로세스에서 ArgumentResolver가 활용된다 이 말이 무슨 의미인지 정확하게 이해가 되지 않을 수 있으니 상세하게 풀어서 살펴..
비영속? 준영속?Entity의 상태에는 4가지가 존재한다비영속 = 영속성 컨텍스트와 전혀 관련이 없는 상태영속 = 영속성 컨텍스트가 관리하고 있는 상태준영속 = 영속성 컨텍스트의 관리를 더이상 받지 않는 상태삭제 = 아예 삭제가 된 상태 여기서 준영속 상태를 영속성 컨텍스트의 관리를 더이상 받지 않는 상태라고 설명하였다그런데 이를 다른 측면에서 바라보면 다음과 같이 설명할 수 있다영속성 컨텍스트의 관리를 받기 위해서는 식별자 @Id가 반드시 필요하다따라서 영속성 컨텍스트의 관리를 더이상 받지 않는다는 것은 다르게 말하면 식별자는 존재하는 상태라고 볼 수 있다 이 시점에 다음 엔티티를 한번 살펴보자@Getter@Setter@NoArgsConstructor@Entity@Tab..
Transaction 전파 트랜잭션은 시작 지점 & 종료 지점이 명확하게 존재한다 시작 지점은 하나이지만 종료 지점은 둘로 분류할 수 있다 Commit Rollback 특정 로직을 진행하다가 추가적인 트랜잭션이 진입하는 경우를 생각해보자 이 때 기존에 존재하는 트랜잭션에 대해서 추가적으로 진행되는 트랜잭션의 행동은 트랜잭션 전파 속성에 의해 결정된다 물리 트랜잭션 vs 논리 트랜잭션 단일 트랜잭션인 상황에서는 사실 트랜잭션의 개념 자체를 물리/논리로 나눌 필요가 없다 논리 트랜잭션 그 자체가 물리 트랜잭션이기 때문에 하지만 여러 트랜잭션이 중첩된 상황에서는 물리/논리라는 개념으로 분리될 필요가 있다 이러한 상황에서 물리 트랜잭션 / 논리 트랜잭션간에는 다음과 같은 규칙이 존재한다 1. 모든 논리 트랜잭션..
Transaction - Connection간의 관계 트랜잭션을 열고 유지하기 위해서 트랜잭션의 시작 ~ 끝까지 다음과 같은 이유로 DB Connection을 동기화해야 한다 트랜잭션 내부의 여러 연산 로직은 원자성 (All or Nothing)을 보장해야 한다 이 과정에서 모든 연산은 동일한 DB Connection을 사용해야 한다 만약 중간에 Connection이 변경되면 연산 간의 데이터 일관성을 보장할 수 없게 된다 파라미터를 통한 Connection 동기화 방법 fun logic() { val connection: Connection = ... componentA.execute(connection, ...) componentB.execute(connection, ...) componentC.ex..