{"id":1648,"date":"2021-06-27T21:30:45","date_gmt":"2021-06-27T12:30:45","guid":{"rendered":"https:\/\/oboki.net\/workspace\/?p=1648"},"modified":"2021-06-27T21:45:02","modified_gmt":"2021-06-27T12:45:02","slug":"extension-development-feat-sql-styler","status":"publish","type":"post","link":"https:\/\/oboki.net\/workspace\/tools\/vscode\/extension-development-feat-sql-styler\/","title":{"rendered":"VSCode Extension \uac1c\ubc1c\uae30 (feat. SQL Styler)"},"content":{"rendered":"<p>\ub300\ubd80\ubd84\uc758 IDE \uc5d0\uc11c\ub294 \uc5b8\uc5b4\ubcc4\ub85c \ud3ec\ub9f7\ud305 \ud504\ub85c\ud30c\uc77c\uc744 \uc124\uc815\ud574\uc11c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ud655\uc7a5\ub4e4\uc774 \uc788\ub294\ub370 Code \uc5d0\uc11c SQL \uc6a9\uc73c\ub85c \uc4f8\ub9cc\ud55c \ud3ec\ub9f7\ud130\ub294 \uc5c6\ub294 \uac83 \uac19\ub2e4. \uadf8\ub098\ub9c8 \uc788\ub294\uac8c <code>Poor Man&#039;s T-SQL<\/code> \uc2a4\ud0c0\uc77c\uc5d0\uc11c keyword uppercase \uc635\uc158\uc774\ub098 comma \uc704\uce58 \uc815\ub3c4 \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uae30\ub2a5 \uc815\ub3c4 \ubfd0\uc778\ub4ef.<\/p>\n<p>\ub0b4\uac00 \ud558\ub294 \uc5c5\ubb34\uc5d0\uc11c\ub294 1~200 \uc904\uc740 \uac00\ubccd\uac8c \ub118\uc5b4\uac00\ub294 SQL \ucf54\ub4dc\ub97c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\ub0b4\ub294\ub370, \ud0a4\uc6cc\ub4dc \ub9c8\ub2e4 \uac1c\ud589\uc744 \ud558\uace0 \uc11c\ube0c\ucffc\ub9ac \ud0c0\uc785\uc774 \uc2dd\ubcc4\uc774 \uc798 \uc548\ub418\ub294 Poor Man \uc2a4\ud0c0\uc77c\ub85c\ub294 \uac10\ub2f9\uc774 \uc548\ub41c\ub2e4. \uadf8\ub798\uc11c, VSCode\ub97c \uc560\uc6a9\ud558\uace0  1\uc778\uc73c\ub85c\uc11c, \uc774\ucc38\uc5d0 \uc0ac\ub0b4\uc5d0\uc11c \uad6c\uc804\uc73c\ub85c \uc774\uc5b4\uc838\uc624\ub294 SQL \uc2a4\ud0c0\uc77c\uc744 \uc815\uc758\ub3c4 \ud560 \uacb8 \ud3ec\ub9f7\ud130\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uae30\ub85c \ud588\ub2e4.<\/p>\n<h2>VSCode extension \uc0dd\ud0dc\uacc4<\/h2>\n<p>VSCode \uac00 \ub300\uc131\ud55c \uc774\uc720\uc911 \ud558\ub098\ub85c \uac15\ub825\ud55c \ucee4\ubba4\ub2c8\ud2f0\uc758 \uc9c0\uc6d0\uc774 \uaf3d\ud788\ub294\ub370 \uadf8 \uba85\uc131\uc5d0 \ub9de\uac8c \uc5ed\uc2dc\ub098 \ub9e4\ub274\uc5bc\uacfc \ucf54\ub4dc \uc608\uc81c\ub4e4\uc774 \uc798 \uad00\ub9ac\ub418\uace0 \uc788\uc5c8\ub2e4.<\/p>\n<p><\/p>\n<ul>\n<li><a href=\"https:\/\/code.visualstudio.com\/api\">https:\/\/code.visualstudio.com\/api<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/microsoft\/vscode-extension-samples\">https:\/\/github.com\/microsoft\/vscode-extension-samples<\/a><\/li>\n<\/ul>\n<p><\/p>\n<p>\uc774 \uc911\uc5d0\uc11c \ud3ec\ub9f7\ud130 \uad6c\ud604\uc5d0 \ud544\uc694\ud55c \uc5d0\ub514\ud130 API\ub294 \ub2e8\uc21c\ud788 \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub4e4\uc744 \ud3ec\ub9f7\ub41c \ud14d\uc2a4\ud2b8\ub85c \ubc14\uafd4\uc904 \uc218 \uc788\ub294 \uae30\ub2a5\uc774\uba74 \ucda9\ubd84\ud55c\ub370, \uc608\uc81c \uc911 <code>document-editing-sample<\/code> \uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 API \ub4e4\uc774\uba74 \ucda9\ubd84\ud574\ubcf4\uc600\uace0 typescript \uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc740 \uc785\uc7a5\uc5d0\uc11c \ube4c\ub4dc\ud558\uae30 \uc218\uc6d4\ud55c <code>helloworld-minimal-sample<\/code> \ub97c \ucc38\uace0\ud588\ub2e4.<\/p>\n<h2>SQL Styler \uac1c\ubc1c<\/h2>\n<p>\uc704 \ub450 \uc0d8\ud50c \ucf54\ub4dc\ub97c \ucc38\uace0\ud574\uc11c \uc774\uc81c \ud14d\uc2a4\ud2b8\ub97c \ubc14\uafd4\uc8fc\ub294 \uae30\ub2a5\ub9cc javascript \ub85c \uad6c\ud604\ud558\uba74 \ub418\ub294\ub370 \uad04\ud638\uac80\uc0ac \uc54c\uace0\ub9ac\uc998\uc744 \uae30\ubc18\uc73c\ub85c, \uc785\ub825\ub41c sql text \ub97c keyword \ub4e4\ub85c \ubd84\ud560\ud55c \ub4a4\uc5d0 \ud558\ub098\uc529 \uaebc\ub0b4\uba74\uc11c \uc815\ub3c8\ud574\ub098\uac00\ub294 \ud615\ud0dc\ub85c \uad6c\ud604\ud588\ub2e4.<\/p>\n<p>\uc2a4\ud0c0\uc77c\uc758 \uae30\ubcf8\uc801\uc778 \uc6d0\uce59\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ol>\n<li>keyword \uc624\ub978\ucabd \uc815\ub82c<\/li>\n<li>comma\ub294 identifier \uc55e\uc5d0<\/li>\n<li>\uc11c\ube0c\ucffc\ub9ac\ub294 \uac1c\ud589\ud558\uc9c0\uc54a\uace0 \uad04\ud638\uac00 \uc2dc\uc791\ub41c column \uc704\uce58\uc5d0\uc11c\ubd80\ud130 \uc815\ub82c<\/li>\n<li>SELECT, WHERE, CASE WHEN \uc758 \uccab\ubc88\uc9f8 expression \uc740 \uac1c\ud589\ud558\uc9c0 \uc54a\uc74c<\/li>\n<\/ol>\n<h3>Sample Style<\/h3>\n<p>\ub0b4\uac00 \uc120\ud638\ud558\ub294 SQL \uc2a4\ud0c0\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\ub97c \uac16\uace0\uc788\ub294\ub370, \uc774\ub807\uac8c \ubc30\uc6b0\uae30\ub3c4 \ud588\uace0 \ub098\ud55c\ud14c \uc798 \ub9de\ub294\ub4ef.<\/p>\n<pre><code class=\"language-sql\">select a.a \/* double-dashed comments will be replaced like C-style comments. *\/\n     , max(a.b) as max_b \/* * * multi * line * comments * will be compressed into single-line. *\/\n     , max(a.c) as max_c\n     , sum(b.cnt) as sum_cnt\n     , nvl(cast(max(case when a.cnt &gt; 0 and b.max_v &gt; 0 then &#039;A&#039;\n                         when a.cnt &gt; 0 and b.max_v &lt; 0 then &#039;B&#039;\n                         when a.cnt &lt; 0 and b.max_v &gt; 0 then &#039;C&#039;\n                         when a.cnt &lt; 0 and b.max_v &lt; 0 then &#039;D&#039;\n                                                        else (select a.k_1\n                                                                   , case when a.k_1 is null then &#039;A&#039;\n                                                                          when a.k_1 &gt; &#039;V&#039; then &#039;A&#039;\n                                                                                           else &#039;B&#039;\n                                                                     end as v\n                                                                from (select a.k_1\n                                                                           , a.k_2\n                                                                           , max(a.col) as max_col\n                                                                        from tab_d a inner join\n                                                                             tab_f b on (a.k_1 = b.k_1\n                                                                                     and a.k_2 = b.k_2\n                                                                                     and a.k_3 = b.k_3\n                                                                                     and a.k_4 = b.k_4)\n                                                                       group by a.k_1, a.k_2\n                                                                     ) a\n                                                               where a.max_col &gt; 120\n                                                             )\n                    end) as STRING) ,&#039;&#039;) as some_case\n  from (select a.k \/* SELECT , FROM , WHERE , ... , JOIN: Reserved words in comments are treated as comments. *\/\n             , b.v\n             , c.max_v\n             , c.avg_v\n             , c.min_v\n             , c.cnt\n          from tab_a a inner join\n               tab_b b on (a.k = b.k\n                       and b.d = &#039;dd&#039;) left outer join\n               (select a.k\n                     , max(b.v) as max_v\n                     , avg(c.v) as avg_v\n                     , min(d.v) as min_v\n                     , count(e.v) as cnt\n                  from tab_e a inner join\n                       tab_f b on a.k = b.k left outer join\n                       tab_g c on a.k = c.k left outer join\n                       tab_h d on a.k = d.k left outer join\n                       tab_i e on a.k = e.k\n                 group by a\n               ) c on (a.c = c.a)\n         where a.col_1 &gt;= &#039;filter&#039; \/* comment *\/\n           and b.col_2 between &#039;fil&#039;\n                           and &#039;ter&#039;\n       ) a left outer join\n       (select a.k\n             , max(v) as max_v\n          from tab_c a\n         where a.d &gt;= &#039;filter&#039;\n         group by a.k\n        having count(1) &gt; 0\n       ) b on (a.k = b.k)\n order by 1, 2\n;<\/code><\/pre>\n<h3>sqlstyle.guide<\/h3>\n<p><a href=\"https:\/\/www.sqlstyle.guide\/\">https:\/\/www.sqlstyle.guide\/<\/a><\/p>\n<p>\ucd94\ud6c4\uc5d0\ub294 \uc704 \uac00\uc774\ub4dc\ub97c \uae30\ubcf8\uc73c\ub85c \ud558\uace0 \uba87\uac00\uc9c0 \ub2e4\ub978 \uc810\ub4e4\uc740 \uc635\uc158\uc73c\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\uc73c\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4.<\/p>\n<h2>\ube4c\ub4dc \ubc0f \ubc30\ud3ec<\/h2>\n<p><code>vsce<\/code> \ub77c\ub294 npm \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud574\uc11c \ube4c\ub4dc\ud560 \uc218 \uc788\uace0, \ub85c\uceec\uc5d0\uc11c ms marketplace \uc5d0 \ubc14\ub85c \ubc30\ud3ec\ud560 \uc218\ub3c4 \uc788\ub2e4. access \ud1a0\ud070\uc744 \ubc1c\uae09 \ubc1b\uc544\uc11c \ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \uc870\uae08 \ubc84\ubc85\uc774\uae34 \ud588\uc9c0\ub9cc \uac04\ub2e8\ud788 \uc124\uc815\ud560 \uc218 \uc788\uace0 \ub2e4\uc74c \ub9c1\ud06c\uc5d0 \uc790\uc138\ud788 \ub098\uc640\uc788\ub2e4.<\/p>\n<p><a href=\"https:\/\/code.visualstudio.com\/api\/working-with-extensions\/publishing-extension\">https:\/\/code.visualstudio.com\/api\/working-with-extensions\/publishing-extension<\/a><\/p>\n<p>\ubcc4\uac70 \uc544\ub2cc \uc720\ud2f8\uc774\uc9c0\ub9cc ms marketplace \uc5d0 \ub0b4 \uc774\ub984\uc73c\ub85c \uc62c\ub77c\uac00 \uc788\ub294\uac78 \ubcf4\ub2c8 \uc2e0\uae30\ud558\ub2e4. \uc0d8\ud50c \ucc38\uace0\ud574\uc11c DB \uba54\ud0c0\uc815\ubcf4\ub4e4 \uc870\ud68c\ud574\uc624\ub294 \ud50c\ub7ec\uadf8\uc778\ub3c4 \ub9cc\ub4e4\uc5b4\ubcf4\uba74 \uc7ac\ubbf8\uc788\uc744 \uac83 \uac19\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2021\/06\/image-1624796871137.png\" alt=\"file\" \/><\/p>\n<h2>SQL Styler<\/h2>\n<ul>\n<li>vscode marketplace\n<ul>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=oboki.sql-styler\">https:\/\/marketplace.visualstudio.com\/items?itemName=oboki.sql-styler<\/a><\/li>\n<\/ul>\n<\/li>\n<li>github repository\n<ul>\n<li><a href=\"https:\/\/github.com\/oboki\/sql-styler\">https:\/\/github.com\/oboki\/sql-styler<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2021\/06\/image-1624796941064.png\" alt=\"file\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ub300\ubd80\ubd84\uc758 IDE \uc5d0\uc11c\ub294 \uc5b8\uc5b4\ubcc4\ub85c \ud3ec\ub9f7\ud305 \ud504\ub85c\ud30c\uc77c\uc744 \uc124\uc815\ud574\uc11c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ud655\uc7a5\ub4e4\uc774 \uc788\ub294\ub370 Code \uc5d0\uc11c SQL \uc6a9\uc73c\ub85c \uc4f8\ub9cc\ud55c \ud3ec\ub9f7\ud130\ub294 \uc5c6\ub294 \uac83 \uac19\ub2e4. \uadf8\ub098\ub9c8 \uc788\ub294\uac8c Poor Man&#039;s T-SQL \uc2a4\ud0c0\uc77c\uc5d0\uc11c keyword uppercase \uc635\uc158\uc774\ub098 comma \uc704\uce58 \uc815\ub3c4 \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uae30\ub2a5 \uc815\ub3c4 \ubfd0\uc778\ub4ef. \ub0b4\uac00 \ud558\ub294 \uc5c5\ubb34\uc5d0\uc11c\ub294 1~200 \uc904\uc740 \uac00\ubccd\uac8c \ub118\uc5b4\uac00\ub294 SQL \ucf54\ub4dc\ub97c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\ub0b4\ub294\ub370, \ud0a4\uc6cc\ub4dc \ub9c8\ub2e4 \uac1c\ud589\uc744 \ud558\uace0 \uc11c\ube0c\ucffc\ub9ac [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[204],"tags":[206,207,116,205],"class_list":["post-1648","post","type-post","status-publish","format-standard","hentry","category-vscode","tag-extension","tag-formatter","tag-sql","tag-vscode"],"_links":{"self":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1648","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/comments?post=1648"}],"version-history":[{"count":1,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1648\/revisions"}],"predecessor-version":[{"id":1651,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1648\/revisions\/1651"}],"wp:attachment":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/media?parent=1648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/categories?post=1648"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/tags?post=1648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}