<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lmjDev</title>
    <link>https://mizzo-dev.tistory.com/</link>
    <description>알고리즘, CS 등</description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 18:04:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mizzo</managingEditor>
    <image>
      <title>lmjDev</title>
      <url>https://tistory1.daumcdn.net/tistory/2816130/attach/016a7657e4264dba90e14a4f0b2109e6</url>
      <link>https://mizzo-dev.tistory.com</link>
    </image>
    <item>
      <title>MCP Server 간단 학습</title>
      <link>https://mizzo-dev.tistory.com/entry/MCP-Server-%EA%B0%84%EB%8B%A8-%ED%95%99%EC%8A%B5</link>
      <description>&lt;h1&gt;학습 순서&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 간단한 개념 익히기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/EswVjHZMn74?feature=shared&quot;&gt;https://youtu.be/EswVjHZMn74&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=EswVjHZMn74&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bFc0Uj/hyYYzJEzs8/mq1jgEEuREkwLf7jkrem61/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=204_162_758_504,https://scrap.kakaocdn.net/dn/dP3AGM/hyY1ew6kX8/tCUtzZlJKWDmktR5dVINa1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=204_162_758_504&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;요즘 난리난 MCP! 10분안에 정리해줌.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/EswVjHZMn74&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 상용화된 MCP 서버 사용해보며 익숙해지기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/szUo30BOZlo?feature=shared&quot;&gt;https://youtu.be/szUo30BOZlo&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=szUo30BOZlo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cNaR7Q/hyYYtbBMVc/ejiy3appPVhjfwxCbPxS6k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=468_190_702_444,https://scrap.kakaocdn.net/dn/bl9CQU/hyY1c0lF4c/f4g3Yx3Y4T47aQrohwk9ak/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=468_190_702_444&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;갓생 만들어줄 MCP 서버   BEST 8종 모음&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/szUo30BOZlo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발 시 유용해보이는 Tool&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/upstash/context7&quot;&gt;Context 7&lt;/a&gt;: 코딩 시 AI가 오래된 정보를 제공하거나 존재하지 않는 API를 환각하는 문제를 해결합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://apidog.com/kr/blog/context7-mcp-server-kr/&quot;&gt;참고:&amp;nbsp; https://apidog.com/kr/blog/context7-mcp-server-kr/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/playwright-mcp&quot;&gt;Microsoft Playright MCP&lt;/a&gt; 서버: 실제 브라우저를 제어할 수 있는 도구를 제공합니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹 개발 후, 브라우저 E2E 테스트 할 때 좋아보임&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking&quot;&gt;Sequential Thinking&lt;/a&gt;: AI가 구조화된 사고 과정을 사용하여 문제를 해결하도록 돕습니다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/AgentDeskAI/browser-tools-mcp&quot;&gt;Browser Tools MCP&lt;/a&gt;: 웹 애플리케이션의 접근성, 성능, SEO 등을 감사하는 도구를 제공합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP Server 사용을 위해선 MCP Client가 필요한데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 Claude for Desktop, Cursor 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 cursor 유료 회원으로 cursor를 사용하여 실습 했습니다만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유료 결제를 안하셨거나 MCP 찍먹 용도로는 Claude for Desktop 무료 버전을 사용해 보실 것을 권장합니다. (다만, 토큰 소모가 많아서 답변이 잘릴 수 있습니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 방법대로 사용해보세요&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;원하는 MCP server를 아래 사이트에서 검색합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://smithery.ai/&quot;&gt;Smithery - Model Context Protocol Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;로그인 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용할 MCP Server를 선택 후, Client를 선택해 나오는 명령어를 쳐주면 설치 완료!&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/scUcW/btsOfNEbypx/ZeRlTc0E0IKesV0do0KOP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/scUcW/btsOfNEbypx/ZeRlTc0E0IKesV0do0KOP1/img.png&quot; data-alt=&quot;로그인 연동이 잘되어있다면 api-key도 자동설정됩니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/scUcW/btsOfNEbypx/ZeRlTc0E0IKesV0do0KOP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FscUcW%2FbtsOfNEbypx%2FZeRlTc0E0IKesV0do0KOP1%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;2580&quot; height=&quot;1466&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1466&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 연동이 잘되어있다면 api-key도 자동설정됩니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;1636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbVDek/btsOfQAVpe7/0Lpm9aV9NAOCTbAC5pcsaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbVDek/btsOfQAVpe7/0Lpm9aV9NAOCTbAC5pcsaK/img.png&quot; data-alt=&quot;외부 api key가 필요한 경우 입력 값을 요청할 수 있습니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbVDek/btsOfQAVpe7/0Lpm9aV9NAOCTbAC5pcsaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbVDek%2FbtsOfQAVpe7%2F0Lpm9aV9NAOCTbAC5pcsaK%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;2516&quot; height=&quot;1636&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;1636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;외부 api key가 필요한 경우 입력 값을 요청할 수 있습니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 간단한 MCP Server 구축해보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot;&gt;For Server Developers - Model Context Protocol&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748342702238&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;For Server Developers - Model Context Protocol&quot; data-og-description=&quot;When creating the ApplicationHostBuilder, ensure you use CreateEmptyApplicationBuilder instead of CreateDefaultBuilder. This ensures that the server does not write any additional messages to the console. This is only neccessary for servers using STDIO tran&quot; data-og-host=&quot;modelcontextprotocol.io&quot; data-og-source-url=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot; data-og-url=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/diXtDb/hyYYsDOgZZ/4BkIUAV80wk9CEqkvYFFIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/diXtDb/hyYYsDOgZZ/4BkIUAV80wk9CEqkvYFFIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;For Server Developers - Model Context Protocol&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;When creating the ApplicationHostBuilder, ensure you use CreateEmptyApplicationBuilder instead of CreateDefaultBuilder. This ensures that the server does not write any additional messages to the console. This is only neccessary for servers using STDIO tran&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;modelcontextprotocol.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;MCP(Model Context Protocol) 서버 구축 및 이해하기&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아래 내용을 기반으로 실습해보며, 모르는 내용들을 정리한 내용입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;(참고로 필자는 python 기반으로 진행했으며, python을 잘 몰라서 관련 내용도 명시되어 있습니다.)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;추가로, 실습 예제를 통해 MCP 서버로 LLM을 어떻게 이해시키고 해당 tool이 사용되는지 정리해두었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1748342695164&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;For Server Developers - Model Context Protocol&quot; data-og-description=&quot;When creating the ApplicationHostBuilder, ensure you use CreateEmptyApplicationBuilder instead of CreateDefaultBuilder. This ensures that the server does not write any additional messages to the console. This is only neccessary for servers using STDIO tran&quot; data-og-host=&quot;modelcontextprotocol.io&quot; data-og-source-url=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot; data-og-url=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/diXtDb/hyYYsDOgZZ/4BkIUAV80wk9CEqkvYFFIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://modelcontextprotocol.io/quickstart/server#python&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/diXtDb/hyYYsDOgZZ/4BkIUAV80wk9CEqkvYFFIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;For Server Developers - Model Context Protocol&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;When creating the ApplicationHostBuilder, ensure you use CreateEmptyApplicationBuilder instead of CreateDefaultBuilder. This ensures that the server does not write any additional messages to the console. This is only neccessary for servers using STDIO tran&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;modelcontextprotocol.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;b&gt;UV(Uvicorn)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Uvicorn&lt;/b&gt;은 ASGI(Asynchronous Server Gateway Interface) 웹 서버 구현체로, 비동기 Python 웹 애플리케이션을 실행하기 위해 설계되었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 특징:&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;고성능&lt;/b&gt;: asyncio 기반 비동기 처리 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASGI 호환&lt;/b&gt;: FastAPI, Starlette, Django 등의 ASGI 프레임워크와 함께 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebSocket 지원&lt;/b&gt;: 실시간 양방향 통신 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UV 패키지 관리자&lt;/b&gt;는 pip의 대안으로, Rust로 작성되어 더 빠른 패키지 설치를 제공합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;가상환경을 설정하는 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/quickstart/server#set-up-your-environment&quot;&gt;Set up your environment 부분 중&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;# Create virtual environment and activate it
uv venv
source .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 이점:&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;의존성 격리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 간 패키지 버전 충돌 방지&lt;/li&gt;
&lt;li&gt;시스템 Python 환경 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재현 가능한 환경&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 개발자가 동일한 환경에서 작업 가능&lt;/li&gt;
&lt;li&gt;개발 환경과 프로덕션 환경의 일관성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MCP 서버 관련 특별 고려사항&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 버전 의존성 관리&lt;/li&gt;
&lt;li&gt;ML 라이브러리 호환성 유지&lt;/li&gt;
&lt;li&gt;실험적 기술의 업데이트 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;UV 패키지 설치 명령어 이해하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;uv add &quot;mcp[cli]&quot; httpx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;명령어 구성 요소:&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;uv add&lt;/b&gt;: UV 패키지 관리자의 설치 명령어 (pip install과 유사)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;mcp[cli]&quot;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;mcp&lt;/b&gt;: 기본 패키지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[cli]&lt;/b&gt;: extras(선택적 의존성) - CLI 관련 추가 기능 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;httpx&lt;/b&gt;: 별도로 설치할 HTTP 클라이언트 라이브러리&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;MCP Tool 호출 로직&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM이 질문에 의도를 파악하여 mcp의 tool 이름 및 설명을 기준으로 적절한 tool을 호출함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MCP에서 도구(tool) 호출 메커니즘&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM의 도구 선택 과정&lt;/b&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;도구 정의 인식&lt;/b&gt;: Claude와 같은 LLM은 서버에서 제공한 도구 정의(이름, 설명, 파라미터 등)를 받습니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의도 파악&lt;/b&gt;: 사용자 질문의 의도를 분석합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도구 선택&lt;/b&gt;: 의도에 가장 적합한 도구를 선택합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파라미터 추출&lt;/b&gt;: 질문에서 필요한 파라미터 값을 추출합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도구 호출&lt;/b&gt;: 선택한 도구를 적절한 파라미터와 함께 호출합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도구 정의 예시&lt;/b&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1748342896388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tools = [
    {
        &quot;type&quot;: &quot;function&quot;,
        &quot;function&quot;: {
            &quot;name&quot;: &quot;get_forecast&quot;,
            &quot;description&quot;: &quot;Get the weather forecast for a location&quot;,
            &quot;parameters&quot;: {
                &quot;type&quot;: &quot;object&quot;,
                &quot;properties&quot;: {
                    &quot;location&quot;: {
                        &quot;type&quot;: &quot;string&quot;,
                        &quot;description&quot;: &quot;The city and state, e.g. San Francisco, CA&quot;,
                    }
                },
                &quot;required&quot;: [&quot;location&quot;],
            },
        },
    }
]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;MCP 데코레이터 변환 과정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 함수 데코레이터 &lt;b&gt;@mcp.tool()&lt;/b&gt;은 함수를 LLM이 이해할 수 있는 도구 정의로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 개발자는 도구 정의를 수동으로 작성할 필요 없이, 잘 문서화된 Python 함수를 작성하는 것만으로 LLM이 활용할 수 있는 도구를 쉽게 만들 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;원본 코드:&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@mcp.tool()
async def get_alerts(state: str) -&amp;gt; str:
    &quot;&quot;&quot;Get weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    &quot;&quot;&quot;
# 함수 구현...

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;변환된 도구 정의:&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;type&quot;: &quot;function&quot;,
    &quot;function&quot;: {
        &quot;name&quot;: &quot;get_alerts&quot;,
        &quot;description&quot;: &quot;Get weather alerts for a US state.&quot;,
        &quot;parameters&quot;: {
            &quot;type&quot;: &quot;object&quot;,
            &quot;properties&quot;: {
                &quot;state&quot;: {
                    &quot;type&quot;: &quot;string&quot;,
                    &quot;description&quot;: &quot;Two-letter US state code (e.g. CA, NY)&quot;
                }
            },
            &quot;required&quot;: [&quot;state&quot;]
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;변환 요소:&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;함수 이름&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;b&gt;name&lt;/b&gt;&amp;nbsp;필드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;독스트링 첫 줄&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;b&gt;description&lt;/b&gt;&amp;nbsp;필드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매개변수 및 타입 힌트&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;b&gt;parameters&lt;/b&gt;&amp;nbsp;필드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필수 매개변수&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;b&gt;required&lt;/b&gt;&amp;nbsp;필드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매개변수 설명&lt;/b&gt;&amp;nbsp;&amp;rarr; Args 섹션에서 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식으로 개발자는 잘 문서화된 Python 함수를 작성하는 것만으로 LLM이 활용할 수 있는 도구를 쉽게 만들 수 있습니다.&lt;/p&gt;</description>
      <category>AI</category>
      <category>claude</category>
      <category>cursor</category>
      <category>MCP</category>
      <category>mcp server</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/109</guid>
      <comments>https://mizzo-dev.tistory.com/entry/MCP-Server-%EA%B0%84%EB%8B%A8-%ED%95%99%EC%8A%B5#entry109comment</comments>
      <pubDate>Tue, 27 May 2025 19:46:21 +0900</pubDate>
    </item>
    <item>
      <title>yarn 2+(yarn3) production install 방법</title>
      <link>https://mizzo-dev.tistory.com/entry/yarn-2yarn3-production-install-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;pre id=&quot;code_1685626644823&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yarn workspaces ls
$ yarn workspaces focus [workspace] --production​&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685626494213&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn plugin import workspace-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;devdependencies 말고 production dependencies만 설치하고 싶었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn2 부터는 `&lt;span style=&quot;color: #007aa2; text-align: left;&quot;&gt;yarn install --production&lt;/span&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;yarn1에서 제공하던 아래 명령어를 치면 아래처럼 `&lt;span style=&quot;color: #a6bc00;&quot;&gt;yarn workspaces focus&lt;/span&gt;`를 대신 쓰라고 나온다. (&lt;a href=&quot;https://yarnpkg.com/cli/workspaces/focus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고&lt;/a&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1685626216979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yarn install --production

 YN0050: The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 그렇게 또 치면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 syntax error가 뜬다. ㅎㅎㅎ&lt;/p&gt;
&lt;pre id=&quot;code_1685626338282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yarn workspaces focus --production

Unknown Syntax Error: Command not found; did you mean:

$ yarn workspaces list [--since] [-R,--recursive] [-v,--verbose] [--json]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 &lt;span style=&quot;color: #007aa2; text-align: left;&quot;&gt;workspace-tools &lt;span style=&quot;color: #000000;&quot;&gt;이 없기 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #007aa2; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://yarnpkg.com/getting-started/migration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 사이트&lt;/a&gt;에서 확인할 수 있다.&lt;/span&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;2468&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ktVm/btsijgrJSN0/fPyfKB7Nk8wl1facktZCQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ktVm/btsijgrJSN0/fPyfKB7Nk8wl1facktZCQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ktVm/btsijgrJSN0/fPyfKB7Nk8wl1facktZCQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ktVm%2FbtsijgrJSN0%2FfPyfKB7Nk8wl1facktZCQK%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;2468&quot; height=&quot;1528&quot; data-origin-width=&quot;2468&quot; data-origin-height=&quot;1528&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;a href=&quot;https://yarnpkg.com/api/modules/plugin_workspace_tools.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고&lt;/a&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1685626500868&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn plugin import workspace-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 설치가 잘된다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 workspaces를 지정하고 싶을 경우 아래처럼 확인하여 설치하고 아니면 `--all`을 쓰자.&lt;/p&gt;
&lt;pre id=&quot;code_1685626667578&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yarn workspaces ls
$ yarn workspaces focus [workspaceName] --production&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685626675094&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yarn workspaces focus --all --production&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Frontend</category>
      <category>install</category>
      <category>Production</category>
      <category>yarn3</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/108</guid>
      <comments>https://mizzo-dev.tistory.com/entry/yarn-2yarn3-production-install-%EB%B0%A9%EB%B2%95#entry108comment</comments>
      <pubDate>Thu, 1 Jun 2023 22:38:18 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] node-sass 에러 - npm ERR! path /node_modules/node-sass</title>
      <link>https://mizzo-dev.tistory.com/entry/Nodejs-node-sass-%EC%97%90%EB%9F%AC-npm-ERR-path-nodemodulesnode-sass</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;기존에 작업 중이던 프로젝트 코드를 로컬에서 구동하던 중&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모듈 install 단계에서부터 에러가 발생되어 트러블 슈팅했던 내용을 정리해본다.&lt;/span&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 Light';&quot;&gt;늘 그렇듯이 결론부터 말하자면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;node-sass 버전이 설치된 node 버전과 상이한 버전이 설치되어 발생되는 이슈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;해당 프로젝트의 경우 yarn도 사용했었으니 참고!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;원인&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;내 PC에 설치된 node와 node-sass 모듈의 버전은 아래와 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1641774512205&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 노드 버전 - stable version은 현재 기준 16.13.1이다.
node -v                                                                                                                 ✔  09:27:05  
v16.13.0

# 구버전 설치됨
npm list | grep node-sass                                                                                     1 ✘  27s   09:24:23  
├── node-sass@4.14.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;아래 &lt;a href=&quot;https://www.npmjs.com/package/node-sass&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서&lt;/a&gt; 내용 처럼 나의 경우 Node 16을 사용하고 있으니 node-sass는 6.0+ 이상의 버전이 필요하다.&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;1334&quot; data-origin-height=&quot;1072&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/node-sass&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTeUI/btrp96av1sq/hJhTZH5aRRQGFAxHZ4cKdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTeUI%2Fbtrp96av1sq%2FhJhTZH5aRRQGFAxHZ4cKdK%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;500&quot; height=&quot;402&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;공식문서 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;해결&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;node-sass를 삭제하고 새 버전으로 설치해주자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;유의 사항은 yarn 사용시 yarn도 함께 삭제 후 재 설치해주어야 한다!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1641774818993&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# node-sass 모듈 삭제
npm uninstall node-sass
yarn remove node-sass

# 재설치
npm install -D node-sass
yarn add -D node-sass

# 버전 확인
npm list | grep node-sass                                                                                     ✔  8s   09:33:06  
├── node-sass@7.0.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이후에 yarn install 해주니깐 잘 설치되었다 ☺️&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;로그 내용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;아래는 문제 시 발생했던 로그 내용이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;npm install 시 에러 로그&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1641774223259&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm ERR! code 1
npm ERR! path [프로젝트 경로]/node_modules/node-sass
npm ERR! command failed
npm ERR! command sh -c node scripts/build.js
npm ERR! Building: /usr/local/bin/node [프로젝트 경로]/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp verb cli [
npm ERR! gyp verb cli   '/usr/local/bin/node',
npm ERR! gyp verb cli   '[프로젝트 경로]/node_modules/node-gyp/bin/node-gyp.js',
npm ERR! gyp verb cli   'rebuild',
npm ERR! gyp verb cli   '--verbose',
npm ERR! gyp verb cli   '--libsass_ext=',
npm ERR! gyp verb cli   '--libsass_cflags=',
npm ERR! gyp verb cli   '--libsass_ldflags=',
npm ERR! gyp verb cli   '--libsass_library='
npm ERR! gyp verb cli ]
npm ERR! gyp info using node-gyp@3.8.0
npm ERR! gyp info using node@16.13.0 | darwin | x64
npm ERR! gyp verb command rebuild []
npm ERR! gyp verb command clean []
npm ERR! gyp verb clean removing &quot;build&quot; directory
npm ERR! gyp verb command configure []
npm ERR! gyp verb check python checking for Python executable &quot;python2&quot; in the PATH
npm ERR! gyp verb `which` succeeded python2 /usr/bin/python2
npm ERR! gyp verb check python version `/usr/bin/python2 -c &quot;import sys; print &quot;2.7.18
npm ERR! gyp verb check python version .%s.%s&quot; % sys.version_info[:3];&quot;` returned: %j
npm ERR! gyp verb get node dir no --target version specified, falling back to host node version: 16.13.0
npm ERR! gyp verb command install [ '16.13.0' ]
npm ERR! gyp verb install input version string &quot;16.13.0&quot;
npm ERR! gyp verb install installing version: 16.13.0
npm ERR! gyp verb install --ensure was passed, so won't reinstall if already installed
npm ERR! gyp verb install version is already installed, need to check &quot;installVersion&quot;
npm ERR! gyp verb got &quot;installVersion&quot; 9
npm ERR! gyp verb needs &quot;installVersion&quot; 9
npm ERR! gyp verb install version is good
npm ERR! gyp verb get node dir target node version installed: 16.13.0
npm ERR! gyp verb build dir attempting to create &quot;build&quot; dir: [프로젝트 경로]/node_modules/node-sass/build
npm ERR! gyp verb build dir &quot;build&quot; dir needed to be created? [프로젝트 경로]/node_modules/node-sass/build
npm ERR! gyp verb build/config.gypi creating config file
npm ERR! gyp verb build/config.gypi writing out config file: [프로젝트 경로]/node_modules/node-sass/build/config.gypi
npm ERR! (node:5986) [DEP0150] DeprecationWarning: Setting process.config is deprecated. In the future the property will be read-only.
npm ERR! (Use `node --trace-deprecation ...` to show where the warning was created)
npm ERR! gyp verb config.gypi checking for gypi file: [프로젝트 경로]/node_modules/node-sass/config.gypi
npm ERR! gyp verb common.gypi checking for gypi file: [프로젝트 경로]/node_modules/node-sass/common.gypi
npm ERR! gyp verb gyp gyp format was not specified; forcing &quot;make&quot;
npm ERR! gyp info spawn /usr/bin/python2
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   '[프로젝트 경로]/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'make',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '[프로젝트 경로]/node_modules/node-sass/build/config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '[프로젝트 경로]/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/[유저 네임]/.node-gyp/16.13.0/include/node/common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=/Users/[유저 네임]/.node-gyp/16.13.0',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=[프로젝트 경로]/node_modules/node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=/Users/[유저 네임]/.node-gyp/16.13.0/&amp;lt;(target_arch)/node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=[프로젝트 경로]/node_modules/node-sass',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'.
npm ERR! 
npm ERR! No receipt for 'com.apple.pkg.DeveloperToolsCLILeo' found at '/'.
npm ERR! 
npm ERR! No receipt for 'com.apple.pkg.DeveloperToolsCLI' found at '/'.
npm ERR! 
npm ERR! gyp: No Xcode or CLT version detected!
npm ERR! gyp ERR! configure error 
npm ERR! gyp ERR! stack Error: `gyp` failed with exit code: 1
npm ERR! gyp ERR! stack     at ChildProcess.onCpExit ([프로젝트 경로]/node_modules/node-gyp/lib/configure.js:345:16)
npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:390:28)
npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:290:12)
npm ERR! gyp ERR! System Darwin 21.2.0
npm ERR! gyp ERR! command &quot;/usr/local/bin/node&quot; &quot;[프로젝트 경로]/node_modules/node-gyp/bin/node-gyp.js&quot; &quot;rebuild&quot; &quot;--verbose&quot; &quot;--libsass_ext=&quot; &quot;--libsass_cflags=&quot; &quot;--libsass_ldflags=&quot; &quot;--libsass_library=&quot;
npm ERR! gyp ERR! cwd [프로젝트 경로]/node_modules/node-sass
npm ERR! gyp ERR! node -v v16.13.0
npm ERR! gyp ERR! node-gyp -v v3.8.0
npm ERR! gyp ERR! not ok 
npm ERR! Build failed with error code: 1

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/[유저 네임]/.npm/_logs/2022-01-10T00_14_29_988Z-debug.log&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;yarn install시 에러 로그&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1641774351828&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;error [프로젝트 경로]/node_modules/node-sass: Command failed.
Exit code: 1
Command: node scripts/build.js
Arguments: 
Directory: [프로젝트 경로]/node_modules/node-sass
Output:
Building: /usr/local/bin/node [프로젝트 경로]/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
gyp info it worked if it ends with ok
gyp verb cli [
gyp verb cli   '/usr/local/bin/node',
gyp verb cli   '[프로젝트 경로]/node_modules/node-gyp/bin/node-gyp.js',
gyp verb cli   'rebuild',
gyp verb cli   '--verbose',
gyp verb cli   '--libsass_ext=',
gyp verb cli   '--libsass_cflags=',
gyp verb cli   '--libsass_ldflags=',
gyp verb cli   '--libsass_library='
gyp verb cli ]
gyp info using node-gyp@3.8.0
gyp info using node@16.13.0 | darwin | x64
gyp verb command rebuild []
gyp verb command clean []
gyp verb clean removing &quot;build&quot; directory
gyp verb command configure []
gyp verb check python checking for Python executable &quot;/usr/local/opt/python@3.9/bin/python3&quot; in the PATH
gyp verb `which` succeeded /usr/local/opt/python@3.9/bin/python3 /usr/local/opt/python@3.9/bin/python3
gyp ERR! configure error 
gyp ERR! stack Error: Command failed: /usr/local/opt/python@3.9/bin/python3 -c import sys; print &quot;%s.%s.%s&quot; % sys.version_info[:3];
gyp ERR! stack   File &quot;&amp;lt;string&amp;gt;&quot;, line 1
gyp ERR! stack     import sys; print &quot;%s.%s.%s&quot; % sys.version_info[:3];
gyp ERR! stack                       ^
gyp ERR! stack SyntaxError: invalid syntax
gyp ERR! stack 
gyp ERR! stack     at ChildProcess.exithandler (node:child_process:397:12)
gyp ERR! stack     at ChildProcess.emit (node:events:390:28)
gyp ERR! stack     at maybeClose (node:internal/child_process:1064:16)
gyp ERR! stack     at Socket.&amp;lt;anonymous&amp;gt; (node:internal/child_process:450:11)
gyp ERR! stack     at Socket.emit (node:events:390:28)
gyp ERR! stack     at Pipe.&amp;lt;anonymous&amp;gt; (node:net:687:12)
gyp ERR! System Darwin 21.2.0
gyp ERR! command &quot;/usr/local/bin/node&quot; &quot;[프로젝트 경로]/node_modules/node-gyp/bin/node-gyp.js&quot; &quot;rebuild&quot; &quot;--verbose&quot; &quot;--libsass_ext=&quot; &quot;--libsass_cflags=&quot; &quot;--libsass_ldflags=&quot; &quot;--libsass_library=&quot;
gyp ERR! cwd [프로젝트 경로]/node_modules/node-sass
gyp ERR! node -v v16.13.0
gyp ERR! node-gyp -v v3.8.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;참고로 yarn, npm 전체 설정되어 있는데 npm만 지울 경우 아래와 같은 에러가 발생된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1641775923672&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Syntax Error: Error: Node Sass version 7.0.1 is incompatible with ^4.0.0.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Frontend</category>
      <category>error</category>
      <category>node</category>
      <category>node-sass</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/107</guid>
      <comments>https://mizzo-dev.tistory.com/entry/Nodejs-node-sass-%EC%97%90%EB%9F%AC-npm-ERR-path-nodemodulesnode-sass#entry107comment</comments>
      <pubDate>Mon, 10 Jan 2022 09:37:54 +0900</pubDate>
    </item>
    <item>
      <title>[leetCode][알고리즘] 35. Search Insert Position</title>
      <link>https://mizzo-dev.tistory.com/entry/leetCode%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-35-Search-Insert-Position</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/first-bad-version/&quot;&gt;문제&lt;/a&gt;&amp;nbsp;설명&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;LeetCode&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Sans Light';&quot;&gt;35.&amp;nbsp;Search&amp;nbsp;Insert&amp;nbsp;Position&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;찾는 대상이 있다면 해당 index를 리턴하고, 없다면 순서 상 들어갈 곳의 index를 리턴하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;알고리즘 복잡도는 &lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;O(log n)&lt;/span&gt;이어야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;제한사항&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= nums.length &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;-104&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;= nums[i] &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;nums&lt;span&gt;&amp;nbsp;&lt;/span&gt;contains&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;distinct&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;values sorted in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ascending&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;order.&lt;/li&gt;
&lt;li&gt;-104&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;= target &amp;lt;= 104&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;입출력 예&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: nums = [1,3,5,6], target = 5
Output: 2&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: nums = [1,3,5,6], target = 2
Output: 1&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: nums = [1,3,5,6], target = 7
Output: 4&lt;/code&gt;&lt;/pre&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;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://mizzo-dev.tistory.com/entry/leetCode%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-278-First-Bad-Version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이진탐색&lt;/a&gt;으로 찾으면 된다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;i&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;(BinarySearch)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;단, 예외처리 및 빠른 처리를 위해 &lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;target&lt;/span&gt;이 제일 작고/큰 경우만 먼저 체크했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;응용해서 우리는&amp;nbsp;&lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;isBadVersion(version)&lt;/span&gt;&amp;nbsp;기준으로 체크하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;문제의 배열은 1부터 시작하나, 우리는 0부터 체크하는 것만 유의하자.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;nums&lt;/span&gt;는 항상 정렬된 순서로 들어온다는 점을 활용하여 예외처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;&quot;&gt;이진탐색으로 순서상 들어갈 곳&lt;span&gt;(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;자신보다 작은 값 중 제일 큰 값의 다음 위치&lt;/span&gt;)&lt;/span&gt;을 찾는다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Code&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1641306212212&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var searchInsert = function(nums, target) {
    const latest = nums.length-1
    let left = 0, right = latest
    
    if(nums[latest] &amp;lt; target) return latest+1
    else if(nums[0] &amp;gt; target) return 0
    
    let answer = -1
    
    while(left &amp;lt;= right) {
        const i = left + Math.floor((right - left) / 2)
        
        if(nums[i] &amp;lt; target) {
            answer = Math.max(answer, i)
            left = i+1
        } else right = i-1
    }
    return answer+1
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKlePU/btrpHGcMH7u/fTbDoStoK0JwUUeutuGiGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKlePU/btrpHGcMH7u/fTbDoStoK0JwUUeutuGiGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKlePU/btrpHGcMH7u/fTbDoStoK0JwUUeutuGiGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKlePU%2FbtrpHGcMH7u%2FfTbDoStoK0JwUUeutuGiGk%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;1724&quot; height=&quot;882&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>Algorithm</category>
      <category>BinarySearch</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>알고리즘</category>
      <category>이진탐색</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/106</guid>
      <comments>https://mizzo-dev.tistory.com/entry/leetCode%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-35-Search-Insert-Position#entry106comment</comments>
      <pubDate>Tue, 4 Jan 2022 23:24:35 +0900</pubDate>
    </item>
    <item>
      <title>[leetCode][알고리즘] 278. First Bad Version</title>
      <link>https://mizzo-dev.tistory.com/entry/leetCode%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-278-First-Bad-Version</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/first-bad-version/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&amp;nbsp;설명&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;LeetCode&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;278&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;First Bad Version&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;PM이 되어 첫 Bad Version을 찾아라. 불량 이후에 출시된 버전들은 모두 Bad로 체크된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;버전의 개수와 Bad Version임을 알려주는 API(함수)가 주어질 때, 최초 Bad Version 인덱스를 출력하라.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한사항&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1 &amp;lt;= bad &amp;lt;= n &amp;lt;= 231&amp;nbsp;- 1&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; n = 5, bad = 4 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Output:&lt;/b&gt; 4 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Explanation:&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;call isBadVersion(3) -&amp;gt; false &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;call isBadVersion(5)&amp;nbsp;-&amp;gt; true &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;call isBadVersion(4)&amp;nbsp;-&amp;gt; true &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Then 4 is the first bad version.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; n = 1, bad = 1 &lt;br /&gt;&lt;b&gt;Output:&lt;/b&gt; 1&lt;/span&gt;&lt;/blockquote&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;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;이진탐색으로 찾으면 된다.&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;i&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;(BinarySearch)&lt;/span&gt;&lt;/i&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;898&quot; data-origin-height=&quot;601&quot;&gt;&lt;a href=&quot;https://medium.com/quantum-ant/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-13%EC%9E%A5-%ED%83%90%EC%83%89-cbd7cbf7155d&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2LIq0/btrpz3fcYF6/Rf6ZOxBx1yfNgmY1zzxFSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2LIq0%2Fbtrpz3fcYF6%2FRf6ZOxBx1yfNgmY1zzxFSk%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;898&quot; height=&quot;601&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;응용해서 우리는 &lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;isBadVersion(version)&lt;/span&gt; 기준으로 체크하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;문제의 배열은 1부터 시작하나, 우리는 0부터 체크하는 것만 유의하자.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;left = 0, right = n-1 시작, 중간지점&lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;(i)&lt;/span&gt;설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;isBadVersion(version)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;이 false면 해당 지점 이후로 탐색   &lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;left=i+1&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;isBadVersion(version)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;이 true면 min 체크, 해당 지점 이전 탐색   &lt;span style=&quot;background-color: #f7f9fa; color: #546e7a;&quot;&gt;right=i-1&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Code&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1641286904019&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var solution = function(isBadVersion) {
    return function(n) {
        let min = n
        let left = 0, right = n-1
        
        while(left &amp;lt;= right) {
            const i = left + Math.floor((right - left) / 2)
        
            if (isBadVersion(i+1)) {
                min = Math.min(min, i)
                right = i-1
            } else left = i+1
        }
        return min + 1
    };
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU72pK/btrpPErn1zK/6OSEJheWDkdObSWQniMXJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU72pK/btrpPErn1zK/6OSEJheWDkdObSWQniMXJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU72pK/btrpPErn1zK/6OSEJheWDkdObSWQniMXJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU72pK%2FbtrpPErn1zK%2F6OSEJheWDkdObSWQniMXJ1%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;1434&quot; height=&quot;818&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>Algorithm</category>
      <category>BinarySearch</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>이진탐색</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/105</guid>
      <comments>https://mizzo-dev.tistory.com/entry/leetCode%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-278-First-Bad-Version#entry105comment</comments>
      <pubDate>Tue, 4 Jan 2022 18:02:43 +0900</pubDate>
    </item>
    <item>
      <title>[React/Code Splitting] 컴포넌트 Dynamic import하여 lazy loading 적용하기</title>
      <link>https://mizzo-dev.tistory.com/entry/ReactCode-Splitting-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-Dynamic-import%ED%95%98%EC%97%AC-lazy-loading-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;라우팅 구현 중에, 경로에 따라 유동적으로 컴포넌트를 호출하여 보여줄 방법을 고민하다가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;대표적인 성능 개선 기법인 코드분할(code splitting)방식을 응용하여 적용한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드 분할이란?&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;코드 분할은 여러분의 앱을 &amp;ldquo;지연 로딩&amp;rdquo; 하게 도와주고 앱 사용자에게 획기적인 성능 향상을 하게 합니다. 앱의 코드 양을 줄이지 않고도 사용자가 필요하지 않은 코드를 불러오지 않게 하며 앱의 초기화 로딩에 필요한 비용을 줄여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;목표&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1. 목록에서 선택한 값(=ID)에 따라 path 설정하여 라우팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2. 전달받은 route param(=ID) 기준으로 필요한 컴포넌트 lazy loading하여 렌더링&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;구현&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;우선 프로젝트 구조는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9eFDa/btroeAkmSNi/3o4iNnBslpi5YJ4QCTcSF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9eFDa/btroeAkmSNi/3o4iNnBslpi5YJ4QCTcSF0/img.png&quot; data-alt=&quot;스캐폴딩&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9eFDa/btroeAkmSNi/3o4iNnBslpi5YJ4QCTcSF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9eFDa%2FbtroeAkmSNi%2F3o4iNnBslpi5YJ4QCTcSF0%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;208&quot; height=&quot;297&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스캐폴딩&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;path 경로에 따라 projects 폴더 하위의 경로에 있는 index.js를 호출하는게 저의 목표입니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;예시&lt;br /&gt;- /projects/1 -&amp;gt; projects/1/index.js 호출&lt;br /&gt;- /projects/2 -&amp;gt; projects/2/index.js 호출&lt;/blockquote&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 Light';&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;react-router-dom&lt;/span&gt;을 사용하여 라우팅 구현을 해주기 위해,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;App.js에는 아래와 같이 BrowserRouter 설정을 해두었으며, Home이라는 컴포넌트에 링크 설정을 해두었습니다.&lt;/span&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 Light';&quot;&gt;전체 코드가 궁금하신 분들은 아래 '더보기'를 눌러 코드를 확인해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1639901973385&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter as Router } from &quot;react-router-dom&quot;;

ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
      &amp;lt;Router&amp;gt;
          &amp;lt;App /&amp;gt;
      &amp;lt;/Router&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById('root')
);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1639901995587&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Home.js
import logo from '../logo.svg'
import '../App.css';
import {useState} from &quot;react&quot;;
import {Link} from 'react-router-dom';

function Home() {

    const [projects] = useState([{
        id: 1,
        name: 'project1',
        date: '2021.12.06',
    }, {
        id: 2,
        name: 'project2',
        date: '2022.01.06',
    }])

    return (
        &amp;lt;div className=&quot;App&quot;&amp;gt;
            &amp;lt;header className=&quot;black-nav&quot;&amp;gt;
                &amp;lt;img src={logo} alt=&quot;logo&quot; style={{width: '30px'}}/&amp;gt;
                &amp;lt;div&amp;gt;React Portfolio&amp;lt;/div&amp;gt;
            &amp;lt;/header&amp;gt;
            &amp;lt;div className=&quot;main-container&quot;&amp;gt;
                {
                    projects.map((project, i) =&amp;gt; {
                        const {id, name, date} = project
                        return (
                            &amp;lt;div className=&quot;project&quot; key={i}&amp;gt;
                                &amp;lt;h3&amp;gt;
                                    &amp;lt;Link to={`/project/${id}`}&amp;gt;{name}&amp;lt;/Link&amp;gt;
                                &amp;lt;/h3&amp;gt;
                                &amp;lt;p&amp;gt;{date}&amp;lt;/p&amp;gt;
                            &amp;lt;/div&amp;gt;
                        )
                    })
                }
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}

export default Home;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1. 목록에서 선택한 값(=ID)에 따라 path 설정하여 라우팅&lt;/span&gt;&lt;/h4&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 Light';&quot;&gt;우선,&amp;nbsp; react-router-dom 공식문서 내용에 따라 &lt;a title=&quot;nested routing&quot; href=&quot;https://v5.reactrouter.com/web/example/nesting&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;중첩 라우팅(Nested Routing)&lt;/a&gt;을 구현해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;예제와 동일하게 설정하였으며, 선택 값의 ID를 :projectId로 선언하여 Project의 parameter로 전달합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1639901761145&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import './App.css';
import Home from './routes/Home'
import {Route, Switch} from 'react-router-dom';

function App() {
    return (
            &amp;lt;Switch&amp;gt;
                &amp;lt;Route exact path=&quot;/&quot;&amp;gt;
                    &amp;lt;Home/&amp;gt;
                &amp;lt;/Route&amp;gt;
                &amp;lt;Route path='/project/:projectId'&amp;gt;
                    &amp;lt;Project/&amp;gt;
                &amp;lt;/Route&amp;gt;
            &amp;lt;/Switch&amp;gt;
    );
}

function Project() {
    const {projectId} = useParams();
    console.log(projectId)
    // TODO 필요한 컴포넌트를 import해 리턴할 예정입니다.
    return &amp;lt;&amp;gt;&amp;lt;/&amp;gt;
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2. 전달받은 route param(=ID) 기준으로 필요한 컴포넌트 lazy loading&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;위에 명시한 스캐폴딩 구조에 따라, 전달받은 parameter(=ID) 기준으로 모듈을 import 해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;단 미리 import하는 방식은 비효율적이므로, 필요할 때만 유동적으로 호출 할 수 있도록 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;React.lazy&lt;/span&gt;를 활용하겠습니다.&lt;/span&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 Light';&quot;&gt;&lt;a title=&quot;React 코드분할&quot; href=&quot;https://ko.reactjs.org/docs/code-splitting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React 코드분할 공식문서&lt;/a&gt; 내용에 따라 아래와 같이 설정하였습니다.&lt;/span&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 Light';&quot;&gt;- React.lazy&amp;nbsp;함수를 사용하면 동적 import를 사용해서 컴포넌트를 렌더링 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp;=&amp;gt; Project 내에서 ID 기반으로 경로를 설정하여 컴포넌트를 렌더링합시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(*참고로 index는 생략 가능합니다. 상위 폴더까지 지정하면 자동 호출 됨)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;- 참고로 lazy loading되는 모듈은 반드시 &lt;u&gt;&lt;span&gt;default &lt;/span&gt;export&lt;/u&gt; 되어야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1639902690583&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Project() {
    const {projectId} = useParams();
    const Component = lazy(() =&amp;gt; import(`./projects/${projectId}`))
    return &amp;lt;Component/&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;여기까지하면 에러가 발생될텐데, 그 이유는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;lazy 컴포넌트는 Suspense 컴포넌트 하위에서 렌더링되어야 하기 때문&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;- Suspense는 lazy 컴포넌트가 로드되길 기다리는 동안 로딩 화면과 같은 예비 컨텐츠를 보여줄 수 있게 해줍니다&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; &amp;nbsp;=&amp;gt; 우리도 예제와 같이 로딩 중임을 알려줍시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1639902976557&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
    return (
        &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;}&amp;gt;
            &amp;lt;Switch&amp;gt;
                &amp;lt;Route exact path=&quot;/&quot;&amp;gt;
                    &amp;lt;Home/&amp;gt;
                &amp;lt;/Route&amp;gt;
                &amp;lt;Route path='/project/:projectId'&amp;gt;
                    &amp;lt;Project/&amp;gt;
                &amp;lt;/Route&amp;gt;
            &amp;lt;/Switch&amp;gt;
        &amp;lt;/Suspense&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그럼 끝  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/React</category>
      <category>code splitting</category>
      <category>dynamic import</category>
      <category>lazy loading</category>
      <category>nested routing</category>
      <category>React</category>
      <category>React router</category>
      <category>코드분할</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/104</guid>
      <comments>https://mizzo-dev.tistory.com/entry/ReactCode-Splitting-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-Dynamic-import%ED%95%98%EC%97%AC-lazy-loading-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0#entry104comment</comments>
      <pubDate>Sun, 19 Dec 2021 17:39:30 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers 알고리즘][86971] 9주차_전력망을 둘로 나누기</title>
      <link>https://mizzo-dev.tistory.com/entry/Programmers-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%9886971-9%EC%A3%BC%EC%B0%A8%EC%A0%84%EB%A0%A5%EB%A7%9D%EC%9D%84-%EB%91%98%EB%A1%9C-%EB%82%98%EB%88%84%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/86971&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&amp;nbsp;설명&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Programmers Weekly Challenge &lt;br /&gt;9 week&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어지며,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;n개의 송전탑이 하나의&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Tree_(data_structure)&quot;&gt;트리&lt;/a&gt; 형태로 연결되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한사항&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;n은 2 이상 100 이하인 자연수입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;wires는 길이가&amp;nbsp;n-1인 정수형 2차원 배열입니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1 &amp;le; v1 &amp;lt; v2 &amp;le; n&lt;/span&gt; 입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;전력망 네트워크가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 88px;&quot; border=&quot;1&quot; data-ke-style=&quot;style8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Light';&quot;&gt;N&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Light';&quot;&gt;wires&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Light';&quot;&gt;result&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;9&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;[[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;[[1,2],[2,3],[3,4]]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;7&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;[[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;wires에 따라, 트리를 완성 &lt;i&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;(addConnect)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;tree = [], tree[v-1] = [connected list]로 구성됨 &lt;i&gt;(v는 1부터 시작, tree는 0부터 시작)&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;wire = [v1, v2] 에 대해 tree에 각각 연결 노드 저장해준다. &lt;u&gt;(&lt;span&gt;v1 -&amp;gt; v2, v2 -&amp;gt; v1&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;다시 wires를 돌며, &lt;/span&gt;각 전선이 끊어졌을 때의 차이를 구하고 min을 갱신 &lt;i&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;(updateDiff)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;한쪽 전력망의 송전탑 개수를 구한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타겟 노드의 연결된 노드 중 끊어진 노드를 제외한 모든 노드의 개수를 구한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;각 노드가 혼자 남을때 까지 재귀 방문하여 총 개수를 구한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;차이를 구한 후 min을 갱신한다. (차이 = &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;i&gt;절대값&lt;/i&gt;(C*2 - N)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;/span&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Check Point&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;트리는 N개의 노드와, N-1개의 간선으로 이루어져 있다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;하나의 트리 형태이므로, 최대 개수 차이는 N-1이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;한쪽 전력망(트리)의 송전탑(노드) 개수가 C라고 했을 때, 다른쪽의 개수는 N-C이다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;즉, 차이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;u&gt;&lt;i&gt;절대값&lt;/i&gt;(C - (N - C))&lt;/u&gt;&lt;/b&gt;이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt; &lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;i&gt;절대값&lt;/i&gt;(C*2 - N)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;전력탑의 개수를 구할 때 체크하는 노드의 수를 항상 추가한다. (+1)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;v번 노드에 연결된 노드의 총 개수를 count(v)라고 할 때&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;총 개수 = count(v) + 1(자기 자신)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;인덱스와 문제의 전선 정보(노드 숫자)가 다르지 않은지 잘 체크하자.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;나의 경우 input 전선 정보(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1 &amp;le; v1 &amp;lt; v2 &amp;le; n&lt;/span&gt;&lt;span&gt;&lt;span&gt;)이지만, Tree 인덱스는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;0~n-1&lt;/span&gt;로 지정했다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Code&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;효율성보다 가독성에 중점을 둔 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1634482608597&quot; class=&quot;javascript&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution(n, wires) {
    class Tree {
        tree;
        min;

        constructor(n) {
            this.tree = new Array(n);
            this.min = n-1;
        }

        addConnect(v1, v2) {
            this.connect(v1, v2);
            this.connect(v2, v1);
        }

        connect(v, target) {
            const connected = this.tree[v-1] || [];
            connected.push(target);
            this.tree[v-1] = connected;
        }

        size(v) {
            return (this.tree[v-1] || []).length;
        }

        getCount(v, except) {
            if(this.size(v) === 1)
                return 1;
            const connected = this.tree[v-1] || [];
            return connected.reduce((pev, cur) =&amp;gt; {
                if (cur === except) return pev;
                return pev + this.getCount(cur, v);
            }, 0) + 1;
        }

        updateDiff(v1, v2) {
            const v1Count = this.getCount(v1, v2);
            const diff = Math.abs(v1Count * 2 - n);
            this.min = Math.min(this.min, diff);
        }
    }
    const tree = new Tree(n);
    wires.forEach(([v1, v2]) =&amp;gt; tree.addConnect(v1, v2));
    wires.forEach(([v1, v2]) =&amp;gt; tree.updateDiff(v1, v2));

    return tree.min;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다른 풀이들을 보니, DP 문제로 &lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;메모이제이션&lt;/a&gt; 방식으로 좀 더 시간 복잡도를 줄일 수 있을 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Algorithm</category>
      <category>9주차</category>
      <category>Algorithm</category>
      <category>programmers</category>
      <category>tree</category>
      <category>week9</category>
      <category>weeklyChallenge</category>
      <category>알고리즘</category>
      <category>위클리챌린지</category>
      <category>트리</category>
      <category>프로그래머스</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/103</guid>
      <comments>https://mizzo-dev.tistory.com/entry/Programmers-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%9886971-9%EC%A3%BC%EC%B0%A8%EC%A0%84%EB%A0%A5%EB%A7%9D%EC%9D%84-%EB%91%98%EB%A1%9C-%EB%82%98%EB%88%84%EA%B8%B0#entry103comment</comments>
      <pubDate>Mon, 18 Oct 2021 00:39:27 +0900</pubDate>
    </item>
    <item>
      <title>[React / Bugfix] Unknown Prop Warning</title>
      <link>https://mizzo-dev.tistory.com/entry/React-Bugfix-Unknown-Prop-Warning</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;버그 내용&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;Warning: React does not recognize the `computedMatch` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `computedmatch` instead. If you accidentally passed it from a parent component, remove it from the DOM element.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;3584&quot; data-origin-height=&quot;216&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u1fdK/btrgC5FUnkh/UjaNgcOi1RdcsOXcLwnyK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u1fdK/btrgC5FUnkh/UjaNgcOi1RdcsOXcLwnyK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u1fdK/btrgC5FUnkh/UjaNgcOi1RdcsOXcLwnyK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu1fdK%2FbtrgC5FUnkh%2FUjaNgcOi1RdcsOXcLwnyK1%2Fimg.png&quot; data-origin-width=&quot;3584&quot; data-origin-height=&quot;216&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;원인&lt;/h4&gt;
&lt;figure id=&quot;og_1633324947067&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;react warning computedMatch regarding some case issues?&quot; data-og-description=&quot;I have props named as isAuthenticated and it also shows that some case warning persists in my console. Please check it. import React,{Component} from &amp;quot;react&amp;quot;; import {BrowserRouter as Router, Swit...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/51971449/react-warning-computedmatch-regarding-some-case-issues&quot; data-og-url=&quot;https://stackoverflow.com/questions/51971449/react-warning-computedmatch-regarding-some-case-issues&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uZN8W/hyLPtV5RGP/K38HOVh2cWN50F8lNn1XuK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/51971449/react-warning-computedmatch-regarding-some-case-issues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/51971449/react-warning-computedmatch-regarding-some-case-issues&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uZN8W/hyLPtV5RGP/K38HOVh2cWN50F8lNn1XuK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;react warning computedMatch regarding some case issues?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have props named as isAuthenticated and it also shows that some case warning persists in my console. Please check it. import React,{Component} from &quot;react&quot;; import {BrowserRouter as Router, Swit...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1633324955543&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Unknown Prop Warning &amp;ndash; React&quot; data-og-description=&quot;A JavaScript library for building user interfaces&quot; data-og-host=&quot;reactjs.org&quot; data-og-source-url=&quot;https://reactjs.org/warnings/unknown-prop.html&quot; data-og-url=&quot;https://reactjs.org/warnings/unknown-prop.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pm3HU/hyLPfXRCgK/xWx4XfDiFoKHqZHNV2ir90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://reactjs.org/warnings/unknown-prop.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://reactjs.org/warnings/unknown-prop.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pm3HU/hyLPfXRCgK/xWx4XfDiFoKHqZHNV2ir90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Unknown Prop Warning &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;reactjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The unknown-prop warning will fire if you attempt to render a DOM element with a prop that is not recognized by React as a legal DOM attribute/property. You should ensure that your DOM elements do not have spurious props floating around.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;불확실한, 알 수 없는 DOM 요소를 렌더링하려고 할 때 발생되는 에러인 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;문서 내용을 보아하니, 불확실한 props 요소를 사용하여 렌더링할 때도 발생되는 에러로 확인된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;나의 경우 react-router-dom을 사용하던 중, &lt;code&gt;&amp;lt;Switch&amp;gt;&lt;/code&gt; 하위에 삼항 연산자를 사용하여 HTML Tag를 지정해주어 발생된 문제였다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해결&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;어디까지나 아래 케이스에 대한 해결법일 뿐이니 참고만 부탁드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;react-router-dom의 &lt;code&gt;&amp;lt;Switch&amp;gt;&lt;/code&gt; 하위에 &lt;a href=&quot;https://reactjs-kr.firebaseapp.com/docs/fragments.html&quot;&gt;Fragment&lt;/a&gt;를 추가해주었다. (&lt;code&gt;&amp;lt;&amp;gt;&amp;lt;/&amp;gt;&lt;/code&gt;)&lt;/span&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;background-color: #456771; color: #ffffff;&quot;&gt;  관련 코드 보기&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Before&lt;/p&gt;
&lt;pre id=&quot;code_1633325028403&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const AppRouter = ({ isLoggedIn, userObj, refreshUser }) =&amp;gt; {

    return (
        &amp;lt;Router&amp;gt;
            {isLoggedIn &amp;amp;&amp;amp; &amp;lt;Navigator userName={userObj.displayName} /&amp;gt;}
            &amp;lt;Switch&amp;gt;
                {

                    isLoggedIn ? (
                        &amp;lt;div
                            style={{
                                maxWidth: 890,
                                width: &quot;100%&quot;,
                                margin: &quot;0 auto&quot;,
                                marginTop: 80,
                                display: &quot;flex&quot;,
                                justifyContent: &quot;center&quot;,
                            }}
                        &amp;gt;
                            &amp;lt;Route exact path=&quot;/&quot;&amp;gt;
                                &amp;lt;Home userObj={userObj} /&amp;gt;
                            &amp;lt;/Route&amp;gt;
                            &amp;lt;Route exact path=&quot;/profile&quot;&amp;gt;
                                &amp;lt;Profile userObj={userObj} refreshUser={refreshUser} /&amp;gt;
                            &amp;lt;/Route&amp;gt;
                        &amp;lt;/div&amp;gt;
                    ) : (
                        &amp;lt;&amp;gt;
                            &amp;lt;Route exact path=&quot;/&quot;&amp;gt;
                                &amp;lt;Auth /&amp;gt;
                            &amp;lt;/Route&amp;gt;
                        &amp;lt;/&amp;gt;
                    )
                }
            &amp;lt;/Switch&amp;gt;
        &amp;lt;/Router&amp;gt;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;After&lt;/p&gt;
&lt;pre id=&quot;code_1633325039012&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const AppRouter = ({ isLoggedIn, userObj, refreshUser }) =&amp;gt; {

    return (
        &amp;lt;Router&amp;gt;
            {isLoggedIn &amp;amp;&amp;amp; &amp;lt;Navigator userName={userObj.displayName} /&amp;gt;}
            &amp;lt;Switch&amp;gt;
                &amp;lt;&amp;gt;
                    {
                        isLoggedIn ? (
                            &amp;lt;div
                                style={{
                                    maxWidth: 890,
                                    width: &quot;100%&quot;,
                                    margin: &quot;0 auto&quot;,
                                    marginTop: 80,
                                    display: &quot;flex&quot;,
                                    justifyContent: &quot;center&quot;,
                                }}
                            &amp;gt;
                                &amp;lt;Route exact path=&quot;/&quot;&amp;gt;
                                    &amp;lt;Home userObj={userObj} /&amp;gt;
                                &amp;lt;/Route&amp;gt;
                                &amp;lt;Route exact path=&quot;/profile&quot;&amp;gt;
                                    &amp;lt;Profile userObj={userObj} refreshUser={refreshUser} /&amp;gt;
                                &amp;lt;/Route&amp;gt;
                            &amp;lt;/div&amp;gt;
                        ) : (
                            &amp;lt;&amp;gt;
                                &amp;lt;Route exact path=&quot;/&quot;&amp;gt;
                                    &amp;lt;Auth /&amp;gt;
                                &amp;lt;/Route&amp;gt;
                            &amp;lt;/&amp;gt;
                        )
                    }
                &amp;lt;/&amp;gt;
            &amp;lt;/Switch&amp;gt;
        &amp;lt;/Router&amp;gt;);
}

export default AppRouter;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Frontend/React</category>
      <category>Bug</category>
      <category>React</category>
      <category>react-router-dom</category>
      <category>SWITCH</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/102</guid>
      <comments>https://mizzo-dev.tistory.com/entry/React-Bugfix-Unknown-Prop-Warning#entry102comment</comments>
      <pubDate>Mon, 4 Oct 2021 14:24:44 +0900</pubDate>
    </item>
    <item>
      <title>디버깅을 시각화해주는 온라인 코드 비주얼라이저 PythonTutor(w/ JavaScript ...)</title>
      <link>https://mizzo-dev.tistory.com/entry/%EB%94%94%EB%B2%84%EA%B9%85%EC%9D%84-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%B4%EC%A3%BC%EB%8A%94-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%BD%94%EB%93%9C-%EB%B9%84%EC%A3%BC%EC%96%BC%EB%9D%BC%EC%9D%B4%EC%A0%80-PytonTutorw-JavaScript</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;책을 보다가 디버깅하기 좋은 사이트를 알게되어 추천하고자 글을 쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;코딩테스트, 알고리즘 문제 풀 때 굉장히 유용하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;온라인 코드 비주얼라이저 &lt;a href=&quot;https://pythontutor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PythonTutor&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;접속하면 아래와 같은 화면이 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1876&quot; width=&quot;500&quot; height=&quot;506&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TExkS/btrgfN56kSm/TWzC9tF4jt9Gc1WWGRkKM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TExkS/btrgfN56kSm/TWzC9tF4jt9Gc1WWGRkKM1/img.png&quot; data-alt=&quot;PythonTutor 메인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TExkS/btrgfN56kSm/TWzC9tF4jt9Gc1WWGRkKM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTExkS%2FbtrgfN56kSm%2FTWzC9tF4jt9Gc1WWGRkKM1%2Fimg.png&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1876&quot; width=&quot;500&quot; height=&quot;506&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;PythonTutor 메인 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;화면 내용처럼 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;코드를 입력하면&amp;nbsp;시각화 해주고 디버깅&lt;/span&gt;해주며&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;어떤 시점에서 어떤 값이 변하고 함수 호출 스택이 바뀌었는지 쉽게 확인할 수 있게 해주는 사이트이다.&lt;/span&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 Light';&quot;&gt;이름 때문에 Python만 되는 줄 알았는데 다행히 아래와 같이 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;여러 언어를 지원&lt;/span&gt;하고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Python&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;JavaScript&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Java&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;C / C++&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Ruby&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사용방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;간단하다. 사이트 접속 후 언어를 선택하고 코드를 삽입, [Visualize Execution] 버튼만 누르면 끝.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;단, 아래 사진처럼 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;1000 스텝 이상의 케이스에 대해선 지원을 하고 있지 않다&lt;/u&gt;&lt;/span&gt;고하니 주의하자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;1156&quot; data-filename=&quot;blob&quot; width=&quot;600&quot; height=&quot;470&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YcVoB/btrgcBrAvwt/JgVoBwsEcQwDIzuD1fQSR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YcVoB/btrgcBrAvwt/JgVoBwsEcQwDIzuD1fQSR0/img.png&quot; data-alt=&quot;실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YcVoB/btrgcBrAvwt/JgVoBwsEcQwDIzuD1fQSR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYcVoB%2FbtrgcBrAvwt%2FJgVoBwsEcQwDIzuD1fQSR0%2Fimg.png&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;1156&quot; data-filename=&quot;blob&quot; width=&quot;600&quot; height=&quot;470&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 화면&lt;/figcaption&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 Light';&quot;&gt;그럼 아래처럼 코드가 실행되는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;왼쪽 하단의 버튼들을 클릭해서 다음 스텝으로 넘어가며 추적하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2710&quot; data-origin-height=&quot;1910&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFa113/btrgbaA2bht/Tq99c2dJDTLBriB63QfQO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFa113/btrgbaA2bht/Tq99c2dJDTLBriB63QfQO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFa113/btrgbaA2bht/Tq99c2dJDTLBriB63QfQO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFa113%2FbtrgbaA2bht%2FTq99c2dJDTLBriB63QfQO1%2Fimg.png&quot; data-origin-width=&quot;2710&quot; data-origin-height=&quot;1910&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;왼쪽 화면에선 내가 어느 라인에 있는지, 재귀 중인지 등 시점을 확인할 수 있고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;오른쪽 화면에선 해당 스텝에서 추적된 시각화된 결과가 도출된다.&lt;/span&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 Light';&quot;&gt;배열 등 자료구조를 시각화 해주어서 매우 신박하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;디버깅 많으로 헷갈려서 직접 그리며 하는 경우가 있는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그럴 필요 없이 이 사이트에서 돌려보면 될 것 같다!  &lt;/span&gt;&lt;/p&gt;</description>
      <category>Etc/Tip</category>
      <category>JavaScript</category>
      <category>PythonTutor</category>
      <category>디버깅</category>
      <category>코드 비주얼라이저</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/101</guid>
      <comments>https://mizzo-dev.tistory.com/entry/%EB%94%94%EB%B2%84%EA%B9%85%EC%9D%84-%EC%8B%9C%EA%B0%81%ED%99%94%ED%95%B4%EC%A3%BC%EB%8A%94-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%BD%94%EB%93%9C-%EB%B9%84%EC%A3%BC%EC%96%BC%EB%9D%BC%EC%9D%B4%EC%A0%80-PytonTutorw-JavaScript#entry101comment</comments>
      <pubDate>Tue, 28 Sep 2021 17:28:33 +0900</pubDate>
    </item>
    <item>
      <title>스파르타 코딩 신년운세 코딩 패키지 회고록</title>
      <link>https://mizzo-dev.tistory.com/entry/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EC%BD%94%EB%94%A9-%EC%8B%A0%EB%85%84%EC%9A%B4%EC%84%B8-%EC%BD%94%EB%94%A9-%ED%8C%A8%ED%82%A4%EC%A7%80-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2522&quot; data-origin-height=&quot;1158&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/29nKL/btrgcl8URsw/UK9d2FulksFz1kXmczIkKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/29nKL/btrgcl8URsw/UK9d2FulksFz1kXmczIkKk/img.png&quot; data-alt=&quot;(이런 배너였던 것 같음)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/29nKL/btrgcl8URsw/UK9d2FulksFz1kXmczIkKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F29nKL%2Fbtrgcl8URsw%2FUK9d2FulksFz1kXmczIkKk%2Fimg.png&quot; data-origin-width=&quot;2522&quot; data-origin-height=&quot;1158&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(이런 배너였던 것 같음)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;어느날 카톡 배너에 스파르타 코딩 광고가 나와서 홀린듯이 들어가서 내용을 확인해봤고...&lt;/span&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-origin-width=&quot;2242&quot; data-origin-height=&quot;1852&quot; width=&quot;600&quot; height=&quot;496&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ff7f8/btrgcBxbsgC/KMxY28KRMq3kjsSs1SfWKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ff7f8/btrgcBxbsgC/KMxY28KRMq3kjsSs1SfWKk/img.png&quot; data-alt=&quot;안 할 수가 없잖아....  &amp;amp;amp;zwj;♀️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ff7f8/btrgcBxbsgC/KMxY28KRMq3kjsSs1SfWKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFf7f8%2FbtrgcBxbsgC%2FKMxY28KRMq3kjsSs1SfWKk%2Fimg.png&quot; data-origin-width=&quot;2242&quot; data-origin-height=&quot;1852&quot; width=&quot;600&quot; height=&quot;496&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;안 할 수가 없잖아....  &amp;zwj;♀️&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;경품을 보고 무의식적으로 참여를 눌렀다.......&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;u&gt;비록 시작은 경품이었지만 끝은 유익함으로 얻었던 강의&lt;/u&gt;에 대한 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;간단한 회고록&lt;/span&gt;&lt;/b&gt; 및 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;스파르타 코딩 체험 후기&lt;/span&gt;&lt;/b&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;h3 data-ke-size=&quot;size23&quot;&gt;참여한 강의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;4개의 강의 중 하나를 선택해서 48시간 안에 강의를 학습하고 과제를 제출하는 방식이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;나는 그 중 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;lt;전시하라/&amp;gt; (a.k.a 2021 신년운세)&lt;/b&gt;&lt;/span&gt; 강의를 학습하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1786&quot; width=&quot;600&quot; height=&quot;462&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSnPgn/btrf9CX9L6N/22Q03OHWKngkmEux5nTY1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSnPgn/btrf9CX9L6N/22Q03OHWKngkmEux5nTY1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSnPgn/btrf9CX9L6N/22Q03OHWKngkmEux5nTY1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSnPgn%2Fbtrf9CX9L6N%2F22Q03OHWKngkmEux5nTY1K%2Fimg.png&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1786&quot; width=&quot;600&quot; height=&quot;462&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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 Light';&quot;&gt;유일하게 난이도 ⭐️&lt;span&gt;⭐️ 이라서 선택하였지만,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;웹 개발자인 나로서는 기초에 가까운 내용이어서 복습, back to the basic에 목표를 두고 강의를 수강하였다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;3574&quot; data-origin-height=&quot;2014&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5j4hg/btrf7Aff1tW/sByHNExkrk3hWJ3AZA8ro1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5j4hg/btrf7Aff1tW/sByHNExkrk3hWJ3AZA8ro1/img.png&quot; data-alt=&quot;결과물!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5j4hg/btrf7Aff1tW/sByHNExkrk3hWJ3AZA8ro1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5j4hg%2Fbtrf7Aff1tW%2FsByHNExkrk3hWJ3AZA8ro1%2Fimg.png&quot; data-origin-width=&quot;3574&quot; data-origin-height=&quot;2014&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과물!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;제공해주시는 이미지, css를 참고하여 개발했더니 완성 페이지가 너무 귀여워서 만족스럽다.  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;결과물은 &lt;a href=&quot;https://new-year.spartacodingclub.kr/TTfy48kXNvSo/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;서 확인할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;여러 사이트에서 강의 따라 학습 진행해봤지만, 파일 업로드로 배포까지 할 수 있게 해준 사이트는 처음이다... &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;개인 서버가 없어서 결과물을 로컬에서만 돌리던게 항상 아쉬웠는데..!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;처음 개발하시는 분들이 배포해서 자랑할 수 있게하다니! 코린이들의 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; letter-spacing: 0px;&quot;&gt;흥미를 더 키워줄 수 있을 것 같다고 느꼈다. ㅎㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회고록&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;01de&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;수강 목적&lt;/b&gt;: &lt;span&gt;복습, back to the basic&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li id=&quot;6f77&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;배운 점/잘한 점&lt;/b&gt;: &lt;span&gt;프레임워크 없이&amp;nbsp; HTML, CSS, JavaScript만으로 웹 페이지 개발을 시간 내에 도전&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;보완/발전하고 싶은 점&lt;/b&gt;: 이직을 위한 프론트엔드 과제 풀이를 위하여 Vanila JS 기반의 더 난이도 있는 문제들을 풀어서 속도 및 실력 향상&lt;/span&gt;&lt;/li&gt;
&lt;li id=&quot;ce37&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;앞으로의 계획 &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;: 학습한 내용을 바탕으로 웹 과제 실습, 연습 (프로그래머스 등으로)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스파르타 코딩 체험 후기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사실 스파르타 코딩은 마케팅으로 많이 만나서, 인스타그램 이벤트 같은 것만 참여만 진행하고 강의를 직접 들어본적이 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이번 계기로 간단하게나마 강의를 체험해 볼 수 있었는데, 다른 학습 사이트와 비교해서 장점이 많이 보여서 언급을 해보고자 한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹 페이지가 재미있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다른 사이트와 다르게 게임 형식으로 디자인이 되어 있어서 직접 퀘스트를 깨는 느낌이 들어 흥미로웠다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;전체적으로 인터랙션이나 UI/UX가 깔끔하고 학습에 최적화되었단 느낌이 들었다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그래서 그런지 사이트에 좀 더 머물고 싶단 느낌이 있었던 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정리가 잘되어 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;내가 학습한 강의만 그런진 잘 모르겠지만, 노션으로 강의 내용을 정리해두셔서 복습하기 편했다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;코드 뿐만 아니라, 내용도 정리되어 있어 별도로 정리가 필요없단 것도 좋았다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다만, 직접 코드를 작성하고 정리하는데 방해가 되기도 해서 학습하는데 어쩌면 단점이 될 수도 있을 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;강의가 다양하고 구성이 좋다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;메인을 보니 비전공자가 더 많이 학습하는 사이트 같다는 느낌을 받았는데, 그래서 그런지 &lt;span&gt;비개발자, 비전공자에게 큰 도움이 될 것 같은 강의가 많다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;부트 캠프도 있었다. &lt;a href=&quot;https://hanghae99.spartacodingclub.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;항해 99&lt;/a&gt;? 실제로 비전공자인데 개발 직무로 이직을 준비 중인 친구가 실무와 가까운 협업 프로젝트를 하고 싶다고 말해왔어서, 바로 추천해주었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;강의 완주를 위해 카톡 알람, 매니저 전화도 온다고 한다. 생각보다 강의 완강이 힘든데 괜찮은 제도 같다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;생각보다 다양하고 전문적인 강의 들이 많아 보였다. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;전공자, 현업 개발자(나)를 위한 강의는 비교적 적을 것 같다 생각했는데 알고리즘부터 프론트엔드 리액트 심화반까지 많았다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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 Light';&quot;&gt;이번 강의 학습 회고보다 스파르타 코딩 후기가 많이 긴데....  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;강의 학습 내용도 좋았지만,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;좋은 교육 사이트를 찾은 것 같아서 더 뿌듯하기 때문에 그런걸로 ㅎㅎ&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;리액트 강의 학습 한번 고민해봐야겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Etc</category>
      <category>spartacodingclub</category>
      <category>스파르타 코딩</category>
      <category>웹 개발 강의</category>
      <category>프론트엔드 강의</category>
      <author>mizzo</author>
      <guid isPermaLink="true">https://mizzo-dev.tistory.com/100</guid>
      <comments>https://mizzo-dev.tistory.com/entry/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EC%BD%94%EB%94%A9-%EC%8B%A0%EB%85%84%EC%9A%B4%EC%84%B8-%EC%BD%94%EB%94%A9-%ED%8C%A8%ED%82%A4%EC%A7%80-%ED%9A%8C%EA%B3%A0%EB%A1%9D#entry100comment</comments>
      <pubDate>Tue, 28 Sep 2021 00:54:15 +0900</pubDate>
    </item>
  </channel>
</rss>