
[spring-boot-starter-actor] Redis 없이 spring boot 채팅 애플리케이션 개발하기
2025. 5. 29. 22:26
Java/Spring Boot
프로젝트에 사용된 코드 GitHub - examples-seonwkim/spring-boot-chatContribute to examples-seonwkim/spring-boot-chat development by creating an account on GitHub.github.com 분산 시스템에서 채팅 애플리케이션을 개발하기 위해서는 서로 다른 서버에 접속한 유저에게 메시지를 송신할 수 있도록 Redis 등의 메시지 전송을 위한 미들웨어가 필요합니다. 다른 방법으로는 서버를 클러스터로 묶고 서로 통신할 수 있도록 하는 방법이 있는데요, 요 포스팅에서는 액터 클러스터링 기능을 활용해서 후자의 방법으로 채팅 애플리케이션을 개발해 보겠습니다. Java 진영의 대표적인 액터 라이브러리로는 Pekko가..

[spring-boot-starter-actor] Spring 생태계에 Actor 초대하기
2025. 5. 16. 03:04
Open Source
Spring Boot 환경에서 상태를 공유해야 하는 기능이 필요할 때면 늘 고민이 생깁니다. "데이터베이스를 사용할까?", "레디스를 붙여볼까?" 이미 인프라가 잘 구축되어 있거나 프로젝트 규모가 크다면, 이런 미들웨어를 사용하는 게 크게 부담은 되지 않습니다. 하지만 이제 막 시작한 프로젝트이거나 예산이 빠듯한 경우라면 얘기가 좀 달라집니다. 클라우드에 Redis 클러스터를 올리는 비용도 무시할 수 없고, 단순히 DB를 상태 저장용으로 사용했을 때는 성능 저하나 부하 분산 같은 문제도 신경 써야 하거든요. 고민이 꼬리에 꼬리를 물기 시작합니다. “그럼 미들웨어 없이 상태를 공유할 수는 없을까?” 이런 생각 끝에 Actor Model이 이 문제를 꽤 효과적으로 풀 수 있지 않을까 싶어졌고, Java 진..

자고 일어나니 기여하던 오픈소스가 대박나있음
2024. 12. 18. 10:21
Open Source
올해 여름에 할 것도 없고 해서... 오픈소스 기여나 하자라는 생각으로 github을 둘러보고 있던 와중, Rust로 SQLite를 재작성하는 limbo라는 프로젝트를 알게 되었고 그 이후 틈틈이 기여를 했습니다. Limbo는 SQLite를 단순히 rust로 포팅하는게 아니라 기존 SQLite의 동기식 I/O를 비동기식 I/O로 전환하는 목표를 가지고 있었고, 그 목표에 어느 정도 동의하는 입장인지라 적극적으로 오픈소스에 기여했습니다. 다만 업무와 전혀 관련 없는 데이터베이스 도메인이었고 심지어 익숙하지 않은 rust를 사용하는 프로젝트여서 익숙해지는데 꽤 시간이 걸렸습니다. Limbo에 기여하면서 데이터베이스 도메인에 관심이 생겼고, 더 잘 이해해보고 싶은 마음에 여러 사이드 프로젝트를 진행했습니다. ..

분산 시스템 일관성 한판정리
2024. 11. 8. 11:56
Others
분산환경 시스템을 학습하다 보면 linearizability, causal consistency, total ordering, atomic broadcast 등 비슷하면서도 다른 개념들로 인해 분산 시스템에서의 일관성을 이해하는데 종종 어려움을 겪고는 했습니다. 이번 포스팅을 통하여 위 개념들이 무엇을 의미하고 그리고 어떻게 다른지 살펴보도록 하겠습니다. Linearizable(Strong Consistency, Atomic Consistency) Linearizable 한 시스템은 분산 환경에서 발생한 모든 이벤트를 발생한 절대적인 시간 기준으로 순서(global order)를 매길 수 있습니다. Linearizable 한 시스템에서 발생한 모든 이벤트는 단일 프로세스에서 이벤트를 순차적으로 발생시..

성급하게 시스템을 최적화하는 당신을 위한 글
2024. 10. 18. 18:00
Others
제가 개발 중인 랭킹 시스템은 유저가 앱에 접속했을 때 처음 바라보는 화면이기 때문에 높은 TPS를 견딜 수 있어야 합니다. 또한 장 시간에 따라(증권사앱) TPS가 들쭉날쭉해서... 급격하게 증가하는 TPS도 견딜 수 있어야 해서 다양한 최적화 전략을 사용하고 있습니다. 하지만 기존에 사용하던 최적화 방법으로는 랭킹에 신규 기능을 추가하는 게 불가능했습니다(왜 그런지는 뒤에서 설명하겠습니다). 또한 기존의 최적화 방법이 전혀 도움 되지 않았을뿐더러, 불필요한 TPS를 생성하는, 즉 self DDOS를 유발하고 있었음을 알게 되었습니다. 기존 랭킹 시스템랭킹 시스템은 아래와 같은 요구사항을 만족해야 합니다. 장 시간에 따라 다르지만 최대 4000 TPS 유저가 처음 보는 화면이기 때문에 짧은 laten..

첫 테크 블로그 기고
2024. 7. 30. 20:19
Career/회고
유연하고 확장 가능한 배너 기능 구현하기어떠한 요구사항도 수용할 수 있는 기능은 어떻게 만들 수 있을까요? 토스증권에서 유저에게 노출하는 배너 기능을 어떻게 유연하고 확장 가능하게 구현하였는지 공유 드려요.toss.tech 처음으로 사내 테크 블로그에 프로젝트와 관련된 글을 기고하게 됐습니다. 테크 블로그를 작성하면서 들었던 생각은 앞으로도 저의 작업을 다른 사람들에게 공유할 수 있도록 잘 정리하는 습관의 중요성을 느끼게 됐습니다. 정리된 문서가 부족하다 보니 기억에 의존하거나 프로젝트를 전체적으로 다 살펴보고 나서야 글을 작성할 수 있는 준비가 됐었습니다. 하지만 또 그 준비를 하는 과정에서 프로젝트에 대한 이해도를 높일 수 있어서 나름 좋은 점도 분명히 있었습니다.저의 첫 테크블로그는 그 어떠한 요구..

터미널 로딩 속도 개선하기
2024. 7. 6. 16:07
Others
최근에 생산성 향상에 도움 되는 툴을 이것저것 만지면서 익숙해지고 있는 와중에 사용 중인 zsh 터미널이 느려지는 게 체감되기 시작했습니다. 작업을 하는 도중 "터미널을 켜야겠네"라는 생각이 들면 무의식적으로 귀찮다는 생각이 들 정도였기에, 이는 해결해야 하는 문제가 됐음이 분명했습니다. 터미널 속도를 향상하는 방법과 관련하여 훌륭한 포스팅을 찾았고, 해당 포스팅의 내용을 적용해서 터미널 로딩 속도를 개선했던 과정을 공유드리고자 포스팅을 작성합니다. 느린 지점 파악하기 zsh는 plugin을 설치함으로써 다양한 기능을 활용할 수 있습니다. 초기에 의심했던 부분은 설치된 plugin을 로드하는 부분에서 느리지 않을까 하는 생각이었습니다. 그래서 각각의 plugin을 로드하는 시간을 확인하기 위해 "~/...

State Machine Pattern으로 인지부하 줄이기
2024. 3. 15. 01:12
Software Development
최근에 제가 속한 팀에서는 유저 모으기를 위한 프로모션 이벤트를 준비했습니다. 해당 이벤트를 위한 프로모션은 준비 기간이 짧았지만, 개발 스펙이 작지 않아 모두 고생했던 기억이 있습니다. 처음에는 개발 스펙을 받았을 때는 무수히 많은 에지 케이스가 숨어있음을 알지 못했습니다. 유저가 이벤트에 참여하면 유저의 참여 정도에 따라 상태가 변화하는데, 각 상태마다 무수한 에지 케이스가 있어 이를 어떻게 효과적으로 컨트롤할 수 있을지 고민했습니다. 그 결과 개별 상태와 상태별로 가능한 동작을 효과적으로 제어하기 위해 state machine pattern을 활용하기로 결정했습니다. State machine pattern은 소프트웨어 설계 패턴으로, 상태를 관리하는 데 사용됩니다. 특히 상태의 수가 정해진 경우에 ..