<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dohyeon_an.log</title>
        <link>https://velog.io/</link>
        <description>데이터 엔지니어 안도현입니다 :)</description>
        <lastBuildDate>Thu, 13 Jul 2023 15:51:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dohyeon_an.log</title>
            <url>https://velog.velcdn.com/images/dohyeon_an/profile/8e335146-5938-4841-90eb-2ef1ffe2ad39/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dohyeon_an.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dohyeon_an" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Socket 통신과 HTTP 통신의 차이점]]></title>
            <link>https://velog.io/@dohyeon_an/Socket-%ED%86%B5%EC%8B%A0%EA%B3%BC-HTTP-%ED%86%B5%EC%8B%A0%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@dohyeon_an/Socket-%ED%86%B5%EC%8B%A0%EA%B3%BC-HTTP-%ED%86%B5%EC%8B%A0%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Thu, 13 Jul 2023 15:51:10 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요 여러분! 오늘은 네트워킹의 중심 개념인 &#39;Socket 통신&#39;과 &#39;HTTP 통신&#39;에 대해 이야기해보려 합니다. 이 두 가지 모두 데이터를 네트워크를 통해 전송하는 방법이지만, 동작 방식과 사용 사례에서 중요한 차이점이 있습니다. 이해를 돕기 위해 두 가지를 구분하는 핵심 요소를 아래에서 다루겠습니다.</p>
<h3 id="socket-통신이란">Socket 통신이란?</h3>
<p>Socket은 연결 지향형 네트워크 모델인 TCP/IP 네트워크에서 두 대의 컴퓨터간의 네트워크 연결을 활성화하는 엔드포인트입니다. 각각의 소켓은 고유한 주소를 가지며, 이는 IP 주소와 포트 번호의 조합으로 이루어져 있습니다. 이 두 정보를 통해 소켓은 데이터가 올바르게 도착하는 곳을 알 수 있습니다.</p>
<p>Socket 통신은 주로 실시간 시스템에서 사용되는데, 이는 양방향 통신이 가능하고 연결이 유지되는 동안에는 데이터를 지속적으로 전송할 수 있기 때문입니다. 즉, 클라이언트와 서버간에 연결이 활성화되고 난 후에는 양쪽 모두 데이터를 보내거나 받을 수 있습니다.</p>
<p>예를 들어, 채팅 앱을 생각해보세요. 실시간으로 메시지를 전송하고 받아야 하므로 Socket 통신이 이상적입니다. 한 유저가 메시지를 보내면, 서버는 해당 메시지를 받아 다른 유저의 소켓에 보냅니다.</p>
<h3 id="http-통신이란">HTTP 통신이란?</h3>
<p>HTTP는 Hypertext Transfer Protocol의 약자로, 웹 브라우저와 웹 서버 간에 HTML 페이지나 이미지와 같은 웹 자원을 주고 받을 때 주로 사용하는 프로토콜입니다.</p>
<p>HTTP는 &#39;요청-응답&#39; 모델을 사용합니다. 클라이언트(보통 웹 브라우저)가 HTTP 요청을 서버에 보내면, 서버는 해당 요청에 따른 결과를 HTTP 응답으로 보냅니다. 이 응답은 웹 페이지의 HTML, CSS, JavaScript 코드, 이미지 등을 포함할 수 있습니다.</p>
<p>즉, 웹 페이지를 로드하거나 웹 서버에 데이터를 전송하는 등의 작업을 할 때는 HTTP 통신이 이루어집니다. HTTP는 또한 상태를 유지하지 않는(stateless) 프로토콜입니다. 즉, 각 요청과 응답은 독립적이며, 서버는 이전 요청에 대한 정보를 저장하지 않습니다.</p>
<h3 id="socket-통신과-http-통신의-차이점-그리고-각자의-장점에-대해서">Socket 통신과 HTTP 통신의 차이점 그리고 각자의 장점에 대해서</h3>
<p>그렇다면 Socket 통신과 HTTP 통신의 차이점은 무엇일까요? 가장 주요한 차이점은 &#39;연결의 유지&#39;와 &#39;데이터 전송 방식&#39;에 있습니다.</p>
<ol>
<li><strong>연결의 유지</strong>: Socket 통신은 클라이언트와 서버 간에 지속적인 연결을 유지합니다. 이에 반해, HTTP 통신은 요청이 있을 때만 임시 연결이 형성되며, 응답이 전달되면 연결이 끊어집니다.</li>
<li><strong>데이터 전송 방식</strong>: Socket 통신은 양방향 통신이 가능하여, 클라이언트와 서버 모두 언제든지 데이터를 보낼 수 있습니다. 반면에 HTTP는 단방향 통신으로, 클라이언트가 요청을 보내면 그에 대한 응답이 서버로부터 돌아옵니다.</li>
<li><strong>상태 정보의 유지</strong>: HTTP는 stateless 프로토콜이므로 각 요청과 응답은 서로 독립적입니다. 서버는 클라이언트의 상태 정보를 유지하지 않습니다. 이에 반해, Socket 통신은 연결이 유지되는 한 상태 정보가 유지됩니다.</li>
</ol>
<h4 id="socket-통신의-장점">Socket 통신의 장점</h4>
<ol>
<li><strong>실시간 통신</strong>: Socket 통신은 양방향 통신이 가능하므로, 데이터를 실시간으로 주고 받을 수 있습니다. 이는 채팅 앱, 게임, 실시간 데이타를 주고받는 IoT 기기 등에서 굉장히 유용합니다.</li>
<li><strong>지속적인 연결</strong>: Socket 통신은 클라이언트와 서버간에 지속적인 연결을 유지합니다. 이로 인해 데이터를 주고받는 데 있어 속도가 빠르고, 높은 효율성을 가질 수 있습니다.</li>
<li><strong>상태 정보 유지</strong>: Socket 통신은 연결이 유지되는 동안 클라이언트와 서버 사이의 상태 정보를 유지할 수 있습니다. 이는 예를 들어 게임 상태, 로그인 상태 등을 유지하거나 두 개체 간의 대화 흐름을 추적하는 데 유용합니다.</li>
</ol>
<h4 id="http-통신의-장점">HTTP 통신의 장점</h4>
<ol>
<li><strong>단순성과 확장성</strong>: HTTP는 웹의 기본 통신 프로토콜로서, 요청과 응답이라는 간단한 방식으로 동작합니다. 이로 인해 개발이 간단하고, 웹 서비스의 확장성이 뛰어납니다.</li>
<li><strong>무상태성</strong>: HTTP는 무상태성(stateless)을 가집니다. 이는 서버가 클라이언트의 상태 정보를 저장하지 않아 각 요청이 독립적으로 처리됩니다. 이러한 특성은 서버의 메모리를 절약할 수 있으며, 서버가 다운되거나 새로운 서버가 추가되어도 클라이언트와의 통신에 문제가 없다는 것을 의미합니다.</li>
<li><strong>캐싱 기능</strong>: HTTP는 캐싱 기능을 가지고 있습니다. 캐싱은 데이터나 자원을 재사용하는 것으로, 웹 성능 향상에 큰 역할을 합니다. 예를 들어, 웹 사이트를 방문할 때 로고 이미지나 자주 사용하는 스크립트 파일 등은 한 번 받아온 후 로컬에 저장해두었다가 재사용합니다. 이는 불필요한 데이터 전송을 줄여주고, 페이지 로딩 시간을 줄여줍니다.</li>
</ol>
<h3 id="결론">결론</h3>
<p>Socket 통신과 HTTP 통신은 각각 서로 다른 상황과 요구사항에 따라 최적화된 프로토콜입니다. 실시간 데이터 통신이 필요한 경우 Socket 통신을, 웹 페이지와 같은 자원을 요청하는 경우 HTTP 통신을 사용하게 됩니다. 이 두 가지 통신 방식을 이해하고 적절히 활용하면 네트워크 프로그래밍에 있어 더욱 다양한 문제 해결이 가능해집니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Elasticsearch와 MySQL에서의 날짜별 필드 합계 계산하기]]></title>
            <link>https://velog.io/@dohyeon_an/Elasticsearch%EC%99%80-MySQL%EC%97%90%EC%84%9C%EC%9D%98-%EB%82%A0%EC%A7%9C%EB%B3%84-%ED%95%84%EB%93%9C-%ED%95%A9%EA%B3%84-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dohyeon_an/Elasticsearch%EC%99%80-MySQL%EC%97%90%EC%84%9C%EC%9D%98-%EB%82%A0%EC%A7%9C%EB%B3%84-%ED%95%84%EB%93%9C-%ED%95%A9%EA%B3%84-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 10 Jul 2023 13:17:58 GMT</pubDate>
            <description><![CDATA[<p>데이터 분석을 하다 보면, 특정 기간 동안 특정 필드의 합계를 날짜별로 계산하는 경우가 자주 있습니다. 이번 포스트에서는 Elasticsearch와 MySQL에서 같은 작업을 어떻게 수행하는지를 비교하면서 설명하겠습니다.</p>
<p>먼저 다음과 같은 판매 데이터가 있다고 가정해봅시다:</p>
<pre><code class="language-python">#sales 인덱스:
[
  { &quot;sale_id&quot;: 1, &quot;date&quot;: &quot;2023-01-01&quot;, &quot;category&quot;: &quot;Electronics&quot;, &quot;amount&quot;: 200 },
  { &quot;sale_id&quot;: 2, &quot;date&quot;: &quot;2023-01-02&quot;, &quot;category&quot;: &quot;Electronics&quot;, &quot;amount&quot;: 150 },
  { &quot;sale_id&quot;: 3, &quot;date&quot;: &quot;2023-01-07&quot;, &quot;category&quot;: &quot;Books&quot;, &quot;amount&quot;: 20 },
  { &quot;sale_id&quot;: 4, &quot;date&quot;: &quot;2023-02-01&quot;, &quot;category&quot;: &quot;Books&quot;, &quot;amount&quot;: 25 },
  { &quot;sale_id&quot;: 5, &quot;date&quot;: &quot;2023-02-02&quot;, &quot;category&quot;: &quot;Books&quot;, &quot;amount&quot;: 30 },
  { &quot;sale_id&quot;: 6, &quot;date&quot;: &quot;2023-02-07&quot;, &quot;category&quot;: &quot;Electronics&quot;, &quot;amount&quot;: 300 }
]</code></pre>
<h3 id="elasticsearch에서의-합계-계산">Elasticsearch에서의 합계 계산</h3>
<p>Elasticsearch에서는 <em>date_histogram_과 _sum</em> 집계를 이용해 날짜별 <em>amount</em> 합계를 계산할 수 있습니다. 다음 쿼리를 살펴봅시다.</p>
<pre><code class="language-python">#GET /sales/_search
{
  &quot;size&quot;: 0,
  &quot;query&quot;: {
    &quot;bool&quot;: {
      &quot;filter&quot;: [
        {
          &quot;range&quot;: {
            &quot;date&quot;: {
              &quot;gte&quot;: &quot;2023-01-01&quot;,
              &quot;lte&quot;: &quot;2023-02-28&quot;
            }
          }
        }
      ]
    }
  },
  &quot;aggs&quot;: {
    &quot;sales_per_day&quot;: {
      &quot;date_histogram&quot;: {
        &quot;field&quot;: &quot;date&quot;,
        &quot;interval&quot;: &quot;day&quot;,
        &quot;format&quot;: &quot;yyyy-MM-dd&quot;,
        &quot;min_doc_count&quot;: 0
      },
      &quot;aggs&quot;: {
        &quot;amount_sum&quot;: {
          &quot;sum&quot;: {
            &quot;field&quot;: &quot;amount&quot;
          }
        }
      }
    }
  }
}</code></pre>
<p>이 쿼리는 먼저 <em>bool</em> 쿼리의 <em>filter</em> 조건을 사용하여 2023년 1월 1일부터 2023년 2월 28일까지의 데이터만 선택합니다. 그런 다음 <em>date_histogram</em> 집계를 사용하여 날짜별로 데이터를 분할하고, 각 날짜 버킷 내에서 <em>amount_의 합계를 계산하는 _sum</em> 집계를 적용합니다.</p>
<h3 id="mysql에서의-합계-계산">MySQL에서의 합계 계산</h3>
<p>MySQL에서는 GROUP BY와 SUM 함수를 사용하여 동일한 결과를 얻을 수 있습니다. 아래 쿼리를 확인해 보세요.</p>
<pre><code class="language-sql">SELECT DATE(date) as sales_date, SUM(amount) as total_amount
FROM sales
WHERE date BETWEEN &#39;2023-01-01&#39; AND &#39;2023-02-28&#39;
GROUP BY sales_date
ORDER BY sales_date;</code></pre>
<p>이 쿼리는 먼저 WHERE 절을 사용하여 2023년 1월 1일부터 2023년 2월 28일까지의 데이터를 필터링합니다. 그런 다음 GROUP BY 절을 사용하여 날짜별로 데이터를 그룹화하고, 각 그룹에서 _amount_의 합계를 계산하는 SUM 함수를 적용합니다.</p>
<h3 id="결론">결론</h3>
<p>이번 시간에는 <em>date_histogram_을 간단하게 소개한 지난 내용에서 한 발자국 더 나아가 날짜별로 특성 필드값의 합계를 계산하는 쿼리를 작성해 봤습니다. 다음 시간에는 elasticsearch 고유한 항목의 개수를 계산하는 _cardinality</em> 라고 하는 집계 방식을 다루는 내용에 대한 포스트를 작성해 보겠습니다. 감사합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Elasticsearch의 Date Histogram Aggregation과 MySQL 날짜 그룹화 비교하기]]></title>
            <link>https://velog.io/@dohyeon_an/Elasticsearch%EC%9D%98-Date-Histogram-Aggregation%EA%B3%BC-MySQL-%EB%82%A0%EC%A7%9C-%EA%B7%B8%EB%A3%B9%ED%99%94-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dohyeon_an/Elasticsearch%EC%9D%98-Date-Histogram-Aggregation%EA%B3%BC-MySQL-%EB%82%A0%EC%A7%9C-%EA%B7%B8%EB%A3%B9%ED%99%94-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 10 Jul 2023 13:14:00 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요! 이전 포스팅에서는 Elasticsearch의 집계 기능과 MySQL의 GROUP BY를 비교하는 시간을 가졌습니다. 오늘은 Elasticsearch의 <em>date_histogram</em> 집계에 대해 이야기해보고, 이를 MySQL의 날짜 그룹화와 비교하겠습니다.</p>
<p>다음의 예시 데이터셋으로 시작해봅시다.</p>
<pre><code class="language-python">#sales 인덱스:
[
  { &quot;sale_id&quot;: 1, &quot;date&quot;: &quot;2023-01-01&quot;, &quot;category&quot;: &quot;Electronics&quot;, &quot;amount&quot;: 200 },
  { &quot;sale_id&quot;: 2, &quot;date&quot;: &quot;2023-01-02&quot;, &quot;category&quot;: &quot;Electronics&quot;, &quot;amount&quot;: 150 },
  { &quot;sale_id&quot;: 3, &quot;date&quot;: &quot;2023-01-07&quot;, &quot;category&quot;: &quot;Books&quot;, &quot;amount&quot;: 20 },
  { &quot;sale_id&quot;: 4, &quot;date&quot;: &quot;2023-02-01&quot;, &quot;category&quot;: &quot;Books&quot;, &quot;amount&quot;: 25 },
  { &quot;sale_id&quot;: 5, &quot;date&quot;: &quot;2023-02-02&quot;, &quot;category&quot;: &quot;Books&quot;, &quot;amount&quot;: 30 },
  { &quot;sale_id&quot;: 6, &quot;date&quot;: &quot;2023-02-07&quot;, &quot;category&quot;: &quot;Electronics&quot;, &quot;amount&quot;: 300 }
]</code></pre>
<p>이 데이터셋은 각각의 판매 건에 대한 정보를 담고 있습니다. 각 판매는 <em>sale_id</em>, <em>date</em>, <em>category</em>, <em>amount</em> 필드를 가지고 있습니다.</p>
<h3 id="elasticsearch의-date-histogram-aggregation">Elasticsearch의 Date Histogram Aggregation</h3>
<p>Elasticsearch에서 <em>date_histogram</em> 집계는 특정 시간 간격으로 날짜 필드를 버킷화하는 데 사용됩니다. 또한 bool 필터를 사용하여 특정 조건을 충족하는 문서만 대상으로 집계를 수행할 수 있습니다.</p>
<pre><code class="language-python">#GET /sales/_search
{
  &quot;size&quot;: 0,
  &quot;query&quot;: {
    &quot;bool&quot;: {
      &quot;filter&quot;: {
        &quot;term&quot;: { &quot;category.keyword&quot;: &quot;Electronics&quot; }
      }
    }
  },
  &quot;aggs&quot;: {
    &quot;sales_over_time&quot;: {
      &quot;date_histogram&quot;: {
        &quot;field&quot;: &quot;date&quot;,
        &quot;calendar_interval&quot;: &quot;month&quot;
      }
    }
  }
}</code></pre>
<p>이 쿼리는 _category.keyword_가 &quot;Electronics&quot;인 판매 건만을 대상으로, 월별로 판매 건을 집계합니다.</p>
<p>반환된 응답은 다음과 같습니다.</p>
<pre><code class="language-python">{
  ...
  &quot;aggregations&quot;: {
    &quot;sales_over_time&quot;: {
      &quot;buckets&quot;: [
        {
          &quot;key_as_string&quot;: &quot;2023-01-01&quot;,
          &quot;key&quot;: 1672444800000,
          &quot;doc_count&quot;: 2
        },
        {
          &quot;key_as_string&quot;: &quot;2023-02-01&quot;,
          &quot;key&quot;: 1672531200000,
          &quot;doc_count&quot;: 1
        }
      ]
    }
  }
}</code></pre>
<h3 id="mysql의-날짜-그룹화">MySQL의 날짜 그룹화</h3>
<p>이제 같은 작업을 SQL을 사용하여 수행해보겠습니다. SQL에서는 WHERE 절과 GROUP BY 절을 사용하여 동일한 결과를 얻을 수 있습니다.</p>
<pre><code class="language-sql">SELECT DATE_FORMAT(date, &#39;%Y-%m&#39;) as month, COUNT(*) 
FROM sales 
WHERE category = &#39;Electronics&#39;
GROUP BY month;</code></pre>
<p>이 쿼리는 &#39;category&#39;가 &#39;Electronics&#39;인 판매 건만을 대상으로, 월별로 판매 건을 집계합니다. 결과는 다음과 같습니다.</p>
<pre><code class="language-sql">+---------+----------+
| month   | COUNT(*) |
+---------+----------+
| 2023-01 | 2        |
| 2023-02 | 1        |
+---------+----------+</code></pre>
<h3 id="결론">결론</h3>
<p>Elasticsearch의 <em>date_histogram</em> 집계와 SQL의 날짜 그룹화는 동일한 목적을 위해 사용되지만, 그 구현 방식과 사용자 인터페이스에서 차이가 있습니다. Elasticsearch는 NoSQL 데이터베이스로서, 데이터의 분포를 그래픽으로 표현하거나 시간 별로 데이터를 분류하는 등의 분석에 더 효과적입니다. 반면에, SQL은 관계형 데이터베이스로서, 정형화된 데이터와 관계를 이용한 복잡한 쿼리에 더 강점을 가지고 있습니다.
이상으로 Elasticsearch와 SQL의 날짜 집계 방식에 대해 간략하게 살펴보았습니다. 향후에는 더 복잡한 집계와 분석을 위해 Elasticsearch의 다양한 집계 기능을 활용하는 방법에 대해 알아보겠습니다. 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Elasticsearch 집계(aggregation)와 MySQL GROUP BY 비교하기]]></title>
            <link>https://velog.io/@dohyeon_an/Elasticsearch-%EC%A7%91%EA%B3%84aggregation%EC%99%80-MySQL-GROUP-BY-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dohyeon_an/Elasticsearch-%EC%A7%91%EA%B3%84aggregation%EC%99%80-MySQL-GROUP-BY-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 10 Jul 2023 12:53:09 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요, 오늘은 Elasticsearch의 집계 기능에 대해 알아보고, 이를 전통적인 SQL의 GROUP BY 절과 비교해보겠습니다. 이를 통해 Elasticsearch의 집계가 어떻게 동작하는지 이해하고, 관계형 데이터베이스와 NoSQL 데이터베이스 간의 차이점을 이해하는 데 도움이 될 것입니다.</p>
<p>먼저, 예시를 위해 다음과 같은 데이터셋을 가지고 있습니다라고 가정해봅시다.</p>
<pre><code class="language-python">#products 인덱스:
[
  { &quot;product_id&quot;: 1, &quot;category&quot;: &quot;Electronics&quot;, &quot;price&quot;: 200 },
  { &quot;product_id&quot;: 2, &quot;category&quot;: &quot;Electronics&quot;, &quot;price&quot;: 150 },
  { &quot;product_id&quot;: 3, &quot;category&quot;: &quot;Books&quot;, &quot;price&quot;: 20 },
  { &quot;product_id&quot;: 4, &quot;category&quot;: &quot;Books&quot;, &quot;price&quot;: 25 },
  { &quot;product_id&quot;: 5, &quot;category&quot;: &quot;Books&quot;, &quot;price&quot;: 30 },
  { &quot;product_id&quot;: 6, &quot;category&quot;: &quot;Electronics&quot;, &quot;price&quot;: 300 }
]</code></pre>
<p>이 데이터셋은 간단한 제품 목록을 나타냅니다. 각 제품은 product_id, category, price 필드를 가지고 있습니다.</p>
<h3 id="1-elasticsearch-집계aggregation">1. Elasticsearch 집계(Aggregation)</h3>
<p>Elasticsearch에서는 집계를 사용하여 데이터에 대한 복잡한 분석을 수행할 수 있습니다. &#39;terms&#39; 집계와 &#39;stats&#39; 집계를 결합하여 특정 필드를 기준으로 그룹을 만들고, 그룹별로 통계를 계산해봅시다.</p>
<pre><code class="language-python">#GET /products/_search
{
  &quot;size&quot;: 0,
  &quot;aggs&quot;: {
    &quot;group_by_category&quot;: {
      &quot;terms&quot;: {
        &quot;field&quot;: &quot;category.keyword&quot;
      },
      &quot;aggs&quot;: {
        &quot;price_stats&quot;: {
          &quot;stats&quot;: {
            &quot;field&quot;: &quot;price&quot;
          }
        }
      }
    }
  }
}</code></pre>
<hr>
<p>💡 <strong>잠깐! 여기서 <code>“size”: 0</code> 의 의미는 무엇일까?</strong></p>
<p>Elasticsearch 쿼리에서 &quot;size&quot; 파라미터는 반환할 검색 결과의 문서 수를 지정합니다. 기본적으로 &quot;size&quot;는 10으로 설정되어 있습니다. 이는 한 번의 검색 쿼리로 기본적으로 최대 10개의 문서를 반환한다는 의미입니다.
그러나 &quot;size&quot;: 0를 설정하면, Elasticsearch는 검색 결과의 문서를 전혀 반환하지 않습니다. 대신, 요청한 집계 정보만 반환합니다. 이러한 설정은 문서 자체보다는 문서의 집계 정보가 필요한 경우, 예를 들어 문서의 개수, 평균, 합계 등을 계산하고 싶을 때 유용합니다. 이렇게 하면 불필요한 네트워크 트래픽과 처리 시간을 절약할 수 있습니다.<br>따라서 &quot;size&quot;: 0는 &quot;문서 검색 결과를 반환하지 말고, 집계 정보만 반환해라&quot;라는 의미로 해석할 수 있습니다.</p>
<hr>
<p>다시 쿼리문으로 돌아와서, 위 쿼리는 category.keyword 필드의 각 유일한 값에 대해 price 필드에 대한 통계를 계산합니다. 결과는 다음과 같습니다.</p>
<pre><code class="language-python">{
  ...
  &quot;aggregations&quot;: {
    &quot;group_by_category&quot;: {
      &quot;buckets&quot;: [
        {
          &quot;key&quot;: &quot;Electronics&quot;,
          &quot;doc_count&quot;: 3,
          &quot;price_stats&quot;: {
            &quot;count&quot;: 3,
            &quot;min&quot;: 150,
            &quot;max&quot;: 300,
            &quot;avg&quot;: 216.67,
            &quot;sum&quot;: 650
          }
        },
        {
          &quot;key&quot;: &quot;Books&quot;,
          &quot;doc_count&quot;: 3,
          &quot;price_stats&quot;: {
            &quot;count&quot;: 3,
            &quot;min&quot;: 20,
            &quot;max&quot;: 30,
            &quot;avg&quot;: 25,
            &quot;sum&quot;: 75
          }
        }
      ]
    }
  }
}</code></pre>
<h3 id="2-mysql의-group-by">2. MySQL의 Group by</h3>
<p>이제 같은 작업을 SQL을 사용하여 수행해 보겠습니다. GROUP BY 절은 특정 열을 기준으로 행을 그룹화하고, 각 그룹에 대해 통계를 계산할 수 있게 해줍니다.</p>
<pre><code class="language-sql">SELECT category, COUNT(*), MIN(price), MAX(price), AVG(price), SUM(price)
FROM products
GROUP BY category;</code></pre>
<p>이 쿼리는 &#39;category&#39; 필드의 각 유일한 값에 대해 &#39;price&#39; 필드에 대한 통계를 계산합니다. 결과는 다음과 같습니다.</p>
<pre><code class="language-scss">+-------------+----------+-----------+-----------+-----------+----------+
| category    | COUNT(*) | MIN(price)| MAX(price)| AVG(price)| SUM(price)|
+-------------+----------+-----------+-----------+-----------+----------+
| Electronics | 3        | 150       | 300       | 216.67    | 650      |
| Books       | 3        | 20        | 30        | 25        | 75       |
+-------------+----------+-----------+-----------+-----------+----------+</code></pre>
<h3 id="결론">결론</h3>
<p>Elasticsearch의 집계와 SQL의 GROUP BY는 비슷하게 동작하지만, Elasticsearch는 NoSQL 데이터베이스로써 스키마리스 데이터와 복잡한 중첩 데이터 구조를 처리하는 데 더 강점을 가지고 있습니다. 반면에, SQL은 관계형 데이터 모델에 최적화되어 있으며, 테이블 간의 관계를 기반으로 데이터를 조작하고 질의하는데 효율적입니다.</p>
<p>이상으로 Elasticsearch와 SQL의 차이와 그 사용 방법에 대해 간략하게 살펴보았습니다. 향후에는 더 복잡한 집계와 분석을 위해 Elasticsearch의 다양한 집계 기능을 활용하는 방법에 대해 알아보겠습니다. 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 패키지 관리자: Poetry와 Pip의 장단점 비교]]></title>
            <link>https://velog.io/@dohyeon_an/Python-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B4%80%EB%A6%AC%EC%9E%90-Poetry%EC%99%80-Pip%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@dohyeon_an/Python-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B4%80%EB%A6%AC%EC%9E%90-Poetry%EC%99%80-Pip%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Sat, 08 Jul 2023 10:11:57 GMT</pubDate>
            <description><![CDATA[<p>Python 프로젝트를 관리하는 도구로써 많은 개발자들이 pip와 poetry를 널리 사용하고 있습니다. 이들은 프로젝트의 종속성을 관리하고, 패키지 설치 및 배포를 돕는 중요한 도구입니다. 이 글에서는 각각의 장단점에 대해 다루어보고자 합니다.</p>
<hr>
<h2 id="pip">Pip</h2>
<p>pip는 Python에서 가장 널리 쓰이는 패키지 관리 도구입니다. Python 커뮤니티에서 가장 많이 인식되고 사용되며, PyPI(Python Package Index)에서 패키지를 설치하고 관리하는 데 주로 사용됩니다.</p>
<h3 id="pip의-장점">Pip의 장점</h3>
<p><strong>간편함</strong>: pip는 Python에 기본적으로 내장되어 있으므로 별도의 설치 과정 없이 사용 가능합니다. 명령어가 직관적이어서 초보자도 쉽게 사용할 수 있습니다.</p>
<p><strong>대중성</strong>: pip는 Python 패키지 설치의 표준 도구로 널리 사용되고 있습니다. 이는 많은 자료와 커뮤니티의 지원을 받을 수 있다는 것을 의미합니다.</p>
<h3 id="pip의-단점">Pip의 단점</h3>
<p><strong>종속성 관리의 한계</strong>: pip는 종속성을 잘 관리하지 못하는 문제가 있습니다. 특히, 다양한 프로젝트를 동시에 관리하려는 경우 복잡성이 증가하며, 이로 인해 종속성 충돌이 발생할 수 있습니다.</p>
<p><strong>패키지 버전 관리의 어려움</strong>: pip는 설치한 패키지의 버전을 명시적으로 관리하는 데 어려움이 있습니다. 이로 인해 개발 환경과 배포 환경 사이에 차이가 생길 수 있습니다.</p>
<hr>
<h2 id="poetry">Poetry</h2>
<p>Poetry는 Python의 종속성 및 패키지 관리를 위한 도구로, 프로젝트의 종속성을 보다 체계적으로 관리할 수 있게 해줍니다.</p>
<h3 id="poetry의-장점">Poetry의 장점</h3>
<p><strong>철저한 종속성 관리</strong>: Poetry는 프로젝트의 종속성을 보다 체계적이고 엄격하게 관리합니다. pyproject.toml 파일을 통해 명시적으로 종속성을 관리하며, 이를 통해 개발 환경과 배포 환경의 일관성을 유지하는 데 도움이 됩니다.</p>
<p><strong>가상 환경 자동 관리</strong>: Poetry는 프로젝트마다 독립적인 가상 환경을 생성하고 자동으로 관리합니다. 이를 통해 다양한 프로젝트의 종속성 충돌 문제를 피할 수 있습니다.</p>
<h3 id="poetry의-단점">Poetry의 단점</h3>
<p><strong>학습 곡선</strong>: pip에 비해 Poetry는 사용법이 조금 더 복잡합니다. 따라서 사용법을 익히는 데 시간이 필요할 수 있습니다.</p>
<p><strong>설치 과정 필요</strong>: pip와 달리 Poetry는 별도의 설치 과정이 필요합니다. 설치 과정이 복잡할 수 있으며, 특히 다양한 운영 체제에서의 호환성 문제가 있을 수 있습니다.</p>
<hr>
<p>결론적으로, pip와 Poetry는 각각의 장단점을 가지고 있습니다. pip는 단순하고 널리 사용되지만, 복잡한 종속성 관리에는 한계가 있습니다. 반면 Poetry는 종속성 관리에 강점을 가지지만, 사용법의 복잡성과 설치 과정이 필요한 점이 단점으로 작용할 수 있습니다. 프로젝트의 요구사항과 개인의 선호에 따라 적절한 도구를 선택하는 것이 중요합니다.</p>
]]></description>
        </item>
    </channel>
</rss>