본문 바로가기

Feel-Archive

(4)
[Feel-Archive] 스케줄러 블로킹을 해결하기 위한 비동기 처리 - 타임캡슐 알림 개발 (1) 배경Feel-Archive 프로젝트의 타임캡슐 기능을 개발하던 중 다음과 같은 플로우로 진행 중이었다.1. 스케줄러 실행 (매분 단위로 스케줄러 발생)2. 타임캡슐 조회3. 타임캡슐 오픈 4. 타임캡슐 알림(SSE, 이메일)이 4가지 작업이 동기로 진행되면 SMTP 외부 서버를 사용하는 이메일 알림에서 작업이 오래 걸릴 수 있다. 테스트로 이메일 알림을 보낼 때 SMTP 서버 장애 등의 이유로 30초 이상 걸렸다고 해보자. 또한 이메일 발송 실패 시에도 재발송을 위한 로그를 반드시 남겨야 하는데, 트랜잭션 롤백 문제도 함께 다뤄야 한다. 내용이 길어질 수 있어 2개 글로 나눠 작성하겠다. 스케줄러 코드@Slf4j@Component@RequiredArgsConstructorpublic class TimeC..
[Feel-Archive] 성능 테스트(1) - 1GB 메모리에서 모니터링 구축하기 배경Feel-Archive 프로젝트 성능 측정을 진행하기 전에 서버 자원 지표를 수집하기 위해 Prometheus 도입을 결정했다. Grafana까지 EC2에 올리면 메모리 부담이 크다고 판단해 Prometheus만 docker-compose에 추가했다. Spring Boot Actuator를 사용하였고Prometheus가 15초마다 수집하는 구조였다. 원인 & 문제 해결처음에 기존에 EC2에 Spring App, MySQL, Redis가 띄워져있는 상태로 Prometheus도 추가해줬는데 터미널이 아예 먹통이 되어서 메모리나 docker stats같은것도 확인할 수 없어서 재부팅 후 Spring App에 메모리를 할당해주고 재시작했다. 그제서야 이제 터미널 먹통이 조금 풀리고 명령어를 실행할 수 있어서..
[Feel-Archive] N+1 감지 시스템 구축기 배경MVP 개발 단계에서는 일단 돌아가게를 목표로 빠르게 개발을 진행했다. JPA의 유명한 N+1 문제가 있다는 걸 알면서도 의도적으로 미뤘다. 일단 빠르게 개발해서 기능이 돌아가는게 우선이라고 생각했다. 그런데 막상 N+1을 잡으려고 하니 문제가 생겼다. 어떤 API에서 발생하는지 알 수가 없었다. 코드를 하나하나 뜯어보자니 범위가 너무 넓었고, show_sql로 로그를 켜봐도 가독성이 그렇게 좋다고 생각하지 않았다. 요청 단위로 쿼리가 몇 번 나가는지 알 수 있다면? 그래서 직접 구현해보기로 했다.해결방법 총 3가지를 중심으로 개발했다. ThreadLocal - 스프링은 HTTP 요청당 스레드가 생성되고, 각 스레드의 임시 저장소 역할을 하는 저장소다.StatementInspector — Hibe..
[Feel-Archive] 타임캡슐 알림이 9시간 늦게 온다 배경Feel-Archive 프로젝트에서 타임캡슐 기능을 테스트하던 중, 설정한 시간이 되어도 메일 알림이 오지 않는 문제가 발생했다.오전 1시53분에 타임캡슐을 작성했고, 오전 2시에 열리도록 설정했는데 한참을 기다려도 안오길래 DB를 직접 확인해보니 open_at 컬럼에 오전 11시로 저장되어 있었다. 정확히 9시간 차이... 타임존 문제임을 확신했다.원인먼저 서버 환경을 확인했다.# EC2 서버 시간 확인date# Sat Mar 7 17:45:35 UTC 2026# Docker 컨테이너 내부 JVM 타임존 확인java -XshowSettings:property -version 2>&1 | grep timezone# default timezone = Etc/UTC JVM은 UTC로 동작 중이었다. A..