<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Frontend on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/frontend/</link><description>Recent content in Frontend on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Fri, 10 Apr 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/frontend/index.xml" rel="self" type="application/rss+xml"/><item><title>Trading Agent 개발기 #10 — UI 전면 재설계: Tailwind v4 + shadcn/ui</title><link>https://ice-ice-bear.github.io/ko/posts/2026-04-10-trading-agent-dev10/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-04-10-trading-agent-dev10/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post Trading Agent 개발기 #10 — UI 전면 재설계: Tailwind v4 + shadcn/ui" /&gt;&lt;p&gt;기존 Trading Agent UI의 구조적 문제를 분석하고, Tailwind CSS v4 + shadcn/ui 기반으로 5개 페이지와 Agent Activity 패널을 새로 설계/구현한 과정을 정리한다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://ice-ice-bear.github.io/ko/posts/2026-04-08-trading-agent-dev9/" &gt;이전 글: Trading Agent 개발기 #9&lt;/a&gt; — ATR 동적 손절매와 투자 기간 관리&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="문제-핵심이-뒷전에-있는-ui"&gt;문제: 핵심이 뒷전에 있는 UI
&lt;/h2&gt;&lt;p&gt;Trading Agent의 핵심 사용 사례는 &lt;strong&gt;에이전트 활동 모니터링&lt;/strong&gt;이다. 실시간으로 어떤 에이전트가 무엇을 판단하고, 어떤 시그널을 생성했으며, 최종 결정이 어떻게 내려졌는지를 추적하는 것이 이 도구의 존재 이유다.&lt;/p&gt;
&lt;p&gt;그런데 기존 UI 구조에서는 이 핵심 기능이 &lt;strong&gt;2차 탭에 묻혀 있었다&lt;/strong&gt;. 반면 채팅 인터페이스가 화면의 상당 부분을 상시 차지하고 있었다. 체감상 사용 시간의 80%를 차지하는 기능이 한 번 클릭을 더 해야 보이는 구조 — 이건 단순 개선이 아니라 전면 재설계가 필요한 문제였다.&lt;/p&gt;
&lt;h2 id="설계-디자인-퍼스트-세션"&gt;설계: 디자인 퍼스트 세션
&lt;/h2&gt;&lt;p&gt;코드를 바로 작성하는 대신, 별도 세션(세션 3)을 디자인 전용으로 할당했다. HTML 목업으로 레이아웃을 잡고, 스펙 문서를 작성한 뒤, 12개 태스크로 구현 계획을 세웠다.&lt;/p&gt;
&lt;p&gt;새 레이아웃의 핵심 원칙:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Agent Activity는 항상 보인다&lt;/strong&gt; — 우측 고정 패널로 어떤 페이지에서든 실시간 상태 확인 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;헤더 탭으로 페이지 전환&lt;/strong&gt; — Dashboard / Signals / Research / Reports / Settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;채팅은 필요할 때만&lt;/strong&gt; — 상시 노출에서 온디맨드로 전환&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 subgraph Header["헤더 탭 네비게이션"]
 D["Dashboard"]
 S["Signals"]
 R["Research"]
 RP["Reports"]
 ST["Settings"]
 end

 subgraph Main["메인 레이아웃"]
 direction LR
 subgraph Left["좌측: 페이지 콘텐츠"]
 D --&gt; DV["Hero Card &amp;lt;br/&amp;gt; Positions &amp;lt;br/&amp;gt; Performance &amp;lt;br/&amp;gt; Recent Orders"]
 S --&gt; SV["Signal Cards &amp;lt;br/&amp;gt; Scenarios &amp;lt;br/&amp;gt; Expert Panel &amp;lt;br/&amp;gt; Filters"]
 R --&gt; RV["Watchlist Sidebar &amp;lt;br/&amp;gt; Price Chart &amp;lt;br/&amp;gt; Fundamentals &amp;lt;br/&amp;gt; Signal History"]
 RP --&gt; RPV["Report List &amp;lt;br/&amp;gt; Markdown Reader"]
 end
 subgraph Right["우측: 고정 패널"]
 AP["Agent Activity &amp;lt;br/&amp;gt; Panel"]
 AP --&gt; TL["Timeline Feed"]
 AP --&gt; AS["Agent Status"]
 AP --&gt; DL["Decision Log"]
 end
 end&lt;/pre&gt;&lt;h2 id="구현-바닥부터-다시-쌓기"&gt;구현: 바닥부터 다시 쌓기
&lt;/h2&gt;&lt;h3 id="1단계-기반-구축--tailwind-css-v4--shadcnui"&gt;1단계: 기반 구축 — Tailwind CSS v4 + shadcn/ui
&lt;/h3&gt;&lt;p&gt;기존 스타일링을 완전히 걷어내고, &lt;strong&gt;Tailwind CSS v4&lt;/strong&gt;와 &lt;strong&gt;shadcn/ui&lt;/strong&gt;를 도입했다.&lt;/p&gt;
&lt;p&gt;shadcn/ui를 선택한 이유는 명확하다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;복사해서 쓰는 구조라 커스터마이징이 자유롭다&lt;/li&gt;
&lt;li&gt;Radix UI 기반이라 접근성이 보장된다&lt;/li&gt;
&lt;li&gt;Tailwind와 궁합이 완벽하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 단계에서 Button, Badge, Card, Command, Dialog, Table 등 &lt;strong&gt;17개 UI 컴포넌트&lt;/strong&gt;를 한꺼번에 세팅했다. 약 4,900줄이 추가됐지만, 대부분 shadcn/ui 컴포넌트 코드다.&lt;/p&gt;
&lt;h3 id="2단계-레이아웃-셸"&gt;2단계: 레이아웃 셸
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;app.tsx&lt;/code&gt;를 완전히 다시 작성했다. 기존 190줄을 걷어내고 새 구조로 277줄을 작성.&lt;/p&gt;
&lt;p&gt;핵심 컴포넌트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;header.tsx&lt;/code&gt;&lt;/strong&gt; — 5개 탭 네비게이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;main-layout.tsx&lt;/code&gt;&lt;/strong&gt; — 좌측 콘텐츠 + 우측 Agent Activity 패널의 분할 레이아웃&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3단계-agent-activity-패널"&gt;3단계: Agent Activity 패널
&lt;/h3&gt;&lt;p&gt;가장 중요한 컴포넌트. 3개 서브 뷰로 구성:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;서브 뷰&lt;/th&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;&lt;strong&gt;Timeline&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;실시간 이벤트 흐름&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;timeline-feed.tsx&lt;/code&gt;, &lt;code&gt;flow-event.tsx&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Agent Status&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;각 에이전트의 현재 상태&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;activity-panel.tsx&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Decision Log&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;결정 체인 추적&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decision-chain.tsx&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이 패널은 모든 페이지에서 우측에 고정되므로, 어떤 작업을 하든 에이전트 상태를 바로 확인할 수 있다.&lt;/p&gt;
&lt;h3 id="4단계-5개-메인-페이지"&gt;4단계: 5개 메인 페이지
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Dashboard&lt;/strong&gt; — 가장 무거운 페이지(631줄 추가). Hero Card로 포트폴리오 요약, Positions Table로 현재 보유 종목, Performance Chart로 수익률 추이, Recent Orders로 최근 주문 내역을 한눈에 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt; — 시그널 카드, 시나리오 행, 전문가 패널, 필터로 구성. 각 시그널이 어떤 시나리오에서 발생했고, 전문가 에이전트들이 어떤 입장인지를 시각적으로 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Research&lt;/strong&gt; — 좌측에 Watchlist Sidebar, 메인 영역에 Price Chart와 Fundamentals Card, 하단에 Signal History. 종목 하나를 깊이 파볼 때 쓰는 페이지.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reports&lt;/strong&gt; — 좌측에 리포트 목록, 우측에 Markdown Reader. 에이전트가 생성한 분석 리포트를 읽는 뷰.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Settings&lt;/strong&gt; — 아직 플레이스홀더 상태.&lt;/p&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;th&gt;변경량&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Tailwind CSS v4 + shadcn/ui 기반 초기화&lt;/td&gt;
 &lt;td&gt;+793/-73&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;shadcn/ui 컴포넌트 17개 추가&lt;/td&gt;
 &lt;td&gt;+4,896/-50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;레이아웃 셸 (헤더 탭, 분할 패널)&lt;/td&gt;
 &lt;td&gt;+277/-190&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Agent Activity 패널&lt;/td&gt;
 &lt;td&gt;+358/-3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5&lt;/td&gt;
 &lt;td&gt;Dashboard 페이지&lt;/td&gt;
 &lt;td&gt;+631/-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;6&lt;/td&gt;
 &lt;td&gt;Signals 페이지&lt;/td&gt;
 &lt;td&gt;+194/-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;7&lt;/td&gt;
 &lt;td&gt;Research 페이지&lt;/td&gt;
 &lt;td&gt;+289/-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;Reports 페이지&lt;/td&gt;
 &lt;td&gt;+115/-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;총 56개 파일, &lt;strong&gt;+7,747 / -514줄&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="회고"&gt;회고
&lt;/h2&gt;&lt;h3 id="잘한-것"&gt;잘한 것
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;디자인 퍼스트&lt;/strong&gt;: 코드부터 작성하지 않고 HTML 목업 + 스펙 문서 + 12-태스크 계획을 먼저 세운 것. 구현 단계에서 방향을 잃지 않았다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;바닥부터 다시 쌓기&lt;/strong&gt;: 기존 코드에 패치를 덧대는 대신 완전히 새로 작성한 것. 구조적 문제는 구조적으로 해결해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;핵심 기능의 항상-노출&lt;/strong&gt;: Agent Activity 패널을 고정 사이드바로 배치한 것. 이제 탭 전환 없이 에이전트 상태를 항상 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="다음-할-것"&gt;다음 할 것
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Settings 페이지 구현&lt;/li&gt;
&lt;li&gt;실시간 WebSocket 연동 (현재는 목업 데이터)&lt;/li&gt;
&lt;li&gt;반응형 레이아웃 (모바일에서 Agent Activity 패널 처리)&lt;/li&gt;
&lt;li&gt;다크 모드 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Trading Agent 시리즈의 다음 글에서 계속.&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>