Springboot 에서 WebSocket 통신하기

Javascript 기반의 Socket Server 를 Java 기반으로 새로 만들어야 했던 일이 있었다.기존 NestJS와 + SocketIO 기반으로 만들어진 Socket Server 가 있었는데, 어떤 어려움이 있었고 이를 어떻게 해결하였는지에 관한 기록이다. 문제 인식 기존에 JavaScript 기반으로 만들어진 서버를 언어까지 바꿔가면서 통으로 리팩토링 했던 이유는 크게 두가지였다. 다른 Application 에서 Socket 을 이용해서 통신하고 싶으면, Kafka를 통해 Message …

Read more

[Design] EDA의 개념 (3) – CQRS

EDA 개념 마지막편으로 CQRS에 대해 알아보자. CQRS The basic idea with CQRS is that you separate the components that read and write to your permanent store. So you have effectively two separate models one for dealing with updates and one for dealing with reads. CQRS( Command and Query Responsibility Segregation ) 는 이름에서 유추할 수 …

Read more

[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