<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>개발자 이진우</title>
    <link>https://jinlee.kr</link>
    <description>무언가에 몰입할 때 가장 행복한 개발자 이진우입니다. 개발하며 마주친 문제와 판단 과정을 기록합니다.</description>
    <language>ko</language>
    <atom:link href="https://jinlee.kr/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>heap 99%인 JVM 서비스 3개의 컨테이너 OOM 비교</title>
      <link>https://jinlee.kr/devops/2026-09-25-jvm-heap-full-but-not-oom/</link>
      <guid isPermaLink="true">https://jinlee.kr/devops/2026-09-25-jvm-heap-full-but-not-oom/</guid>
      <category>devops</category>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <description>세 JVM 서비스가 모두 heap을 95~99% 쓰고 있었는데 OOM 위험은 서로 달랐다. 한 서비스는 30일간 OOMKilled가 55번 났고 나머지 둘은 0번이었다. 0번인 서비스 중 하나도 메모리 여유가 거의 없었다. heap 사용률만으로는 OOM을 예측할 수 없어서 종료 사유, 컨테이너 RSS, live set을 차례로 확인해보았다.</description>
    </item>
    <item>
      <title>MongoDB에서 중복 값이 있는 필드에 unique 인덱스를 걸면 생기는 일</title>
      <link>https://jinlee.kr/database/2026-09-07-mongodb-unique-index-on-duplicate-keys/</link>
      <guid isPermaLink="true">https://jinlee.kr/database/2026-09-07-mongodb-unique-index-on-duplicate-keys/</guid>
      <category>database</category>
      <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
      <description>이미 중복 데이터가 쌓인 컬렉션에 unique 인덱스를 생성하려다 실패한 경험을 정리한다. MongoDB가 unique 인덱스 빌드를 어떻게 처리하는지, 여러 인덱스를 한 번에 만들 때 무슨 일이 벌어지는지, 그리고 어떻게 복구했는지를 다룬다. MySQL(InnoDB)과 비교하며 두 DB가 같은 선택을 한 이유도 함께 본다.</description>
    </item>
    <item>
      <title>쿠키 누적과 maxHttpHeaderSize 초과로 발생한 500 장애 해결기</title>
      <link>https://jinlee.kr/network/2026-09-04-cookie-header-too-large-500/</link>
      <guid isPermaLink="true">https://jinlee.kr/network/2026-09-04-cookie-header-too-large-500/</guid>
      <category>network</category>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <description>특정 사용자·특정 PC에서만 간헐적으로 발생하던 500. 부모 도메인에 누적된 쿠키가 요청 헤더 한도를 넘긴 것이 원인이었다. 클라이언트가 쿠키를 많이 갖게 되는 구조, 개발계에서 재현되지 않은 이유, 일부 PC에서만 발생한 이유를 정리한다.</description>
    </item>
    <item>
      <title>개발계 오버커밋 배포 장애 회고</title>
      <link>https://jinlee.kr/devops/2026-08-24-cpu-request-overcommit-crashloop/</link>
      <guid isPermaLink="true">https://jinlee.kr/devops/2026-08-24-cpu-request-overcommit-crashloop/</guid>
      <category>devops</category>
      <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
      <description>개발계 백엔드 20개 서비스의 CPU request를 낮추자 배포가 Progressing 상태에서 끝나지 않았다. 스케줄러가 request만 보고 한 노드에 파드를 몰아 배치했고, 동시에 부팅한 JVM들이 CPU를 제대로 받지 못해 CrashLoop이 반복됐다. 노드별 재시작 분포로 원인을 확인하고 재발 방지 방법을 정리했다.</description>
    </item>
    <item>
      <title>채널 종속 정책과 공통 논리를 나누는 기준</title>
      <link>https://jinlee.kr/web/2026-08-23-channel-specific-vs-shared-logic/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2026-08-23-channel-specific-vs-shared-logic/</guid>
      <category>web</category>
      <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
      <description>진입 채널(BFF)이 여럿인 구조에서 새 로직을 추가할 때, 요청이 들어온 채널에 바로 넣기 쉽다. 하지만 그 전에 &quot;이 정책이 이 채널에만 해당하는가, 아니면 모든 채널이 지켜야 할 공통 논리인가&quot;를 먼저 물어야 한다. 채널별 BFF에 둘지 공통 도메인 서비스에 응집할지 판단한 흐름을 정리하고자 한다.</description>
    </item>
    <item>
      <title>HTTP Keep-Alive와 stale 커넥션 - idle timeout mismatch가 만드는 장애</title>
      <link>https://jinlee.kr/network/2026-08-03-http-keep-alive-stale-idle-timeout-mismatch/</link>
      <guid isPermaLink="true">https://jinlee.kr/network/2026-08-03-http-keep-alive-stale-idle-timeout-mismatch/</guid>
      <category>network</category>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>외부 API를 호출하는 백엔드 서비스에서 간헐적으로 발생한 발송 실패를 추적하다 만난 stale connection 문제와, 클라이언트/서버 idle timeout mismatch를 해소한 과정을 정리한다.</description>
    </item>
    <item>
      <title>Memory Leak 판별을 위한 Heap Dump</title>
      <link>https://jinlee.kr/devops/2026-02-17-heap-dump-visualvm/</link>
      <guid isPermaLink="true">https://jinlee.kr/devops/2026-02-17-heap-dump-visualvm/</guid>
      <category>devops</category>
      <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
      <description>일본어 검색 API를 활용하는 서비스의 메모리 증가 문제를 로컬에서 재현하고, Heap Dump와 VisualVM으로 누수 여부를 판별해 “Memory Leak 아님” 결론에 도달한 과정을 정리했다.</description>
    </item>
    <item>
      <title>WebFlux Multipart 프록시에서 &apos;Unexpected end of form&apos;이 터지는 이유</title>
      <link>https://jinlee.kr/web/2026-02-08-webflux-multipart-proxy-unexpected-end-of-form/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2026-02-08-webflux-multipart-proxy-unexpected-end-of-form/</guid>
      <category>web</category>
      <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
      <description>WebFlux 기반 BFF에서 multipart/form-data를 내부 서비스로 프록시할 때, multipart를 파싱한 뒤 재조립하면서도 원본 헤더(Content-Type/Content-Length)를 그대로 복사하면 boundary·길이가 body와 불일치해 &quot;Unexpected end of form&quot;이 발생한다. BodyInserters가 메시지를 재작성(write)한다는 관점과, 프록시를 “재작성(rebuild)”/“바이트 스트리밍(pass-through)” 모드로 구분하는 기준을 정리한다.</description>
    </item>
    <item>
      <title>Spring Boot 버전 업데이트 이후, WebFlux 필터 헤더 전파가 깨진 이유와 해결기</title>
      <link>https://jinlee.kr/web/2026-01-25-fixing-webflux-header-propagation-after-spring-upgrade/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2026-01-25-fixing-webflux-header-propagation-after-spring-upgrade/</guid>
      <category>web</category>
      <pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate>
      <description>사내에서 JDK 버전 업데이트 태스크를 담당하며 개발계에서 마주한 장애와 이를 해결하는 과정을 다룬다.</description>
    </item>
    <item>
      <title>왜 API 요청 수를 줄여야 할까?</title>
      <link>https://jinlee.kr/web/2025-11-09-why-reduce-api-requests/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-11-09-why-reduce-api-requests/</guid>
      <category>web</category>
      <pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate>
      <description>AWS 환경에서 클라이언트(web) → 서버(VPC 내부) 호출 시, Internet Gateway(IGW)를 통한 첫 진입은 내부 통신보다 훨씬 비싸다. 요청 수를 줄이는 것은 단순한 최적화가 아니라, 가장 비싼 네트워크 경계를 덜 넘는 설계의 문제다.</description>
    </item>
    <item>
      <title>Project Loom 실험기</title>
      <link>https://jinlee.kr/web/2025-10-01-project-loom-lab/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-10-01-project-loom-lab/</guid>
      <category>web</category>
      <pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate>
      <description>필자는 강남언니(힐링페이퍼)의 기술블로그를 읽고 이벤트 소싱 패턴에 대해 관심을 가지게 되었고, 이에 대한 학습을 진행하면서 기존의 Platform Thread와 Virtual Thread에 대해 비교하는 글을 정리해보기로 하였다.</description>
    </item>
    <item>
      <title>Spring Security + JWT 기반 인증/인가 구현기</title>
      <link>https://jinlee.kr/web/2025-08-18-spring-security-jwt-authentication/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-08-18-spring-security-jwt-authentication/</guid>
      <category>web</category>
      <pubDate>Mon, 18 Aug 2025 00:00:00 GMT</pubDate>
      <description>필자는 최근 프로젝트에서 Spring Security를 적용하며 JWT 기반 인증/인가 로직을 구현하였다. Spring Security는 기본적으로 모든 요청을 차단하고, 인증/인가 규칙에 따라 접근을 허용하는 보안 프레임워크이다. 본 글에서는 JWT 기반의 Stateless 인증 방식을 도입하며 마주한 이슈들과 해결 과정을 공유하고자 한다.</description>
    </item>
    <item>
      <title>JWT Refresh Token Rotation (RTR) 전략으로 보안 강화하기</title>
      <link>https://jinlee.kr/web/2025-08-17-jwt-refresh-token-rotation/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-08-17-jwt-refresh-token-rotation/</guid>
      <category>web</category>
      <pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate>
      <description>사이드 프로젝트를 진행하며 백오피스를 개발하게 되었고, 그 과정에서 관리자 로그인 페이지 구현을 맡게 되었다. 인증 방식으로 JWT 기반 접근 방식을 선택하였고, Access Token의 탈취를 방지하기 위해 짧은 TTL을 설정하였다. 그러나 구현 도중 &quot;만약 Refresh Token이 탈취된다면 어떻게 대응해야 할까?&quot;라는 의문이 생겼고, 이를 해결할 수 있는 방안을 탐색하게 되었다.</description>
    </item>
    <item>
      <title>Spring Boot 멀티모듈 아키텍처 전환기</title>
      <link>https://jinlee.kr/web/2025-07-23-spring-multi-module-transition/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-07-23-spring-multi-module-transition/</guid>
      <category>web</category>
      <pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate>
      <description>📉 빌드 34 → 6 초, 테스트 33 → 1.4 초. 7단계 분리를 거쳐서 모노리스를 &quot;모듈화된 모노리스&quot;로 탈바꿈했다. 이 글은 MSA를 향한 징검다리로서의 멀티모듈 전환기를 기록한 회고록이다.</description>
    </item>
    <item>
      <title>Gradle에서 settings.gradle과 build.gradle의 역할과 차이</title>
      <link>https://jinlee.kr/web/2025-07-15-gradle-settings-vs-build/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-07-15-gradle-settings-vs-build/</guid>
      <category>web</category>
      <pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate>
      <description>스프링 부트를 멀티모듈로 개발하다보면 `settings.gradle`과 `build.gradle`의 책임이 헷갈릴 때가 있다. 필자는 이 글에서 둘의 역할과 차이점을 명확히 정리해보고자 한다.</description>
    </item>
    <item>
      <title>Gradle에서 api vs implementation 의존성 스코프 정리</title>
      <link>https://jinlee.kr/web/2025-07-13-gradle-api-vs-implementation/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-07-13-gradle-api-vs-implementation/</guid>
      <category>web</category>
      <pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate>
      <description>필자는 모듈화된 Java / Kotlin 프로젝트에서 가장 자주 헷갈리는 api와 implementation 스코프의 차이와 선택 기준을 명확히 정리해보고자 한다.</description>
    </item>
    <item>
      <title>Server-Sent Events(SSE) 구현과 실무에서 마주할 수 있는 문제 해결기</title>
      <link>https://jinlee.kr/web/2025-07-05-server-sent-events-sse/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-07-05-server-sent-events-sse/</guid>
      <category>web</category>
      <pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate>
      <description>필자는 실시간 알림 시스템을 구현하면서 Server-Sent Events(SSE)를 도입하게 되었다. 기존의 폴링 방식에서 벗어나 서버에서 클라이언트로 실시간 데이터를 푸시하는 방식을 구현하고자 했으며, 특히 Spring Boot 환경에서 SSE를 활용한 실시간 알림 기능을 개발하였다.
구현 과정에서 연결 관리, 재연결 처리, 브라우저 호환성 등 다양한 문제들을 마주할 수 있었고, 이를 해결하는 과정에서 SSE의 동작 원리와 실무 적용 시 고려사항들을 깊이 있게 학습할 수 있었다. 본 글에서는 SSE의 기본 개념부터 실제 구현 과정, 그리고 마주할 수 있는 문제들과 해결 방법을 함께 정리하고자 한다.</description>
    </item>
    <item>
      <title>Java로 구현한 Virtual Host 기능과 Host 헤더 이슈 해결기</title>
      <link>https://jinlee.kr/web/2025-04-17-virtual-host-and-host-header-issue/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-04-17-virtual-host-and-host-header-issue/</guid>
      <category>web</category>
      <pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate>
      <description>필자는 Java 및 웹 개발 학습의 일환으로 간단한 HTTP 서버를 직접 구현해보며 웹 서버의 기본 구조와 요청 처리 방식을 익히고자 했다. 특히 가상 호스트(Virtual Host) 기능을 통해 하나의 서버에서 여러 도메인 요청을 분기하는 로직을 직접 구현하면서, 실무에서 자주 접하게 될 네트워크 및 서블릿 처리 흐름을 체득하고자 하였다.
해당 기능을 구현하던 중 Java의 `HttpURLConnection`이 `Host` 헤더를 덮어써서 발생한 테스트 이슈를 경험하였다. 이를 해결하는 과정에서 교훈을 얻어 Virtual Host 개념 및 구현 내용을 정리하고, 그 과정에서 마주한 문제와 해결 방법을 함께 공유하고자 작성하였다.</description>
    </item>
    <item>
      <title>ElasticSearch란 무엇인가?</title>
      <link>https://jinlee.kr/database/2025-03-27-elastic-search-1/</link>
      <guid isPermaLink="true">https://jinlee.kr/database/2025-03-27-elastic-search-1/</guid>
      <category>database</category>
      <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
      <description>ElasticSearch에 대해 알아보고자 한다.</description>
    </item>
    <item>
      <title>Mac에서 ElasticSearch 설치 및 실행하기</title>
      <link>https://jinlee.kr/database/2025-03-27-elastic-search-2/</link>
      <guid isPermaLink="true">https://jinlee.kr/database/2025-03-27-elastic-search-2/</guid>
      <category>database</category>
      <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
      <description>필자의 로컬 개발 환경인 Mac에서 ElasticSearch를 설치하고, 실행하는 과정을 기록하려 한다.</description>
    </item>
    <item>
      <title>RDB와 NoSQL로 살펴보는 데이터베이스 확장성 전략</title>
      <link>https://jinlee.kr/database/2025-03-26-database-scalability/</link>
      <guid isPermaLink="true">https://jinlee.kr/database/2025-03-26-database-scalability/</guid>
      <category>database</category>
      <pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate>
      <description>확장성이라는 키워드에 대해 RDB와 NoSQL이 각각 어떠한 접근법으로 해당 이슈를 해결하였는지 알아보고자 한다.</description>
    </item>
    <item>
      <title>C10K 및 C10M 문제</title>
      <link>https://jinlee.kr/trend/2025-03-24-c10k/</link>
      <guid isPermaLink="true">https://jinlee.kr/trend/2025-03-24-c10k/</guid>
      <category>trend</category>
      <pubDate>Mon, 24 Mar 2025 00:00:00 GMT</pubDate>
      <description>C10K 문제에 대해 이야기해보고자 한다.</description>
    </item>
    <item>
      <title>Spring Batch 구현 - 멀티스레드 적용</title>
      <link>https://jinlee.kr/web/2025-03-18-spring-batch-3/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-03-18-spring-batch-3/</guid>
      <category>web</category>
      <pubDate>Tue, 18 Mar 2025 00:00:00 GMT</pubDate>
      <description>대용량 데이터 처리 시 Spring Batch의 성능을 획기적으로 개선하는 멀티스레드 적용 방법을 필자의 이전 프로젝트 사례를 통해 살펴보고자 한다.</description>
    </item>
    <item>
      <title>Spring Batch - 배치 작업과 스케줄러 연동하기</title>
      <link>https://jinlee.kr/web/2025-03-17-spring-batch-1/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-03-17-spring-batch-1/</guid>
      <category>web</category>
      <pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate>
      <description>다수의 시스템에서는 대용량 데이터 처리, 정기적인 리포트 생성, 데이터 마이그레이션 등 주기적으로 실행해야 하는 작업들이 많다. 필자 역시도 인턴십 등 서비스 개발을 진행하며 이러한 작업들을 마주하곤 했다. Spring 생태계에서는 이런 반복적인 작업들을 효율적으로 처리하기 위한 도구로 Spring Batch와 Scheduler를 제공한다. 본 글에서는 Spring Batch의 핵심 개념을 소개하고, 이를 Scheduler와 어떻게 효과적으로 연동할 수 있는지 실제 경험을 바탕으로 설명하고자 한다.</description>
    </item>
    <item>
      <title>Spring Batch 처리 방식 비교 - Tasklet vs Chunk</title>
      <link>https://jinlee.kr/web/2025-03-17-spring-batch-2/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2025-03-17-spring-batch-2/</guid>
      <category>web</category>
      <pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate>
      <description>이전 글 &quot;Spring Batch - 배치 작업과 스케줄러 연동하기&quot;에서 언급했듯이, Spring Batch는 대용량 데이터 처리를 위한 강력한 프레임워크이다. 이번 글에서는 Spring Batch의 두 가지 주요 처리 방식인 Tasklet과 Chunk 방식을 비교 분석하고자 한다.</description>
    </item>
    <item>
      <title>Java ConcurrentHashMap - 동시성 제어의 이해</title>
      <link>https://jinlee.kr/etc/2025-01-12-java-concurrent-hash-map2/</link>
      <guid isPermaLink="true">https://jinlee.kr/etc/2025-01-12-java-concurrent-hash-map2/</guid>
      <category>etc</category>
      <pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate>
      <description>최근 면접을 준비하며 자료구조와 스레드, 동시성 등을 공부하면서 멀티스레드 환경에서의 데이터 처리에 대해 이해하고자 관심을 갖게 되었다. 특히 여러 스레드가 동시에 접근하는 Java에서는 데이터 구조를 다룰 때 더욱 각별한 주의가 필요하다. 이러한 문제를 해결하기 위해 등장한 Java의 ConcurrentHashMap의 내부 동작에 대해 자세히 알아보려 한다.</description>
    </item>
    <item>
      <title>2024년 회고 (Feat. 멋사, 졸업)</title>
      <link>https://jinlee.kr/essay/2024-12-31-retrospective-of-2024/</link>
      <guid isPermaLink="true">https://jinlee.kr/essay/2024-12-31-retrospective-of-2024/</guid>
      <category>essay</category>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <description>필자는 2024년을 되돌아보기 위해 주요 활동들을 되짚어보며, 회고록을 작성하고자 한다.</description>
    </item>
    <item>
      <title>DDD에서 Usecase 패턴 활용하기</title>
      <link>https://jinlee.kr/etc/2024-12-11-ddd-usecase/</link>
      <guid isPermaLink="true">https://jinlee.kr/etc/2024-12-11-ddd-usecase/</guid>
      <category>etc</category>
      <pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate>
      <description>필자는 최근 팀 프로젝트를 진행하면서 Spring Boot를 활용한 WAS 구현을 담당하였다. WAS를 구현하면서 상위 Service와 하위 Service가 무분별하게 참조되면서 패키지 구조가 복잡해지는 것을 경험하고 있다. 이를 보다 명확하게 구분하고자 DDD와 Usecase를 이해하고 이를 프로젝트에 적용하고자 한다.</description>
    </item>
    <item>
      <title>네이버 헬스케어연구소 개발 인턴 회고</title>
      <link>https://jinlee.kr/essay/2024-11-22-naver-intern-retrospect/</link>
      <guid isPermaLink="true">https://jinlee.kr/essay/2024-11-22-naver-intern-retrospect/</guid>
      <category>essay</category>
      <pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate>
      <description>필자는 지난 6월 24일부터 8월 16일까지 8주간 네이버 헬스케어연구소(일명 Healthcare Digital Transformation)에서 개발 인턴으로 근무하였다. 어느덧 인턴십이 끝난 지 3달 가량이 지났고, 이를 회고하는 시간을 가지고자 한다.</description>
    </item>
    <item>
      <title>Spring Component Scan</title>
      <link>https://jinlee.kr/web/2024-11-15-spring-component-scan/</link>
      <guid isPermaLink="true">https://jinlee.kr/web/2024-11-15-spring-component-scan/</guid>
      <category>web</category>
      <pubDate>Fri, 15 Nov 2024 00:00:00 GMT</pubDate>
      <description>이전 포스트에서 Spring Bean의 기본 개념에 대해 다루었다. 필자는 프로젝트를 경험하면서 Component Scan과 관련된 문제를 디버깅하며, Component Scan의 내부 동작 방식을 제대로 이해하지 못할 경우 많은 시간을 디버깅에 할애한 경험이 있다. 특히 프로젝트의 규모가 커질 수록 Spring Bean의 등록 순서 및 순환 참조 문제를 해결하기 위해서는 Component Scan의 동작 방식을 명확히 이해하는 것이 중요하다.</description>
    </item>
  </channel>
</rss>