<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>k777agent 님의 블로그</title>
    <link>https://k777agent.tistory.com/</link>
    <description>k777agent 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 00:19:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>k777agent</managingEditor>
    <image>
      <title>k777agent 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/7454660/attach/175535f7c44d46c6ae31a8c32c0e62c2</url>
      <link>https://k777agent.tistory.com</link>
    </image>
    <item>
      <title>[빅데이터] 빅데이터 강의요약(2)</title>
      <link>https://k777agent.tistory.com/entry/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%95%EC%9D%98%EC%9A%94%EC%95%BD2</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;빈발 패턴 분석이란 무엇일까요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 쉽게 설명하자면, &quot;무엇이 자주 함께 나타나는가?&quot;를 찾아내는 것입니다. 예를 들어, 마트에서 고객들이 어떤 상품들을 자주 함께 구매하는지 분석하는 것이 대표적인 빈발 패턴 분석의 응용 사례입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 데이터 집합에서 &lt;b&gt;자주 나타나는 패턴&lt;/b&gt;을 &lt;b&gt;빈발 패턴&lt;/b&gt;이라고 부릅니다. 이 빈발 패턴은 데이터 간의 흥미로운 &lt;b&gt;연관성&lt;/b&gt;과 &lt;b&gt;상관관계&lt;/b&gt;를 파악하는 데 핵심적인 역할을 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어디에 활용될까요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈발 패턴 분석은 실생활의 다양한 분야에서 활용됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장바구니 분석(Market Basket Analysis):&lt;/b&gt; 마트에서 &quot;이 상품을 산 사람은 저 상품도 산다!&quot;는 규칙을 발견하여 상품 진열, 프로모션 전략 수립에 활용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교차 마케팅(Cross-Marketing):&lt;/b&gt; 특정 제품을 구매한 고객에게 연관성이 높은 다른 제품을 추천하여 판매를 증대시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;카탈로그 디자인:&lt;/b&gt; 함께 구매되는 상품들을 묶어 카탈로그를 구성하여 고객의 구매 편의성을 높입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 로그 분석:&lt;/b&gt; 웹사이트에서 사용자들이 어떤 페이지를 연달아 방문하는지 분석하여 웹사이트 구조 개선이나 콘텐츠 추천에 활용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DNA 서열 분석:&lt;/b&gt; 유전자 서열에서 특정 패턴을 찾아 질병과의 연관성을 연구하는 등 생명 공학 분야에서도 중요한 역할을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 개념 파헤치기: 연관 규칙, 지지도, 신뢰도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈발 패턴 분석의 꽃은 바로 &lt;b&gt;연관 규칙(Association Rule)&lt;/b&gt;입니다. 연관 규칙은 함께 자주 구매되는 품목들의 패턴을 명확하게 표현하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;컴퓨터를 구매한 고객은 안티바이러스 소프트웨어도 함께 구매하는 경향이 있다&quot;는 정보는 다음과 같은 규칙으로 나타낼 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1753303681763&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;computer &amp;rArr; antivirus_software [support = 2%, confidence = 60%]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 computer는 &lt;b&gt;전제(antecedent)&lt;/b&gt;, antivirus_software는 &lt;b&gt;결과(consequent)&lt;/b&gt;를 의미합니다. 그리고 이 규칙이 얼마나 '흥미로운지'를 판단하는 중요한 지표가 바로 &lt;b&gt;지지도(Support)&lt;/b&gt;와 &lt;b&gt;신뢰도(Confidence)&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지지도 (Support)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지지도&lt;/b&gt;는 &lt;b&gt;전체 거래 중 특정 아이템 집합(A와 B 모두)을 포함하는 거래의 비율&lt;/b&gt;을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;pp&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&amp;cup;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시에서 지지도가 2%라는 것은 &lt;b&gt;전체 거래의 2%에서 컴퓨터와 안티바이러스 소프트웨어가 함께 구매되었음&lt;/b&gt;을 의미합니다. 지지도가 높을수록 해당 패턴이 데이터에서 자주 나타난다는 뜻입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;신뢰도 (Confidence)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;신뢰도&lt;/b&gt;는 &lt;b&gt;아이템 A를 포함하는 거래 중에서 아이템 B도 함께 포함할 조건부 확률&lt;/b&gt;입니다. 즉, A를 구매했을 때 B도 함께 구매할 확률을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;co&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;ce&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;pp&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;co&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;pp&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;co&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&amp;cup;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시에서 신뢰도가 60%라는 것은 &lt;b&gt;컴퓨터를 구매한 고객 중 60%가 안티바이러스 소프트웨어도 구매했음&lt;/b&gt;을 의미합니다. 신뢰도가 높을수록 전제가 발생했을 때 결과가 발생할 가능성이 높다는 것을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관 규칙은 사용자가 설정한 &lt;b&gt;최소 지지도(min_sup)&lt;/b&gt;와 &lt;b&gt;최소 신뢰도(min_conf)&lt;/b&gt; 기준을 만족할 때 비로소 '흥미로운' 규칙으로 간주됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;빈발 아이템 집합과 마이닝 프로세스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빈발 아이템 집합 (Frequent Itemset)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 이상의 아이템으로 구성된 집합을 &lt;b&gt;아이템 집합(Itemset)&lt;/b&gt;이라고 부릅니다. 이 아이템 집합의 &lt;b&gt;지지도가 최소 지지도(min_sup) 문턱값 이상일 때&lt;/b&gt;를 &lt;b&gt;빈발 아이템 집합&lt;/b&gt;이라고 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연관 규칙 마이닝 프로세스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관 규칙을 발견하는 과정은 크게 두 단계로 이루어집니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 빈발 아이템 집합 찾기:&lt;/b&gt; 설정한 최소 지지도를 만족하는 모든 아이템 집합을 찾아냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;강력한 연관 규칙 생성:&lt;/b&gt; 찾아낸 빈발 아이템 집합으로부터 최소 신뢰도 기준을 만족하는 '강력한' 연관 규칙을 생성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마이닝의 과제와 해결책&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈발 패턴 분석은 매우 강력하지만, 한 가지 중요한 과제가 있습니다. 바로 &lt;b&gt;'너무 많은' 빈발 아이템 집합이 생성될 수 있다&lt;/b&gt;는 점입니다. 만약 최소 지지도를 낮게 설정하면, 상상할 수 없을 정도로 많은 수의 빈발 아이템 집합이 생성되어 분석이 불가능해질 수 있습니다. 예를 들어, 길이가 100인 빈발 아이템 집합은 무려 약 1.27 * 10^{30}개의 부분집합을 가질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 극복하기 위해 &lt;b&gt;닫힌 빈발 아이템 집합(Closed Frequent Itemset)&lt;/b&gt;과 &lt;b&gt;최대 빈발 아이템 집합(Maximal Frequent Itemset)&lt;/b&gt; 개념을 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;닫힌 아이템 집합 (Closed Itemset):&lt;/b&gt; 자신과 동일한 지지도를 갖는 상위 아이템 집합(super-itemset)이 존재하지 않는 아이템 집합입니다. 불필요한 중복을 줄여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최대 아이템 집합 (Max-Itemset):&lt;/b&gt; 자신을 포함하는 더 큰 빈발 상위 아이템 집합이 존재하지 않는 빈발 아이템 집합입니다. 가장 대표적인 빈발 패턴만 남겨두어 분석의 효율성을 높입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하향 폐쇄 속성 (Downward Closure Property)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈발 아이템 집합에는 매우 중요한 속성이 있습니다. 바로 &lt;b&gt;하향 폐쇄 속성(Downward Closure Property)&lt;/b&gt;입니다. 이 속성은 &quot;빈발 아이템 집합의 모든 부분집합은 반드시 빈발하다&quot;는 원칙을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, {맥주, 기저귀, 견과류}가 빈발한 아이템 집합이라면, 이 집합의 부분집합인 {맥주, 기저귀} 또한 반드시 빈발해야 합니다. 이 속성은 비효율적인 후보 아이템 집합을 미리 제거하여 탐색 과정을 &lt;b&gt;최적화&lt;/b&gt;하는 데 핵심적으로 사용됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;확률 이론과의 연결고리: 지지도와 신뢰도의 이해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관 규칙의 지지도와 신뢰도는 근본적으로 &lt;b&gt;확률 개념&lt;/b&gt;에 기반합니다. 특히, &lt;b&gt;조건부 확률(Conditional Probability)&lt;/b&gt;은 신뢰도를 이해하는 데 필수적입니다. 조건부 확률은 어떤 증거(사건)가 주어졌을 때 특정 사건의 확률을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;b&gt;베이즈 정리(Bayes' Rule)&lt;/b&gt;는 새로운 증거를 기반으로 기존 확률을 업데이트하는 데 사용되는 핵심적인 정리입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;베이즈 정리 공식&lt;/h3&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;b&gt;사후 확률(Posterior)&lt;/b&gt;, B가 발생했을 때 A가 발생할 확률&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;b&gt;우도(Likelihood)&lt;/b&gt;, A가 발생했을 때 B가 발생할 확률&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;b&gt;사전 확률(Prior)&lt;/b&gt;, B가 발생하기 전 A가 발생할 확률&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;b&gt;정규화 팩터(Normalization factor)&lt;/b&gt;, B가 발생할 전체 확률&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베이즈 정리는 질병 진단과 같이 불확실성을 다루는 의사결정에서 매우 중요하게 활용됩니다. 예를 들어, 특정 검사가 95% 정확하다고 해도, 질병의 희귀도(사전 확률)에 따라 검사 결과가 양성이어도 실제 병에 걸렸을 확률은 예상보다 훨씬 낮을 수 있습니다. 이는 우리가 통계와 확률을 이해하는 데 있어 직관이 항상 옳지 않을 수 있음을 보여줍니다.&lt;/p&gt;</description>
      <category>대학</category>
      <category>베이즈 정리</category>
      <category>빈발 아이템 집합</category>
      <category>빈발 패턴 분석</category>
      <category>연관 규칙</category>
      <category>조건부 확률</category>
      <category>하향 폐쇄 속성</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/27</guid>
      <comments>https://k777agent.tistory.com/entry/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%95%EC%9D%98%EC%9A%94%EC%95%BD2#entry27comment</comments>
      <pubDate>Thu, 24 Jul 2025 05:52:28 +0900</pubDate>
    </item>
    <item>
      <title>[빅데이터] 빅데이터 강의 요약(1)</title>
      <link>https://k777agent.tistory.com/entry/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%95%EC%9D%98-%EC%9A%94%EC%95%BD1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 우리 삶 곳곳에 존재하며, 웹사이트부터 전자상거래, 금융 거래, 소셜 네트워크까지 우리가 상호작용하는 모든 곳에서 끊임없이 수집됩니다. 이러한 &lt;b&gt;데이터는 단순히 숫자의 나열이 아니라, 그 안에 가치와 지식을 담고 있기에 &quot;데이터는 힘이다(Data is Power)&quot;라고 불릴 만큼 중요합니다.&lt;/b&gt; 구글, NSA, 바이두, 페이스북과 같은 거대 기업들은 이미 페타바이트(PB)에서 엑사바이트(EB)에 이르는 방대한 데이터를 저장하고 매일 엄청난 양의 데이터를 처리하고 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;빅데이터, 과연 무엇일까요?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xtKOs/btsPmpjnNaw/zJpTd6bz25RRKkAo3qdw3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xtKOs/btsPmpjnNaw/zJpTd6bz25RRKkAo3qdw3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xtKOs/btsPmpjnNaw/zJpTd6bz25RRKkAo3qdw3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxtKOs%2FbtsPmpjnNaw%2FzJpTd6bz25RRKkAo3qdw3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;410&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;빅데이터&lt;/b&gt;는 기존의 데이터 처리 방식으로는 다루기 어려운, 너무나 크고 복잡한 데이터 집합을 의미합니다. 이러한 빅데이터는 주로 &lt;b&gt;3V + 1ML&lt;/b&gt;이라는 특징으로 설명됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Volume (양):&lt;/b&gt; 데이터의 규모가 페타바이트(PB) 또는 엑사바이트(EB) 단위에 이릅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Velocity (속도):&lt;/b&gt; 데이터가 매일 테라바이트(TB) 또는 페타바이트(PB) 단위로 빠르게 생성되고 처리됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Variety (다양성):&lt;/b&gt; 정형화된 데이터뿐만 아니라 비정형, 반정형 등 다양한 형태의 데이터를 포함합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;+ Machine Learning (기계 학습):&lt;/b&gt; 이러한 방대한 데이터를 효과적으로 다루고 분석하기 위해 기계 학습 기술이 필수적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 마이닝: 데이터 속 숨겨진 보물 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이렇게 방대한 데이터 속에서 유의미한 가치를 어떻게 찾아낼 수 있을까요? 바로 &lt;b&gt;데이터 마이닝&lt;/b&gt;을 통해서입니다. 데이터 마이닝은 대규모 데이터에서 유용한 지식과 패턴을 추출하는 과정을 말합니다. 이를 위해 데이터는 저장(Stored)되고, 관리(Managed)되며, 분석(Analyzed)되어야 합니다. 이 과정에서 특히 '분석'에 초점을 맞추게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 마이닝은 빅데이터, 예측 분석(Predictive Analytics), 데이터 과학(Data Science)과 유사한 개념으로 사용되곤 합니다. 궁극적인 목표는 데이터로부터 &lt;b&gt;유효하고(Valid), 유용하며(Useful), 예상치 못했고(Unexpected), 이해 가능한(Understandable)&lt;/b&gt; 패턴 및 모델을 발견하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 마이닝의 주요 작업은 크게 두 가지로 나뉩니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기술적 방법(Descriptive methods):&lt;/b&gt; 데이터의 특징을 설명하는 패턴을 발견합니다 (예: 클러스터링을 통한 고객 그룹 분류).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예측적 방법(Predictive methods):&lt;/b&gt; 미래 값을 예측합니다 (예: 넷플릭스나 왓챠와 같은 추천 시스템).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;빅데이터 분석: 실제 세상에 적용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;빅데이터 분석&lt;/b&gt;은 데이터를 &lt;b&gt;수집 &amp;rarr; 분석 &amp;rarr; 인덱싱 &amp;rarr; 결과 도출&lt;/b&gt;의 과정을 거쳐 실제 문제 해결에 적용하는 것을 의미합니다. 소셜 미디어 분석, 감성 분석(예: 아이폰에 대한 소비자 평가 분석) 등 다양한 응용 분야에서 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빅데이터 분석은 단순히 하나의 독립적인 분야가 아니라, 데이터베이스, 머신러닝/딥러닝, 통계학, 인공지능(AI), 컴퓨터 과학 이론 등 다양한 학문 분야와 밀접하게 연관되어 있습니다. 특히, 대규모 데이터 분석에서는 &lt;b&gt;확장성(Scalability), 효율적인 알고리즘, 최적의 컴퓨팅 아키텍처, 그리고 대규모 데이터 처리 자동화&lt;/b&gt;가 매우 중요하게 강조됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로, 빅데이터는 단순히 큰 데이터 덩어리가 아니라, 그 속에 숨겨진 가치를 찾아내고 활용하여 새로운 통찰력을 얻을 수 있는 강력한 도구입니다. 데이터의 중요성을 이해하고, 데이터 마이닝을 통해 유의미한 패턴을 발견하며, 빅데이터 분석을 통해 실제 문제에 적용하는 것이 미래 경쟁력의 핵심이 될 것입니다.&lt;/p&gt;</description>
      <category>대학</category>
      <category>데이터 마이닝</category>
      <category>빅데이터</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/26</guid>
      <comments>https://k777agent.tistory.com/entry/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%95%EC%9D%98-%EC%9A%94%EC%95%BD1#entry26comment</comments>
      <pubDate>Thu, 17 Jul 2025 16:58:45 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] 캡스톤 프로젝트 회고: 끈기와 성장을 통해 이뤄낸 가상 피팅 서비스 개발 여정</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-%EC%BA%A1%EC%8A%A4%ED%86%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0-%EB%81%88%EA%B8%B0%EC%99%80-%EC%84%B1%EC%9E%A5%EC%9D%84-%ED%86%B5%ED%95%B4-%EC%9D%B4%EB%A4%84%EB%82%B8-%EA%B0%80%EC%83%81-%ED%94%BC%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-%EC%97%AC%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 2025년 6월 11일, 약 3개월간의 대장정이었던 4학년 졸업 작품, 캡스톤 프로젝트를 성공적으로 마무리했습니다. 졸업논문과도 이어지는 프로젝트였던 만큼 정말 많은 노력을 쏟아부었는데요. 이번 포스팅에서는 그동안의 여정을 되돌아보며 느꼈던 점들을 솔직하게 공유해 보려고 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;팀장으로서의 고민, 그리고 새로운 도전&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이번 프로젝트에서 팀장을 맡았습니다. 팀을 이끌어야 하는 자리였기에, 개인적으로 가장 하고 싶었던 프런트엔드 개발을 우선시할 수 없었던 점이 처음에는 아쉽게 느껴졌습니다. 하지만 팀원들의 역량이 최대한 빛을 발하도록 돕는 것이 팀장으로서의 중요한 역할이라고 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 저는 &lt;b&gt;프런트엔드와 팀원들이 구현한 기능들을 백엔드에서 원활하게 처리하고 프런트엔드에서 작동될 수 있도록 연동하는 작업&lt;/b&gt;을 담당했습니다. 또한, 서비스의 핵심 기능인 &lt;b&gt;가상 이미지 합성 프로그램 구현&lt;/b&gt;에도 집중했습니다. 비록 제가 선호하는 분야는 아니었지만, 팀 전체의 목표 달성을 위해 새로운 도전을 하는 과정에서 많은 것을 배우고 성장할 수 있었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;모르는 건 잘못이 아니다&quot; 함께 배우고 성장한 우리 팀&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 프로젝트의 주제는 &quot;가상 피팅 서비스를 위한 대규모 언어 모델(LLM) 개발&quot;이었습니다. 사실 처음 LLM이라는 주제를 받았을 때 어떻게 접근해야 할지 막막했던 것도 사실입니다. 하지만 저희는 LLM이 가진 &lt;b&gt;프롬프트 입력-응답 형태에 모델 이미지와 상품 이미지를 합성하여 가상 피팅 서비스를 제공하는 것&lt;/b&gt;을 최종 목표로 설정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 목표를 이루기 위해 저희 팀은 시작부터 한 가지 중요한 약속을 했습니다. 바로 &quot;&lt;b&gt;모르는 건 잘못이 아니다. 우리 모두 배워가는 과정이다.&lt;/b&gt;&quot;라는 마음가짐으로 프로젝트에 임하자는 것이었습니다. 모르는 기능이나 어려운 부분이 생기면 카카오톡이나 디스코드를 통해 적극적으로 소통하고, 그래도 해결되지 않을 때는 인터넷 자료를 찾아가며 학습했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 역시 백엔드와 AI 이미지 합성 부분에 대한 지식이 부족했기에, AI 팀원과 끊임없이 소통하며 처리 시간 등을 고려한 최적의 AI 이미지 합성 프로그램을 비교하고 적용했습니다. 특히 중국어 자료밖에 없던 AI 이미지 합성 관련 기술을 번역해가며 학습했던 경험은 정말 뇌리에 깊이 박혔습니다. 그만큼 더 깊이 이해하고 제 것으로 만들 수 있었던 것 같습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;끊이지 않던 난관, 포기하지 않는 끈기로 극복하다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 진행 중 가장 큰 난관에 부딪혔던 것은 바로 &lt;b&gt;AI 이미지 합성을 담당하던 학교 서버 문제&lt;/b&gt;였습니다. 갑작스러운 서버 다운으로 인해 개발해둔 자동화 프로그램이 제대로 작동하는지 확인할 수 없었습니다. 원래 Comfy UI는 GUI 창에서 직접 이미지를 넣고 결과를 확인하는 방식인데, 저희는 최종 결과값만 필요한 형태로 자동화했기에 더욱 답답했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 큰 문제는 이후에도 서버가 수시로 문제를 일으켰고, 결국 초기화 외에는 답이 없다는 말을 듣게 되면서 눈물을 머금고 초기화를 진행해야 했습니다. 겨우 파일을 다시 넣고 필수 프로그램을 설치했더니 이번에는 서버에 GPU가 없다는 충격적인 소식을 접하게 되었습니다. 결국 &lt;b&gt;서버 초기화를 무려 5번이나 반복&lt;/b&gt;해야 했고, 그만큼 시간 지체도 불가피했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 저희 팀은 포기하지 않았습니다. 모두가 힘을 합쳐 문제를 해결하기 위해 노력했고, 마침내 발표 당일 &lt;b&gt;실시간으로 시연되는 가상 피팅 서비스&lt;/b&gt;를 보며 그동안의 고생이 눈 녹듯 사라지는 뿌듯함을 느낄 수 있었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;노력의 결실, 그리고 새로운 꿈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수많은 사건 사고에도 불구하고, 저희 팀은 &lt;b&gt;모델 이미지를 넣으면 바디 형태와 피부 톤을 알려주고, 신체 정보를 입력 후 프롬프트로 질문하면 그에 맞는 피팅 보고서를 제공하며, 추천 상품 이미지와 모델 이미지를 AI로 합성하여 가상 피팅 서비스를 구현&lt;/b&gt;하는 데 성공했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 캡스톤 프로젝트를 통해 저는 어떤 어려움이 닥쳐도 &lt;b&gt;끝까지 해낼 수 있다는 끈기&lt;/b&gt;를 얻었습니다. 또한, 단순히 GPT나 Gemini 같은 대화형 AI만을 생각했던 AI 분야에 대해 더 깊이 이해하게 되면서 &lt;b&gt;AI를 활용하는 프런트엔드 개발자&lt;/b&gt;가 되고 싶다는 새로운 꿈을 꾸게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 경험은 저 혼자서는 불가능했을 겁니다. 함께 머리를 맞대고 고민하며 열정적으로 임해준 팀원들 덕분에 값진 결과물을 얻을 수 있었습니다. 이 자리를 빌려 다시 한번 팀원들에게 감사하다는 말을 전하고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡스톤 프로젝트는 단순한 졸업 작품을 넘어, 저에게 큰 성장과 새로운 방향을 제시해 준 소중한 경험으로 기억될 것입니다.&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>가상피팅</category>
      <category>캡스톤</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/25</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-%EC%BA%A1%EC%8A%A4%ED%86%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0-%EB%81%88%EA%B8%B0%EC%99%80-%EC%84%B1%EC%9E%A5%EC%9D%84-%ED%86%B5%ED%95%B4-%EC%9D%B4%EB%A4%84%EB%82%B8-%EA%B0%80%EC%83%81-%ED%94%BC%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-%EC%97%AC%EC%A0%95#entry25comment</comments>
      <pubDate>Thu, 3 Jul 2025 18:32:57 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] 가상피팅 서비스 프런트엔드, 백엔드 배포하기</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-%EA%B0%80%EC%83%81%ED%94%BC%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%94%84%EB%9F%B0%ED%8A%B8%EC%97%94%EB%93%9C-%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 가상피팅&amp;nbsp;서비스 프로젝트의 백엔드와 프런트엔드를 성공적으로 배포한 과정을 공유해 드리고자 합니다. 저희는 프런트엔드는 Netlify를, 백엔드는 Ngrok을 활용하여 배포를 진행했습니다. 각각의 배포 과정과 장점을 함께 살펴보시죠!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프런트엔드 배포: Netlify로 빠르고 간편하게!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netlify는 정적 웹사이트 호스팅 및 배포를 위한 강력한 플랫폼입니다. 특히 React와 같은 SPA(Single Page Application) 배포에 매우 최적화되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Netlify 배포 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;프로젝트 준비:&lt;/b&gt; React 앱을 빌드합니다. npm run build 또는 yarn build 명령어를 실행하면 build 폴더에 배포 가능한 정적 파일들이 생성됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Netlify 가입 및 로그인:&lt;/b&gt; Netlify 웹사이트에 접속하여 GitHub, GitLab, Bitbucket 계정으로 간편하게 가입 및 로그인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새 사이트 생성:&lt;/b&gt; 대시보드에서 'Add new site' 또는 'New site from Git' 버튼을 클릭합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git 연동:&lt;/b&gt; 프런트엔드 프로젝트가 저장된 GitHub, GitLab, Bitbucket 저장소를 연동합니다. 저장소를 선택하고 배포할 브랜치(예: main 또는 master)를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빌드 설정:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빌드 명령어 (Build command):&lt;/b&gt; npm run build 또는 yarn build (프로젝트에 따라 다름)를 입력합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배포할 디렉토리 (Publish directory):&lt;/b&gt; build를 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배포 시작:&lt;/b&gt; 'Deploy site' 버튼을 클릭하면 Netlify가 자동으로 프로젝트를 빌드하고 배포를 진행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도메인 설정:&lt;/b&gt; 배포가 완료되면 Netlify에서 제공하는 기본 도메인으로 접속하여 웹사이트를 확인할 수 있습니다. 필요하다면 사용자 정의 도메인도 연결할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷(14).png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfZv3/btsOQUqB5Bc/52S5OJ6KtL3C44bCFzQvtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfZv3/btsOQUqB5Bc/52S5OJ6KtL3C44bCFzQvtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfZv3/btsOQUqB5Bc/52S5OJ6KtL3C44bCFzQvtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfZv3%2FbtsOQUqB5Bc%2F52S5OJ6KtL3C44bCFzQvtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3840&quot; height=&quot;2160&quot; data-filename=&quot;스크린샷(14).png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Netlify의 장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자동화된 CI/CD:&lt;/b&gt; Git 저장소에 코드를 푸시할 때마다 자동으로 빌드 및 배포가 이루어져 개발 워크플로우를 간소화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빠른 CDN:&lt;/b&gt; 전 세계에 분산된 CDN(콘텐츠 전송 네트워크)을 통해 사용자에게 빠르게 콘텐츠를 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;간편한 설정:&lt;/b&gt; 직관적인 UI와 간단한 설정으로 웹사이트를 쉽게 배포할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTPS 자동 적용:&lt;/b&gt; 무료 SSL 인증서를 자동으로 발급하고 적용하여 보안을 강화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 백엔드 배포: Ngrok으로 로컬 서버를 외부에 노출!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ngrok은 로컬에서 실행 중인 웹 서버를 외부 인터넷에 노출시킬 수 있는 터널링 도구입니다. 개발 단계에서 프런트엔드와 백엔드를 연동하거나, 테스트 목적으로 외부에서 접근해야 할 때 매우 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ngrok 배포 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Ngrok 설치:&lt;/b&gt; Ngrok 공식 웹사이트에서 운영체제에 맞는 버전을 다운로드하고 압축을 해제합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ngrok 인증:&lt;/b&gt; 다운로드 후, Ngrok 대시보드에서 제공하는 인증 토큰을 사용하여 Ngrok을 인증합니다.&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;./ngrok authtoken &amp;lt;YOUR_AUTH_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;백엔드 서버 실행:&lt;/b&gt; 로컬 환경에서 FastAPI 백엔드 서버를 실행합니다. 저희 프로젝트의 경우 main.py 파일 하단에 Uvicorn을 통해 서버를 실행하는 코드가 있습니다.이 코드를 통해 서버가 8000번 포트에서 실행됩니다. 터미널에서 다음과 같이 실행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;uvicorn api.main:app --host 0.0.0.0 --port 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;if __name__ == &quot;__main__&quot;:
    import uvicorn
    port = int(os.getenv(&quot;PORT&quot;, 8000))
    uvicorn.run(&quot;api.main:app&quot;, host=&quot;0.0.0.0&quot;, port=port, reload=False)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ngrok 터널링 시작:&lt;/b&gt; 새로운 터미널을 열고, 백엔드 서버가 실행 중인 포트(예: 8000번)로 HTTP 터널을 엽니다.&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;./ngrok http 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 URL 확인:&lt;/b&gt; Ngrok이 실행되면 콘솔에 Forwarding 주소가 표시됩니다. 이 주소(예: https://&amp;lt;random-subdomain&amp;gt;.ngrok-free.app)가 외부에서 백엔드 서버에 접근할 수 있는 URL이 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ngrok의 장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;간편한 외부 노출:&lt;/b&gt; 복잡한 네트워크 설정 없이 로컬 서버를 인터넷에 쉽게 노출할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발 및 테스트 용이:&lt;/b&gt; 프런트엔드와 백엔드를 분리하여 개발할 때 API 연동 테스트를 편리하게 진행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일시적 접근:&lt;/b&gt; 특정 기간 동안만 서버를 외부에 노출해야 할 때 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 프런트엔드와 백엔드 연동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netlify로 배포된 프런트엔드와 Ngrok으로 노출된 백엔드를 연동하는 것이 마지막 단계입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RecommendationForm.js 파일에서 백엔드 API를 호출하는 부분의 URL을 Ngrok이 제공하는 외부 URL로 변경해야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;JavaScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// RecommendationForm.js 파일 내 axios.post 요청 URL 수정
// 기존:
// const response = await axios.post(&quot;http://localhost:8000/api/analyze-image&quot;, ...);
// const response = await axios.post(&quot;http://localhost:8000/api/recommend&quot;, { ... });
// const response = await axios.post(&quot;http://localhost:8000/api/try-on&quot;, { ... });

// 변경:
const BASE_API_URL = &quot;https://&amp;lt;YOUR_NGROK_SUBDOMAIN&amp;gt;.ngrok-free.app&quot;; // Ngrok이 제공하는 URL로 변경

// 예시
const response = await axios.post(`${BASE_API_URL}/api/analyze-image`, ...);
const response = await axios.post(`${BASE_API_URL}/api/recommend`, { ... });
const response = await axios.post(`${BASE_API_URL}/api/try-on`, { ... });
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 URL을 변경한 후, 프런트엔드 코드를 다시 빌드하고 Netlify에 재배포하면, 배포된 프런트엔드 웹사이트가 Ngrok을 통해 노출된 백엔드 서버와 통신하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷(11).png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J4U1K/btsOQPv9mrO/nkyOb9l5Tgs7fpg6sw9S91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J4U1K/btsOQPv9mrO/nkyOb9l5Tgs7fpg6sw9S91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J4U1K/btsOQPv9mrO/nkyOb9l5Tgs7fpg6sw9S91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ4U1K%2FbtsOQPv9mrO%2FnkyOb9l5Tgs7fpg6sw9S91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3840&quot; height=&quot;2160&quot; data-filename=&quot;스크린샷(11).png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷(13).png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDntR2/btsOSD8IkvI/JF1GivYk4lExLrDNsDtF5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDntR2/btsOSD8IkvI/JF1GivYk4lExLrDNsDtF5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDntR2/btsOSD8IkvI/JF1GivYk4lExLrDNsDtF5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDntR2%2FbtsOSD8IkvI%2FJF1GivYk4lExLrDNsDtF5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3840&quot; height=&quot;2160&quot; data-filename=&quot;스크린샷(13).png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 피팅 서비스의 성공적인 배포는 Netlify와 Ngrok의 강력한 기능을 통해 가능했습니다. 이 두 도구를 활용하면 복잡한 배포 과정을 간소화하고, 효율적인 개발 및 테스트 환경을 구축할 수 있습니다. 여러분의 프로젝트에도 이 방법들을 적용해보세요!&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>Netlify</category>
      <category>ngrok</category>
      <category>가상피팅 서비스</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/24</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-%EA%B0%80%EC%83%81%ED%94%BC%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%94%84%EB%9F%B0%ED%8A%B8%EC%97%94%EB%93%9C-%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0#entry24comment</comments>
      <pubDate>Thu, 26 Jun 2025 09:06:55 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] '모델 이미지 분석' 기능 구현</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-%EB%AA%A8%EB%8D%B8-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EC%84%9D-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84</link>
      <description>&lt;div&gt;
&lt;div id=&quot;processing-state-3-summary&quot; aria-hidden=&quot;true&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px;&quot;&gt;딥러닝 기반 퍼스널 컬러 및 체형 분석 &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;model-response-message-contentr_8a991a0fdfbec308&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 사용자에게 더욱 정확하고 개인화된 의류 추천을 제공하기 위해 &lt;b&gt;'모델 이미지 분석' 기능&lt;/b&gt;이 어떻게 구현되었는지, 특히 &lt;b&gt;'퍼스널 컬러 예측' 부분이 백엔드와 프런트엔드에서 어떻게 처리되는지&lt;/b&gt; 자세히 알아보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.   퍼스널 컬러 예측, 어떻게 이루어지나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeepShopping은 사용자가 업로드한 이미지를 분석하여 퍼스널 컬러를 예측합니다. 이 과정은 주로 백엔드에서 이루어지며, main.py 파일의 analyze_image 엔드포인트가 핵심적인 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;personal color predict 디렉토리의 핵심 파일들:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;skincolor.py&lt;/b&gt;: 이 파일에는 얼굴 이미지에서 피부 영역을 추출하고, 추출된 피부색을 기반으로 퍼스널 컬러를 분류하는 로직이 담겨 있습니다. 일반적으로 머신러닝 모델(예: 딥러닝 모델)과 전처리/후처리 과정이 포함됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;personal_color_model.h5&lt;/b&gt;: 이는 퍼스널 컬러를 예측하는 데 사용되는 실제 딥러닝 모델 파일입니다. HDF5 형식으로 저장된 Keras 또는 TensorFlow 모델일 가능성이 높습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;scaler.pkl&lt;/b&gt;: 피부색 데이터를 모델에 입력하기 전에 정규화하는 데 사용되는 스케일러 객체입니다. pickle 파일로 저장되어 모델과 함께 로드됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;shape_predictor_68_face_landmarks.dat&lt;/b&gt;: Dlib 라이브러리에서 제공하는 얼굴 랜드마크 예측 모델입니다. 얼굴 영역을 정확히 찾아내고 눈, 코, 입 등 68개의 특징점을 파악하여 피부 영역을 분리하는 데 활용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bodyshape.py&lt;/b&gt;: 이 파일은 이미지에서 사용자의 체형을 분석하고 예측하는 로직을 담고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백엔드(main.py)에서의 처리 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;파일 업로드&lt;/b&gt;: 사용자가 프런트엔드에서 이미지 파일을 업로드하면, FastAPI의 /api/analyze-image 엔드포인트가 이를 UploadFile 형태로 받습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임시 저장&lt;/b&gt;: 업로드된 파일은 서버의 임시 디렉토리에 저장됩니다. 이는 파일 시스템 경로를 통해 분석 모델에 접근하기 위함입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원격 서버 업로드 (선택 사항)&lt;/b&gt;: 코드를 보면, 설정된 환경 변수(REMOTE_SERVER_HOST, REMOTE_SERVER_USER 등)가 있다면, &lt;b&gt;업로드된 이미지를 원격 Linux 서버로 model.jpg라는 이름으로 다시 업로드&lt;/b&gt;하는 로직이 있습니다. 이는 my_tryon.py와 같은 추가적인 딥러닝 모델이 별도의 고성능 서버에서 실행될 때 유용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 로드 및 예측&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;predict_personal_color 함수를 호출하여 퍼스널 컬러를 예측합니다. 이때 personal_color_model.h5, scaler.pkl, shape_predictor_68_face_landmarks.dat와 같은 모델 파일들의 &lt;b&gt;절대 경로를 정확히 지정하여 로드&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;predict_body_shape 함수를 호출하여 체형을 예측합니다.&lt;/li&gt;
&lt;li&gt;이 두 함수는 업로드된 이미지 파일의 경로를 인자로 받아 분석을 수행하고 결과를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예외 처리&lt;/b&gt;: 만약 퍼스널 컬러나 체형 분석이 실패하면, 적절한 HTTP 400 오류 메시지를 반환하여 프런트엔드에 알립니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 반환&lt;/b&gt;: 분석이 성공적으로 완료되면, personal_color와 body_shape 결과를 JSON 형태로 프런트엔드에 반환합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Python&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# main.py 에서 personal color predict 관련 부분
# Corrected imports to load directly from the modified sys.path
from skincolor import predict_personal_color #
from bodyshape import predict_body_shape #

# ...
@app.post(&quot;/api/analyze-image&quot;)
async def analyze_image(file: UploadFile = File(...)):
    # ... 파일 저장 및 원격 업로드 로직 ...

    # Define absolute paths for models required by personal color prediction
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
    personal_color_predict_dir = os.path.join(base_dir, &quot;toil&quot;, &quot;personal color predict&quot;)
    
    model_path = os.path.join(personal_color_predict_dir, &quot;personal_color_model.h5&quot;) #
    scaler_path = os.path.join(personal_color_predict_dir, &quot;scaler.pkl&quot;) #
    shape_predictor_path = os.path.join(personal_color_predict_dir, &quot;shape_predictor_68_face_landmarks.dat&quot;) #

    personal_color_result = predict_personal_color( #
        image_path=file_path,
        model_path=model_path,
        scaler_path=scaler_path,
        shape_predictor_path=shape_predictor_path
    )
    body_shape_result = predict_body_shape(image_file_path=file_path) #

    # ... 결과 반환 로직 ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.   모델 이미지 분석, 프런트엔드와 어떻게 소통하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프런트엔드(RecommendationForm.js)는 사용자와 백엔드 간의 인터페이스 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프런트엔드(RecommendationForm.js)에서의 처리 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 선택 및 미리보기&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 '모델 이미지 선택' 버튼을 클릭하여 이미지를 업로드합니다.&lt;/li&gt;
&lt;li&gt;handleImageFileChange 함수는 선택된 파일을 selectedFile 상태에 저장하고, FileReader를 사용하여 이미지 미리보기를 생성하여 imagePreview 상태에 업데이트합니다.&lt;/li&gt;
&lt;li&gt;이를 통해 사용자는 업로드할 이미지를 미리 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분석 요청&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 '선택한 이미지로 체형/컬러 분석' 버튼을 클릭하면 handleImageAnalysis 함수가 호출됩니다.&lt;/li&gt;
&lt;li&gt;이 함수는 FormData 객체를 생성하여 선택된 이미지 파일(selectedFile)을 백엔드(http://localhost:8000/api/analyze-image)로 POST 요청합니다.&lt;/li&gt;
&lt;li&gt;분석 중에는 analysisLoading 상태를 true로 설정하여 사용자에게 로딩 스피너를 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 수신 및 반영&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백엔드로부터 분석 결과(퍼스널 컬러, 체형)를 성공적으로 받으면, setUserInfo 함수를 사용하여 userInfo 상태의 personal_color와 body_shape 필드를 업데이트합니다.&lt;/li&gt;
&lt;li&gt;사용자에게는 분석 완료 알림(alert)이 표시됩니다.&lt;/li&gt;
&lt;li&gt;만약 오류가 발생하면 analysisError 상태를 업데이트하여 오류 메시지를 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;JavaScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// RecommendationForm.js 에서 모델 이미지 분석 관련 부분
// ...
const handleImageFileChange = (event) =&amp;gt; { //
  const file = event.target.files[0]; //
  if (file) { //
    setSelectedFile(file); //
    const reader = new FileReader(); //
    reader.onloadend = () =&amp;gt; { //
      setImagePreview(reader.result); //
    };
    reader.readAsDataURL(file); //
  }
};

const handleImageAnalysis = async () =&amp;gt; { //
  // ... (파일 유효성 검사, 로딩 상태 설정) ...

  const formData = new FormData(); //
  formData.append(&quot;file&quot;, selectedFile); //

  try { //
    const response = await axios.post( //
      &quot;http://localhost:8000/api/analyze-image&quot;, //
      formData,
      {
        headers: {
          &quot;Content-Type&quot;: &quot;multipart/form-data&quot;,
        },
      }
    );
    setUserInfo((prev) =&amp;gt; ({ //
      ...prev,
      personal_color: response.data.personal_color || prev.personal_color, //
      body_shape: response.data.body_shape || prev.body_shape, //
    }));
    alert(&quot;이미지 분석이 완료되어 퍼스널 컬러와 체형 정보가 자동으로 입력되었습니다.&quot;); //
  } catch (err) { //
    // ... 오류 처리 ...
  } finally { //
    setAnalysisLoading(false); //
  }
};
// ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MgUen/btsOSOIXK3G/uIcBMfCFKSJKoHgVFrdZKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MgUen/btsOSOIXK3G/uIcBMfCFKSJKoHgVFrdZKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MgUen/btsOSOIXK3G/uIcBMfCFKSJKoHgVFrdZKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMgUen%2FbtsOSOIXK3G%2FuIcBMfCFKSJKoHgVFrdZKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;566&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.   사용자 경험 향상&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 &lt;b&gt;딥러닝 기반 이미지 분석 기능&lt;/b&gt;은 사용자에게 제공하는 추천의 질을 한층 더 높여줍니다. 사용자가 직접 자신의 퍼스널 컬러나 체형을 입력할 필요 없이, 간단한 이미지 업로드만으로도 개인화된 정보를 얻을 수 있게 되어 &lt;b&gt;사용자 편의성이 크게 향상&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기술은 패션 추천 시스템의 미래를 보여주는 중요한 단계이며, 앞으로 더욱 정교하고 다양한 AI 기반 분석 기능들이 추가될 것으로 기대됩니다.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>Backend</category>
      <category>FormData</category>
      <category>Frontend</category>
      <category>personal_color</category>
      <category>scaler</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/23</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-%EB%AA%A8%EB%8D%B8-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EC%84%9D-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84#entry23comment</comments>
      <pubDate>Thu, 26 Jun 2025 08:49:32 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] Comfyui 자동 실행 프로그램 제작</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-Comfyui-%EC%9E%90%EB%8F%99-%EC%8B%A4%ED%96%89-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%A0%9C%EC%9E%91</link>
      <description>&lt;h3 data-sourcepos=&quot;3:1-3:34&quot; data-ke-size=&quot;size23&quot;&gt;ComfyUI CatVTON 워크플로우 자동화 스크립트&lt;/h3&gt;
&lt;p data-sourcepos=&quot;5:1-5:113&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 스크립트는 ComfyUI 서버에 연결하여 CatVTON 워크플로우를 실행하고, 지정된 입력 이미지를 사용하여 최종 결과 이미지를 가져와 저장합니다. &lt;/span&gt;&lt;/p&gt;
&lt;hr data-sourcepos=&quot;7:1-7:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;9:1-9:57&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;1. 초기 설정 및 변수 &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;10:1-15:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;10:1-10:143&quot;&gt;&lt;b&gt;&lt;span&gt;ComfyUI 서버 주소&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;COMFYUI_URL&lt;/span&gt;&lt;span&gt; 및 &lt;/span&gt;&lt;span&gt;SERVER_ADDRESS&lt;/span&gt;&lt;span&gt; 변수에 ComfyUI 서버의 기본 주소가 설정됩니다 (기본값: &lt;/span&gt;&lt;span&gt;http://127.0.0.1:8188&lt;/span&gt;&lt;span&gt;). &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:1-11:148&quot;&gt;&lt;b&gt;&lt;span&gt;워크플로우 JSON 경로&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;WORKFLOW_JSON_PATH&lt;/span&gt;&lt;span&gt; 및 &lt;/span&gt;&lt;span&gt;DEFAULT_WORKFLOW_PATH&lt;/span&gt;&lt;span&gt;는 스크립트 실행 위치를 기준으로 CatVTON 워크플로우 JSON 파일의 경로를 지정합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;12:1-12:76&quot;&gt;&lt;b&gt;&lt;span&gt;클라이언트 ID&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: WebSocket 통신을 위한 고유 클라이언트 ID가 생성됩니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;13:1-13:85&quot;&gt;&lt;b&gt;&lt;span&gt;출력 디렉토리&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 생성된 이미지가 저장될 기본 폴더 (&lt;/span&gt;&lt;span&gt;ComfyUI/output/&lt;/span&gt;&lt;span&gt;)가 정의됩니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;14:1-15:0&quot;&gt;&lt;b&gt;&lt;span&gt;입력 이미지&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 명령줄 인자를 통해 'Target Person' 이미지와 'Reference Garment' 이미지 파일명을 받습니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;16:1-16:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;18:1-18:83&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;2. 워크플로우 입력 수정 (&lt;/span&gt;&lt;span&gt;modify_workflow_inputs&lt;/span&gt;&lt;span&gt; 함수) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;19:1-26:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;19:1-19:101&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 로드된 워크플로우 JSON 데이터 내의 &lt;/span&gt;&lt;span&gt;LoadImage&lt;/span&gt;&lt;span&gt; 노드에서 입력 이미지 파일명을 동적으로 변경합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;20:1-26:0&quot;&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;21:5-26:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;21:5-21:49&quot;&gt;&lt;span&gt;워크플로우의 각 노드를 반복합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:5-22:64&quot;&gt;&lt;span&gt;노드 &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;이 &quot;LoadImage&quot;인 경우를 식별합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:5-23:196&quot;&gt;&lt;span&gt;노드의 &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; (예: &quot;Target Person&quot;, &quot;Reference Garment&quot;)을 확인하여 해당하는 입력 이미지 파일명 (&lt;/span&gt;&lt;span&gt;model_image_filename&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;top_image_filename&lt;/span&gt;&lt;span&gt;)으로 &lt;/span&gt;&lt;span&gt;widgets_values&lt;/span&gt;&lt;span&gt;를 업데이트합니다. &lt;/span&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;21:5-26:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;24:5-24:78&quot;&gt;&lt;span&gt;widgets_values&lt;/span&gt;&lt;span&gt;가 없거나 리스트가 아닌 경우 경고를 출력합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;25:5-26:0&quot;&gt;&lt;span&gt;변경이 없으면 경고 메시지를 출력합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;27:1-27:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;29:1-29:70&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;3. 워크플로우 실행 (&lt;/span&gt;&lt;span&gt;run_workflow&lt;/span&gt;&lt;span&gt; 함수 - 레거시/참고용) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;30:1-38:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;30:1-30:174&quot;&gt;&lt;b&gt;&lt;span&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: (주석 처리된 또는 이전 버전의) 워크플로우 실행 로직으로, 현재 &lt;/span&gt;&lt;span&gt;if __name__ == &quot;__main__&quot;:&lt;/span&gt;&lt;span&gt; 블록의 &lt;/span&gt;&lt;span&gt;queue_prompt&lt;/span&gt;&lt;span&gt; 및 &lt;/span&gt;&lt;span&gt;handle_websocket_messages&lt;/span&gt;&lt;span&gt; 함수로 대체되거나 보강된 기능입니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;31:1-38:0&quot;&gt;&lt;b&gt;주요 동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;32:5-38:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;32:5-32:50&quot;&gt;&lt;span&gt;워크플로우 JSON 파일을 읽습니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;33:5-33:75&quot;&gt;&lt;span&gt;modify_workflow_inputs&lt;/span&gt;&lt;span&gt;를 호출하여 입력 이미지를 수정합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;34:5-34:242&quot;&gt;&lt;b&gt;class_type 설정&lt;/b&gt;: ComfyUI API 요구사항에 맞춰 각 노드의 class_type을 설정하려고 시도합니다. &lt;span&gt;이는 &lt;/span&gt;&lt;span&gt;CORRECT_CLASS_TYPES&lt;/span&gt;&lt;span&gt; 매핑을 사용하거나, 원본 파일의 &lt;/span&gt;&lt;span&gt;class_type&lt;/span&gt;&lt;span&gt;을 유지하거나, 노드의 &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;을 &lt;/span&gt;&lt;span&gt;class_type&lt;/span&gt;&lt;span&gt;으로 대체합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;35:5-35:98&quot;&gt;&lt;span&gt;준비된 워크플로우를 JSON 페이로드로 구성하여 &lt;/span&gt;&lt;span&gt;/prompt&lt;/span&gt;&lt;span&gt; 엔드포인트로 HTTP POST 요청을 보냅니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;36:5-36:69&quot;&gt;&lt;span&gt;요청 성공 시 서버 응답을 출력하고 &lt;/span&gt;&lt;span&gt;prompt_id&lt;/span&gt;&lt;span&gt;를 반환합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;37:5-38:0&quot;&gt;&lt;span&gt;파일을 찾을 수 없거나, JSON 디코딩 오류, HTTP 요청 오류 등의 예외를 처리합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;39:1-39:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;41:1-41:62&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;4. 프롬프트 큐에 추가 (&lt;/span&gt;&lt;span&gt;queue_prompt&lt;/span&gt;&lt;span&gt; 함수) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;42:1-47:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;42:1-42:62&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: ComfyUI 서버의 큐에 워크플로우를 제출합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;43:1-47:0&quot;&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;44:5-47:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;44:5-44:68&quot;&gt;&lt;span&gt;워크플로우 데이터와 클라이언트 ID를 포함하는 페이로드를 생성합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;45:5-45:101&quot;&gt;&lt;span&gt;urllib.request&lt;/span&gt;&lt;span&gt;를 사용하여 &lt;/span&gt;&lt;span&gt;http://{server_address}/prompt&lt;/span&gt;&lt;span&gt;로 POST 요청을 보냅니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;46:5-47:0&quot;&gt;&lt;span&gt;HTTP 오류 발생 시 상세한 서버 응답(특히 &lt;/span&gt;&lt;span&gt;node_errors&lt;/span&gt;&lt;span&gt;가 포함된 경우)을 파싱하여 출력합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;48:1-48:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;50:1-50:57&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;5. 이미지 가져오기 (&lt;/span&gt;&lt;span&gt;get_image&lt;/span&gt;&lt;span&gt; 함수) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;51:1-55:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;51:1-51:66&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: ComfyUI 서버에서 특정 이미지 파일을 다운로드합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;52:1-55:0&quot;&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;53:5-55:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;53:5-53:72&quot;&gt;&lt;span&gt;파일 이름, 하위 폴더, 폴더 유형을 포함하는 URL 매개변수를 구성합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;54:5-55:0&quot;&gt;&lt;span&gt;http://{server_address}/view?{url_values}&lt;/span&gt;&lt;span&gt; 엔드포인트에 요청하여 이미지 바이트를 가져옵니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;56:1-56:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;58:1-58:60&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;6. 히스토리 가져오기 (&lt;/span&gt;&lt;span&gt;get_history&lt;/span&gt;&lt;span&gt; 함수) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;59:1-63:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;59:1-59:78&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 특정 프롬프트 ID에 대한 실행 히스토리(결과 이미지 정보 포함)를 가져옵니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;60:1-63:0&quot;&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;61:5-63:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;61:5-61:113&quot;&gt;&lt;span&gt;http://{server_address}/history/{prompt_id}&lt;/span&gt;&lt;span&gt; 엔드포인트에 요청하여 JSON 형식의 히스토리 데이터를 반환합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;62:5-63:0&quot;&gt;&lt;span&gt;HTTP 오류 발생 시 오류 메시지를 출력합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;64:1-64:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;66:1-66:89&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;7. WebSocket 메시지 처리 및 결과 저장 (&lt;/span&gt;&lt;span&gt;handle_websocket_messages&lt;/span&gt;&lt;span&gt; 함수) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;67:1-78:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;67:1-67:110&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: ComfyUI WebSocket에 연결하여 프롬프트 실행 상태를 실시간으로 모니터링하고, 완료 시 결과 이미지를 다운로드하여 저장합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;68:1-78:0&quot;&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;69:5-78:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;69:5-69:47&quot;&gt;&lt;span&gt;WebSocket에 연결합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;70:5-70:135&quot;&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; 메시지를 통해 큐 상태를 확인하고, &lt;/span&gt;&lt;span&gt;executing&lt;/span&gt;&lt;span&gt; 메시지를 통해 프롬프트 실행 시작 및 완료(&lt;/span&gt;&lt;span&gt;node=None&lt;/span&gt;&lt;span&gt;)를 감지합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;71:5-71:93&quot;&gt;&lt;span&gt;execution_error&lt;/span&gt;&lt;span&gt; 메시지가 수신되면 오류 세부 정보를 출력하고 처리를 중단합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;72:5-72:78&quot;&gt;&lt;span&gt;프롬프트 실행이 완료되거나 오류가 발생하면 WebSocket 연결을 닫습니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;73:5-78:0&quot;&gt;&lt;b&gt;결과 이미지 다운로드 및 저장&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;74:9-78:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;74:9-74:83&quot;&gt;&lt;span&gt;get_history&lt;/span&gt;&lt;span&gt; 함수를 사용하여 완료된 프롬프트의 히스토리 데이터를 가져옵니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;75:9-75:114&quot;&gt;&lt;span&gt;지정된 &lt;/span&gt;&lt;span&gt;output_node_id_target&lt;/span&gt;&lt;span&gt;에서 &lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt; 배열을 찾아 각 이미지의 파일명, 하위 폴더, 유형을 추출합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;76:9-76:154&quot;&gt;&lt;span&gt;get_image&lt;/span&gt;&lt;span&gt;를 호출하여 이미지 바이트를 가져오고, 지정된 출력 디렉토리(&lt;/span&gt;&lt;span&gt;ComfyUI/output/&lt;/span&gt;&lt;span&gt;)에 고유한 파일명(원본 파일명 + 노드 ID + 타임스탬프)으로 저장합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;77:9-78:0&quot;&gt;&lt;span&gt;이미지 저장 중 발생하는 오류를 처리합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;79:1-79:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;81:1-81:92&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;8. API 형식으로 워크플로우 변환 (&lt;/span&gt;&lt;span&gt;convert_workflow_to_api_format&lt;/span&gt;&lt;span&gt; 함수) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;82:1-90:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;82:1-82:103&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: ComfyUI 웹 UI에서 저장된 워크플로우 JSON을 ComfyUI API가 이해할 수 있는 형식으로 변환합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;83:1-90:0&quot;&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;84:5-90:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;84:5-84:82&quot;&gt;&lt;span&gt;각 노드를 반복하며 &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;을 기반으로 API 프롬프트의 키와 값을 구성합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;85:5-85:63&quot;&gt;&lt;span&gt;노드의 &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;을 &lt;/span&gt;&lt;span&gt;class_type&lt;/span&gt;&lt;span&gt;으로 설정합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;86:5-86:170&quot;&gt;&lt;span&gt;LoadImage&lt;/span&gt;&lt;span&gt; 노드의 경우, &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; (예: &quot;Target Person&quot;, &quot;Reference Garment&quot;)을 기반으로 &lt;/span&gt;&lt;span&gt;inputs&lt;/span&gt;&lt;span&gt;에 &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; 파일명을 설정합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;87:5-87:215&quot;&gt;&lt;span&gt;CatVTON 관련 커스텀 노드(&lt;/span&gt;&lt;span&gt;LoadAutoMasker&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;AutoMasker&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;LoadCatVTONPipeline&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;CatVTON&lt;/span&gt;&lt;span&gt;)의 경우, &lt;/span&gt;&lt;span&gt;widgets_values&lt;/span&gt;&lt;span&gt;에 있는 모델 경로, 천 종류, 시드, 스텝 등의 값을 API의 &lt;/span&gt;&lt;span&gt;inputs&lt;/span&gt;&lt;span&gt; 필드로 매핑합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;88:5-88:152&quot;&gt;&lt;span&gt;워크플로우 내의 &lt;/span&gt;&lt;span&gt;links&lt;/span&gt;&lt;span&gt; 정보를 분석하여 노드 간의 연결을 API &lt;/span&gt;&lt;span&gt;inputs&lt;/span&gt;&lt;span&gt; 형식(&lt;/span&gt;&lt;span&gt;[origin_node_id, origin_slot_idx]&lt;/span&gt;&lt;span&gt;)으로 변환합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;89:5-90:0&quot;&gt;&lt;span&gt;최종 결과물을 생성하는 &lt;/span&gt;&lt;span&gt;SaveImage&lt;/span&gt;&lt;span&gt; 노드(인자로 받은 &lt;/span&gt;&lt;span&gt;output_node_id&lt;/span&gt;&lt;span&gt;와 일치하는)에 &lt;/span&gt;&lt;span&gt;filename_prefix&lt;/span&gt;&lt;span&gt;를 자동으로 추가합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-sourcepos=&quot;91:1-91:3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-sourcepos=&quot;93:1-93:71&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;9. 메인 실행 블록 (&lt;/span&gt;&lt;span&gt;if __name__ == &quot;__main__&quot;:&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;94:1-105:141&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;94:1-100:75&quot;&gt;&lt;b&gt;&lt;span&gt;명령줄 인자 파싱&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;argparse&lt;/span&gt;&lt;span&gt;를 사용하여 다음 인자를 받습니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;95:5-100:75&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;95:5-95:66&quot;&gt;&lt;span&gt;--model-image&lt;/span&gt;&lt;span&gt;: 대상 인물 이미지 파일명 (필수). &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;96:5-96:60&quot;&gt;&lt;span&gt;--top-image&lt;/span&gt;&lt;span&gt;: 옷 이미지 파일명 (필수). &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;97:5-97:75&quot;&gt;&lt;span&gt;--workflow_path&lt;/span&gt;&lt;span&gt;: 워크플로우 JSON 파일 경로 (기본값 제공). &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;98:5-98:73&quot;&gt;&lt;span&gt;--server_address&lt;/span&gt;&lt;span&gt;: ComfyUI 서버 주소 (기본값 제공). &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;99:5-99:85&quot;&gt;&lt;span&gt;--output_node_id&lt;/span&gt;&lt;span&gt;: 최종 이미지 출력을 담당하는 노드의 ID (기본값: &quot;18&quot;). &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;100:5-100:75&quot;&gt;&lt;span&gt;--skip_cleanup&lt;/span&gt;&lt;span&gt;: 처리 후 입력 파일을 삭제할지 여부를 결정합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;101:1-101:130&quot;&gt;&lt;b&gt;&lt;span&gt;워크플로우 로드 및 변환&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 지정된 경로에서 워크플로우 JSON을 로드하고 &lt;/span&gt;&lt;span&gt;convert_workflow_to_api_format&lt;/span&gt;&lt;span&gt;을 호출하여 API 형식으로 변환합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;102:1-102:90&quot;&gt;&lt;b&gt;&lt;span&gt;프롬프트 큐에 추가&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;queue_prompt&lt;/span&gt;&lt;span&gt;를 호출하여 워크플로우를 ComfyUI 서버 큐에 제출합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;103:1-103:129&quot;&gt;&lt;b&gt;&lt;span&gt;WebSocket 모니터링&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;prompt_id&lt;/span&gt;&lt;span&gt;를 사용하여 &lt;/span&gt;&lt;span&gt;handle_websocket_messages&lt;/span&gt;&lt;span&gt;를 호출하여 프롬프트 실행을 모니터링하고 결과를 가져옵니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;104:1-104:121&quot;&gt;&lt;b&gt;&lt;span&gt;오류 처리&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 서버 연결 오류 (&lt;/span&gt;&lt;span&gt;URLError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ConnectionRefusedError&lt;/span&gt;&lt;span&gt;) 및 기타 예외를 처리하고 사용자에게 메시지를 출력합니다. &lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;105:1-105:141&quot;&gt;&lt;b&gt;&lt;span&gt;파일 정리&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;--skip_cleanup&lt;/span&gt;&lt;span&gt; 인자가 없으면, 스크립트 실행이 완료된 후 ComfyUI의 &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; 폴더에 업로드된 입력 이미지 파일을 삭제합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>ComfyUI</category>
      <category>websocke</category>
      <category>워크플로우 json</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/22</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-Comfyui-%EC%9E%90%EB%8F%99-%EC%8B%A4%ED%96%89-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%A0%9C%EC%9E%91#entry22comment</comments>
      <pubDate>Thu, 5 Jun 2025 21:06:42 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] Gemini API와 Serper API</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-Gemini-API%EC%99%80-Serper-API</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 캡스톤에서 나에게 맞는 옷을 찾기 위한 llm에 부분에서 사용할 api가 필요하였습니다. 그래서 이번기회에 사용할 api들을 비교하면서 무엇을 사용하였는지에 대해 이야기 해볼려고 합니다. 저희 프로젝트에서 사용하는 api는 Gemini api와 Serper api라서 이것들을 중점적으로 살펴볼려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Gemini API란&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Gemini API&lt;/b&gt;는 Google DeepMind가 개발한 멀티모달 대형 언어 모델(LLM) 입니다. 자연어 처리, 이미지 분석, 코드 생성 등 다양한 기능을 하나의 API에서 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 gemini api를 사용하는 방법에 대한 코드 예시 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747910762894&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from google.generativeai import GenerativeModel

model = GenerativeModel('gemini-pro')
response = model.generate_content(&quot;Explain quantum computing in simple terms.&quot;)
print(response.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjEzie/btsN8JiCMQm/uerCHVKJBk14j5SftVzI7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjEzie/btsN8JiCMQm/uerCHVKJBk14j5SftVzI7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjEzie/btsN8JiCMQm/uerCHVKJBk14j5SftVzI7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjEzie%2FbtsN8JiCMQm%2FuerCHVKJBk14j5SftVzI7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;368&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;814&quot; data-start=&quot;782&quot;&gt;&lt;b&gt;멀티모달 지원&lt;/b&gt;: 텍스트, 이미지 입력 동시 처리&lt;/li&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;815&quot;&gt;&lt;b&gt;Google 생태계 통합&lt;/b&gt;: Gmail, Docs, Drive 등과의 연동에 유리&lt;/li&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;866&quot;&gt;&lt;b&gt;정확한 추론&lt;/b&gt;: 코드 생성, 테크니컬 Q&amp;amp;A에 강함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;910&quot;&gt;&lt;b&gt;설정이 복잡&lt;/b&gt;: Google Cloud 인증 절차가 초심자에겐 부담&lt;/li&gt;
&lt;li data-end=&quot;984&quot; data-start=&quot;953&quot;&gt;&lt;b&gt;쿼터 제한&lt;/b&gt;: 무료 요금제 한도가 빠르게 소진됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Serper API란&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Serper API&lt;/b&gt;는 Google 검색 결과를 API 형태로 제공하는 서비스입니다. 실시간 뉴스, 이미지, 블로그, 일반 웹 검색까지 다양한 형태의 데이터를 JSON으로 받아올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Serper api를 사용하는 방법에 대한 코드 예시입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747910847570&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

url = &quot;https://google.serper.dev/search&quot;
headers = {&quot;X-API-KEY&quot;: &quot;YOUR_API_KEY&quot;}
params = {&quot;q&quot;: &quot;latest AI trends&quot;}

response = requests.post(url, headers=headers, json=params)
print(response.json())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYb2lv/btsN8ZrW1rV/A3wxQ77EqvQUoKyc0AGFFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYb2lv/btsN8ZrW1rV/A3wxQ77EqvQUoKyc0AGFFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYb2lv/btsN8ZrW1rV/A3wxQ77EqvQUoKyc0AGFFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYb2lv%2FbtsN8ZrW1rV%2FA3wxQ77EqvQUoKyc0AGFFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;381&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1426&quot; data-start=&quot;1389&quot;&gt;&lt;b&gt;Google 검색 기반&lt;/b&gt;: 정확하고 신뢰도 높은 결과 제공&lt;/li&gt;
&lt;li data-end=&quot;1463&quot; data-start=&quot;1427&quot;&gt;&lt;b&gt;빠르고 직관적&lt;/b&gt;: 복잡한 웹 크롤링 없이 빠른 구현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1514&quot; data-start=&quot;1474&quot;&gt;&lt;b&gt;검색 이외 기능 부족&lt;/b&gt;: 생성형 응답이나 요약은 별도 구현 필요&lt;/li&gt;
&lt;li data-end=&quot;1546&quot; data-start=&quot;1515&quot;&gt;&lt;b&gt;유료 플랜 필요&lt;/b&gt;: 일정 요청 이상은 요금 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1609&quot; data-start=&quot;1553&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Gemini API vs 다른 LLM들 (ChatGPT, Claude, Mistral 등)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2407&quot; data-start=&quot;1611&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;ChatGPT (OpenAI)&lt;/td&gt;
&lt;td&gt;Claude (Anthropic)&lt;/td&gt;
&lt;td&gt;Mistral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1839&quot; data-start=&quot;1780&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1786&quot; data-start=&quot;1780&quot;&gt;개발사&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1804&quot; data-start=&quot;1786&quot;&gt;Google DeepMind&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1813&quot; data-start=&quot;1804&quot;&gt;OpenAI&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1825&quot; data-start=&quot;1813&quot;&gt;Anthropic&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1839&quot; data-start=&quot;1825&quot;&gt;Mistral.ai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1916&quot; data-start=&quot;1840&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1846&quot; data-start=&quot;1840&quot;&gt;모델명&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1863&quot; data-start=&quot;1846&quot;&gt;Gemini 1.5 Pro&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1884&quot; data-start=&quot;1863&quot;&gt;GPT-4, GPT-4-turbo&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1900&quot; data-start=&quot;1884&quot;&gt;Claude 3 Opus&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1916&quot; data-start=&quot;1900&quot;&gt;Mixtral 8x7B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1974&quot; data-start=&quot;1917&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1927&quot; data-start=&quot;1917&quot;&gt;멀티모달 지원&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1941&quot; data-start=&quot;1927&quot;&gt;✅ (텍스트+이미지)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1954&quot; data-start=&quot;1941&quot;&gt;✅ (Pro 이상)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1969&quot; data-start=&quot;1954&quot;&gt;✅ (Claude 3)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1974&quot; data-start=&quot;1969&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2058&quot; data-start=&quot;1975&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1985&quot; data-start=&quot;1975&quot;&gt;API 통합성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2003&quot; data-start=&quot;1985&quot;&gt;Google Cloud 기반&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2019&quot; data-start=&quot;2003&quot;&gt;OpenAI API 사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2036&quot; data-start=&quot;2019&quot;&gt;AWS Bedrock 통합&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2058&quot; data-start=&quot;2036&quot;&gt;HuggingFace/Custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2154&quot; data-start=&quot;2059&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2064&quot; data-start=&quot;2059&quot;&gt;강점&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2091&quot; data-start=&quot;2064&quot;&gt;Google 생태계 연동, 정확한 검색 기반&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2118&quot; data-start=&quot;2091&quot;&gt;창의성, 코드 생성, Plugin 에코시스템&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2138&quot; data-start=&quot;2118&quot;&gt;장문 처리, 안전성, 문서 요약&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2154&quot; data-start=&quot;2138&quot;&gt;오픈소스, 비용 효율성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2232&quot; data-start=&quot;2155&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2168&quot; data-start=&quot;2155&quot;&gt;최대 컨텍스트 길이&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2188&quot; data-start=&quot;2168&quot;&gt;1M tokens (압축 포함)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2210&quot; data-start=&quot;2188&quot;&gt;~128k (GPT-4-turbo)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2224&quot; data-start=&quot;2210&quot;&gt;200k tokens&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2232&quot; data-start=&quot;2224&quot;&gt;~32k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2323&quot; data-start=&quot;2233&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2241&quot; data-start=&quot;2233&quot;&gt;사용 용도&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2267&quot; data-start=&quot;2241&quot;&gt;검색 기반 응답, 문서 해석, 업무 자동화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2284&quot; data-start=&quot;2267&quot;&gt;범용 AI 비서, 앱 연동&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2302&quot; data-start=&quot;2284&quot;&gt;윤리적 AI, 리서치, 요약&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2323&quot; data-start=&quot;2302&quot;&gt;오픈소스 프로젝트, 경량 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2407&quot; data-start=&quot;2324&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2329&quot; data-start=&quot;2324&quot;&gt;가격&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2352&quot; data-start=&quot;2329&quot;&gt;중간 (Google Cloud 기준)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2374&quot; data-start=&quot;2352&quot;&gt;유료 (ChatGPT Plus 등)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2389&quot; data-start=&quot;2374&quot;&gt;일부 AWS 요금 필요&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2407&quot; data-start=&quot;2389&quot;&gt;저렴 또는 무료 (OSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2513&quot; data-start=&quot;2419&quot;&gt;&lt;b&gt;Gemini&lt;/b&gt;는 &lt;b&gt;멀티모달 처리와 Google 서비스 연동&lt;/b&gt;에 강하며, 특히 Gmail, Calendar, Drive와의 연결이 필요한 서비스에 적합합니다.&lt;/li&gt;
&lt;li data-end=&quot;2568&quot; data-start=&quot;2514&quot;&gt;&lt;b&gt;ChatGPT&lt;/b&gt;는 다양한 Plugin과 광범위한 커뮤니티, 풍부한 튜토리얼이 장점입니다.&lt;/li&gt;
&lt;li data-end=&quot;2633&quot; data-start=&quot;2569&quot;&gt;&lt;b&gt;Claude&lt;/b&gt;는 &lt;b&gt;긴 문서 요약&lt;/b&gt;과 &lt;b&gt;안전성&lt;/b&gt;을 강조하며, 민감한 정보에 민감한 조직에 적합합니다.&lt;/li&gt;
&lt;li data-end=&quot;2682&quot; data-start=&quot;2634&quot;&gt;&lt;b&gt;Mistral&lt;/b&gt;은 경량 오픈소스로, 프라이빗 모델을 원하는 조직에 유리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Gemini + Serper 조합을 선택했는가? &lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2931&quot; data-start=&quot;2725&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;선택 API&lt;/td&gt;
&lt;td&gt;이유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2822&quot; data-start=&quot;2773&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2785&quot; data-start=&quot;2773&quot;&gt;실시간 정보 검색&lt;/td&gt;
&lt;td data-end=&quot;2794&quot; data-start=&quot;2785&quot; data-col-size=&quot;sm&quot;&gt;Serper&lt;/td&gt;
&lt;td data-end=&quot;2822&quot; data-start=&quot;2794&quot; data-col-size=&quot;sm&quot;&gt;빠른 결과, Google 기반의 높은 신뢰도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2880&quot; data-start=&quot;2823&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2840&quot; data-start=&quot;2823&quot;&gt;자연어 처리 및 응답 생성&lt;/td&gt;
&lt;td data-end=&quot;2849&quot; data-start=&quot;2840&quot; data-col-size=&quot;sm&quot;&gt;Gemini&lt;/td&gt;
&lt;td data-end=&quot;2880&quot; data-start=&quot;2849&quot; data-col-size=&quot;sm&quot;&gt;멀티모달, 정확한 추론, Google 생태계 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2931&quot; data-start=&quot;2881&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2891&quot; data-start=&quot;2881&quot;&gt;비용과 확장성&lt;/td&gt;
&lt;td data-end=&quot;2897&quot; data-start=&quot;2891&quot; data-col-size=&quot;sm&quot;&gt;둘 다&lt;/td&gt;
&lt;td data-end=&quot;2931&quot; data-start=&quot;2897&quot; data-col-size=&quot;sm&quot;&gt;API 통합이 쉬우며, 프로젝트 성장에 따라 확장 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3081&quot; data-start=&quot;2933&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Gemini&lt;/b&gt;는 정확하고 신뢰도 높은 응답 생성을, &lt;b&gt;Serper&lt;/b&gt;는 최신 정보 수집을 담당합니다. 이 둘의 조합으로 사용자 입력에 따라 &lt;b&gt;정보를 검색하고&lt;/b&gt;, 이를 바탕으로 &lt;b&gt;콘텐츠를 생성하거나 업무를 자동화&lt;/b&gt;하는 데 매우 유용한 구조가 완성됩니다.&lt;/p&gt;
&lt;p data-end=&quot;3081&quot; data-start=&quot;2933&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3081&quot; data-start=&quot;2933&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3081&quot; data-start=&quot;2933&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 api를 사용하여서 프로젝트를 작업해나가고 있습니다. 현재 1달 정도 남은 시점인데 잘 마무리 되었으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>API</category>
      <category>ChatGPT</category>
      <category>Claude</category>
      <category>GEMINI</category>
      <category>Gemini API</category>
      <category>google deepmind</category>
      <category>LLM</category>
      <category>mistral</category>
      <category>serper</category>
      <category>serper api</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/21</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-Gemini-API%EC%99%80-Serper-API#entry21comment</comments>
      <pubDate>Thu, 22 May 2025 19:55:55 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] React와 Fast-api 설치 및 사용한 이유</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-React%EC%99%80-Fast-api-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%B4%EC%9C%A0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 캡스톤 프로젝트의 결과물을 보여주기 위하여 프런트엔드와 백엔드로 프로그램 작동을 구현시키려고 합니다. 이때 React와 Fast-api로 만들려고 하는데 설치 및 이 2개의 프로그램을 사용한 이유에 대해서 이야기 해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;836&quot; data-start=&quot;824&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; ️ 설치 방법&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;853&quot; data-start=&quot;838&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. React 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1747231070424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app
npm start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create-react-app을 이용하면 프로젝트 템플릿이 자동으로 생성되며, 개발 서버가 자동으로 열립니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 2. FastAPI 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1747231113768&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 가상환경 설정 (선택 사항)
python -m venv venv
source venv/bin/activate  # Windows는 venv\Scripts\activate

# FastAPI와 Uvicorn 설치
pip install fastapi uvicorn&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. FastAPI 기본 예제 (main.py)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1747231139952&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

@app.get(&quot;/&quot;)
def read_root():
    return {&quot;message&quot;: &quot;Hello from FastAPI&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. FastAPI 서버 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1747231198710&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 결과창&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250511_180823780.png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybrzH/btsNX1QQIk3/uo5FSDMuVMdWtyozEcRyM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybrzH/btsNX1QQIk3/uo5FSDMuVMdWtyozEcRyM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybrzH/btsNX1QQIk3/uo5FSDMuVMdWtyozEcRyM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FybrzH%2FbtsNX1QQIk3%2Fuo5FSDMuVMdWtyozEcRyM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;370&quot; data-filename=&quot;KakaoTalk_20250511_180823780.png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250511_181410548.png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rtdmf/btsNXmupIn1/CyaPwkIVkGSxTGR71eT46K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rtdmf/btsNXmupIn1/CyaPwkIVkGSxTGR71eT46K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rtdmf/btsNXmupIn1/CyaPwkIVkGSxTGR71eT46K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRtdmf%2FbtsNXmupIn1%2FCyaPwkIVkGSxTGR71eT46K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;369&quot; data-filename=&quot;KakaoTalk_20250511_181410548.png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;1477&quot; data-start=&quot;1460&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  React 장점 요약&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1623&quot; data-start=&quot;1479&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1528&quot; data-start=&quot;1479&quot;&gt;&lt;b&gt;빠르고 유연한 UI 구성&lt;/b&gt;&lt;br /&gt;컴포넌트 기반 개발로 재사용성과 유지보수 용이&lt;/li&gt;
&lt;li data-end=&quot;1594&quot; data-start=&quot;1530&quot;&gt;&lt;b&gt;풍부한 생태계와 커뮤니티&lt;/b&gt;&lt;br /&gt;다양한 라이브러리와 도구 (예: Redux, React Router 등)&lt;/li&gt;
&lt;li data-end=&quot;1623&quot; data-start=&quot;1596&quot;&gt;&lt;b&gt;JSX 문법으로 더 직관적인 UI 구현&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1628&quot; data-start=&quot;1625&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1648&quot; data-start=&quot;1630&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;⚡ FastAPI 장점 요약&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1811&quot; data-start=&quot;1650&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1679&quot; data-start=&quot;1650&quot;&gt;&lt;b&gt;Python 기반의 현대적인 웹 프레임워크&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1748&quot; data-start=&quot;1680&quot;&gt;&lt;b&gt;자동 문서화 (Swagger, Redoc)&lt;/b&gt;&lt;br /&gt;/docs, /redoc 경로로 자동 API 문서 생성&lt;/li&gt;
&lt;li data-end=&quot;1777&quot; data-start=&quot;1750&quot;&gt;&lt;b&gt;비동기 처리 지원으로 고성능 구현 가능&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1811&quot; data-start=&quot;1778&quot;&gt;&lt;b&gt;데이터 검증과 타입 검사 내장 (Pydantic)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;404&quot; data-start=&quot;375&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✅ React와 FastAPI를 함께 쓰는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;817&quot; data-start=&quot;406&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;515&quot; data-start=&quot;406&quot;&gt;&lt;b&gt;프론트엔드/백엔드 완벽 분리&lt;/b&gt;&lt;br /&gt;React는 클라이언트 사이드에서 UI를 구축하고, FastAPI는 서버 사이드에서 API를 제공합니다. 역할이 명확히 분리되어 유지보수가 편합니다.&lt;/li&gt;
&lt;li data-end=&quot;624&quot; data-start=&quot;517&quot;&gt;&lt;b&gt;비동기 처리 및 빠른 응답&lt;/b&gt;&lt;br /&gt;FastAPI는 Python의 비동기 기능(async/await)을 적극 활용할 수 있어, 빠르고 확장 가능한 API 서버를 만들 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;626&quot;&gt;&lt;b&gt;개발 생산성 향상&lt;/b&gt;&lt;br /&gt;React의 컴포넌트 기반 구조와 FastAPI의 자동 문서화(Swagger, Redoc)는 개발 속도를 높여줍니다.&lt;/li&gt;
&lt;li data-end=&quot;817&quot; data-start=&quot;713&quot;&gt;&lt;b&gt;타입 안정성과 자동 문서화&lt;/b&gt;&lt;br /&gt;FastAPI는 Python 타입 힌트를 바탕으로 자동으로 검증 로직과 API 문서를 생성합니다. 개발자와 클라이언트 모두에게 이점이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 React를 사용하여서 결과물의 완성도를 높여주는 ui/ux등을 만들어주기 위해 사용하였고 Fast-api는 백엔드를 전문적으로 배운 사람이 없는 팀에서 제가 그나마 빠르게 배우기 위해서 선택한 감이 없지 않아 있지만 저희가 사용하는 내용이 데이터베이스를 사용하는 분야가 없다보니 그 부분을 사용하지 않아 Fast-api가 낫다는 생각이 들어서 이 2개의 프로그램을 사용하여서 만들게 되었습니다. 아직 지속적으로 백엔드와 관련된 추가 프로그램과 프런트엔드 ui/ux를 업데이트 하여서 완성도 있는 모습을 보일 것입니다. 아직 서버가 고쳐지지 않아 이부분을 먼저 하게 되네요;;&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>fastapi</category>
      <category>JSX</category>
      <category>Python</category>
      <category>react</category>
      <category>UI</category>
      <category>UX</category>
      <category>백엔드</category>
      <category>프런트엔드</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/20</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-React%EC%99%80-Fast-api-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%B4%EC%9C%A0#entry20comment</comments>
      <pubDate>Wed, 14 May 2025 23:09:02 +0900</pubDate>
    </item>
    <item>
      <title>[캡스톤] Search Agent와 Fitting Agent 구상하기</title>
      <link>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-Search-Agent%EC%99%80-Fitting-Agent-%EA%B5%AC%EC%83%81%ED%95%98%EA%B8%B0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 캡스톤에서 작업 중인 가상피팅서비스를 위한 대규모 언어모델 개발이라는 프로젝트를 하고 있습니다. 현재 작업을 하면서 다시 우리가 정확히 어떤 프로그램을 만드는지 점검하는 시간이 필요한 것 같아서 구상도를 소개하면서 천천히 이야기해볼려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 저희의 프로젝트는 Search Agent와 Fitting Agent로 구성된 Multi Agent의 형태로 Search Agent 후에 나오는 결과물을 Fitting Agent로 보내서 사용자에게 가상으로 옷을 입혀진 모습을 보여주는 시스템입니다. 먼저 Search Agent부터 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Search Agent&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;delphi&quot; data-ke-language=&quot;delphi&quot;&gt;&lt;code&gt;flowchart TD
    start([&quot;시작&quot;]) --&amp;gt; PrelimInvest[&quot;PreliminaryInvestigation&quot;]
    PrelimInvest --&amp;gt; prelim_search[&quot;PreliminarySearch&quot;]
    prelim_search --&amp;gt; research_planning[&quot;ResearchPlanning&quot;]
    research_planning --&amp;gt; task_avail{&quot;작업이 있는가?&quot;}
    task_avail -- 예 --&amp;gt; query_analysis[&quot;DeepSearchQueryAnalysis&quot;]
    query_analysis --&amp;gt; tool_calling[&quot;DeepSearchToolCalling&quot;]
    tool_calling --&amp;gt; ref_filter[&quot;ReferenceFilter&quot;]
    ref_filter --&amp;gt; research_planning
    task_avail -- 아니오 --&amp;gt; report[&quot;ReportCompilation&quot;]
    report --&amp;gt; RCU[&quot;final_report&quot;]
    RCU --&amp;gt; PRE[&quot;product_recommendation&quot;]
    PRE --&amp;gt; US[&quot;user_selection&quot;]
    US --&amp;gt; Fit[&quot;Fitting_Agent&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;0단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앞의 체형분석과 유저의 인풋으로부터 유저정보를 받음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(체형정보, 키, 피부톤, 등등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유저의 쿼리를 받음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(IT회사 자율복장 면접에 입고 갈만한 나에게 어울리는 옷 추천)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PreliminaryInvestigation Node
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿼리와 유저정보를 바탕으로 llm이 알지 못하는 정보를 채우기 위한 노드로 배경지식을 쌓고(by search Tool), 그를 통해 초기 조사 방향을 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저 쿼리에 신조어나 llm이 알지못하는 정보를 채우기 위함, 필요 없다면 노드를 건너 뜀.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ResearchPlanning Node
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저정보, 쿼리, 사전 배경지식을 바탕으로 계획을 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 섹션으로 나누어 계획 생성 (섹션 생성)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT회사 면접에서 선호하는 상의 스타일을 조사하세요.&lt;/li&gt;
&lt;li&gt;자유 복장 면접에서 피해야 할 스타일을 조사하세요.&lt;/li&gt;
&lt;li&gt;면접에 적합한 비즈니스 상의 종류를 조사하세요.&lt;/li&gt;
&lt;li&gt;주요 남성 의류 브랜드의 비즈니스 상의 제품을 조사하세요.&lt;/li&gt;
&lt;li&gt;각 브랜드별 상의의 스타일, 디자인, 소재, 가격대, 사이즈, 컬러 정보를 조사하세요.&lt;/li&gt;
&lt;li&gt;각 제품의 제조사 정보, 상세 소재 구성, 관리 방법을 조사하세요.&lt;/li&gt;
&lt;li&gt;각 제품에 대한 사용자 리뷰 및 평가를 분석하여 장단점을 파악하세요.&lt;/li&gt;
&lt;li&gt;패션 전문가 또는 관련 블로거의 비즈니스 캐주얼 상의 제품 평가 및 추천 의견을 조사하세요.&lt;/li&gt;
&lt;li&gt;각 제품의 가격 대비 가치를 분석하고 유사 제품과 비교하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;research_unit_execution Node
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업이 있는가?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;current_task, incomplete_tasks, completed_tasks로 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2단계에서 생성된 계획을 순서대로 하나씩 조사함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DeepSearch QueryAnalysis
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 계획에 맞는 작업을 수행하기 위해서 Agent ReAct 구조로 서브그래프를 돌림&lt;/li&gt;
&lt;li&gt;검색, 뉴스, Url 요약 툴 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba2e97/btsNQwW8Jpy/WqL6kd4CXFIcBnfRrOHkz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba2e97/btsNQwW8Jpy/WqL6kd4CXFIcBnfRrOHkz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba2e97/btsNQwW8Jpy/WqL6kd4CXFIcBnfRrOHkz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba2e97%2FbtsNQwW8Jpy%2FWqL6kd4CXFIcBnfRrOHkz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;260&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 출처중에서 reference_filter Node를 거쳐서 원하는 작업과 관련되지 않는 출처의 정보는 State에서 제거 - 관련되지 않는 이유 Metadata로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;report_compilation Node
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주제, 유저정보, 작업, 출처를 바탕으로 최종 보고서 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Product Recommendation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Naver Shopping Tool을 활용하여 보고서에서 유저와 가장 알맞는 상품정보를 얻고 이미지, 가격, 제품명, url등을 추출&lt;/li&gt;
&lt;li&gt;&amp;rarr; 피팅 에이전트에 Image Url 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로는 Fitting Agent의 구상도를 보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Fitting Agent&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;delphi&quot; data-ke-language=&quot;delphi&quot;&gt;&lt;code&gt;flowchart TD
    %% 시작점
    START(User Upper Body Image + Product Image):::highlightClass --&amp;gt; COMFY[ComfyUI Virtual Try-on]

    %% 첫 번째 피팅 시도
    COMFY --&amp;gt; VLM_CHECK{VLM Quality Check}:::checkClass

    %% 평가 및 분기
    VLM_CHECK --&amp;gt;|Good Fitting| FINAL_RESULT[Final Fitting Result]:::outputClass
    VLM_CHECK --&amp;gt;|Poor Fitting| IMG2IMG[IMG2IMG Processing]:::processClass

    %% 프롬프트 수정 및 재처리
    IMG2IMG --&amp;gt; PROMPT_ADJUST[Adjust Prompts]:::adjustClass
    PROMPT_ADJUST --&amp;gt; RETRY_COMFY[Retry ComfyUI with Modified Prompt]

    %% 두 번째 평가
    RETRY_COMFY --&amp;gt; VLM_CHECK2{VLM Quality Check}:::checkClass

    %% 결과 처리
    VLM_CHECK2 --&amp;gt;|Good Fitting| FINAL_RESULT
    VLM_CHECK2 --&amp;gt;|Still Poor Fitting| MAX_ATTEMPTS{Max Attempts?}:::decisionClass

    %% 최대 시도 확인
    MAX_ATTEMPTS --&amp;gt;|Yes| BEST_RESULT[Best Available Result]:::compromiseClass
    MAX_ATTEMPTS --&amp;gt;|No| PROMPT_ADJUST

    %% 최종 결과
    BEST_RESULT --&amp;gt; FINAL_RESULT
    FINAL_RESULT --&amp;gt; OUTPUT(Output to User):::highlightClass

    %% 클래스 정의
    classDef highlightClass fill:#ffcccc,stroke:#ff0000,stroke-width:3px,font-weight:bold
    classDef checkClass fill:#ffe6cc,stroke:#d79b00,stroke-width:2px,shape:diamond
    classDef processClass fill:#d5e8d4,stroke:#82b366,stroke-width:2px
    classDef adjustClass fill:#fff2cc,stroke:#d6b656,stroke-width:2px
    classDef outputClass fill:#dae8fc,stroke:#6c8ebf,stroke-width:2px
    classDef decisionClass fill:#e1d5e7,stroke:#9673a6,stroke-width:2px
    classDef compromiseClass fill:#f8cecc,stroke:#b85450,stroke-width:2px&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;VLM Quality Check (VLM 품질 검사)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ComfyUI가 처리한 가상 피팅 결과를 &lt;b&gt;VLM 품질 검사&lt;/b&gt;(VLM Quality Check)로 평가합니다. 이 단계에서 피팅이 잘 맞는지, 아니면 수정이 필요한지 평가를 하려 했으나 학교 서버의 문제로 인해서 gemini api를 활용하여서 제작하려고 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;피팅 평가 및 분기&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Good Fitting&lt;/b&gt; (좋은 피팅) 경우, 가상 피팅이 잘 맞았다고 판단되면 &lt;b&gt;최종 결과&lt;/b&gt;(Final Fitting Result)로 넘어갑니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Poor Fitting&lt;/b&gt; (피팅이 좋지 않은 경우), 피팅을 개선하기 위해 &lt;b&gt;IMG2IMG 처리&lt;/b&gt; 단계로 넘어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Max Attempts (최대 시도 횟수 확인)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대 시도 횟수에 도달했는지 여부를 확인합니다. 최대 횟수에 도달한 경우에는 &lt;b&gt;최선의 결과&lt;/b&gt;(Best Available Result)를 제공하며, 더 이상 수정하지 않고 종료합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 캡스톤을 하면서 문제들이 많이 생기고 있으면서 아직 많이 멀었다는 생각을 하게 됩니다. 하지만 포기하지 않고 나아가면 프로젝트를 성공시킬수 있다는 마음가짐으로 앞으로 나아가 볼것입니다. 서버의 문제로 제작하려던 Fitting agent 부분의 공백이 생겨서 프런트엔드를 먼저 작업하는 방향으로 정해졌습니다.&lt;/p&gt;</description>
      <category>캡스톤</category>
      <category>deepsearch queryanalysis</category>
      <category>multi agent</category>
      <category>preliminaryinvestigation</category>
      <category>VLM</category>
      <category>vlm quality check</category>
      <category>캡스톤</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/19</guid>
      <comments>https://k777agent.tistory.com/entry/%EC%BA%A1%EC%8A%A4%ED%86%A4-Search-Agent%EC%99%80-Fitting-Agent-%EA%B5%AC%EC%83%81%ED%95%98%EA%B8%B0#entry19comment</comments>
      <pubDate>Thu, 8 May 2025 18:43:00 +0900</pubDate>
    </item>
    <item>
      <title>CatVTON 설치 방법</title>
      <link>https://k777agent.tistory.com/entry/CatVTON-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h1 data-end=&quot;203&quot; data-start=&quot;162&quot;&gt;  CatVTON 설치 및 실행 가이드 (Zheng Chong 버전)&lt;/h1&gt;
&lt;blockquote data-end=&quot;239&quot; data-start=&quot;205&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;239&quot; data-start=&quot;207&quot; data-ke-size=&quot;size16&quot;&gt;&quot;복잡한 구성 없이도 고품질 가상 피팅을 경험하세요!&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;398&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;CatVTON은 복잡한 구조 없이도 높은 품질의 가상 피팅(Virtual Try-On)을 가능하게 하는 최신 딥러닝 모델입니다. 이 가이드에서는 &lt;b&gt;ComfyUI 기반 설치&lt;/b&gt;와 &lt;b&gt;Gradio 앱 실행&lt;/b&gt; 두 가지 방법을 통해 CatVTON을 설치하고 실행하는 방법을 안내합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;419&quot; data-start=&quot;405&quot; data-ke-size=&quot;size26&quot;&gt;  사전 준비 사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;538&quot; data-start=&quot;421&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;447&quot; data-start=&quot;421&quot;&gt;&lt;b&gt;Python 3.8 ~ 3.10&lt;/b&gt; 권장&lt;/li&gt;
&lt;li data-end=&quot;485&quot; data-start=&quot;448&quot;&gt;&lt;b&gt;CUDA 지원 GPU&lt;/b&gt; (최소 6GB, 8GB 이상 권장)&lt;/li&gt;
&lt;li data-end=&quot;498&quot; data-start=&quot;486&quot;&gt;&lt;b&gt;Git&lt;/b&gt; 설치&lt;/li&gt;
&lt;li data-end=&quot;538&quot; data-start=&quot;499&quot;&gt;&lt;b&gt;CUDA 및 cuDNN&lt;/b&gt; 설치 (NVIDIA GPU 사용 시)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;567&quot; data-start=&quot;545&quot; data-ke-size=&quot;size26&quot;&gt;  1. ComfyUI 기반 설치&lt;/h2&gt;
&lt;h3 data-end=&quot;588&quot; data-start=&quot;569&quot; data-ke-size=&quot;size23&quot;&gt;1-1. ComfyUI 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1746087558470&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/comfyanonymous/ComfyUI.git
cd  ComfyUI&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;694&quot; data-start=&quot;670&quot; data-ke-size=&quot;size23&quot;&gt;1-2. CatVTON 플러그인 설치&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087613349&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd custom_nodes
wget https://github.com/Zheng-Chong/CatVTON/releases/download/ComfyUI/ComfyUI-CatVTON.zip
unzip ComfyUI-CatVTON.zip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;856&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;856&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;또는, Git을 통해 설치(혹자는 이방법을 추천합니다.):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087629383&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/chflame163/ComfyUI_CatVTON_Wrapper.git&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;958&quot; data-start=&quot;939&quot; data-ke-size=&quot;size23&quot;&gt;1-3. 의존성 패키지 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1746087661423&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ComfyUI_CatVTON_Wrapper pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;1051&quot; data-start=&quot;1032&quot; data-ke-size=&quot;size23&quot;&gt;1-4. 모델 파일 다운로드&lt;/h3&gt;
&lt;p data-end=&quot;1125&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size16&quot;&gt;모델 파일을 다운로드하여 ComfyUI/models/CatVTON 디렉토리에 저장합니다. 해당 디렉토리가 없다면 생성해주세요.&lt;/p&gt;
&lt;h3 data-end=&quot;1146&quot; data-start=&quot;1127&quot; data-ke-size=&quot;size23&quot;&gt;1-5. ComfyUI 실행&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087683557&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ../../ python main.py&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1246&quot; data-start=&quot;1186&quot; data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서 http://localhost:8188에 접속하여 ComfyUI 인터페이스를 확인합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1265&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size23&quot;&gt;1-6. 워크플로우 로드&lt;/h3&gt;
&lt;p data-end=&quot;1328&quot; data-start=&quot;1267&quot; data-ke-size=&quot;size16&quot;&gt;catvton_workflow.json 파일을 다운로드하여 ComfyUI 웹페이지에 드래그 앤 드롭합니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1436&quot; data-start=&quot;1330&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;1436&quot; data-start=&quot;1332&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 주의사항: Windows 환경에서 문제가 발생할 경우, &lt;a href=&quot;https://github.com/Zheng-Chong/CatVTON/issues/8&quot; data-end=&quot;1428&quot; data-start=&quot;1370&quot;&gt;issue#8&lt;/a&gt;을 참고하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250413_083227.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blTbQB/btsNHQVWFnj/keSKtNsErdAakw11GvD4l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blTbQB/btsNHQVWFnj/keSKtNsErdAakw11GvD4l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blTbQB/btsNHQVWFnj/keSKtNsErdAakw11GvD4l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblTbQB%2FbtsNHQVWFnj%2FkeSKtNsErdAakw11GvD4l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-filename=&quot;20250413_083227.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1463&quot; data-start=&quot;1443&quot; data-ke-size=&quot;size26&quot;&gt;  2. Gradio 앱 실행&lt;/h2&gt;
&lt;h3 data-end=&quot;1488&quot; data-start=&quot;1465&quot; data-ke-size=&quot;size23&quot;&gt;2-1. CatVTON 저장소 클론&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087731099&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/Zheng-Chong/CatVTON.git cd CatVTON&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1587&quot; data-start=&quot;1567&quot; data-ke-size=&quot;size23&quot;&gt;2-2. Conda 환경 설정&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087740295&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda create -n catvton python=3.9 conda activate catvton pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1712&quot; data-start=&quot;1692&quot; data-ke-size=&quot;size23&quot;&gt;2-3. Gradio 앱 실행&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087751923&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CUDA_VISIBLE_DEVICES=0 python app.py --output_dir=&quot;resource/demo/output&quot; --mixed_precision=&quot;bf16&quot; --allow_tf32&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1896&quot; data-start=&quot;1838&quot; data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서 제공되는 링크를 통해 Gradio 인터페이스에 접속하여 가상 피팅을 체험할 수 있습니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1981&quot; data-start=&quot;1898&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;1981&quot; data-start=&quot;1900&quot; data-ke-size=&quot;size16&quot;&gt;  참고사항: bf16 정밀도를 사용할 경우, 1024x768 해상도의 결과를 생성하는 데 약 8GB의 VRAM이 필요합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2008&quot; data-start=&quot;1988&quot; data-ke-size=&quot;size26&quot;&gt;  3. 데이터 준비 및 추론&lt;/h2&gt;
&lt;h3 data-end=&quot;2028&quot; data-start=&quot;2010&quot; data-ke-size=&quot;size23&quot;&gt;3-1. 데이터셋 다운로드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2137&quot; data-start=&quot;2030&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2082&quot; data-start=&quot;2030&quot;&gt;&lt;a href=&quot;https://github.com/shadow2496/VITON-HD&quot; data-end=&quot;2082&quot; data-start=&quot;2032&quot;&gt;VITON-HD&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;2137&quot; data-start=&quot;2083&quot;&gt;&lt;a href=&quot;https://github.com/aimagelab/dress-code&quot; data-end=&quot;2137&quot; data-start=&quot;2085&quot;&gt;DressCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2158&quot; data-start=&quot;2139&quot; data-ke-size=&quot;size23&quot;&gt;3-2. 디렉토리 구조 예시&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1746087828087&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data/ 
├── train/ 
│ 	├── images/ 
│ 	├── cloth/ 
│ 	└── mask/ 
└── test/ 
	├── images/ 
	├── cloth/ 
	└── mask/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2300&quot; data-start=&quot;2286&quot; data-ke-size=&quot;size23&quot;&gt;3-3. 추론 실행&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2515&quot; data-start=&quot;2501&quot; data-ke-size=&quot;size26&quot;&gt;  4. 추가 정보&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2796&quot; data-start=&quot;2517&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2592&quot; data-start=&quot;2517&quot;&gt;&lt;b&gt;공식 저장소&lt;/b&gt;: &lt;a href=&quot;https://github.com/Zheng-Chong/CatVTON&quot; data-end=&quot;2592&quot; data-start=&quot;2531&quot;&gt;Zheng-Chong/CatVTON&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;2679&quot; data-start=&quot;2593&quot;&gt;&lt;b&gt;Hugging Face 모델&lt;/b&gt;: &lt;a data-end=&quot;2679&quot; data-start=&quot;2616&quot;&gt;zhengchong/CatVTON&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;2796&quot; data-start=&quot;2680&quot;&gt;&lt;b&gt;논문&lt;/b&gt;: &lt;a href=&quot;https://arxiv.org/abs/2407.15886&quot; data-end=&quot;2796&quot; data-start=&quot;2690&quot;&gt;Concatenation Is All You Need for Virtual Try-On with Diffusion Models&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>캡스톤</category>
      <category>catvton</category>
      <category>ComfyUI</category>
      <category>Gradio</category>
      <category>Python</category>
      <category>캡스톤</category>
      <author>k777agent</author>
      <guid isPermaLink="true">https://k777agent.tistory.com/18</guid>
      <comments>https://k777agent.tistory.com/entry/CatVTON-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95#entry18comment</comments>
      <pubDate>Thu, 1 May 2025 17:29:13 +0900</pubDate>
    </item>
  </channel>
</rss>