<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>하여름의 괴발개발</title>
    <link>https://summerhatescoding.tistory.com/</link>
    <description>개발이 싫은 개발자의 공부기록입니다. </description>
    <language>ko</language>
    <pubDate>Mon, 25 May 2026 08:31:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev여름</managingEditor>
    <item>
      <title>MCP Server 만들어보기</title>
      <link>https://summerhatescoding.tistory.com/entry/MCP-Server-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MCP를 사용해보고 어언 7개월이 지났는데 그동안 난 발전한게 1도 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7개월전의 나는 내 AI활용능력이 폭발적으로 증가할줄 알았지만 전혀 발전하지 않았고 (공부를 안했으니까요..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 성능이 더 뛰어난 제미나이3와 클로드 4.5 Opus, 그리고 GPT 5.2가 나와서 점점 멍청해지는중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매우 늦었지만 지금이라도 따라잡기 위해 MCP를 만드는 법을 배워보자&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MCP 기본 구조&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/48pN1/dJMcaa4WvkM/Omch8e9n4CYMgoEw9J47i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/48pN1/dJMcaa4WvkM/Omch8e9n4CYMgoEw9J47i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/48pN1/dJMcaa4WvkM/Omch8e9n4CYMgoEw9J47i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F48pN1%2FdJMcaa4WvkM%2FOmch8e9n4CYMgoEw9J47i1%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;917&quot; height=&quot;297&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림 예시에서 &lt;b&gt;VSCode가 호스트의 역할&lt;/b&gt;을 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;VSCode가 MCP 서버와 연결을 생성하면, 런타임에서 MCP서버와 연결을 유지하는 MCP 클라이언트 오브젝트를 인스턴스화 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한 그림을 보면 MCP Server 종류가 두가지가 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Local : STDIO 전송을 사용하는 동일한 컴퓨터에서만 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Remote : 그림에서 공식 센트리 Remote MCP는 센트리 플랫폼에서 돌고, Streamable HTTP 전송을 사용한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MCP Host (호스트)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 MCP 클라이언트를 조정하고 관리하는 AI 어플리케이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Desktop, IDE copilot 등&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;MCP Client&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 서버와 연결을 1:1로 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트가 사용할 수 있도록 MCP 서버로부터 컨텍스트를 가져온다&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;h3 data-ke-size=&quot;size23&quot;&gt;MCP Server&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 클라이언트에게 기능이나 리소스 제공&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;/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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MCP Server의 3가지 핵심기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 표준화된 프로토콜 인터페이스를 통해 AI 애플리케이션에 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;근데 도대체 표준화된 프로토콜 인터페이스가 뭔데??&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 예시로 문서 접근을 위한 파일시스템 서버, 데이터 쿼리를 위한 데이터베이스 서버, 슬랙 기능을 제공하는 Slack 서버, 일정 관리를 위한 구글 캘린더 서버 등이 있을 수 있다.&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;Resources&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 컨텍스트를 이해하는데 필요한 파일, API, 데이터베이스 같은 데이터를 노출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 리소스는 고유한 URI를 갖고 적절한 처리를 위해 MIME타입을 선언해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(MIME 타입이 뭔지 몰라서 찾아봤는데 파일의 종류와 형식을 알려주는 표준 식별자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들면 application/json 이나 text/html, image/jpeg 등)&lt;/p&gt;
&lt;pre id=&quot;code_1766316976148&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;uriTemplate&quot;: &quot;weather://forecast/{city}/{date}&quot;,
  &quot;name&quot;: &quot;weather-forecast&quot;,
  &quot;title&quot;: &quot;Weather Forecast&quot;,
  &quot;description&quot;: &quot;Get weather forecast for any city and date&quot;,
  &quot;mimeType&quot;: &quot;application/json&quot;
}&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;UI 패턴이 필수가 아니라서 텍스트 기반으로도 사용이 가능하고 주로 검색이나 대량선택, 기존 파일 브라우저와 데이터 탐색기 등에 적합하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Tools&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 모델이 작업을 수행할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tool을 정의한다는건 유형이 지정된 입력과 출력 작업을 정의하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 모델은 &lt;b&gt;컨텍스트에 기반해 어떤 tool 실행을 할지 선택한 뒤, 사용자한테 내가 이걸 쓸테니 승인해달라는 요청&lt;/b&gt;을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 구조를 갖고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1766317637712&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;tool 이름&quot;,
  &quot;description&quot;: &quot;tool에 대한 설명&quot;,
  &quot;inputSchema&quot;: {
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
      &quot;매개변수1&quot;: {
        &quot;type&quot;: &quot;string&quot;,
        &quot;description&quot;: &quot;매개변수 설명&quot;
      }
    },
    &quot;required&quot;: [&quot;필수 매개변수 목록&quot;]
  }
}&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;&quot;12월 25일에 인천에서 삿포로로 가는 비행기 찾아줘&quot; 라고 명령을 하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 tool을 갖고 있는 AI는 이것을 활용한다는..? 그런 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이제 이것만 정의해선 제대로 수행을 못할 것이고 실제로 검색할 수 있도록 뭔가 해야겠지&lt;/p&gt;
&lt;pre id=&quot;code_1766317684898&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  name: &quot;searchFlights&quot;,
  description: &quot;Search for available flights&quot;,
  inputSchema: {
    type: &quot;object&quot;,
    properties: {
      origin: { type: &quot;string&quot;, description: &quot;Departure city&quot; },
      destination: { type: &quot;string&quot;, description: &quot;Arrival city&quot; },
      date: { type: &quot;string&quot;, format: &quot;date&quot;, description: &quot;Travel date&quot; }
    },
    required: [&quot;origin&quot;, &quot;destination&quot;, &quot;date&quot;]
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prompt&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 생각하는 그 프롬프트가 맞는 것 같은데, 시스템에 미리 입력해두는 프롬프트인듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 서버를 잘 활용할 수 있도록 방법을 정의해두는 듯..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예상되는 입력값과 상호작용 패턴을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명시적 호출이 필요함 : 보통 '/'를 입력했을때 뜨는 명령어들이 프롬프트에 해당한다..&lt;/p&gt;
&lt;pre id=&quot;code_1766318149771&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;프롬프트 이름&quot;, 
  &quot;title&quot;: &quot;프롬프트 제목&quot;,
  &quot;description&quot;: &quot;프롬프트 설명&quot;,
  &quot;arguments&quot;: [
    { &quot;name&quot;: &quot;매개변수 이름&quot;, &quot;type&quot;: &quot;string&quot;, &quot;required&quot;: 필수여부(true/false) },
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;날씨 어플리케이션 MCP서버 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/docs/develop/build-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://modelcontextprotocol.io/docs/develop/build-server&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1766318293633&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;Build an MCP server - Model Context Protocol&quot; data-og-description=&quot;Get started building your own server to use in Claude for Desktop and other clients.&quot; data-og-host=&quot;modelcontextprotocol.io&quot; data-og-source-url=&quot;https://modelcontextprotocol.io/docs/develop/build-server&quot; data-og-url=&quot;https://modelcontextprotocol.io/docs/develop/build-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIAuAv/hyZODx1bBa/9GRhUc4CepbdFc4KvfTvK1/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/BVX1S/hyZOJygf5S/0AQwwgZW6gFR58KWGj69EK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/c6Wgle/hyZP32Zqrx/9KNrTj9mQL65Vlku2wncr0/img.png?width=2809&amp;amp;height=1850&amp;amp;face=0_0_2809_1850&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/docs/develop/build-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://modelcontextprotocol.io/docs/develop/build-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIAuAv/hyZODx1bBa/9GRhUc4CepbdFc4KvfTvK1/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/BVX1S/hyZOJygf5S/0AQwwgZW6gFR58KWGj69EK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/c6Wgle/hyZP32Zqrx/9KNrTj9mQL65Vlku2wncr0/img.png?width=2809&amp;amp;height=1850&amp;amp;face=0_0_2809_1850');&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;Build an MCP server - Model Context Protocol&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Get started building your own server to use in Claude for Desktop and other clients.&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;너무 생략을 많이해놔서 한글버전도 참고했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/268827&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/268827&lt;/a&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;클로드에 연결할 수 있는 서버를 안내해주고 있고, 위의 세가지 요소 중 tool의 구현에만 집중한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>LLM</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/9</guid>
      <comments>https://summerhatescoding.tistory.com/entry/MCP-Server-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0#entry9comment</comments>
      <pubDate>Sun, 21 Dec 2025 21:01:09 +0900</pubDate>
    </item>
    <item>
      <title>Context7 MCP 사용해보기 (LLM 할루시네이션 방지)</title>
      <link>https://summerhatescoding.tistory.com/entry/Context7-MCP-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0-LLM-%ED%95%A0%EB%A3%A8%EC%8B%9C%EB%84%A4%EC%9D%B4%EC%85%98-%EB%B0%A9%EC%A7%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발동생님의 영상을 보고 실습을 해봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/TrXBzzsUUY4&quot;&gt;https://youtu.be/TrXBzzsUUY4&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=TrXBzzsUUY4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/L8LhG/hyYU51ZKSS/f8iYpctGWNljxvRQp4umwk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=134_116_318_318,https://scrap.kakaocdn.net/dn/cdt2nv/hyYVcz3LR1/9khSI1BWQ6P6NJmVQpKeH1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=134_116_318_318&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;AI 코드 에디터 할루시네이션 이제 이거면 해결입니다 | Context7 MCP&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/TrXBzzsUUY4&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 id=&quot;MCP-LLM의문제점&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;LLM의 문제점&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;마이너한 기술 스택, 최신 모듈 등의 코드 편집을 요청하면 LLM은 과거 자신이 학습한 데이터를 기반으로 할루시네이션이 발동해 헛소리를 함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;MCP-Context7이란?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Context7 이란?&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;홈페이지 :&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://context7.com/&quot;&gt;https://context7.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여러가지 라이브러리들에 대해 LLM 친화적인 콘텍스트를 제공, 구식 코드 생성이나 헛소리 하는걸 막음&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;글 작성하는 시점 기준 11400개의 라이브러리나 지원한다고 되어있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DRIxJ/btsN2KHw2oO/bqJbJAO7vSPzqekfFiZ3O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DRIxJ/btsN2KHw2oO/bqJbJAO7vSPzqekfFiZ3O1/img.png&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;1700&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DRIxJ/btsN2KHw2oO/bqJbJAO7vSPzqekfFiZ3O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDRIxJ%2FbtsN2KHw2oO%2FbqJbJAO7vSPzqekfFiZ3O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1678&quot; height=&quot;1700&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq2yuJ/btsN1salkZt/XffGr7oCpeI5PaeF8FzBwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq2yuJ/btsN1salkZt/XffGr7oCpeI5PaeF8FzBwk/img.png&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;1700&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq2yuJ/btsN1salkZt/XffGr7oCpeI5PaeF8FzBwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq2yuJ%2FbtsN1salkZt%2FXffGr7oCpeI5PaeF8FzBwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1678&quot; height=&quot;1700&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Show docs for..에 내가 사용하고자 하는 함수 등을 입력하면 토큰을 기반으로 알맞는 콘텍스트를 제공해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;텍스트를 직접 복사해서 프롬프트에 입력&lt;/b&gt;하거나, &lt;b&gt;링크 형태&lt;/b&gt;로 물어볼수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;혹은 MCP를 설치&lt;/b&gt;해서 이용할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Context7 MCP 서버 Claude Desktop에서 사용해보기&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;영상에선 Cursor를 내장한 Vscode에서 사용한듯 하지만 난 안쓰므로...claude에서 해봄&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MCP 서버 :&amp;nbsp;&lt;a href=&quot;https://github.com/upstash/context7&quot;&gt;https://github.com/upstash/context7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1747488612581&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - upstash/context7: Context7 MCP Server -- Up-to-date code documentation for LLMs and AI code editors&quot; data-og-description=&quot;Context7 MCP Server -- Up-to-date code documentation for LLMs and AI code editors - upstash/context7&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/upstash/context7&quot; data-og-url=&quot;https://github.com/upstash/context7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1xmYy/hyYWW38AGf/9SkkomhKgEFt0wS0a6CF10/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/co8Bzm/hyYTdGsn42/1kUMVezt4gOKOZ9qzAsaD1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/upstash/context7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/upstash/context7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1xmYy/hyYWW38AGf/9SkkomhKgEFt0wS0a6CF10/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/co8Bzm/hyYTdGsn42/1kUMVezt4gOKOZ9qzAsaD1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - upstash/context7: Context7 MCP Server -- Up-to-date code documentation for LLMs and AI code editors&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Context7 MCP Server -- Up-to-date code documentation for LLMs and AI code editors - upstash/context7&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;pre id=&quot;code_1747488623001&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;Context7&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@upstash/context7-mcp@latest&quot;]
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Gatling 지원 언어가 원래 java, scala, kotlin 뿐이었는데 2024년에 javascript도 추가되어 이 내용에 대해 질문해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;MCP-Context7MCP사용한버전&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Context7 MCP 사용한 버전&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Gatling이 워낙 쓰는 사람이 적은 프레임워크라 결국 Context7에서 관련 정보를 가져오는건 실패했지만 꽤나 자세하고 환경 설치부터 시뮬레이션 실행까지 공식문서를 잘 참고해 가이드 해줬다. (틀린정보가 있긴 하지만..)&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;1708&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMg3bD/btsN1Tyqxxf/x59OzsbP3lWoVVge9kYVoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMg3bD/btsN1Tyqxxf/x59OzsbP3lWoVVge9kYVoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMg3bD/btsN1Tyqxxf/x59OzsbP3lWoVVge9kYVoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMg3bD%2FbtsN1Tyqxxf%2Fx59OzsbP3lWoVVge9kYVoK%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;1708&quot; height=&quot;971&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;971&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&quot;MCP-Context7MCP사용하지않은버전&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Context7 MCP 사용하지 않은 버전&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;일단 내용이 MCP를 사용한 것에 비해 엄청 짧다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 Gatling3.0에서는 Javascript를 사용할 수 없다... &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Gatling만 갖고는 사용할 수 없고 javascript SDK를 따로 설치해줘야 함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&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;745&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZpQXF/btsN2mNDRnC/QI8IovRe9HeO7zy8wOZVa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZpQXF/btsN2mNDRnC/QI8IovRe9HeO7zy8wOZVa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZpQXF/btsN2mNDRnC/QI8IovRe9HeO7zy8wOZVa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZpQXF%2FbtsN2mNDRnC%2FQI8IovRe9HeO7zy8wOZVa0%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;653&quot; height=&quot;784&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;그나마 한번 혼내니까 수정한 느낌....인데 그냥 위에서 대답해준건 다 틀렸다고 보면된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;아무튼 Context7 MCP를 쓰면 이런 할루시네이션을 줄일 수 있다는건 알겠다&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;745&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dae9nN/btsN1nz0sf7/Eh2SlOU1cTdTIodocKkwLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dae9nN/btsN1nz0sf7/Eh2SlOU1cTdTIodocKkwLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dae9nN/btsN1nz0sf7/Eh2SlOU1cTdTIodocKkwLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdae9nN%2FbtsN1nz0sf7%2FEh2SlOU1cTdTIodocKkwLk%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;588&quot; height=&quot;469&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 업무에서 어떻게 활용해야 할지 잘 모르겠다.&lt;/p&gt;</description>
      <category>LLM</category>
      <category>Ai</category>
      <category>context7</category>
      <category>llm</category>
      <category>MCP</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/8</guid>
      <comments>https://summerhatescoding.tistory.com/entry/Context7-MCP-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0-LLM-%ED%95%A0%EB%A3%A8%EC%8B%9C%EB%84%A4%EC%9D%B4%EC%85%98-%EB%B0%A9%EC%A7%80#entry8comment</comments>
      <pubDate>Sat, 17 May 2025 23:51:05 +0900</pubDate>
    </item>
    <item>
      <title>MCP 개념 및 실습</title>
      <link>https://summerhatescoding.tistory.com/entry/MCP-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%8B%A4%EC%8A%B5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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=fkqXQOjj8cA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/t00BC/hyYTogTltK/PfNnA1NgzafRolueYtzKFk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=1054_200_1224_386,https://scrap.kakaocdn.net/dn/4yqSt/hyYTourqZ1/K5jGyqYEXhk7rBjKxVIJU1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=1054_200_1224_386&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써야 진짜 Claude다! 500% 활용 튜토리얼 (개념부터 활용까지)&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/fkqXQOjj8cA&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;MCP란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Model Context Protocol&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Claude AI 개발사 Anthropic 에서 개발 (&lt;a style=&quot;color: #333333;&quot; href=&quot;https://docs.anthropic.com/en/docs/agents-and-tools/mcp&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;공식 문서&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AI 모델이 동작 할 때, 적절한 도구가 필요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;각 도구마다 사용법이 다르므로 이 도구들과 소통하는 것을 도와줌&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blRAz2/btsN2PWn6Ku/zgLK66VVOjU3CU3yr6NiK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blRAz2/btsN2PWn6Ku/zgLK66VVOjU3CU3yr6NiK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blRAz2/btsN2PWn6Ku/zgLK66VVOjU3CU3yr6NiK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblRAz2%2FbtsN2PWn6Ku%2FzgLK66VVOjU3CU3yr6NiK1%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;670&quot; height=&quot;369&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;server : 다양한 서비스들을 표준화된 서비스로 이용하기 위한 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 서비스들을 host 서비스들에서 이용하고 싶을 때 서버만 설치하면 바로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;예를들어 슬랙과 관련된 어플을 만들고자 할 때, MCP가 없다면?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리가 슬랙 document를 보면서 코딩으로 슬랙 API들을 모두 구현해야 한다.
&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;li&gt;스레드에 답장하기&lt;/li&gt;
&lt;li&gt;리액션 추가하기 등&amp;hellip;&lt;/li&gt;
&lt;li&gt;인증작업 등..시간이 오래걸림&lt;/li&gt;
&lt;li&gt;다른 플랫폼에서 활용하려면 그 환경에 맞게 새로 설정을 해줘야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 MCP는 그럴 필요가 없음&lt;/li&gt;
&lt;li&gt;AI 에이전트 제작이 훨씬 쉬워진다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인터넷 뉴스 레포트 3가지 슬랙으로 보내기 실습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 영상 그대로 따라함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 필요한 기능&lt;/h4&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;li&gt;슬랙 메시지 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Claude desktop 설치 &amp;amp; MCP 서버 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/modelcontextprotocol/servers&quot;&gt;https://github.com/modelcontextprotocol/servers&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1747487655244&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - modelcontextprotocol/servers: Model Context Protocol Servers&quot; data-og-description=&quot;Model Context Protocol Servers. Contribute to modelcontextprotocol/servers development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/modelcontextprotocol/servers&quot; data-og-url=&quot;https://github.com/modelcontextprotocol/servers&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bM4JV7/hyYVe5Gann/8m13vg72l0ITINlaaw5rT1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/c7xmpA/hyYU7lccES/Kd07KgNKTPEXlWFk6DhiV1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/modelcontextprotocol/servers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/modelcontextprotocol/servers&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bM4JV7/hyYVe5Gann/8m13vg72l0ITINlaaw5rT1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/c7xmpA/hyYU7lccES/Kd07KgNKTPEXlWFk6DhiV1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - modelcontextprotocol/servers: Model Context Protocol Servers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Model Context Protocol Servers. Contribute to modelcontextprotocol/servers development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;firecrawl : 웹 크롤링&lt;/li&gt;
&lt;li&gt;slack : 슬랙 기능 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬랙은 봇 생성 하고 채널 정보도 넣어줘야해서 좀 복잡하긴 하지만 영상보면서 하면 할만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;claude_desktop_config.json 편집&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuz20n/btsN1PpvczF/DAEjDJpP3izlvxo73kaiK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuz20n/btsN1PpvczF/DAEjDJpP3izlvxo73kaiK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuz20n/btsN1PpvczF/DAEjDJpP3izlvxo73kaiK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuz20n%2FbtsN1PpvczF%2FDAEjDJpP3izlvxo73kaiK0%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;1564&quot; height=&quot;1142&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 후 Claude 앱 실행하면 사용할 수 있는 MCP 목록이 보인다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VKnn0/btsN1crZiCD/1wKRok1C8n1k4JDlMCKXbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VKnn0/btsN1crZiCD/1wKRok1C8n1k4JDlMCKXbK/img.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;618&quot; data-is-animation=&quot;false&quot; width=&quot;311&quot; height=&quot;316&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VKnn0/btsN1crZiCD/1wKRok1C8n1k4JDlMCKXbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVKnn0%2FbtsN1crZiCD%2F1wKRok1C8n1k4JDlMCKXbK%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;608&quot; height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9wLOt/btsN2MejkGY/PhgUj8hqZd60r3Ny8keVZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9wLOt/btsN2MejkGY/PhgUj8hqZd60r3Ny8keVZ0/img.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;618&quot; data-is-animation=&quot;false&quot; width=&quot;310&quot; height=&quot;315&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9wLOt/btsN2MejkGY/PhgUj8hqZd60r3Ny8keVZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9wLOt%2FbtsN2MejkGY%2FPhgUj8hqZd60r3Ny8keVZ0%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;608&quot; height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 명령 수행&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvcyLP/btsN1Zk8a3C/5bhOmSOn7rf8HLLnfUyqEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvcyLP/btsN1Zk8a3C/5bhOmSOn7rf8HLLnfUyqEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvcyLP/btsN1Zk8a3C/5bhOmSOn7rf8HLLnfUyqEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvcyLP%2FbtsN1Zk8a3C%2F5bhOmSOn7rf8HLLnfUyqEK%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;716&quot; height=&quot;201&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP를 사용하게 되면 팝업창이 뜨면서 허용을 해주면 이 MCP 를 갖고 우리가 원하는 기능을 수행함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBkRi3/btsN24lr7mt/yMrgEIy4R8VKph3bWPZTJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBkRi3/btsN24lr7mt/yMrgEIy4R8VKph3bWPZTJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBkRi3/btsN24lr7mt/yMrgEIy4R8VKph3bWPZTJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBkRi3%2FbtsN24lr7mt%2FyMrgEIy4R8VKph3bWPZTJk%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;519&quot; height=&quot;768&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 결과물&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽤 잘 생성해줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqfGEH/btsN1Y7CvMv/B5HMbMugiOHMk6Qmk88n31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqfGEH/btsN1Y7CvMv/B5HMbMugiOHMk6Qmk88n31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqfGEH/btsN1Y7CvMv/B5HMbMugiOHMk6Qmk88n31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqfGEH%2FbtsN1Y7CvMv%2FB5HMbMugiOHMk6Qmk88n31%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;912&quot; height=&quot;843&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;업무에서 어떤 MCP를 활용할 수 있을까?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0052cc;&quot; href=&quot;https://www.youtube.com/watch?v=I29rn92gkC4&quot;&gt;3D 모델링&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0052cc;&quot; href=&quot;https://github.com/sooperset/mcp-atlassian&quot;&gt;Jira/Confluence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0052cc;&quot; href=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/slack&quot;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0052cc;&quot; href=&quot;https://github.com/makenotion/notion-mcp-server#readme&quot;&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0052cc;&quot; href=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/gitlab&quot;&gt;GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0052cc;&quot; href=&quot;https://github.com/Flux159/mcp-server-kubernetes&quot;&gt;Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MCP의 한계점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;무료버전에서는 AI가 받아들일수 있는 context의 양이 적음&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대부분 MCP 서버가 잘 동작하지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여러개의 MCP 서버를 사용하기 어려움&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유료 버전도 아주 큰 파일에 대한 작업은 아직 어려움&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;완전 자동화 불가능&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;매번 권한 허용을 해줘야 함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;매일 일정 시간에 주기적인 행동X&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 원하는 기능을 완전히 사용하려면 코딩이 필요함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>LLM</category>
      <category>Ai</category>
      <category>Claude</category>
      <category>llm</category>
      <category>MCP</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/7</guid>
      <comments>https://summerhatescoding.tistory.com/entry/MCP-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%8B%A4%EC%8A%B5#entry7comment</comments>
      <pubDate>Sat, 17 May 2025 22:24:18 +0900</pubDate>
    </item>
    <item>
      <title>Scala Trait</title>
      <link>https://summerhatescoding.tistory.com/entry/Scala-Trait</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. trait의 개념 및 주요 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. trait 기본사용법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-1. trait 정의하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-2. trait 기본 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Java Interface와 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. trait의 선형화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 추상클래스와 trait&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;trait의 개념 및 주요 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍에서 Interface와 유사한 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스화 할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스와 다르게 메소드와 필드를 포함할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중상속은 불가능하지만 여러 trait을 섞어서 사용하는 mixin이라는 개념이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자를 가질 수 없다(Scala2 버전만 해당. 3버전은 생성자를 가질 수 있으나, 주의해야함 &lt;a href=&quot;https://docs.scala-lang.org/scala3/reference/other-new-features/trait-parameters.html&quot;&gt;참고문서&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;trait 기본 사용법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;trait 정의하기&amp;nbsp;&lt;/h3&gt;
&lt;pre id=&quot;code_1740153300763&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trait Example {
    //추상메소드
    def exampleMethod1(): Int
    
    //구현된 메소드
    def exampleMethod2(): Unit = {
        println(&quot;initialized&quot;)
    }
    
    //추상 필드
    val immutableField1: String
    var mutableVField1: String
    
    //값이 정해진 변수
    val immutableField2: String = &quot;immutableField2&quot;
    var muntableField2: String = &quot;mutableField2&quot;
    
    //접근제한자
    private def exampleMethod3(): Unit = {
        println(&quot;private method can use only in the tarit&quot;)
    }
    
    protected def exampleMethod4(): Unit = {
        println(&quot;protected method&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;trait 사용하기 (매우 기본)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trait을 상속받을때는 extends 키워드를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 사용하는 trait들 부터는 with이라는 키워드를 사용하는데, mixin이 된다고 보면된다.&lt;/p&gt;
&lt;pre id=&quot;code_1740152936969&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trait Sound {
    //추상메소드
    def makeSound(): Unit
}
 
trait Fly {
    //구현된 메소드
    def fly(): Unit = println(&quot;flying!&quot;)
}
 
trait Eat {
    def eat(): Unit = println(&quot;eating&quot;)
}

//Sound, Fly, Eat의 기능을 모두 갖고 있는 Bird
class Bird extends Sound with Fly with Eat
 
val bird = new Bird
bird.makeSound()  // Chirp Chirp
bird.fly()        // flying!
bird.eat()       // eating&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Java와 차이점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 구현된 함수 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java는 8버전 이상부터 default 키워드를 이용하면 인터페이스에 구현된 함수를 정의할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1740153833411&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Animal {
    defualt public void makeSound(String x) {
        System.out.println(&quot;Sound : &quot; + x);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scala는 특별한 키워드 없이 정의 가능하다&lt;/p&gt;
&lt;pre id=&quot;code_1740153883349&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trait Animal {
    def makeSound(x: String): Unit = {
        println(&quot;Sound : &quot; + x)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. protected 접근제한자 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 인터페이스에서는 protected 접근제한자를 사용할 수 없지만, 스칼라는 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1740153951219&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//불가능
interface Animal {
    protected String getName();
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740153935305&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//가능
trait Animal {
    protected getName(): String
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 필드 지정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 인터페이스에서는 필드를 정의할 수 없지만, 스칼라는 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1740153996101&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//불가능
interface Animal {
    String name;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1740154039052&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//가능
trait Animal {
    var name: String
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 키워드 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바는 인터페이스 구현 시 Implements 키워드를 사용하지만&lt;/p&gt;
&lt;pre id=&quot;code_1740154099704&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface A
interface B
interface C
 
class D implements A, B, C&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스칼라는 extends와 with을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1740154161364&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trait A
trait B
trait C
 
class D extends A with B with C&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 클래스를 상속할때 extends키워드를 사용하지만 스칼라는 extends 키워드는 클래스와 trait을 구분하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;trait의 선형화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++등 다중상속이 가능한 언어에서는 죽음의 다이아몬드(the Deadly Diamond of Death)문제가 발생할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1740221129184&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     A
    / \
   B   C
    \ /
     D&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없는 다이어그램.drawio.png&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIxxsb/btsMuq4M1ux/G8x3l2aXLQ1Sry1xYrK85K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIxxsb/btsMuq4M1ux/G8x3l2aXLQ1Sry1xYrK85K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIxxsb/btsMuq4M1ux/G8x3l2aXLQ1Sry1xYrK85K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIxxsb%2FbtsMuq4M1ux%2FG8x3l2aXLQ1Sry1xYrK85K%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;501&quot; height=&quot;342&quot; data-filename=&quot;제목 없는 다이어그램.drawio.png&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B,C가 A를 상속받고, 클래스 D가 B,C를 상속받은 상황에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D가 super.message()를 출력하는 경우 어떤 클래스의 message()를 실행해야 할까?&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;p data-ke-size=&quot;size16&quot;&gt;Scala에서는 클래스 다중상속을 막고 있지만 trait의 선형화를 통해 죽음의 다이아몬드 문제를 자연스럽게 해결하고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1740221495105&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trait A {
  def message(): String = &quot;A&quot;
}

trait B extends A {
  override def message(): String = &quot;B -&amp;gt; &quot; + super.message
}

trait C extends A {
  override def message(): String = &quot;C -&amp;gt; &quot; + super.message
}

class D extends B with C {
  override def message(): String = &quot;D -&amp;gt; &quot; + super.message
}

object Main extends App {
  val d = new D
  println(d.message) // 출력 결과: &quot;D -&amp;gt; C -&amp;gt; B -&amp;gt; A&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trait에서는 가장 오른쪽에 선언된 trait순서대로 실행되도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드의 선형화 순서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. D -&amp;gt; 출력, C가 가장 오른쪽에 선언되었으므로 C의 message 메소드가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. C -&amp;gt; 출력, B가 오른쪽에서 두번째에 선언되었으므로 B의 message 메소드가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. B -&amp;gt; 출력, A의 message 메소드가 실행된다. A는 B와 C클래스에서 두번 상속받았지만 선형화 과정에서 한번만 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추상클래스와 trait&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scala에도 abstract class도 존재하는데, trait과 매우 유사하다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 둘 중 어떤걸 써야 하는거지? 라는 생각이 들때 좀 찾아보니 이런 답변들이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;abstract class를 사용할 때&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java 코드에서 상속받아야 할때 (많이 혼용하기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Java 컴파일러를 사용해야 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 생성자가 필요할때 (Scala 2버전 사용하는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;trait을 사용할 때&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 한 클래스에서 독립된 여러 행동들을 하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. abstract class를 써야 할지 trait을 써야할지 모르겠는 경우, trait을 먼저 써보고 안되면 abstract class로 바꾸면 된다.&lt;/p&gt;</description>
      <category>Scala</category>
      <category>interface</category>
      <category>scala</category>
      <category>trait</category>
      <category>스칼라</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/6</guid>
      <comments>https://summerhatescoding.tistory.com/entry/Scala-Trait#entry6comment</comments>
      <pubDate>Sat, 22 Feb 2025 20:16:12 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Volume의 정의, 종류, 터미널에서 사용하는 법</title>
      <link>https://summerhatescoding.tistory.com/entry/Docker-Volume%EC%9D%98-%EC%A0%95%EC%9D%98-%EC%A2%85%EB%A5%98-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;Volume이란?&lt;/span&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;. 이미지에 존재하지 않고, &lt;b&gt;도커 컨테이너와 매핑&lt;/b&gt;된다.&lt;/li&gt;
&lt;li&gt;COPY 명령어와 비슷해 보이지만, copy 명령어는 파일을 복사만 하기 때문에 컨테이너 외부에서는 사용하지 못한다.&lt;/li&gt;
&lt;li&gt;volume은 실제로 폴더를 연결하기 때문에 &lt;b&gt;컨테이너 외부/호스트머신에서도 사용이 가능&lt;/b&gt;하다.&lt;/li&gt;
&lt;li&gt;볼륨을 지정하면, Docker는 우리의 로컬머신 어딘가 경로에 컨테이너의 폴더를 매핑하는데, 그 &lt;b&gt;경로는 우리가 알 수 없다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Anonymous volume과 Named volume이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;Volume 종류, 예시&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 고객의 피드백을 받는 웹애플리케이션의 구조가 다음과 같다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객이 어떤 피드백을 입력했을 때 피드백은 텍스트 파일 형태로 feedback이라는 폴더 안에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 웹 애플리케이션이 돌아가고 있는 컨테이너가 제거되어도 로컬 경로에 파일이 유지되기를 원한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIAml/btsL5rXuIHk/BFeilsLb7bkuMUVvDxEXIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIAml/btsL5rXuIHk/BFeilsLb7bkuMUVvDxEXIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIAml/btsL5rXuIHk/BFeilsLb7bkuMUVvDxEXIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIAml%2FbtsL5rXuIHk%2FBFeilsLb7bkuMUVvDxEXIk%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;280&quot; height=&quot;326&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Dockerfile은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1738506602554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

CMD [ &quot;node&quot;, &quot;server.js&quot; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 컨테이너 워크디렉토리는 /app에서 시작하고, 우리는 /feedback 폴더에 볼륨을 지정하고 싶으므로 아래와 같이 지정할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Anonymous Volume (익명 볼륨)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익명 볼륨은 우리가 볼륨의 이름을 지정하지 않고, 매핑할 컨테이너의 경로만 지정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738506629301&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker bulid -t imagename .
docker run -d -p 3000:80 --rm --name containername -v /app/feedback imagename
docker volume ls

DRIVER    VOLUME NAME
local     3f34a5b8ca185ee642bc3a888df76388627a19e9daab84529772ee5e848e3ccb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;docker volume ls&lt;/b&gt; 명령어를 실행하면, 우리의 로컬머신 어딘가에 있는 볼륨에 대해 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 여기서 &lt;b&gt;docker stop&lt;/b&gt; 명령어로 컨테이너를 중지(우리는 컨테이너 실행 명령에 &amp;mdash;rm 옵션을 넣었기 때문에 컨테이너가 중지되면 삭제까지 한다.)하고 볼륨을 다시 조회해보면, 볼륨이 사라진 것을 확인할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Named Volume (이름 지정 볼륨)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름 지정 볼륨은 우리가 로컬에 저장될 볼륨의 이름과 함께 매핑할 컨테이너의 경로를 지정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738506688424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 3000:80 --rm --name containername -v volumename:/app/feedback imagename
docker volume ls

DRIVER    VOLUME NAME
local     volumename&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이때는 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;docker stop&lt;/span&gt;&lt;/b&gt; 명령어로 컨테이너를 중지하고 삭제한 뒤 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;docker volume ls&lt;/b&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;컨테이너 실행 시 &amp;mdash;rm 옵션을 사용하지 않는 경우 Anonymous Volume&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 컨테이너를 멈추고 &lt;b&gt;docker rm&lt;/b&gt; 명령어로 컨테이너를 삭제해도 익명 볼륨이 로컬머신에서 사라지지 않는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 모른다&amp;hellip;.왜 저에게 이런 시련을 주시나요&lt;/p&gt;
&lt;pre id=&quot;code_1738506788435&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker bulid -t imagename .
docker run -d -p 3000:80 --name containername -v /app/feedback imagename
docker volume ls
DRIVER    VOLUME NAME
local     d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

docker stop containername
docker volume ls
DRIVER    VOLUME NAME
local     d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

docker rm contianername
docker volume ls
DRIVER    VOLUME NAME
local     d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc&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;&lt;b&gt;docker volume rm 볼륨이름&lt;/b&gt; 혹은 &lt;b&gt;docker volume prune&lt;/b&gt; 명령어로 지우면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1738506814554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

Total reclaimed space: 0B&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;&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;a href=&quot;https://dev.hasummer.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot;&gt;2025.02.02 - [docker] - [Docker] Volume과 Bind Mount의 정의, 필요한 이유&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738506855264&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;[Docker] Volume과 Bind Mount의 정의, 필요한 이유&quot; data-og-description=&quot;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&amp;nbsp;Data의 종류불변 &amp;amp; 읽기 전용 데이터소스코드나 운영체제를 포함한 애플리케이션을 docker image로 빌드&quot; data-og-host=&quot;dev.hasummer.com&quot; data-og-source-url=&quot;https://dev.hasummer.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-url=&quot;https://dev.hasummer.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uM2px/hyYcaa1bAJ/VPIT1KlnFoJK8JfeM0RBD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b71x3h/hyYciGTq5l/lKVHmPqZ7NHPHkti6giC7K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://dev.hasummer.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.hasummer.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uM2px/hyYcaa1bAJ/VPIT1KlnFoJK8JfeM0RBD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b71x3h/hyYciGTq5l/lKVHmPqZ7NHPHkti6giC7K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Docker] Volume과 Bind Mount의 정의, 필요한 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&amp;nbsp;Data의 종류불변 &amp;amp; 읽기 전용 데이터소스코드나 운영체제를 포함한 애플리케이션을 docker image로 빌드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.hasummer.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;</description>
      <category>docker</category>
      <category>docker</category>
      <category>Volume</category>
      <category>데브옵스</category>
      <category>도커</category>
      <category>명시적볼륨</category>
      <category>볼륨</category>
      <category>익명볼륨</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/5</guid>
      <comments>https://summerhatescoding.tistory.com/entry/Docker-Volume%EC%9D%98-%EC%A0%95%EC%9D%98-%EC%A2%85%EB%A5%98-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95#entry5comment</comments>
      <pubDate>Mon, 3 Feb 2025 08:34:51 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Volume과 Bind Mount의 정의, 필요한 이유</title>
      <link>https://summerhatescoding.tistory.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&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;Data의 종류&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;불변 &amp;amp; 읽기 전용 데이터&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드나 운영체제를 포함한 애플리케이션을 docker image로 빌드를 하게 되면, 그 이미지는 더이상 편집이 불가하다. 만약 docker image에 포함된 무언가를 변경하고 싶다면, docker image를 새로 빌드 해야한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;임시 데이터&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 실행되는 동안 생성된 임시 데이터 (변수 등)으로, 애플리케이션이 종료되면 사라진다. 애플리케이션이 실행되는 동안만 유효하다. 컨테이너가 종료되면 사라진다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;영구 데이터&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 실행되는 동안 데이터가 생성되고, 영구적으로 저장되어야 하는 데이터. 예를들면 회원가입을 해서 어떤 계정이 생성되면 그 데이터는 DB등에 영구적으로 저장되어야 한다. 컨테이너가 제거되어도 데이터가 사라지면 안된다. 이때 volume의 도움을 받아야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너를 멈추고 제거를 하지 않으면 데이터는 컨테이너 안에 남아있다. 재시작 (docker start)하면 데이터가 남아있는 것을 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;컨테이너를 제거하면 데이터가 사라진다.&lt;/li&gt;
&lt;li&gt;즉 이것은 임시데이터일 뿐이다.&lt;/li&gt;
&lt;li&gt;이것을 해결하려면? 데이터 저장이 되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;External Data Storage의 종류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 내부의 데이터를 컨테이너 바깥에 영구적으로 저장할 수 있는 방법에는 두가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker에 의해 관리되는 Volume&lt;/b&gt;과, &lt;b&gt;사용자에 의해 관리되는 Bind Mount&lt;/b&gt;가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(다음에 이어서 계속&amp;hellip; 강의 다 보고 이 글에 정리 예정)&lt;/p&gt;</description>
      <category>docker</category>
      <category>devops</category>
      <category>docker</category>
      <category>Mount</category>
      <category>Volume</category>
      <category>도커</category>
      <category>볼륨</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/4</guid>
      <comments>https://summerhatescoding.tistory.com/entry/Docker-Volume%EA%B3%BC-Bind-Mount%EC%9D%98-%EC%A0%95%EC%9D%98-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0#entry4comment</comments>
      <pubDate>Sun, 2 Feb 2025 23:26:58 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Image와 Container의 관계, 이미지로 컨테이너 빌드하기</title>
      <link>https://summerhatescoding.tistory.com/entry/Docker-Image%EC%99%80-Container%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A1%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&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;Image vs Container&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Container&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든것을 포함하는 작은 패키지 : 웹사이트, node 서버!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 애플리케이션을 구동할 때 필요한 모든것 &amp;rArr; &lt;b&gt;소프트웨어의 실행 단위&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Image&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 위한 템플릿/청사진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지에는 코드와, 코드를 실행하는데 필요한 도구가 들어있으며 &lt;b&gt;실제 실행은 컨테이너에서&lt;/b&gt; 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컨테이너와 이미지의 관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지에는 모든 설치 지침과 코드가 포함되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;다른 머신, 다른 서버&lt;/b&gt;&lt;/span&gt;에서 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;같은 이미지&lt;/b&gt;&lt;/span&gt;를 구동시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 즉, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;하나의 이미지&lt;/b&gt;&lt;/span&gt;로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;여러 컨테이너&lt;/b&gt;&lt;/span&gt;를 구동시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유가 적절한건지는 모르겠으나 내가 이해한 바로 다시 비유를 해보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지는 레시피, 컨테이너는 이 레시피로 만든 요리의 개념인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지를 사용해 컨테이너 빌드하기 1 - Docker Hub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지는 docker hub에서 필요한 이미지를 찾을수도 있고, 직접 빌드를 할수 있기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 docker hub의 node.js 이미지를 사용하고 실행하는 실습부터 진행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVl4Cb/btsJEhXqYtB/Y0Y3krfnbKjxFTtRvLdgv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVl4Cb/btsJEhXqYtB/Y0Y3krfnbKjxFTtRvLdgv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVl4Cb/btsJEhXqYtB/Y0Y3krfnbKjxFTtRvLdgv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVl4Cb%2FbtsJEhXqYtB%2FY0Y3krfnbKjxFTtRvLdgv0%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;1544&quot; height=&quot;754&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node 이미지는 node 어플리케이션 컨테이너를 생성할 수 있도록 하는 이미지이다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;docker run node
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;run&lt;/b&gt; 명령어는 node.js를 위한 이미지(docker hub에 존재하는)를 갖고 &lt;b&gt;컨테이너를 생성&lt;/b&gt;하는 명령어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node 이미지가 내 로컬에 없기 때문에 Hub에서 이미지를 내려받고 컨테이너를 빌드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이미지를 내려받는다고 해서 우리 컴퓨터에 노드가 설치되는게 전혀 아니다. 도커 환경에만 설치됨)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bopJ1U/btsJDvhZHpD/gi9BAGaN2WMWXAOMZOLt1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bopJ1U/btsJDvhZHpD/gi9BAGaN2WMWXAOMZOLt1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bopJ1U/btsJDvhZHpD/gi9BAGaN2WMWXAOMZOLt1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbopJ1U%2FbtsJDvhZHpD%2Fgi9BAGaN2WMWXAOMZOLt1k%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;1582&quot; height=&quot;712&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 생성이 잘 되었는지 확인해보자.&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엉? 아무것도 없네?&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;docker ps -a

CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS                          PORTS     NAMES
3d8b3cbcaeb8   node      &quot;docker-entrypoint.s&amp;hellip;&quot;   About a minute ago   Exited (0) About a minute ago             thirsty_aryabhata
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker ps -a 는 종료된 컨테이너까지 모두 보여준다. Exited상태인걸 보니 컨테이너가 종료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실습으로 진행하고 있는 node의 경우 컨테이너 내부에서 실행할 수 있는 interactive shell 이 존재하는데, 위의 docker run 명령은 컨테이너에서 아무런 상호작용을 하지 않고 종료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너는 주변 환경과 분리되어 실행되&lt;/b&gt;는 특성이 있기 때문에, 애플리케이션에서 뭔가를 하려면 컨테이너 내부에 접속을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 -it 옵션과 함께 컨테이너를 실행한다. &lt;b&gt;-it옵션은 docker에게 해당 컨테이너에서 interactive session을 실행하겠다&lt;/b&gt;는 의미이다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;docker run -it node

Welcome to Node.js v22.8.0.
Type &quot;.help&quot; for more information.
&amp;gt; 7-3
4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7aOsh/btsJD8zzoyC/KHej7s5nuhILGw3u4ZQqaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7aOsh/btsJD8zzoyC/KHej7s5nuhILGw3u4ZQqaK/img.png&quot; data-alt=&quot;노드 애플리케이션이 컨테이너에서 실행되고 있을때 Status가 Running으로 뜨고 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7aOsh/btsJD8zzoyC/KHej7s5nuhILGw3u4ZQqaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7aOsh%2FbtsJD8zzoyC%2FKHej7s5nuhILGw3u4ZQqaK%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;1133&quot; height=&quot;219&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 애플리케이션이 컨테이너에서 실행되고 있을때 Status가 Running으로 뜨고 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 종료를 하려면 ctrl + C를 두번 누른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 docker ps -a로 컨테이너 확인을 해보면, IMAGE 부분에 같은 node라는 이미지로 컨테이너가 실행되었다가 종료된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
48f80cff1528   node      &quot;docker-entrypoint.s&amp;hellip;&quot;   5 minutes ago    Exited (0) 3 minutes ago              vigorous_davinci
3d8b3cbcaeb8   node      &quot;docker-entrypoint.s&amp;hellip;&quot;   18 minutes ago   Exited (0) 18 minutes ago             thirsty_aryabhata
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글이 너무 길어져서 &amp;lt;이미지를 사용해 컨테이너 빌드하기 2&amp;gt;는 다음 글에서 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함께 보면 좋은 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.hasummer.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4&quot;&gt;2024.09.14 - [docker] - [Docker] Container란? 컨테이너의 필요성, VM과 차이&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726320507757&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;[Docker] Container란? 컨테이너의 필요성, VM과 차이&quot; data-og-description=&quot;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&amp;nbsp;Docker란? Container란?Docker란?컨테이너를 만들고 관리하는 기술컨테이너란?소프트웨어의 표준화된 단&quot; data-og-host=&quot;dev.hasummer.com&quot; data-og-source-url=&quot;https://dev.hasummer.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4&quot; data-og-url=&quot;https://dev.hasummer.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1z8n1/hyW20awfAe/Sqkni7L48HMlSDFBctowkK/img.png?width=800&amp;amp;height=288&amp;amp;face=0_0_800_288,https://scrap.kakaocdn.net/dn/d0MXrC/hyW2QTfZtF/2DOoy8kTk6UUjR4txNzNJ1/img.png?width=800&amp;amp;height=288&amp;amp;face=0_0_800_288,https://scrap.kakaocdn.net/dn/chfnPM/hyW2XEPRAa/PGgztfE1OuyHWPg9K4Ums1/img.png?width=1350&amp;amp;height=486&amp;amp;face=0_0_1350_486&quot;&gt;&lt;a href=&quot;https://dev.hasummer.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.hasummer.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1z8n1/hyW20awfAe/Sqkni7L48HMlSDFBctowkK/img.png?width=800&amp;amp;height=288&amp;amp;face=0_0_800_288,https://scrap.kakaocdn.net/dn/d0MXrC/hyW2QTfZtF/2DOoy8kTk6UUjR4txNzNJ1/img.png?width=800&amp;amp;height=288&amp;amp;face=0_0_800_288,https://scrap.kakaocdn.net/dn/chfnPM/hyW2XEPRAa/PGgztfE1OuyHWPg9K4Ums1/img.png?width=1350&amp;amp;height=486&amp;amp;face=0_0_1350_486');&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;[Docker] Container란? 컨테이너의 필요성, VM과 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&amp;nbsp;Docker란? Container란?Docker란?컨테이너를 만들고 관리하는 기술컨테이너란?소프트웨어의 표준화된 단&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.hasummer.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;</description>
      <category>docker</category>
      <category>Container</category>
      <category>Docker image</category>
      <category>IT블로그</category>
      <category>개발블로그</category>
      <category>도커</category>
      <category>이미지</category>
      <category>컨테이너</category>
      <category>코린이</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/3</guid>
      <comments>https://summerhatescoding.tistory.com/entry/Docker-Image%EC%99%80-Container%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A1%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0#entry3comment</comments>
      <pubDate>Sun, 15 Sep 2024 23:30:13 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Container란? 컨테이너의 필요성, VM과 차이</title>
      <link>https://summerhatescoding.tistory.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Udemy 강의 Docker &amp;amp; Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다.&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;Docker란? Container란?&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Docker란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 만들고 관리하는 기술&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컨테이너란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어의 표준화된 단위 : &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;코드 + 그것을 수행하기 위한 dependency들&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 nodeJS 애플리케이션을 빌드하는 경우, 소스코드를 더불어 JavaScript 런타임이 필요한데 Docker로 구축된 컨테이너에서는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;항상 동일한 환경에서 일관된 결과물&lt;/b&gt;&lt;/span&gt;을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피크닉 바구니에 비유하면 바구니 안에는 요리, 식기 등이 다 들어있고, 우리는 바구니를 들고 원하는 곳 아무데나 가서 피크닉을 할 수 있다. 다 준비되어있기 때문에 음식을 찾기 위해 돌아다니거나 할 필요 없다. 그리고 이 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;각각의 도구들은 섞이지 않으며, 독립적으로 작용할 수 있고, 필요한 경우 무언가 추가를 하기도 쉽다&lt;/b&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;&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NodeJs버전 14.3에서만 동작하는 애플리케이션이 있다고 하자. 이것을 배포할 때 &lt;b&gt;배포하고자 하는 환경에는 어떤 버전이 설치되어있을지 모른다&lt;/b&gt;. 다른 버전이 설치되어있다면 애플리케이션이 작동하지 않을 수 있다. &lt;b&gt;도커 컨테이너는 애플리케이션 구동에 필요한 버전까지 모두 포함&lt;/b&gt;되어있기 때문에 이러한 종속성 문제를 해결한다.&lt;/li&gt;
&lt;li&gt;비슷한 예로, 팀 내 다양한 개발환경이 있을텐데, 같은 노드 애플리케이션을 실행시키고자 하는데, 두 사람간 구성된 환경이 달라 결과가 다르게 나올 수 있다. 도커 컨테이너에서는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;항상 동일한 개발환경을 제공&lt;/b&gt;&lt;/span&gt;해 이러한 번거로움을 없앤다.&lt;/li&gt;
&lt;li&gt;단독으로 일하는 경우도 예를들어 두가지 프로젝트에서 서로 다른 파이썬 버전을 사용해야 한다고 할 때, 로컬 환경에서는 두 버전이 충돌하거나 꼬일 수 있다. &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;각각의 프로젝트는 각자의 컨테이너를 갖고&lt;/b&gt;&lt;/span&gt; 있기 때문에 충돌할 일이 없으며 로컬에서 개발환경을 구성하는 것 처럼 뭔가 제거하고 재설치하는 과정을 거치지 않아도 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VM과 Container의 차이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립된 환경에서 구동되기를 원하는 거면 VM 쓰면 되는거 아님? 이라는 생각을 할수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;vm은 우리의 컴퓨터 안에 가상의 운영체제를 설치&lt;/b&gt;&lt;/span&gt;한다. 캡슐화된 가상 머신으로 우리가 필요한 모든 도구를 설치할 수 있다. 여러 OS로 구성할수도 있다. 이런점에서는 도커컨테이너와 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 vm은 우리의 실제 컴퓨터에 할당되는 것이기 때문에 cpu, 메모리 등 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;엄청 많은 리소스가 필요&lt;/b&gt;&lt;/span&gt;하다는 것이다. 그리고 독립된 &lt;b&gt;가상의 &lt;span style=&quot;color: #000000;&quot;&gt;운영체제가 있더라도 여전히 특정 애플리케이션 개발 및 배포를 위한 환경 구성은 해야하는 상황&lt;/span&gt;&lt;/b&gt;이기 때문에 좀 까다롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도커컨테이너는&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;우리 컴퓨터 안에 가상 머신을 설치하지 않는다&lt;/b&gt;.&lt;/span&gt; 대신 우리가 사용하고 있는 운영체제에 내장되어있거나 에뮬레이트 되어있는 지원을 사용하게 된다. Docker Engine을 실행하고, 모든것은 도커엔진에서 돌아가게 된다. config파일을 통해 공유 및 재빌드가 용이하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg7f6h/btsJCNX4lS7/ox5qVc3q3mEq2NRf7JKOmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg7f6h/btsJCNX4lS7/ox5qVc3q3mEq2NRf7JKOmk/img.png&quot; data-alt=&quot;로컬환경 설치 / VM 환경 / 컨테이너 환경 (출처 : 쿠버네티스 홈페이지)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg7f6h/btsJCNX4lS7/ox5qVc3q3mEq2NRf7JKOmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg7f6h%2FbtsJCNX4lS7%2Fox5qVc3q3mEq2NRf7JKOmk%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; alt=&quot;development environment&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;486&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로컬환경 설치 / VM 환경 / 컨테이너 환경 (출처 : 쿠버네티스 홈페이지)&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;/p&gt;</description>
      <category>docker</category>
      <category>docker</category>
      <category>Infrastructure</category>
      <category>IT블로그</category>
      <category>개발공부</category>
      <category>컨테이너</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/2</guid>
      <comments>https://summerhatescoding.tistory.com/entry/Docker-Container%EB%9E%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-VM%EA%B3%BC-%EC%B0%A8%EC%9D%B4#entry2comment</comments>
      <pubDate>Sat, 14 Sep 2024 22:20:21 +0900</pubDate>
    </item>
    <item>
      <title>[JSON] 기본 JsonPath syntax 문법 정리</title>
      <link>https://summerhatescoding.tistory.com/entry/JSON-%EA%B8%B0%EB%B3%B8-JsonPath-syntax-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고한 글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/json-path/JsonPath&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/json-path/JsonPath&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717327464886&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - json-path/JsonPath: Java JsonPath implementation&quot; data-og-description=&quot;Java JsonPath implementation. Contribute to json-path/JsonPath development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/json-path/JsonPath&quot; data-og-url=&quot;https://github.com/json-path/JsonPath&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bagJ7w/hyWha5aDRu/icKw30WugjjKKzZKSPALQk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/json-path/JsonPath&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/json-path/JsonPath&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bagJ7w/hyWha5aDRu/icKw30WugjjKKzZKSPALQk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - json-path/JsonPath: Java JsonPath implementation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java JsonPath implementation. Contribute to json-path/JsonPath development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goessner.net/articles/JsonPath/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://goessner.net/articles/JsonPath/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717327478941&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;JSONPath - XPath for JSON&quot; data-og-description=&quot;A frequently emphasized advantage of XML is the availability of plenty tools to analyse, transform and selectively extract data out of XML documents. XPath is one of these powerful tools. It's time to wonder, if there is a need for something like XPath4JSO&quot; data-og-host=&quot;goessner.net&quot; data-og-source-url=&quot;https://goessner.net/articles/JsonPath/&quot; data-og-url=&quot;https://goessner.net/articles/JsonPath/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://goessner.net/articles/JsonPath/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goessner.net/articles/JsonPath/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;JSONPath - XPath for JSON&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A frequently emphasized advantage of XML is the availability of plenty tools to analyse, transform and selectively extract data out of XML documents. XPath is one of these powerful tools. It's time to wonder, if there is a need for something like XPath4JSO&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;goessner.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 ChatGPT 질의 일부&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;JSONPath - JSON을 위한 XPath&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XPath는 XML구문에서 데이터를 용이하게 추출하기 위한 툴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSONPath는 특별한 코딩 없이 &lt;u&gt;&lt;b&gt;JSON 구조의 데이터에서 정보를 찾고 추출하기 용이하도록 하는 표준화된 도구(쿼리)이다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSONPath를 이용해 클라이언트가 서버에 JSON데이터를 요청하면 딱 필요한 부분만 요청이 가능하기 때문에 서버 응답의 대역폭 사용량을 최소화 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSONPath 표현법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSONPath expression은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dot 표기법이나&lt;/p&gt;
&lt;pre id=&quot;code_1717327006958&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$.store.book[0].title&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;bracket 표기법으로 표현할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1717327068454&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$['store']['book'][0]['title']&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSONPath 연산자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;goessner.net의 예시 json데이터와 함께 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonpath.com/&quot;&gt;JSONPath Online Evaluator&lt;/a&gt;로 연습하면서 직접 해보니 좀 이해가 되는듯 하다..&lt;/p&gt;
&lt;pre id=&quot;code_1717332578292&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;store&quot;: {
    &quot;book&quot;: [
      {
        &quot;category&quot;: &quot;reference&quot;,
        &quot;author&quot;: &quot;Nigel Rees&quot;,
        &quot;title&quot;: &quot;Sayings of the Century&quot;,
        &quot;price&quot;: 8.95
      },
      {
        &quot;category&quot;: &quot;fiction&quot;,
        &quot;author&quot;: &quot;Evelyn Waugh&quot;,
        &quot;title&quot;: &quot;Sword of Honour&quot;,
        &quot;price&quot;: 12.99
      },
      {
        &quot;category&quot;: &quot;fiction&quot;,
        &quot;author&quot;: &quot;Herman Melville&quot;,
        &quot;title&quot;: &quot;Moby Dick&quot;,
        &quot;price&quot;: 8.99
      },
      {
        &quot;category&quot;: &quot;fiction&quot;,
        &quot;author&quot;: &quot;J. R. R. Tolkien&quot;,
        &quot;title&quot;: &quot;The Lord of the Rings&quot;,
        &quot;price&quot;: 22.99
      }
    ],
    &quot;bicycle&quot;: {
      &quot;color&quot;: &quot;red&quot;,
      &quot;price&quot;: 19.95
    }
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3499885621184355&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 광고2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-3499885621184355&quot;
     data-ad-slot=&quot;4812639059&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;4354&quot; data-origin-height=&quot;2727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G7c2c/btsHMuRLTE0/4hChuBn5tUFWQeaFh08ok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G7c2c/btsHMuRLTE0/4hChuBn5tUFWQeaFh08ok0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G7c2c/btsHMuRLTE0/4hChuBn5tUFWQeaFh08ok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG7c2c%2FbtsHMuRLTE0%2F4hChuBn5tUFWQeaFh08ok0%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; alt=&quot;jsonpath_operator&quot; loading=&quot;lazy&quot; width=&quot;4354&quot; height=&quot;2727&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;4354&quot; data-origin-height=&quot;2727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$.store.book[-2] 같은 음수 인덱스 표현은 JSONPath Online Evaluator에서 동작하지 않음. goessner.net 에도 표현되어있지 않음. Java나 Python등 JSONPath 구현 라이브러리에서만 되는 듯 함&lt;/li&gt;
&lt;li&gt;배열 인덱스 범위에서는 음수 인덱스 표현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSONPath 필터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터에서 사용되는 연산자들은 JSONPath를 구현한 언어의 라이브러리에 따라 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 사용되는 주요 연산자들은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;4216&quot; data-origin-height=&quot;1095&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNvnM/btsHLt7d2oP/k5trRofEtGNK4zFRU9ZtKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNvnM/btsHLt7d2oP/k5trRofEtGNK4zFRU9ZtKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNvnM/btsHLt7d2oP/k5trRofEtGNK4zFRU9ZtKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNvnM%2FbtsHLt7d2oP%2Fk5trRofEtGNK4zFRU9ZtKk%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;4216&quot; height=&quot;1095&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;4216&quot; data-origin-height=&quot;1095&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식 매칭 연산자인 '=~' 는 JSONPath구현체마다 지원 여부가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 사용되는 Java 라이브러리 구현체인 Jayway에서는 지원 된다. (&lt;a href=&quot;https://github.com/json-path/JsonPath?tab=readme-ov-file#filter-operators&quot;&gt;참고&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSONPath 구현체 라이브러리에서 지원하는 연산자는 위의 연산자보다 훨씬 더 다양한 연산자를 지원하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 문법을 바탕으로 각 라이브러리에서 지원하는 필터, 함수, 연산자를 잘 활용하여 데이터를 추출하는 것이 중요할 것 같다.&lt;/p&gt;</description>
      <category>json</category>
      <category>JsonPath</category>
      <author>dev여름</author>
      <guid isPermaLink="true">https://summerhatescoding.tistory.com/1</guid>
      <comments>https://summerhatescoding.tistory.com/entry/JSON-%EA%B8%B0%EB%B3%B8-JsonPath-syntax-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC#entry1comment</comments>
      <pubDate>Mon, 3 Jun 2024 01:21:19 +0900</pubDate>
    </item>
  </channel>
</rss>