<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hyejun CSlog</title>
    <link>https://hyejuncoding.tistory.com/</link>
    <description>  ewha cse</description>
    <language>ko</language>
    <pubDate>Tue, 28 Jul 2026 03:27:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>rngPwns</managingEditor>
    <image>
      <title>hyejun CSlog</title>
      <url>https://tistory1.daumcdn.net/tistory/6934167/attach/fa53ca1043cc4635a343021e83a80c62</url>
      <link>https://hyejuncoding.tistory.com</link>
    </image>
    <item>
      <title>2025 전국 대학생 SW창업 아이디어톤 장려상</title>
      <link>https://hyejuncoding.tistory.com/193</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;25.10.27~25.11. 29&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;1929&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RmmXs/dJMcaibltKj/o5dwaBiKwWjk3VnB67sHV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RmmXs/dJMcaibltKj/o5dwaBiKwWjk3VnB67sHV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RmmXs/dJMcaibltKj/o5dwaBiKwWjk3VnB67sHV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRmmXs%2FdJMcaibltKj%2Fo5dwaBiKwWjk3VnB67sHV0%2Fimg.jpg&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;1364&quot; height=&quot;1929&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;1929&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;졸업프로젝트 handDoc를 기반으로 예선&amp;middot;본선 총 2회의 창업 보고서를 작성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 구조, 기술 구현 내용, 시장 문제 정의를 체계적으로 정리하고, 결선 발표용 자료의 흐름을 구성했습니다.&lt;/p&gt;</description>
      <category>대외활동/공모전 &amp;middot; 대회</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/193</guid>
      <comments>https://hyejuncoding.tistory.com/193#entry193comment</comments>
      <pubDate>Wed, 25 Feb 2026 16:43:25 +0900</pubDate>
    </item>
    <item>
      <title>2025 신촌 대학 연합 SW 창업 경진대회 은상</title>
      <link>https://hyejuncoding.tistory.com/192</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;25.10.30~25.11. 29&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d48Scm/dJMcaih5oGw/YqvN0k9eB2R8zef4lKHFU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d48Scm/dJMcaih5oGw/YqvN0k9eB2R8zef4lKHFU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d48Scm/dJMcaih5oGw/YqvN0k9eB2R8zef4lKHFU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd48Scm%2FdJMcaih5oGw%2FYqvN0k9eB2R8zef4lKHFU1%2Fimg.jpg&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;570&quot; height=&quot;806&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 졸업프로젝트 handDoc를 기반으로 창업 보고서를 작성했습니다. 서비스 구조와 기술 구현 내용, 시장 문제 정의 및 해결 전략을 정리했고, 결선 발표용 PPT 제작과 발표 스토리라인을 구성했습니다. 디자이너와 협업해 부스 운영용 배너&amp;middot;포스터를 제작하고, 결선 발표 질의응답 진행 및 부스 운영을 통해 심사위원과 관람객에게 서비스를 설명했습니다.&lt;/p&gt;</description>
      <category>대외활동/공모전 &amp;middot; 대회</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/192</guid>
      <comments>https://hyejuncoding.tistory.com/192#entry192comment</comments>
      <pubDate>Wed, 25 Feb 2026 16:40:59 +0900</pubDate>
    </item>
    <item>
      <title>[handDoc] 25-2 Ewha Capstone Design 졸업프로젝트 대상</title>
      <link>https://hyejuncoding.tistory.com/191</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;25.03.03~25.12.18&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v83Gl/dJMcabJ4bA8/K1ecpPnuFni6Icyaop1Gzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v83Gl/dJMcabJ4bA8/K1ecpPnuFni6Icyaop1Gzk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v83Gl/dJMcabJ4bA8/K1ecpPnuFni6Icyaop1Gzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv83Gl%2FdJMcabJ4bA8%2FK1ecpPnuFni6Icyaop1Gzk%2Fimg.jpg&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;584&quot; height=&quot;827&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;827&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;청각장애인 대상 수어&amp;middot;음성 변환 진료 웹 서비스 handDoc 개발 3명의 팀원 중 백엔드, AI 모델 서빙(FastAPI/Python), 클라우드 배포 및 운영을 담당했습니다. AWS 환경에서 FastAPI 기반 서 비스 배포와 인프라 구조 설계를 맡았으며, 프론트엔드 WebRTC 연동 및 일부 API 연결을 통해 서비스 흐름을 완성했습니다.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/EWHA 캡스톤 졸업프로젝트</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/191</guid>
      <comments>https://hyejuncoding.tistory.com/191#entry191comment</comments>
      <pubDate>Wed, 25 Feb 2026 16:38:59 +0900</pubDate>
    </item>
    <item>
      <title>9th Open CloudPlatform (K-PaaS) 공모전 동상(OPA 의장상)</title>
      <link>https://hyejuncoding.tistory.com/190</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;25.10.26 ~ 25.11.19&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개방형 클라우드 플랫폼(K-PaaS) 활용 공모전에 참여하여 동상(오픈 클라우드 플랫폼 얼라이언스&amp;nbsp;의장상) 을 수상하였습니다.&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-origin-width=&quot;798&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o666X/dJMcad16v6a/uRjbhFL6VpTu6KQtwXIRwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o666X/dJMcad16v6a/uRjbhFL6VpTu6KQtwXIRwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o666X/dJMcad16v6a/uRjbhFL6VpTu6KQtwXIRwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo666X%2FdJMcad16v6a%2FuRjbhFL6VpTu6KQtwXIRwk%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;798&quot; height=&quot;1120&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1120&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;졸업프로젝트 handDoc를 기반으로 한 보고서를 작성하고, 기존 AWS 인프라를 Kubernetes 환경으로 마이그레이션하는 역할을 전담했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod, Service, Ingress 구조를 구성하며 Ingress 설정 오류, WebSocket 연결 문제, CORS 이슈를 로그 기반으로 분석하여 해결했고, 클러스터 환경에서의 서비스 운영 경험을 쌓았습니다.&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;&amp;nbsp;&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-origin-width=&quot;570&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4jdS3/dJMcajabXGp/OH5e3UkpqFT0JFlkuF1IT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4jdS3/dJMcajabXGp/OH5e3UkpqFT0JFlkuF1IT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4jdS3/dJMcajabXGp/OH5e3UkpqFT0JFlkuF1IT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4jdS3%2FdJMcajabXGp%2FOH5e3UkpqFT0JFlkuF1IT1%2Fimg.jpg&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;570&quot; height=&quot;806&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>대외활동/공모전 &amp;middot; 대회</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/190</guid>
      <comments>https://hyejuncoding.tistory.com/190#entry190comment</comments>
      <pubDate>Wed, 25 Feb 2026 16:36:29 +0900</pubDate>
    </item>
    <item>
      <title>AWS Community Builders Day 2026 회고</title>
      <link>https://hyejuncoding.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 기회로&lt;span style=&quot;color: #1e1e23;&quot;&gt;&amp;nbsp;AWS Community Builders Day 2026&lt;/span&gt;에 참여하게 되었다. 생각보다 많은 Hero분들이 있었고, 현업의 관점에서 AWS 의 최신 기술과 적용에 대해 알아볼 수 있었던 좋은 기회였다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pZ5DK/dJMcaca7g02/3Fp7GHY15kerYBU12gvLKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pZ5DK/dJMcaca7g02/3Fp7GHY15kerYBU12gvLKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pZ5DK/dJMcaca7g02/3Fp7GHY15kerYBU12gvLKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpZ5DK%2FdJMcaca7g02%2F3Fp7GHY15kerYBU12gvLKk%2Fimg.jpg&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;1125&quot; height=&quot;2000&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;시간표에서 각 시간마다 3개의 강연이 열렸고, 셋 중 하나를 선택하여 강의실을 이동하며 강연을 듣는 형식이었다.&lt;br&gt;그 외에도 중간중간 네트워킹 시간이 있어 현업자들과 AWS 에 대한 인사이트를 공유할 수 있었다.&lt;br&gt;&amp;nbsp;&lt;br&gt;내가 선택한 강의에 대한 간단한 요약을 적어봤다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;OPENING&lt;/h1&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;AWS community builder 가 되어라 - 히어로에 합류하면 좋은 점들. 그리고 간단한 오프닝이 진행되었다.&lt;/p&gt;&lt;h1&gt;SECTION 1&lt;/h1&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;Amazon Kiro(AI)를 활용해서 AWS 공부를 해 보자!&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 이용해 빠르게 학습하고 박학다식해져라&lt;br&gt;I자보다 T자형 개발자가 되어라.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;SDD(Spec Driven Development): 만들어진 스펙에 의거 개발 진행, 만들어진 뒤 수정시에도 스펙 지속적 참고&lt;br&gt;→ 요구사항 미리 정의, 개발중 재작업 방지. 코딩 전 명확한 체크 포인트 제공, 계획 단계 모호함 해결&lt;br&gt;kiro로 학습자료 만들어봐라~&lt;/p&gt;&lt;h1&gt;SECTION 2&lt;/h1&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS Lambda&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Lambda - 한 번에 다 start보다 2개씩 나눠서 start 하면 cold start 발생 적어서 더 효율적&lt;br&gt;Lambda Managed Instances : 내가 선택한 EC2 위에서 돌릴 수 있음&lt;br&gt;Lambda durable functions&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;중간에 끊기지 않고 input → output(save, pause 최대 1년)&lt;/li&gt;&lt;li&gt;병렬적으로 수행 가능. 다단계 워크플로우. 하나의 Lambda에서 다른 Lambda꺼 가져올 수 있음&lt;/li&gt;&lt;li&gt;Lambda가 30초마다 깼다 잤다 할 수 있어서 Lambda의 실제 운영시간은 매우 적음(몇초) → 비용도 매우 낮음&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;SECTION 3&lt;/h1&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;오픈소스를 활용한 AWS 보안&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;반복되는 보안사고패턴: 퍼블릭 S3 버킷 노출, 0.0.0.0/0 무제한 보안그룹 개방, 암호화되지 않은 스토리지&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;Prowler의 역할과 기능&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;핵심기능: 표준 컴플라이언스 진단 - 자동 점검 수행 , 수백개의 계정, 전체리전을 단일 실행으로 일괄 점검&lt;br&gt;주기적 자동 실행 및 스케줄링 실행지원&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cloud Custodian의 역할과 기능&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;핵심기능: 보안규칙을 코드로 정의, 이벤트 기반 자동 통제, 다양한 대응 조치&lt;br&gt;운영포인트: 서버리스운영, 최소권한원칙, 태그기반 예외처리&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;전체 논리 아키텍처&lt;/b&gt;&lt;br&gt;보안기준정의 → 주기적진단 → 반복 fail 식별 → 정책화(code) → 실시간 통제&lt;br&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;/li&gt;&lt;li&gt;불가피하면 워크로드, 진단계정 두 개라도 분리하기&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;보통 eventbridge, lamda로 연결&lt;br&gt;SCP(헌법), IAM(신분증&amp;amp;열쇠) , Custodian(교통경찰) 으로 구성&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;SCP는 최소로. IAM도 최소권한부여(첨에 full admin 주면 서비스가 점점 늘어나서 막을 수 없어짐, 처음에 막아놓고 하나씩 허용하기)&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;br&gt;&lt;b&gt;Prowler: status, 현재 위치를 투명하게 보여줌&lt;/b&gt;&lt;br&gt;&lt;b&gt;Custodian: control, 안전경로를 이탈 x&lt;/b&gt;&lt;br&gt;&lt;b&gt;Governance&lt;/b&gt;&lt;/p&gt;&lt;h1&gt;SECTION 4&lt;/h1&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS 이용한 사내 패키지 레지스토리 만들기&lt;/b&gt;&lt;br&gt;Code Artifact : 다양한 언어를 공유할 수 있는 AWS 패키지 서비스&lt;br&gt;사내 라이브러리 개발 및 배포 가능&lt;br&gt;문제가 있는 오픈소스 라이브러리는 패치하여 배포 가능&lt;br&gt;특정 파이썬 버전, 운체/CPU에 존재하지 않는 wheel은 채워서 배포 가능&lt;br&gt;모든 패키지 다운로드가 Code Artifact 거쳐서 가시성 확보&lt;br&gt;도커파일 등 인증을 위한 복잡한 설정 필요했음&lt;br&gt;→ 패키지 설치를 간단히 해 보자.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;마지막에 클로징 세션에서 퀴즈 등 재밌는 행사가 진행됐지만, 시간 관계상 아쉽게도 참여하지 못했다.&lt;br&gt;중간에 무려 햄버거!! 도 주고, AWS 관련 다양한 굿즈와 스티커, 우산을 주셔서 참가비 10000원이 전혀 아깝지 않았다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fjuk6/dJMcafeDNRI/MLQgHZszc0tUPBskk8b9j0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fjuk6/dJMcafeDNRI/MLQgHZszc0tUPBskk8b9j0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fjuk6/dJMcafeDNRI/MLQgHZszc0tUPBskk8b9j0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFjuk6%2FdJMcafeDNRI%2FMLQgHZszc0tUPBskk8b9j0%2Fimg.jpg&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;1125&quot; height=&quot;1500&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 인사이트를 얻은, 또 우리나라에 이렇게 인프라에 열정적인 사람들이 많다는 점을 한 번 더 일깨워 준 행사였다.&lt;br&gt;이 글을 보는 사람이 있다면, 본인이 인프라나 클라우드, AWS, 그리고 개발에 관심이 있다면 해당 행사에 참여해보는 것을 강력하게 추천한다 !!&lt;/p&gt;</description>
      <category>대외활동/강연</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/189</guid>
      <comments>https://hyejuncoding.tistory.com/189#entry189comment</comments>
      <pubDate>Wed, 25 Feb 2026 16:17:06 +0900</pubDate>
    </item>
    <item>
      <title>[MoaMoa] MyPage &amp;middot; MoaLetter 프론트엔드 구현과 Vercel 배포 트러블슈팅</title>
      <link>https://hyejuncoding.tistory.com/188</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buJpKP/dJMcabQwMY7/JKWktKx7VH6Og6XfYlPBKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buJpKP/dJMcabQwMY7/JKWktKx7VH6Og6XfYlPBKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buJpKP/dJMcabQwMY7/JKWktKx7VH6Og6XfYlPBKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuJpKP%2FdJMcabQwMY7%2FJKWktKx7VH6Og6XfYlPBKk%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;705&quot; height=&quot;391&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;207&quot; data-start=&quot;197&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 개요&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;343&quot; data-start=&quot;225&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;MoaMoa&lt;/b&gt;는 8기 UMC Web 파트로 참여한 &lt;b&gt;2개월간의 데모데이 프로젝트&lt;/b&gt;이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PM 1명, 디자이너 1명, FE 3명, BE 4명으로 총 9명이 참여해 기능 범위와 화면 수가 많은 편이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;343&quot; data-start=&quot;225&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;448&quot; data-start=&quot;345&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트엔드는 React 기반 SPA로 구성되어 있으며, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Vercel(PaaS) 환경에 배포해 실제 운영 환경에서도 서비스가 안정적으로 동작하도록 만드는 역할&lt;/b&gt;을 함께 담당했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;450&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스는 &lt;b&gt;친구 생일에 돈과 편지를 함께 모아 선물을 전달하는 웹앱&lt;/b&gt;으로, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기획 단계에서 pain point 정의, 타겟 유저 설정, 간단한 시장 분석 및 유사 서비스 비교를 거쳐 기능이 구체화되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;450&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;648&quot; data-start=&quot;568&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트엔드는 &lt;b&gt;아이폰 기준 웹앱 UI&lt;/b&gt;를 목표로 했고, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 사용 흐름이 중간에 끊기지 않도록 UI/UX 구현과 배포 안정화에 집중했다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;806&quot; data-start=&quot;650&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;681&quot; data-start=&quot;650&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기준 디바이스&lt;/b&gt;: iPhone 13 / 14&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;726&quot; data-start=&quot;682&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레이아웃 규칙&lt;/b&gt;: max-width 393px, 세로 스크롤만 허용&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;779&quot; data-start=&quot;727&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기술 스택&lt;/b&gt;: React, TypeScript, Vite, Tailwind CSS&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;806&quot; data-start=&quot;780&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;배포 환경&lt;/b&gt;: Vercel (pnpm)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC0T0d/dJMcafk6tcH/RO73MZKF3fEj6fYnvkjNK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC0T0d/dJMcafk6tcH/RO73MZKF3fEj6fYnvkjNK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC0T0d/dJMcafk6tcH/RO73MZKF3fEj6fYnvkjNK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC0T0d%2FdJMcafk6tcH%2FRO73MZKF3fEj6fYnvkjNK0%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;1186&quot; height=&quot;663&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttroL/dJMb99LWo6r/kkyJq91taBBwKa8YdahQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttroL/dJMb99LWo6r/kkyJq91taBBwKa8YdahQkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttroL/dJMb99LWo6r/kkyJq91taBBwKa8YdahQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttroL%2FdJMb99LWo6r%2FkkyJq91taBBwKa8YdahQkk%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;1153&quot; height=&quot;714&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EGiW5/dJMcabXiUDb/LlYRaiDf0qvNz7Hjktibx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EGiW5/dJMcabXiUDb/LlYRaiDf0qvNz7Hjktibx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EGiW5/dJMcabXiUDb/LlYRaiDf0qvNz7Hjktibx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEGiW5%2FdJMcabXiUDb%2FLlYRaiDf0qvNz7Hjktibx1%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;1168&quot; height=&quot;640&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnIuG/dJMcai28192/QwBGz550Gmydp0tbgI5Ei1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnIuG/dJMcai28192/QwBGz550Gmydp0tbgI5Ei1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnIuG/dJMcai28192/QwBGz550Gmydp0tbgI5Ei1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnnIuG%2FdJMcai28192%2FQwBGz550Gmydp0tbgI5Ei1%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;1054&quot; height=&quot;537&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;537&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;&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;1167&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJABUQ/dJMcahb8tp4/8y0fo2tjSSJ2snikggGrQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJABUQ/dJMcahb8tp4/8y0fo2tjSSJ2snikggGrQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJABUQ/dJMcahb8tp4/8y0fo2tjSSJ2snikggGrQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJABUQ%2FdJMcahb8tp4%2F8y0fo2tjSSJ2snikggGrQK%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;1167&quot; height=&quot;618&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;618&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDK7tc/dJMcad1PXab/Yped77diUJwLPCAwQ49REk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDK7tc/dJMcad1PXab/Yped77diUJwLPCAwQ49REk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDK7tc/dJMcad1PXab/Yped77diUJwLPCAwQ49REk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDK7tc%2FdJMcad1PXab%2FYped77diUJwLPCAwQ49REk%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;982&quot; height=&quot;739&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;739&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 style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;208&quot; data-end=&quot;324&quot; 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;h2 data-end=&quot;496&quot; data-start=&quot;488&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맡은 역할&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;989&quot; data-start=&quot;823&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;841&quot; data-start=&quot;823&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;MyPage 전체 구현&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;863&quot; data-start=&quot;842&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;MoaLetter 전체 구현&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;896&quot; data-start=&quot;864&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프론트엔드 Vercel 배포 및 배포 오류 해결&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;935&quot; data-start=&quot;897&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공용 컴포넌트 일부 구현 (Modal, Share Modal 등)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;989&quot; data-start=&quot;936&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배포 환경에서 발생한 &lt;b&gt;TypeScript / 환경변수 / 네트워크 이슈 정리 및 수정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1133&quot; data-start=&quot;991&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 팀원들의 코드 구조는 최대한 유지하면서, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;브랜치 단위로 문제를 재현 &amp;rarr; 원인 분석 &amp;rarr; 수정 가이드 정리&lt;/b&gt; 방식으로 작업했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순 UI 구현을 넘어서, &lt;b&gt;운영 환경에서 프론트엔드가 하나의 서비스로 동작하도록 만드는 과정&lt;/b&gt;을 경험했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;635&quot; data-end=&quot;706&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;713&quot; data-end=&quot;734&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. MoaLetter 구현 정리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;768&quot; data-start=&quot;759&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;핵심 목표&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;839&quot; data-start=&quot;769&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;편지 작성 &amp;rarr; 사진 선택 &amp;rarr; 꾸미기 &amp;rarr; 저장 &amp;rarr; 롤링페이퍼 확인 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체 흐름이 중간에 끊기지 않도록 구성하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZSbr0/dJMcacWcHYG/9jafSoq8GhUSKiJRCaLft0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZSbr0/dJMcacWcHYG/9jafSoq8GhUSKiJRCaLft0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZSbr0/dJMcacWcHYG/9jafSoq8GhUSKiJRCaLft0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZSbr0%2FdJMcacWcHYG%2F9jafSoq8GhUSKiJRCaLft0%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;1678&quot; height=&quot;925&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;925&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;h3 data-end=&quot;854&quot; data-start=&quot;841&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구현한 주요 화면&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;952&quot; data-start=&quot;855&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;880&quot; data-start=&quot;855&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;편지 작성 페이지 (WriteLetter)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;881&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사진 앨범 선택 / 사진 그리드 선택&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;926&quot; data-start=&quot;904&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;편지지 / 우표 / 스티커 선택 UI&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;927&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;롤링페이퍼 보기&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;938&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;편지 저장 완료 페이지&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;969&quot; data-start=&quot;959&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;969&quot; data-start=&quot;959&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구현 포인트&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;987&quot; data-start=&quot;971&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1) 사진 선택 UX&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1083&quot; data-start=&quot;988&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1009&quot; data-start=&quot;988&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앨범 리스트 &amp;rarr; &lt;b&gt;3열 그리드&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;1010&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단일 사진 선택만 허용&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1056&quot; data-start=&quot;1029&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;선택 시 어두운 오버레이 + 체크 아이콘 표시&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1083&quot; data-start=&quot;1057&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상단 &lt;b&gt;확인 버튼&lt;/b&gt;으로 작성 페이지 복귀&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1769344127604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const [selectedIndex, setSelectedIndex] = useState&amp;lt;number | null&amp;gt;(null);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1174&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1174&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복잡한 기능은 아니지만, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;u&gt;지금 내가 어떤 사진을 선택했는지&lt;/u&gt;가 즉시 보이도록&lt;/b&gt; 처리했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1174&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1673&quot; data-start=&quot;1639&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2) 기본 편지지 / 우표 미선택 시 화면 공백 문제&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1215&quot; data-start=&quot;1209&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1249&quot; data-start=&quot;1216&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1249&quot; data-start=&quot;1216&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무 것도 선택하지 않으면 화면이 비어 보이는 문제 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1257&quot; data-start=&quot;1251&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1321&quot; data-start=&quot;1258&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1765&quot; data-start=&quot;1728&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;backgroundUrl prop이 타입에 정의돼 있지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1790&quot; data-start=&quot;1766&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴포넌트 내부 fallback 처리 부재&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1329&quot; data-start=&quot;1323&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1371&quot; data-start=&quot;1330&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1351&quot; data-start=&quot;1330&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;props에 optional로 명시&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1371&quot; data-start=&quot;1352&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내부에서 기본 이미지 강제 지정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1769344155869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;backgroundUrl?: string | null;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1924&quot; data-start=&quot;1884&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1924&quot; data-start=&quot;1884&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; 사용자가 선택하지 않아도 &lt;b&gt;항상 기본 편지지가 렌더링되도록 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1443&quot; data-start=&quot;1415&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1545&quot; data-start=&quot;1524&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-end=&quot;1545&quot; data-start=&quot;1524&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3) 공용 모달 / 공유 모달&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1598&quot; data-start=&quot;1546&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1558&quot; data-start=&quot;1546&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하단 슬라이드 방식&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1574&quot; data-start=&quot;1559&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바깥 영역 클릭 시 닫힘&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1598&quot; data-start=&quot;1575&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;링크 복사 + SNS 아이콘 UI 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1658&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공용 컴포넌트로 분리해 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;MyPage / MoaLetter 양쪽에서 재사용&lt;/b&gt; 가능하도록 구성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1577&quot; data-start=&quot;1523&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;1584&quot; data-end=&quot;1602&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. MyPage 구현 정리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;1177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgiOS1/dJMcafelThZ/EzNCCPvNv1w60cQ4ztuoK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgiOS1/dJMcafelThZ/EzNCCPvNv1w60cQ4ztuoK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgiOS1/dJMcafelThZ/EzNCCPvNv1w60cQ4ztuoK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgiOS1%2FdJMcafelThZ%2FEzNCCPvNv1w60cQ4ztuoK1%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;1261&quot; height=&quot;1177&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;1177&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;h3 data-end=&quot;1692&quot; data-start=&quot;1682&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구현한 화면&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1785&quot; data-start=&quot;1693&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1703&quot; data-start=&quot;1693&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마이페이지 메인&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1712&quot; data-start=&quot;1704&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로필 수정&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1721&quot; data-start=&quot;1713&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;키워드 편집&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1729&quot; data-start=&quot;1722&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구매 내역&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1749&quot; data-start=&quot;1730&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공지 / 고객센터 / 문의 작성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1769&quot; data-start=&quot;1750&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 유저 프로필 / 위시리스트&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1785&quot; data-start=&quot;1770&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팔로우 / 언팔로우 모달&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1802&quot; data-start=&quot;1792&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1802&quot; data-start=&quot;1792&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구현 포인트&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1820&quot; data-start=&quot;1804&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1) 상태 기반 UI&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1857&quot; data-start=&quot;1821&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1831&quot; data-start=&quot;1821&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공개 / 비공개&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1839&quot; data-start=&quot;1832&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잠금 상태&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1857&quot; data-start=&quot;1840&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;토글 스위치 ON / OFF&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1912&quot; data-start=&quot;1859&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 디자인만 맞추는 것이 아니라, &lt;b&gt;상태 변경 시 UI가 즉시 반응하도록&lt;/b&gt; 구성했다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;1938&quot; data-start=&quot;1919&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-end=&quot;2349&quot; data-start=&quot;2330&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2) 모달 / 라우팅 정리&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2423&quot; data-start=&quot;2350&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2378&quot; data-start=&quot;2350&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마이페이지 내부에서 불필요한 페이지 이동 최소화&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2399&quot; data-start=&quot;2379&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확인 / 취소 동작은 모달로 처리&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2423&quot; data-start=&quot;2400&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 페이지 이동은 필요한 경우만 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2457&quot; data-start=&quot;2425&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; 사용자 흐름을 끊지 않으면서 화면 전환 비용을 줄였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2457&quot; data-start=&quot;2425&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2036&quot; data-start=&quot;2016&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. Vercel 배포 &amp;amp; 트러블슈팅&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;2529&quot; data-start=&quot;2500&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1) pnpm + package-lock 충돌&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2613&quot; data-start=&quot;2531&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pnpm 프로젝트에 package-lock.json이 남아 있어 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Vercel 빌드 단계에서 lockfile 파싱 에러 발생.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2613&quot; data-start=&quot;2531&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2621&quot; data-start=&quot;2615&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;조치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2665&quot; data-start=&quot;2622&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2646&quot; data-start=&quot;2622&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;package-lock.json 제거&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2665&quot; data-start=&quot;2647&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pnpm 기준으로 의존성 통일&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2702&quot; data-start=&quot;2667&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;빌드 환경을 명확히 고정&lt;/b&gt;해 재현 불가능한 오류 제거.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;2739&quot; data-start=&quot;2709&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;2739&quot; data-start=&quot;2709&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2) TypeScript 에러로 인한 빌드 실패&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2815&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬에서는 경고 수준이던 TS6133, TS2322 등이 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Vercel 빌드 단계에서는 전부 에러로 처리됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2815&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2823&quot; data-start=&quot;2817&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;대응&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2872&quot; data-start=&quot;2824&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2847&quot; data-start=&quot;2824&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설정으로 무시하지 않고 실제 원인 제거&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2872&quot; data-start=&quot;2848&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공용 컴포넌트 타입을 기준으로 전파 수정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2876&quot; data-start=&quot;2874&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2972&quot; data-start=&quot;2877&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2928&quot; data-start=&quot;2877&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Button의 PaddingSize, Variant, Width 타입 확장&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2972&quot; data-start=&quot;2929&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BottomNavigation 필수 props &amp;rarr; optional 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3004&quot; data-start=&quot;2974&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;빌드 타임 검증을 통과하는 코드 상태로 정리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;3050&quot; data-start=&quot;3011&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;3050&quot; data-start=&quot;3011&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3) dev에서는 정상, prod에서 로그인 404 / CORS&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3058&quot; data-start=&quot;3052&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3125&quot; data-start=&quot;3059&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3089&quot; data-start=&quot;3059&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 환경: Vite proxy(/api) 사용&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3125&quot; data-start=&quot;3090&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배포 환경: proxy 없음 &amp;rarr; /api/* 그대로 요청&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3133&quot; data-start=&quot;3127&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3205&quot; data-start=&quot;3134&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3158&quot; data-start=&quot;3134&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영 환경 기준으로 네트워크 구조 재정리&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3183&quot; data-start=&quot;3159&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 호출을 절대 URL 기반으로 통일&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3205&quot; data-start=&quot;3184&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;환경변수로 dev / prod 분리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1769344297677&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const baseURL = import.meta.env.DEV
  ? &quot;/api&quot;
  : import.meta.env.VITE_API_BASE_URL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3336&quot; data-start=&quot;3304&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3336&quot; data-start=&quot;3304&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;개발/운영 환경 차이로 인한 네트워크 오류 제거&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2792&quot; data-start=&quot;2765&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2792&quot; data-start=&quot;2765&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2819&quot; data-start=&quot;2799&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4) 로그인 직후 401 에러&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2826&quot; data-start=&quot;2820&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2883&quot; data-start=&quot;2827&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2852&quot; data-start=&quot;2827&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;토큰은 localStorage에 저장됐지만&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2883&quot; data-start=&quot;2853&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Axios 인스턴스 기본 헤더에 즉시 반영되지 않음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2891&quot; data-start=&quot;2885&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769344317398&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;localStorage.setItem('accessToken', at);
instance.defaults.headers.common.Authorization = `Bearer ${at}`;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3574&quot; data-start=&quot;3554&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; 인증 상태 전파 지연 문제 해결&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3024&quot; data-start=&quot;3009&quot; 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;h2 data-end=&quot;3601&quot; data-start=&quot;3581&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 연동 과정에서 겪은 이슈&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3717&quot; data-start=&quot;3603&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3629&quot; data-start=&quot;3603&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;401&lt;/b&gt;: 인증 토큰 반영 타이밍 문제&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3651&quot; data-start=&quot;3630&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;502&lt;/b&gt;: 백엔드 서버 불안정&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3687&quot; data-start=&quot;3652&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;500&lt;/b&gt;: 이벤트 생성 API 실패로 전체 플로우 영향&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3717&quot; data-start=&quot;3688&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;404&lt;/b&gt;: 이벤트 미생성 상태에서 연쇄 호출&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3725&quot; data-start=&quot;3719&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3817&quot; data-start=&quot;3726&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3741&quot; data-start=&quot;3726&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대부분 API 연동 완료&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3769&quot; data-start=&quot;3742&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이벤트 중심 API 일부는 백엔드 이슈로 미완&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3817&quot; data-start=&quot;3770&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한된 테스트 기간 내에서 &lt;b&gt;프론트엔드 단에서 조치 가능한 부분은 모두 정리&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;3299&quot; data-start=&quot;3292&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;3831&quot; data-start=&quot;3824&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정리하며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;154&quot; data-start=&quot;119&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 프로젝트를 통해 단순히 UI를 구현하는 역할에 그치지 않고,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;257&quot; data-start=&quot;156&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;176&quot; data-start=&quot;156&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모바일 웹 기준 레이아웃 설계&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;192&quot; data-start=&quot;177&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상태 중심 UI 구성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;210&quot; data-start=&quot;193&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공용 컴포넌트 구조 정리&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;257&quot; data-start=&quot;211&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영 환경(Vercel)에서 발생하는 실제 &lt;b&gt;빌드&amp;middot;네트워크&amp;middot;환경 이슈 해결&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;285&quot; data-start=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;까지 전반적인 프론트엔드 개발 과정을 경험했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;371&quot; data-start=&quot;287&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 프론트엔드를 하나의 서비스 단위로 바라보고, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;클라우드 환경에서 안정적으로 동작하도록 만드는 과정&lt;/b&gt;을 직접 겪은 점이 가장 큰 수확이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;494&quot; data-start=&quot;373&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2개월이라는 기간 동안 거의 매일 프로젝트에 몰입하며 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기획&amp;middot;디자인&amp;middot;프론트&amp;middot;백엔드가 동시에 움직이는 협업 환경을 경험했고,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제가 생겼을 때 각 파트가 어떻게 조율하고 해결해 나가는지를 실제로 체감할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;602&quot; data-start=&quot;496&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과적으로, &lt;b&gt;모두가 끝까지 몰입해 고민하고 개선하면 서비스는 완성된다는 것&lt;/b&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 그 과정 자체가 개발자로서 중요한 성장 경험이 된다는 점을 분명히 느낄 수 있었던 프로젝트였다 :)&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트/팀프로젝트</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/188</guid>
      <comments>https://hyejuncoding.tistory.com/188#entry188comment</comments>
      <pubDate>Sun, 25 Jan 2026 21:54:48 +0900</pubDate>
    </item>
    <item>
      <title>[Argo CD 오픈소스 기여] CLI help에 뜨는 kubectl REST 플래그가 실제로는 동작하지 않는 문제 (#25875)</title>
      <link>https://hyejuncoding.tistory.com/187</link>
      <description>&lt;h2 data-end=&quot;291&quot; data-start=&quot;270&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. Argo CD를 첫 오픈소스 기여 프로젝트로 선택한 이유&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;381&quot; data-start=&quot;293&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클라우드 엔지니어를 목표로 준비하면서 토이 프로젝트나 개인 실습보다 &lt;b&gt;실제 운영 환경에서 쓰이는 오픈소스에 직접 기여해보는 경험&lt;/b&gt;이 중요하다고 느꼈다. 그 기준에서 Argo CD는 꽤 매력적인 프로젝트였다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;569&quot; data-start=&quot;415&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;454&quot; data-start=&quot;415&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kubernetes 기반 GitOps 도구로 실무 사용 빈도가 높고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;522&quot; data-start=&quot;455&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CLI / Server / Controller / UI 역할이 비교적 명확히 분리돼 있어 코드 흐름을 추적하기 쉬우며&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;569&quot; data-start=&quot;523&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이슈와 PR에 메인테이너 피드백이 꾸준히 달려 초보 기여자도 접근 가능한 편이다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;641&quot; data-start=&quot;571&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 Argo CD 이슈 중에서도 &lt;b&gt;재현이 명확하고 영향 범위가 분명한 CLI 관련 이슈&lt;/b&gt;를 중심으로 살펴보게 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;669&quot; data-start=&quot;598&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;694&quot; data-start=&quot;648&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 선택한 이슈: CLI help에는 보이지만 실제로는 동작하지 않는 플래그&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;804&quot; data-start=&quot;696&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;696&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Issue: CLI shows kubectl REST flags (e.g. --disable-compression) that are not supported&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;804&quot; data-start=&quot;790&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Issue #25875&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;815&quot; data-start=&quot;806&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제는 간단했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;920&quot; data-start=&quot;817&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Argo CD CLI에서 -h 또는 --help를 보면 kubectl의 REST 관련 플래그들이 노출되지만, 실제로 해당 플래그를 사용하면 실행 단계에서 에러가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;920&quot; data-start=&quot;836&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-end=&quot;928&quot; data-start=&quot;922&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들면,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769326142936&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;argocd cluster -h&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;995&quot; data-start=&quot;969&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;995&quot; data-start=&quot;969&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;help 출력에는 다음과 같은 플래그가 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1068&quot; data-start=&quot;997&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1022&quot; data-start=&quot;997&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--disable-compression&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1047&quot; data-start=&quot;1023&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--client-certificate&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1064&quot; data-start=&quot;1048&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--client-key&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1083&quot; data-start=&quot;1070&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 실제로 실행하면,&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1769326189533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;argocd cluster --disable-compression list&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;p data-end=&quot;1148&quot; data-start=&quot;1125&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과는 unknown flag 에러다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1212&quot; data-start=&quot;1150&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지원하지 않으면서 help에는 노출되는 플래그&lt;/b&gt;였고, CLI 사용자 입장에서는 꽤 혼란스러운 UX였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1212&quot; data-start=&quot;1150&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7OcnU/dJMcabpthre/vn6wVSPPRCiKKjTfZLhkq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7OcnU/dJMcabpthre/vn6wVSPPRCiKKjTfZLhkq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7OcnU/dJMcabpthre/vn6wVSPPRCiKKjTfZLhkq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7OcnU%2FdJMcabpthre%2Fvn6wVSPPRCiKKjTfZLhkq0%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;2446&quot; height=&quot;1297&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccQ0FZ/dJMcai9UzdY/hGfBsfj92e9QuoNeDnYLDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccQ0FZ/dJMcai9UzdY/hGfBsfj92e9QuoNeDnYLDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccQ0FZ/dJMcai9UzdY/hGfBsfj92e9QuoNeDnYLDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccQ0FZ%2FdJMcai9UzdY%2FhGfBsfj92e9QuoNeDnYLDK%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;2446&quot; height=&quot;1192&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1192&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;h2 data-end=&quot;1248&quot; data-start=&quot;1219&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 원인 분석: 플래그 하나의 문제가 아니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1287&quot; data-start=&quot;1250&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 단순히 플래그 등록이 빠진 건가? 정도로 생각했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1287&quot; data-start=&quot;1250&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이슈 댓글과 코드를 같이 따라가다 보니, &lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1287&quot; data-start=&quot;1250&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;이건 특정 플래그 하나의 문제가 아니라 &lt;/span&gt;&lt;b&gt;CLI 초기화 구조에서 발생한 정합성 문제&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;라는 걸 알게 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1461&quot; data-start=&quot;1405&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1415&quot; data-start=&quot;1387&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 구조 이해의 출발점: 다른 기여자의 분석&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1460&quot; data-start=&quot;1417&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 이슈에서 중요한 힌트를 준 건 기여자 kwentine의 코멘트였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1474&quot; data-start=&quot;1462&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요지는 다음과 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1575&quot; data-start=&quot;1476&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1540&quot; data-start=&quot;1476&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Argo CD CLI는 일부 커맨드에서 kubectl의 persistent flags를 초기화 과정에서 복사한다&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1575&quot; data-start=&quot;1541&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 모든 커맨드가 동일한 초기화 경로를 거치지는 않는다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;1132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhvCaw/dJMb99SJaxg/QyPP85YRKOWbNSHfIssF6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhvCaw/dJMb99SJaxg/QyPP85YRKOWbNSHfIssF6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhvCaw/dJMb99SJaxg/QyPP85YRKOWbNSHfIssF6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhvCaw%2FdJMb99SJaxg%2FQyPP85YRKOWbNSHfIssF6k%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;1428&quot; height=&quot;1132&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;1132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1663&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1604&quot; data-start=&quot;1577&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다만 이 코멘트를 그대로 해답으로 쓰지는 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1622&quot; data-start=&quot;1606&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 코멘트를 출발점으로 삼아,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1691&quot; data-start=&quot;1623&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1639&quot; data-start=&quot;1623&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 코드가 어디에 있는지&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1663&quot; data-start=&quot;1640&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어떤 커맨드가 이 초기화 경로를 타는지&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1691&quot; data-start=&quot;1664&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;help 출력과 실행 경로가 어디서 갈라지는지&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1707&quot; data-start=&quot;1693&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;를 직접 코드로 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1707&quot; data-start=&quot;1693&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1743&quot; data-start=&quot;1714&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. 실제 문제 지점: InitCommand&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1764&quot; data-start=&quot;1745&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제의 코드는 다음 파일에 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1769326451794&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cmd/argocd/commands/initialize/cmd.go&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 여기서는 kubectl의 persistent flags를 가져와&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Argo CD 커맨드의 flags로 그대로 복사한다. &lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1769326467758&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flags.VisitAll(func(flag *pflag.Flag) {
    if flag.Name == &quot;server&quot; {
        return
    }
    cmd.Flags().AddFlag(flag)
})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2213&quot; data-start=&quot;2204&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 구조 때문에, &lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2213&quot; data-start=&quot;2204&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;kubectl에는 있지만 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Argo CD에서는 실제로 처리하지 않는 REST 플래그들이 &lt;/span&gt;&lt;b&gt;help 출력에는 노출되는 상황&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 발생했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2135&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;6. 문제 정리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2166&quot; data-start=&quot;2137&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 문제는 단순히 플래그 하나가 빠졌다가 아니라,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2252&quot; data-start=&quot;2168&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2187&quot; data-start=&quot;2168&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;커맨드마다 초기화 경로가 다르고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2222&quot; data-start=&quot;2188&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;help 단계에서는 kubectl 플래그를 일괄 노출하지만&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2252&quot; data-start=&quot;2223&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행 단계에서는 처리하지 못하는 플래그가 존재하는&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2284&quot; data-start=&quot;2254&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CLI 초기화 흐름의 정합성 문제&lt;/b&gt;라고 판단했다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;2567&quot; data-start=&quot;2540&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2318&quot; data-start=&quot;2291&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;7. 해결 전략: 범위를 의도적으로 제한하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2342&quot; data-start=&quot;2320&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해결 방향에는 두 가지 선택지가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2477&quot; data-start=&quot;2344&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2397&quot; data-start=&quot;2344&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 서브커맨드별로&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;i&gt;이 플래그가 실제로 지원되는지&lt;/i&gt;를 판단하도록 구조를 리팩터링&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2477&quot; data-start=&quot;2398&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;InitCommand를 통해 복사되는 kubectl REST 플래그 중 &lt;b&gt;명백히 지원되지 않는 것만 help에서 숨기기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2501&quot; data-start=&quot;2479&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1번이 더 이상적인 설계일 수는 있지만,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2568&quot; data-start=&quot;2503&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2515&quot; data-start=&quot;2503&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변경 범위가 커지고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2532&quot; data-start=&quot;2516&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CLI 전반에 영향을 주며&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2545&quot; data-start=&quot;2533&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰 부담이 커지고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2568&quot; data-start=&quot;2546&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 기여로는 리스크가 크다고 판단했다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2596&quot; data-start=&quot;2570&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이번 PR에서는 기존 구조는 유지한 채,&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;2667&quot; data-start=&quot;2598&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2667&quot; data-start=&quot;2600&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;InitCommand 기반 커맨드에서&lt;br /&gt;실제로 지원하지 않는 kubectl REST 플래그만 명시적으로 제외한다&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2680&quot; data-start=&quot;2669&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2680&quot; data-start=&quot;2669&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라는 전략을 택했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2897&quot; data-start=&quot;2886&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2897&quot; data-start=&quot;2886&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2920&quot; data-start=&quot;2904&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;8. PR 과정&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1434&quot; data-end=&quot;1481&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/argoproj/argo-cd/pull/25977&quot;&gt;https://github.com/argoproj/argo-cd/pull/25977&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1481&quot; data-start=&quot;1434&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;312&quot; data-start=&quot;267&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;376&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 이 PR은 혼자 코드 고쳐서 끝나는 작업이 아니었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 기여자와 메인테이너가 각자 다른 관점에서 피드백을 주고, 그걸 반영하면서 점점 다듬어지는 과정이었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1481&quot; data-start=&quot;1434&quot; 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;2023&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H6tjf/dJMcagj0ESg/N7fCHvq4amGGuP6G8FsK60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H6tjf/dJMcagj0ESg/N7fCHvq4amGGuP6G8FsK60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H6tjf/dJMcagj0ESg/N7fCHvq4amGGuP6G8FsK60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH6tjf%2FdJMcagj0ESg%2FN7fCHvq4amGGuP6G8FsK60%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;2023&quot; height=&quot;1258&quot; data-origin-width=&quot;2023&quot; data-origin-height=&quot;1258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1788&quot; data-start=&quot;1771&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PR에서는 다음을 명확히 했다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1887&quot; data-start=&quot;1790&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1821&quot; data-start=&quot;1790&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변경 범위를 InitCommand 기반 커맨드로 제한&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1863&quot; data-start=&quot;1822&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;unsupported kubectl REST 플래그만 명시적으로 필터링&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1887&quot; data-start=&quot;1864&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;UX 문제 해결이 목적임을 명확히 설명&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b67nL8/dJMcabwd6gp/YPFuqWKhAZyakRxfVXQt1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b67nL8/dJMcabwd6gp/YPFuqWKhAZyakRxfVXQt1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b67nL8/dJMcabwd6gp/YPFuqWKhAZyakRxfVXQt1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb67nL8%2FdJMcabwd6gp%2FYPFuqWKhAZyakRxfVXQt1K%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;1423&quot; height=&quot;1059&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7cgpE/dJMb996fYQa/ZV2WT5TKeXWKeGdWadwqcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7cgpE/dJMb996fYQa/ZV2WT5TKeXWKeGdWadwqcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7cgpE/dJMb996fYQa/ZV2WT5TKeXWKeGdWadwqcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7cgpE%2FdJMb996fYQa%2FZV2WT5TKeXWKeGdWadwqcK%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;1462&quot; height=&quot;754&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;2877&quot; data-start=&quot;2851&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰 피드백 ①: Unit test 추가&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-end=&quot;2919&quot; data-start=&quot;2879&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2919&quot; data-start=&quot;2881&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Is it possible to add some unit tests?&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2971&quot; data-start=&quot;2921&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순한 필터링 로직이었지만, 회귀 방지 측면에서 테스트를 추가하는 게 맞다고 판단했다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3053&quot; data-start=&quot;2973&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3026&quot; data-start=&quot;2973&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;unsupported kubectl REST 플래그가 실제로 제거되는지 검증하는 테스트 추가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhjW71/dJMcacu8HJb/pGSLe7weFDRSQ7jyrlbkxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhjW71/dJMcacu8HJb/pGSLe7weFDRSQ7jyrlbkxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhjW71/dJMcacu8HJb/pGSLe7weFDRSQ7jyrlbkxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhjW71%2FdJMcacu8HJb%2FpGSLe7weFDRSQ7jyrlbkxK%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;1432&quot; height=&quot;1048&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1048&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 추가 이후, 리뷰어에게서 명확한 승인(LGTM)을 받을 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3083&quot; data-start=&quot;3060&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰 피드백 ②: 테스트 누락 지적&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-end=&quot;3122&quot; data-start=&quot;3085&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3122&quot; data-start=&quot;3087&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;certificate-authority 플래그 검증이 빠져 있다&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3133&quot; data-start=&quot;3124&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순 누락이었고, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 unsupported 플래그를 테스트에 포함하도록 수정했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;9. 최종 수정 코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;1089&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y2Oha/dJMcaioz5Y6/Fn5rbJdc4zCmrjbsE4pLe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y2Oha/dJMcaioz5Y6/Fn5rbJdc4zCmrjbsE4pLe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y2Oha/dJMcaioz5Y6/Fn5rbJdc4zCmrjbsE4pLe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2Oha%2FdJMcaioz5Y6%2FFn5rbJdc4zCmrjbsE4pLe0%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;985&quot; height=&quot;1089&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;1089&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3d9ZI/dJMcaia3UoS/kh1joms6oHqhRgnm8kvdqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3d9ZI/dJMcaia3UoS/kh1joms6oHqhRgnm8kvdqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3d9ZI/dJMcaia3UoS/kh1joms6oHqhRgnm8kvdqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3d9ZI%2FdJMcaia3UoS%2Fkh1joms6oHqhRgnm8kvdqk%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;973&quot; height=&quot;781&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;781&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;h2 data-end=&quot;2467&quot; data-start=&quot;2442&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10. 트러블슈팅 &amp;ndash; 실제로 막혔던 지점들&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;955&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4EV0k/dJMcabptl3W/GUV1zwAtOEKcJJB9GhTY9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4EV0k/dJMcabptl3W/GUV1zwAtOEKcJJB9GhTY9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4EV0k/dJMcabptl3W/GUV1zwAtOEKcJJB9GhTY9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4EV0k%2FdJMcabptl3W%2FGUV1zwAtOEKcJJB9GhTY9K%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;1222&quot; height=&quot;955&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;955&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;2537&quot; data-start=&quot;2517&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3707&quot; data-start=&quot;3691&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 오래 걸린 건 CI였다.&amp;nbsp;문제는 로직이 아니라 &lt;b&gt;생성 코드 검증 단계&lt;/b&gt;였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3798&quot; data-start=&quot;3741&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Argo CD는 CLI help 문서를 자동 생성된 결과물로 관리한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CI에서는 다음을 검사한다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;3841&quot; data-start=&quot;3800&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3841&quot; data-start=&quot;3802&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CLI 동작을 바꿨다면, 자동 생성되는 문서도 함께 업데이트됐는가?&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3911&quot; data-start=&quot;3843&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3911&quot; data-start=&quot;3843&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 코드만 수정하고 docs/user-guide/commands/* 문서를 갱신하지 않아 CI가 실패했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3922&quot; data-start=&quot;3913&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 경험을 통해,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3966&quot; data-start=&quot;3923&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3966&quot; data-start=&quot;3923&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스에서는 코드뿐 아니라 &lt;b&gt;생성물까지 책임져야 한다&lt;/b&gt;는 걸 배웠다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2537&quot; data-start=&quot;2517&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2749&quot; data-start=&quot;2735&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;3198&quot; data-start=&quot;3178&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;리뷰 피드백 ③: 구조적 질문 - 미해결&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;1063&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GxBgx/dJMcaaYoEcL/xAL12Q2Sbj2lWXRRFxAQzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GxBgx/dJMcaaYoEcL/xAL12Q2Sbj2lWXRRFxAQzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GxBgx/dJMcaaYoEcL/xAL12Q2Sbj2lWXRRFxAQzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGxBgx%2FdJMcaaYoEcL%2FxAL12Q2Sbj2lWXRRFxAQzK%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;1407&quot; height=&quot;1063&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;1063&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m6PtP/dJMcaiIQVCN/E5TncfEf9OF5s0xAqiIadK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m6PtP/dJMcaiIQVCN/E5TncfEf9OF5s0xAqiIadK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m6PtP/dJMcaiIQVCN/E5TncfEf9OF5s0xAqiIadK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm6PtP%2FdJMcaiIQVCN%2FE5TncfEf9OF5s0xAqiIadK%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;1425&quot; height=&quot;699&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;3222&quot; data-start=&quot;3200&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3222&quot; data-start=&quot;3200&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 인상 깊었던 질문은 이 부분이었다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3378&quot; data-start=&quot;3224&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3310&quot; data-start=&quot;3224&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-tls-server-name 플래그는 argocd app에는 없고 argocd admin notifications에는 있다&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3310&quot; data-start=&quot;3253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3310&quot; data-start=&quot;3275&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇다면 플래그 관리를 초기화 경로 기준이 아니라&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서브커맨드별 실제 지원 여부 기준으로 해야 하는 것 아니냐?&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3400&quot; data-start=&quot;3380&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 핵심은 이 PR의 목적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3407&quot; data-start=&quot;3402&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 PR은&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3491&quot; data-start=&quot;3408&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3437&quot; data-start=&quot;3408&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;unknown flag 에러를 없애는 것이 아니라&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3491&quot; data-start=&quot;3438&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지원되지 않는 kubectl REST 플래그가 help에 노출되는 문제를 해결하는 것&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3577&quot; data-start=&quot;3493&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서브커맨드별 실제 플래그 지원 여부를 추적하려면 플래그 정의 구조 전반을 재설계해야 하고,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 이번 PR의 범위를 명확히 초과한다고 판단했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3577&quot; data-start=&quot;3493&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3582&quot; data-start=&quot;3579&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3658&quot; data-start=&quot;3583&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3626&quot; data-start=&quot;3583&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;InitCommand를 사용하는 커맨드 트리에 한정된 수정임을 설명했고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3658&quot; data-start=&quot;3627&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;admin 계열은 의도적으로 범위 밖임을 명확히 했다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;3990&quot; data-start=&quot;3973&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;11. 기여하면서 배운 점&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4276&quot; data-start=&quot;3992&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4072&quot; data-start=&quot;3992&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DCO(Sign-off)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 코드만 맞는 게 아니라, 기여자의 책임과 출처를 명확히 남기는 절차라는 걸 처음으로 체감했다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4144&quot; data-start=&quot;4073&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;리뷰는 개인이 아니라 팀의 작업&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PR 하나가 여러 리뷰어를 거치며 점점 단단해지는 구조라는 점이 인상적이었다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4206&quot; data-start=&quot;4145&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;작은 PR이 왜 중요한지&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변경 범위를 명확히 제한해야 리뷰도, 머지도 가능하다는 걸 배웠다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4276&quot; data-start=&quot;4207&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;오픈소스가 안정적으로 유지되는 이유&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인의 실력보다 프로세스가 실수를 걸러내도록 설계돼 있다는 걸 느꼈다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;12. 첫 후원도 진행  &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;775&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GxbBo/dJMcabQwHii/HkO6YZbvUizhhV1RHDtGJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GxbBo/dJMcabQwHii/HkO6YZbvUizhhV1RHDtGJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GxbBo/dJMcabQwHii/HkO6YZbvUizhhV1RHDtGJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGxbBo%2FdJMcabQwHii%2FHkO6YZbvUizhhV1RHDtGJk%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;1251&quot; height=&quot;775&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;775&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-end=&quot;4316&quot; data-start=&quot;4291&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 기여는 단순한 CLI 버그 수정이었지만,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4369&quot; data-start=&quot;4318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4331&quot; data-start=&quot;4318&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드 구조를 이해하고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4352&quot; data-start=&quot;4332&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰를 통해 설계 범위를 조율하고&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4369&quot; data-start=&quot;4353&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트와 CI까지 책임지는&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4397&quot; data-start=&quot;4371&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스 기여의 전체 흐름을 경험할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;4467&quot; data-start=&quot;4399&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 과정에서 가장 많은 도움과 명확한 피드백을 준 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;nitishfy에게 GitHub Sponsors로 후원을 남겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;4536&quot; data-start=&quot;4469&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드를 쓰는 사람뿐 아니라, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰하고 방향을 잡아주는 사람들이 있어 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 생태계가 유지된다는 걸 실감한 경험이었다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>대외활동/오픈소스 기여</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/187</guid>
      <comments>https://hyejuncoding.tistory.com/187#entry187comment</comments>
      <pubDate>Sun, 25 Jan 2026 20:26:51 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트 준비] 골드 1문제 (10942 펠린드롬?)</title>
      <link>https://hyejuncoding.tistory.com/186</link>
      <description>&lt;h2 data-end=&quot;132&quot; data-start=&quot;123&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제의 본질&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;180&quot; data-start=&quot;134&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;154&quot; data-start=&quot;134&quot;&gt;수열 길이 N &amp;le; 2000&lt;/li&gt;
&lt;li data-end=&quot;180&quot; data-start=&quot;155&quot;&gt;질문 개수 M &amp;le; 1,000,000&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;238&quot; data-start=&quot;182&quot; data-ke-size=&quot;size16&quot;&gt;각 질문마다 직접 팰린드롬 검사하면 최악 O(N &amp;times; M) &amp;rarr; 절대 시간 안 됨&lt;/p&gt;
&lt;p data-end=&quot;284&quot; data-start=&quot;240&quot; data-ke-size=&quot;size16&quot;&gt;즉 모든 구간의 팰린드롬 여부를 미리 계산해야 한다.&lt;/p&gt;
&lt;h2 data-end=&quot;327&quot; data-start=&quot;291&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;327&quot; data-start=&quot;291&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;핵심 아이디어: DP (Dynamic Programming)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;335&quot; data-start=&quot;329&quot; data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;dp[i][j] = i번째 수부터 j번째 수까지가 팰린드롬이면 1, 아니면 0 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;413&quot; data-start=&quot;399&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;413&quot; data-start=&quot;399&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;점화식&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;427&quot; data-start=&quot;415&quot; data-ke-size=&quot;size23&quot;&gt;1️⃣ 길이 1&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;dp[i][i] = 1 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;469&quot; data-start=&quot;453&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;469&quot; data-start=&quot;453&quot;&gt;한 글자는 무조건 팰린드롬&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;488&quot; data-start=&quot;476&quot; data-ke-size=&quot;size23&quot;&gt;2️⃣ 길이 2&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;dp[i][i+1] = (arr[i] == arr[i+1])&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;555&quot; data-start=&quot;541&quot; data-ke-size=&quot;size23&quot;&gt;3️⃣ 길이 &amp;ge; 3&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;dp[i][j] = (arr[i] == arr[j]) AND dp[i+1][j-1] &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;649&quot; data-start=&quot;616&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;625&quot; data-start=&quot;616&quot;&gt;양 끝이 같고&lt;/li&gt;
&lt;li data-end=&quot;638&quot; data-start=&quot;626&quot;&gt;안쪽이 팰린드롬이면&lt;/li&gt;
&lt;li data-end=&quot;649&quot; data-start=&quot;639&quot;&gt;전체도 팰린드롬&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;673&quot; data-start=&quot;656&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;673&quot; data-start=&quot;656&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DP 채우는 순서&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;698&quot; data-start=&quot;675&quot; data-ke-size=&quot;size16&quot;&gt;구간 길이 기준으로 증가시키며 계산&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;길이 1 &amp;rarr; 길이 2 &amp;rarr; 길이 3 &amp;rarr; ... &amp;rarr; 길이 N&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;748&quot; data-start=&quot;745&quot; data-ke-size=&quot;size16&quot;&gt;이유: &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;dp[i][j]를 계산하려면 dp[i+1][j-1]가 이미 계산돼 있어야 함&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;816&quot; data-start=&quot;804&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;816&quot; data-start=&quot;804&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;시간 복잡도 분석&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;825&quot; data-start=&quot;818&quot; data-ke-size=&quot;size23&quot;&gt;전처리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;874&quot; data-start=&quot;826&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;853&quot; data-start=&quot;826&quot;&gt;DP 상태 수: N&amp;sup2; &amp;asymp; 4,000,000&lt;/li&gt;
&lt;li data-end=&quot;874&quot; data-start=&quot;854&quot;&gt;시간: O(N&amp;sup2;) &amp;rarr; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;882&quot; data-start=&quot;876&quot; data-ke-size=&quot;size23&quot;&gt;질의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;913&quot; data-start=&quot;883&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;883&quot;&gt;각 질문: O(1)&lt;/li&gt;
&lt;li data-end=&quot;913&quot; data-start=&quot;900&quot;&gt;총: O(M)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;915&quot; data-ke-size=&quot;size16&quot;&gt;전체 시간 O(N&amp;sup2; + M) - 이 문제의 유일한 정답 접근&lt;/p&gt;</description>
      <category>언어/C++</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/186</guid>
      <comments>https://hyejuncoding.tistory.com/186#entry186comment</comments>
      <pubDate>Sat, 10 Jan 2026 12:29:38 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트 준비] 골드 1문제 (2176 합리적인 이동경로)</title>
      <link>https://hyejuncoding.tistory.com/185</link>
      <description>&lt;p data-end=&quot;142&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;그래프의 정점 1(S)에서 정점 2(T)로 이동한다.&lt;br /&gt;이동할 때마다 항상 &lt;b&gt;정점 2에 더 가까워지는 방향&lt;/b&gt;으로만 이동하는 경로를&lt;br /&gt;&amp;ldquo;합리적인 이동경로&amp;rdquo;라고 정의한다.&lt;/p&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;144&quot; data-ke-size=&quot;size16&quot;&gt;그래프가 주어질 때, 가능한 합리적인 이동경로의 개수를 구하는 문제다.&lt;/p&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;144&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;198&quot; data-start=&quot;190&quot; data-ke-size=&quot;size26&quot;&gt;핵심 관찰&lt;/h2&gt;
&lt;p data-end=&quot;262&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;정점 2에 더 가까워진다&amp;rdquo;는 말은&lt;br /&gt;&lt;b&gt;정점 2까지의 최단거리 값이 매 이동마다 감소해야 한다&lt;/b&gt;는 의미다.&lt;/p&gt;
&lt;p data-end=&quot;299&quot; data-start=&quot;264&quot; data-ke-size=&quot;size16&quot;&gt;따라서 각 정점에서 정점 2까지의 최단거리를 먼저 알아야 한다.&lt;/p&gt;
&lt;h2 data-end=&quot;317&quot; data-start=&quot;306&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;317&quot; data-start=&quot;306&quot; data-ke-size=&quot;size26&quot;&gt;전체 풀이 전략&lt;/h2&gt;
&lt;h3 data-end=&quot;341&quot; data-start=&quot;319&quot; data-ke-size=&quot;size23&quot;&gt;1. 정점 2에서 다익스트라 수행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;403&quot; data-start=&quot;343&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;369&quot; data-start=&quot;343&quot;&gt;정점 2를 시작점으로 다익스트라를 실행한다.&lt;/li&gt;
&lt;li data-end=&quot;403&quot; data-start=&quot;370&quot;&gt;dist[v] = 정점 v에서 정점 2까지의 최단거리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;432&quot; data-start=&quot;405&quot; data-ke-size=&quot;size16&quot;&gt;이 값이 이후 이동 가능 여부 판단 기준이 된다.&lt;/p&gt;
&lt;h3 data-end=&quot;464&quot; data-start=&quot;439&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;464&quot; data-start=&quot;439&quot; data-ke-size=&quot;size23&quot;&gt;2. DFS + DP로 경로 개수 계산&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;591&quot; data-start=&quot;466&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;466&quot;&gt;dp[u] = 정점 u에서 정점 2까지 갈 수 있는 합리적인 경로의 수&lt;/li&gt;
&lt;li data-end=&quot;539&quot; data-start=&quot;510&quot;&gt;종료 조건
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;539&quot; data-start=&quot;522&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;539&quot; data-start=&quot;522&quot;&gt;u == 2이면 1 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;591&quot; data-start=&quot;540&quot;&gt;이동 조건
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;591&quot; data-start=&quot;552&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;591&quot; data-start=&quot;552&quot;&gt;u -&amp;gt; v로 이동 가능 &amp;hArr; dist[v] &amp;lt; dist[u]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;632&quot; data-start=&quot;593&quot; data-ke-size=&quot;size16&quot;&gt;최단거리 값이 항상 감소하므로, 순환이 발생하지 않아 DP가 가능하다.&lt;/p&gt;
&lt;h2 data-end=&quot;650&quot; data-start=&quot;639&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;650&quot; data-start=&quot;639&quot; data-ke-size=&quot;size26&quot;&gt;알고리즘 정당성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;793&quot; data-start=&quot;652&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;678&quot; data-start=&quot;652&quot;&gt;합리적인 이동경로는 최단경로일 필요는 없지만&lt;/li&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;679&quot;&gt;항상 &amp;ldquo;정점 2 기준 거리 감소&amp;rdquo; 조건을 만족해야 한다&lt;/li&gt;
&lt;li data-end=&quot;733&quot; data-start=&quot;712&quot;&gt;다익스트라로 거리 기준을 고정한 뒤&lt;/li&gt;
&lt;li data-end=&quot;793&quot; data-start=&quot;734&quot;&gt;그 기준을 만족하는 방향으로만 DFS를 수행하면&lt;br /&gt;모든 가능한 합리적인 경로를 중복 없이 셀 수 있다&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>언어/C++</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/185</guid>
      <comments>https://hyejuncoding.tistory.com/185#entry185comment</comments>
      <pubDate>Fri, 9 Jan 2026 12:16:21 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트 준비] 골드 1문제 - 1949 우수 마을</title>
      <link>https://hyejuncoding.tistory.com/184</link>
      <description>&lt;h1 data-end=&quot;116&quot; data-start=&quot;96&quot;&gt;1949&amp;nbsp;우수&amp;nbsp;마을&lt;/h1&gt;
&lt;p data-end=&quot;149&quot; data-start=&quot;117&quot; data-ke-size=&quot;size16&quot;&gt;트리 DP를 이용한 최대 가중 독립집합 with 지배 조건&lt;/p&gt;
&lt;h2 data-end=&quot;167&quot; data-start=&quot;156&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;167&quot; data-start=&quot;156&quot; data-ke-size=&quot;size26&quot;&gt;1. 문제 해석&lt;/h2&gt;
&lt;p data-end=&quot;223&quot; data-start=&quot;169&quot; data-ke-size=&quot;size16&quot;&gt;문제는 트리 구조의 그래프에서 일부 정점을 선택하여 다음 조건을 만족하는 부분집합을 찾는 것이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;388&quot; data-start=&quot;225&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;225&quot;&gt;선택된 마을의 주민 수 합을 최대화해야 한다.&lt;/li&gt;
&lt;li data-end=&quot;316&quot; data-start=&quot;254&quot;&gt;인접한 두 마을은 동시에 선택할 수 없다.&lt;br /&gt;&amp;rarr; 독립집합(Independent Set) 조건&lt;/li&gt;
&lt;li data-end=&quot;388&quot; data-start=&quot;317&quot;&gt;선택되지 않은 모든 마을은 적어도 하나의 선택된 마을과 인접해야 한다.&lt;br /&gt;&amp;rarr; 지배(Dominating) 조건&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;451&quot; data-start=&quot;390&quot; data-ke-size=&quot;size16&quot;&gt;즉, 본 문제는&lt;br /&gt;트리에서 지배 조건을 만족하는 최대 가중 독립집합을 구하는 문제로 해석할 수 있다.&lt;/p&gt;
&lt;h2 data-end=&quot;472&quot; data-start=&quot;458&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;472&quot; data-start=&quot;458&quot; data-ke-size=&quot;size26&quot;&gt;2. 접근 방법 개요&lt;/h2&gt;
&lt;p data-end=&quot;554&quot; data-start=&quot;474&quot; data-ke-size=&quot;size16&quot;&gt;트리는 사이클이 없으므로, 임의의 노드를 루트로 잡아 DFS를 수행하며&lt;br /&gt;서브트리 단위로 최적해를 계산하는 트리 DP 방식이 적합하다.&lt;/p&gt;
&lt;p data-end=&quot;600&quot; data-start=&quot;556&quot; data-ke-size=&quot;size16&quot;&gt;각 노드에 대해 &amp;ldquo;선택하는 경우&amp;rdquo;와 &amp;ldquo;선택하지 않는 경우&amp;rdquo;를 분리하여 고려한다.&lt;/p&gt;
&lt;h2 data-end=&quot;621&quot; data-start=&quot;607&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;621&quot; data-start=&quot;607&quot; data-ke-size=&quot;size26&quot;&gt;3. DP 상태 정의&lt;/h2&gt;
&lt;p data-end=&quot;667&quot; data-start=&quot;623&quot; data-ke-size=&quot;size16&quot;&gt;루트를 기준으로 트리를 구성하고, 각 노드 u에 대해 다음과 같이 정의한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;825&quot; data-start=&quot;669&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;748&quot; data-start=&quot;669&quot;&gt;dp[u][1] : 마을 u를 우수 마을로 선택했을 때&lt;br /&gt;u를 루트로 하는 서브트리에서 얻을 수 있는 최대 주민 수&lt;/li&gt;
&lt;li data-end=&quot;825&quot; data-start=&quot;749&quot;&gt;dp[u][0] : 마을 u를 선택하지 않았을 때&lt;br /&gt;u를 루트로 하는 서브트리에서 얻을 수 있는 최대 주민 수&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;841&quot; data-start=&quot;832&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;841&quot; data-start=&quot;832&quot; data-ke-size=&quot;size26&quot;&gt;4. 점화식&lt;/h2&gt;
&lt;h3 data-end=&quot;877&quot; data-start=&quot;843&quot; data-ke-size=&quot;size23&quot;&gt;4.1 현재 마을을 선택한 경우 (dp[u][1])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;971&quot; data-start=&quot;879&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;924&quot; data-start=&quot;879&quot;&gt;인접한 마을은 선택할 수 없으므로, 모든 자식은 반드시 선택되지 않아야 한다.&lt;/li&gt;
&lt;li data-end=&quot;971&quot; data-start=&quot;925&quot;&gt;자식이 선택되지 않은 경우라도, 현재 마을 u가 지배 조건을 만족시켜 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;989&quot; data-start=&quot;973&quot; data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 계산된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;dp[u][1] = population[u] + &amp;Sigma; dp[v][0] (v는 u의 자식) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1094&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1094&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size23&quot;&gt;4.2 현재 마을을 선택하지 않은 경우 (dp[u][0])&lt;/h3&gt;
&lt;p data-end=&quot;1111&quot; data-start=&quot;1096&quot; data-ke-size=&quot;size16&quot;&gt;이 경우가 문제의 핵심이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1239&quot; data-start=&quot;1113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1172&quot; data-start=&quot;1113&quot;&gt;u가 선택되지 않았으므로,&lt;br /&gt;u는 반드시 인접한 마을 중 하나에 의해 지배되어야 한다.&lt;/li&gt;
&lt;li data-end=&quot;1239&quot; data-start=&quot;1173&quot;&gt;DFS 기준에서는 부모의 선택 여부를 알 수 없으므로,&lt;br /&gt;자식 중 최소 하나는 반드시 선택되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1263&quot; data-start=&quot;1241&quot; data-ke-size=&quot;size16&quot;&gt;자식 v에 대해 선택지는 두 가지다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1315&quot; data-start=&quot;1265&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1287&quot; data-start=&quot;1265&quot;&gt;v를 선택 &amp;rarr; dp[v][1]&lt;/li&gt;
&lt;li data-end=&quot;1315&quot; data-start=&quot;1288&quot;&gt;v를 선택하지 않음 &amp;rarr; dp[v][0]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1424&quot; data-start=&quot;1317&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로는 각 자식에 대해 max(dp[v][0], dp[v][1])를 선택하되,&lt;br /&gt;모든 자식이 선택되지 않는 상황이 발생하면,&lt;br /&gt;손해가 가장 적은 자식 하나를 강제로 선택해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1444&quot; data-start=&quot;1426&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 다음 절차를 사용한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1537&quot; data-start=&quot;1446&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1475&quot; data-start=&quot;1446&quot;&gt;각 자식에 대해 더 큰 값을 선택하며 합을 계산&lt;/li&gt;
&lt;li data-end=&quot;1537&quot; data-start=&quot;1476&quot;&gt;선택된 자식이 하나도 없다면&lt;br /&gt;dp[v][1] - dp[v][0] 값이 가장 작은 자식을 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;1563&quot; data-start=&quot;1544&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1563&quot; data-start=&quot;1544&quot; data-ke-size=&quot;size26&quot;&gt;5. 루트 처리 및 최종 결과&lt;/h2&gt;
&lt;p data-end=&quot;1624&quot; data-start=&quot;1565&quot; data-ke-size=&quot;size16&quot;&gt;루트 노드는 부모가 없으므로,&lt;br /&gt;루트가 선택되지 않았을 경우에도 자식 중 하나가 반드시 선택되어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1678&quot; data-start=&quot;1626&quot; data-ke-size=&quot;size16&quot;&gt;이는 dp[u][0] 계산 과정에서 이미 보장되므로,&lt;br /&gt;최종 결과는 다음 중 최댓값이다.&lt;/p&gt;
&lt;p data-end=&quot;1678&quot; data-start=&quot;1626&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-5-2&quot; data-message-id=&quot;2b737291-a1ab-4bce-a2c9-3d6bfd7a7ac0&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;3125&quot; data-start=&quot;3117&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;3201&quot; data-start=&quot;3127&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 단순한 최대 독립집합 문제가 아니라,&lt;br /&gt;선택되지 않은 정점도 반드시 커버해야 한다는 지배 조건이 추가된 문제이다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3282&quot; data-start=&quot;3203&quot; data-ke-size=&quot;size16&quot;&gt;트리 구조라는 점을 이용해&lt;br /&gt;DFS 기반 트리 DP로 상태를 분리하고,&lt;br /&gt;&amp;ldquo;최소 하나의 자식 선택&amp;rdquo; 조건을 정확히 처리하는 것이 핵심이다.&lt;/p&gt;
&lt;/div&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;</description>
      <category>언어/C++</category>
      <author>rngPwns</author>
      <guid isPermaLink="true">https://hyejuncoding.tistory.com/184</guid>
      <comments>https://hyejuncoding.tistory.com/184#entry184comment</comments>
      <pubDate>Tue, 6 Jan 2026 19:59:44 +0900</pubDate>
    </item>
  </channel>
</rss>