<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>노갬성</title><link>https://nogamsung.github.io/</link><description>백엔드 개발자 안검성(nogamsung)의 기술 블로그. Spring Boot, JPA, Querydsl, Redis, Kong API Gateway, Airflow 등 실무에서 겪은 문제와 해결 과정을 기록합니다.</description> <language>ko-kr</language> <lastBuildDate>Thu, 05 Nov 2026 00:13:04 +0900</lastBuildDate> <generator>Jekyll 4.4.1</generator> <atom:link href="https://nogamsung.github.io/rss.xml" rel="self" type="application/rss+xml" /> <item><title>온프레미스 서버에 Kamal로 무중단 배포 도입하기</title><link>https://nogamsung.github.io/posts/kamal-zero-downtime/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/kamal-zero-downtime/</guid><pubDate>Wed, 04 Nov 2026 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>devops</category> <category>deployment</category> <description>Watchtower로 컨테이너를 다시 만들던 배포가 재배포 한 번에 서비스 대부분을 503으로 만든 일을 계기로, 직접 블루그린·Kamal·Coolify·Docker Swarm을 비교하고 Kamal을 고른 과정과 Tailscale SSH·서비스 간 호출·한 서버의 dev/prd·SMTP·예약 작업처럼 옮기면서 만난 문제를 정리합니다.</description> </item> <item><title>권한을 바꿨는데 30분 동안 옛 권한으로 동작한다, JWT에 권한 버전 심기</title><link>https://nogamsung.github.io/posts/jwt-permission-version/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/jwt-permission-version/</guid><pubDate>Tue, 03 Nov 2026 18:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>stateless JWT의 roles 클레임은 발급 시점 값이라 관리자가 권한을 바꿔도 토큰 수명(30분) 동안 옛 권한으로 메뉴와 API가 동작했습니다. 블랙리스트 대신 토큰에 권한 계산 시각(pv)을 넣고 Redis의 변경 시각과 비교해 401로 끊는 설계, 커밋 전 캐시 재적재 레이스, fail-open 선택까지 정리합니다.</description> </item> <item><title>무중단 배포에서 두 번 도는 예약 작업, ShedLock으로 막기</title><link>https://nogamsung.github.io/posts/shedlock-scheduled-lock/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/shedlock-scheduled-lock/</guid><pubDate>Tue, 03 Nov 2026 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>무중단 배포로 Spring Boot 배치 서버가 잠깐 두 개 뜨는 동안 @Scheduled 작업이 두 번 실행되는 문제를, 분산 락·Spring Batch·Quartz와 비교한 뒤 ShedLock(JDBC)과 lockAtLeastFor로 해결하고 graceful shutdown·테스트까지 갖춘 과정을 정리합니다.</description> </item> <item><title>내부 서비스 호출에 서킷브레이커를 넣으며 권한 조회를 fail-open에서 fail-closed로 바꾼 이야기</title><link>https://nogamsung.github.io/posts/circuit-breaker-fail-closed/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/circuit-breaker-fail-closed/</guid><pubDate>Mon, 02 Nov 2026 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>서비스 API 9개가 account 서비스에 권한을 묻는 구조에서, 조회 실패 시 &quot;허용&quot;하던 fail-open 설계는 장애가 곧 권한 우회였습니다. Resilience4j로 호출부 단위 회로 4개를 두고, 무엇을 실패로 셀지(4xx 제외), 회로 OPEN을 liveness에 연결하지 않는 이유, 권한 조회를 503 fail-closed로 바꾼 결정과 그 직후 드러난 배포 공백 문제까지 정리합니다.</description> </item> <item><title>Spring Boot 4 업그레이드, 그리고 final 엔티티 때문에 LAZY가 사실 EAGER였다</title><link>https://nogamsung.github.io/posts/spring-boot-4-kotlin-lazy-loading/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/spring-boot-4-kotlin-lazy-loading/</guid><pubDate>Tue, 27 Oct 2026 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>Spring Boot 3.4에서 4.1로, Kotlin 1.9에서 2.3(K2)으로 18개 모듈을 하루에 올리며 알게 된 것들. Kotlin 2.x의 plugin.jpa가 all-open을 켜면서 final이던 엔티티가 open이 되고, 그제서야 @ManyToOne(LAZY) 67곳이 지금까지 EAGER로 돌고 있었다는 사실과 가짜 fetch join 179곳이 드러났습니다. Jackson 3 때문에 전 요청이 39ms 만에 408이 난 사고도 함께 정리합니다.</description> </item> <item><title>Refresh 토큰 회전을 넣었다가 하루 만에 뺀 이유</title><link>https://nogamsung.github.io/posts/refresh-token-rotation-rollback/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/refresh-token-rotation-rollback/</guid><pubDate>Fri, 04 Sep 2026 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>보안 리뷰 권고대로 refresh 토큰 회전과 재사용 탐지를 넣었더니 30분마다 전 사용자가 모든 서비스에서 동시에 로그아웃됐습니다. 데스크톱 셸이 한 refresh 토큰을 웹앱 5개 쿠키와 자기 저장소에 복제하는 구조에서 &quot;재사용 = 탈취&quot; 판정이 어떻게 오판으로 바뀌는지, 그리고 회전을 걷어내고 무엇을 남겼는지 정리합니다.</description> </item> <item><title>LiveKit 통화 종료 정산 경합, REST leave와 webhook이 같은 상태를 바꿀 때</title><link>https://nogamsung.github.io/posts/livekit-call-settlement-race/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/livekit-call-settlement-race/</guid><pubDate>Thu, 03 Sep 2026 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>사내 메신저에 LiveKit SFU로 음성 통화를 붙인 뒤 사흘 동안 겪은 세 가지 문제를 정리합니다. 인증 필터가 LiveKit 서명 JWT를 유저 JWT로 검증해 webhook이 전량 401이 되던 것, 동기 REST leave와 비동기 webhook이 같은 통화 상태를 바꾸며 생긴 정산 경합을 멱등 정산으로 푼 것, 유저 단위 STOMP 토픽으로는 응답자의 다른 기기 벨을 끌 수 없던 것입니다.</description> </item> <item><title>당근 2024 테크 밋업</title><link>https://nogamsung.github.io/posts/daangn-tech-meetup-2024/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/daangn-tech-meetup-2024/</guid><pubDate>Mon, 07 Oct 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>etc</category> <category>conference</category> <description>당근 2024 테크 밋업 후기. 당근알바 초기 엔지니어링 전략, 다중 서버 채팅 시스템 설계, Istio 네트워크 장애 해결 사례와 당근페이 네트워킹 세션에서 들은 내용을 정리했습니다.</description> </item> <item><title>Airflow 설치하기</title><link>https://nogamsung.github.io/posts/airflow-install/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/airflow-install/</guid><pubDate>Tue, 24 Sep 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>data</category> <category>airflow</category> <description>Spring Batch, Spark, AWS Batch 등 배치 처리 선택지를 비교한 뒤, macOS에서 Conda 가상환경으로 Apache Airflow 2.10을 설치하고 MySQL, AWS provider까지 세팅해 실행하는 절차를 정리합니다.</description> </item> <item><title>SLASH24 토스 컨퍼런스</title><link>https://nogamsung.github.io/posts/slash24-toss-conference/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/slash24-toss-conference/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>etc</category> <category>conference</category> <description>토스 SLASH 24 서버 세션 후기. 리플레이 검증으로 레거시 원장을 안전하게 전환한 사례, MySQL 기반 코어뱅킹 전환, SAGA 패턴과 보상 트랜잭션으로 환전을 처리하는 방법을 정리했습니다.</description> </item> <item><title>API Gateway가 있다면 인증 로직을 넘기자</title><link>https://nogamsung.github.io/posts/api-gateway-authentication/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/api-gateway-authentication/</guid><pubDate>Wed, 11 Sep 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>devops</category> <category>api-gateway</category> <description>여러 Spring Boot 서버의 JWT 토큰 인증을 Auth 서버에 몰아줄지 API Gateway에서 처리할지 비교하고, Kong JWT 플러그인의 한계를 커스텀 플러그인으로 넘어서 인증을 통합한 설계 과정을 공유합니다.</description> </item> <item><title>Kong API Gateway Custom Plugin 적용</title><link>https://nogamsung.github.io/posts/kong-custom-plugin/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/kong-custom-plugin/</guid><pubDate>Wed, 04 Sep 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>devops</category> <category>api-gateway</category> <description>Lua로 작성한 커스텀 플러그인을 Dockerfile로 Kong 이미지에 포함시켜 빌드하고, Konga와 Kong Manager에서 플러그인을 활성화하는 방법을 단계별로 정리합니다.</description> </item> <item><title>Kong API Gateway 설치하기</title><link>https://nogamsung.github.io/posts/kong-api-gateway-install/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/kong-api-gateway-install/</guid><pubDate>Fri, 30 Aug 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>devops</category> <category>api-gateway</category> <description>Docker로 PostgreSQL, Kong API Gateway, Konga 관리 UI를 설치하고 연결한 뒤 Service와 Route를 등록해 요청이 라우팅되는지 확인하는 전 과정을 명령어와 함께 설명합니다.</description> </item> <item><title>SHA256 마이그레이션 쿼리</title><link>https://nogamsung.github.io/posts/sha256-migration-query/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/sha256-migration-query/</guid><pubDate>Thu, 25 Jul 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>sql</category> <category>mysql</category> <description>무중단 서비스에서 비밀번호를 SHA256으로 단방향 암호화 마이그레이션하는 MySQL 쿼리 작성법. 실행 전 테스트, 본 쿼리 실행, 실행 후 검증까지 실행 계획을 단계별로 정리합니다.</description> </item> <item><title>Redis를 이용한 동시성 문제 해결</title><link>https://nogamsung.github.io/posts/redisson-distributed-lock/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/redisson-distributed-lock/</guid><pubDate>Wed, 24 Jul 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>다중 서버 환경의 동시성 문제를 Redisson 분산 락으로 해결합니다. 커스텀 @RedissonLock 애노테이션과 AOP Aspect를 구현해 서비스 메서드에 적용하고 테스트하는 과정을 다룹니다.</description> </item> <item><title>Spring Boot와 Java 버전 업그레이드</title><link>https://nogamsung.github.io/posts/spring-boot-3-java-21-upgrade/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/spring-boot-3-java-21-upgrade/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>ISMS 심사를 계기로 Spring Boot 2.7에서 3.3으로, Java 11에서 21로 업그레이드한 과정을 build.gradle 변경, Gradle 래퍼, SecurityConfig 코드 수정 순서로 정리합니다.</description> </item> <item><title>2023년 회고</title><link>https://nogamsung.github.io/posts/2023-retrospect/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/2023-retrospect/</guid><pubDate>Sun, 31 Dec 2023 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>etc</category> <category>retrospect</category> <description>백엔드 개발자로 첫 취업을 준비하며 세운 전략, 목표 기업 기준, 이력서 구성 방법과 트립비토즈에 합류하기까지의 과정을 돌아본 2023년 회고입니다.</description> </item> <item><title>일대일 관계에서 발생하는 N+1 문제 해결</title><link>https://nogamsung.github.io/posts/one-to-one-n-plus-1/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/one-to-one-n-plus-1/</guid><pubDate>Fri, 27 Oct 2023 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>Querydsl IN 절로도 해결되지 않던 @OneToOne 지연 로딩 N+1 문제의 원인을 분석하고, default_batch_fetch_size 설정과 ManyToOne 관계 변경이라는 두 가지 해결책을 비교합니다.</description> </item> <item><title>Querydsl 동적 페이지네이션 쿼리</title><link>https://nogamsung.github.io/posts/querydsl-dynamic-pagination/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/querydsl-dynamic-pagination/</guid><pubDate>Sun, 15 Oct 2023 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>Querydsl로 조건에 따라 where 절이 달라지는 커서 기반 페이지네이션 동적 쿼리를 작성하는 방법을 JpaRepository 방식과 비교해 예제 코드로 설명합니다.</description> </item> <item><title>IN 절로 N+1 문제 해결</title><link>https://nogamsung.github.io/posts/n-plus-1-in-clause/</link><guid isPermaLink="true">https://nogamsung.github.io/posts/n-plus-1-in-clause/</guid><pubDate>Wed, 11 Oct 2023 00:00:00 +0900</pubDate> <dc:creator>Geomseong Ahn</dc:creator> <category>backend</category> <category>spring</category> <description>팀원 찾기 페이징 조회에서 반복문마다 쿼리가 나가던 N+1 문제를 Querydsl IN 절로 한 번의 쿼리로 묶어 해결한 과정과 개선 전후 실행 시간을 비교합니다.</description> </item> </channel> </rss>
