<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kospi on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/kospi/</link><description>Recent content in Kospi on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Thu, 16 Apr 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/kospi/index.xml" rel="self" type="application/rss+xml"/><item><title>trading-agent 개발 로그 #13 — Research 라이브 검색, 에이전트 라이프사이클 이벤트</title><link>https://ice-ice-bear.github.io/ko/posts/2026-04-16-trading-agent-dev13/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-04-16-trading-agent-dev13/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post trading-agent 개발 로그 #13 — Research 라이브 검색, 에이전트 라이프사이클 이벤트" /&gt;&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;Research 페이지의 종목 검색 UX를 대폭 개선하고, 에이전트 실행 상태를 실시간으로 추적할 수 있는 라이프사이클 이벤트 시스템을 도입했다. DART API의 EPS 필드 매핑도 확장하여 더 많은 업종의 재무 데이터를 정상적으로 가져올 수 있게 되었다. 3개 세션, 총 8시간 작업.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://ice-ice-bear.github.io/posts/2026-04-15-trading-agent-dev12/" &gt;이전 글: trading-agent 개발 로그 #12&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="주요-변경-사항"&gt;주요 변경 사항
&lt;/h2&gt;&lt;h3 id="research-라이브-검색-및-종목-상세-강화"&gt;Research 라이브 검색 및 종목 상세 강화
&lt;/h3&gt;&lt;p&gt;Research 페이지에서 KOSPI200 종목을 실시간으로 검색할 수 있는 드롭다운을 추가했다. 백엔드에서는 로컬 KOSPI200 목록에 대해 substring 매칭을 먼저 시도하고, 결과가 없을 때만 MCP 폴백으로 넘어가도록 구현했다. 로컬 검색이 먼저 동작하기 때문에 응답 속도가 빠르고, MCP 호출 비용도 절약된다.&lt;/p&gt;
&lt;p&gt;종목 상세 화면과 차트도 함께 개선했다. 더 풍부한 정보를 보여주도록 stock detail 컴포넌트를 리팩터링하고, price chart의 표현력도 높였다.&lt;/p&gt;
&lt;h3 id="websocket-이벤트-히스토리-하이드레이션"&gt;WebSocket 이벤트 히스토리 하이드레이션
&lt;/h3&gt;&lt;p&gt;기존에는 WebSocket 연결 시점 이후의 이벤트만 수신할 수 있었다. 페이지를 새로고침하거나 늦게 접속하면 이미 발생한 에이전트 이벤트를 놓치는 문제가 있었다. 이번에 마운트 시점에 기존 이벤트 히스토리를 먼저 가져온 뒤 구독을 시작하도록 수정했다. 이제 페이지 진입 시점과 관계없이 전체 에이전트 실행 이력을 확인할 수 있다.&lt;/p&gt;
&lt;h3 id="에이전트-라이프사이클-이벤트"&gt;에이전트 라이프사이클 이벤트
&lt;/h3&gt;&lt;p&gt;에이전트 베이스 클래스에 &lt;code&gt;agent.started&lt;/code&gt;, &lt;code&gt;agent.completed&lt;/code&gt;, &lt;code&gt;agent.failed&lt;/code&gt; 세 가지 라이프사이클 이벤트를 추가했다. 에이전트가 실행을 시작하고, 완료되거나, 실패할 때 자동으로 이벤트가 발행된다. 프론트엔드의 WebSocket 하이드레이션과 결합하면 에이전트 상태를 실시간으로 표시할 수 있다.&lt;/p&gt;
&lt;h3 id="reports-뷰-수정"&gt;Reports 뷰 수정
&lt;/h3&gt;&lt;p&gt;리포트 목록에서 항목을 선택할 때, 목록 페이로드에 포함된 축약 데이터 대신 전체 리포트를 별도로 fetch하도록 수정했다. 목록 API가 반환하는 데이터에는 본문이 잘려 있어서 상세 보기에서 내용이 누락되는 문제가 있었다.&lt;/p&gt;
&lt;h3 id="dart-eps-필드-확장"&gt;DART EPS 필드 확장
&lt;/h3&gt;&lt;p&gt;DART API에서 EPS 데이터를 가져올 때 사용하는 필드명 후보를 확장했다. 업종마다 재무제표에서 EPS를 표기하는 항목명이 다른데, 기존에는 일부 업종에서 EPS를 찾지 못하는 문제가 있었다. 후보 필드명을 추가하여 더 넓은 범위의 업종을 커버한다.&lt;/p&gt;
&lt;h3 id="기타"&gt;기타
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;로고 및 Android Chrome 파비콘 추가로 브랜딩 정비&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claudeignore&lt;/code&gt;, &lt;code&gt;.gitignore&lt;/code&gt; 정리 — 로컬 도구 상태, 스크린샷, 목업 파일 제외&lt;/li&gt;
&lt;li&gt;HarnessKit 기능 목록 및 superpowers 계획 문서 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="커밋-로그"&gt;커밋 로그
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;docs&lt;/td&gt;
 &lt;td&gt;HarnessKit 기능 목록, superpowers 계획/스펙, 진행 로그 추가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;chore&lt;/td&gt;
 &lt;td&gt;로고 및 android-chrome 파비콘 추가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;chore&lt;/td&gt;
 &lt;td&gt;로컬 도구 상태, 스크린샷, 목업 파일 gitignore 처리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat&lt;/td&gt;
 &lt;td&gt;WebSocket 마운트 시 에이전트 이벤트 히스토리 하이드레이션&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fix&lt;/td&gt;
 &lt;td&gt;리포트 선택 시 목록 페이로드 대신 전체 리포트 fetch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat&lt;/td&gt;
 &lt;td&gt;Research 라이브 검색 드롭다운, 종목 상세/차트 강화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat&lt;/td&gt;
 &lt;td&gt;로컬 KOSPI200 substring 검색 + MCP 폴백&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fix&lt;/td&gt;
 &lt;td&gt;DART EPS 필드명 후보 확장으로 업종 커버리지 확대&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;feat&lt;/td&gt;
 &lt;td&gt;에이전트 started/completed/failed 라이프사이클 이벤트&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;로컬 우선 검색 패턴&lt;/strong&gt;: 외부 API 호출 전에 로컬 데이터셋을 먼저 탐색하는 패턴은 응답 속도와 비용 모두에서 효과적이다. KOSPI200처럼 비교적 고정된 목록은 로컬 캐시로 충분하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이벤트 하이드레이션&lt;/strong&gt;: 실시간 시스템에서 &amp;ldquo;연결 이전 이벤트&amp;quot;를 복원하는 것은 UX에 큰 차이를 만든다. 히스토리 fetch 후 구독을 시작하는 순서를 지키면 이벤트 중복이나 누락 없이 깔끔하게 처리할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라이프사이클 이벤트 표준화&lt;/strong&gt;: 에이전트 베이스 클래스에서 시작/완료/실패를 일관되게 발행하면, 모니터링 UI나 로깅을 별도 구현 없이 자동으로 얻을 수 있다. 개별 에이전트가 상태 관리 코드를 중복 작성할 필요가 없어진다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재무 데이터 필드명 다양성&lt;/strong&gt;: 한국 DART 공시에서 같은 지표(EPS)라도 업종별로 항목명이 다르다. 단일 필드명에 의존하면 특정 업종이 누락되므로 후보 리스트 방식이 현실적이다.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>