잊어버릴 것 같으면 쓰기라도 하자!

[Design] EDA의 개념 (2) – Event Sourcing

이전 글에 이어서 EDA Martin Fowler가 제시하는 EDA의 중요한 개념인 EventSourcing 에 대해서 알아보자. Event Sourcing 마틴 파울러는 이벤트 소싱에 대한 개념을 개발자라면 단번에 이해할 수 있는 예시를 들어 설명한다. … Every software developers should be intimately familiar with one particular form of event source system. which is? ersion control. Event Sourcing is basically provide …

Read more

[Design] EDA의 개념 (1) – Event

요즘 개발하면서 자주 듣는 두가지 패러다임이 있는 것 같다. EDA ( Event – Driven – Architecture ) 와 DDD ( Domain – Driven – Design ) 두가지가 바로 그것이다.이 둘은 많이 사용되면서 서로 각각 고유의 접근 방식과 철학을 가지고 있다. 이 둘은 장점이 아주 명확하고 서로 상호 배타적이지 않기 때문에 각각의 장점을 잘 살릴 수 …

Read more

Proxy 에 대한 이해 – 3. Spring AOP

이 글을 작성하게 된 계기이기도 하고, Proxy 하면 가장 먼저 떠오르는것이 Spring AOP 에 관한 내용일 것이다.Spring AOP 는 기본적으로 Proxy 를 이용해서 동작하게 된다. 핵심이 되는 비즈니스 로직과 부가 기능을 서로 분리시켜 로직을 재사용 할 수 있게 해주고, 핵심이 되는 기능은 온전히 그 역할에만 집중할 수 있도록 만들어준다.Proxy 파트 마지막 글로 이번에는 SpringFramework 에서 …

Read more

Proxy에 대한 이해 – 2. CGLib

CGLib 은 JDK Proxy 와 달리 Interface 가 없어도 Byte코드 조작을 통해 Class 를 직접 조작하여 Proxy 를 생성한다.JDK Proxy 는 원본 객체가 구현한 Interface 에 대한 Proxy 를 만들어준다면, CGLib 을 이용하면 직접 Class 를 상속받아 Override 하는 방식으로 Proxy 를 만들어주게 된다.하나씩 살펴보자. CGLib CGLib 은 구체 클래스를 Extends( 상속 ) 받아서 Proxy …

Read more

Proxy에 대한 이해 – 1. JDK Proxy

대포적인 Dynamic Proxy library 에 2가지가 존재한다. CGLib ( Code Generator Library ) 과, JDK Proxy 가 그것이다.조금만 검색하면 이 둘은 Interface 가 존재 하는지, 존재하지 않는지 여부로 사용 여부가 나뉘어짐을 알 수 있다. 이 글은 왜 interface 의 차이로 인한 proxy 생성에 차이가 생기는지, 그렇다면 그로 인해 어떤 차이점이 생기게 되는지, 자세한 Proxy 에 …

Read more

Redis를 이용한 동시성 이슈 해결하기 (2/2)

이전 글에 이어서 Redis 를 이용한 Distributed Lock 을 구현한 방법에 대해서 작성한다. Kurly Tech Blog 에 작성된 글을 바탕으로 작성하였다. 이미 원글에서도 상세하게 설명하고 있지만, 분산락을 구현하기 위한 구현체로 Redisson 을 사용했다. Spring framework 기반에서 사용할 수 있는 대표적인 Redis Client 로 Lettuce , Redisson 가 있는데 이중에서 Lettuce 의 경우는 락을 획득하기 위해서 …

Read more

Redis를 이용한 동시성 이슈 해결하기 (1/2)

과거에 개발했었던 코드를 리팩토링 및 업데이트 하는 과정에서, 기존 코드는 동시성 이슈가 발생할 수 있다는걸 발견했다. 예제 코드로 재현해보면 이런 느낌의 코드였는데, 의도했던 바는 Database 에서 조회해온 Domain Entity 의 Occupied 상태값이 False 일 경우에, 딱 한번만 메시지를 발행하기를 바라는 의도였다. 그런데, 이 코드를 리팩토링 하면서 동시성 처리를 위한 기능들이 빠져 있는것을 확인할 수 있었다. …

Read more

Spring Security .apply( configurer ) deprecated

개인 프로젝트의 Spring boot 버전을 3.2 로 업데이트 하는 과정에서 deprecated 된 함수를 발견해서, 해결했던 방법을 기록한다.문제가 된 코드는 Spring Security 의 FilterChain 을 정의하는 이부분에서 발생했다. 바로 Spring Security 에서 CustomConfigurer 를 적용하는 .apply 함수가 Spring Security 6.2 부터 Deprecated 되었다. 링크를 따라가보면 ” For removal in 7.0. Use AbstractConfiguredSecurityBuilder.with(SecurityConfigurerAdapter, Customizer) instead. ” 라고 명시되어 있다.내용은 …

Read more

[Java] Virtual thread 와 Platform Thread

Project Loom 으로부터 탄생한 결과물인 Virtual Thread가 Java 21 부터 정식 기능으로 사용 가능하게 되었다.고전적인 1 Request per 1 Thread 모델에 사용되었던 Platform Thread 는 생성, 사용, Context Switch 하는데에 많은 비용을 요구했기 때문에 스레드가 Blocking 되어 대기상태에 오랜 시간 머무르는것이 성능 저하를 일으키는 원인이었다. 기존의 무거운 Platform Thread 보다 경량화된 새로운 Thread 가 추가되면서 …

Read more

[MSA] (2) MSA 구성요소 – Saga 구현

MSA 구조는 장점만 있는 완벽한 구조가 아니다. 실제로 잘 갖추어진 환경을 만들려면 많은 것들을 준비해야 한다. 이번 글은 그 구성요소들과 시스템에 대한 고민을 정리한 글이다. MSA 를 구현하려면 완벽한 시스템, 서비스는 없다. 도메인을 작은 단위로 분해하게 되면 각 서비스를 개발하거나 유지보수할 때, 확장성에서는 분명한 장점을 갖는다. 그러나 서비스를 나누었기 때문에 발생하는 문제점들도 분명히 있다. 예를 …

Read more