<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Simple is Beautiful.</title>
    <link>https://smoh.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 15:21:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>비만오리</managingEditor>
    <image>
      <title>Simple is Beautiful.</title>
      <url>https://tistory1.daumcdn.net/tistory/2497408/attach/bba75b492b7641ad803a1cf0a41a7b31</url>
      <link>https://smoh.tistory.com</link>
    </image>
    <item>
      <title>[DICOM] RGB 영상의 픽셀 데이터 구성</title>
      <link>https://smoh.tistory.com/509</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/raVmD/btsIt22seGN/yPd7NO540BfkyZBxh85kOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/raVmD/btsIt22seGN/yPd7NO540BfkyZBxh85kOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/raVmD/btsIt22seGN/yPd7NO540BfkyZBxh85kOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FraVmD%2FbtsIt22seGN%2FyPd7NO540BfkyZBxh85kOk%2Fimg.jpg&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;379&quot; height=&quot;97&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;97&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;RGB 영상에서의 픽셀 데이터 구성에 대해 알아봅니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. DICOM RGB 영상.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DICOM Tag PhotometricInterpretation(0028,0004)이 RGB인 영상입니다.&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;RGB 영상은 각 픽셀의 색상을 빨간색, 녹색, 파란색의 세 가지 채널로 이루어져 있으며 세&amp;nbsp;채널의&amp;nbsp;조합으로&amp;nbsp;모든&amp;nbsp;색상을&amp;nbsp;표현할&amp;nbsp;수&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Planar Configuration&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RGB 영상의 픽셀데이터 구성에 대해 알기 위해선 먼저 PlanarConfiguration(0028,0006) 태그를 먼저 확인해야 합니다.&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;이 태그는 DICOM 이미지에서 색상 채널 데이터가 어떻게 배열되는지를 정의하는 DICOM 태그입니다. 해당 값은 0 혹인 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;0인 경우 RGB 채널이 인터리브(Interleaved)하게 이루어져 있습니다. Color-by-pixel 방식이라고도 하며 모든 채널의 데이터를 교대로 저장하여 RGB 데이터가 연속된 형식으로 존재합니다. 이는 각 픽셀에 해당하는 RGB값이 연속적으로 저장됨을 뜻합니다. 예:&amp;nbsp;[R0,&amp;nbsp;G0,&amp;nbsp;B0,&amp;nbsp;R1,&amp;nbsp;G1,&amp;nbsp;B1,&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;1인경우 RGB 채널이 플래너(Planar)하게 이루어져 있습니다. Color-by-plane 방식이라고도 합니다. 각 색상 채널이 별도의 2D 이미지로 저장되며, 각 채널이 독립적으로 배열됩니다. 이는 각 색상 채널이 개별적으로 저장되어 있음을 뜻합니다. 예: 예:&amp;nbsp;[R0,&amp;nbsp;R1,&amp;nbsp;R2,&amp;nbsp;...,&amp;nbsp;Gn,&amp;nbsp;Gm,&amp;nbsp;Gn+1,&amp;nbsp;...,&amp;nbsp;Bn,&amp;nbsp;Bm,&amp;nbsp;Bn+1,&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. BitAllocated와 BitStored&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DICOM에서 픽셀 데이터를 다루기 위해선 또 다른 태그를 더 살펴봐야 합니다.&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;Bit Allocated(0028,0100)는 각 픽셀에 할당된 총 비트 수를 의미하며 일반적으로 8, 12, 16 비트가 사용됩니다. &amp;nbsp;Bits Stored(0028,0101)는 각 픽셀에 저장된 실제 유효 비트 수를 의미합니다.&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;예를 들어, Bits Allocated가 16이고, Bits Stored가 12이면, 각 픽셀 데이터는 16비트로 저장되지만, 그중 12비트만 유효 데이터로 사용됩니다. 나머지 4비트는 일반적으로 0으로 채워짐을 의미합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 픽셀 데이터 계산&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기본적인 태그(rows 및 colums)를 사용해 RGB 영상의 픽셀 데이터 위치를 알아낼 수 있습니다.&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;PlanarConfiguration이 1일 때 rows(H)와 columns(W)가 512인 경우 x, y좌표 300, 250의 RGB값은 다음과 같이 구할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 한 프레임의 픽셀 수: W x H&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;rArr; 한 프레임의 채널 데이터 크기: W x H&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;rArr; 한 프레임의 전체 데이터 크기: 3 x W x H&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 각 프레임의 데이터는 연속적으로 저장되므로, N번째 프레임의 시작 위치는 다음과 같이 계산할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; N번째 프레임의 시작 위치: (N-1) * 3 * W * H&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PlanarConfiguration이 1이므로 각채널의 시작위치는 다음과 같이 유추할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; Red&amp;nbsp;채널의&amp;nbsp;시작&amp;nbsp;위치:&amp;nbsp;(N-1)&amp;nbsp;*&amp;nbsp;3&amp;nbsp;*&amp;nbsp;W&amp;nbsp;*&amp;nbsp;H&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; Green&amp;nbsp;채널의&amp;nbsp;시작&amp;nbsp;위치:&amp;nbsp;(N-1)&amp;nbsp;*&amp;nbsp;3&amp;nbsp;*&amp;nbsp;W&amp;nbsp;*&amp;nbsp;H&amp;nbsp;+&amp;nbsp;W&amp;nbsp;*&amp;nbsp;H&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; Blue&amp;nbsp;채널의&amp;nbsp;시작&amp;nbsp;위치:&amp;nbsp;(N-1)&amp;nbsp;*&amp;nbsp;3&amp;nbsp;*&amp;nbsp;W&amp;nbsp;*&amp;nbsp;H&amp;nbsp;+&amp;nbsp;2&amp;nbsp;*&amp;nbsp;W&amp;nbsp;*&amp;nbsp;H&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;rArr; 픽셀 인덱스: y * W + x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위의 모든 식을 종합하면 PlanarConfiguration이 1일 때 rows(H)와 columns(W)가 512인 경우 x, y좌표 300, 250의 RGB의 위치는 다음과 같이 산출됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Red 값의 위치: (N-1) * ( 3 x W x H)+ (y * W + x)&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Green 값의 위치: (N-1) * ( 3 x W x H) + (W * H)+ (y * W + x)&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Blue 값의 위치: (N-1) * ( 3 x W x H) + (2 * W * H) + (y * W + x)&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;다음으로 PlanarConfiguration이 0일 때 rows(H)와 columns(W)가 512인 경우 x, y좌표 300, 250의 RGB값은 다음과 같이 구할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 한 프레임의 픽셀 수: W x H&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 한 프레임의 전체 데이터 크기: 3 x W x H&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 각 프레임의 데이터는 연속적으로 저장되므로, N번째 프레임의 시작 위치는 다음과 같이 계산할 수 있습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; N번째 프레임의 시작 위치: (N-1) * 3 * W * H&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 우리가 원하는 픽셀의 인덱스 위치는 다음과 같이 계산할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 픽셀 인덱스: y * W + x&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PlanarConfiguration이 0이므로, 각 픽셀의 R, G, B 값이 연속적으로 저장됩니다. 따라서, N번째 프레임의 시작 위치에서 해당 픽셀 인덱스를 3배 한 값이 각 채널의 시작 위치가 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Red&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &amp;nbsp;값의 위치: (N-1) * (3 * W * H) + 3 * (y * W + x)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Green&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &amp;nbsp;값의 위치: (N-1) * (3 * W * H) + 3 * &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;y * W + x) + 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Blue&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &amp;nbsp;값의 위치: (N-1) * (3 * W * H) + 3 * &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;y * W + x) + 2&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 해당 값을 이용해 픽셀 데이터를 원하는 값으로 수정할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Trunk/DICOM</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/509</guid>
      <comments>https://smoh.tistory.com/509#entry509comment</comments>
      <pubDate>Wed, 10 Jul 2024 18:46:53 +0900</pubDate>
    </item>
    <item>
      <title>Postgresql DB와 함께 Keycloak 사용하기.</title>
      <link>https://smoh.tistory.com/508</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SeN0o/btsF9NFNOJU/7nrekGRqkWJLgG4bD6zRa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SeN0o/btsF9NFNOJU/7nrekGRqkWJLgG4bD6zRa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SeN0o/btsF9NFNOJU/7nrekGRqkWJLgG4bD6zRa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSeN0o%2FbtsF9NFNOJU%2F7nrekGRqkWJLgG4bD6zRa0%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;659&quot; height=&quot;371&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&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;Keyclock 컨테이너를 postgresql db와 함께 사용하는 방법에 대하 알아봅니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jbos/keycloak는 더 이상 관리되지 않습니다. 현재 글 작성 시점에 dockerhub에는 공식 keycloak 이미지가 배포되고 있지 않습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. docker-compose.yml&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 docker-compose.yml을 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711597174521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.8'

services:
  keycloak:
    image: quay.io/keycloak/keycloak:24.0.2
    ports:
      - &quot;8080:8080&quot;
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://your.dbhost.com:5432/yourdbname
      KC_DB_USERNAME: yourdbuser
      KC_DB_PASSWORD: yourdbpassword
      KC_HTTP_ENABLED: true
      KC_HEALTH_ENABLED: true
      KEYCLOAK_ADMIN: yourkeycloakuser
      KEYCLOAK_ADMIN_PASSWORD: yourkeycloakpassword
    command: 
      - start-dev 
      - --import-realm
    volumes:
      - /home/keycloak/realm.json:/opt/keycloak/data/import/realm.json&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;환경 변수에대해 간단하게 설명하자면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KC_DB: 사용할 데이터베이스의 종류입니다. postgres로 두면 됩니다.&lt;/li&gt;
&lt;li&gt;KC_DB_URL: postgres 접속 정보입니다. host, port, db이름을 변경해 사용하시면 됩니다.&lt;/li&gt;
&lt;li&gt;KC_DB_USERNAME: DB 접속 계정 정보입니다. 변경해 사용하시면 됩니다.&lt;/li&gt;
&lt;li&gt;KC_DB_PASSWORD: DB 접속 계정의 암호입니다. 변경해 사용하시면 됩니다.&lt;/li&gt;
&lt;li&gt;KC_HTTP_ENABLE: HTTP를 통해 접근 가능한지 여부를 결정합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;KC_HEALTH_ENABLED: 상태 확인 엔드포인트를 활성화할지 여부를 결정합니다. true로 설정한 경우 다음과 같은 엔드포인트가 활성화됩니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/health/live&lt;/li&gt;
&lt;li&gt;/health/ready&lt;/li&gt;
&lt;li&gt;/health/started&lt;/li&gt;
&lt;li&gt;/health&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KEYCLOAK_ADMIN: 관리용 페이지에 로그인할 수 있는 계정을 설정합니다.&lt;/li&gt;
&lt;li&gt;KEYCLOAK_ADMIN_PASSWORD: 관리용 페이지에 로그인 할 수 있는 계정의 암호를 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;</description>
      <category>Programming</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/508</guid>
      <comments>https://smoh.tistory.com/508#entry508comment</comments>
      <pubDate>Thu, 28 Mar 2024 12:48:50 +0900</pubDate>
    </item>
    <item>
      <title>[C++, C#] Lib과 DLL: 왜 lib은 C#에서 사용할 수 없을까?</title>
      <link>https://smoh.tistory.com/507</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&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;200&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4XVAc/btsFJzVZDhS/Mhl92b5Ge57Uc4EOQ7zghk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4XVAc/btsFJzVZDhS/Mhl92b5Ge57Uc4EOQ7zghk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4XVAc/btsFJzVZDhS/Mhl92b5Ge57Uc4EOQ7zghk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4XVAc%2FbtsFJzVZDhS%2FMhl92b5Ge57Uc4EOQ7zghk%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;200&quot; height=&quot;200&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;200&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;일반적으로 lib는 C++에서, dll은 양쪽 모두에서 사용할 수 있는 라이브러리 산출물로 알려져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 이를 당연하게 여기고 별 의문 없이 관습적으로, 사용하던 대로 사용하곤 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에선 lib와 dll이 무엇이고 어떤점이 다르길래 왜 C#에선 lib를 사용할 수 없는지 알아보고자 합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;.lib와 .dll 파일&lt;/h3&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&amp;nbsp;파일과&amp;nbsp;.lib&amp;nbsp;파일은&amp;nbsp;모두&amp;nbsp;C++&amp;nbsp;프로그래밍에서&amp;nbsp;사용되는&amp;nbsp;파일&amp;nbsp;형식입니다.&amp;nbsp;하지만&amp;nbsp;그들의&amp;nbsp;역할과&amp;nbsp;구성은&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;br /&gt;여러 프로그램에서 공유하여 사용할 수 있으며, 코드 및 데이터의 재사용을 용이하게 합니다. dll은 주로&amp;nbsp;라이브러리나&amp;nbsp;플러그인&amp;nbsp;형태로&amp;nbsp;사용되며,&amp;nbsp;함수와&amp;nbsp;데이터를&amp;nbsp;외부에&amp;nbsp;공개하기&amp;nbsp;위한&amp;nbsp;인터페이스&amp;nbsp;역할을&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;.lib 파일은 프로그램이 컴파일될 때 링커(Linker)에 의해 사용되는 라이브러리 파일입니다. 정적 라이브러리라고 부르며 해당 파일에 포함된 코드와 데이터가 컴파일 시에 프로그램에 직접 포함됩니다. &lt;br /&gt;프로그램을 실행할 때 .lib 파일이 필요하지 않으며, 해당 파일에 포함된 코드 및 데이터가 이미 실행 파일에 포함되어 있습니다. 주로&amp;nbsp;컴파일러에&amp;nbsp;의해&amp;nbsp;생성된&amp;nbsp;객체&amp;nbsp;파일(Object&amp;nbsp;File)을&amp;nbsp;묶어&amp;nbsp;놓은&amp;nbsp;형태로&amp;nbsp;사용되며,&amp;nbsp;함수&amp;nbsp;및&amp;nbsp;데이터의&amp;nbsp;정의를&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 파일이 실행 중에 필요한 코드와 데이터를 제공하는 동적 라이브러리인 반면, .lib 파일은 컴파일 시에 링크되는 정적 라이브러리입니다. 또한 .dll 파일은 외부 프로그램에서 호출되고 공유될 수 있지만, .lib 파일은 컴파일 시에 해당 프로그램에 포함되어 실행된다는 점 입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;그래서 왜 C#에서는 lib 파일을 사용할 수 없을까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.lib 파일은 C++에서 사용되는 라이브러리 파일로, 컴파일러에 의해 링크되어 프로그램에 포함됩니다. 이 파일은 주로 함수와 기호의 정의를 포함하고 있을 뿐 .lib 파일 자체는 실행 코드를 포함하고 있지 않습니다. &lt;br /&gt;&lt;br /&gt;C++에서는&amp;nbsp;컴파일&amp;nbsp;시에&amp;nbsp;.lib&amp;nbsp;파일이&amp;nbsp;필요하며,&amp;nbsp;링크&amp;nbsp;과정에서&amp;nbsp;이&amp;nbsp;파일이&amp;nbsp;사용됩니다.&amp;nbsp;그러나&amp;nbsp;C#은&amp;nbsp;.NET&amp;nbsp;Framework&amp;nbsp;또는&amp;nbsp;.NET&amp;nbsp;Core와&amp;nbsp;같은&amp;nbsp;가상&amp;nbsp;머신&amp;nbsp;위에서&amp;nbsp;실행되는&amp;nbsp;고수준&amp;nbsp;언어로,&amp;nbsp;직접적으로&amp;nbsp;.lib&amp;nbsp;파일을&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;불가능합니다. &lt;br /&gt;&lt;br /&gt;대신에,&amp;nbsp;C#에서는&amp;nbsp;Platform&amp;nbsp;Invocation&amp;nbsp;Services(P/Invoke)를&amp;nbsp;통해&amp;nbsp;외부&amp;nbsp;DLL에&amp;nbsp;있는&amp;nbsp;함수들을&amp;nbsp;호출할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;따라서&amp;nbsp;.lib&amp;nbsp;파일을&amp;nbsp;사용하는&amp;nbsp;대신&amp;nbsp;해당&amp;nbsp;.lib&amp;nbsp;파일로부터&amp;nbsp;생성된&amp;nbsp;DLL&amp;nbsp;파일을&amp;nbsp;사용하여&amp;nbsp;P/Invoke를&amp;nbsp;통해&amp;nbsp;함수를&amp;nbsp;호출해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&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;때문입니다.&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;C#&amp;nbsp;코드는&amp;nbsp;CLR(Common&amp;nbsp;Language&amp;nbsp;Runtime)이라고&amp;nbsp;불리는&amp;nbsp;가상&amp;nbsp;머신에서&amp;nbsp;실행됩니다.&amp;nbsp;이는&amp;nbsp;메모리&amp;nbsp;관리,&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;및&amp;nbsp;스레드&amp;nbsp;관리와&amp;nbsp;같은&amp;nbsp;기능을&amp;nbsp;제공합니다.&amp;nbsp;반면에&amp;nbsp;C++&amp;nbsp;코드는&amp;nbsp;운영체제의&amp;nbsp;네이티브&amp;nbsp;코드로&amp;nbsp;컴파일되어&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;C#에서는&amp;nbsp;.lib&amp;nbsp;파일에&amp;nbsp;포함된&amp;nbsp;네이티브&amp;nbsp;코드를&amp;nbsp;직접적으로&amp;nbsp;이해하고&amp;nbsp;호출할&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;대신에,&amp;nbsp;C#에서는&amp;nbsp;P/Invoke를&amp;nbsp;사용하여&amp;nbsp;외부&amp;nbsp;DLL&amp;nbsp;파일에&amp;nbsp;포함된&amp;nbsp;함수들을&amp;nbsp;호출할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이렇게&amp;nbsp;함으로써&amp;nbsp;C#은&amp;nbsp;외부&amp;nbsp;C++&amp;nbsp;코드와&amp;nbsp;상호작용할&amp;nbsp;수&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/507</guid>
      <comments>https://smoh.tistory.com/507#entry507comment</comments>
      <pubDate>Wed, 13 Mar 2024 10:10:35 +0900</pubDate>
    </item>
    <item>
      <title>[C#] LINQ와 람다(Lambda)식</title>
      <link>https://smoh.tistory.com/506</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfyTem/btsFF7DZ9bL/Ey8n6OhBPidjEcyjFKg28K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfyTem/btsFF7DZ9bL/Ey8n6OhBPidjEcyjFKg28K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfyTem/btsFF7DZ9bL/Ey8n6OhBPidjEcyjFKg28K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfyTem%2FbtsFF7DZ9bL%2FEy8n6OhBPidjEcyjFKg28K%2Fimg.jpg&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;237&quot; height=&quot;267&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1440&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;C#에서 LINQ와 람다(Lambda)식에 대해 알아봅니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. LINQ란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LINQ (Language-Integrated Query)는&amp;nbsp;C#&amp;nbsp;언어에&amp;nbsp;통합된&amp;nbsp;쿼리&amp;nbsp;언어입니다.&amp;nbsp;이는&amp;nbsp;데이터&amp;nbsp;소스에서&amp;nbsp;데이터를&amp;nbsp;쿼리하고&amp;nbsp;조작하는&amp;nbsp;데&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;LINQ를&amp;nbsp;사용하면&amp;nbsp;배열,&amp;nbsp;컬렉션,&amp;nbsp;데이터베이스,&amp;nbsp;XML&amp;nbsp;등과&amp;nbsp;같은&amp;nbsp;다양한&amp;nbsp;데이터&amp;nbsp;소스에서&amp;nbsp;데이터를&amp;nbsp;추출하고&amp;nbsp;변환할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;일반적인&amp;nbsp;LINQ&amp;nbsp;쿼리는&amp;nbsp;from,&amp;nbsp;where,&amp;nbsp;select와&amp;nbsp;같은&amp;nbsp;키워드를&amp;nbsp;사용하여&amp;nbsp;데이터를&amp;nbsp;선택하고&amp;nbsp;필터링하는&amp;nbsp;데에&amp;nbsp;사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709877571174&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] numbers = [ 0, 1, 2, 3, 4, 5, 6 ];

// LINQ를 이용해 짝수를 쿼리.
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 람다식(Lambda Expressions)이란?&lt;/h3&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;익명&amp;nbsp;함수를&amp;nbsp;간결하게&amp;nbsp;표현하는&amp;nbsp;방법입니다.&amp;nbsp;주로&amp;nbsp;LINQ와&amp;nbsp;함께&amp;nbsp;사용되며,&amp;nbsp;간단한&amp;nbsp;인라인&amp;nbsp;함수를&amp;nbsp;정의할&amp;nbsp;때&amp;nbsp;효과적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;람다식의&amp;nbsp;일반적인&amp;nbsp;구문은&amp;nbsp;input&amp;nbsp;=&amp;gt;&amp;nbsp;expression&amp;nbsp;형태로&amp;nbsp;표현됩니다.&amp;nbsp;여기서&amp;nbsp;input은&amp;nbsp;매개변수를&amp;nbsp;나타내고,&amp;nbsp;expression은&amp;nbsp;함수의&amp;nbsp;몸체를&amp;nbsp;나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;람다식은&amp;nbsp;더&amp;nbsp;간결하게&amp;nbsp;코드를&amp;nbsp;작성할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;해 주며,&amp;nbsp;LINQ에서는&amp;nbsp;특히&amp;nbsp;읽기&amp;nbsp;쉽고&amp;nbsp;간편한&amp;nbsp;필터&amp;nbsp;및&amp;nbsp;프로젝션&amp;nbsp;작업에&amp;nbsp;자주&amp;nbsp;사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709877812259&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// LINQ에 람다식을 함께 사용.
var evenNumbers = numbers.Where(num =&amp;gt; num % 2 == 0);&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;h3 data-ke-size=&quot;size23&quot;&gt;3. LINQ와 람다식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LINQ와 람다식을 조합하여 사용하면 코드를 간결하게 유지하면서도 더 복잡한 조건이나 작업을 처리할 수 있습니다.&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;1. 람다식은 코드를 더 간결하게 만들어주기 때문에 LINQ와 함께 사용하면 코드가 간편하고 가독성이 높아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 람다식을 사용하면 더 복잡한 조건을 지정할 수 있고, 필요에 따라 쉽게 추가 또는 수정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. LINQ 메서드와 람다식을 함께 사용하면 메서드 체이닝을 통해 여러 작업을 한 줄로 연결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 간단한 연산이나 프로젝션을 람다식 내에서 인라인으로 정의할 수 있어 코드를 더 직관적으로 만들 수 있습니다.&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/C#</category>
      <category>C#</category>
      <category>lambda</category>
      <category>linq</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/506</guid>
      <comments>https://smoh.tistory.com/506#entry506comment</comments>
      <pubDate>Fri, 8 Mar 2024 15:06:29 +0900</pubDate>
    </item>
    <item>
      <title>클래스의 분리와 partial 클래스</title>
      <link>https://smoh.tistory.com/505</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스를 어떻게 분리할 것인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;많은데?&amp;nbsp;하는&amp;nbsp;순간이&amp;nbsp;찾아옵니다. &lt;br /&gt;보통은 별개의 클래스로 나누어 작업을 진행합니다. 하지만 partial class를 사용하면 하나의 클래스를 여러 파일로 나누어 작업을 진행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;작업을 별도의 클래스로 분리하는 경우:&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;(Single&amp;nbsp;Responsibility&amp;nbsp;Principle)을&amp;nbsp;지킬&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;장점이&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;p data-ke-size=&quot;size16&quot;&gt;또한&amp;nbsp;모듈화를&amp;nbsp;통한&amp;nbsp;재사용성&amp;nbsp;향상을&amp;nbsp;기대할&amp;nbsp;수&amp;nbsp;있습니다. &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;재사용하기&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;인해&amp;nbsp;테스트&amp;nbsp;용이성이&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;p data-ke-size=&quot;size16&quot;&gt;하지만&amp;nbsp;클래스&amp;nbsp;수&amp;nbsp;증가로&amp;nbsp;인한&amp;nbsp;복잡도&amp;nbsp;증가가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있습니다. &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;됩니다.&amp;nbsp;클래스가&amp;nbsp;많아지면&amp;nbsp;전체적인&amp;nbsp;코드의&amp;nbsp;이해와&amp;nbsp;유지보수가&amp;nbsp;어려워질&amp;nbsp;수&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;partial&amp;nbsp;클래스로&amp;nbsp;나누어&amp;nbsp;구현하는&amp;nbsp;경우:&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partial 클래스를 사용하면 단일 클래스 내에서 논리적 구분이 가능해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partial 클래스를 사용하면 논리적으로 관련된 코드를 동일한 클래스 내에서 나누어 구현할 수 있습니다. 이로써 클래스의 응집성(cohesion)을 높일 수 있다는 장점을 갖게 됩니다.&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;모듈화 시켜&amp;nbsp;코드를&amp;nbsp;작성함과&amp;nbsp;동시에&amp;nbsp;컴파일&amp;nbsp;시&amp;nbsp;통합되기&amp;nbsp;때문에&amp;nbsp;코드의&amp;nbsp;가독성을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있습니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partial&amp;nbsp;클래스를&amp;nbsp;컴파일&amp;nbsp;시에&amp;nbsp;하나의&amp;nbsp;클래스로&amp;nbsp;통합되기&amp;nbsp;때문에&amp;nbsp;코드를&amp;nbsp;나누어&amp;nbsp;작성하더라도&amp;nbsp;최종적으로는&amp;nbsp;하나의&amp;nbsp;클래스로&amp;nbsp;구현됩니다.&amp;nbsp;따라서&amp;nbsp;코드의&amp;nbsp;가독성을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;그것을&amp;nbsp;따르는 것이&amp;nbsp;좋습니다. &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;수&amp;nbsp;있는&amp;nbsp;방향으로&amp;nbsp;작업을&amp;nbsp;분리하는&amp;nbsp;것이&amp;nbsp;좋습니다.&amp;nbsp; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만&amp;nbsp;프로젝트의&amp;nbsp;구조나&amp;nbsp;특정한&amp;nbsp;상황에&amp;nbsp;따라서는&amp;nbsp;partial&amp;nbsp;클래스를&amp;nbsp;사용하여&amp;nbsp;클래스의&amp;nbsp;일부를&amp;nbsp;나누는&amp;nbsp;것이&amp;nbsp;효과적일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp; &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;자신의&amp;nbsp;상황에&amp;nbsp;적절한&amp;nbsp;방식을&amp;nbsp;선택하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/505</guid>
      <comments>https://smoh.tistory.com/505#entry505comment</comments>
      <pubDate>Fri, 16 Feb 2024 15:18:46 +0900</pubDate>
    </item>
    <item>
      <title>PalWorld(팔월드) 멀티 비밀번호 방 접속 방법</title>
      <link>https://smoh.tistory.com/504</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddi0wM/btsDLIAqrr8/5Hm25iDcSYO2q0ttltYVVk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddi0wM/btsDLIAqrr8/5Hm25iDcSYO2q0ttltYVVk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddi0wM/btsDLIAqrr8/5Hm25iDcSYO2q0ttltYVVk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddi0wM%2FbtsDLIAqrr8%2F5Hm25iDcSYO2q0ttltYVVk%2Fimg.webp&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;805&quot; height=&quot;438&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;438&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;팔월드 멀티 비밀번호방 접속 방법에 대해 알아봅니다. 해당 글은 현재 얼리액세스 버전인 v.0.1.2 버전에 맞춰서 작성하였습니다.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3575&quot; data-origin-height=&quot;1921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kz7s1/btsDQYJjfqn/oNFwKv09MR5lKKG64vHZN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kz7s1/btsDQYJjfqn/oNFwKv09MR5lKKG64vHZN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kz7s1/btsDQYJjfqn/oNFwKv09MR5lKKG64vHZN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkz7s1%2FbtsDQYJjfqn%2FoNFwKv09MR5lKKG64vHZN1%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;3575&quot; height=&quot;1921&quot; data-origin-width=&quot;3575&quot; data-origin-height=&quot;1921&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;b&gt; &quot;멀티 플레이 참가하기(전용서버)&quot;를 클릭 한 뒤 &quot;커뮤니티 서버&quot;에서 IP 및 포트를 직접 입력해 접속을 시도&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1280&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AVtiR/btsDJXkA7cR/cRsmkvjxPgw0ScsyklRKMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AVtiR/btsDJXkA7cR/cRsmkvjxPgw0ScsyklRKMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AVtiR/btsDJXkA7cR/cRsmkvjxPgw0ScsyklRKMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAVtiR%2FbtsDJXkA7cR%2FcRsmkvjxPgw0ScsyklRKMK%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;1280&quot; height=&quot;622&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;622&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 data-ke-size=&quot;size16&quot;&gt;&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;1280&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM0gr9/btsDKy5W0Z4/6aYaFAWOOWaKqEGhdqLqf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM0gr9/btsDKy5W0Z4/6aYaFAWOOWaKqEGhdqLqf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM0gr9/btsDKy5W0Z4/6aYaFAWOOWaKqEGhdqLqf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM0gr9%2FbtsDKy5W0Z4%2F6aYaFAWOOWaKqEGhdqLqf1%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;1280&quot; height=&quot;244&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;244&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;b&gt;&quot;멀티 플레이 참가하기(전용서버)&quot;를 클릭 한 뒤 &quot;최근 접속한 서버&quot;&lt;/b&gt;로 이동하면 아까 입장에 실패했던 방이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1594&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eITyX8/btsDQf5wF0a/4rxOkGb1ndQ8UWDO0u6Bz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eITyX8/btsDQf5wF0a/4rxOkGb1ndQ8UWDO0u6Bz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eITyX8/btsDQf5wF0a/4rxOkGb1ndQ8UWDO0u6Bz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeITyX8%2FbtsDQf5wF0a%2F4rxOkGb1ndQ8UWDO0u6Bz1%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;1594&quot; height=&quot;848&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;848&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 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Game</category>
      <category>Palworld</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/504</guid>
      <comments>https://smoh.tistory.com/504#entry504comment</comments>
      <pubDate>Mon, 22 Jan 2024 20:18:55 +0900</pubDate>
    </item>
    <item>
      <title>PalWorld(팔월드) Dedicate Server(전용 서버) 구축</title>
      <link>https://smoh.tistory.com/503</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvJrfB/btsDJY4J52N/auNnKNBkblk4BTxlRXIuJK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvJrfB/btsDJY4J52N/auNnKNBkblk4BTxlRXIuJK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvJrfB/btsDJY4J52N/auNnKNBkblk4BTxlRXIuJK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvJrfB%2FbtsDJY4J52N%2FauNnKNBkblk4BTxlRXIuJK%2Fimg.webp&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;805&quot; height=&quot;438&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;438&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 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;h3 data-ke-size=&quot;size23&quot;&gt;0. 준비&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전용 서버를 구동할 PC 혹은 서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 전 Ubuntu 서버에 구축하였습니다. SteamCmd를 설치하는 방법부터 설명하오니 &lt;b&gt;Windows를 사용하는 분은 &quot;2. PalWorld Dedicated Server 설치&quot;부터&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. SteamCmd 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연하지만 가장 먼저 스팀을 설치해야 합니다. 만약 GUI가 지원되는 PC라면 웹 브라우저를 열고 &lt;a href=&quot;https://store.steampowered.com/about/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Steam 페이지로 들어가 Steam을 설치&lt;/a&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 GUI를 지원하지 않으면 CMD를 설치해야 합니다.&amp;nbsp; 다음 명령어로 steam이라는 유저를 생성(Steam 로그인 계정이 아닙니다.)합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705907875430&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; sudo useradd -m steam
&amp;gt; sudo passwd steam&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;유저를 생성한 뒤 권한을 부여해야 합니다. 다음 명령어를 수행해 sudoers를 열어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705907929075&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; sudo vi /etc/sudoers&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;이제 생성한 steam 유저에 권한을 부여합니다. &quot; root ALL=(ALL:ALL:) ALL&quot;를 찾아 그 아래애 다음과 같이 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705907970599&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
root ALL=(ALL:ALL:) ALL
steam ALL=(ALL:ALL) ALL
...&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;다음엔 생성한 steam 유저로 로그인해 SteamCmd를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705908011754&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; sudo useradd -m steam
&amp;gt; sudo passwd steam
&amp;gt; sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
&amp;gt; sudo apt install steamcmd&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. PalWorld Dedicated Server 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Windows나 Ubuntu Desktop(GUI)를 사용한다면 Steam을 열고 라이브러리로 이동한 다음 &quot; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;PalWorld Dedicated Server&quot;를 설치하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1238&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JWkVt/btsDJZWRuHp/OdnxQvNB7R1FVCD15eXuU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JWkVt/btsDJZWRuHp/OdnxQvNB7R1FVCD15eXuU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JWkVt/btsDJZWRuHp/OdnxQvNB7R1FVCD15eXuU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJWkVt%2FbtsDJZWRuHp%2FOdnxQvNB7R1FVCD15eXuU1%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;805&quot; height=&quot;394&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;606&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;간단하게 PalWorld Dedicated Server 설치가 끝났습니다.&lt;b&gt; &quot;3. 서버 설정&quot;으로 가서 나머지 글을 읽어주세요.&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;만약 Ubuntu Server(CLI)를 사용한다면 다음 명령어를 통해 PalWorld Dedicated Server를 설치해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705908355010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; steamcmd +login anonymous +app_update 2394010 validate +quit
&amp;gt; cd ~/Steam/steamapps/common/PalServer
&amp;gt; ./PalServer.sh&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;./PalServer.sh 명령어를 수행하면 자동으로 전용 서버가 시작됩니다. 만약 다음과 같은 오류가 발생한다면 추가 명령어 수행이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; .steam/sdk64/steamclient.so: cannot open shared object file: No such file or directory &lt;/b&gt;&lt;/blockquote&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;pre id=&quot;code_1705908454231&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; mkdir -p ~/.steam/sdk64/
&amp;gt; steamcmd +login anonymous +app_update 1007 +quit
&amp;gt; cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/&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;이제 다시 ./PalServer.sh를 수행하면 정상적으로 서버가 구동됩니다.&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;** 참고: 다음과 같은 오류가 발생하는 것은 정상으로 서버 구동에 문제가 없습니다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;$ ./PalServer.sh &lt;br /&gt;Shutdown handler: initalize. &lt;br /&gt;Increasing per-process limit of core file size to infinity. &lt;br /&gt;&lt;b&gt;dlopen failed trying to load: steamclient.so with error: steamclient.so: cannot open shared object file: No such file or directory&lt;/b&gt; &lt;br /&gt;[S_API] SteamAPI_Init(): Loaded '/home/ubuntu/.steam/sdk64/steamclient.so' OK. (First tried local 'steamclient.so')&lt;/blockquote&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 서버 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다른 친구들이 내 서버에 접속할 수 있게 만들어야 합니다. 만약 자신이 &lt;b&gt;퍼블릭 IP를 직접 사용하고 있다면 이 설명은 스킵&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;하지만 내 전용 서버가 공유기에 연결되어 있는 경우에는 포트포워딩이 필요합니다. 포트포워딩의 개념이나 원리에 대해서는 스킵하고 설정하는 방법에 대해서만 설명합니다.&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;먼저 크롬과 같은 웹 브라우저를 열고 http://192.168.0.1/의 주소(IPTime 공유기 기준)로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1272&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sz0XM/btsDJVAmQ44/55oK9rYiSKF7GbIvgRkADK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sz0XM/btsDJVAmQ44/55oK9rYiSKF7GbIvgRkADK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sz0XM/btsDJVAmQ44/55oK9rYiSKF7GbIvgRkADK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsz0XM%2FbtsDJVAmQ44%2F55oK9rYiSKF7GbIvgRkADK%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;1272&quot; height=&quot;454&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;454&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;b&gt;관리도구 &amp;gt; 고급설정 &amp;gt; NAT/라우터 구성 &amp;gt; 포트포워드 설정&lt;/b&gt;으로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1550&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp8KlQ/btsDKy5MpHy/PQsx0RWGNdY8yHM9i7DMa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp8KlQ/btsDKy5MpHy/PQsx0RWGNdY8yHM9i7DMa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp8KlQ/btsDKy5MpHy/PQsx0RWGNdY8yHM9i7DMa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp8KlQ%2FbtsDKy5MpHy%2FPQsx0RWGNdY8yHM9i7DMa1%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;1550&quot; height=&quot;680&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;680&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;이제 위와 같이 PalServer에 대한 포트포워드 구성을 진행합니다. 최소 하나의 항목을 추가해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1138&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GTmNG/btsDQ6mQagg/DP08uKw8RnHhemKIHKeT9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GTmNG/btsDQ6mQagg/DP08uKw8RnHhemKIHKeT9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GTmNG/btsDQ6mQagg/DP08uKw8RnHhemKIHKeT9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGTmNG%2FbtsDQ6mQagg%2FDP08uKw8RnHhemKIHKeT9k%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;1138&quot; height=&quot;225&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;225&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;1. 규칙이름: 포트포워드 설정을 구성하는 이름입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 내부 IP 추소: 전용 서버가 설치된 PC의 IP 주소입니다. 만약 관리페이지를 전용 서버가 설치된 PC에서 들어갔다면 체크박스를 클릭해 간단하게 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 프로토콜: 해당 포트를 사용하는 프로토콜입니다. &lt;b&gt;PalWorld는 기본적으로 UDP를 사용하는 것으로 알려져 있습니다&amp;nbsp;&amp;nbsp;&lt;/b&gt;전 그냥 둘 다 활성화시켜놨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 외부 포트: 외부망에서 공유기로 접속할 때 사용하는 포트입니다. 포트포워드 설정에 겹치지 않게 적절하게 수정하셔도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 내부포트: 전용서버가 사용하는 포트입니다. &lt;b&gt;PalWorld는 기본적으로 8211 포트를 사용합니다&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;** 참고: 내부포트 &lt;b&gt;8211은 서버에서 사용하고 27015는 Query에, 25575는 RCON에 사용된다고 알려져 있습니다. 서버만 구동하는 데에는 8211 포트만 설정해도 서버는 구동됩니다.&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 게임 설정&lt;/h3&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;p data-ke-size=&quot;size16&quot;&gt;서버 설정파일은 다음에 위치하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows: \Steam\steamapps\common\PalServer\Pal\Saved\Config\WindowsServer\PalWorldSettings.ini&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux: ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini&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;Windows: \Steam\steamapps\common\PalServer\DefaultPalWorldSettings.ini&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;~/Steam/steamapps/common/PalServer/DefaultPalWorldSettings.ini &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DefaultPalWorldSettings.ini에 있는 내용을 복사해 PalWorldSettings.ini에 적용시키면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705909574844&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName=&quot;Default Palworld Server&quot;,ServerDescription=&quot;&quot;,AdminPassword=&quot;&quot;,ServerPassword=&quot;&quot;,PublicPort=8211,PublicIP=&quot;&quot;,RCONEnabled=False,RCONPort=25575,Region=&quot;&quot;,bUseAuth=True,BanListURL=&quot;https://api.palworldgame.com/api/banlist.txt&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딱 두줄만 복사하면 됩니다. &lt;s&gt;줄 바꿈을 하시면 안됩니다. 줄바꿈을 하는 경우 설정이 무효화되어 이전 설정값으로 바뀌거나 기본 설정값이 사용됩니다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(수정) 줄바꿈해도 적용 됩니다. 다만, &lt;b&gt;게임이 실행중일떄 설정을 바꾼 후 게임을 종료하게되면 기존 게임 설정으로 롤백&lt;/b&gt;됩니다. 미리 설정을 바꾸고 서버를 빠르게 재시작하려고 했는데 설정이 롤백되는것을 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 설정값은 &lt;a href=&quot;https://tech.palworldgame.com/optimize-game-balance&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 홈페이지(Optimize game balance, Settings)&lt;/a&gt;에서 확인 후 변경하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 방 이름과 암호만 바꾸려면 다음 값을 수정해 주시면 됩니다.&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;1. ServerName=&quot;Default Palworld Server&quot; =&amp;gt; 방 이름을 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ServerPassword=&quot;&quot; =&amp;gt; 방에 접속할 때 비밀번호를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. AdminPassword=&quot;&quot; =&amp;gt; 방에 접속 후 관리자 명령어를 사용할 떄 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 명령어는 마인크래프트에서 tp 같은 명령어를 사용할 때 쓰는 것과 동일하다고 생각하시면 됩니다. 관리자 명령어는 &lt;a href=&quot;https://tech.palworldgame.com/server-commands&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 홈페이지(Commands)&lt;/a&gt;에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 서버를 구동합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows: \Steam\steamapps\common\PalServer\PalServer.exe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux: ~/Steam/steamapps/common/PalServer/PalServer.sh&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 접속: 암호가 있는 방에 IP로 접속하기&lt;/h3&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;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3594&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efqjqB/btsDQbveVp1/n7lujHo48F8474yKRwspa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efqjqB/btsDQbveVp1/n7lujHo48F8474yKRwspa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efqjqB/btsDQbveVp1/n7lujHo48F8474yKRwspa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefqjqB%2FbtsDQbveVp1%2Fn7lujHo48F8474yKRwspa0%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;3594&quot; height=&quot;756&quot; data-origin-width=&quot;3594&quot; data-origin-height=&quot;756&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 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;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OflZE/btsDJWMQqLU/6gfPPU2rqYTSuQo6BfUCoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OflZE/btsDJWMQqLU/6gfPPU2rqYTSuQo6BfUCoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OflZE/btsDJWMQqLU/6gfPPU2rqYTSuQo6BfUCoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOflZE%2FbtsDJWMQqLU%2F6gfPPU2rqYTSuQo6BfUCoK%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;583&quot; height=&quot;103&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;196&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;일단 그림과 같이 IP와 포트를 입력해 직접 접속합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1892&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KHbm1/btsDIBPZEer/ddXHgvZng0NbUFmyan3ya1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KHbm1/btsDIBPZEer/ddXHgvZng0NbUFmyan3ya1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KHbm1/btsDIBPZEer/ddXHgvZng0NbUFmyan3ya1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKHbm1%2FbtsDIBPZEer%2FddXHgvZng0NbUFmyan3ya1%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;533&quot; height=&quot;259&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;920&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;우린 암호를 입력하지 않았으므로 접속에 실패합니다. 다시 전용서버 화면으로 이동합니다. 이번에는 직접 IP를 입력하는 게 아니라 &quot;최근 접속한 서버&quot;를 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;2978&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4dKay/btsDKJfdYox/tKt8X051iLBqZ5rICXJnCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4dKay/btsDKJfdYox/tKt8X051iLBqZ5rICXJnCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4dKay/btsDKJfdYox/tKt8X051iLBqZ5rICXJnCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4dKay%2FbtsDKJfdYox%2FtKt8X051iLBqZ5rICXJnCK%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;2978&quot; height=&quot;568&quot; data-origin-width=&quot;2978&quot; data-origin-height=&quot;568&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 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;&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;</description>
      <category>Trunk</category>
      <category>Game</category>
      <category>Palworld</category>
      <category>server</category>
      <category>steam</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/503</guid>
      <comments>https://smoh.tistory.com/503#entry503comment</comments>
      <pubDate>Mon, 22 Jan 2024 17:01:21 +0900</pubDate>
    </item>
    <item>
      <title>[DICOM] PDU와 PDV</title>
      <link>https://smoh.tistory.com/502</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WekA8/btsByluxTxI/7fPhNgLeR1FgS4sRMNFAW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WekA8/btsByluxTxI/7fPhNgLeR1FgS4sRMNFAW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WekA8/btsByluxTxI/7fPhNgLeR1FgS4sRMNFAW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWekA8%2FbtsByluxTxI%2F7fPhNgLeR1FgS4sRMNFAW1%2Fimg.jpg&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;379&quot; height=&quot;97&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;97&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;DICOM 통신에 기본이 되는 PDU와 PDV에 대해 알아봅니다.&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. PDU - Protocol Data Unit&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;680&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJxguE/btsByr9iR1G/DreRj9lMhnhl1gihbXcCjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJxguE/btsByr9iR1G/DreRj9lMhnhl1gihbXcCjk/img.png&quot; data-alt=&quot;https://www.dicomstandard.org/current&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJxguE/btsByr9iR1G/DreRj9lMhnhl1gihbXcCjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJxguE%2FbtsByr9iR1G%2FDreRj9lMhnhl1gihbXcCjk%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;680&quot; height=&quot;672&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.dicomstandard.org/current&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림은 &lt;span style=&quot;background-color: #ffffff; color: #252525; text-align: start;&quot;&gt;DICOM UL 중 A-ASSOCIATE-RQ PDU와 A-ASSOCIATE-AC PDU의 PDU 인코딩의 예시입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #252525; text-align: start;&quot;&gt;PDU(Protocol Data Unit)는 계층 내의 피어 엔터티 간에 교환되는 메시지 형식입니다. PDU는 프로토콜 제어 정보와 사용자 데이터로 구성됩니다. PDU는 필수 고정 필드와 하나 이상의 항목 및/또는 하위 항목을 포함하는 선택적 가변 필드로 구성됩니다.&lt;/span&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;* PDU는 네트워크 통신에서 데이터를 전송하는 데 사용되는 단위입니다. &lt;br /&gt;* DICOM에서 PDU는 네트워크 상에서 DICOM 메시지를 나타내는 단위를 말합니다. &lt;br /&gt;* PDU는 DICOM 메시지의 헤더 정보와 함께 전송되어야 합니다. &lt;br /&gt;* DICOM 네트워크 프로토콜에서는 PDU가 통신의 기본적인 단위로 사용되며, 여러 종류의 PDU가 정의되어 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. PDV - Presentation-data-value&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PDV는 DICOM 메시지의 일부로, 특히 DICOM 데이터를 전송하는 데 사용됩니다. DICOM 메시지는 PDU (Protocol Data Unit)의 일부로 전송되며, PDU에는 여러 PDV가 포함될 수 있습니다.&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;PDV는 실제 DICOM 데이터를 담고 있는 부분으로 다양한 종류의 PDV가 존재하고, 각 PDV 유형은 특정한 역할을 수행합니다.&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;* PDV는 PDU 내에서 실제 데이터를 포함하는 부분을 나타냅니다. &lt;br /&gt;* PDU는 여러 PDV를 포함할 수 있습니다. &lt;br /&gt;* PDV는 DICOM 메시지의 일부로, 실제 DICOM 데이터를 포함하고 있습니다. &lt;br /&gt;* PDV는 PDU의 일부로 전송되어, 네트워크 상에서 DICOM 데이터의 전송을 담당합니다.&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;&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;&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;</description>
      <category>Trunk/DICOM</category>
      <category>Dicom</category>
      <category>pdu</category>
      <category>PDV</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/502</guid>
      <comments>https://smoh.tistory.com/502#entry502comment</comments>
      <pubDate>Fri, 8 Dec 2023 07:57:32 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Alpine을 사용하는 이유</title>
      <link>https://smoh.tistory.com/501</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&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;750&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd0hf2/btsAKR1AXgq/arf1E1jky9E6qLTq5hklj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd0hf2/btsAKR1AXgq/arf1E1jky9E6qLTq5hklj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd0hf2/btsAKR1AXgq/arf1E1jky9E6qLTq5hklj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd0hf2%2FbtsAKR1AXgq%2Farf1E1jky9E6qLTq5hklj0%2Fimg.jpg&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;750&quot; height=&quot;422&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 앞선 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 이미지의 태그들 중에서 -alpine이라는 태그가 달려있는 이미지들을 자주 볼 수 있습니다. 이 글에선 alpine이 무엇인지, 왜 사용하는지에 대해서 알아봅니다.&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://nickjanetakis.com/blog/the-3-biggest-wins-when-using-alpine-as-a-base-docker-image&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The 3 Biggest Wins When Using Alpine as a Base Docker Image&lt;/a&gt;을 번역 한 글입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Alpine?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alpine은 다음과 같이 설명됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Small. Simple. Secure. Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.&lt;br /&gt;&lt;i&gt;- 가볍고 단순하며 안전합니다. 알파인 리눅스는 musl libc와 busybox를 기반으로 한 보안지향의 경량 리눅스 배포판입니다.&lt;/i&gt;&lt;/blockquote&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 가장 큰 이점은 컨테이너의 용량이 작아진다는 것입니다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세탁과 같은 상황에서 줄어든다는 것은 나쁜 상황이겠지만 Docker의 세계에서는 Docker 이미지가 더 작아진다는 의미이므로 기대할만한 상황이 됩니다.&lt;br /&gt;&lt;br /&gt;Alpine&amp;nbsp;3.6의&amp;nbsp;Dockerized&amp;nbsp;버전의&amp;nbsp;무게는&amp;nbsp;3.98MB입니다. &lt;br /&gt;&lt;br /&gt;비교를 위해 Alpine을 다른 인기 Linux 배포판과 비교해 보자면 그 크기는 다음 표와 같습니다:&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #3a4044; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;DISTRIBUTION&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;VERSION&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SIZE&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Debian&lt;/td&gt;
&lt;td&gt;Jessie&lt;/td&gt;
&lt;td&gt;123MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CentOS&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;193MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fedora&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;231MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;16.04&lt;/td&gt;
&lt;td&gt;118MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #27ae60;&quot;&gt;Alpine&lt;/td&gt;
&lt;td style=&quot;color: #27ae60;&quot;&gt;3.6&lt;/td&gt;
&lt;td style=&quot;color: #27ae60;&quot;&gt;3.98MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기 차이 좀 보세요. 알파인은 데비안보다 약 30배 작습니다. &lt;br /&gt;&lt;br /&gt;Docker Hub는 수많은 풀을 처리합니다. API를 조사해 보면 이 글이 작성되는 시점(2017년도 기준)에 Debian에 35,555,107개의 pull이, Alpine은 135,136,475개의 pull이 있었음을 알 수 있습니다. &lt;br /&gt;&lt;br /&gt;이러한 pull로 인해 모든 바이트가 전송될까요? 아마도 그렇지 않을 것입니다. 그러나 당신이 한 예상은 제가 한 것처럼 좋을 것입니다. 최소한 상황을 보는 관점은 되어줍니다.&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;S3를 통해 Debian과 Alpine을 최대 3,500만 번 전송하는 데 드는 예상 비용:&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #3a4044; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;DISTRIBUTION&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;GIGS TRANSFERRED&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;S3 TRANSFER COST&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Debian&lt;/td&gt;
&lt;td&gt;4,373,278&lt;/td&gt;
&lt;td&gt;$416,310.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #27ae60;&quot;&gt;Alpine&lt;/td&gt;
&lt;td style=&quot;color: #27ae60;&quot;&gt;141,509&lt;/td&gt;
&lt;td style=&quot;color: #27ae60;&quot;&gt;$17,832.06&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3의 가격 계산기 비용으로 Debian과 Alpine을 최대 3,500만 번 전송하는 데 거의 $400,000 USD의 차이가 발생하게 됩니다.. &lt;br /&gt;&lt;br /&gt;아마도 여러분이 그 정도의 규모로 운영하고 있지 않을 것이라는 건 압니다. 그러나 모든 규모 수준에서 클라우드의 전송 비용에 있어서는 실질적인 절감 효과가 있습니다. &lt;br /&gt;&lt;br /&gt;이미지&amp;nbsp;크기를&amp;nbsp;100MB&amp;nbsp;이상&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;것은&amp;nbsp;큰&amp;nbsp;일입니다. &lt;br /&gt;&lt;br /&gt;많은 패키지가 설치된 실제 웹 애플리케이션에서 Alpine을 사용하면 최종 이미지 크기가 2배 또는 3배 정도 절약되므로 마이크로 벤치마크에만 유용한 것은 아닙니다. 최대 100MB 절약은 이미지에 무엇이 내장되어 있는지에 관계없이 고정되어 있는 이점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 알파인은 빠릅니다.&lt;/h3&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;작은&amp;nbsp;Docker&amp;nbsp;이미지를&amp;nbsp;처리할&amp;nbsp;때&amp;nbsp;비용만이&amp;nbsp;유일한&amp;nbsp;장점은&amp;nbsp;아닙니다. &lt;br /&gt;&lt;br /&gt;Docker 이미지를 다운로드하고&amp;nbsp; CURL을 설치하고 싶다고 가정해 보겠습니다. Debian과 Alpine의 경우 시간이 얼마나 걸릴까요?&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;2가지&amp;nbsp;테스트를&amp;nbsp;수행하겠습니다. &lt;br /&gt;&lt;br /&gt;첫 번째 테스트는 30MB 가정용 케이블 연결을 사용하여 기본 Docker 이미지를 시스템에 다운로드하고 CURL을 설치할 것이며 시스템에 이미지가 다운로드되어있지 않은 환경입니다.&lt;br /&gt;&lt;br /&gt;두 번째 테스트는 CURL을 설치하기 전에 시스템에 이미 기본 Docker 이미지가 있다는 점을 제외하면 위와 동일합니다.&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;테스트 1의 결과:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;## Debian&lt;br /&gt;time docker run --rm debian sh -c &quot;apt-get update &amp;amp;&amp;amp; apt-get install curl&quot; &lt;br /&gt;real 0m 27.928s &lt;br /&gt;user 0m 0.019s &lt;br /&gt;sys 0m 0.077s&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debian을 모두 다운로드하고 apt-get 업데이트를 실행한 다음 CURL을 설치하는 데 실제 시간은 약 28초입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;## Alpine&lt;br /&gt;time docker run --rm alpine sh -c &quot;apk update &amp;amp;&amp;amp; apk add curl&quot; &lt;br /&gt;real 0m 5.698s &lt;br /&gt;user 0m 0.008s &lt;br /&gt;sys 0m 0.037s&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 Alpine을 사용하면 약 5배 더 빠르게 완료되었습니다. 28초와 5초를 기다리는 것을 비교하는 건 가벼운 게 아닙니다. 상당한 시간입니다. &lt;br /&gt;&lt;br /&gt;프로그래밍 테스트가 30초 또는 5초 안에 완료될 때까지 기다리는 것이 얼마나 짜증 나는 일인지 생각해 보십시오.&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의 결과:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;## Debian&lt;br /&gt;time docker run --rm debian sh -c &quot;apt-get update &amp;amp;&amp;amp; apt-get install curl&quot; &lt;br /&gt;real 0m 9.170s &lt;br /&gt;user 0m 0.000s &lt;br /&gt;sys 0m 0.031s&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명히 30MB 케이블이 병목 현상을 일으키고 있어 apt-get update를 실행하고 컬을 설치하는 데에는 9초 이상이 걸렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;##Alpine&lt;br /&gt;&lt;br /&gt;time docker run --rm alpine sh -c &quot;apk update &amp;amp;&amp;amp; apk add curl&quot;&lt;br /&gt;real 0m 3.040s &lt;br /&gt;user 0m 0.017s &lt;br /&gt;sys 0m 0.008s&lt;/blockquote&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초 만에 완료했습니다. 약 3배 정도 개선된 셈입니다.&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;새 Docker 이미지를 새로운 서버로 다운로드할 때 Alpine에서 초기 풀링 속도가 상당히 빨라질 것으로 예상할 수 있습니다. 네트워크 속도가 느릴수록 그 차이는 더 커집니다. &lt;br /&gt;&lt;br /&gt;자동 확장 기능이 있고 많은 서버를 가동하는 경우라면 이는 매우 큰 문제입니다. 이는 서버가 더 빠른 속도로 트래픽을 수용할 준비가 되었음을 의미합니다. &lt;br /&gt;&lt;br /&gt;서버를&amp;nbsp;많이&amp;nbsp;가동하지&amp;nbsp;않으면&amp;nbsp;속도&amp;nbsp;이점이&amp;nbsp;크게&amp;nbsp;떨어지지만&amp;nbsp;데이터&amp;nbsp;전송&amp;nbsp;및&amp;nbsp;저장&amp;nbsp;비용은&amp;nbsp;여전히&amp;nbsp;100MB&amp;nbsp;이상&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;h3 data-ke-size=&quot;size23&quot;&gt;4. 알파인은 안전합니다.&lt;/h3&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;훨씬&amp;nbsp;작은&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;장점은&amp;nbsp;공격을&amp;nbsp;받는&amp;nbsp;표면적이&amp;nbsp;훨씬&amp;nbsp;적다는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;시스템에&amp;nbsp;패키지와&amp;nbsp;라이브러리가&amp;nbsp;많지&amp;nbsp;않으면&amp;nbsp;잘못될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;일이&amp;nbsp;거의&amp;nbsp;없습니다. &lt;br /&gt;&lt;br /&gt;몇 년 전에 &quot;ShellShock&quot;이라는 이름으로 공격해 해커가 피해를 입은 경우 컴퓨터에 대한 제어권을 얻을 수 있는 불쾌한 Bash 공격이 있었습니다. &lt;br /&gt;&lt;br /&gt;알파인에는 Bash는 기본적으로 설치되지 않기 때문에 해당 공격에서 무사했습니다..&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;또한 대부분의 배포판은 기본적으로 수많은 서비스를 실행합니다. 최신 Debian 또는 Ubuntu 시스템의 ps aux 출력 길이는 1마일이나 됩니다. 이는 Docker가 아닌 설정에서는 합리적일 수 있지만 Dockerized 애플리케이션에는 기본적으로 시작되는 대부분의 작업이 필요하지 않을 가능성이 있습니다.&lt;br /&gt;&lt;br /&gt;알파인은&amp;nbsp;훨씬&amp;nbsp;다른&amp;nbsp;접근&amp;nbsp;방식을&amp;nbsp;취합니다.&amp;nbsp;기본적으로&amp;nbsp;너무&amp;nbsp;많이&amp;nbsp;시작하지&amp;nbsp;않으며&amp;nbsp;필요한&amp;nbsp;것만&amp;nbsp;시작하기를&amp;nbsp;기대합니다.&amp;nbsp;이는&amp;nbsp;Dockerized&amp;nbsp;애플리케이션에&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;가장&amp;nbsp;적합한&amp;nbsp;도구를&amp;nbsp;사용하세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;알파인은&amp;nbsp;보안&amp;nbsp;전반에&amp;nbsp;대해서도&amp;nbsp;강력한&amp;nbsp;입장을&amp;nbsp;취했습니다.&amp;nbsp;개발팀은&amp;nbsp;특정&amp;nbsp;패키지를&amp;nbsp;보다&amp;nbsp;안전한&amp;nbsp;버전으로&amp;nbsp;교체하는&amp;nbsp;것을&amp;nbsp;두려워하지&amp;nbsp;않습니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;&lt;a href=&quot;https://lists.alpinelinux.org/~alpine/devel/%3CCY1PR04MB22018D6330ACAF944E652032FEDF0%40CY1PR04MB2201.namprd04.prod.outlook.com%3E&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OpenSSL을&amp;nbsp;LibreSSL로&amp;nbsp;대체했습니다.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;위에 링크된 페이지에서 이 인용문이 정말 마음에 듭니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;While OpenSSL is trying to fix the broken code, libressl has simply removed it.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;- OpenSSL이 손상된 코드를 수정하려고 시도하는 동안 libressl은 이를 제거했습니다.&lt;/i&gt;&lt;/blockquote&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;span style=&quot;color: #666666; text-align: left;&quot;&gt;제&amp;nbsp;생각엔&amp;nbsp;이것이&amp;nbsp;바로&amp;nbsp;알파인의&amp;nbsp;특징이라고&amp;nbsp;생각합니다.&amp;nbsp;작고&amp;nbsp;안전한&amp;nbsp;Linux&amp;nbsp;배포판이&amp;nbsp;되겠다는&amp;nbsp;약속을&amp;nbsp;실제로&amp;nbsp;실천하고&amp;nbsp;있습니다.&amp;nbsp;기본&amp;nbsp;Docker&amp;nbsp;이미지로&amp;nbsp;사용될&amp;nbsp;때&amp;nbsp;Docker와&amp;nbsp;함께&amp;nbsp;사용하기에&amp;nbsp;완벽한&amp;nbsp;콤보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming</category>
      <category>alpine</category>
      <category>docker</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/501</guid>
      <comments>https://smoh.tistory.com/501#entry501comment</comments>
      <pubDate>Thu, 23 Nov 2023 09:31:45 +0900</pubDate>
    </item>
    <item>
      <title>[RabbitMQ] Docker에 RabbitMQ 실행하기</title>
      <link>https://smoh.tistory.com/499</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1280&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csvkfs/btsswkcsgp5/eikWvAJFQnapbkBgDOf4lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csvkfs/btsswkcsgp5/eikWvAJFQnapbkBgDOf4lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csvkfs/btsswkcsgp5/eikWvAJFQnapbkBgDOf4lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsvkfs%2Fbtsswkcsgp5%2FeikWvAJFQnapbkBgDOf4lk%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;1280&quot; height=&quot;201&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;RabbitMQ를 Docker Container로 실행하는 방법에 대해 알아봅니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 준비사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 포스트는 Docker 및 docker-compose를 이용해 RabbitMQ를 실행합니다. Docker와 docker compose를 미리 준비합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. docker-compose.yml&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 docker-compose.yml 파일을 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693286559572&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'
services:
  rabbitmq:
    image: rabbitmq:3.12.4-management-alpine
    container_name: smoh-rabbitmq
    volumes:
      - ./rabbitmq-data/etc/:/etc/rabbitmq/
      - ./rabbitmq-data/data/:/var/lib/rabbitmq/
      - ./rabbitmq-data/logs/:/var/log/rabbitmq/
    ports:
      - &quot;5672:5672&quot;
      - &quot;15672:15672&quot;
    environment:
      RABBITMQ_ERLANG_COOKIE: &quot;RabbitMQ-Cookies&quot;
      RABBITMQ_DEFAULT_USER: &quot;smoh&quot;
      RABBITMQ_DEFAULT_PASS: &quot;password&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 컨테이너 실행 및 rabbit management 활성화&lt;/h3&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;pre id=&quot;code_1693286626854&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;740&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q0cnA/btssvcTdOAA/OcEEsELeURGGLKMist5pl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q0cnA/btssvcTdOAA/OcEEsELeURGGLKMist5pl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q0cnA/btssvcTdOAA/OcEEsELeURGGLKMist5pl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq0cnA%2FbtssvcTdOAA%2FOcEEsELeURGGLKMist5pl1%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;740&quot; height=&quot;93&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;93&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;컨테이너가 실행되면 다음 명령어를 통해 bash로 진입합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693286650511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it ##### /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;728&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvkCFp/btssho8ksOH/qtbYfkrai3YqNMFyz16j2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvkCFp/btssho8ksOH/qtbYfkrai3YqNMFyz16j2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvkCFp/btssho8ksOH/qtbYfkrai3YqNMFyz16j2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvkCFp%2Fbtssho8ksOH%2FqtbYfkrai3YqNMFyz16j2K%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;728&quot; height=&quot;247&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;247&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;bash에서 다음 명령어를 수행해 rabitmq-management를 활성화시켜 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693286681895&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rabbitmq-plugins enable rabbitmq_management&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;720&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUgpwv/btsshr46EBr/0ygxoYybVEvFFd1KIVyt51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUgpwv/btsshr46EBr/0ygxoYybVEvFFd1KIVyt51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUgpwv/btsshr46EBr/0ygxoYybVEvFFd1KIVyt51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUgpwv%2Fbtsshr46EBr%2F0ygxoYybVEvFFd1KIVyt51%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;720&quot; height=&quot;335&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;335&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 접속 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose에 작성한 WebUI 포트로 접속해 계정 및 암호를 입력한 뒤 Management 페이지를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;575&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sbyTg/btssvY1u93g/QReLdY577JqdgkdPviKm40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sbyTg/btssvY1u93g/QReLdY577JqdgkdPviKm40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sbyTg/btssvY1u93g/QReLdY577JqdgkdPviKm40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsbyTg%2FbtssvY1u93g%2FQReLdY577JqdgkdPviKm40%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;575&quot; height=&quot;227&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;227&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E3MJp/btssBmAxNXr/mRJQZUik1AxmdlaPkAJHPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E3MJp/btssBmAxNXr/mRJQZUik1AxmdlaPkAJHPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E3MJp/btssBmAxNXr/mRJQZUik1AxmdlaPkAJHPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE3MJp%2FbtssBmAxNXr%2FmRJQZUik1AxmdlaPkAJHPK%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;929&quot; height=&quot;475&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;475&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 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;&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;</description>
      <category>Programming</category>
      <category>docker</category>
      <category>docker-compose</category>
      <category>RabbitMQ</category>
      <author>비만오리</author>
      <guid isPermaLink="true">https://smoh.tistory.com/499</guid>
      <comments>https://smoh.tistory.com/499#entry499comment</comments>
      <pubDate>Tue, 29 Aug 2023 14:31:32 +0900</pubDate>
    </item>
  </channel>
</rss>