<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>삽질은 내 운명</title>
    <link>https://x509.tistory.com/</link>
    <description>개발 관련 자료</description>
    <language>ko</language>
    <pubDate>Fri, 10 Jul 2026 02:42:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>달빛에취하다</managingEditor>
    <image>
      <title>삽질은 내 운명</title>
      <url>https://tistory1.daumcdn.net/tistory/954149/attach/5ea4ef161fa1409390e9e2c96d196e6b</url>
      <link>https://x509.tistory.com</link>
    </image>
    <item>
      <title>PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트</title>
      <link>https://x509.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 작성일 : 2026-06-23&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hypoPG : 1.4.3&lt;/li&gt;
&lt;li&gt;PostgreSQL : 17버전 이상 ( Test 진행 17 ~ 19 beta 1,&amp;nbsp; 17 미만 버전은 테스트 되지 않음.)&lt;/li&gt;
&lt;li&gt;build&amp;nbsp;OS : Windows 11 Pro (25H2)&lt;/li&gt;
&lt;li&gt;빌드 환경 설정 : build_env.bat&lt;/li&gt;
&lt;li&gt;빌드 : build.bat, Makefile.win&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/boRdNP/dJMcaasfrA5/BqqO2uVLukpmn22DiXkKzK/hypoPG.1.4.3.build.script.7z?attach=1&amp;amp;knm=tfile.7z&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;hypoPG.1.4.3.build.script.7z&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/OeVsy/dJMcaiDM5xi/U6epX83Sn5RfyTsA4KtRdk/pgSQL18.hypopg.1.4.3.binary.7z?attach=1&amp;amp;knm=tfile.7z&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;pgSQL18.hypopg.1.4.3.binary.7z&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.06MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ccgR8H/dJMcajo3BdZ/SJUQppYxb8gZKVoUAy6XN1/pgSQL17.hypopg.1.4.3.binary.7z?attach=1&amp;amp;knm=tfile.7z&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;pgSQL17.hypopg.1.4.3.binary.7z&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.06MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bWFV0s/dJMcaf1jWK6/bKFt8TMKxqCumLrE3TGLOk/pgSQL19-beta1.hypopg.1.4.3.binary.7z?attach=1&amp;amp;knm=tfile.7z&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;pgSQL19-beta1.hypopg.1.4.3.binary.7z&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.06MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Database</category>
      <category>Extensions</category>
      <category>hypopg</category>
      <category>pgsql</category>
      <category>PostgreSQL</category>
      <category>PostgreSQL hypoPG Windows Extensions</category>
      <category>가상인덱스</category>
      <category>코끼리</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/78</guid>
      <comments>https://x509.tistory.com/78#entry78comment</comments>
      <pubDate>Tue, 23 Jun 2026 12:17:31 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] Windows 용 pgSQL17 / pgSQL18 버전의 Hypopg 확장의 바이너리( .dll ) 파일 입니다.</title>
      <link>https://x509.tistory.com/77</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;수정일 : 2026-06-23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 내용으로 변경되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Makefile.win 에서 CFLAGS 에 컴파일러 관련 옵션 추가 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* pgSQL 19 beta 1 에 대한 확장도 컴파일 되었습니다. ( 바이너리 파일들 포함됨 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 빌드환경 설정 및 빌드는 자동화 스크립트로 대체 되었습니다. 이 포스트의 본문은 보관 용도 입니다. 이후 본문은 업데이트되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://x509.tistory.com/78&quot;&gt;PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트 &amp;mdash; 삽질은 내 운명&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782184763571&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트&quot; data-og-description=&quot;※ 작성일 : 2026-06-23hypoPG : 1.4.3PostgreSQL : 17버전 이상 ( Test 진행 17 ~ 19 beta 1, 17 미만 버전은 테스트 되지 않음.)build OS : Windows 11 Pro (25H2)빌드 환경 설정 : build_env.bat빌드 : build.bat, Makefile.win&quot; data-og-host=&quot;dev.d-0-b.kr&quot; data-og-source-url=&quot;https://x509.tistory.com/78&quot; data-og-url=&quot;https://dev.d-0-b.kr/78&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fxdvK/dJMb9bwbXmG/0yWxUN6dGTaGVqTgp6SKCk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cq3DDT/dJMb9jgG4W9/FOvLliMa2mxRn10lpBVl1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://x509.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://x509.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fxdvK/dJMb9bwbXmG/0yWxUN6dGTaGVqTgp6SKCk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cq3DDT/dJMb9jgG4W9/FOvLliMa2mxRn10lpBVl1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※ 작성일 : 2026-06-23hypoPG : 1.4.3PostgreSQL : 17버전 이상 ( Test 진행 17 ~ 19 beta 1, 17 미만 버전은 테스트 되지 않음.)build OS : Windows 11 Pro (25H2)빌드 환경 설정 : build_env.bat빌드 : build.bat, Makefile.win&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.d-0-b.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성일 : 2026-06-04 10:00&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pgSQL17 / pgSQL18 버전에 대한 컴파일은 아래 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://x509.tistory.com/76&quot;&gt;Windows 용 PostgreSQL 17 에 hypopg 확장 컴파일 및 설치 하기 &amp;mdash; 삽질은 내 운명&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780534988254&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Windows 용 PostgreSQL 17 에 hypopg 확장 컴파일 및 설치 하기&quot; data-og-description=&quot;작성일 - 2026-06-02 16:40Windows 용 PostgreSQL 17( pgSQL 17) 에 hypopg 확장을 컴파일 해서 설치하는 내용입니다. 공식지원이나 AI 쪽에서 레퍼런스가 없습니다. 그래서 아래 환경이나 프로그램은 되도록이면&quot; data-og-host=&quot;dev.d-0-b.kr&quot; data-og-source-url=&quot;https://x509.tistory.com/76&quot; data-og-url=&quot;https://dev.d-0-b.kr/76&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnHhJr/dJMb83kAo4V/VcxEzuSZbDdXB2VkQUd2oK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bUMlmE/dJMb9gxsOHs/TmUICCSKucTCkisbDXg83k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bmjuzC/dJMb83kAo4U/w3hhaSli1uGrLzXsnmDNfk/img.png?width=1349&amp;amp;height=637&amp;amp;face=0_0_1349_637&quot;&gt;&lt;a href=&quot;https://x509.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://x509.tistory.com/76&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnHhJr/dJMb83kAo4V/VcxEzuSZbDdXB2VkQUd2oK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bUMlmE/dJMb9gxsOHs/TmUICCSKucTCkisbDXg83k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bmjuzC/dJMb83kAo4U/w3hhaSli1uGrLzXsnmDNfk/img.png?width=1349&amp;amp;height=637&amp;amp;face=0_0_1349_637');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Windows 용 PostgreSQL 17 에 hypopg 확장 컴파일 및 설치 하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;작성일 - 2026-06-02 16:40Windows 용 PostgreSQL 17( pgSQL 17) 에 hypopg 확장을 컴파일 해서 설치하는 내용입니다. 공식지원이나 AI 쪽에서 레퍼런스가 없습니다. 그래서 아래 환경이나 프로그램은 되도록이면&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.d-0-b.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 참고해서 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 환경에 맞춰서 경로만 변경하면 기존 Makefile.win 으로 버전별&amp;nbsp;컴파일에 문제가 없습니다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일된 DLL에 대해서 믿음을 주지 못할거 같아 올리지 않았었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 필요한 분들이 계실까봐 pgSQL17 버전과 pgSQL18 버전의 hypopg extension 의 바이너리 파일을 첨부합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 이게 원래 이렇게 버전별로 따로 관리해야 하나요?? 아시는분? )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* PostgreSQL&amp;nbsp;17.7&amp;nbsp;on&amp;nbsp;x86_64-windows,&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;msvc-19.44.35221,&amp;nbsp;64-bit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* PostgreSQL&amp;nbsp;18.4&amp;nbsp;on&amp;nbsp;x86_64-windows,&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;msvc-19.44.35226,&amp;nbsp;64-bit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bxtTiJ/dJMcafz4X3w/F1oXbQFrXtNa7OCppfRNvk/hypopg_17_%28Create-2026_06_02%29.7z?attach=1&amp;amp;knm=tfile.7z&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;hypopg_17_(Create-2026_06_02).7z&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.08MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/L0eXu/dJMcacwAGu0/YX848R95iayGqbsYXDQL60/hypopg_18_%28Create-2026_06_04%29.7z?attach=1&amp;amp;knm=tfile.7z&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;hypopg_18_(Create-2026_06_04).7z&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.08MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 pgSQL18 과 hypopg&amp;nbsp; 컴파일 및 설치 후 테스트 한 내용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 17은 개발 DB 가 있는 곳에서 VS Build Tools 사용하고, 18은 개발 PC 에서 VS 2026 에서 컴파일 되었습니다. )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IbgtJ/dJMcacJ9zU4/HFYWPkvp7YczkZT8qFzKqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IbgtJ/dJMcacJ9zU4/HFYWPkvp7YczkZT8qFzKqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IbgtJ/dJMcacJ9zU4/HFYWPkvp7YczkZT8qFzKqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIbgtJ%2FdJMcacJ9zU4%2FHFYWPkvp7YczkZT8qFzKqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1056&quot; height=&quot;1234&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1803&quot; data-origin-height=&quot;1097&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDvnaZ/dJMcadPIJeX/2VKS63VNkDVUsQb1OkqhSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDvnaZ/dJMcadPIJeX/2VKS63VNkDVUsQb1OkqhSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDvnaZ/dJMcadPIJeX/2VKS63VNkDVUsQb1OkqhSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDvnaZ%2FdJMcadPIJeX%2F2VKS63VNkDVUsQb1OkqhSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1803&quot; height=&quot;1097&quot; data-origin-width=&quot;1803&quot; data-origin-height=&quot;1097&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Database</category>
      <category>extension</category>
      <category>hypopg</category>
      <category>MSVC</category>
      <category>pgsql</category>
      <category>PostgreSQL</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/77</guid>
      <comments>https://x509.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 4 Jun 2026 10:17:40 +0900</pubDate>
    </item>
    <item>
      <title>Windows 용 PostgreSQL 17 에 hypopg 확장 컴파일 및 설치 하기</title>
      <link>https://x509.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;수정일 : 2026-06-23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 내용으로 변경되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Makefile.win 에서 CFLAGS 에 컴파일러 관련 옵션 추가 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 빌드환경 설정 및 빌드는 자동화 스크립트로 대체 되었습니다. 이 포스트의 본문은 보관 용도 입니다. 이후 본문은 업데이트되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://x509.tistory.com/78&quot;&gt;PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트 &amp;mdash; 삽질은 내 운명&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782184791499&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트&quot; data-og-description=&quot;※ 작성일 : 2026-06-23hypoPG : 1.4.3PostgreSQL : 17버전 이상 ( Test 진행 17 ~ 19 beta 1, 17 미만 버전은 테스트 되지 않음.)build OS : Windows 11 Pro (25H2)빌드 환경 설정 : build_env.bat빌드 : build.bat, Makefile.win&quot; data-og-host=&quot;dev.d-0-b.kr&quot; data-og-source-url=&quot;https://x509.tistory.com/78&quot; data-og-url=&quot;https://dev.d-0-b.kr/78&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fxdvK/dJMb9bwbXmG/0yWxUN6dGTaGVqTgp6SKCk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cq3DDT/dJMb9jgG4W9/FOvLliMa2mxRn10lpBVl1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://x509.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://x509.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fxdvK/dJMb9bwbXmG/0yWxUN6dGTaGVqTgp6SKCk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cq3DDT/dJMb9jgG4W9/FOvLliMa2mxRn10lpBVl1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;PostgreSQL의 hypoPG 확장을 Windows 컴파일 하기 및 바이너리 파일 - 자동 스크립트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※ 작성일 : 2026-06-23hypoPG : 1.4.3PostgreSQL : 17버전 이상 ( Test 진행 17 ~ 19 beta 1, 17 미만 버전은 테스트 되지 않음.)build OS : Windows 11 Pro (25H2)빌드 환경 설정 : build_env.bat빌드 : build.bat, Makefile.win&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.d-0-b.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성일 - 2026-06-02 16:40&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 용 PostgreSQL 17( pgSQL 17) 에 hypopg 확장을 컴파일 해서 설치하는 내용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식지원이나 AI 쪽에서 레퍼런스가 없습니다.&amp;nbsp;그래서 아래 환경이나 프로그램은 되도록이면 맞춰서 진행해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;능력자 분들께서는 각 개인 환경에 맞춰서 진행해 주시면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 내용이 있으면 댓글도 부탁드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Visual Studio Build Tool ( 2026 ) - 설치&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1. 워크로드&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C++를 사용한 데스크톱 개발&lt;/li&gt;
&lt;li&gt;MSVC v143 - VS 2022 C++ x64/x86 빌드 도구 (v14.44) &amp;lt;&amp;larr; 14.44 가 꼭 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RXvXr/dJMcaccfJ0x/jRL4890cCsJKRUXU1QNfhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RXvXr/dJMcaccfJ0x/jRL4890cCsJKRUXU1QNfhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RXvXr/dJMcaccfJ0x/jRL4890cCsJKRUXU1QNfhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRXvXr%2FdJMcaccfJ0x%2FjRL4890cCsJKRUXU1QNfhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;636&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2. 개별 구성 요소&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows 유니버셜 C 런타임&lt;/li&gt;
&lt;li&gt;Windows 유니버셜 CRT SDK&lt;/li&gt;
&lt;li&gt;Windows 11 SDK (10.0.22621.0) &amp;rarr; 되도록이면 preview 버전 말고 공식 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEudT/dJMcabxCRvb/Z04faaKQx8Sz8DaMxlHFBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEudT/dJMcabxCRvb/Z04faaKQx8Sz8DaMxlHFBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEudT/dJMcabxCRvb/Z04faaKQx8Sz8DaMxlHFBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEudT%2FdJMcabxCRvb%2FZ04faaKQx8Sz8DaMxlHFBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1349&quot; height=&quot;637&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;637&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Developer Command Prompt for VS&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1. 관리자 권한으로 실행&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QgZdH/dJMcahYU6fH/Ac2jjz6QLFfFpafp5R3alK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QgZdH/dJMcahYU6fH/Ac2jjz6QLFfFpafp5R3alK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QgZdH/dJMcahYU6fH/Ac2jjz6QLFfFpafp5R3alK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQgZdH%2FdJMcahYU6fH%2FAc2jjz6QLFfFpafp5R3alK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;688&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2. MSVC 14.44 환경 로드&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;call &quot;C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat&quot; -vcvars_ver=14.44&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RZckZ/dJMcad3fzyd/dajXMLdFumLONWvk3jKLKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RZckZ/dJMcad3fzyd/dajXMLdFumLONWvk3jKLKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RZckZ/dJMcad3fzyd/dajXMLdFumLONWvk3jKLKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRZckZ%2FdJMcad3fzyd%2FdajXMLdFumLONWvk3jKLKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;981&quot; height=&quot;514&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. hypopg 확장&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1. git clone 및 폴더 복제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git 이 미리 설치 되어 있어야 함&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780386155423&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Windows\System32&amp;gt;d:

D:\&amp;gt;git clone https://github.com/HypoPG/hypopg.git
Cloning into 'hypopg'...
remote: Enumerating objects: 2112, done.
remote: Counting objects: 100% (462/462), done.
remote: Compressing objects: 100% (127/127), done.
remote: Total 2112 (delta 375), reused 340 (delta 334), pack-reused 1650 (from 1)
Receiving objects: 100% (2112/2112), 733.26 KiB | 5.27 MiB/s, done.
Resolving deltas: 100% (1413/1413), done.

D:\&amp;gt;cd hypopg

D:\hypopg&amp;gt;xcopy .\include .\import\include /E /I /H /Y
.\include\hypopg.h
.\include\hypopg_import.h
.\include\hypopg_import_index.h
.\include\hypopg_index.h
4개 파일이 복사되었습니다.

D:\hypopg&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2. &lt;a href=&quot;http://Makefile.win&quot;&gt;Makefile.win&lt;/a&gt; 파일 작성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;되도록이면 VS CODE 같은 것으로 작성&lt;/li&gt;
&lt;li&gt;Windows SDK 버전이 다른 경우 경로를 찾아서 변경&lt;/li&gt;
&lt;li&gt;MSVC의 14.44 의 세부 버전이 다른 경로 해당 경로로 변경 필요&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://Makefile.win&quot;&gt;Makefile.win&lt;/a&gt; 파일 내용&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/beXjPT/dJMcajoPfRL/g6cJkfL4iGyGg3fflPiZOk/Makefile.win?attach=1&amp;amp;knm=tfile.win&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Makefile.win&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1780386198220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PGROOT = C:/Program Files/PostgreSQL/17

CC = cl
LINK = link

INCLUDE = \
 /I&quot;$(PGROOT)/include/server&quot; \
 /I&quot;$(PGROOT)/include/internal&quot; \
 /I&quot;$(PGROOT)/include&quot; \
 /I&quot;$(PGROOT)/include/server/port/win32_msvc&quot; \
 /I&quot;C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.44.35207/include&quot; \
 /I&quot;C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt&quot; \
 /I&quot;C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um&quot; \
 /I&quot;C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared&quot; \
 /I&quot;C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt&quot; \
 /I&quot;$(PGROOT)/include/server/port/win32&quot;

CFLAGS = /nologo /O2 /DWIN32 /D_WINDOWS $(INCLUDE)

OBJS = \
 hypopg.obj \
 hypopg_index.obj \
 import/hypopg_import.obj \
 import/hypopg_import_index.obj

all: hypopg.dll

hypopg.dll: $(OBJS)
	$(LINK) /DLL /OUT:hypopg.dll $(OBJS) \
	&quot;$(PGROOT)/lib/postgres.lib&quot; \
	/INCREMENTAL:NO

hypopg.obj: hypopg.c
	$(CC) $(CFLAGS) /c hypopg.c /Fo$@

hypopg_index.obj: hypopg_index.c
	$(CC) $(CFLAGS) /c hypopg_index.c /Fo$@

import/hypopg_import.obj: import/hypopg_import.c
	$(CC) $(CFLAGS) /c import/hypopg_import.c /Fo$@

import/hypopg_import_index.obj: import/hypopg_import_index.c
	$(CC) $(CFLAGS) /c import/hypopg_import_index.c /Fo$@

clean:
	cmd.exe /C &quot;del /Q *.obj 2&amp;gt;NUL&quot;
	cmd.exe /C &quot;del /Q import\\*.obj 2&amp;gt;NUL&quot;
	cmd.exe /C &quot;del /Q hypopg.dll 2&amp;gt;NUL&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3. 컴파일&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 이건 생성된 파일 초기화 - 오류 등으로 중단 경우
nmake /F Makefile.win clean

# Makefile.win 으로 컴파일
nmake /F Makefile.win&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvFRjc/dJMcaar0cU8/2TM4fZkxDwRzMPpNyZ89Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvFRjc/dJMcaar0cU8/2TM4fZkxDwRzMPpNyZ89Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvFRjc/dJMcaar0cU8/2TM4fZkxDwRzMPpNyZ89Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvFRjc%2FdJMcaar0cU8%2F2TM4fZkxDwRzMPpNyZ89Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1085&quot; height=&quot;810&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctOh1o/dJMcadIUxpD/N2Evu7B2pFf9zCObne3000/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctOh1o/dJMcadIUxpD/N2Evu7B2pFf9zCObne3000/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctOh1o/dJMcadIUxpD/N2Evu7B2pFf9zCObne3000/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctOh1o%2FdJMcadIUxpD%2FN2Evu7B2pFf9zCObne3000%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;821&quot; height=&quot;646&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.4. 파일 복사&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;D:\hypopg&amp;gt;copy hypopg.dll &quot;C:\Program Files\PostgreSQL\17\lib\&quot;
        1개 파일이 복사되었습니다.

D:\hypopg&amp;gt;copy hypopg.control &quot;C:\Program Files\PostgreSQL\17\share\extension\&quot;
        1개 파일이 복사되었습니다.

D:\hypopg&amp;gt;copy hypopg--*.sql &quot;C:\Program Files\PostgreSQL\17\share\extension\&quot;
hypopg--1.3.1--1.4.0.sql
hypopg--1.3.1.sql
hypopg--1.4.0--1.4.1.sql
hypopg--1.4.0.sql
hypopg--1.4.1--1.4.2.sql
hypopg--1.4.1.sql
hypopg--1.4.2.sql
        7개 파일이 복사되었습니다.

D:\hypopg&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 가상 인덱스 테스트&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1. 확장 프로그램 생성? 활성화?&lt;/h4&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE EXTENSION IF NOT EXISTS hypopg;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2. 테스트 테이블 생성 및 데이터 생성&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 1. 테스트 테이블 생성 및 데이터 생성
CREATE TABLE hypo_test (id serial PRIMARY KEY, val integer, name text);
INSERT INTO hypo_test (val, name)
SELECT (random()*100000)::int, 'name_' || g
FROM generate_series(1, 100000) g;
ANALYZE hypo_test;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.3. 인덱스 없는 상태의 플랜 확인 (Seq Scan 확인)&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 2. 인덱스 없는 상태의 플랜 (Seq Scan 나올 것)
EXPLAIN SELECT * FROM hypo_test WHERE val = 5000;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3Vv0k/dJMcag6MO9K/RyHLFMZKppTYvorTRV3LV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3Vv0k/dJMcag6MO9K/RyHLFMZKppTYvorTRV3LV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3Vv0k/dJMcag6MO9K/RyHLFMZKppTYvorTRV3LV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3Vv0k%2FdJMcag6MO9K%2FRyHLFMZKppTYvorTRV3LV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;245&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.4. 가상 인덱스 생성 (실제 디스크에는 안 만들어짐)&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 3. 가상 인덱스 생성 (실제 디스크에는 안 만들어짐)
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo_test (val)');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/da89OK/dJMcabLfFAz/ReemYokx0MOwTit0dSFdVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/da89OK/dJMcabLfFAz/ReemYokx0MOwTit0dSFdVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/da89OK/dJMcabLfFAz/ReemYokx0MOwTit0dSFdVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fda89OK%2FdJMcabLfFAz%2FReemYokx0MOwTit0dSFdVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;209&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.5. 4.3. 와 같은 쿼리의 EXPLAIN 다시 확인 (Index Scan으로 바뀌면 성공)&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 3. 가상 인덱스 생성 (실제 디스크에는 안 만들어짐)
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo_test (val)');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGc2K/dJMcaiKghNf/D73QkDi6hUW14zXWfNSnCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGc2K/dJMcaiKghNf/D73QkDi6hUW14zXWfNSnCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGc2K/dJMcaiKghNf/D73QkDi6hUW14zXWfNSnCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGc2K%2FdJMcaiKghNf%2FD73QkDi6hUW14zXWfNSnCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;254&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.6. 인덱스 예상 크기 확인 - (byte)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4.4. 에서 확인되는 indexid 를 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;--예상 크기 확인  (4.3. 에서 확인되는 indexid 를 사용함 )
SELECT hypopg_relation_size(14942);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYtpVu/dJMcab5ucB7/WMbleY4SJuoZe1YV1tKkFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYtpVu/dJMcab5ucB7/WMbleY4SJuoZe1YV1tKkFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYtpVu/dJMcab5ucB7/WMbleY4SJuoZe1YV1tKkFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYtpVu%2FdJMcab5ucB7%2FWMbleY4SJuoZe1YV1tKkFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;206&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.7. 인덱스 삭제&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 전체 삭제
SELECT hypopg_reset();

-- 특정 인덱스 삭제
SELECT hypopg_drop_index(14942);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.8. 전체 가상 인덱스 정보&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 전체 가상 인덱스 목록
SELECT * FROM hypopg_list_indexes;

-- 좀더 세부 정보
SELECT * FROM hypopg();
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database</category>
      <category>hypopg</category>
      <category>pgSQL 17</category>
      <category>PostgreSQL 17 Windows</category>
      <category>windows pgsql</category>
      <category>가상 인덱스</category>
      <category>확장</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/76</guid>
      <comments>https://x509.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 2 Jun 2026 16:48:41 +0900</pubDate>
    </item>
    <item>
      <title>ARM Windows 에서 FortiClient VPN 사용을 위한 설치 프로그램</title>
      <link>https://x509.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2026-05-06 현재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARM 용 Windows 에서 FortiClient VPN 사용시 필요한 설치 파일 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(회사 NAS에 올려 두었는데 회사 분들도 검색해서 설치 하시나 보더군요. 그래서 일단 블로그에 올렸는데 검색이 되려나 모르겠습니다. :) )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 홈페이지에서 다운로드 하는 경로가 찾기가 힘들거나 최신 버전은 설치가 안되거나&amp;nbsp; VPN 설정이 안되거나 하는 문제가 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 파일을 받아서 설치 후에 꼭 재부팅을 해야 합니다. ( VPN 설정이 안됩니다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1HsWIGoP0v2x3H_PbYkExtebkUogHBDBM/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://drive.google.com/file/d/1HsWIGoP0v2x3H_PbYkExtebkUogHBDBM/view?usp=sharing&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778036085937&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;FortiClientVPNSetup_7.4.3.1790_ARM64.exe.zip&quot; data-og-description=&quot;&quot; data-og-host=&quot;drive.google.com&quot; data-og-source-url=&quot;https://drive.google.com/file/d/1HsWIGoP0v2x3H_PbYkExtebkUogHBDBM/view?usp=sharing&quot; data-og-url=&quot;https://drive.google.com/file/d/1HsWIGoP0v2x3H_PbYkExtebkUogHBDBM/view?usp=sharing&amp;amp;usp=embed_facebook&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1HsWIGoP0v2x3H_PbYkExtebkUogHBDBM/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://drive.google.com/file/d/1HsWIGoP0v2x3H_PbYkExtebkUogHBDBM/view?usp=sharing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;FortiClientVPNSetup_7.4.3.1790_ARM64.exe.zip&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;drive.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Etc/Utility</category>
      <category>ARM</category>
      <category>ARM Windows</category>
      <category>forticlient vpn</category>
      <category>VPN</category>
      <category>Windows</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/75</guid>
      <comments>https://x509.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 6 May 2026 11:57:54 +0900</pubDate>
    </item>
    <item>
      <title>[2025-09-08] 특정 사이트 화면이 이상 할때 (feat. Naver, Microsoft Edge) - 추적 방지</title>
      <link>https://x509.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;naver는&amp;nbsp; 2025/09/10 현재 접속 가능하도록 변경됨.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금일 ( 2025-09-08 ) 갑자기 네이버 메일이 이상함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VzpA3/btsQm2HnQxo/RCaLpvJpvOpElkWAbiRvL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VzpA3/btsQm2HnQxo/RCaLpvJpvOpElkWAbiRvL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VzpA3/btsQm2HnQxo/RCaLpvJpvOpElkWAbiRvL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVzpA3%2FbtsQm2HnQxo%2FRCaLpvJpvOpElkWAbiRvL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;292&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인화면도 이상함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MiVrI/btsQmEtfvnT/FYLTg431yjgTWmMtFookXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MiVrI/btsQmEtfvnT/FYLTg431yjgTWmMtFookXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MiVrI/btsQmEtfvnT/FYLTg431yjgTWmMtFookXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMiVrI%2FbtsQmEtfvnT%2FFYLTg431yjgTWmMtFookXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1184&quot; height=&quot;380&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇일 사이에 Naver에 무슨 일이 있었는지 Microsoft Edge 에서 추적 방지를 엄격으로 두면 화면이 이상해짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IhHtu/btsQqqGrgmd/bqvUC8y3lxlnemHaQolkm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IhHtu/btsQqqGrgmd/bqvUC8y3lxlnemHaQolkm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IhHtu/btsQqqGrgmd/bqvUC8y3lxlnemHaQolkm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIhHtu%2FbtsQqqGrgmd%2FbqvUC8y3lxlnemHaQolkm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1323&quot; height=&quot;854&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pstatic.net 관련 내용이&amp;nbsp; 블록&lt;/b&gt; 되는듯.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3kGzp/btsQoJGOaOe/CGRw9DNiuPOaynSLBgyT1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3kGzp/btsQoJGOaOe/CGRw9DNiuPOaynSLBgyT1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3kGzp/btsQoJGOaOe/CGRw9DNiuPOaynSLBgyT1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3kGzp%2FbtsQoJGOaOe%2FCGRw9DNiuPOaynSLBgyT1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1033&quot; height=&quot;546&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 자주 사용하지 않는데 필요할때만 균형으로 써야 할듯.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>edge</category>
      <category>microsoftedge</category>
      <category>naver</category>
      <category>pm.pstatic.net</category>
      <category>네이뇬</category>
      <category>추적방지</category>
      <category>추적방지 엄격</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/74</guid>
      <comments>https://x509.tistory.com/74#entry74comment</comments>
      <pubDate>Mon, 8 Sep 2025 10:49:33 +0900</pubDate>
    </item>
    <item>
      <title>리눅스의 폴더를 SSH로 Windows 에서 마운트 할때 SSH KEY를 사용하는 경우 처리 방법 ( WSL 필요 )</title>
      <link>https://x509.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관리자 권한으로 Powershell 실행하시길 바랍니다.&lt;/b&gt;&lt;/p&gt;
&lt;h1&gt;SSHFS로 마운트 (WSL 사용)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows의 net use가 SSH 키를 직접 지원하지 않으므로 WSL을 사용하여 SSHFS로 마운트하는 것이 더 확실한 방법입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. WSL(Windows Subsystem for Linux) 설치&lt;/h2&gt;
&lt;pre class=&quot;leaf&quot;&gt;&lt;code&gt;wsl --install -d Ubuntu
#(이미 설치되어 있다면 생략)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미 설치 되어 있다면 로그인 된 화면이 보입니다.&lt;/li&gt;
&lt;li&gt;설치를 진행한다면 사용할 계정 정보를 요구 하므로 자신이 기억하기 쉬운 것으로 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.1. WSL에서 SSHFS 설치&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt -y upgrade &amp;amp;&amp;amp; sudo apt install --reinstall fuse &amp;amp;&amp;amp; sudo apt install -y sshfs
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.2. 마운트할 디렉터리 생성&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;mkdir -p /mnt/ocivps
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.3 설정 파일 수정&lt;/h2&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo vim /etc/fuse.conf

#파일에 아래 내용 주석을 제거 하거나 추가
user_allow_other
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;sudo vim /etc/wsl.conf

#아래 구문 추가
[automount]
enabled = true
mountFsTab = true
options = &quot;metadata,umask=22,fmask=11&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.4 ubuntu 에서 빠져 나와서 wsl 종료 및 재시작&lt;/h2&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;exit
exit
wsl --shutdown
wsl -d Ubuntu
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.5. SSH 키를 복제하여 권한 설정 ( ssh 개인 키에 대한 파일 권한은 로그인 사용자만 접근가능하도록 처리 해야 한다. )&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cp /mnt/d/sshkey/ssh_private_key ~/ssh_private_key
# cp &quot;원본파일&quot; &quot;복제파일&quot;
# ~/ 는 자신의 홈디렉토리를 뜻한다.
# \\ 는 폴더 중간에 공백이나 특수 문자 처리를 위해 사용 된다.
chmod 600 ~/ssh_private_key&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.6. SSHFS를 사용하여 마운트&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sshfs -o uid=1000,gid=1000,allow_other,debug,sshfs_debug,loglevel=debug3,workaround=rename,follow_symlinks,IdentityFile=~/ssh_private_key 사용자계정@서버호스트:/home /mnt/ocivps &amp;amp;

# 위에 내용은 디버깅을 위해서 debug, sshfs_debug, loglevel=debug3 가 설정되었습니다.
# 아래 명령어는 mount 를 제거 하는 것으로 필요시에 처리하면 됩니다.
sudo umount /mnt/ocivps&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.6.1. IdentityFile 옵션을 사용하여 SSH 키를 지정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/mnt/ocivps &amp;rarr; Windows에서 접근할 마운트 위치&lt;/p&gt;
&lt;h1&gt;2. Windows 탐색기에서 확인&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색기의 경로 에 \\wsl$\Ubuntu\mnt\ocivps 입력&lt;/p&gt;</description>
      <category>Server/Linux</category>
      <category>private key</category>
      <category>SSH</category>
      <category>ssh key</category>
      <category>sshfs</category>
      <category>마운트</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/72</guid>
      <comments>https://x509.tistory.com/72#entry72comment</comments>
      <pubDate>Fri, 7 Feb 2025 11:59:49 +0900</pubDate>
    </item>
    <item>
      <title>기본 연결이 닫혔습니다. SSL/TLS 보안 채널에 대한 트러스트 관계를 설정할 수 없습니다. ( fit. Let's Encrypt )</title>
      <link>https://x509.tistory.com/71</link>
      <description>&lt;h1&gt;1. C#의 ServicePointManager 설정 문제&lt;/h1&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;using System;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main()
    {
        // TLS 1.2 이상을 활성화
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;

        // SSL/TLS 인증서 검증 우회 (테스트용, 실제 운영에서는 사용 X)
        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) =&amp;gt; true;

        using (HttpClient client = new HttpClient())
        {
            try
            {
                var response = client.GetAsync(&quot;&amp;lt;https://example.com&amp;gt;&quot;).Result;
                Console.WriteLine(response.StatusCode);
            }
            catch (Exception ex)
            {
                Console.WriteLine(&quot;오류 발생: &quot; + ex.Message);
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;2. 제어판 &amp;rarr; 인터넷 옵션 &amp;rarr; 고급 &amp;rarr; 보안 &amp;rarr; TLS 1.1 , TLS 1.2 체크&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2025-02-07 10 55 44.png&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HcaFU/btsL8U1nbMi/LpeKecrgkzyGbX9OL98exk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HcaFU/btsL8U1nbMi/LpeKecrgkzyGbX9OL98exk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HcaFU/btsL8U1nbMi/LpeKecrgkzyGbX9OL98exk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHcaFU%2FbtsL8U1nbMi%2FLpeKecrgkzyGbX9OL98exk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1326&quot; height=&quot;774&quot; data-filename=&quot;2025-02-07 10 55 44.png&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 신뢰할 수 있는 루트 인증서, 신뢰할 수 있는 중간 인증서 문제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;Let&amp;rsquo;s Encrypt&lt;/b&gt; 관련 문제가 발생할 수 있음 ( 특히 Windows Update 를 사용하지 않는 PC 에서 문제가 발생할 가능성이 높음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 방법 3이 처리하기 편합니다. ( 재부팅 없이 즉시 사용 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 방법 3을 실행하는 배치 파일 : ( Windows 10 이하에서는 파워쉘 관련 설정이 필요할 수 있습니다. )&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/oIQRn/btsMa9PMe9n/ud8WaawkcjBy9hX8KuU2CK/root%20%EC%9D%B8%EC%A6%9D%EC%84%9C%20%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8.bat?attach=1&amp;amp;knm=tfile.bat&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;root 인증서 업데이트.bat&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1. 방법 1: Windows 자동 업데이트로 인증서 갱신하기&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Windows 업데이트 실행&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Win + R &amp;rarr; ms-settings:windowsupdate 입력 &amp;rarr; Enter&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;업데이트 확인&quot;&lt;/b&gt; 버튼을 눌러 최신 보안 업데이트를 설치합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;업데이트 후 PC 재부팅&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 루트 인증서가 자동으로 갱신됩니다.&lt;/li&gt;
&lt;li&gt;Windows 업데이트가 불가능한 경우 &lt;b&gt;방법 2&lt;/b&gt;를 사용하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2. 방법 2: Let's Encrypt 공식 인증서 직접 다운로드 및 설치&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/ko/&quot;&gt;Let's Encrypt 공식 사이트&lt;/a&gt;에 접속
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 두 개의 루트 인증서를 다운로드하세요.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/certificates/&quot;&gt;https://letsencrypt.org/certificates/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ISRG Root X1 (PEM)&lt;/li&gt;
&lt;li&gt;ISRG Root X2 (PEM)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일 확장자를 .crt로 변경
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;isrgrootx1.pem &amp;rarr; isrgrootx1.crt&lt;/li&gt;
&lt;li&gt;isrg-root-x2.pem &amp;rarr; isrg-root-x2.crt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일을 &lt;b&gt;더블 클릭&lt;/b&gt;하여 설치 진행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;인증서 설치&quot;&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;로컬 컴퓨터&quot;&lt;/b&gt; 선택 후 &quot;다음&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;신뢰할 수 있는 루트 인증 기관&quot;&lt;/b&gt; 선택 후 &quot;다음&quot;&lt;/li&gt;
&lt;li&gt;&quot;마침&quot;을 눌러 설치 완료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설치 후 &lt;b&gt;PC를 재부팅&lt;/b&gt;하고 C# 프로그램 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3. 방법 3: certutil 명령어로 인증서 갱신&lt;/b&gt; (고급 사용자용)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows에서 &lt;b&gt;명령어 한 줄(? 두줄)&lt;/b&gt;로 최신 루트 인증서를 가져와 설치할 수도 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;관리자 권한으로 PowerShell 또는 CMD 실행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;아래 명령어 입력 후 Enter&lt;/li&gt;
&lt;li&gt;certutil -generateSSTFromWU root.sst &lt;br /&gt;certutil -addstore -f root root.sst&lt;/li&gt;
&lt;li&gt;완료되면 root.sst 파일을 삭제해도 됩니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>.Net Framework Standard</category>
      <category>certutil</category>
      <category>Let's Encrypt</category>
      <category>ssl</category>
      <category>ssl/tls 보안 채널에 대한 트러스트 관계를 설정할 수 없습니다.</category>
      <category>TLS</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/71</guid>
      <comments>https://x509.tistory.com/71#entry71comment</comments>
      <pubDate>Fri, 7 Feb 2025 11:33:32 +0900</pubDate>
    </item>
    <item>
      <title>Microsoft 365로 SQL Database Mail 구성 시 TLS 문제, 일반 사용자 권한 문제 처리</title>
      <link>https://x509.tistory.com/70</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TLS 문제 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/71116436/database-mail-will-not-send-email-to-smtp-office365-com?utm_source=chatgpt.com&quot;&gt;https://stackoverflow.com/questions/71116436/database-mail-will-not-send-email-to-smtp-office365-com?utm_source=chatgpt.com&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Microsoft 365는 전역(인프라?)이 - TLS v 1.2가 기본&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL Server 2017 이하 버전&lt;/b&gt;은 아래 관련 내용이 필요할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/how-to-set-up-a-multifunction-device-or-application-to-send-email-using-microsoft-365-or-office-365&quot;&gt;https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/how-to-set-up-a-multifunction-device-or-application-to-send-email-using-microsoft-365-or-office-365&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 내용에서 레지스트리 부분만 처리하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319]
&quot;SchUseStrongCrypto&quot;=dword:00000001
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DatabaseMail.exe는 .NET Framework 3.5용으로 빌드되었지만 TLS 1.2(.NET Framework 4.5.2 이상)를 지원하는 .NET Framework가 설치되어 있어야 합니다.&lt;/li&gt;
&lt;li&gt;TLS 1.2 클라이언트 프로토콜은 레지스트리의 컴퓨터 수준에서 사용하도록 설정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.2\\Client]
&quot;DisabledByDefault&quot;=dword:00000000
&quot;Enabled&quot;=dword:00000001

&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레지스트리에서 .NET Framework 4.x에 대해 TLS 1.2 클라이언트 프로토콜을 사용하도록 설정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319]
&quot;SchUseStrongCrypto&quot;=dword:00000001

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\.NETFramework\\v4.0.30319]
&quot;SchUseStrongCrypto&quot;=dword:00000001

&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적절한 supportedRuntime 은 DatabaseMail.exe.config 파일에 있어야합니다 (예 : Microsoft .NET Framework 4.5.2가 설치된 경우).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&quot;DatabaseServerName&quot; value=&quot;.&quot; /&amp;gt;
    &amp;lt;add key=&quot;DatabaseName&quot; value=&quot;msdb&quot; /&amp;gt;
  &amp;lt;/appSettings&amp;gt;
  &amp;lt;startup&amp;gt;
    &amp;lt;supportedRuntime version=&quot;v4.0&quot; sku=&quot;.NETFramework,Version=v4.5.2&quot; /&amp;gt;
  &amp;lt;/startup&amp;gt;
&amp;lt;/configuration&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SSMS의 데이터베이스 메일 설정을 통해 보내는 계정을 적절하게 구성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 이름: &lt;a href=&quot;http://smtp.office365.com&quot;&gt;smtp.office365.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;포트 번호: 587(선호 또는 25)&lt;/li&gt;
&lt;li&gt;이 서버에는 보안 연결(SSL)이 필요합니다: 선택해야 합니다(STARTTLS 활성화).&lt;/li&gt;
&lt;li&gt;SMTP 인증:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 인증(선택됨)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 이름: sending_mailbox_user@your_domain.com&lt;/li&gt;
&lt;li&gt;암호: your_office365_password&lt;/li&gt;
&lt;li&gt;비밀번호 확인: your_office365_password_again&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;권한 문제 처리&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 권한이 있는 계정 (관리자 계정)으로 실행해야 합니다.
USE msdb;

CREATE USER lacs FOR LOGIN [대상로그인];

-- sysmail_mailitems 테이블에 SELECT 권한 부여
GRANT SELECT ON [msdb].[dbo].[sysmail_mailitems] TO [대상로그인];

/*
-- 기본적으로 일반 사용자 계정에서 삭제나 입력을 처리해서는 안된다.
-- 기본적으로 일반 사용자 계정에서 삭제나 입력을 처리해서는 안된다.
-- 기본적으로 일반 사용자 계정에서 삭제나 입력을 처리해서는 안된다.
-- 기본적으로 일반 사용자 계정에서 삭제나 입력을 처리해서는 안된다.

-- sysmail_mailitems 테이블에 INSERT 권한 부여
GRANT INSERT ON [msdb].[dbo].[sysmail_mailitems] TO [대상로그인];

-- sysmail_mailitems 테이블에 DELETE 권한 부여
GRANT DELETE ON [msdb].[dbo].[sysmail_mailitems] TO [대상로그인];

-- DatabaseMailUserRole 역할을 사용자에게 부여
EXEC sp_addrolemember 'DatabaseMailUserRole', '대상로그인';

*/
 
 -- 특정 사용자에게 sp_send_dbmail 프로시저 실행 권한 부여
GRANT EXECUTE ON msdb.dbo.sp_send_dbmail TO [대상로그인];

EXEC sp_addrolemember 'DatabaseMailUserRole', '대상로그인';

&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database/MSSQL</category>
      <category>m365</category>
      <category>microsoft 365</category>
      <category>registry</category>
      <category>sql db mail</category>
      <category>SQL MAIL</category>
      <category>sql 권한</category>
      <category>TLS</category>
      <category>Windows Server</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/70</guid>
      <comments>https://x509.tistory.com/70#entry70comment</comments>
      <pubDate>Fri, 3 Jan 2025 15:14:38 +0900</pubDate>
    </item>
    <item>
      <title>FreeTDS 로 MSSQL 2008 (구버전 SQL) 연결시  Error 0002 (severity 9):        Adaptive Server connection failed</title>
      <link>https://x509.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;* 2024/11/08 일 기준으로 작성 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 환경은&amp;nbsp; CentOS 7, MSSQL 2008 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FreeTDS가 OpenSSL을 사용하는 경우도 있고 GnuTLS를 사용하는 경우도 있어서 오류 확인 및 설정 확인 내용을 포함하여 작성 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tsql 명령으로 테스트시 Error 20002 (severity 9): &amp;nbsp;Adaptive Server connection failed 오류 발생&lt;/p&gt;
&lt;pre id=&quot;code_1731031327419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;locale is &quot;en_US.UTF-8&quot;
locale charset is &quot;UTF-8&quot;
using default charset &quot;UTF-8&quot;
Error 20002 (severity 9):
        Adaptive Server connection failed
There was a problem connecting to the server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* CentOS 7 기준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 로그 확인을 위해 freetds.conf 에서 debug 활성화&amp;nbsp; ( freetds 설정 기본 경로 /etc/freetds.conf )&lt;/p&gt;
&lt;pre id=&quot;code_1731031470646&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        dump file = /tmp/freetds.log
        debug flags = 0xffff&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz32CB/btsKzMwXj37/c9dZiXsQufAgxVYBp13UA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz32CB/btsKzMwXj37/c9dZiXsQufAgxVYBp13UA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz32CB/btsKzMwXj37/c9dZiXsQufAgxVYBp13UA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz32CB%2FbtsKzMwXj37%2Fc9dZiXsQufAgxVYBp13UA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;376&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. tsql 연결 테스트&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOgn5S/btsKzMjltHM/Y2HUOVKkQy5tRFfbYklAo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOgn5S/btsKzMjltHM/Y2HUOVKkQy5tRFfbYklAo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOgn5S/btsKzMjltHM/Y2HUOVKkQy5tRFfbYklAo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOgn5S%2FbtsKzMjltHM%2FY2HUOVKkQy5tRFfbYklAo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;135&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 로그 확인 ( 1번에 설정된 &amp;nbsp;/tmp/freetds.log )&lt;/p&gt;
&lt;pre id=&quot;code_1731031620926&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;11:04:01.366482 24159 (tls.c:202):GNUTLS: level 10:
  READ: Got 5 bytes from 0x7ac590
11:04:01.366487 24159 (tls.c:202):GNUTLS: level 10:
  READ: read 5 bytes from 0x7ac590
11:04:01.366491 24159 (tls.c:202):GNUTLS: level 10:
  RB: Have 0 bytes into buffer. Adding 5 bytes.
11:04:01.366495 24159 (tls.c:202):GNUTLS: level 10:
  RB: Requested 5 bytes
11:04:01.366502 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: SSL 3.1 Handshake packet received. Epoch 0, length: 606
11:04:01.366507 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: Expected Packet Handshake(22)
11:04:01.366511 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: Received Packet Handshake(22) with length: 606
11:04:01.366521 24159 (tls.c:117):in tds_pull_func_login
11:04:01.366526 24159 (tls.c:202):GNUTLS: level 10:
  READ: Got 606 bytes from 0x7ac590
11:04:01.366530 24159 (tls.c:202):GNUTLS: level 10:
  READ: read 606 bytes from 0x7ac590
11:04:01.366534 24159 (tls.c:202):GNUTLS: level 10:
  RB: Have 5 bytes into buffer. Adding 606 bytes.
11:04:01.366538 24159 (tls.c:202):GNUTLS: level 10:
  RB: Requested 611 bytes
11:04:01.366549 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: Decrypted Packet[0] Handshake(22) with length: 606
11:04:01.366558 24159 (tls.c:202):GNUTLS: level 4:
  HSK[0x7c4080]: SERVER HELLO (2) was received. Length 77[602], frag offset 0, frag length: 77, sequence: 0
11:04:01.366565 24159 (tls.c:202):GNUTLS: level 4:
  HSK[0x7c4080]: Server's version: 3.1
11:04:01.366570 24159 (tls.c:202):GNUTLS: level 3:
  ASSERT: gnutls_handshake.c:1755
11:04:01.366574 24159 (tls.c:202):GNUTLS: level 3:
  ASSERT: gnutls_handshake.c:2255
11:04:01.366578 24159 (tls.c:202):GNUTLS: level 3:
  ASSERT: gnutls_handshake.c:1475
11:04:01.366582 24159 (tls.c:202):GNUTLS: level 3:
  ASSERT: gnutls_handshake.c:2739
11:04:01.366589 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: Start of epoch cleanup
11:04:01.366593 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: End of epoch cleanup
11:04:01.366600 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: Epoch #0 freed
11:04:01.366604 24159 (tls.c:202):GNUTLS: level 5:
  REC[0x7c4080]: Epoch #1 freed
11:04:01.366637 24159 (tls.c:567):handshake failed: A packet with illegal or unsupported version was received.
11:04:01.366642 24159 (login.c:670):login packet rejected
11:04:01.366646 24159 (query.c:3804):tds_disconnect()
11:04:01.366662 24159 (util.c:179):Changed query state from IDLE to DEAD
11:04:01.366671 24159 (util.c:333):tdserror(0x7ac180, 0x7ac590, 20002, 0)
11:04:01.366698 24159 (util.c:363):tdserror: client library returned TDS_INT_CANCEL(2)
11:04:01.366703 24159 (util.c:386):tdserror: returning TDS_INT_CANCEL(2)
11:04:01.366709 24159 (mem.c:665):tds_free_all_results()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qij7c/btsKAtcFoNo/FzwyUxH9XZc2NDcieMusOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qij7c/btsKAtcFoNo/FzwyUxH9XZc2NDcieMusOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qij7c/btsKAtcFoNo/FzwyUxH9XZc2NDcieMusOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqij7c%2FbtsKAtcFoNo%2FFzwyUxH9XZc2NDcieMusOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;803&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. tsql 로 설정 정보 확인&amp;nbsp; ( tsql -C )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GnuTLS 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co8DRX/btsKAWFm5oH/NrpIhRlkCAuvnIklNbZvAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co8DRX/btsKAWFm5oH/NrpIhRlkCAuvnIklNbZvAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co8DRX/btsKAWFm5oH/NrpIhRlkCAuvnIklNbZvAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco8DRX%2FbtsKAWFm5oH%2FNrpIhRlkCAuvnIklNbZvAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;245&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. freetds.conf 에서 특정 db 쪽 설정 변경 ( freetds 설정 기본 경로 /etc/freetds.conf )&lt;/p&gt;
&lt;pre id=&quot;code_1731031922449&quot; class=&quot;nix&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[global]
        # TDS protocol version
        tds version = 7.4
#       tds version = auto

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff

        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10

        # To reduce data sent from server for BLOBs (like TEXT or
        # IMAGE) try setting 'text size' to a reasonable limit
;       text size = 64512

        # If you experience TLS handshake errors and are using openssl,
        # try adjusting the cipher list (don't surround in double or single quotes)
        # openssl ciphers = HIGH:!SSLv2:!aNULL:-DH


[php등에서 사용될 서버명]
        host = 아이피 혹은 도메인
        tds version = 7.0
#        tds version = 8.0
        tls protocol = TLSv1.1
#        client charset = UTF-8
        client charset = EUC-KR&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrdHH/btsKzFkpiAV/8YqisgfcLcdbdyKx3rHxLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrdHH/btsKzFkpiAV/8YqisgfcLcdbdyKx3rHxLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrdHH/btsKzFkpiAV/8YqisgfcLcdbdyKx3rHxLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwrdHH%2FbtsKzFkpiAV%2F8YqisgfcLcdbdyKx3rHxLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;497&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 GnuTLS 에서 최소 버전 설정이 되지 않을대 환경 변수에 추가 (필수가 아닌 옵션)&lt;/p&gt;
&lt;pre id=&quot;code_1731371062924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export GNUTLS_DEBUG_LEVEL=3
export GNUTLS_FORCE_CLIENT_TLS_VERSION=TLS1.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은? 아래 내용 추가..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tds version = 7.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tls&amp;nbsp;protocol&amp;nbsp;=&amp;nbsp;TLSv1.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.d-0-b.kr/42&quot;&gt;IIS Crypto 적용 시 주의? 유의 사항 구버전 MS SQL 연결 - 추천 Cipher Suites &amp;mdash; 삽질은 내 운명&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731032001546&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;IIS Crypto 적용 시 주의? 유의 사항  구버전 MS SQL 연결 - 추천 Cipher Suites&quot; data-og-description=&quot;글 작성일은 2022년 7월 22일 입니다. 시간이 갈 수록 변화하기 때문에 작성 일자를 적어 둡니다. IIS Crypto로 Windows Server의 TLS 버전 제한 및 cipher suites 제한시 MSSQL 연결에 문제가 생길 수 있습니다. (&quot; data-og-host=&quot;dev.d-0-b.kr&quot; data-og-source-url=&quot;https://dev.d-0-b.kr/42&quot; data-og-url=&quot;https://dev.d-0-b.kr/42&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/l6kv4/hyXsQ7dGQu/1dNKYPG3OWwQjVHWtggwZ1/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/bEgfz3/hyXwrkn83A/FQ9GtDyfpvUGP93I2U7vY1/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/SAueS/hyXsZXrgJm/Pk5NMtMvd02Fm2wKBSkknK/img.png?width=893&amp;amp;height=743&amp;amp;face=0_0_893_743&quot;&gt;&lt;a href=&quot;https://dev.d-0-b.kr/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.d-0-b.kr/42&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/l6kv4/hyXsQ7dGQu/1dNKYPG3OWwQjVHWtggwZ1/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/bEgfz3/hyXwrkn83A/FQ9GtDyfpvUGP93I2U7vY1/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/SAueS/hyXsZXrgJm/Pk5NMtMvd02Fm2wKBSkknK/img.png?width=893&amp;amp;height=743&amp;amp;face=0_0_893_743');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;IIS Crypto 적용 시 주의? 유의 사항 구버전 MS SQL 연결 - 추천 Cipher Suites&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;글 작성일은 2022년 7월 22일 입니다. 시간이 갈 수록 변화하기 때문에 작성 일자를 적어 둡니다. IIS Crypto로 Windows Server의 TLS 버전 제한 및 cipher suites 제한시 MSSQL 연결에 문제가 생길 수 있습니다. (&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.d-0-b.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Linux</category>
      <category>adaptive server connection failed</category>
      <category>error 0002</category>
      <category>freetds</category>
      <category>gnutls</category>
      <category>SQL2008</category>
      <category>TLS</category>
      <category>구버전 sql</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/69</guid>
      <comments>https://x509.tistory.com/69#entry69comment</comments>
      <pubDate>Fri, 8 Nov 2024 11:15:27 +0900</pubDate>
    </item>
    <item>
      <title>Devexpress GridContro/ TreeList Indicator Header에 버튼 추가</title>
      <link>https://x509.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Devexpress의 Winform 의 GridControl (GridView, BandedGridView) 및 TreeList 의 Indicator Header에 버튼을 추가 하는 코드&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719993953270&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
// 사용법
// 이미지 및 ToolTipContainer 를 인스턴스의 속성으로 노출

IndicatorHeaderButton indicatorHeaderButton = new IndicatorHeaderButton(this.gc_Input);
indicatorHeaderButton.IndicatorButtonClick += (ss, ee) =&amp;gt;
{
    //  버튼 클릭
};

*/

public sealed class IndicatorHeaderButton
{

    private static readonly string AddButtonImage = @&quot;iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADUElEQVR4Xm2TbWiVZRjHf/f9POec7bx0tnM82zk7W29u0YQKRmgmOZDm3Gzm5japwLURhdqQYIFILyvLvhRaUdQHoaSZZEHGJmmrhGhKoChmSvswX7apbZ7pNj07O89zX50d6FsX/Ph/+l3/68ul2t5K8t+ICJk7ZontUS8CtQgPiREcR845GTl+85qz98TB1FkgU99dImIEFha8158AUBteL+tpfzue7v6sSnYPrJXvTm7Ns7u/UTZ/UinrtscytR3Rd4EwYNVtjpG/YCbl+IJF9qGiiK5fs6KJROQ+/m/GUyP8MPg9o8OZ46f6p9tuXc9eU4BqeaPsw1hcdbeu6sJnF4KCQ0e/4cr4ZUSE8vjdNDdsBIH0/Az7B/YyfNL5euhAaotavyPxiD/IqTW1K3V5rBoApeDTfR+xq3OEYMDD1j1Juru2ASACY5MXOPDtoPl7KL3OVhYvBMKOjobLybpzKKVQAMZgcmgl+XTNPCICAtFwkkVx0dfjnk4bUfV+v4NrMhw5dpjxa1cRATGCm2Milca4hj2ff4wxQjJRRlNjHeFF4CvUy21E7vEVKiZnL+XlXV2X8o3GFdyFdFx6Nw3jGpcH7o+ycUeU1OxlCgMWynIithiUt8DL2NTZvBgKeFAq34zrGCrKQiitsHLoHK7rMnbzT3xeG8TRtuvKmC2+e41kCIUtXno/BijEQG/HcF5+9rUoxoDJycUlXoR5lFtANpOe0k7G/JKe9mBZmuqaELUNJTQ2V5F1HFzX5JuzTpbW56tZ+1ySZasWYXsspic06RnntFVaWTCJrTsXVwUVGDy2Bsvh/OkbbGnbidaavsPvsCS3XGkA8Hvv4o9jUzJy5s5O/XvfjVP/XJnrmxi1KQ5GsL02lmVRmgiw/tUgTa/4SVT4sWyNx/JQHIhw5YLh4vnbg6Pn5n62gfkzR271CLI4PRt7vGZpHNEZVj/tR3BQCmy8aO1FOT6Gfr3Kbz+N/zU8dLsHmKBhWymABUSWtRZ/sGF7xXzv/hr54viT8uPFZjl6sUW+PFEnb371qDz1ctKpXhncB1QCvsfaiyD3lqzeGgPQQKhqeaBuaUvRwRXPRC7VdkTkiU0RWdZaNPpwfWig7MGCdqAUsBfkBf4F0YF4pAYVQAAAAAAASUVORK5CYII=&quot;;

    private int _Size = 24;

    public int Size
    {
        get { return _Size; }
        set { _Size = value; }
    }

    Rectangle _ButtonRectangle = default(Rectangle);

    DevExpress.XtraEditors.SimpleButton Button { get; set; }

    Rectangle ButtonRectangle
    {
        get { return _ButtonRectangle; }
        set
        {
            _ButtonRectangle = value;

            if (_ButtonRectangle != null &amp;amp;&amp;amp; Button != null)
            {
                Button.Location = new Point(_ButtonRectangle.X, _ButtonRectangle.Y);
                Button.Size = new Size(_ButtonRectangle.Width, _ButtonRectangle.Height);
                Button.Visible = true;
                Button.BringToFront();
                //Button.Update();
            }
            else
            {
                Button.Visible = false;
                Button.BringToFront();
            }
        }
    }

    private IndicatorHeaderButton()
    {
        this.Button = CreateButton();
    }

    public IndicatorHeaderButton(DevExpress.XtraGrid.GridControl gridControl) : this()
    {
        bool isBandedGridView = false;
        if (gridControl.MainView is DevExpress.XtraGrid.Views.BandedGrid.BandedGridView bgv)
        {
            isBandedGridView = bgv.OptionsView.ShowColumnHeaders == false;
        }

        if (gridControl.MainView is DevExpress.XtraGrid.Views.Grid.GridView gv)
        {

            DevExpress.XtraGrid.Skins.GridSkinElementsPainter _Painter = new DevExpress.XtraGrid.Skins.GridSkinElementsPainter(gv);
            this.Button.Appearance.BackColor = _Painter.Column.DefaultAppearance.BackColor;
            this.Button.Appearance.ForeColor = _Painter.Column.DefaultAppearance.ForeColor;

            gridControl.Controls.Add(this.Button);

            gv.CustomDrawRowIndicator += (ss, ee) =&amp;gt;
            {
                if (gv.IndicatorWidth &amp;lt; (this.Size + 2))
                {
                    gv.IndicatorWidth = (this.Size + 2);
                }

                if (ee.RowHandle &amp;gt;= 0)
                    return;

                if (gv.IsFilterRow(ee.RowHandle))
                    return;

                if (isBandedGridView || ee.Info.Kind == DevExpress.Utils.Drawing.IndicatorKind.Header)
                {
                    var rec = new Rectangle(ee.Bounds.Left + (ee.Bounds.Width - Size) / 2, ee.Bounds.Top + (ee.Bounds.Height - Size) / 2, Size, Size);

                    if (ButtonRectangle != rec)
                    {
                        ButtonRectangle = rec;
                    }

                    return;
                }
            };
        }
    }

    public IndicatorHeaderButton(DevExpress.XtraTreeList.TreeList treeList) : this()
    {
        treeList.Controls.Add(this.Button);

        this.Button.Appearance.BackColor = treeList.Appearance.HeaderPanel.BackColor;
        this.Button.Appearance.ForeColor = treeList.Appearance.HeaderPanel.ForeColor;

        if (treeList.OptionsView.ShowColumns)
        {
            treeList.CustomDrawColumnHeader += (ss, ee) =&amp;gt;
            { 

                if (ee.Info.Column == null &amp;amp;&amp;amp; ee.Info.HeaderPosition != DevExpress.Utils.Drawing.HeaderPositionKind.Right)
                {
                    var rec = new Rectangle(ee.Bounds.Left + (ee.Bounds.Width - Size) / 2, ee.Bounds.Top + (ee.Bounds.Height - Size) / 2, Size, Size);
                    if (ButtonRectangle != rec)
                    {
                        ButtonRectangle = rec;
                    }
                }
            };
        }
        else
        {
            treeList.CustomDrawBandHeader += (ss, ee) =&amp;gt;
            {
                if (ee.Info.Band == null &amp;amp;&amp;amp; ee.Info.HeaderPosition != DevExpress.Utils.Drawing.HeaderPositionKind.Right)
                {
                    var rec = new Rectangle(ee.Bounds.Left + (ee.Bounds.Width - Size) / 2, ee.Bounds.Top + (ee.Bounds.Height - Size) / 2, Size, Size);
                    if (ButtonRectangle != rec)
                    {
                        ButtonRectangle = rec;
                    }
                }
            };
        }

        return;
        treeList.CustomDrawNodeIndicator += (ss, ee) =&amp;gt;
        {
            if (treeList.IndicatorWidth &amp;lt; (this.Size + 2))
            {
                treeList.IndicatorWidth = (this.Size + 2);
            }


            if ((ee.Node?.Id ?? 0) &amp;gt; -1)
                return;

            if (ee.Info.Kind == DevExpress.Utils.Drawing.IndicatorKind.Header)
            {
                var rec = new Rectangle(ee.Bounds.Left + (ee.Bounds.Width - Size) / 2, ee.Bounds.Top + (ee.Bounds.Height - Size) / 2, Size, Size);
                if (ButtonRectangle != rec)
                {
                    ButtonRectangle = rec;
                }

                return;
            }
        };
    }

    private DevExpress.XtraEditors.SimpleButton CreateButton()
    {
        DevExpress.XtraEditors.SimpleButton simpleButton = new DevExpress.XtraEditors.SimpleButton();
        simpleButton.Text = &quot;&quot;;

        simpleButton.Size = new Size(120, 40);
        simpleButton.PaintStyle = DevExpress.XtraEditors.Controls.PaintStyles.Default;
        simpleButton.ImageOptions.Image = GetDefaultAddImage();
        //simpleButton.LookAndFeel.SetDefaultStyle();
        simpleButton.Visible = false;
        simpleButton.LookAndFeel.UseDefaultLookAndFeel = false;
        simpleButton.LookAndFeel.Style = DevExpress.LookAndFeel.LookAndFeelStyle.Flat;
        simpleButton.TabStop = false;

        return simpleButton;
    }

    private Bitmap GetDefaultAddImage()
    {
        byte[] fileBytes = Convert.FromBase64String(AddButtonImage);

        using (var ms = new System.IO.MemoryStream(fileBytes))
        {
            return new Bitmap(ms);
        }
    }

    public DevExpress.XtraEditors.SimpleButtonImageOptions ImageOptions
    {
        get
        {
            return this.Button.ImageOptions;
        }
    }


    public event EventHandler IndicatorButtonClick
    {
        add
        {
            this.Button.Click += value;
        }
        remove
        {
            this.Button.Click -= value;
        }
    }

    public DevExpress.Utils.ToolTipController ToolTip
    {
        get
        {
            return this.Button.ToolTipController;
        }
        set
        {
            this.Button.ToolTipController = value;
            this.Button.ShowToolTips = true;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.Net Framework Standard/Component</category>
      <category>DevExpress</category>
      <category>GridControl</category>
      <category>indicator</category>
      <category>indicator header</category>
      <category>TreeList</category>
      <category>WinForm</category>
      <author>달빛에취하다</author>
      <guid isPermaLink="true">https://x509.tistory.com/68</guid>
      <comments>https://x509.tistory.com/68#entry68comment</comments>
      <pubDate>Wed, 3 Jul 2024 17:09:24 +0900</pubDate>
    </item>
  </channel>
</rss>