{"id":625,"date":"2025-10-13T09:33:25","date_gmt":"2025-10-13T09:33:25","guid":{"rendered":"https:\/\/www.nnt-consulting.com\/tech\/blog\/?p=625"},"modified":"2025-10-13T09:34:07","modified_gmt":"2025-10-13T09:34:07","slug":"elasticsearch-part-2","status":"publish","type":"post","link":"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/","title":{"rendered":"Elasticsearch\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \uac80\uc0c9 \uc18d\ub3c4 \ucd5c\uc801\ud654 \u2013 Part 2"},"content":{"rendered":"<p><a href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch\/\">\uc9c0\ub09c \uae00<\/a>\uc5d0\uc11c Elasticsearch\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \uae00\uc5d0\uc11c\ub294 BigQuery\uc5d0 \uc801\uc7ac\ud558\uace0 \uc788\ub294 \uc5ec\ub7ec \ub9c8\ucf00\ud305 \ud50c\ub7ab\ud3fc\uc758 \uc131\uacfc \ub370\uc774\ud130\ub97c \uc6f9\uc11c\ube44\uc2a4\ub97c \ud1b5\ud574 \uc2e4\uc2dc\uac04\uc73c\ub85c \uc81c\uacf5\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c, Elasticsearch \ub3c4\uc785\uc744 \ud1b5\ud574 \uc218\uc2ed \ucd08\uc5d0 \ub2ec\ud558\ub358 \uc751\ub2f5 \uc2dc\uac04\uc744 800ms\ub85c \ub2e8\ucd95\uc2dc\ud0a8 \uc0ac\ub840\ub97c \uacf5\uc720\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\ubaa9\ucc28 \ud1a0\uae00\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EB%AC%B8%EC%A0%9C_%EC%83%81%ED%99%A9\" >\ubb38\uc81c \uc0c1\ud669<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EC%B4%88%EA%B8%B0_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EC%9D%98_%EB%AC%B8%EC%A0%9C%EC%A0%90\" >\ucd08\uae30 \uc544\ud0a4\ud14d\ucc98\uc758 \ubb38\uc81c\uc810<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#MySQL_%EB%8F%99%EC%A0%81_%ED%95%84%ED%84%B0%EB%A7%81%EC%9D%98_%EB%B3%B5%EC%9E%A1%EC%84%B1\" >MySQL \ub3d9\uc801 \ud544\ud130\ub9c1\uc758 \ubcf5\uc7a1\uc131<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88_Elasticsearch_Serving_Layer_%EB%8F%84%EC%9E%85\" >\ud574\uacb0 \ubc29\uc548: Elasticsearch Serving Layer \ub3c4\uc785<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EC%83%88%EB%A1%9C%EC%9A%B4_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98_%EC%84%A4%EA%B3%84\" >\uc0c8\ub85c\uc6b4 \uc544\ud0a4\ud14d\ucc98 \uc124\uacc4<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#Elasticsearch_%EC%84%A0%ED%83%9D_%EC%9D%B4%EC%9C%A0_%EA%B2%80%EC%83%89_%EC%B5%9C%EC%A0%81%ED%99%94_%EC%97%94%EC%A7%84\" >Elasticsearch \uc120\ud0dd \uc774\uc720: \uac80\uc0c9 \ucd5c\uc801\ud654 \uc5d4\uc9c4<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%ED%95%B5%EC%8B%AC_%EC%84%A4%EA%B3%84_%EC%9B%90%EC%B9%99\" >\ud575\uc2ec \uc124\uacc4 \uc6d0\uce59<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8_%EA%B5%AC%EC%B6%95\" >\ub370\uc774\ud130 \ud30c\uc774\ud504\ub77c\uc778 \uad6c\ucd95<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#1_BigQuery_%E2%86%92_Elasticsearch_%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98\" >1. BigQuery \u2192 Elasticsearch \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#2_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%B5%9C%EC%A0%81%ED%99%94\" >2. \ub370\uc774\ud130 \ubaa8\ub378\ub9c1 \ucd5c\uc801\ud654<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#Spring_Boot_API_%EC%B5%9C%EC%A0%81%ED%99%94\" >Spring Boot API \ucd5c\uc801\ud654<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#Elasticsearch_%ED%86%B5%ED%95%A9_%EA%B5%AC%ED%98%84\" >Elasticsearch \ud1b5\ud569 \uad6c\ud604<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#Elasticsearch_%EB%8F%99%EC%A0%81_%EC%BF%BC%EB%A6%AC_%EC%83%9D%EC%84%B1_%EC%B5%9C%EC%A0%81%ED%99%94\" >Elasticsearch \ub3d9\uc801 \ucffc\ub9ac \uc0dd\uc131 \ucd5c\uc801\ud654<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#Cloud_Run_Job%EC%9D%84_%ED%86%B5%ED%95%9C_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C_%EB%A1%9C%EC%A7%81_%EB%B6%84%EB%A6%AC\" >Cloud Run Job\uc744 \ud1b5\ud55c \ub2e4\uc6b4\ub85c\ub4dc \ub85c\uc9c1 \ubd84\ub9ac<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EB%AC%B8%EC%A0%9C%EC%A0%90%EA%B3%BC_%ED%95%B4%EA%B2%B0%EC%B1%85\" >\ubb38\uc81c\uc810\uacfc \ud574\uacb0\ucc45<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#Cloud_Run_Job_%EA%B5%AC%ED%98%84\" >Cloud Run Job \uad6c\ud604<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EB%B9%84%EB%8F%99%EA%B8%B0_%EC%B2%98%EB%A6%AC_%ED%94%8C%EB%A1%9C%EC%9A%B0\" >\ube44\ub3d9\uae30 \ucc98\ub9ac \ud50c\ub85c\uc6b0<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EC%A0%95%EB%9F%89%EC%A0%81_%EC%84%B1%EA%B3%BC\" >\uc815\ub7c9\uc801 \uc131\uacfc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EC%A0%95%EC%84%B1%EC%A0%81_%EA%B0%9C%EC%84%A0%EC%82%AC%ED%95%AD\" >\uc815\uc131\uc801 \uac1c\uc120\uc0ac\ud56d<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EA%B0%9C%EC%84%A0_%EC%82%AC%ED%95%AD_%EC%A0%95%EB%A6%AC\" >\uac1c\uc120 \uc0ac\ud56d \uc815\ub9ac<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#1_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98_%EC%84%A4%EA%B3%84_%EC%9B%90%EC%B9%99\" >1. \uc544\ud0a4\ud14d\ucc98 \uc124\uacc4 \uc6d0\uce59<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#2_%EA%B8%B0%EC%88%A0_%EC%84%A0%ED%83%9D_%EA%B8%B0%EC%A4%80\" >2. \uae30\uc220 \uc120\ud0dd \uae30\uc900<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#3_%EC%84%B1%EB%8A%A5_%EC%B5%9C%EC%A0%81%ED%99%94_%EC%A0%84%EB%9E%B5\" >3. \uc131\ub2a5 \ucd5c\uc801\ud654 \uc804\ub7b5<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/elasticsearch-part-2\/#%EB%A7%88%EB%AC%B4%EB%A6%AC\" >\ub9c8\ubb34\ub9ac<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%EB%AC%B8%EC%A0%9C_%EC%83%81%ED%99%A9\"><\/span>\ubb38\uc81c \uc0c1\ud669<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%EC%B4%88%EA%B8%B0_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EC%9D%98_%EB%AC%B8%EC%A0%9C%EC%A0%90\"><\/span>\ucd08\uae30 \uc544\ud0a4\ud14d\ucc98\uc758 \ubb38\uc81c\uc810<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\uae30\uc874 \uc2dc\uc2a4\ud15c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub85c \uc6b4\uc601\ub418\uace0 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<pre>BigQuery (\ub370\uc774\ud130 \uc6e8\uc5b4\ud558\uc6b0\uc2a4) -&gt; MySQL (\uc6f9\uc11c\ube44\uc2a4 DB) -&gt; Spring Boot API<\/pre>\n<p>\uc774 \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubb38\uc81c\uc810\ub4e4\uc774 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\ubcf5\uc7a1\ud55c \ub3d9\uc801 \ud544\ud130\ub9c1<\/strong>: \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc5d0 \ub530\ub77c 10\uac1c \uc774\uc0c1\uc758 <code>WHERE<\/code> \uc870\uac74\uc774 \ub3d9\uc801\uc73c\ub85c \ucd94\uac00\ub418\ub294 \uad6c\uc870<\/li>\n<li><strong>Timeout \uc774\uc288<\/strong>: \ubcf5\uc7a1\ud55c \uc9d1\uacc4 \ucffc\ub9ac\ub85c \uc778\ud574 \ub370\uc774\ud130\ub97c \uc870\ud68c\ud558\uba74 \uc6f9 \uc11c\ubc84\uc5d0\uc11c timeout\uc73c\ub85c \uc778\ud55c \uc7a5\uc560 \ubc1c\uc0dd<\/li>\n<li><strong>\uc131\ub2a5 \uc800\ud558<\/strong>: MySQL\uc5d0\uc11c \uba87 \ucc9c\ub9cc \uac74\uc758 \ub370\uc774\ud130 \uc870\ud68c \ubc0f \uc9d1\uacc4\uc5d0 30\ucd08 \uc774\uc0c1\uc758 \uc2dc\uac04\uc774 \uc18c\uc694\ub428<\/li>\n<li><strong>\ud655\uc7a5\uc131 \ud55c\uacc4<\/strong>: \ub370\uc774\ud130 \uc99d\uac00\uc5d0 \ub530\ub978 \uc120\ud615\uc801\uc778 \uc131\ub2a5 \uc800\ud558<\/li>\n<li><strong>\ub3d9\uc2dc\uc131 \ubb38\uc81c<\/strong>: \uc5ec\ub7ec \uc0ac\uc6a9\uc790\uac00 \ub3d9\uc2dc\uc5d0 \uc870\ud68c\ud560 \ub54c \uc2dc\uc2a4\ud15c \ubd80\ud558 \uae09\uc99d<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"MySQL_%EB%8F%99%EC%A0%81_%ED%95%84%ED%84%B0%EB%A7%81%EC%9D%98_%EB%B3%B5%EC%9E%A1%EC%84%B1\"><\/span>MySQL \ub3d9\uc801 \ud544\ud130\ub9c1\uc758 \ubcf5\uc7a1\uc131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\uae30\uc874 MySQL \uae30\ubc18 \uc2dc\uc2a4\ud15c\uc758 \uac00\uc7a5 \ud070 \ubb38\uc81c\ub294 \uc0ac\uc6a9\uc790 \uc694\uccad\uc5d0 \ub530\ub978 \ubcf5\uc7a1\ud55c \ub3d9\uc801 \ud544\ud130\ub9c1\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<code class=\"code-line language-java\" dir=\"auto\" data-line=\"30\"><\/code><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"30\"><span class=\"hljs-comment\">\/\/ \uae30\uc874 MySQL Query DSL \ucffc\ub9ac \uc0dd\uc131 \uc608\uc2dc (\ubcf5\uc7a1\ud55c WHERE \uc808)<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">BenchmarkQueryBuilder<\/span> {\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> List&lt;Query&gt; mustQueries = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ArrayList<\/span>&lt;&gt;();\r\n    \r\n    <span class=\"hljs-keyword\">public<\/span> BenchmarkQueryBuilder <span class=\"hljs-title function_\">addDateFilter<\/span><span class=\"hljs-params\">(String startDate, String endDate)<\/span> {\r\n        BoolQuery.<span class=\"hljs-type\">Builder<\/span> <span class=\"hljs-variable\">dateQuery<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">BoolQuery<\/span>.Builder();\r\n        \r\n        <span class=\"hljs-keyword\">if<\/span> (startDate != <span class=\"hljs-literal\">null<\/span>) {\r\n            dateQuery.filter(f -&gt; f.range(r -&gt; r\r\n                .field(<span class=\"hljs-string\">\"start_date\"<\/span>)\r\n                .gte(JsonData.of(startDate))\r\n            ));\r\n        }\r\n        <span class=\"hljs-comment\">\/\/ ... endDate \ucc98\ub9ac \ub85c\uc9c1<\/span>\r\n        \r\n        mustQueries.add(dateQuery.build()._toQuery());\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-built_in\">this<\/span>;\r\n    }\r\n    \r\n    <span class=\"hljs-keyword\">public<\/span> BenchmarkQueryBuilder <span class=\"hljs-title function_\">addCountryFilter<\/span><span class=\"hljs-params\">(List&lt;String&gt; countries)<\/span> {\r\n        <span class=\"hljs-keyword\">if<\/span> (countries != <span class=\"hljs-literal\">null<\/span> &amp;&amp; !countries.isEmpty()) {\r\n            mustQueries.add(Query.of(q -&gt; q.terms(t -&gt; t\r\n                .field(<span class=\"hljs-string\">\"country\"<\/span>)\r\n                .terms(TermsQueryField.of(tf -&gt; tf.value(countries.stream()\r\n                    .map(FieldValue::of)\r\n                    .collect(Collectors.toList())))\r\n            )));\r\n        }\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-built_in\">this<\/span>;\r\n    }\r\n    \r\n    <span class=\"hljs-comment\">\/\/ ... \uc5c5\uc885, \uae30\uae30\uc720\ud615, \uad11\uace0\uc720\ud615 \ub4f1 \ucd94\uac00 \ud544\ud130 \uba54\uc11c\ub4dc\ub4e4<\/span>\r\n    \r\n    <span class=\"hljs-keyword\">public<\/span> SearchRequest <span class=\"hljs-title function_\">build<\/span><span class=\"hljs-params\">()<\/span> {\r\n        BoolQuery.<span class=\"hljs-type\">Builder<\/span> <span class=\"hljs-variable\">boolQuery<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">BoolQuery<\/span>.Builder();\r\n        mustQueries.forEach(boolQuery::must);\r\n        \r\n        <span class=\"hljs-keyword\">return<\/span> SearchRequest.of(s -&gt; s\r\n            .index(<span class=\"hljs-string\">\"benchmark_dv360\"<\/span>)\r\n            .query(boolQuery.build()._toQuery())\r\n            .size(<span class=\"hljs-number\">10000<\/span>)\r\n        );\r\n    }\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ \uc0ac\uc6a9 \uc608\uc2dc - \ubcf5\uc7a1\ud55c \ud544\ud130\ub9c1 \uc694\uccad<\/span>\r\n<span class=\"hljs-type\">BenchmarkQueryBuilder<\/span> <span class=\"hljs-variable\">queryBuilder<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">BenchmarkQueryBuilder<\/span>()\r\n    .addDateFilter(<span class=\"hljs-string\">\"2023-01-01\"<\/span>, <span class=\"hljs-string\">\"2023-12-31\"<\/span>)\r\n    .addCountryFilter(Arrays.asList(<span class=\"hljs-string\">\"US\"<\/span>, <span class=\"hljs-string\">\"KR\"<\/span>, <span class=\"hljs-string\">\"JP\"<\/span>))\r\n    .addIndustryFilter(Arrays.asList(<span class=\"hljs-string\">\"Technology\"<\/span>, <span class=\"hljs-string\">\"Finance\"<\/span>))\r\n    <span class=\"hljs-comment\">\/\/ ... \ucd94\uac00 \ud544\ud130 \uc870\uac74\ub4e4<\/span>\r\n    .build();<\/code><\/pre>\n<p>\uc774 \uad6c\uc870\uc758 \ubb38\uc81c\uc810\uc740 \uc544\ub798\uc640 \uac19\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li class=\"code-line\" dir=\"auto\" data-line=\"86\"><strong>\ucffc\ub9ac \ubcf5\uc7a1\ub3c4<\/strong>: \ud558\ub098\uc758 \uc694\uccad\uc5d0 10\uac1c \uc774\uc0c1\uc758 \ud544\ud130 \uc870\uac74\uc774 \ub3d9\uc801\uc73c\ub85c \ucd94\uac00\ub420 \uc218 \uc788\uc74c<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"87\"><strong>\uc778\ub371\uc2a4 \ud6a8\uc728\uc131 \uc800\ud558<\/strong>: \ubcf5\uc7a1\ud55c \uc870\uac74 \uc870\ud569\uc73c\ub85c \uc778\ud55c \uc778\ub371\uc2a4 \ud65c\uc6a9\ub3c4 \uac10\uc18c<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"88\"><strong>\uc2e4\ud589 \uacc4\ud68d \ubd88\uc548\uc815<\/strong>: \ub3d9\uc801 \ucffc\ub9ac\ub85c \uc778\ud55c \uc608\uce21 \ubd88\uac00\ub2a5\ud55c \uc131\ub2a5 \ubcc0\ub3d9<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"89\"><strong>\ucf54\ub4dc \ubcf5\uc7a1\uc131<\/strong>: \uac01 \ud544\ud130\ub9c8\ub2e4 \ubcc4\ub3c4\uc758 \uba54\uc11c\ub4dc\uc640 \ub85c\uc9c1 \ud544\uc694<\/li>\n<\/ul>\n<h2 id=\"%F0%9F%8F%97%EF%B8%8F-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88-elasticsearch-serving-layer-%EB%8F%84%EC%9E%85\" class=\"code-line\" dir=\"auto\" data-line=\"33\"><span class=\"ez-toc-section\" id=\"%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88_Elasticsearch_Serving_Layer_%EB%8F%84%EC%9E%85\"><\/span>\ud574\uacb0 \ubc29\uc548: Elasticsearch Serving Layer \ub3c4\uc785<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 id=\"%EC%83%88%EB%A1%9C%EC%9A%B4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%84%A4%EA%B3%84\" class=\"code-line\" dir=\"auto\" data-line=\"35\"><span class=\"ez-toc-section\" id=\"%EC%83%88%EB%A1%9C%EC%9A%B4_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98_%EC%84%A4%EA%B3%84\"><\/span>\uc0c8\ub85c\uc6b4 \uc544\ud0a4\ud14d\ucc98 \uc124\uacc4<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"88\">\ubb38\uc81c \ud574\uacb0\uc744 \uc704\ud574\u00a0<strong>Lambda Architecture<\/strong>\u00a0\ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec Serving Layer\ub97c \ubd84\ub9ac\ud588\uc2b5\ub2c8\ub2e4:<\/p>\n<pre><code class=\"code-line\" dir=\"auto\" data-line=\"106\">BigQuery (Batch Layer) \u2192 Elasticsearch (Serving Layer) \u2192 Spring Boot API\r\n                     \u2198 Dataflow (Speed Layer)\r\n<\/code><\/pre>\n<h3 id=\"elasticsearch-%EC%84%A0%ED%83%9D-%EC%9D%B4%EC%9C%A0-%EA%B2%80%EC%83%89-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%97%94%EC%A7%84\" class=\"code-line\" dir=\"auto\" data-line=\"111\"><span class=\"ez-toc-section\" id=\"Elasticsearch_%EC%84%A0%ED%83%9D_%EC%9D%B4%EC%9C%A0_%EA%B2%80%EC%83%89_%EC%B5%9C%EC%A0%81%ED%99%94_%EC%97%94%EC%A7%84\"><\/span>Elasticsearch \uc120\ud0dd \uc774\uc720: \uac80\uc0c9 \ucd5c\uc801\ud654 \uc5d4\uc9c4<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol class=\"code-line\" dir=\"auto\" data-line=\"115\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"115\"><strong>\uc5ed\uc778\ub371\uc2a4 \uad6c\uc870<\/strong>: MySQL\uc758 B-Tree \uc778\ub371\uc2a4\uc640 \ub2ec\ub9ac \uc5ed\uc778\ub371\uc2a4\ub85c\u00a0<strong>\ubcf5\ud569 \uc870\uac74 \uac80\uc0c9\uc774 \uadf9\ub3c4\ub85c \ube60\ub984<\/strong><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"116\"><strong>\ubd84\uc0b0 \uac80\uc0c9<\/strong>: \ud074\ub7ec\uc2a4\ud130 \ud658\uacbd\uc5d0\uc11c\u00a0<strong>\ubcd1\ub82c \ucc98\ub9ac\ub97c \ud1b5\ud55c \uac80\uc0c9 \uc18d\ub3c4 \ud5a5\uc0c1<\/strong><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"117\"><strong>\uba54\ubaa8\ub9ac \uae30\ubc18 \uce90\uc2f1<\/strong>: \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ub370\uc774\ud130\ub97c \uba54\ubaa8\ub9ac\uc5d0 \uce90\uc2f1\ud558\uc5ec\u00a0<strong>\ub9c8\uc774\ud06c\ub85c\ucd08 \ub2e8\uc704 \uc751\ub2f5<\/strong><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"118\"><strong>\uc9d1\uacc4 \ucd5c\uc801\ud654<\/strong>: \ubcf5\uc7a1\ud55c \uc9d1\uacc4 \uc5f0\uc0b0\uc744\u00a0<strong>\ub124\uc774\ud2f0\ube0c \uc218\uc900\uc5d0\uc11c \ucd5c\uc801\ud654<\/strong>\ud558\uc5ec \ucc98\ub9ac<\/li>\n<\/ol>\n<h3 id=\"%ED%95%B5%EC%8B%AC-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99\" class=\"code-line\" dir=\"auto\" data-line=\"44\"><span class=\"ez-toc-section\" id=\"%ED%95%B5%EC%8B%AC_%EC%84%A4%EA%B3%84_%EC%9B%90%EC%B9%99\"><\/span>\ud575\uc2ec \uc124\uacc4 \uc6d0\uce59<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol class=\"code-line\" dir=\"auto\" data-line=\"122\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"122\"><strong>\uc77d\uae30 \ucd5c\uc801\ud654<\/strong>: Elasticsearch\uc758 \uc5ed\uc778\ub371\uc2a4 \uad6c\uc870\ub85c \ubcf5\uc7a1\ud55c \ud544\ud130\ub9c1\uc744 \ucd08\uace0\uc18d \ucc98\ub9ac<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"123\"><strong>\ube44\ub3d9\uae30 \ucc98\ub9ac<\/strong>: \ub300\uc6a9\ub7c9 \ub370\uc774\ud130 \ucc98\ub9ac\ub97c \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \uc218\ud589<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"124\"><strong>\uce90\uc2f1 \uc804\ub7b5<\/strong>: \uc790\uc8fc \uc870\ud68c\ub418\ub294 \ub370\uc774\ud130\uc758 \ube60\ub978 \uc811\uadfc \ubcf4\uc7a5<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"125\"><strong>\ud655\uc7a5\uc131<\/strong>: \ub370\uc774\ud130 \uc99d\uac00\uc5d0 \ub300\ube44\ud55c \uc218\ud3c9\uc801 \ud655\uc7a5 \uac00\ub2a5<\/li>\n<\/ol>\n<h2 id=\"%F0%9F%94%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95\" class=\"code-line\" dir=\"auto\" data-line=\"51\"><span class=\"ez-toc-section\" id=\"%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8_%EA%B5%AC%EC%B6%95\"><\/span>\ub370\uc774\ud130 \ud30c\uc774\ud504\ub77c\uc778 \uad6c\ucd95<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 id=\"1-bigquery-%E2%86%92-elasticsearch-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98\" class=\"code-line\" dir=\"auto\" data-line=\"53\"><span class=\"ez-toc-section\" id=\"1_BigQuery_%E2%86%92_Elasticsearch_%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98\"><\/span>1. BigQuery \u2192 Elasticsearch \ub9c8\uc774\uadf8\ub808\uc774\uc158<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"131\"><strong>GCP Dataflow<\/strong>\uc758 <a href=\"https:\/\/cloud.google.com\/dataflow\/docs\/guides\/templates\/provided\/bigquery-to-elasticsearch?hl=ko\" target=\"_blank\" rel=\"noopener\"><strong>BigQuery to Elasticsearch \ud15c\ud50c\ub9bf<\/strong><\/a>\uc744 \ud65c\uc6a9\ud55c \uc77c\uc77c \ubc30\uce58 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uad6c\ucd95\ud588\uc2b5\ub2c8\ub2e4:<\/p>\n<pre><code class=\"code-line language-bash\" dir=\"auto\" data-line=\"133\"><span class=\"hljs-comment\"># Dataflow \ud15c\ud50c\ub9bf \uc2e4\ud589<\/span>\r\ngcloud dataflow <span class=\"hljs-built_in\">jobs<\/span> run bigquery-to-elasticsearch \\\r\n    --gcs-location gs:\/\/dataflow-templates\/latest\/BigQuery_to_Elasticsearch \\\r\n    --region asia-northeast3 \\\r\n    --parameters \\\r\n        inputTableSpec=innocean-mkt-datalake-01:dataset.benchmark_dv360,\\\r\n        elasticsearchClusterId=elasticsearch-cluster,\\\r\n        elasticsearchIndexName=dv360,\\\r\n        elasticsearchDocumentType=benchmark,\\\r\n        elasticsearchUdf=<span class=\"hljs-literal\">false<\/span>,\\\r\n        javascriptTextTransformFunctionName=,\\\r\n        javascriptTextTransformGcsPath=,\\\r\n        bigQueryLoadingTemporaryDirectory=gs:\/\/temp-bucket\/bigquery_temp\r\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"149\"><strong>Dataflow \ud15c\ud50c\ub9bf\uc758 \uc7a5\uc810:<\/strong><\/p>\n<ul>\n<li class=\"code-line\" dir=\"auto\" data-line=\"149\"><strong>\uac80\uc99d\ub41c \ud30c\uc774\ud504\ub77c\uc778<\/strong>: Google\uc774 \uc81c\uacf5\ud558\ub294 \ud504\ub85c\ub355\uc158 \ub808\ub514 \ud15c\ud50c\ub9bf<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"149\"><strong>\uc790\ub3d9 \uc2a4\ucf00\uc77c\ub9c1<\/strong>: \ub370\uc774\ud130 \uc591\uc5d0 \ub530\ub978 \uc790\ub3d9 \ub9ac\uc18c\uc2a4 \uc870\uc815<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"149\"><strong>\uc624\ub958 \ucc98\ub9ac<\/strong>: \ub0b4\uc7a5\ub41c \uc7ac\uc2dc\ub3c4 \ubc0f \uc624\ub958 \ud578\ub4e4\ub9c1 \ub85c\uc9c1<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"149\"><strong>\ubaa8\ub2c8\ud130\ub9c1<\/strong>: Cloud Logging\uacfc \uc5f0\ub3d9\ud558\uc5ec \ubaa8\ub2c8\ud130\ub9c1 \uac00\ub2a5<\/li>\n<\/ul>\n<h3 id=\"2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%B5%9C%EC%A0%81%ED%99%94\" class=\"code-line\" dir=\"auto\" data-line=\"90\"><span class=\"ez-toc-section\" id=\"2_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%B5%9C%EC%A0%81%ED%99%94\"><\/span>2. \ub370\uc774\ud130 \ubaa8\ub378\ub9c1 \ucd5c\uc801\ud654<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"157\">Elasticsearch\uc758\u00a0<strong>\uac80\uc0c9 \ucd5c\uc801\ud654 \ud2b9\uc131<\/strong>\uc744 \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \uad6c\uc870 \uc124\uacc4:<\/p>\n<pre><code class=\"code-line language-json\" dir=\"auto\" data-line=\"159\"><span class=\"hljs-punctuation\">{<\/span>\r\n  <span class=\"hljs-attr\">\"mappings\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n    <span class=\"hljs-attr\">\"properties\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n        <span class=\"hljs-attr\">\"ad\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"text\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n          <span class=\"hljs-attr\">\"fields\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n            <span class=\"hljs-attr\">\"keyword\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n              <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n              <span class=\"hljs-attr\">\"ignore_above\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">256<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span>\r\n          <span class=\"hljs-punctuation\">}<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"ad_id\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"ad_type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"text\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n          <span class=\"hljs-attr\">\"fields\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n            <span class=\"hljs-attr\">\"keyword\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n              <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n              <span class=\"hljs-attr\">\"ignore_above\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">256<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span>\r\n          <span class=\"hljs-punctuation\">}<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"advertiser\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"text\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n          <span class=\"hljs-attr\">\"fields\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n            <span class=\"hljs-attr\">\"keyword\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n              <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n              <span class=\"hljs-attr\">\"ignore_above\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">256<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span>\r\n          <span class=\"hljs-punctuation\">}<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"advertiser_id\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"campaign\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"text\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n          <span class=\"hljs-attr\">\"fields\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n            <span class=\"hljs-attr\">\"keyword\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n              <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n              <span class=\"hljs-attr\">\"ignore_above\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">256<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span>\r\n          <span class=\"hljs-punctuation\">}<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"campaign_id\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"clicks\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"long\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"conversions\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"float\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"costs\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"double\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n        <span class=\"hljs-attr\">\"country\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n          <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"keyword\"<\/span>\r\n        <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n    <span class=\"hljs-punctuation\">}<\/span>\r\n  <span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"261\"><strong>\uac80\uc0c9 \ucd5c\uc801\ud654 \ud575\uc2ec \ud3ec\uc778\ud2b8:<\/strong><\/p>\n<table class=\"code-line\" dir=\"auto\" data-line=\"264\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"245\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"245\">\n<th>\ud544\ub4dc \ud0c0\uc785<\/th>\n<th>MySQL \ub300\ube44 \uc7a5\uc810<\/th>\n<th>\uac80\uc0c9 \uc131\ub2a5<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"247\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"247\">\n<td><code>keyword<\/code><\/td>\n<td>\uc815\ud655\ud55c \ub9e4\uce6d, \uc778\ub371\uc2f1 \ucd5c\uc801\ud654<\/td>\n<td><strong>\ubc00\ub9ac\ucd08 \ub2e8\uc704<\/strong>\u00a0\ud544\ud130\ub9c1<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"248\">\n<td><code>date<\/code><\/td>\n<td>\ubc94\uc704 \ucffc\ub9ac \ucd5c\uc801\ud654<\/td>\n<td><strong>\ub9c8\uc774\ud06c\ub85c\ucd08 \ub2e8\uc704<\/strong>\u00a0\ub0a0\uc9dc \uac80\uc0c9<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"249\">\n<td><code>double\/long<\/code><\/td>\n<td>\uc9d1\uacc4 \uc5f0\uc0b0 \ub124\uc774\ud2f0\ube0c \uc9c0\uc6d0<\/td>\n<td><strong>\ucd08\ub2f9 \uc218\ubc31\ub9cc \uac74<\/strong>\u00a0\uc9d1\uacc4 \ucc98\ub9ac<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"186\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"251\"><strong>\uc5ed\uc778\ub371\uc2a4 \ud65c\uc6a9<\/strong>:\u00a0<code>keyword<\/code>\u00a0\ud0c0\uc785\uc73c\ub85c \uc815\ud655\ud55c \ub9e4\uce6d\uacfc \ube60\ub978 \ud544\ud130\ub9c1<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"252\"><strong>\ubd84\uc0b0 \uc9d1\uacc4<\/strong>: \ubcf5\uc7a1\ud55c \uc9d1\uacc4 \uc5f0\uc0b0\uc744 \uc5ec\ub7ec \ub178\ub4dc\uc5d0\uc11c\u00a0<strong>\ubcd1\ub82c \ucc98\ub9ac<\/strong><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"253\"><strong>\uba54\ubaa8\ub9ac \ucd5c\uc801\ud654<\/strong>: \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ud544\ud130 \uc870\uac74\uc744\u00a0<strong>\uba54\ubaa8\ub9ac\uc5d0 \uce90\uc2f1<\/strong><\/li>\n<\/ul>\n<h2 id=\"%E2%9A%A1-spring-boot-api-%EC%B5%9C%EC%A0%81%ED%99%94\" class=\"code-line\" dir=\"auto\" data-line=\"118\"><span class=\"ez-toc-section\" id=\"Spring_Boot_API_%EC%B5%9C%EC%A0%81%ED%99%94\"><\/span>Spring Boot API \ucd5c\uc801\ud654<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 id=\"elasticsearch-%ED%86%B5%ED%95%A9-%EA%B5%AC%ED%98%84\" class=\"code-line\" dir=\"auto\" data-line=\"120\"><span class=\"ez-toc-section\" id=\"Elasticsearch_%ED%86%B5%ED%95%A9_%EA%B5%AC%ED%98%84\"><\/span>Elasticsearch \ud1b5\ud569 \uad6c\ud604<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"194\">Spring Boot\uc5d0\uc11c Elasticsearch\uc758\u00a0<strong>\uac80\uc0c9 \ucd5c\uc801\ud654 \uc5d4\uc9c4<\/strong>\uc744 \uc9c1\uc811 \ud65c\uc6a9\ud558\ub294 \uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\ub97c \uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4:<\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"261\"><span class=\"hljs-meta\">@Service<\/span>\r\n<span class=\"hljs-meta\">@RequiredArgsConstructor<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">DV360ElasticsearchService<\/span> {\r\n    \r\n    <span class=\"hljs-meta\">@Qualifier(\"elasticsearchRestClient\")<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> RestClient restClient;\r\n    \r\n    <span class=\"hljs-comment\">\/**\r\n     * Elasticsearch\uc758 \ubd84\uc0b0 \uc9d1\uacc4\ub97c \ud1b5\ud55c \ucd08\uace0\uc18d \uc694\uc57d \ub370\uc774\ud130 \uc870\ud68c\r\n     * - \uc5ed\uc778\ub371\uc2a4\ub85c \ubcf5\ud569 \ud544\ud130\ub9c1\uc744 \ubc00\ub9ac\ucd08 \ub2e8\uc704\ub85c \ucc98\ub9ac\r\n     * - \ubd84\uc0b0 \ud658\uacbd\uc5d0\uc11c \ubcd1\ub82c \uc9d1\uacc4 \uc5f0\uc0b0 \uc218\ud589\r\n     *\/<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> List&lt;BenchmarkDV360StandardDTO&gt; <span class=\"hljs-title function_\">getAggregatedSummaryData<\/span><span class=\"hljs-params\">(\r\n            BenchmarkRequestDTO.DV360Request request, String currency)<\/span> {\r\n        \r\n        <span class=\"hljs-comment\">\/\/ \ub3d9\uc801 \ucffc\ub9ac \uc0dd\uc131 (\uc5ed\uc778\ub371\uc2a4 \ucd5c\uc801\ud654)<\/span>\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">queryJson<\/span> <span class=\"hljs-operator\">=<\/span> convertQueryToJson(request);\r\n        \r\n        <span class=\"hljs-comment\">\/\/ Elasticsearch \ubd84\uc0b0 \uc9d1\uacc4 \ucffc\ub9ac \uc2e4\ud589<\/span>\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">requestJson<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-string\">\"\"\"\r\n            {\r\n              \"size\": 0,\r\n              \"query\": %s,\r\n              \"aggs\": {\r\n                \"by_industry\": {\r\n                  \"terms\": {\"field\": \"business_industry\", \"size\": 1000},\r\n                  \"aggs\": {\r\n                    \"by_year\": {\r\n                      \"terms\": {\"field\": \"year\", \"size\": 20},\r\n                      \"aggs\": {\r\n                        \"by_month\": {\r\n                          \"terms\": {\"field\": \"month\", \"size\": 12},\r\n                          \"aggs\": {\r\n                            \"total_media_cost\": {\"sum\": {\"field\": \"total_media_cost\"}},\r\n                            \"clicks\": {\"sum\": {\"field\": \"clicks\"}},\r\n                            \"impressions\": {\"sum\": {\"field\": \"impressions\"}}\r\n                          }\r\n                        }\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \"\"\"<\/span>.formatted(queryJson);\r\n        \r\n        <span class=\"hljs-comment\">\/\/ RestClient\ub85c \uc9c1\uc811 \uc694\uccad (\uba54\ubaa8\ub9ac \uce90\uc2f1 \ud65c\uc6a9)<\/span>\r\n        <span class=\"hljs-type\">Request<\/span> <span class=\"hljs-variable\">esRequest<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Request<\/span>(<span class=\"hljs-string\">\"POST\"<\/span>, <span class=\"hljs-string\">\"\/dv360\/_search\"<\/span>);\r\n        esRequest.setJsonEntity(requestJson);\r\n        \r\n        <span class=\"hljs-type\">Response<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> restClient.performRequest(esRequest);\r\n        <span class=\"hljs-keyword\">return<\/span> processJsonResponse(response, currency);\r\n    }\r\n}\r\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"253\"><strong>Elasticsearch \uac80\uc0c9 \ucd5c\uc801\ud654 \ud65c\uc6a9 \ud3ec\uc778\ud2b8:<\/strong><\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"254\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"319\"><strong>\uc5ed\uc778\ub371\uc2a4<\/strong>: \ubcf5\ud569 \uc870\uac74 \ud544\ud130\ub9c1\uc744\u00a0<strong>\ubc00\ub9ac\ucd08 \ub2e8\uc704<\/strong>\ub85c \ucc98\ub9ac<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"320\"><strong>\ubd84\uc0b0 \uc9d1\uacc4<\/strong>: \uc5ec\ub7ec \ub178\ub4dc\uc5d0\uc11c\u00a0<strong>\ubcd1\ub82c \uc9d1\uacc4 \uc5f0\uc0b0<\/strong>\u00a0\uc218\ud589<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"321\"><strong>\uba54\ubaa8\ub9ac \uce90\uc2f1<\/strong>: \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ucffc\ub9ac \uacb0\uacfc\ub97c\u00a0<strong>\uba54\ubaa8\ub9ac\uc5d0 \uce90\uc2f1<\/strong><\/li>\n<\/ul>\n<h3 id=\"elasticsearch-%EB%8F%99%EC%A0%81-%EC%BF%BC%EB%A6%AC-%EC%83%9D%EC%84%B1-%EC%B5%9C%EC%A0%81%ED%99%94\" class=\"code-line\" dir=\"auto\" data-line=\"230\"><span class=\"ez-toc-section\" id=\"Elasticsearch_%EB%8F%99%EC%A0%81_%EC%BF%BC%EB%A6%AC_%EC%83%9D%EC%84%B1_%EC%B5%9C%EC%A0%81%ED%99%94\"><\/span>Elasticsearch \ub3d9\uc801 \ucffc\ub9ac \uc0dd\uc131 \ucd5c\uc801\ud654<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"260\">\ubcf5\uc7a1\ud55c Query DSL \ube4c\ub354 \ud328\ud134 \ub300\uc2e0,\u00a0<strong>\uac04\ub2e8\ud558\uace0 \ud6a8\uc728\uc801\uc778 JSON \uae30\ubc18 \ucffc\ub9ac \uc0dd\uc131<\/strong>\uc73c\ub85c \uc804\ud658:<\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"327\"><span class=\"hljs-keyword\">private<\/span> String <span class=\"hljs-title function_\">convertQueryToJson<\/span><span class=\"hljs-params\">(BenchmarkRequestDTO.DV360Request request)<\/span> {\r\n    List&lt;String&gt; filterClauses = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ArrayList<\/span>&lt;&gt;();\r\n    \r\n    <span class=\"hljs-comment\">\/\/ 1. \ub0a0\uc9dc \ubc94\uc704 \ud544\ud130<\/span>\r\n    <span class=\"hljs-keyword\">if<\/span> (request.getStartDate() != <span class=\"hljs-literal\">null<\/span>) {\r\n        filterClauses.add(String.format(\r\n            <span class=\"hljs-string\">\"{\\\"range\\\":{\\\"start_date\\\":{\\\"gte\\\":\\\"%s\\\"}}}\"<\/span>,\r\n            request.getStartDate()));\r\n    }\r\n    \r\n    <span class=\"hljs-comment\">\/\/ 2. \uad6d\uac00 \ud544\ud130<\/span>\r\n    <span class=\"hljs-keyword\">if<\/span> (hasValue(request.getCountry())) {\r\n        List&lt;String&gt; termValues = request.getCountry().stream()\r\n            .filter(country -&gt; !country.endsWith(<span class=\"hljs-string\">\"_ALL\"<\/span>))\r\n            .map(country -&gt; String.format(<span class=\"hljs-string\">\"\\\"%s\\\"\"<\/span>, country))\r\n            .collect(Collectors.toList());\r\n            \r\n        <span class=\"hljs-keyword\">if<\/span> (!termValues.isEmpty()) {\r\n            filterClauses.add(String.format(\r\n                <span class=\"hljs-string\">\"{\\\"terms\\\":{\\\"country\\\":[%s]}}\"<\/span>,\r\n                String.join(<span class=\"hljs-string\">\",\"<\/span>, termValues)));\r\n        }\r\n    }\r\n    \r\n    <span class=\"hljs-comment\">\/\/ ... \uc5c5\uc885, \uae30\uae30\uc720\ud615, \uad11\uace0\uc720\ud615 \ub4f1 \ucd94\uac00 \ud544\ud130\ub4e4<\/span>\r\n    \r\n    <span class=\"hljs-comment\">\/\/ Bool \ucffc\ub9ac\ub85c \ud6a8\uc728\uc801 \uc870\ud569<\/span>\r\n    <span class=\"hljs-keyword\">return<\/span> String.format(<span class=\"hljs-string\">\"{\\\"bool\\\":{\\\"filter\\\":[%s]}}\"<\/span>,\r\n        String.join(<span class=\"hljs-string\">\",\"<\/span>, filterClauses));\r\n}\r\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"295\"><strong>\ubcf5\uc7a1\ud55c Query DSL vs \uac04\ub2e8\ud55c JSON \ucffc\ub9ac \ube44\uad50:<\/strong><\/p>\n<table class=\"code-line\" dir=\"auto\" style=\"height: 214px;\" width=\"571\" data-line=\"297\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"362\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"362\">\n<th>\uce21\uba74<\/th>\n<th>\ubcf5\uc7a1\ud55c Query DSL (\uae30\uc874)<\/th>\n<th>JSON \ucffc\ub9ac (\uac1c\uc120)<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"364\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"364\">\n<td>\ucf54\ub4dc \ubcf5\uc7a1\ub3c4<\/td>\n<td>100+ \ub77c\uc778 \ube4c\ub354 \ud074\ub798\uc2a4<\/td>\n<td>50\ub77c\uc778 \uac04\ub2e8\ud55c \uba54\uc11c\ub4dc<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"365\">\n<td>\uac00\ub3c5\uc131<\/td>\n<td>\ubcf5\uc7a1\ud55c \uc911\ucca9 \uad6c\uc870<\/td>\n<td>\uc9c1\uad00\uc801\uc778 JSON \uad6c\uc870<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"366\">\n<td>\uc720\uc9c0\ubcf4\uc218\uc131<\/td>\n<td>\uac01 \ud544\ud130\ubcc4 \uba54\uc11c\ub4dc \ud544\uc694<\/td>\n<td>\ub2e8\uc77c \uba54\uc11c\ub4dc\ub85c \ucc98\ub9ac<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"367\">\n<td><strong>\uac80\uc0c9 \uc131\ub2a5<\/strong><\/td>\n<td><strong>\ub7f0\ud0c0\uc784 \uac1d\uccb4 \uc0dd\uc131 \uc624\ubc84\ud5e4\ub4dc<\/strong><\/td>\n<td><strong>\uc5ed\uc778\ub371\uc2a4 \uc9c1\uc811 \ud65c\uc6a9\uc73c\ub85c \ucd08\uace0\uc18d<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"368\">\n<td>\ub514\ubc84\uae45<\/td>\n<td>\ubcf5\uc7a1\ud55c \uac1d\uccb4 \uad6c\uc870<\/td>\n<td>JSON \ub85c\uadf8\ub85c \uc26c\uc6b4 \ub514\ubc84\uae45<\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"369\">\n<td>\ud655\uc7a5\uc131<\/td>\n<td>\uc0c8 \ud544\ud130\ub9c8\ub2e4 \uba54\uc11c\ub4dc \ucd94\uac00<\/td>\n<td>\uc870\uac74\ubb38 \ucd94\uac00\ub85c \uac04\ub2e8 \ud655\uc7a5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"%F0%9F%9A%80-cloud-run-job%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%A1%9C%EC%A7%81-%EB%B6%84%EB%A6%AC\" class=\"code-line\" dir=\"auto\" data-line=\"214\"><span class=\"ez-toc-section\" id=\"Cloud_Run_Job%EC%9D%84_%ED%86%B5%ED%95%9C_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C_%EB%A1%9C%EC%A7%81_%EB%B6%84%EB%A6%AC\"><\/span>Cloud Run Job\uc744 \ud1b5\ud55c \ub2e4\uc6b4\ub85c\ub4dc \ub85c\uc9c1 \ubd84\ub9ac<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 id=\"%EB%AC%B8%EC%A0%9C%EC%A0%90%EA%B3%BC-%ED%95%B4%EA%B2%B0%EC%B1%85\" class=\"code-line\" dir=\"auto\" data-line=\"216\"><span class=\"ez-toc-section\" id=\"%EB%AC%B8%EC%A0%9C%EC%A0%90%EA%B3%BC_%ED%95%B4%EA%B2%B0%EC%B1%85\"><\/span>\ubb38\uc81c\uc810\uacfc \ud574\uacb0\ucc45<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"310\">\uc6f9\uc11c\ube44\uc2a4\uac00 \ub3d9\uc791\ud558\ub294 VM \uc2a4\ud399\uc774 \ud06c\uc9c0 \uc54a\ub2e4\ubcf4\ub2c8, \ub300\uc6a9\ub7c9 CSV \ub2e4\uc6b4\ub85c\ub4dc \uc694\uccad\uc774 \uc6f9 \uc11c\ubc84\uc5d0 \ubd80\ud558\ub97c \uc8fc\ub294 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 <strong>Cloud Run Job<\/strong>\uc744 \ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"312\"><strong>\uae30\uc874 \ubb38\uc81c\uc810:<\/strong><\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"313\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"378\">\uc218\uc2ed\ub9cc \uac74\uc758 \ub370\uc774\ud130\ub97c CSV\ub85c \ubcc0\ud658\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc6f9 \uc11c\ubc84 \ube14\ub85c\ud0b9<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"379\">\uba54\ubaa8\ub9ac \ubd80\uc871\uc73c\ub85c \uc778\ud55c OutOfMemoryError \ubc1c\uc0dd<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"380\">\uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uc800\ud558 (\ud398\uc774\uc9c0 \uc751\ub2f5 \uc9c0\uc5f0)<\/li>\n<\/ul>\n<p class=\"code-line\" dir=\"auto\" data-line=\"317\"><strong>\ud574\uacb0 \ubc29\uc548:<\/strong><\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"318\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"383\"><strong>\ube44\ub3d9\uae30 \ucc98\ub9ac<\/strong>: \uc694\uccad \uc989\uc2dc Job ID \ubc18\ud658<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"384\"><strong>\ubc31\uadf8\ub77c\uc6b4\ub4dc \ucc98\ub9ac<\/strong>: \ubcc4\ub3c4 \uc778\ud504\ub77c\uc5d0\uc11c \ub370\uc774\ud130 \ucc98\ub9ac<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"385\"><strong>\uc9c4\ud589 \uc0c1\ud669 \ucd94\uc801<\/strong>: MySQL polling\uc744 \ud1b5\ud55c \uc2e4\uc2dc\uac04 \uc9c4\ud589\ub960 \uc81c\uacf5<\/li>\n<\/ul>\n<h3 id=\"cloud-run-job-%EA%B5%AC%ED%98%84\" class=\"code-line\" dir=\"auto\" data-line=\"230\"><span class=\"ez-toc-section\" id=\"Cloud_Run_Job_%EA%B5%AC%ED%98%84\"><\/span>Cloud Run Job \uad6c\ud604<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<pre><code class=\"code-line language-python\" dir=\"auto\" data-line=\"389\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">CSVDownloader<\/span>:\r\n    <span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title function_\">__init__<\/span>(<span class=\"hljs-params\">self<\/span>):\r\n        self.task_id = os.environ.get(<span class=\"hljs-string\">\"TASK_ID\"<\/span>)\r\n        self.media_type = os.environ.get(<span class=\"hljs-string\">\"MEDIA_TYPE\"<\/span>)\r\n        self.currency = os.environ.get(<span class=\"hljs-string\">\"CURRENCY\"<\/span>)\r\n        self.filter_data = json.loads(os.environ.get(<span class=\"hljs-string\">\"FILTER_DATA\"<\/span>, <span class=\"hljs-string\">\"{}\"<\/span>))\r\n        \r\n        <span class=\"hljs-comment\"># Elasticsearch \ud074\ub77c\uc774\uc5b8\ud2b8 \ucd08\uae30\ud654<\/span>\r\n        self.es_client = Elasticsearch(\r\n            hosts=[os.environ.get(<span class=\"hljs-string\">\"ELASTICSEARCH_HOST\"<\/span>)],\r\n            http_auth=(os.environ.get(<span class=\"hljs-string\">\"ELASTICSEARCH_USERNAME\"<\/span>), \r\n                      os.environ.get(<span class=\"hljs-string\">\"ELASTICSEARCH_PASSWORD\"<\/span>))\r\n        )\r\n        \r\n        <span class=\"hljs-comment\"># GCS \ud074\ub77c\uc774\uc5b8\ud2b8 \ucd08\uae30\ud654<\/span>\r\n        self.storage_client = storage.Client()\r\n    \r\n    <span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title function_\">process_data_to_csv<\/span>(<span class=\"hljs-params\">self<\/span>):\r\n        <span class=\"hljs-string\">\"\"\"Elasticsearch\uc5d0\uc11c \ub370\uc774\ud130 \uc870\ud68c \ud6c4 CSV \ubcc0\ud658\"\"\"<\/span>\r\n        \r\n        <span class=\"hljs-comment\"># \uc2a4\ud06c\ub864 \ucffc\ub9ac\ub85c \ub300\uc6a9\ub7c9 \ub370\uc774\ud130 \ucc98\ub9ac<\/span>\r\n        query = {\r\n            <span class=\"hljs-string\">\"query\"<\/span>: self.build_elasticsearch_query(),\r\n            <span class=\"hljs-string\">\"size\"<\/span>: <span class=\"hljs-number\">10000<\/span>\r\n        }\r\n        \r\n        csv_file = tempfile.NamedTemporaryFile(mode=<span class=\"hljs-string\">'w'<\/span>, delete=<span class=\"hljs-literal\">False<\/span>, suffix=<span class=\"hljs-string\">'.csv'<\/span>)\r\n        writer = csv.writer(csv_file)\r\n        \r\n        <span class=\"hljs-comment\"># \ud5e4\ub354 \uc791\uc131<\/span>\r\n        writer.writerow(self.get_csv_headers())\r\n        \r\n        <span class=\"hljs-comment\"># \uc2a4\ud06c\ub864 \uac80\uc0c9\uc73c\ub85c \ub370\uc774\ud130 \ucc98\ub9ac<\/span>\r\n        response = self.es_client.search(\r\n            index=self.media_type,\r\n            body=query,\r\n            scroll=<span class=\"hljs-string\">'5m'<\/span>\r\n        )\r\n        \r\n        scroll_id = response[<span class=\"hljs-string\">'_scroll_id'<\/span>]\r\n        hits = response[<span class=\"hljs-string\">'hits'<\/span>][<span class=\"hljs-string\">'hits'<\/span>]\r\n        \r\n        <span class=\"hljs-keyword\">while<\/span> hits:\r\n            <span class=\"hljs-keyword\">for<\/span> hit <span class=\"hljs-keyword\">in<\/span> hits:\r\n                row_data = self.transform_to_csv_row(hit[<span class=\"hljs-string\">'_source'<\/span>])\r\n                writer.writerow(row_data)\r\n                self.processed_count += <span class=\"hljs-number\">1<\/span>\r\n                \r\n                <span class=\"hljs-comment\"># \uc9c4\ud589\ub960 \uc5c5\ub370\uc774\ud2b8<\/span>\r\n                <span class=\"hljs-keyword\">if<\/span> self.processed_count % <span class=\"hljs-number\">10000<\/span> == <span class=\"hljs-number\">0<\/span>:\r\n                    self.update_progress()\r\n            \r\n            <span class=\"hljs-comment\"># \ub2e4\uc74c \ubc30\uce58 \uc870\ud68c<\/span>\r\n            response = self.es_client.scroll(\r\n                scroll_id=scroll_id,\r\n                scroll=<span class=\"hljs-string\">'5m'<\/span>\r\n            )\r\n            hits = response[<span class=\"hljs-string\">'hits'<\/span>][<span class=\"hljs-string\">'hits'<\/span>]\r\n        \r\n        csv_file.close()\r\n        <span class=\"hljs-keyword\">return<\/span> csv_file.name\r\n    \r\n    <span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title function_\">upload_to_gcs<\/span>(<span class=\"hljs-params\">self, local_file_path<\/span>):\r\n        <span class=\"hljs-string\">\"\"\"GCS\uc5d0 \ud30c\uc77c \uc5c5\ub85c\ub4dc\"\"\"<\/span>\r\n        bucket = self.storage_client.bucket(GCS_BUCKET)\r\n        blob_name = <span class=\"hljs-string\">f\"downloads\/<span class=\"hljs-subst\">{self.task_id}<\/span>.csv\"<\/span>\r\n        blob = bucket.blob(blob_name)\r\n        \r\n        blob.upload_from_filename(local_file_path)\r\n        blob.make_public()\r\n        \r\n        <span class=\"hljs-keyword\">return<\/span> blob.size, blob.public_url<\/code><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"%EB%B9%84%EB%8F%99%EA%B8%B0_%EC%B2%98%EB%A6%AC_%ED%94%8C%EB%A1%9C%EC%9A%B0\"><\/span>\ube44\ub3d9\uae30 \ucc98\ub9ac \ud50c\ub85c\uc6b0<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-634\" src=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es.png\" alt=\"elasticsearch-cloud run job flow\" width=\"1046\" height=\"775\" srcset=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es.png 1046w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es-300x222.png 300w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es-1024x759.png 1024w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es-768x569.png 768w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es-900x667.png 900w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/09\/es-500x370.png 500w\" sizes=\"auto, (max-width: 1046px) 100vw, 1046px\" \/><\/p>\n<h3 id=\"%EC%A0%95%EB%9F%89%EC%A0%81-%EC%84%B1%EA%B3%BC\" class=\"code-line\" dir=\"auto\" data-line=\"336\"><span class=\"ez-toc-section\" id=\"%EC%A0%95%EB%9F%89%EC%A0%81_%EC%84%B1%EA%B3%BC\"><\/span>\uc815\ub7c9\uc801 \uc131\uacfc<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table class=\"code-line\" dir=\"auto\" style=\"height: 275px;\" width=\"659\" data-line=\"430\">\n<thead class=\"code-line\" dir=\"auto\" data-line=\"495\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"495\">\n<th>\uc9c0\ud45c<\/th>\n<th>\uae30\uc874 (MySQL)<\/th>\n<th>\uac1c\uc120 \ud6c4 (Elasticsearch)<\/th>\n<th>\uac1c\uc120\uc728<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"code-line\" dir=\"auto\" data-line=\"497\">\n<tr class=\"code-line\" dir=\"auto\" data-line=\"497\">\n<td>\ud3c9\uade0 \uc751\ub2f5 \uc2dc\uac04<\/td>\n<td>45\ucd08<\/td>\n<td>800ms<\/td>\n<td><strong>98.2% \uac1c\uc120<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"498\">\n<td>95th percentile<\/td>\n<td>120\ucd08<\/td>\n<td>1.2\ucd08<\/td>\n<td><strong>99.0% \uac1c\uc120<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"499\">\n<td>\ub3d9\uc2dc \uc0ac\uc6a9\uc790 \ucc98\ub9ac<\/td>\n<td>5\uba85<\/td>\n<td>200\uba85+<\/td>\n<td><strong>40\ubc30 \ud5a5\uc0c1<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"500\">\n<td>\uc2dc\uc2a4\ud15c \uac00\uc6a9\uc131<\/td>\n<td>95%<\/td>\n<td>99.9%<\/td>\n<td><strong>5.1% \ud5a5\uc0c1<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"501\">\n<td>\ub370\uc774\ud130 \ucc98\ub9ac\ub7c9<\/td>\n<td>1M rows\/min<\/td>\n<td>10M rows\/min<\/td>\n<td><strong>10\ubc30 \ud5a5\uc0c1<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"502\">\n<td>\ucffc\ub9ac \ubcf5\uc7a1\ub3c4<\/td>\n<td>100+ \ub77c\uc778 Query DSL<\/td>\n<td>50\ub77c\uc778 JSON \uc0dd\uc131<\/td>\n<td><strong>50% \ucf54\ub4dc \ub2e8\uc21c\ud654<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"503\">\n<td>\uc778\ub371\uc2a4 \ud6a8\uc728\uc131<\/td>\n<td>\ubcf5\ud569 \uc778\ub371\uc2a4 \uc758\uc874<\/td>\n<td>\uac1c\ubcc4 \ud544\ub4dc \ucd5c\uc801\ud654<\/td>\n<td><strong>\uc720\uc9c0\ubcf4\uc218\uc131 \ud5a5\uc0c1<\/strong><\/td>\n<\/tr>\n<tr class=\"code-line\" dir=\"auto\" data-line=\"504\">\n<td>\ub7f0\ud0c0\uc784 \uc131\ub2a5<\/td>\n<td>\uac1d\uccb4 \uc0dd\uc131 \uc624\ubc84\ud5e4\ub4dc<\/td>\n<td>\uc9c1\uc811 JSON \uc0dd\uc131<\/td>\n<td><strong>\uba54\ubaa8\ub9ac \ud6a8\uc728\uc131 \ud5a5\uc0c1<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"%EC%A0%95%EC%84%B1%EC%A0%81-%EA%B0%9C%EC%84%A0%EC%82%AC%ED%95%AD\" class=\"code-line\" dir=\"auto\" data-line=\"346\"><span class=\"ez-toc-section\" id=\"%EC%A0%95%EC%84%B1%EC%A0%81_%EA%B0%9C%EC%84%A0%EC%82%AC%ED%95%AD\"><\/span>\uc815\uc131\uc801 \uac1c\uc120\uc0ac\ud56d<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li class=\"code-line\" dir=\"auto\" data-line=\"346\"><strong>\uc0ac\uc6a9\uc790 \uacbd\ud5d8<\/strong>: \uc2e4\uc2dc\uac04 \ub370\uc774\ud130 \uc870\ud68c\ub85c \uc989\uc2dc \ubd84\uc11d \uac00\ub2a5<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"346\"><strong>\uc2dc\uc2a4\ud15c \uc548\uc815\uc131<\/strong>: Timeout \uc774\uc288 \uc644\uc804 \ud574\uacb0<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"346\"><strong>\uac1c\ubc1c \uc0dd\uc0b0\uc131<\/strong>: \ubcf5\uc7a1\ud55c SQL \ucd5c\uc801\ud654 \uc791\uc5c5 \ubd88\ud544\uc694<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"346\"><strong><strong>\uc6b4\uc601 \ud6a8\uc728\uc131: \uc790\ub3d9\ud654\ub41c \ub370\uc774\ud130 \ud30c\uc774\ud504\ub77c\uc778\uc73c\ub85c \uc6b4\uc601 \ubd80\ub2f4 \uac10\uc18c<\/strong><\/strong><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%EA%B0%9C%EC%84%A0_%EC%82%AC%ED%95%AD_%EC%A0%95%EB%A6%AC\"><\/span>\uac1c\uc120 \uc0ac\ud56d \uc815\ub9ac<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 id=\"1-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99\" class=\"code-line\" dir=\"auto\" data-line=\"468\"><span class=\"ez-toc-section\" id=\"1_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98_%EC%84%A4%EA%B3%84_%EC%9B%90%EC%B9%99\"><\/span>1. \uc544\ud0a4\ud14d\ucc98 \uc124\uacc4 \uc6d0\uce59<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"611\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"676\"><strong>\uc77d\uae30 \ucd5c\uc801\ud654<\/strong>: \uc4f0\uae30\ubcf4\ub2e4 \uc77d\uae30\uc5d0 \ud2b9\ud654\ub41c \uad6c\uc870 \uc124\uacc4<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"677\"><strong>\ube44\ub3d9\uae30 \ucc98\ub9ac<\/strong>: \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \ud574\uce58\uc9c0 \uc54a\ub294 \ubc31\uadf8\ub77c\uc6b4\ub4dc \ucc98\ub9ac<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"678\"><strong>\ubaa8\ub2c8\ud130\ub9c1 \uc6b0\uc120<\/strong>: \uc131\ub2a5 \uc9c0\ud45c \uce21\uc815\uc744 \ud1b5\ud55c \uc9c0\uc18d\uc801 \uac1c\uc120<\/li>\n<\/ul>\n<h3 id=\"2-%EA%B8%B0%EC%88%A0-%EC%84%A0%ED%83%9D-%EA%B8%B0%EC%A4%80\" class=\"code-line\" dir=\"auto\" data-line=\"474\"><span class=\"ez-toc-section\" id=\"2_%EA%B8%B0%EC%88%A0_%EC%84%A0%ED%83%9D_%EA%B8%B0%EC%A4%80\"><\/span>2. \uae30\uc220 \uc120\ud0dd \uae30\uc900<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"617\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"682\"><strong>Elasticsearch<\/strong>: \ubcf5\uc7a1\ud55c \uc9d1\uacc4 \ucffc\ub9ac\uc640 \uc2e4\uc2dc\uac04 \uac80\uc0c9\uc5d0 \ucd5c\uc801<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"683\"><strong>Cloud Run Job<\/strong>: \uc11c\ubc84\ub9ac\uc2a4 \ubc29\uc2dd\uc758 \ube44\ub3d9\uae30 \uc791\uc5c5 \ucc98\ub9ac<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"684\"><strong>Dataflow Template<\/strong>: Google\uc774 \uc81c\uacf5\ud558\ub294 \uac80\uc99d\ub41c \ud30c\uc774\ud504\ub77c\uc778\uc73c\ub85c \uc548\uc815\uc131\uacfc \ud655\uc7a5\uc131 \ud655\ubcf4<\/li>\n<\/ul>\n<h3 id=\"3-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%A0%84%EB%9E%B5\" class=\"code-line\" dir=\"auto\" data-line=\"480\"><span class=\"ez-toc-section\" id=\"3_%EC%84%B1%EB%8A%A5_%EC%B5%9C%EC%A0%81%ED%99%94_%EC%A0%84%EB%9E%B5\"><\/span>3. \uc131\ub2a5 \ucd5c\uc801\ud654 \uc804\ub7b5<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"623\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"688\"><strong>\ub370\uc774\ud130 \ubaa8\ub378\ub9c1<\/strong>: \uc0ac\uc6a9 \ud328\ud134\uc5d0 \ub9de\ub294 \uc778\ub371\uc2a4 \uc124\uacc4<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"689\"><strong>\ucffc\ub9ac \ucd5c\uc801\ud654<\/strong>: \ubcf5\uc7a1\ud55c WHERE \uc808\uc744 \uad6c\uc870\ud654\ub41c \ud544\ud130\ub85c \ub2e8\uc21c\ud654<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"690\"><strong>\uce90\uc2f1 \uc804\ub7b5<\/strong>: \uc790\uc8fc \uc870\ud68c\ub418\ub294 \ub370\uc774\ud130\uc758 \uc0ac\uc804 \uc9d1\uacc4<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"691\"><strong>\ucffc\ub9ac \uc0dd\uc131 \ucd5c\uc801\ud654<\/strong>: \ubcf5\uc7a1\ud55c Query DSL\uc5d0\uc11c \uc9c1\uc811 JSON \uc0dd\uc131\uc73c\ub85c \uc804\ud658<\/li>\n<\/ul>\n<h2 id=\"%EB%A7%88%EB%AC%B4%EB%A6%AC\" class=\"code-line\" dir=\"auto\" data-line=\"628\"><span class=\"ez-toc-section\" id=\"%EB%A7%88%EB%AC%B4%EB%A6%AC\"><\/span>\ub9c8\ubb34\ub9ac<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"630\">\uc774\ubc88 \uc131\ub2a5 \ucd5c\uc801\ud654 \ud504\ub85c\uc81d\ud2b8\ub97c \ud1b5\ud574\u00a0<strong>\ub370\uc774\ud130 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1\uc758 \ud575\uc2ec\uc740 \ub2e8\uc21c\ud788 \uae30\uc220\uc744 \ub3c4\uc785\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \ube44\uc988\ub2c8\uc2a4 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub9de\ub294 \ucd5c\uc801\uc758 \uc544\ud0a4\ud14d\ucc98\ub97c \uc124\uacc4\ud558\ub294 \uac83<\/strong>\uc784\uc744 \uae68\ub2ec\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud2b9\ud788 \ub9c8\ucf00\ud305 \ub370\uc774\ud130\ub77c\ub294 \ub3c4\uba54\uc778 \ud2b9\uc131\uc744 \uace0\ub824\ud558\uc5ec, <strong>\ubcf5\uc7a1\ud55c \ub3d9\uc801 \ud544\ud130\ub9c1 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uace0 \uc2e4\uc2dc\uac04\uc131\uc774 \uc911\uc694\ud55c \uc6f9 \uc11c\ube44\uc2a4\uc640 \ub300\uc6a9\ub7c9 \ucc98\ub9ac\uac00 \ud544\uc694\ud55c \ubc30\uce58 \uc791\uc5c5\uc744 \ubd84\ub9ac<\/strong>\ud55c \uac83\uc774 \uc131\uacf5\uc758 \ud575\uc2ec\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<code class=\"code-line language-python\" dir=\"auto\" data-line=\"389\"><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc9c0\ub09c \uae00\uc5d0\uc11c Elasticsearch\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \uae00\uc5d0\uc11c\ub294 BigQuery\uc5d0 \uc801\uc7ac\ud558\uace0 \uc788\ub294 \uc5ec\ub7ec \ub9c8\ucf00\ud305 \ud50c\ub7ab\ud3fc\uc758 \uc131\uacfc \ub370\uc774\ud130\ub97c \uc6f9\uc11c\ube44\uc2a4\ub97c \ud1b5\ud574 \uc2e4\uc2dc\uac04\uc73c\ub85c \uc81c\uacf5\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c, Elasticsearch \ub3c4\uc785\uc744 \ud1b5\ud574 \uc218\uc2ed \ucd08\uc5d0 \ub2ec\ud558\ub358 \uc751\ub2f5 \uc2dc\uac04\uc744 800ms\ub85c \ub2e8\ucd95\uc2dc\ud0a8 \uc0ac\ub840\ub97c \uacf5\uc720\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. \ubb38\uc81c \uc0c1\ud669 \ucd08\uae30 \uc544\ud0a4\ud14d\ucc98\uc758 \ubb38\uc81c\uc810 \uae30\uc874 \uc2dc\uc2a4\ud15c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub85c \uc6b4\uc601\ub418\uace0 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. BigQuery (\ub370\uc774\ud130 \uc6e8\uc5b4\ud558\uc6b0\uc2a4) -&gt; MySQL [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[71,54,12,72],"class_list":["post-625","post","type-post","status-publish","format-standard","hentry","category-1","tag-dataflow","tag-elasticsearch","tag-gcp","tag-spring-boot","col-md-12"],"_links":{"self":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts\/625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/comments?post=625"}],"version-history":[{"count":10,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts\/625\/revisions"}],"predecessor-version":[{"id":638,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts\/625\/revisions\/638"}],"wp:attachment":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/media?parent=625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/categories?post=625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/tags?post=625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}