<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Java on Gukin Han</title>
    <link>https://gukin.dev/tags/java/</link>
    <description>Recent content in Java on Gukin Han</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Thu, 19 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://gukin.dev/tags/java/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Virtual Thread로 인한 HikariCP 커넥션 풀 고갈 해결 과정 - 트랜잭션 경계 분리로 타임아웃 제거</title>
      <link>https://gukin.dev/posts/virtual-thread-hikaricp-pool-exhaustion/</link>
      <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://gukin.dev/posts/virtual-thread-hikaricp-pool-exhaustion/</guid>
      <description>&lt;h2 id=&#34;virtual-thread-적용-이후-대량-이벤트-발생시-db-저장-로직-실패&#34;&gt;Virtual Thread 적용 이후 대량 이벤트 발생시 DB 저장 로직 실패&lt;/h2&gt;
&lt;p&gt;진행중인 개인 프로젝트에서는 &lt;a href=&#34;https://dart.fss.or.kr/&#34;&gt;DART&lt;/a&gt; 전자공시를 이용한다. 매일 수백 개의 전자공시가 DART 전자공시를 통해 게시되며 이를 수집해서 필터링하고 &lt;strong&gt;시장의 반응과 LLM의 감성분석을 집계하는 목표&lt;/strong&gt;를 갖고 있다.&lt;/p&gt;
&lt;p&gt;공시 자료 폴링(Polling)이 중단되었다가 재시작 하는 경우 다량의 공시자료를 조회하고 이벤트를 발행하게 된다. 이때 &lt;strong&gt;분석된 결과를 DB에 저장하는 과정에서 이슈가 발생&lt;/strong&gt;했다. 이 과정의 비즈니스 로직은 아래와 같이 정리할 수 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Polling으로 새 공시를 수집한다.&lt;/li&gt;
&lt;li&gt;수집된 공시의 제목으로 후속 처리가 필요한지 필터링한다.&lt;/li&gt;
&lt;li&gt;후속 처리가 필요하면 NewDisclosureEvent를 발행한다.&lt;/li&gt;
&lt;li&gt;이벤트 메시지에 담긴 공시 번호로 공시 문서를 조회한다.&lt;/li&gt;
&lt;li&gt;조회된 공시 문서를 LLM에게 넘겨서 감성 분석(Sentiment Analysis)을 실시한다.&lt;/li&gt;
&lt;li&gt;분석 결과를 DB에 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;문제가 발생한 코드는 다음과 같다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>시간당 34GB Spring Boot 로깅이 TPS에 미치는 영향과 병목점 분석</title>
      <link>https://gukin.dev/posts/spring-boot-logging-tps-bottleneck/</link>
      <pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://gukin.dev/posts/spring-boot-logging-tps-bottleneck/</guid>
      <description>&lt;h2 id=&#34;시간당-34gb의-로그-발생&#34;&gt;시간당 34GB의 로그 발생&lt;/h2&gt;
&lt;p&gt;사내 인프라 담당자가 우리가 담당하고 있는 &lt;strong&gt;서버의 로깅 설정&lt;/strong&gt; 관련된 내용을 공유해주었다. 간단하게 정리하면 다음과 같다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/ko/cloudwatch/pricing/&#34;&gt;Cloudwatch는 로그 GB마다 과금&lt;/a&gt;되는 형태&lt;/li&gt;
&lt;li&gt;불필요한 로그로 인해 비용이 발생하는것으로 확인됨&lt;/li&gt;
&lt;li&gt;현재 서비스에서 발생하는 로그(특히 info)를 점검할 필요가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;도메인 개발자라서 인프라 업무를 직접 수행할 기회와 권한이 없었다. 이번에 인프라팀이 공유해준 걸 계기로 &lt;strong&gt;개인적으로 살펴보았다&lt;/strong&gt;. 먼저 Cloudwatch에 들어가 직접 눈으로 로그 발생량을 확인했다.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cloudwatch 로그 발생량&#34; loading=&#34;lazy&#34; src=&#34;https://gukin.dev/posts/spring-boot-logging-tps-bottleneck/img.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;우리 서비스는 HR 서비스이기 때문에 대부분의 트래픽은 9시부터 18시 사이에 발생한다. 시간당 대략 &lt;strong&gt;34GB(2.7억건)의 로그&lt;/strong&gt;가 발생하며 그 중에 &lt;strong&gt;44% 정도가 jdbc.resultset=INFO&lt;/strong&gt; 에서 발생함을 확인했다. 여기서 몇 가지 의문이 들었다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Java enum을 활용한 전략 패턴(Strategy Pattern) 실무 적용기</title>
      <link>https://gukin.dev/posts/java-enum-strategy-pattern/</link>
      <pubDate>Fri, 25 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://gukin.dev/posts/java-enum-strategy-pattern/</guid>
      <description>&lt;p&gt;B2B 서비스에서 새로운 고객사가 들어오거나 기존 기능을 수정 및 이슈 픽스 해야하는 상황일 때 복잡한 if-else 레거시가 유지보수 효율성 문제를 자주 발생시켰다. enum 방식의 전략 패턴을 도입했고, 각 로직에는 단위테스트를 쉽게 도입할 수 있었다. 결과적으로 회귀테스트 비용이 제로로 떨어졌고, 나중에 팀원이 동일한 작업을 진행하면서 추가 작업이 쉬워졌음을 느꼈다고 공유해주었다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이 글에 사용된 코드는 실제 프로덕션 코드가 아닌, &lt;strong&gt;핵심 구조만 재구성한 예시&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;유지보수-관점에서-if-else의-문제점&#34;&gt;유지보수 관점에서 if-else의 문제점&lt;/h2&gt;
&lt;p&gt;모든 if-else 구조가 나쁜 것은 아니다. 때론 간결하고 단순한 코드 방식이 더욱 유지보수에 유리한 경우가 있다.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
