메세지 큐를 사용해 본적이 없거나 사용할 계획을 가지고 계신 분들을 위한 가장 기초적인 프로젝트이다.
따라서 이와 관련 능숙한 분들은 해당 프로젝트는 굳이 볼 필요가 없는 프로젝트라는 것을 먼저 언급하고자 한다.
회사내에서 메세지 큐로 AWS의 RabbitMQ인 Amazon MQ를 사용중이다.
하지만 동료 한분이 Nats라는 것이 있는데 이것을 사용해 보면 어떨까라는 제안을 했다.
이게 무엇인가 찾아보니 꽤 흥미로운 구석이 있어서 일단은 테스트를 진행해 보고 있는데 문득 들었던 생각이 있다.
내가 알고 있는 메세지 브로커들인 Redis, Kafka를 하나의 서버에서 전부 다 사용해보면 어떨까라는 것이다.
물론 이것이 그저 상상에 불과하긴 하지만 다음과 같은 시나리오로 토이 프로젝트를 실행해 볼까 한다.
처음에는 RabbitMQ를 사용하다가 어떤 이유로 Redis로 변경이 되고 또 어떤 이유로 Kafka를 쓰게 되었다.
그리고 최종적으로 Nats를 쓰기고 결정했다.
당연히 이런 일은 없을 것이다.
개인적으로 불필요하다고 생각한다.
하지만 토이프로젝트이니 재미로 해보고자 한다.
물론 당연한 것은 없겠지만 보통은 스펙 변경이 쉽지 않고 기존에 잘 사용하고 있는 것을 굳이 바꿀 이유가 없을 것이다. 게다가 바꾸게 되면 벌어질 사이드 이펙트도 알 수 없으니 보통은 유지하겠지만 만일 위와 같은 시나리오가 일어난다는 가정을 해보자.
이 프로젝트의 목표는 저런 말도 안되는 상황이 벌어졌을 때 코드를 최대한 변경하지 않고 인터페이스로 기존의 코드를 활용하는 것이다.
최신 버전으로 서버를 구성한다. 현 시점에서 최신 버전은 아래와 같다.
- Spring Boot: 4.0.2
- Java: 21
- Kotlin: 2.2.21
- Code Style: KtLint
- RDBMS: PostgreSQL
해당 세팅은 Spring Initializr에서도 세팅을 하면 위와 같은 세팅을 처음 하게 된다.
한 달전만 해도 코틀린 버전이 낮게 되어서 생성되었는데 지금은 최신 버전으로 업데이트된듯 하다.
현재 이 브랜치에서는 가장 기본적인 세팅만 해 논 상태이다.
DB는 도커나 기존에 사용하시던 DB에 맞춰서 yaml에서 수정해서 세팅하면 된다.
사실 당장 사용하지는 않기 때문에 jpa나 이와 관련된 세팅을 Gradle에서 아예 빼놓아도 상관없다.
어짜피 DB 연결보다는 메세지 큐를 사용하는 것을 우선으로 하기 때문이다.
springdoc 역시 path 부분은 개인 세팅으로 변경하거나 불필요하면 springdoc을 제거하거나 path밑에 다음과 같이 명시적으로 표시해도 좋다.
springdoc:
api-docs:
path: /api-docs
enabled: false
swagger-ui:
path: /basquiat-api
enabled: false참고로 모르시는 분들은 없으시리라 생각하는데 개발단계에서는 활성화하고 프로덕트 레벨에서는 false로 두는 것을 일반적으로 추천한다.
대부분은 yaml을 단계별로 분리해서 사용할 테니 이 부분을 모르시는 분들이라면 참고하시면 될 것이다.
그리고 이런 저런 설정이 싫어서 현재 개인적으로 prettier로 KtLint를 사용하고 있다.
개인의 스타일이나 회사에서 사용하는 스타일로 자신에 맞게 세팅하기를 추천한다.
지금 이 프로젝트는 환경별로 yaml파일을 구성하도록 설정해 놨다.
따라서 이 스타일로 서버를 실행한다면 [구성 편집]에서 다음과 같이 단계로 실행을 해야 한다.
SpringWithBrokersApplication > 옵션 수정 클릭 > VM 옵션 추가
-Dspring.profiles.active=local
위와 같이 세팅을 하고 실행한다.
그게 아니라면 나눠진 yaml파일을 application.yaml에 하나로 합치고
spring:
application:
name: message-brokers-server
profiles:
active: local
server:
error:
whitelabel:
enabled: false
---
spring:
config:
activate:
on-profile: local
datasource:
hikari:
# more setting
처럼 구성하면 된다.
위와 같이 설정하면 편하다. 하지만 환경별로 구성이 길어지면 수정하는게 좀 힘들어지기 때문에 개인적으로 환경별로 파일을 나눠서 사용하는 것을 선호한다.
다음과 같이 진행이 될 것이다. 어짜피 재미로 해보는 것이니 메시지 브로커를 사용해 보고나 공부해 보고 싶은 분들은 참고하시면 될것이다.
솔직히 공부용으로는 깊이가 좀 얇다는 것을 먼저 인정하면서 고고!
RabbitMQ를 이용한 메시지 큐 브랜치
Redis를 이용한 메시지 큐 브랜치
Kafka를 이용한 메시지 큐 브랜치
Nats를 이용한 메시지 큐 브랜치
번외 - Redis를 이용한 분삭락 전략
번외 - Redis를 이용한 캐쉬 전략
번외 - Kafka Streams
번외 - Redis Sentinel Lock
번외 - Redis RedLock