Springboot 에서 WebSocket 통신하기

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

Read more

Proxy 에 대한 이해 – 3. Spring AOP

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

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

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

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

Read more

[MSA] (1) 내가 MSA를 도입한 이유

이 글은 왜 필자가 현재 개발하고 있는 프로젝트와 서비스들을 MSA 기반으로 설계하려고 했는지와 그때의 고민 그리고 현재 상황에 대한 기록이다. MSA에 대하여 MSA( Micro Service Architecture )는 요즘은 크고 거대한 시스템을 구축할 때에 당연히 고려할 만큼 많이 알려진 방법이다. 이와 반대점에 서 있는 Monolithic Architecture 가 갖고 있는 장점도 분명 있으나, 어떤 시스템이 확장( Extend …

Read more

[OAuth2] TokenSettings Class cast exception (2)

이 글은 이전 글 에서 이어지는 내용이다. 이번 글에서는 Type Cast issue 가 발생하는 근본적인 원인을 기록하고, 기존에 작성했던 코드도 리팩토링해보려고 한다. 요약 역시나 코드가 필요하거나, 자세한 내용이 필요 없는 사람들을 위해 먼저 요약 정리한다. OAuth Server의 전체 코드는 Spring-stack 여기서 확인할 수 있다.1. OAuth 인증을 하기 위해서는 Client를 미리 등록해야 한다. 만약 필자처럼 이 Client 정보를 …

Read more

[OAuth2] cannot be cast to class java.time.Duration

Spring module Project 에서 OAuth 관련 모듈을 개발하던 중에 생겼던 Duration 타입의 Type casting issue 를 해결한 과정을 공유하려 한다. Spring-modules 프로젝트에서 자주 사용되는 인증 방식을 미리 Application으로 구현하는데, 요새는 누구나 다 지원할만큼 보편적으로 사용되는 OAuth 인증 방식을 빼먹을 수 없어서 함께 구현하게 되었다. 필자는 OAuth2 인증 방식을 이해하기 위해서 OAuth 인증을 담당하는 Client, Authorization …

Read more