본문 바로가기

전체 글59

반복되는 집계 쿼리 개선하기 사용자가 강의를 하며 실시간으로 Q&A 를 진행할 때 지속적으로 새로고침을 해야 하는 불편함이 있었습니다. 혹시 새로운 질문을 하는 사람이 있을까? 생각하며 계속 새로고침을 해야 하는 것이죠. 이 문제를 해결하기 위해 client 측에서 일정 시간마다 서버로 새로운 피드백이 있는지 요청을 보내고, 새로운 피드백이 생겼으면 토스트 메시지와 함께 새로고침 버튼을 표기해 줍니다. 해당 요청은 강한 실시간성이 필요하다고 판단하지 않아, 5초마다 client 측에서 요청을 보내고 있습니다. SSE 방식을 사용할 수도 있었지만 고려해야 할 부분이 많아, 우선 쉬운 polling 방식으로 빠르게 구현 후, 추후 마이그레이션 하는 방식을 선택했습니다. 이 부분에서 문제가 되는 점이 있었는데요, 바로 5초마다 집계쿼리가.. 2025. 11. 27.
다중 서버에서의 스케줄링 (feat. Lock) 피드줍줍은 단일 서버에서 스케줄링을 통한 배치 작업을 진행하고 있었는데, 규모가 커지며 다중 서버로 확장이 되었습니다. 서버가 확장되면서 여러 가지 문제가 발생했는데, 그중 하나가 스케줄링 중복 발행 이슈입니다. 이를 해결하기 위해서는 1) 별도의 스케줄링 서버를 도입2) 스케줄링을 직접 관리 두 가지의 선택지가 존재했는데, 서버비를 아끼기 위해 2번 방법을 선택했습니다.Scheduler 기본 설정스케줄링 관리할 겸, scheduler의 기본 설정부터 리팩토링을 진행해보았습니다. By default, Spring uses a local single-threaded scheduler to run the tasks.As a result, even if we have multiple @Scheduled met.. 2025. 11. 20.
커버링 인덱스 vs 클러스터링 인덱스 이번에 성능 개선을 하려고 커버링 인덱스를 적용했었는데요, Optimizer가 커버링 인덱스 대신, 클러스터링 인덱스를 선택하더라고요...? 무조건 커버링 인덱스가 빠르지!라는 생각을 가지고 있었는데, 잘못된 생각이더라고요. 그래서 이번 포스팅에서는 커버링 인덱스와 클러스터링 인덱스를 비교해보려고 합니다. 우선 커버링 인덱스를 적용해야겠다고 생각한 상황은 다음과 같습니다. - Client 측에서 5초 주기로 지속적인 통계 조회 요청을 합니다.- API가 많이 호출될 것이라고 생각했고, 성능 향상을 극한으로 하면 좋지 않을까?라는 생각을 했습니다.@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class OrganizationS.. 2025. 11. 17.
5xx 에러 로그 분석 자동화 (feat. n8n) 지금 진행중인 피드줍줍 프로젝트에서는 모니터링 환경을 Grafana로 구축해놨습니다. 효율적인 모니터링을 하기 위해 몇 가지 경보 설정을 해놨는데, 그 중 하나는 500 에러 입니다. 500 에러가 발생했을 경우 Discord 채널로 알람이 발송되는데요, 현재 상황에서는 개발자가 일일이 Grafana Dashboard에 접속해 로그를 분석해야 한다는 불편함이 존재했습니다. 이러한 문제를 해결하기 위해 n8n을 통해 에러 로그 분석을 자동화할 수 있겠다고 생각을 했고, 빠르게 구현을 해봤습니다. 구현의 결과물은 다음과 같습니다. 500 에러를 재현하기 힘들어, Grafana의 Alert 조건을 5xx -> 4xx로 바꾸고 진행한 결과인데요, 프롬프팅을 잘 해놓으니 할루시네이션 없이 직관적으로 에러 로그를 .. 2025. 10. 30.
2025 WOOWACON 후기 운 좋게 2025 우아콘에 참가할 수 있는 기회가 생겨서 다녀왔습니다! 개발자로서의 첫 컨퍼런스였고 우아한 형제들의 현업에서 하는 고민을 들을 수 있다는 부분에 대해 굉장히 설렜는데요, 다녀온 후기를 작성해보려고 합니다. 가장 기억에 남던 세션은 첫 번째 세션이었는데요, 요즘 AI Agent에 관심이 많이 있었던 찰나, 생각 정리를 도와준 세션이었습니다. 강의 중간에 모니터링 전문 AI 동료를 언급하셨는데요, 제가 프로젝트에서 사이드로 진행하고 있는 로그 분석기 작업과 너무 비슷해 놀랐습니다. 세션이 끝나고 나서는 로그 분석 리포트를 만들면서 고민했던 부분에 대해 연사님에게 질문을 하기도 했는데요, 이를 계기로 로그 분석 리포트 뿐만 아니라, 에러 분석 리포트도 만들어 프로젝트에 활용하고 있습.. 2025. 10. 30.
Filter, Interceptor 이번에 프로젝트를 진행하면서 Filter, Interceptor를 사용해 봤는데요, 어떤 친구들인지는 알고 있었지만 구체적으로 어느 상황에서 사용해야 하는지 헷갈려 정리를 하게 되었습니다. 우선 시작하기에 앞서 Spring의 요청 흐름에 대해 알고 있으면 많은 도움이 될 것 같습니다. 과거에 매우 간략하게 정리해놓은 글이 있는데요, 해당 게시글보다는 더 자세하게, 구체적으로 어떤 책임을 가지고 있는지까지 알아보도록 하겠습니다. https://codingmasterlsw.tistory.com/50 Spring HTTP 처리 과정흐름도 그림위의 그림을 보면서, 요청이 전달되는 과정에서 각 단계별 어떤 역할을 하는지 간단하게 이해하고 넘어가 보자. Tomcat- Client/ Web Server의 HTTP .. 2025. 10. 14.