<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>비를 긋다</title>
    <link>https://rammuking.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 00:24:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jiung.</managingEditor>
    <image>
      <title>비를 긋다</title>
      <url>https://tistory1.daumcdn.net/tistory/1513389/attach/f241fb43fcfc4ebd889b4f6df167db61</url>
      <link>https://rammuking.tistory.com</link>
    </image>
    <item>
      <title>누니주얼리(NOONEE) 웨딩 밴드 상담 및 계약 후기</title>
      <link>https://rammuking.tistory.com/entry/noonee-jewelry-wedding-band-review</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oi9PG/dJMcacPb95I/onzi5WTX0q6tvbSSw4oyE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oi9PG/dJMcacPb95I/onzi5WTX0q6tvbSSw4oyE1/img.png&quot; data-alt=&quot;매장 전경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oi9PG/dJMcacPb95I/onzi5WTX0q6tvbSSw4oyE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foi9PG%2FdJMcacPb95I%2Fonzi5WTX0q6tvbSSw4oyE1%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;679&quot; height=&quot;1207&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;매장 전경&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;b&gt;'누니주얼리(NOONEE)'&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자연에서 영감을 받은 텍스처&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문 전, 누니주얼리에 대한 후기들을 찾아봤을 때 &quot;실물이 훨씬 낫다&quot;는 이야기를 많이 봤는데 직접 매장에 가보니 그 이유를 알 수 있었습니다.&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;손누니 디자이너가 이끄는 NOONEE는 &lt;b&gt;자연의 질감&lt;/b&gt;을 반지에 그대로 옮겨온 듯한 디자인이 특징입니다. 나무의 결을 살린 'Like a Tree', 산등성이의 능선을 담은 'The Ridge', 달 표면을 형상화한 'From the Moon' 등 라인업 하나하나가 명확한 컨셉을 가지고 있었습니다.&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;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nrooh/dJMcafZsbDh/mc8KAmvZdg5KfLnJjclzmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nrooh/dJMcafZsbDh/mc8KAmvZdg5KfLnJjclzmK/img.png&quot; data-alt=&quot;매장 내 1층 진열장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nrooh/dJMcafZsbDh/mc8KAmvZdg5KfLnJjclzmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnrooh%2FdJMcafZsbDh%2Fmc8KAmvZdg5KfLnJjclzmK%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;538&quot; height=&quot;956&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;매장 내 1층 진열장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;토너먼트 방식으로 취향 좁히기&lt;/h4&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;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;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;의외의 취향 발견, 절제된 화려함&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상담 전까지 저희는 &quot;무조건 심플한 디자인&quot;이 취향이라고 생각했습니다. 하지만 토너먼트 끝에 선택된 반지는 예상외로 화려한 디자인이었습니다.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWHJLr/dJMcadmYPJf/L3x3wblJsHR9po6plktpOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWHJLr/dJMcadmYPJf/L3x3wblJsHR9po6plktpOk/img.png&quot; data-alt=&quot;Love Letter / Fractal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWHJLr/dJMcadmYPJf/L3x3wblJsHR9po6plktpOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWHJLr%2FdJMcadmYPJf%2FL3x3wblJsHR9po6plktpOk%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;522&quot; height=&quot;928&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Love Letter / Fractal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;남다른 반짝임의 인게이지먼트 링&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소 반지를 잘 끼지 않는 여자친구는 특별한 날에 존재감을 드러낼 수 있는&amp;nbsp;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eL5hPu/dJMcabQhPD6/8yclCqYAKHWKCuegSB7Mv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eL5hPu/dJMcabQhPD6/8yclCqYAKHWKCuegSB7Mv0/img.png&quot; data-alt=&quot;Love Letter / Fractal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eL5hPu/dJMcabQhPD6/8yclCqYAKHWKCuegSB7Mv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeL5hPu%2FdJMcabQhPD6%2F8yclCqYAKHWKCuegSB7Mv0%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;611&quot; height=&quot;1086&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;2364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Love Letter / Fractal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;늦은 시간까지 이어진 세심한 배려&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상담 후 다른 곳과 고민을 거듭했지만, 결국 &quot;이건 내 반지다&quot;라는 확신이 든 곳은 누니뿐이라 상담사님 퇴근 시간 직전에 급하게 다시 매장을 찾았습니다.&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;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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마치며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기대를 안 하고 갔던 곳이 가장 만족스러운 선택지가 되었습니다. &lt;b&gt;누니(NOONEE)&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;figure id=&quot;og_1765892680363&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;네이버지도&quot; data-og-description=&quot;누니 NOONEE 한남본점&quot; data-og-host=&quot;map.naver.com&quot; data-og-source-url=&quot;https://naver.me/xKERrIve&quot; data-og-url=&quot;https://map.naver.com/p/entry/place/1938805518?placePath=/home&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DNDk1/hyZPqEwpNT/K5KVYy13Mi6z2AUjXNhCI1/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/bcsiiV/hyZPvy5l9w/at1w29z5o4MawyPQn230lk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://naver.me/xKERrIve&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://naver.me/xKERrIve&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DNDk1/hyZPqEwpNT/K5KVYy13Mi6z2AUjXNhCI1/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/bcsiiV/hyZPvy5l9w/at1w29z5o4MawyPQn230lk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;네이버지도&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;누니 NOONEE 한남본점&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;map.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>라이프/결혼</category>
      <category>결혼반지</category>
      <category>누니주얼리</category>
      <category>웨딩링</category>
      <category>웨딩밴드</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/266</guid>
      <comments>https://rammuking.tistory.com/entry/noonee-jewelry-wedding-band-review#entry266comment</comments>
      <pubDate>Tue, 16 Dec 2025 23:17:38 +0900</pubDate>
    </item>
    <item>
      <title>보조배터리 셀 종류 완벽 비교 및 보조배터리 추천: 리튬 폴리머 vs 리튬 이온(하드셀) vs 반고체</title>
      <link>https://rammuking.tistory.com/entry/power-bank-cell-types-comparison</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;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5JnuR/dJMcafd0tEh/gMTyJC3eU0XSTDB3tgKiGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5JnuR/dJMcafd0tEh/gMTyJC3eU0XSTDB3tgKiGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5JnuR/dJMcafd0tEh/gMTyJC3eU0XSTDB3tgKiGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5JnuR%2FdJMcafd0tEh%2FgMTyJC3eU0XSTDB3tgKiGK%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보조배터리를 구매할 때 보통 용량(mAh)과 가격을 가장 먼저 확인합니다. 하지만 막상 제품을 받아보면 생각보다 무겁거나, 사용 중 발열이 심해 불안함을 느끼는 경우가 종종 있습니다.&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;b&gt;'배터리 셀(Cell)'의 종류&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;리튬 폴리머&lt;/b&gt;, &lt;b&gt;리튬 이온(하드셀)&lt;/b&gt;, 그리고 차세대 기술인 &lt;b&gt;반고체 배터리&lt;/b&gt;의 기술적 차이와 장단점을 명확하게 정리해 드립니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 얇고 가벼운 휴대성: 리튬 폴리머 (Li-Polymer)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 출시되는 맥세이프 보조배터리나 슬림형 모델의 90% 이상이 채택하고 있는 방식입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;구조적 특징:&lt;/b&gt; 액체 전해질 대신 &lt;b&gt;젤(Gel) 또는 고체 형태의 고분자 전해질&lt;/b&gt;을 사용합니다. 형태 변형이 자유로워 초박형이나 곡면 디자인으로 제작이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점 (Pros):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;휴대성:&lt;/b&gt; 동일 면적 대비 얇고 가볍게 제작할 수 있어 휴대용 기기에 적합합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안전성:&lt;/b&gt; 전해질이 젤 형태라 외부 충격 시 누액이 발생하지 않으며, 폭발 위험이 리튬 이온 대비 낮습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점 (Cons):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제조 공정이 까다로워 상대적으로 가격대가 높습니다. &lt;b&gt;(10,000mAh 기준 보통 2~4만 원대 형성)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;외부의 뾰족한 충격(찍힘)에 약하여 파우치 형태의 셀이 손상될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  추천 대상:&lt;/b&gt; 데일리로 가볍게 들고 다닐 제품을 찾는 분 (스마트폰 1회 충전용 등)&lt;br /&gt;&lt;a href=&quot;https://artmu.co.kr/product/detail.html?product_no=2312&amp;amp;cate_no=476&amp;amp;display_group=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Qi2 15W 맥세이프 초고속 무선충전 보조배터리 10000mAh QB110 블랙&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 고출력과 가성비: 리튬 이온 하드셀 (Li-Ion)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 '건전지' 모양으로 알고 있는 원통형 배터리(18650, 21700 규격)가 내장된 형태입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;구조적 특징:&lt;/b&gt; 금속 캔(Hard Case) 안에 &lt;b&gt;액체 전해질&lt;/b&gt;을 주입한 방식입니다. 테슬라 등 전기차에 사용되는 것과 동일한 구조로 에너지 밀도가 높습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점 (Pros):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가성비:&lt;/b&gt; 생산 효율이 좋고 단가가 저렴합니다. 대용량 배터리를 합리적인 가격에 구매할 수 있습니다. &lt;b&gt;(10,000mAh 기준 약 1~2만 원대 / 가성비 최상)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능:&lt;/b&gt; 에너지 밀도가 높고 출력이 우수하여 노트북 충전 등 고부하 작업에 유리합니다. 수명(사이클) 또한 비교적 긴 편입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점 (Cons):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원통형 셀 자체의 무게와 부피 때문에 제품을 얇게 만드는 데 한계가 있습니다. (묵직함)&lt;/li&gt;
&lt;li&gt;고온이나 과충전 시 액체 전해질의 팽창 및 폭발 위험이 구조적으로 존재합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  추천 대상:&lt;/b&gt; 캠핑, 장기 출장 등 대용량이 필요하거나 노트북 충전을 주로 하는 분&lt;br /&gt;&lt;a href=&quot;https://prod.danawa.com/info/?pcode=51548918&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;유그린 25000mAh 145W 보조배터리 PD PPS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 안전성 중심의 신기술: 반고체 배터리 (Semi-Solid)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전기차(EV) 및 ESS 시장의 안전성 이슈를 해결하기 위해 등장한 기술로, 최근 보조배터리 시장에도 도입되기 시작했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;구조적 특징:&lt;/b&gt; 액체 전해질과 고체 전해질을 혼합한 &lt;b&gt;하이브리드 형태&lt;/b&gt;입니다. 액체 배터리의 공정 호환성을 유지하면서 안전성을 대폭 강화했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점 (Pros):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;안전성 극대화:&lt;/b&gt; 액체 비율을 줄여 열 폭주(화재) 및 누액 위험을 획기적으로 낮췄습니다. 현존하는 상용 배터리 중 가장 안전한 축에 속합니다.&lt;/li&gt;
&lt;li&gt;리튬 이온 대비 높은 에너지 밀도를 구현할 잠재력이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점 (Cons):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아직 상용화 초기 단계라 시중에서 제품을 찾기 어렵고, 가격 접근성이 떨어집니다. &lt;b&gt;(해외 직구 기준 약 10만 원 내외)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  추천 대상:&lt;/b&gt; 가격보다는 '안전'을 최우선 가치로 두는 얼리어답터&lt;br /&gt;&lt;a href=&quot;https://www.vova.co.kr/product/%EB%B3%B4%EB%B0%94-qi2-%EB%A7%A5%EC%84%B8%EC%9D%B4%ED%94%84-%EA%B3%A0%EC%86%8D-%EB%AC%B4%EC%84%A0%EC%B6%A9%EC%A0%84-%EB%A7%A5%EC%84%B8%EC%9D%B4%ED%94%84-%EB%B3%B4%EC%A1%B0%EB%B0%B0%ED%84%B0%EB%A6%AC-5000mah-va-108/138/category/26/display/1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;보바 Qi2 반고체셀 고속 무선충전 맥세이프 보조배터리 5000mAh VA-108&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;한눈에 보는 3종 비교 요약&lt;/b&gt;&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;구분&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;b&gt;리튬 폴리머&lt;/b&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;b&gt;리튬 이온 (하드셀)&lt;/b&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;b&gt;반고체 셀&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;슬림형 디자인, 경량화&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;원통형, 고효율, 가성비&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;하이브리드, 고안전성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;무게/두께&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;가벼움 / 얇음&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;무거움 / 두꺼움&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;안전성&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;우수 (누액 없음)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;보통 (열/충격 주의)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;매우 우수&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;가격대 (체감)&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;2~4만 원대&lt;/b&gt; (다소 높음)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;1~2만 원대&lt;/b&gt; (저렴함)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;10만 원대~&lt;/b&gt; (높음)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론 및 구매 가이드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배터리 셀 종류에 정답은 없으며, 본인의 &lt;b&gt;사용 목적&lt;/b&gt;에 맞춰 선택하는 것이 중요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;휴대성 우선:&lt;/b&gt; 가방 무게를 줄이고 싶다면 고민 없이 &lt;b&gt;[리튬 폴리머]&lt;/b&gt; 제품을 선택하십시오.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용량/가성비 우선:&lt;/b&gt; 20,000mAh 이상의 대용량이 필요하거나 캠핑용이라면 &lt;b&gt;[리튬 이온(하드셀)]&lt;/b&gt; 제품이 합리적입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안전 우선:&lt;/b&gt; 최신 기술을 경험하고 싶고 안전에 민감하다면 &lt;b&gt;[반고체]&lt;/b&gt; 탑재 모델을 고려해 볼 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt; 기내 반입 규정은 셀 종류가 아닌 &lt;b&gt;배터리 용량(Wh)&lt;/b&gt;을 기준으로 합니다. 여행 전 소지한 배터리의 용량이 160Wh(약 40,000mAh)를 초과하지 않는지 확인하시기 바랍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>라이프/IT</category>
      <category>가벼운 보조배터리 추천</category>
      <category>기내반입 규정</category>
      <category>대용량 보조배터리 비교</category>
      <category>리튬 폴리머 vs 리튬 이온</category>
      <category>반고체 배터리</category>
      <category>보조배터리 종류</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/265</guid>
      <comments>https://rammuking.tistory.com/entry/power-bank-cell-types-comparison#entry265comment</comments>
      <pubDate>Tue, 2 Dec 2025 10:59:36 +0900</pubDate>
    </item>
    <item>
      <title>엘레바또 맞춤 예복 계약 후기: 영국 '폭스' 원단, 여름 예식에도 선택한 이유</title>
      <link>https://rammuking.tistory.com/entry/elevato-bespoke-suit-fox-brothers-review</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3213&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CqDkw/dJMcaiuXWfZ/KIYWJUFkSHUFU16rNc2UTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CqDkw/dJMcaiuXWfZ/KIYWJUFkSHUFU16rNc2UTk/img.png&quot; data-alt=&quot;엘레바또 프라이빗 상담실 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CqDkw/dJMcaiuXWfZ/KIYWJUFkSHUFU16rNc2UTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCqDkw%2FdJMcaiuXWfZ%2FKIYWJUFkSHUFU16rNc2UTk%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;3213&quot; height=&quot;5712&quot; data-origin-width=&quot;3213&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엘레바또 프라이빗 상담실 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;영국 원단 특유의 묵직하고 클래식한 핏은 포기 못 하겠는데, 한여름 예식이라 땀 범벅이 될까 봐 걱정이신가요? 저 역시 &lt;b&gt;'멋이냐, 시원함이냐'&lt;/b&gt;를 두고 정말 많이 고민했습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;결론부터 말씀드리면 저는 청담&lt;b&gt; 엘레바또(Elevato)&lt;/b&gt;에서 가장 탄탄하다는 &lt;b&gt;'폭스 브라더스(Fox Brothers)'&lt;/b&gt; 원단을 선택했습니다. 더위를 많이 타는 제가 두꺼운 영국 원단을 과감하게 선택할 수 있었던 이유와 상담 실장님이 알려주신 &lt;b&gt;비스포크 공법의 비밀&lt;/b&gt;을 공유합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 엘레바또 상담 환경: 프라이빗 룸에서 진행된 1:1 컨설팅&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;결혼 준비를 하며 여러 예복 샵을 다녀봤지만, 엘레바또 매장에 처음 방문했을 때 가장 인상 깊었던 점은 &lt;b&gt;독립된 개인 상담실&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;오픈된 공간에서 여러 팀이 섞여 상담받는 것이 아니라, 조용한 룸에서 우리끼리만 대화할 수 있어 온전히 옷에만 집중할 수 있었습니다. 덕분에 &quot;이런 질문해도 되나?&quot; 싶은 사소한 궁금증도 편안하게 물어볼 수 있었던 점이 계약의 첫 번째 이유였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 체계적인 원단 비교 및 피팅 (테일러의 실착용 후기)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;상담 과정에서 원단의 차이점(이태리 vs 영국)을 단순히 말로만 듣는 게 아니라, 실제 샘플을 만져보고 입어보며 비교할 수 있었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;특히 상담을 도와주신 실장님께서 제가 고민하던 원단과 &lt;b&gt;동일한 원단으로 제작된 정장&lt;/b&gt;을 입고 계셨습니다. 본인이 왜 이 원단을 선택했는지, 실제 입어보니 어떤 점이 좋았는지 경험담을 들려주시니 신뢰가 갔습니다. 옷의 완성된 핏을 눈앞에서 직접 확인하니 확신이 생기더군요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 기분 좋은 채촌 과정과 세심한 배려&lt;/h2&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;치수를 재는 '채촌' 과정에서도 전문가의 세심함이 느껴졌습니다. 전문가 앞에서 치수를 재는 게 쑥스러울 수 있는데, &quot;비율이 좋으시다&quot;며 칭찬해 주시고 편안한 분위기를 만들어 주셨습니다. 자세를 잡는 법부터 친절하게 리드해 주셔서 기분 좋게 진행할 수 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3213&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2s9G6/dJMcacaudao/RUKSk4KheRkfIAPC9sHU5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2s9G6/dJMcacaudao/RUKSk4KheRkfIAPC9sHU5K/img.png&quot; data-alt=&quot;엘레바또 프라이빗 상담실 입구&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2s9G6/dJMcacaudao/RUKSk4KheRkfIAPC9sHU5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2s9G6%2FdJMcacaudao%2FRUKSk4KheRkfIAPC9sHU5K%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;3213&quot; height=&quot;5712&quot; data-origin-width=&quot;3213&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엘레바또 프라이빗 상담실 입구&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 영국 원단 비교: 가벼운 '킹스밀' vs 탄탄한 '폭스 브라더스'&lt;/h2&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;저는 개인적으로 무게감 있게 뚝 떨어지는 &lt;b&gt;영국 원단의 매트한 핏&lt;/b&gt;을 선호합니다. 하지만 평소 더위를 좀 타는 편이라 &quot;여름 예식에 두꺼운 원단이 괜찮을까?&quot;가 가장 큰 난관이었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;킹스밀(Kingsmill) / 로얄애스콧:&lt;/b&gt; 영국 원단 중 비교적 가볍다고 알려져 고려했으나, 막상 확인해 보니 이태리 원단 같은 특유의 광택감이 느껴졌습니다. 제가 원하는 중후한 맛은 조금 부족했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;폭스 브라더스(Fox Brothers):&lt;/b&gt; 상위 라인인 폭스를 입어보니, 탄탄한 조직감과 매트한 질감이 제가 찾던 바로 그 느낌이었습니다. (문제는 더위였죠.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 여름 예복 팁: 접착식(MTM)보다 비스포크(수제)가 시원한 이유&lt;/h2&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;이 고민을 해결해 준 건 담당자분의 전문적인 솔루션이었습니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;23&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;23,0&quot; data-ke-size=&quot;size16&quot;&gt;&quot;신랑님, &lt;b&gt;비스포크(수제)&lt;/b&gt; 방식으로 제작하면 안감을 접착제로 붙이지 않고 한 땀 한 땀 바느질로 연결하기 때문에 통풍이 훨씬 잘 됩니다. 원단 자체는 무게감이 있어도 구조적으로 바람이 잘 통하기 때문에, 얇지만 접착 심지를 쓰는 엔트리급 원단보다 오히려 더 쾌적합니다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;이 설명을 듣고 머리가 맑아지는 기분이었습니다. &lt;b&gt;'오픈 위브(Open Weave)'&lt;/b&gt; 조직감을 가진 폭스 원단과 접착제를 쓰지 않는 비스포크 공법이 만나면 여름 예식도 충분히 가능하다는 결론을 내렸습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;25&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;접착식 (MTM)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비스포크 (수제)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,1,0,0&quot;&gt;&lt;b&gt;제작 방식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,1,1,0&quot;&gt;접착 심지 사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,1,2,0&quot;&gt;비접착 (바느질 연결)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,2,0,0&quot;&gt;&lt;b&gt;통기성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,2,1,0&quot;&gt;접착제로 인해 통풍 막힘&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,2,2,0&quot;&gt;&lt;b&gt;구조적 통풍 우수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,3,0,0&quot;&gt;&lt;b&gt;추천 대상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,3,1,0&quot;&gt;가성비 중시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;25,3,2,0&quot;&gt;&lt;b&gt;핏과 착용감 중시&lt;/b&gt;&lt;/span&gt;&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;예비 신부도 &quot;이때 아니면 언제 이런 좋은 원단 입어보겠냐&quot;며 응원해 준 덕분에 과감하게 &lt;b&gt;폭스 브라더스&lt;/b&gt;로 결정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSpQ6x/dJMcab3IS3T/TS7Kn5t5h2RBsEXnDoc9ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSpQ6x/dJMcab3IS3T/TS7Kn5t5h2RBsEXnDoc9ZK/img.png&quot; data-alt=&quot;엘레바또&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSpQ6x/dJMcab3IS3T/TS7Kn5t5h2RBsEXnDoc9ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSpQ6x%2FdJMcab3IS3T%2FTS7Kn5t5h2RBsEXnDoc9ZK%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;2268&quot; height=&quot;4032&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엘레바또&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 견적 및 제이웨딩 박람회 혜택&lt;/h2&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로 가격적인 부분도 상당히 만족스러웠습니다. 하이엔드 원단을 선택했음에도 체감가는 합리적이었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;30&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;제이웨딩 박람회 프로모션:&lt;/b&gt; 박람회 계약을 통해 기본 할인 적용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현장 추가 혜택:&lt;/b&gt; 당일 계약 등으로 예산 범위 내로 진입&lt;/li&gt;
&lt;li&gt;&lt;b&gt;혼주 구두 서비스:&lt;/b&gt; 제 구두뿐만 아니라 &lt;b&gt;양가 아버님 맞춤 구두&lt;/b&gt;까지 무료 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;예복을 맞추면서 효도까지 챙길 수 있어 정말 감사했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBS30T/dJMcaajrkYG/MP3qBYe4r0UmpbDrBg5kVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBS30T/dJMcaajrkYG/MP3qBYe4r0UmpbDrBg5kVk/img.png&quot; data-alt=&quot;엘레바또 맞춤 구두&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBS30T/dJMcaajrkYG/MP3qBYe4r0UmpbDrBg5kVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBS30T%2FdJMcaajrkYG%2FMP3qBYe4r0UmpbDrBg5kVk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엘레바또 맞춤 구두&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 총평: 후회 없는 선택, 엘레바또&lt;/h2&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;엘레바또는 단순히 옷을 파는 곳이 아니라, 고객의 체형과 고민(더위, 핏)을 분석해 &lt;b&gt;최적의 솔루션을 컨설팅해 주는 곳&lt;/b&gt;이라는 느낌을 받았습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;영국 원단의 멋진 핏을 원하지만 착용감이 걱정되시는 분들은 꼭 한번 상담 받아보시길 추천합니다. 특히 비스포크 공법에 대한 설명을 들어보시면 저처럼 선택의 기준이 명확해지실 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHEjHK/dJMcagcTHbj/QhfWQqfn4IW4nM59imPIP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHEjHK/dJMcagcTHbj/QhfWQqfn4IW4nM59imPIP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHEjHK/dJMcagcTHbj/QhfWQqfn4IW4nM59imPIP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHEjHK%2FdJMcagcTHbj%2FQhfWQqfn4IW4nM59imPIP0%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;765&quot; height=&quot;1024&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>라이프/결혼</category>
      <category>elevato</category>
      <category>결혼준비</category>
      <category>맞춤예복</category>
      <category>신랑예복</category>
      <category>엘레바또</category>
      <category>엘레바또비스포크</category>
      <category>여름예복</category>
      <category>영국원단</category>
      <category>제이웨딩</category>
      <category>청담예복</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/264</guid>
      <comments>https://rammuking.tistory.com/entry/elevato-bespoke-suit-fox-brothers-review#entry264comment</comments>
      <pubDate>Sat, 29 Nov 2025 02:30:58 +0900</pubDate>
    </item>
    <item>
      <title>웨딩홀 투어 체크리스트 엑셀 공유  &amp;zwj;♀️ 계약 전 보증인원, 식간격 안 보면 후회해요!</title>
      <link>https://rammuking.tistory.com/entry/wedding-hall-tour-checklist-excel-tips</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ImoCQ/dJMb99Y5tdc/IUtKz872KbEKKKhmy70MGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ImoCQ/dJMb99Y5tdc/IUtKz872KbEKKKhmy70MGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ImoCQ/dJMb99Y5tdc/IUtKz872KbEKKKhmy70MGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FImoCQ%2FdJMb99Y5tdc%2FIUtKz872KbEKKKhmy70MGk%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결혼 준비의 설렘을 안고 처음 방문한 웨딩홀. 화려한 조명과 꽃장식에 마음을 뺏기기 십상이죠. &quot;여기서 하면 정말 예쁘겠다!&quot;라는 생각이 드는 순간, 덜컥 계약서에 서명하고 싶어질지도 모릅니다.&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;b&gt;똑소리 나게 웨딩홀을 고르고 계약하는 법&lt;/b&gt;을 하나하나 알려드릴게요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 투어 전, 우리만의 '원픽' 기준 세우기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무작정 투어를 나가기 전에 두 분이 머리를 맞대고 &lt;b&gt;'절대 포기할 수 없는 것'&lt;/b&gt;이 무엇인지 이야기해보세요. 기준이 없으면 상담 실장님의 화려한 말솜씨에 휘둘리기 딱 좋거든요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;어떤 분위기를 원하세요?&lt;/b&gt;&lt;br /&gt;웅장하고 어두운 홀에서 스포트라이트를 받고 싶다면 &lt;b&gt;'컨벤션'&lt;/b&gt;, 밝고 화사한 파티 분위기를 원한다면 &lt;b&gt;'하우스 웨딩'&lt;/b&gt;이 좋겠죠? (단, 하우스 웨딩은 꽃장식 추가금이 꽤 나올 수 있어요!)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;밥이냐, 주차냐, 분위기냐!&lt;/b&gt;&lt;br /&gt;&quot;하객들에게 맛있는 밥은 꼭 대접해야 해&quot; vs &quot;주차가 불편하면 욕먹어&quot; 등 두 분만의 우선순위를 정해가면 결정하기 훨씬 수월해요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pNQMs/dJMcaawVBiA/1FLVMY5l411iQApOW1uQV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pNQMs/dJMcaawVBiA/1FLVMY5l411iQApOW1uQV0/img.png&quot; data-alt=&quot;웨딩홀 스타일별(컨벤션 vs 하우스 vs 채플) 장단점 비교표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pNQMs/dJMcaawVBiA/1FLVMY5l411iQApOW1uQV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpNQMs%2FdJMcaawVBiA%2F1FLVMY5l411iQApOW1uQV0%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웨딩홀 스타일별(컨벤션 vs 하우스 vs 채플) 장단점 비교표&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;b&gt;[필독] 예식 간격, '60분'과 '90분'의 엄청난 차이&lt;/b&gt;&lt;br /&gt;&quot;1시간이면 충분하지 않나?&quot;라고 생각하셨나요? 천만의 말씀!  &amp;zwj;♀️ 예식 간격은 결혼식 날 신부의 마음 평화를 좌우합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;쫓겨나는 신부 대기실:&lt;/b&gt; 앞 타임 예식과 간격이 좁으면, 내가 도착했을 때 앞 타임 신부님이 아직 대기실을 쓰고 있을 수도 있어요. 반대로 식이 끝나자마자 다음 신부를 위해 후다닥 짐을 빼줘야 하죠. 우아하게 하객을 맞이하려면 &lt;b&gt;신부 대기실 사용 시간&lt;/b&gt;이 넉넉한지 꼭 체크하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원판 사진 전쟁:&lt;/b&gt; 예식이 끝나고 친인척, 친구, 직장 동료들과 사진 찍는 시간, 생각보다 오래 걸려요. 시간이 촉박하면 사진 작가님이 &quot;빨리 나오세요!&quot;, &quot;다음 분 서세요!&quot; 소리치느라 시장통이 따로 없답니다. 여유롭게 웃으며 추억을 남기려면 &lt;b&gt;앞뒤 예식 간격이 충분한지&lt;/b&gt;&amp;nbsp;반드시 확인해야 해요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;[중요] 보증인원, &quot;서로 커버 되나요?&quot;&lt;/b&gt;&lt;br /&gt;최소 보증인원이 200명이라고 칩시다. 보통 신랑 100명, 신부 100명으로 예상하죠. 그런데 막상 당일에 &lt;b&gt;신랑 측 하객이 50명만 오고, 신부 측 하객이 150명이 왔다면?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;합산 정산(통합 정산) 가능 여부 확인:&lt;/b&gt; 융통성 있는 곳은 합쳐서 200명이 넘었으니 문제없다고 해줍니다. 이를 &lt;b&gt;'보증인원 합산'&lt;/b&gt;이라고 해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;각각 정산의 함정:&lt;/b&gt; 하지만 깐깐한 곳은 &quot;신랑 측은 50명 왔어도 계약대로 100명분 돈 내세요&quot;라고 할 수 있어요. (신부 측 150명은 별도로 다 내고요!) 억울하게 생돈 날리지 않으려면, &lt;b&gt;&quot;신랑, 신부 하객 수를 합산해서 보증인원을 채워도 되나요?&quot; &lt;/b&gt;라고 꼭 물어보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 하객 빙의해서 걸어보기: 꼼꼼한 현장 답사&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웨딩홀 투어 때는 신랑 신부가 아니라, &lt;b&gt;'초대받은 하객'의 마음&lt;/b&gt;으로 걸어보세요. 예쁜 인테리어보다 더 중요한 게 보일 거예요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동선 체크:&lt;/b&gt; 주차장에서 로비로, 홀에서 연회장으로 가는 길이 복잡하진 않나요? 어르신들이 계단을 오르내려야 한다면 곤란하겠죠? 엘리베이터 대수도 체크 필수!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신부대기실 디테일:&lt;/b&gt; 신부가 가장 오래 머무는 곳, 안에 &lt;b&gt;전용 화장실&lt;/b&gt;이 있는지가 생각보다 정말 중요해요! (드레스 입고 로비 화장실 가는 건... 상상만 해도 힘들죠?  )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpL78p/dJMcafrsUXz/LZKuorsFMjTEqJ28KaQkNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpL78p/dJMcafrsUXz/LZKuorsFMjTEqJ28KaQkNK/img.png&quot; data-alt=&quot;하객의 입장에서 바라본 웨딩홀의 이상적인 동선&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpL78p/dJMcafrsUXz/LZKuorsFMjTEqJ28KaQkNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpL78p%2FdJMcafrsUXz%2FLZKuorsFMjTEqJ28KaQkNK%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하객의 입장에서 바라본 웨딩홀의 이상적인 동선&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 주차장, 숫자놀음에 속지 마세요  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;주차 3,000대 가능!&quot;이라는 홍보 문구, 정말 든든해 보이죠? 하지만 여기에 함정이 있을 수 있어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;우리만의 공간인가요?&lt;/b&gt; 쇼핑몰이나 오피스 건물이라면 주말 쇼핑객들과 주차장을 나눠 써야 해요. &quot;실제 우리 하객이 쓸 자리는 넉넉한가요?&quot;라고 물어보세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;만차 시 대책은?&lt;/b&gt; 주차장이 꽉 찼을 때 &quot;알아서 대고 오세요&quot;라고 하면 대참사! 근처 외부 주차장을 섭외해 두었는지, 셔틀버스는 있는지 확인하는 센스!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q895N/dJMcabo37Gp/u4pypnJCOVTvPkgMMv59w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q895N/dJMcabo37Gp/u4pypnJCOVTvPkgMMv59w1/img.png&quot; data-alt=&quot;만차 시 외부 주차장 안내 및 셔틀버스 운영&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q895N/dJMcabo37Gp/u4pypnJCOVTvPkgMMv59w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq895N%2FdJMcabo37Gp%2Fu4pypnJCOVTvPkgMMv59w1%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;만차 시 외부 주차장 안내 및 셔틀버스 운영&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 견적서, 돋보기 들고 다시 봅시다  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;식대 5만 원&quot;이라는 말만 믿고 예산을 짰다가 나중에 큰코다칠 수 있어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;부가세와 봉사료의 마법:&lt;/b&gt; 5만 원에 봉사료 5%, 부가세 10%가 붙으면 약 5만 8천 원이 돼요. 하객 300명이면 200만 원 넘게 차이가 나죠. 상담할 때는 항상 &lt;b&gt;&quot;세금, 봉사료 포함한 최종 가격이 얼마인가요?&quot;&lt;/b&gt;라고 물어보세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;숨은 비용 찾기:&lt;/b&gt; 식대 외에도 꽃장식 업그레이드, 폐백 수모비, 플라워 샤워, 음주류(병당 계산인지 확인!) 등 추가될 수 있는 비용들을 꼼꼼히 챙기세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &quot;스냅 업체, 제가 고르면 안 되나요?&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웨딩홀에서 &quot;본식 사진은 저희 필수 지정 업체를 쓰셔야 해요&quot;라고 할 때가 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀 조명을 잘 아는 작가님일 수도 있지만, 내 스타일이 아닐 수도 있잖아요? 무조건 &quot;네&quot; 하지 마시고, &lt;b&gt;&quot;외부 업체를 부르면 위약금이 있나요?&quot;&lt;/b&gt;라고 정중하게 물어보세요. 불공정한 끼워팔기는 거절할 권리가 있답니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 계약서의 깨알 같은 글씨가 나를 지킨다  ️&lt;/h3&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;&lt;b&gt;취소/환불 규정:&lt;/b&gt; 사람 일은 모르잖아요. 취소 시 위약금이 정부의 &lt;b&gt;'소비자분쟁해결기준'&lt;/b&gt;보다 너무 불리하진 않은지 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;불가항력 조항:&lt;/b&gt; 감염병이나 천재지변으로 예식을 못 하게 될 때, 위약금 없이 날짜를 변경해 주는지 확인하는 건 선택이 아니라 필수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw65Mn/dJMcahivZ65/8luOhFEp66l9q6rdLkzDIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw65Mn/dJMcahivZ65/8luOhFEp66l9q6rdLkzDIK/img.png&quot; data-alt=&quot;웨딩홀 투어 체크리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw65Mn/dJMcahivZ65/8luOhFEp66l9q6rdLkzDIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw65Mn%2FdJMcahivZ65%2F8luOhFEp66l9q6rdLkzDIK%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웨딩홀 투어 체크리스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  에디터의 마지막 당부&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 숨 가쁘게 달려왔네요! 마지막으로 딱 하나만 기억해 주세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;기록되지 않은 약속은 약속이 아닙니다.&quot;&lt;/b&gt;&lt;/p&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;&quot;서비스로 해드릴게요~&quot;, &quot;나중에 챙겨드릴게요&quot;라는 말은 계약서 특약 사항에 적지 않으면 나중에 딴소리를 들어도 할 말이 없어요.   구두로 약속한 모든 혜택은 꼼꼼히 적어서 서명을 받아두세요.&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;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/pwzoD/dJMcai9vQ55/phPMg7KTJgh5gzZKHqTQB1/%EC%9B%A8%EB%94%A9%ED%99%80%20%EA%B3%84%EC%95%BD%EC%A0%84%20%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8.xlsx?attach=1&amp;amp;knm=tfile.xlsx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;웨딩홀 계약전 체크리스트.xlsx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>라이프/결혼</category>
      <category>결혼식장 비용</category>
      <category>본식 스냅 위약금</category>
      <category>웨딩홀 견적 비교</category>
      <category>웨딩홀 계약 팁</category>
      <category>웨딩홀 당일 혜택</category>
      <category>웨딩홀 보증인원 합산</category>
      <category>웨딩홀 식간격</category>
      <category>웨딩홀 주차 꿀팁</category>
      <category>웨딩홀 투어 체크리스트</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/263</guid>
      <comments>https://rammuking.tistory.com/entry/wedding-hall-tour-checklist-excel-tips#entry263comment</comments>
      <pubDate>Thu, 20 Nov 2025 23:36:56 +0900</pubDate>
    </item>
    <item>
      <title>9.주간 C# 서버 챌린지: Docker 배포 및 구조적 로깅</title>
      <link>https://rammuking.tistory.com/entry/9%EC%A3%BC%EA%B0%84-C-%EC%84%9C%EB%B2%84-%EC%B1%8C%EB%A6%B0%EC%A7%80-Docker-%EB%B0%B0%ED%8F%AC-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%A0%81-%EB%A1%9C%EA%B9%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caL6uN/dJMcadG8Kyg/FpGeo0hQLlYabjREOgRmQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caL6uN/dJMcadG8Kyg/FpGeo0hQLlYabjREOgRmQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caL6uN/dJMcadG8Kyg/FpGeo0hQLlYabjREOgRmQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaL6uN%2FdJMcadG8Kyg%2FFpGeo0hQLlYabjREOgRmQk%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 개발 환경(Visual Studio)에서 잘 돌아가는 것과 실제 운영 환경(Production)에서 잘 돌아가는 것은 전혀 다른 이야기입니다. 서버를 클라우드에 배포하고, 문제가 생겼을 때 원격으로 진단할 수 있어야 진정한 '서비스'가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주에는 서버를 &lt;b&gt;'배포 가능한 상태'&lt;/b&gt;로 만들고 &lt;b&gt;'관측 가능하게'&lt;/b&gt; 만드는 작업을 진행합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;주간 C# 서버 챌린지: Docker 컨테이너화 및 Serilog 구조적 로깅 가이드 &lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! &lt;b&gt;스튜디오 비를긋다&lt;/b&gt;입니다. 이번 챌린지의 주제는 &lt;b&gt;'Docker 컨테이너화 및 구조적 로깅(Structured Logging) 구축'&lt;/b&gt; 입니다. &quot;내 컴퓨터에서는 되는데?&quot;라는 말을 없애기 위해 Docker를 사용하고, 텍스트 파일 뒤지기를 멈추기 위해 현대적인 로깅 시스템을 도입해 보겠습니다.  &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; .NET 8 서버를 프로덕션 수준으로 배포하고 싶으신가요? Dockerfile 멀티 스테이지 빌드부터 Docker Compose 오케스트레이션, Serilog를 활용한 JSON 구조적 로깅 구축까지. 실무에 바로 적용 가능한 전체 소스 코드를 확인하세요. &lt;/span&gt;&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제: 서버의 컨테이너화 및 중앙 집중식 로깅 준비&lt;/b&gt;&lt;/h3&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;'아르카디아의 그림자'의 출시가 임박했습니다. 운영팀에서는 &quot;서버를 어떻게 배포하나요? exe 파일을 복사하면 되나요?&quot;라고 묻고 있습니다. 또한, &quot;서버가 다운되면 로그는 어디서 보나요? 텍스트 파일은 검색하기 너무 힘들어요.&quot;라는 요청도 들어왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당신의 임무는 &lt;code&gt;GameServer&lt;/code&gt;와 &lt;code&gt;ChatServer&lt;/code&gt;를 &lt;b&gt;Docker 이미지&lt;/b&gt;로 만들어 어디서든 동일하게 실행되도록 하고, &lt;code&gt;Serilog&lt;/code&gt;를 도입하여 로그를 JSON 형식으로 남겨 기계가 분석할 수 있도록(Machine-readable) 만드는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 요구사항:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;구조적 로깅 (Structured Logging):&lt;/b&gt; 기존의 &lt;code&gt;Console.WriteLine&lt;/code&gt;을 모두 제거하고, &lt;b&gt;Serilog&lt;/b&gt; 라이브러리를 도입합니다. 로그는 단순 텍스트가 아닌 &lt;b&gt;JSON 형식&lt;/b&gt;으로 출력되어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dockerfile 작성:&lt;/b&gt; &lt;code&gt;GameServer&lt;/code&gt;와 &lt;code&gt;ChatServer&lt;/code&gt; 프로젝트를 빌드하고 실행할 수 있는 최적화된 &lt;code&gt;Dockerfile&lt;/code&gt;을 각각 작성합니다. (.NET 8 SDK 및 Runtime 이미지 활용)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker Compose 구성:&lt;/b&gt; &lt;code&gt;docker-compose.yml&lt;/code&gt; 파일을 작성하여, 명령 한 번으로 게임 서버, 채팅 서버, Redis 서비스 레지스트리가 동시에 실행되고 서로 통신할 수 있도록 네트워크를 구성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경 변수 설정:&lt;/b&gt; 하드코딩된 설정값(DB 경로, 포트 등)을 &lt;code&gt;appsettings.json&lt;/code&gt; 또는 Docker 환경 변수로 주입받도록 수정합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;샘플 솔루션 (C# 12 / .NET 8 &amp;amp; Docker)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사전 준비:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker Desktop 설치 필요&lt;/li&gt;
&lt;li&gt;NuGet 패키지 추가: &lt;code&gt;Serilog&lt;/code&gt;, &lt;code&gt;Serilog.AspNetCore&lt;/code&gt;, &lt;code&gt;Serilog.Sinks.Console&lt;/code&gt;, &lt;code&gt;Serilog.Formatting.Compact&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 구조적 로깅 적용 (Program.cs)&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;using Serilog;
using Serilog.Formatting.Compact;

// 1. Serilog 초기화 (JSON 포맷터 사용)
Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .WriteTo.Console(new RenderedCompactJsonFormatter()) // 사람이 읽기 좋은 Compact JSON 형식
    .CreateLogger();

try
{
    Log.Information(&quot;Starting GameServer...&quot;);

    var builder = WebApplication.CreateBuilder(args);

    // 2. .NET 호스트에 Serilog 주입
    builder.Host.UseSerilog(); 

    // ... 기존 서비스 등록 코드 ...

    var app = builder.Build();

    // 3. 기존 Console.WriteLine 대체 예시
    // 기존: Console.WriteLine($&quot;Player {playerId} logged in.&quot;);
    // 변경: 구조적 로깅 (PlayerId가 검색 가능한 필드로 저장됨)
    Log.Information(&quot;Player {PlayerId} logged in from {IpAddress}&quot;, playerId, ipAddress);

    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, &quot;GameServer terminated unexpectedly&quot;);
}
finally
{
    Log.CloseAndFlush();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Dockerfile (GameServer/Dockerfile)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 스테이지 빌드(Multi-stage build)를 사용하여 이미지 크기를 최소화합니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# 1. 빌드 스테이지 (SDK 포함)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# 프로젝트 파일 복사 및 복원 (캐시 효율성을 위해)
COPY [&quot;GameServer/GameServer.csproj&quot;, &quot;GameServer/&quot;]
COPY [&quot;Protos/chat.proto&quot;, &quot;Protos/&quot;]
RUN dotnet restore &quot;GameServer/GameServer.csproj&quot;

# 전체 소스 복사 및 빌드
COPY . .
WORKDIR &quot;/src/GameServer&quot;
RUN dotnet publish &quot;GameServer.csproj&quot; -c Release -o /app/publish /p:UseAppHost=false

# 2. 실행 스테이지 (Runtime만 포함 - 가벼움)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT [&quot;dotnet&quot;, &quot;GameServer.dll&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(ChatServer의 Dockerfile도 위와 유사하게 작성합니다.)&lt;/i&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Docker Compose (docker-compose.yml)&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;version: '3.8'

services:
  # Redis (서비스 레지스트리 용)
  redis:
    image: redis:alpine
    ports:
      - &quot;6379:6379&quot;
    networks:
      - game-network

  # 채팅 서버
  chat-server:
    build:
      context: .
      dockerfile: ChatServer/Dockerfile
    environment:
      - ASPNETCORE_URLS=http://+:5000
      - RedisAddress=redis:6379
    ports:
      - &quot;5000:5000&quot;
    networks:
      - game-network
    depends_on:
      - redis

  # 게임 서버
  game-server:
    build:
      context: .
      dockerfile: GameServer/Dockerfile
    environment:
      - ASPNETCORE_URLS=http://+:7777
      # Docker 내부 DNS를 사용하여 'chat-server' 호스트명으로 접근
      - ChatServerUrl=http://chat-server:5000 
    ports:
      - &quot;7777:7777&quot;
    networks:
      - game-network
    depends_on:
      - chat-server

networks:
  game-network:
    driver: bridge&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실용적인 사용 시나리오&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원클릭 실행:&lt;/b&gt; 개발자가 프로젝트에 합류했을 때, 복잡한 환경 설정 없이 &lt;code&gt;docker-compose up&lt;/code&gt; 명령어 하나만 입력하면 Redis, DB, 채팅 서버, 게임 서버가 모두 실행되는 완벽한 로컬 개발 환경이 구축됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로그 분석:&lt;/b&gt; JSON으로 출력된 로그는 나중에 ELK Stack(Elasticsearch, Logstash, Kibana)이나 Datadog 같은 로그 수집 시스템으로 바로 전송할 수 있습니다. 텍스트 파싱 없이 &lt;code&gt;PlayerId == 12345&lt;/code&gt; 같은 쿼리로 특정 유저의 로그만 필터링하는 것이 가능해집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일관된 배포:&lt;/b&gt; 개발자의 로컬 환경(Windows)과 서버 운영 환경(Linux)의 차이로 인한 버그가 사라집니다. Docker 이미지가 동일하게 동작하기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;학습 목표&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;컨테이너 가상화:&lt;/b&gt; Docker의 기본 개념과 이미지를 빌드하고 실행하는 과정을 이해합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오케스트레이션 기초:&lt;/b&gt; Docker Compose를 사용하여 여러 개의 컨테이너를 하나의 서비스 그룹으로 묶고 관리하는 방법을 익힙니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컨테이너 네트워킹:&lt;/b&gt; Docker 내부 네트워크에서 서비스들이 서로를 어떻게 찾고(DNS) 통신하는지 이해합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구조적 로깅:&lt;/b&gt; 사람이 읽는 로그(Unstructured)와 기계가 읽는 로그(Structured)의 차이를 이해하고, 로그 데이터를 자산으로 활용하는 방법을 배웁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;솔루션 품질 평가 기준&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 효율성:&lt;/b&gt; Docker 이미지가 불필요한 파일(소스 코드 등)을 포함하지 않고, 실행에 필요한 파일만 포함하여 가벼운가? (멀티 스테이지 빌드 사용 여부)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성 자동화:&lt;/b&gt; &lt;code&gt;docker-compose up&lt;/code&gt; 실행 시 수동 개입 없이 모든 서버가 정상적으로 뜨고 서로 연결되는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로그 유용성:&lt;/b&gt; 로그에 타임스탬프, 로그 레벨, 그리고 &lt;code&gt;PlayerId&lt;/code&gt; 같은 문맥 정보(Context)가 JSON 필드로 잘 포함되어 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;보너스 목표&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON 로그를 눈으로 읽기는 힘듭니다. 로그를 수집하고 시각화해 주는 도구를 컨테이너로 띄워 연동해 보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;과제: Seq를 이용한 중앙 집중식 로그 모니터링 대시보드 구축  &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요구사항:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;에 &lt;b&gt;Seq&lt;/b&gt; 서비스를 추가합니다. (이미지: &lt;code&gt;datalust/seq&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;C# 프로젝트에 &lt;code&gt;Serilog.Sinks.Seq&lt;/code&gt; 패키지를 추가합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Program.cs&lt;/code&gt;의 로거 설정에 &lt;code&gt;.WriteTo.Seq(&quot;http://seq:5341&quot;)&lt;/code&gt;를 추가합니다. (Docker 내부 주소 사용)&lt;/li&gt;
&lt;li&gt;모든 컨테이너를 재시작한 후, 브라우저로 Seq 대시보드(&lt;code&gt;http://localhost:8081&lt;/code&gt;)에 접속하여 게임 서버와 채팅 서버의 로그가 한곳에 모이는 것을 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고급:&lt;/b&gt; Serilog의 &lt;code&gt;LogContext&lt;/code&gt;를 사용하여, 특정 요청 처리 구간(Scope) 내에서 발생하는 모든 로그에 자동으로 &lt;code&gt;CorrelationId&lt;/code&gt;(요청 추적 ID)를 붙여보세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1763644430705&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;// Program.cs 예시
var seqUrl = Environment.GetEnvironmentVariable(&quot;SeqUrl&quot;) ?? &quot;http://localhost:5341&quot;;

Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .WriteTo.Console() // 콘솔에도 남기고
    .WriteTo.Seq(seqUrl) // Seq로도 전송
    .CreateLogger();&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1763644316297&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.8'

services:
  # 1. Redis (서비스 레지스트리 용)
  redis:
    image: redis:alpine
    ports:
      - &quot;6379:6379&quot;
    networks:
      - game-network

  # 2. Seq (중앙 집중식 로그 서버) - [새로 추가됨]
  seq:
    image: datalust/seq
    environment:
      - ACCEPT_EULA=Y  # 필수: 라이선스 동의
    ports:
      - &quot;5341:5341&quot;    # 로그 수집 포트 (Ingestion)
      - &quot;8081:80&quot;      # 대시보드 UI 포트 (브라우저 접속용)
    volumes:
      - seq-data:/data # 로그 데이터를 영구 저장하기 위한 볼륨
    networks:
      - game-network

  # 3. 채팅 서버
  chat-server:
    build:
      context: .
      dockerfile: ChatServer/Dockerfile
    environment:
      - ASPNETCORE_URLS=http://+:5000
      - RedisAddress=redis:6379
      # Seq 서버 주소 (Docker 네트워크 내부 DNS 이름 'seq' 사용)
      - SeqUrl=http://seq:5341 
    ports:
      - &quot;5000:5000&quot;
    networks:
      - game-network
    depends_on:
      - redis
      - seq # Seq가 먼저 켜져야 함

  # 4. 게임 서버
  game-server:
    build:
      context: .
      dockerfile: GameServer/Dockerfile
    environment:
      - ASPNETCORE_URLS=http://+:7777
      - ChatServerUrl=http://chat-server:5000
      # Seq 서버 주소 주입
      - SeqUrl=http://seq:5341 
    ports:
      - &quot;7777:7777&quot;
    networks:
      - game-network
    depends_on:
      - chat-server
      - seq

networks:
  game-network:
    driver: bridge

volumes:
  seq-data: # Seq 데이터 저장을 위한 로컬 볼륨 정의&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;이제 여러분의 서버는 클라우드 환경 어디에 던져놔도 생존할 수 있는 현대적인 애플리케이션의 모습을 갖췄습니다. Docker의 바다로 항해를 시작해 보세요!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1763645230649&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Getting Started&quot; data-og-description=&quot;Simple .NET logging with fully-structured events. Contribute to serilog/serilog development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/serilog/serilog/wiki/Getting-Started&quot; data-og-url=&quot;https://github.com/serilog/serilog/wiki/Getting-Started&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bN74iW/hyZN3osOhj/cUkZ0dZjVvKb9a6qNYa95K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/c3sBAI/hyZOeKjmAS/GaanYH8ok7wiABBgF2jf8K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/serilog/serilog/wiki/Getting-Started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/serilog/serilog/wiki/Getting-Started&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bN74iW/hyZN3osOhj/cUkZ0dZjVvKb9a6qNYa95K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/c3sBAI/hyZOeKjmAS/GaanYH8ok7wiABBgF2jf8K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Simple .NET logging with fully-structured events. Contribute to serilog/serilog development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1763645254471&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Home&quot; data-og-description=&quot;Docker Documentation is the official Docker library of resources, manuals, and guides to help you containerize applications.&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/&quot; data-og-url=&quot;https://docs.docker.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FtNgK/hyZNDju0i5/wTxSLDPpG2CbmJLtWAoDA1/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://docs.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FtNgK/hyZNDju0i5/wTxSLDPpG2CbmJLtWAoDA1/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Home&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker Documentation is the official Docker library of resources, manuals, and guides to help you containerize applications.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1763645296150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - datalust/serilog-sinks-seq: A Serilog sink that writes events to the Seq structured log server&quot; data-og-description=&quot;A Serilog sink that writes events to the Seq structured log server - datalust/serilog-sinks-seq&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/datalust/serilog-sinks-seq&quot; data-og-url=&quot;https://github.com/datalust/serilog-sinks-seq&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cS4HBy/hyZOdq5Heq/HvgTpjPEkIcp5tSTQlW1V1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/O5Pm6/hyZN3osOWq/uat4k2WKjCuMmvdBqQdFZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/datalust/serilog-sinks-seq&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/datalust/serilog-sinks-seq&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cS4HBy/hyZOdq5Heq/HvgTpjPEkIcp5tSTQlW1V1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/O5Pm6/hyZN3osOWq/uat4k2WKjCuMmvdBqQdFZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - datalust/serilog-sinks-seq: A Serilog sink that writes events to the Seq structured log server&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Serilog sink that writes events to the Seq structured log server - datalust/serilog-sinks-seq&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 &amp;amp; 프로그래밍/C# 서버 챌린지</category>
      <category>C#</category>
      <category>C# Docker 배포</category>
      <category>Docker Compose</category>
      <category>JSON 로그 설정</category>
      <category>Seq 로그 모니터링</category>
      <category>Serilog 구조적 로깅</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/262</guid>
      <comments>https://rammuking.tistory.com/entry/9%EC%A3%BC%EA%B0%84-C-%EC%84%9C%EB%B2%84-%EC%B1%8C%EB%A6%B0%EC%A7%80-Docker-%EB%B0%B0%ED%8F%AC-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%A0%81-%EB%A1%9C%EA%B9%85#entry262comment</comments>
      <pubDate>Thu, 20 Nov 2025 22:29:32 +0900</pubDate>
    </item>
    <item>
      <title>8.주간 C# 서버 챌린지: 유닛 테스트 및 통합 테스트</title>
      <link>https://rammuking.tistory.com/entry/8%EC%A3%BC%EA%B0%84-C-%EC%84%9C%EB%B2%84-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EC%9C%A0%EB%8B%9B-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%B0%8F-%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8</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;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rHRM9/dJMcaj8mmLN/LMbRihxJQ2lfnUSkzishu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rHRM9/dJMcaj8mmLN/LMbRihxJQ2lfnUSkzishu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rHRM9/dJMcaj8mmLN/LMbRihxJQ2lfnUSkzishu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrHRM9%2FdJMcaj8mmLN%2FLMbRihxJQ2lfnUSkzishu0%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;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난주에는 gRPC를 통해 서버들을 멋지게 분리했습니다. 하지만 시스템이 복잡해질수록, 코드 한 줄을 수정했을 때 어떤 부작용이 일어날지 예측하기가 점점 더 어려워집니다.&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;주간 C# 서버 챌린지: xUnit과 Moq을 활용한 실용적인 테스트 코드 작성법 &lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! &lt;b&gt;스튜디오 비를긋다&lt;/b&gt;입니다. 이번 챌린지의 주제는 &lt;b&gt;'견고한 서버를 위한 유닛 테스트(Unit Test) 및 통합 테스트(Integration Test) 작성'&lt;/b&gt; 입니다. 버그가 없는 코드는 없습니다. 하지만 버그를 출시 전에, 그리고 자동으로 찾아내는 시스템은 만들 수 있습니다. xUnit, Moq, 그리고 인메모리(In-Memory) DB를 사용해 서버의 안정성을 극대화해 보겠습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; C# 서버의 버그, 아직도 수동으로 잡으시나요? xUnit, Moq, 인메모리 DB를 활용한 유닛 테스트 및 통합 테스트 자동화 방법을 실전 코드와 함께 자세히 다룹니다. 지금 바로 견고한 .NET 서버를 구축해 보세요. &lt;/span&gt;&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제: PlayerAgent 및 Repository 테스트 코드 작성&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상황 시나리오&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'아르카디아의 그림자'의 기능 개발은 순조롭게 진행 중이지만, 최근 CI/CD 파이프라인에서 원인을 알 수 없는 버그들이 간헐적으로 발생하고 있습니다. &quot;물약을 사용했는데 체력이 안 차는 버그&quot;, &quot;로그아웃 후 재접속하니 인벤토리가 롤백되는 버그&quot; 등 치명적인 오류가 리포트되기 시작했습니다. 원인 분석 결과, 새로운 기능 추가 시 기존 로직을 의도치 않게 변경했기 때문으로 밝혀졌습니다.&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;code&gt;PlayerAgent&lt;/code&gt;와 &lt;code&gt;SqlitePlayerRepository&lt;/code&gt;에 대한 자동화된 테스트 스위트(Test Suite)를 구축하는 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핵심 요구사항&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;테스트 프로젝트 생성:&lt;/b&gt; 솔루션에 &lt;b&gt;xUnit&lt;/b&gt; 테스트 프로젝트를 새로 추가합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유닛 테스트 (Unit Test):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;PlayerAgent&lt;/code&gt;의 로직을 테스트합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PlayerAgent&lt;/code&gt;가 의존하는 &lt;code&gt;IPlayerRepository&lt;/code&gt;는 &lt;b&gt;Moq&lt;/b&gt; 라이브러리를 사용해 '가짜(Mock)' 객체로 대체해야 합니다. (DB와 독립적으로 로직만 테스트)&lt;/li&gt;
&lt;li&gt;테스트 케이스 예: &lt;code&gt;UseItemAction&lt;/code&gt;을 처리했을 때, &lt;code&gt;Health&lt;/code&gt; 상태가 올바르게 변경되고 &lt;code&gt;Inventory&lt;/code&gt;에서 아이템이 제거되는지 검증합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통합 테스트 (Integration Test):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;SqlitePlayerRepository&lt;/code&gt;의 기능을 테스트합니다.&lt;/li&gt;
&lt;li&gt;실제 파일이 아닌, &lt;b&gt;인메모리(In-memory) SQLite&lt;/b&gt; 데이터베이스를 사용하여 테스트가 독립적으로, 그리고 빠르게 실행되도록 구성해야 합니다.&lt;/li&gt;
&lt;li&gt;테스트 케이스 예: &lt;code&gt;SavePlayerDataAsync&lt;/code&gt;로 데이터를 저장한 후, &lt;code&gt;GetPlayerDataAsync&lt;/code&gt;로 불러왔을 때 데이터가 일치하는지 검증합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;샘플 솔루션 (C# 12 / .NET 8)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사전 준비:&lt;/b&gt;&lt;br /&gt;테스트 프로젝트에 아래 NuGet 패키지들을 추가해야 합니다.&lt;br /&gt;&lt;code&gt;dotnet add package xunit&lt;/code&gt;&lt;br /&gt;&lt;code&gt;dotnet add package Moq&lt;/code&gt;&lt;br /&gt;&lt;code&gt;dotnet add package Microsoft.EntityFrameworkCore.Sqlite.Core&lt;/code&gt; (인메모리 DB 사용을 위해)&lt;br /&gt;&lt;code&gt;dotnet add package Dapper&lt;/code&gt; (테스트 대상이므로)&lt;br /&gt;&lt;code&gt;dotnet add package Microsoft.Data.Sqlite&lt;/code&gt; (테스트 대상이므로)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 유닛 테스트 (PlayerAgent) - Moq 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;using Moq;
using Xunit;

public class PlayerAgentTests
{
    private readonly Mock&amp;lt;IPlayerRepository&amp;gt; _mockRepo;
    private readonly PlayerAgent _agent;

    public PlayerAgentTests()
    {
        // 1. 가짜(Mock) 리포지토리 생성
        _mockRepo = new Mock&amp;lt;IPlayerRepository&amp;gt;();

        // 2. 테스트 대상인 PlayerAgent 생성 시, 실제 DB가 아닌 가짜 객체 주입
        //    (PlayerAgent 생성자가 LoadStateAction을 호출하므로, 이에 대한 Mock 설정이 필요할 수 있음)
        _agent = new PlayerAgent(123, _mockRepo.Object);
    }

    [Fact]
    public async Task ProcessAction_UseItemAction_ShouldHealAndRemoveItem()
    {
        // Arrange (준비)
        // PlayerAgent의 초기 상태 설정 (로직을 통해)
        _agent.Health = 50;
        _agent.Inventory.Add(1); // 1번 아이템 (체력 물약)
        var useItemAction = new UseItemAction(1);

        // Act (실행)
        // PlayerAgent의 내부 private 메서드를 테스트하기 위해, public 메서드(PostActionAsync)를 사용
        await _agent.PostActionAsync(useItemAction);

        // 메일박스 처리를 위해 잠시 대기 (실제 환경에서는 TestScheduler 등을 사용할 수 있음)
        await Task.Delay(100); 

        // Assert (검증)
        Assert.Equal(70, _agent.Health); // 체력이 20 올랐는지 확인 (50 + 20)
        Assert.DoesNotContain(1, _agent.Inventory); // 인벤토리에서 아이템이 사라졌는지 확인
    }

    [Fact]
    public async Task DisposeAsync_ShouldCall_SaveStateAsync()
    {
        // Arrange
        // SavePlayerDataAsync가 한 번 호출될 것임을 '설정' (검증을 위함)
        _mockRepo.Setup(r =&amp;gt; r.SavePlayerDataAsync(It.IsAny&amp;lt;PlayerData&amp;gt;()))
                 .Returns(Task.CompletedTask);

        // Act
        // 에이전트를 종료시킵니다. (종료 시 SaveStateAction이 메일박스에 들어감)
        await _agent.DisposeAsync();

        // Assert
        // SavePlayerDataAsync가 '정확히 한 번' 호출되었는지 검증합니다.
        _mockRepo.Verify(r =&amp;gt; r.SavePlayerDataAsync(It.IsAny&amp;lt;PlayerData&amp;gt;()), Times.Once);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 통합 테스트 (SqlitePlayerRepository) - In-Memory DB 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;using Xunit;
using Microsoft.Data.Sqlite;
using System.Text.Json;

public class SqlitePlayerRepositoryTests : IDisposable
{
    private readonly SqliteConnection _connection;
    private readonly SqlitePlayerRepository _repository;

    public SqlitePlayerRepositoryTests()
    {
        // 1. 인메모리 SQLite 연결 생성 (Mode=Memory)
        //    &quot;DataSource=:memory:&quot;는 단일 연결에서만 유효하지만,
        //    &quot;DataSource=SharedMemory;Mode=Memory;Cache=Shared&quot;는 여러 연결 간 공유 가능
        _connection = new SqliteConnection(&quot;DataSource=SharedMemory;Mode=Memory;Cache=Shared&quot;);
        _connection.Open(); // 공유 인메모리 DB를 활성화하기 위해 연결을 열어둡니다.

        // 2. SqlitePlayerRepository는 DB 파일 경로 대신 '연결 문자열'을 받도록 수정하는 것이 좋음
        //    (또는 테스트용으로 InitializeDatabase를 수동 호출)
        _repository = new SqlitePlayerRepository(&quot;DataSource=SharedMemory;Mode=Memory;Cache=Shared&quot;);

        // 3. 테스트마다 스키마를 새로 생성 (테스트 격리)
        //    (실제로는 Repository 생성자에서 InitializeDatabase를 호출)
    }

    public void Dispose()
    {
        // 테스트가 끝나면 연결을 닫아 인메모리 DB를 파괴합니다.
        _connection.Close();
    }

    [Fact]
    public async Task SavePlayerDataAsync_And_GetPlayerDataAsync_ShouldWork()
    {
        // Arrange (준비)
        var testInventory = new List&amp;lt;int&amp;gt; { 101, 205 };
        var testData = new PlayerData
        {
            PlayerId = 1,
            PositionX = 10.5f,
            PositionY = -5.0f,
            Health = 80,
            InventoryJson = JsonSerializer.Serialize(testInventory)
        };

        // Act (실행)
        // 1. 데이터를 저장합니다.
        await _repository.SavePlayerDataAsync(testData);

        // 2. 저장한 데이터를 다시 불러옵니다.
        var loadedData = await _repository.GetPlayerDataAsync(1);

        // Assert (검증)
        Assert.NotNull(loadedData);
        Assert.Equal(1, loadedData.PlayerId);
        Assert.Equal(10.5f, loadedData.PositionX);
        Assert.Equal(80, loadedData.Health);

        var loadedInventory = JsonSerializer.Deserialize&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;(loadedData.InventoryJson);
        Assert.Equal(testInventory, loadedInventory);
    }

    [Fact]
    public async Task SavePlayerDataAsync_ShouldUpsert_ExistingData()
    {
        // Arrange (준비) - 초기 데이터 삽입
        var initialData = new PlayerData { PlayerId = 2, Health = 100 };
        await _repository.SavePlayerDataAsync(initialData);

        // Act (실행) - 동일한 PlayerId로 데이터를 덮어씁니다.
        var updatedData = new PlayerData { PlayerId = 2, Health = 50 };
        await _repository.SavePlayerDataAsync(updatedData);

        var loadedData = await _repository.GetPlayerDataAsync(2);

        // Assert (검증)
        Assert.NotNull(loadedData);
        Assert.Equal(50, loadedData.Health); // 체력이 100이 아닌 50으로 업데이트되었는지 확인
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실용적인 사용 시나리오&lt;/b&gt;&lt;/h2&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;&lt;b&gt;리팩토링 자신감:&lt;/b&gt; &lt;code&gt;PlayerAgent&lt;/code&gt;의 내부 로직을 더 효율적으로 변경한 후, 유닛 테스트를 실행해봅니다. 테스트가 모두 통과하면, 최소한 기존 기능은 망가뜨리지 않았다는 확신을 가질 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB 마이그레이션:&lt;/b&gt; &lt;code&gt;Players&lt;/code&gt; 테이블에 'Gold'라는 새 컬럼을 추가해야 합니다. 통합 테스트에 'Gold' 저장/조회 테스트 케이스를 추가하고, &lt;code&gt;SqlitePlayerRepository&lt;/code&gt;의 쿼리를 수정하여 테스트를 통과시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CI/CD 연동:&lt;/b&gt; 이 테스트들을 GitHub Actions나 Jenkins 같은 CI/CD 파이프라인에 통합합니다. 이제 누군가 버그가 있는 코드를 커밋(Commit)하면, 테스트가 실패하며 빌드가 중단되고 즉시 알림을 받게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습 목표&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;테스트의 두 종류:&lt;/b&gt; &lt;b&gt;유닛 테스트&lt;/b&gt;(격리된 로직 검증)와 &lt;b&gt;통합 테스트&lt;/b&gt;(여러 컴포넌트 간의 상호작용 검증)의 차이와 목적을 명확히 이해합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모의 객체(Mocking):&lt;/b&gt; &lt;code&gt;Moq&lt;/code&gt; 라이브러리를 사용하여 의존성을 격리하고 오직 '테스트 대상'의 로직에만 집중하는 방법을 학습합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인메모리 DB 테스트:&lt;/b&gt; 실제 DB를 사용하지만, 디스크 I/O 없이 빠르고 격리된 테스트 환경을 구축하기 위해 인메모리 SQLite를 활용하는 방법을 익힙니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 주도 개발(TDD)의 기초:&lt;/b&gt; 테스트 케이스를 먼저 작성하고 이를 통과하는 코드를 작성하는 개발 방식의 기본 개념을 이해합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Arrange-Act-Assert (AAA) 패턴:&lt;/b&gt; '준비-실행-검증'으로 이어지는 테스트 코드의 표준적인 구조를 체득합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;솔루션 품질 평가 기준&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;격리성:&lt;/b&gt; 유닛 테스트가 외부 요인(DB, 네트워크 등)에 전혀 의존하지 않고 독립적으로 실행되는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신뢰성:&lt;/b&gt; 테스트가 가끔 성공하고 가끔 실패하는(Flaky) 불안정한 테스트가 아니라, 항상 동일한 결과를 반환하는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가독성:&lt;/b&gt; 테스트 코드 자체가 하나의 '문서'처럼, 해당 기능이 '어떻게 동작해야 하는지' 명확하게 설명해 주는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커버리지:&lt;/b&gt; 테스트 케이스가 핵심 로직(정상 케이스)뿐만 아니라, 예외 상황이나 경계값(Edge Case)까지 충분히 검증하고 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;보너스 목표&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TDD(Test-Driven Development, 테스트 주도 개발)&lt;/b&gt; 방식으로 새로운 기능을 추가해 보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;과제: &lt;code&gt;PlayerAgent&lt;/code&gt;에 '골드(Gold)' 추가하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요구사항:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;[TEST] 실패하는 테스트 작성:&lt;/b&gt; &lt;code&gt;PlayerAgent&lt;/code&gt;가 &lt;code&gt;AddGoldAction&lt;/code&gt;을 받았을 때 &lt;code&gt;Gold&lt;/code&gt; 속성값이 증가해야 한다는 &lt;b&gt;실패하는 유닛 테스트&lt;/b&gt;를 먼저 작성합니다. (컴파일조차 되지 않을 것입니다.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[CODE] 최소한의 코드 작성:&lt;/b&gt; &lt;code&gt;PlayerAgent&lt;/code&gt;에 &lt;code&gt;public long Gold { get; private set; }&lt;/code&gt; 속성과, &lt;code&gt;AddGoldAction&lt;/code&gt;을 처리하는 로직을 추가하여 1번의 테스트를 &lt;b&gt;통과&lt;/b&gt;시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[TEST] 실패하는 테스트 작성:&lt;/b&gt; &lt;code&gt;PlayerAgent&lt;/code&gt;가 종료될 때(Dispose), &lt;code&gt;PlayerData&lt;/code&gt;에 &lt;code&gt;Gold&lt;/code&gt; 값이 포함되어 &lt;code&gt;SavePlayerDataAsync&lt;/code&gt;가 호출되어야 한다는 &lt;b&gt;실패하는 유닛 테스트&lt;/b&gt;를 &lt;code&gt;Moq&lt;/code&gt;을 이용해 작성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[CODE] 코드 수정:&lt;/b&gt; &lt;code&gt;PlayerAgent&lt;/code&gt;의 &lt;code&gt;SaveStateAsync&lt;/code&gt; 로직과 &lt;code&gt;PlayerData&lt;/code&gt; 클래스에 &lt;code&gt;Gold&lt;/code&gt; 속성을 추가하여 3번의 테스트를 &lt;b&gt;통과&lt;/b&gt;시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[TEST] 실패하는 테스트 작성:&lt;/b&gt; &lt;code&gt;SqlitePlayerRepository&lt;/code&gt;가 &lt;code&gt;Gold&lt;/code&gt; 값을 DB에 저장하고 불러올 수 있어야 한다는 &lt;b&gt;실패하는 통합 테스트&lt;/b&gt;를 작성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[CODE] 코드 수정:&lt;/b&gt; &lt;code&gt;SqlitePlayerRepository&lt;/code&gt;의 &lt;code&gt;InitializeDatabase&lt;/code&gt;, &lt;code&gt;SavePlayerDataAsync&lt;/code&gt; 쿼리를 수정하여 5번의 테스트를 &lt;b&gt;통과&lt;/b&gt;시킵니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 통해, 테스트가 어떻게 개발을 '이끌어 가는지' 직접 체험해 보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 서버의 '안정성'이라는 내공을 쌓는 중요한 시간입니다. 튼튼한 테스트 코드는 미래의 여러분을 수많은 버그의 고통에서 구원해 줄 것입니다!&lt;/p&gt;</description>
      <category>개발 &amp;amp; 프로그래밍/C# 서버 챌린지</category>
      <category>.NET 테스트 코드 작성</category>
      <category>C#</category>
      <category>Moq 사용법</category>
      <category>TDD</category>
      <category>Xunit</category>
      <category>유닛 테스트</category>
      <category>인메모리 DB</category>
      <category>통합 테스트</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/261</guid>
      <comments>https://rammuking.tistory.com/entry/8%EC%A3%BC%EA%B0%84-C-%EC%84%9C%EB%B2%84-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EC%9C%A0%EB%8B%9B-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%B0%8F-%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8#entry261comment</comments>
      <pubDate>Sat, 1 Nov 2025 17:55:00 +0900</pubDate>
    </item>
    <item>
      <title>꿈꾸던 그 자체! 송파 라비니움 블룸홀 계약 후기 (ft. 밥, 주차, 단독홀)</title>
      <link>https://rammuking.tistory.com/entry/songpa-labinium-bloom-hall-contract-review</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXziH/dJMb9VzLL5B/qnnehrqKQ0nnkOxSIG2cvk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXziH/dJMb9VzLL5B/qnnehrqKQ0nnkOxSIG2cvk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXziH/dJMb9VzLL5B/qnnehrqKQ0nnkOxSIG2cvk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXziH%2FdJMb9VzLL5B%2FqnnehrqKQ0nnkOxSIG2cvk%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;637&quot; height=&quot;527&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;800&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;저의 원픽 웨딩홀과 예식 정보부터 살짝 공개할게요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;웨딩홀 이름 : 송파 라비니움&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예식 일자 : 26년 6월 오전 11시 (토요일 첫 타임!)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예식 홀 : 4층 블룸홀&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 라비니움을 방문하기 직전에 건대 스타시티 아트홀을 상담받고 왔거든요. 거기도 나름 괜찮다고 생각했는데... 이곳 블룸홀을 딱 보는 순간! 방금 보고 온 스타시티 아트홀이 갑자기 너무 올드하게 느껴질 정도로, 비교가 안 되게 예뻤어요.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 라비니움을 선택할 수밖에 없었는지, 제가 꼼꼼하게 체크한 포인트들을 하나씩 공유해 드릴게요!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 첫눈에 반해버린 '블룸홀' (feat. 야외 웨딩 감성)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 계약한 &lt;b&gt;4층 블룸홀&lt;/b&gt;은 정말이지, 제 로망 그 자체였어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzef9/dJMb9Onb2id/pnKlesViE3kIkf6qp8uEgk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzef9/dJMb9Onb2id/pnKlesViE3kIkf6qp8uEgk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzef9/dJMb9Onb2id/pnKlesViE3kIkf6qp8uEgk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkzef9%2FdJMb9Onb2id%2FpnKlesViE3kIkf6qp8uEgk%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;635&quot; height=&quot;635&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;압도적인 층고와 채광:&lt;/b&gt; 문을 열고 들어서는 순간, 높은 층고가 주는 개방감과 화사한 분위기에 압도당했어요. 첫 타임 예식이라 자연광 느낌도 살짝 기대하고 있는데, 홀 자체가 밝고 화사해서 스냅 사진이 정말 잘 나올 것 같더라고요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;플라워 데코 (화이트+핑크+그린):&lt;/b&gt; 제가 딱 원하던 조합! 화이트 핑크 그린 톤의 꽃 장식이 과하지 않으면서도 풍성하게 어우러져, 마치 싱그러운 야외 정원에서 결혼하는 듯한 느낌을 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;넓고 쾌적한 신부 대기실:&lt;/b&gt; 신부 대기실도 정말 넓었어요. 예식 당일 친구, 지인들이 많이 찾아와도 복잡하지 않고 여유롭게 사진 찍을 수 있겠더라고요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T0YnZ/dJMb9MpnmjS/JPPndGB5k53YsRHRkPg1J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T0YnZ/dJMb9MpnmjS/JPPndGB5k53YsRHRkPg1J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T0YnZ/dJMb9MpnmjS/JPPndGB5k53YsRHRkPg1J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT0YnZ%2FdJMb9MpnmjS%2FJPPndGB5k53YsRHRkPg1J0%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;621&quot; height=&quot;466&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;신랑 신부를 위한 '히든 동선':&lt;/b&gt; 홀 투어를 하면서 가장 감동한 부분 중 하나예요. 신랑 신부가 하객들과 겹치지 않고 편하게 이동할 수 있는 '히든 도어'가 곳곳에 있었어요. 이런 세심한 배려가 신랑 신부를 진심으로 위한다는 느낌을 줘서 신뢰가 팍팍 쌓였습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;홀 옆 포토존 (테라스):&lt;/b&gt; 홀 바로 옆에 정말 예쁜, &lt;b&gt;야외처럼 꾸며놓은 테라스 공간&lt;/b&gt;이 있어요! (완전한 야외는 아니에요.) 하객들이 이용하는 공간은 아니고, 신랑 신부가 미리 와서 본식 스냅을 찍는 공간이라고 해요. 여기서도 야외 결혼식 감성의 사진을 잔뜩 남길 수 있을 것 같아 너무 기대됩니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mDBTp/dJMb9OgquH4/M5WdK3Z7QOhjso3HSvQNvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mDBTp/dJMb9OgquH4/M5WdK3Z7QOhjso3HSvQNvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mDBTp/dJMb9OgquH4/M5WdK3Z7QOhjso3HSvQNvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmDBTp%2FdJMb9OgquH4%2FM5WdK3Z7QOhjso3HSvQNvK%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;618&quot; height=&quot;618&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 하객 만족도 1순위, 밥과 연회장!&lt;/h2&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;&lt;b&gt;미식가 하객도 만족시킬 뷔페:&lt;/b&gt; 이곳은 밥이 정말 맛있기로 소문난 곳이라 기대감이 엄청나요. 투어 때 보니 하몽, 양갈비, 갈비 등 메인 메뉴 퀄리티가 남달랐고, 떡이나 후식 종류도 다른 곳보다 훨씬 다양했어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo2aIF/dJMb9Pfky3P/NiknS4F3QBXxVwxOCuFwy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo2aIF/dJMb9Pfky3P/NiknS4F3QBXxVwxOCuFwy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo2aIF/dJMb9Pfky3P/NiknS4F3QBXxVwxOCuFwy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo2aIF%2FdJMb9Pfky3P%2FNiknS4F3QBXxVwxOCuFwy1%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;760&quot; height=&quot;426&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주류 라인업 (생맥주 2종, 와인 2종):&lt;/b&gt; 주류도 합격! 시원한 생맥주가 무려 2종류, 와인도 2종류나 준비되어 있어서 애주가(?) 하객분들이 아주 만족하실 것 같아요. (이용 시간 2시간)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단독 사용! 복잡함 ZERO:&lt;/b&gt; 제가 이곳을 선택한 결정적인 이유 중 하나! 홀과 연회장 모두 &lt;b&gt;단독으로 사용&lt;/b&gt;합니다. 특히 홀과 연회장이 아예 층으로 분리되어 있어서, 아무리 많은 인원이 와도 다른 예식 하객들과 섞일 일이 전혀 없어요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;체계적인 연회장 운영:&lt;/b&gt; 연회장 투어를 할 때 동선이 정말 깔끔했어요. 그리고 곳곳에 정리 및 안내 직원분들이 정말 많이 배치되어 있더라고요. 전체적으로 &lt;b&gt;굉장히 질서 정연하고 체계적&lt;/b&gt;으로 운영된다는 느낌을 받아서, 어르신들도 불편함 없이 식사하실 수 있겠다고 생각했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uwzyo/dJMb9VzLL7e/aPIgbIGPWy0CMNF9i7coEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uwzyo/dJMb9VzLL7e/aPIgbIGPWy0CMNF9i7coEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uwzyo/dJMb9VzLL7e/aPIgbIGPWy0CMNF9i7coEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUwzyo%2FdJMb9VzLL7e%2FaPIgbIGPWy0CMNF9i7coEK%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;684&quot; height=&quot;508&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4886914834712123&quot;&gt;&lt;/script&gt;
&lt;!-- 수평형 디스플레이 광고 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-4886914834712123&quot; data-ad-slot=&quot;7813395773&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 모두가 걱정하는 '주차', 실제 가보니?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 후기들에서 '주차가 제일 걱정이다', '공영 주차장이라 멀다'는 얘기를 봐서 사실 이 부분이 제일 걱정이었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면, &lt;b&gt;&quot;전혀 걱정할 필요 없었다!&quot;&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수시로 운행하는 셔틀:&lt;/b&gt; 걱정이 무색하게 셔틀 버스가 정말 쉴 새 없이 다녔어요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;곳곳에 배치된 주차 요원:&lt;/b&gt; 주차 요원분들도 정말 많아서 신속하게 안내를 도와주시더라고요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;'그' 공영 주차장의 진실:&lt;/b&gt; 그 동네 사는 분들은 아시겠지만, 그 공영 주차장이 엄청 큰 건 맞아요. 하지만 '멀거나 가는 길이 불편한' 그런 곳은 절대 아니었습니다. 이 정도면 하객분들도 큰 불편함 없을 거라고 판단했어요!&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;[주차 시간 정보]&lt;/b&gt;&lt;br /&gt;하객 무료 주차: 1시간 30분&lt;br /&gt;혼주 무료 주차: 6시간 (넉넉!)&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 상담부터 느껴진 '프로의 자부심'&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웨딩홀은 결국 '사람'이 하는 일이잖아요. 상담해주시는 분의 태도가 정말 중요하다고 생각했는데, 이 부분도 100점 만점이었습니다.&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;정말 친절하셨고, 사소한 부분이나 궁금한 점들을 하나하나 세세하게 다 케어해 주셔서 '아, 여기에 맡기면 되겠다'는 강한 신뢰가 생겼습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 기타 디테일 &amp;amp; 딱 하나 아쉬운 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;축의대:&lt;/b&gt; 예식 시간 전후로 40분씩, 총 80분간 여유롭게 사용 가능해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;식권:&lt;/b&gt; 딱 하나 아쉬운 점은 식권을 별도로 준비해야 한다는 점이었어요.   (요즘 기본 제공해 주는 곳도 많다 보니...)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;BUT!&lt;/b&gt; 이것도 청첩장 제휴 업체에서 서비스로 해준다고 하니, 사실상 단점이라고 보긴 어렵겠네요. ㅎㅎ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최종 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 글 읽어주셔서 감사합니다! 투어를 마치고 나오면서 예랑이랑 둘 다 &quot;여기다!&quot;를 외쳤어요.&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;26년 6월, 이곳 라비니움 블룸홀에서 맞이할 저희의 그날이 벌써부터 너무너무 기대됩니다!  &lt;/p&gt;</description>
      <category>라이프/결혼</category>
      <category>계약후기</category>
      <category>라비니움</category>
      <category>밝은 홀</category>
      <category>송파구웨딩홀</category>
      <category>송파웨딩홀</category>
      <category>예랑</category>
      <category>예신</category>
      <category>웨딩</category>
      <category>웨딩홀</category>
      <category>천호역</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/260</guid>
      <comments>https://rammuking.tistory.com/entry/songpa-labinium-bloom-hall-contract-review#entry260comment</comments>
      <pubDate>Sat, 25 Oct 2025 14:47:31 +0900</pubDate>
    </item>
    <item>
      <title>7.주간 C# 서버 챌린지: 분산 마이크로서비스</title>
      <link>https://rammuking.tistory.com/entry/7%EC%A3%BC%EA%B0%84-C-%EC%84%9C%EB%B2%84-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%B6%84%EC%82%B0-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;3199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bepMfP/dJMb9LjHdxR/vb1RQBNkS3nVTXFc1Gilyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bepMfP/dJMb9LjHdxR/vb1RQBNkS3nVTXFc1Gilyk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bepMfP/dJMb9LjHdxR/vb1RQBNkS3nVTXFc1Gilyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbepMfP%2FdJMb9LjHdxR%2Fvb1RQBNkS3nVTXFc1Gilyk%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;3999&quot; height=&quot;3199&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;3199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난번에는 클라이언트의 패킷을 해석하여 서버의 심장부인 &lt;code&gt;PlayerAgent&lt;/code&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;하지만 거대한 MMORPG 월드는 서버 한 대로 감당할 수 없습니다. 수많은 서버가 각자의 역할을 수행하며 서로 '대화'해야 하죠. 이번 주에는 바로 이 &lt;b&gt;서버 간 통신(Inter-Server Communication)&lt;/b&gt; 이라는 새로운 세계로 나아갑니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;주간 C# 서버 챌리지: gRPC&amp;nbsp;양방향&amp;nbsp;스트리밍&amp;nbsp;구현&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! &lt;b&gt;스튜디오 비를긋다&lt;/b&gt;입니다. 이번 챌린지의 주제는 &lt;b&gt;'gRPC를 이용한 분산 마이크로서비스 아키텍처 구축'&lt;/b&gt; 입니다. 기존의 단일(Monolithic) 서버 구조에서 벗어나, 기능별로 분리된 여러 서버가 어떻게 효율적으로 데이터를 주고받는지, 현대적인 RPC(Remote Procedure Call) 프레임워크인 gRPC를 통해 직접 구현해 보겠습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; C# 개발자라면 꼭 알아야 할 gRPC 마이크로서비스 구축 실전 예제입니다. 단일 서버를 게임 서버와 채팅 서버로 분리하는 방법, .proto 정의, 양방향 스트리밍 구현, 서비스 디스커버리 개념까지 C# 코드로 직접 확인하세요. &lt;/span&gt;&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제: 게임 서버와 채팅 서버 분리 및 연동&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상황 시나리오&lt;/b&gt;&lt;/h3&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;당신의 임무는 기존 '게임 서버'와 새로운 '채팅 서버'를 gRPC로 연결하는 것입니다. 플레이어가 게임 서버에 접속해 채팅을 하면, 해당 메시지는 게임 서버를 거쳐 채팅 서버로 전달되어야 합니다. 채팅 서버는 이 메시지를 현재 접속 중인 모든 게임 서버들에게 다시 전파(Broadcast)하고, 각 게임 서버는 메시지를 소속 플레이어들에게 최종적으로 전달해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핵심 요구사항&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;프로젝트 분리:&lt;/b&gt; 솔루션을 &lt;b&gt;GameServer&lt;/b&gt;와 &lt;b&gt;ChatServer&lt;/b&gt;라는 두 개의 독립적인 콘솔 애플리케이션 프로젝트로 구성해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로토콜 정의(.proto):&lt;/b&gt; Protocol Buffers를 사용하여 서버 간에 주고받을 &lt;code&gt;ChatMessage&lt;/code&gt;와 &lt;code&gt;ChatService&lt;/code&gt;의 API를 정의해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;gRPC 서비스 구현:&lt;/b&gt; &lt;code&gt;ChatServer&lt;/code&gt; 프로젝트에 Kestrel을 사용하여 gRPC 서비스를 호스팅하고, 여러 게임 서버로부터의 스트리밍 연결을 관리하며 메시지를 중계하는 로직을 구현해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;gRPC 클라이언트 구현:&lt;/b&gt; &lt;code&gt;GameServer&lt;/code&gt; 프로젝트에 gRPC 클라이언트를 구현해야 합니다. 서버 시작 시 채팅 서버에 접속하여 양방향 스트림을 열고, 채팅 메시지를 보내고 받는 기능을 구현해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;샘플 솔루션 (C# 12 / .NET 8)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 솔루션은 두 개의 프로젝트로 구성됩니다. gRPC를 사용하기 위해서는 &lt;code&gt;Grpc.AspNetCore&lt;/code&gt;, &lt;code&gt;Google.Protobuf&lt;/code&gt;, &lt;code&gt;Grpc.Tools&lt;/code&gt; 등의 NuGet 패키지가 필요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 공통 &lt;code&gt;.proto&lt;/code&gt; 파일 (프로젝트 공용)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Protos/chat.proto&lt;/code&gt; 파일을 만들고 두 프로젝트에 모두 링크합니다.&lt;/p&gt;
&lt;pre class=&quot;protobuf&quot;&gt;&lt;code&gt;syntax = &quot;proto3&quot;;

package chat;

// 채팅 서비스 정의
service ChatService {
  // 양방향 스트리밍 RPC. 게임 서버와 채팅 서버는 이 스트림을 통해 계속 메시지를 주고받는다.
  rpc StartChat (stream ChatMessage) returns (stream ChatMessage);
}

// 채팅 메시지 구조
message ChatMessage {
  uint64 player_id = 1;
  string player_name = 2;
  string content = 3;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. ChatServer 프로젝트&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;using Grpc.Core;
using System.Collections.Concurrent;

// ChatService의 실제 구현
public class ChatServiceImpl : ChatService.ChatServiceBase
{
    // 연결된 모든 게임 서버의 응답 스트림을 저장. Key: 고유 ID, Value: 스트림 객체
    private static readonly ConcurrentDictionary&amp;lt;string, IServerStreamWriter&amp;lt;ChatMessage&amp;gt;&amp;gt; _gameServers = new();

    // 양방향 스트리밍 RPC 메서드 구현
    public override async Task StartChat(
        IAsyncStreamReader&amp;lt;ChatMessage&amp;gt; requestStream, 
        IServerStreamWriter&amp;lt;ChatMessage&amp;gt; responseStream, 
        ServerCallContext context)
    {
        var connectionId = context.Peer; // 연결된 피어(게임 서버)의 고유 주소
        Console.WriteLine($&quot;GameServer connected: {connectionId}&quot;);
        _gameServers[connectionId] = responseStream;

        try
        {
            // 클라이언트(게임 서버)로부터 메시지가 올 때까지 비동기적으로 대기
            await foreach (var message in requestStream.ReadAllAsync())
            {
                Console.WriteLine($&quot;Received from {connectionId}: {message.Content}&quot;);

                // 받은 메시지를 '모든' 게임 서버에게 다시 전파 (Broadcast)
                foreach (var server in _gameServers.Values)
                {
                    await server.WriteAsync(message);
                }
            }
        }
        catch (IOException) { /* 클라이언트 연결 끊김 */ }
        finally
        {
            // 연결이 끊기면 목록에서 제거
            _gameServers.TryRemove(connectionId, out _);
            Console.WriteLine($&quot;GameServer disconnected: {connectionId}&quot;);
        }
    }
}

// ChatServer의 Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc(); // gRPC 서비스 추가

var app = builder.Build();
app.MapGrpcService&amp;lt;ChatServiceImpl&amp;gt;(); // ChatService 구현체 매핑
app.Run(); // Kestrel 서버 실행&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. GameServer 프로젝트&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using Grpc.Net.Client;
using Grpc.Core;

// GameServer의 채팅 관련 로직을 담당하는 클래스
public class ChatClientService
{
    private readonly GrpcChannel _channel;
    private readonly ChatService.ChatServiceClient _client;
    private AsyncDuplexStreamingCall&amp;lt;ChatMessage, ChatMessage&amp;gt;? _chatStream;

    public ChatClientService(string chatServerAddress)
    {
        _channel = GrpcChannel.ForAddress(chatServerAddress);
        _client = new ChatService.ChatServiceClient(_channel);
    }

    public async Task ConnectAsync()
    {
        _chatStream = _client.StartChat();
        Console.WriteLine(&quot;Connected to ChatServer.&quot;);

        // 채팅 서버로부터 메시지를 수신하는 별도의 Task 실행
        _ = Task.Run(async () =&amp;gt;
        {
            await foreach (var message in _chatStream.ResponseStream.ReadAllAsync())
            {
                // TODO: 이 게임 서버에 접속한 플레이어들에게 메시지를 전달하는 로직
                // 예: var agent = PlayerManager.GetAgent(message.PlayerId);
                //     agent?.SendToClient(message);
                Console.WriteLine($&quot;[Broadcast] {message.PlayerName}: {message.Content}&quot;);
            }
        });
    }

    // 플레이어가 보낸 채팅 메시지를 채팅 서버로 전송
    public async Task SendMessageAsync(ChatMessage message)
    {
        if (_chatStream != null)
        {
            await _chatStream.RequestStream.WriteAsync(message);
        }
    }
}

// GameServer의 Program.cs (지난주 코드와 통합)
// ... PacketHandler 등록 로직 ...
PacketHandler.Register&amp;lt;ChatRequestPacket&amp;gt;(PacketId.C_Chat, async (session, req) =&amp;gt; 
{
    // chatClientService는 싱글턴으로 관리되어야 함
    await chatClientService.SendMessageAsync(new ChatMessage
    {
        PlayerId = session.PlayerId,
        PlayerName = &quot;PlayerNameHere&quot;, // DB 등에서 조회
        Content = req.Message
    });
});

// ... 서버 시작 로직 ...
var chatClientService = new ChatClientService(&quot;http://localhost:5000&quot;); // ChatServer 주소
await chatClientService.ConnectAsync();
// ... GameServer 시작 ...&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실용적인 사용 시나리오&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 분산 아키텍처는 MMORPG 서버를 수평적으로 확장(Scale-out)하기 위한 핵심 패턴입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;존 서버(Zone Server) 분리:&lt;/b&gt; 각 지역이나 채널을 별도의 서버 프로세스(존 서버)로 분리합니다. 유저가 다른 지역으로 이동하면, gRPC를 통해 플레이어의 세션 정보를 다음 존 서버로 안전하게 이전시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매치메이킹 서버:&lt;/b&gt; 실시간 전투나 PvP 콘텐츠를 위한 매칭 로직만을 담당하는 서버를 분리합니다. 게임 서버들은 매칭 요청을 매치메이킹 서버에 보내고, 매칭이 성사되면 결과를 gRPC로 돌려받습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;길드/파티 서버:&lt;/b&gt; 전역적인 커뮤니티 기능(길드 채팅, 파티 초대 등)을 담당하는 서버를 분리하여, 어떤 게임 서버에 접속해 있든 동일한 커뮤니티 경험을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC를 사용하면 각 서버가 서로 다른 프로그래밍 언어로 작성되어도(예: 게임 로직은 C#, AI는 Python) 프로토콜 버퍼를 통해 원활하게 통신할 수 있다는 강력한 장점도 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습 목표&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;마이크로서비스 아키텍처:&lt;/b&gt; 단일(Monolithic) 애플리케이션을 기능 단위의 여러 작은 서비스로 분리하는 설계 사상을 이해합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;gRPC 및 Protocol Buffers:&lt;/b&gt; 현대적인 고성능 RPC 프레임워크의 사용법과 &lt;code&gt;.proto&lt;/code&gt; 파일을 통한 API 우선 설계 방식을 학습합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;양방향 스트리밍:&lt;/b&gt; 서버와 클라이언트가 하나의 연결을 통해 양쪽에서 지속적으로 메시지를 주고받는 고급 통신 패턴을 구현하는 방법을 익힙니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 간 통신:&lt;/b&gt; 서로 다른 프로세스, 혹은 다른 물리적 머신에서 실행되는 서비스들이 어떻게 상호작용하는지에 대한 실질적인 경험을 쌓습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;솔루션 품질 평가 기준&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설계:&lt;/b&gt; GameServer와 ChatServer의 책임이 명확하게 분리되었는가? &lt;code&gt;.proto&lt;/code&gt; 파일이 서비스의 의도를 잘 표현하고 있는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성:&lt;/b&gt; 한쪽 서버(예: ChatServer)가 다운되거나 재시작되었을 때, 다른 서버가 비정상 종료되지 않고 연결을 재시도하는 등 견고하게 대처하는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능:&lt;/b&gt; gRPC 스트리밍을 효율적으로 사용하여 불필요한 연결 생성/해제 오버헤드를 최소화했는가?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성:&lt;/b&gt; 나중에 새로운 종류의 서버(예: 경매장 서버)를 추가하기 쉬운 구조인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;보너스 목표&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 샘플 코드는 게임 서버가 채팅 서버의 주소(&lt;code&gt;http://localhost:5000&lt;/code&gt;)를 하드코딩하여 알고 있습니다. 이는 유연성이 떨어지는 방식입니다. 이 문제를 해결해 보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;과제: 서비스 디스커버리(Service Discovery) 기본 패턴 구현  ️&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요구사항&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 레지스트리(Service Registry)&lt;/b&gt; 역할을 할 간단한 중앙 저장소를 사용합니다. (예: &lt;b&gt;Redis&lt;/b&gt;의 해시(Hash) 데이터 타입 또는 간단한 JSON 파일 서버)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 등록:&lt;/b&gt; &lt;code&gt;ChatServer&lt;/code&gt;가 시작될 때, 자신의 IP 주소와 포트 번호를 'chat-service-address'와 같은 키로 서비스 레지스트리에 등록(쓰기)하도록 수정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 조회:&lt;/b&gt; &lt;code&gt;GameServer&lt;/code&gt;가 시작될 때, 하드코딩된 주소 대신 서비스 레지스트리에 질의하여 'chat-service-address' 키의 값을 읽어와 채팅 서버에 접속하도록 수정합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 패턴을 적용하면, 채팅 서버를 다른 머신에서 실행하거나 포트를 변경해도 게임 서버의 코드를 전혀 수정할 필요가 없어져, 실제 분산 환경 운영에 필수적인 유연성을 확보하게 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;figure id=&quot;og_1761143307494&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;gRPC&quot; data-og-description=&quot;gRPC는 Google이 개발하고 현재 Cloud Native Computing Foundation(CNCF)에서 관리하는 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크이다.주요 개념gRPC는 클라이언트가 다른 머신의 &quot; data-og-host=&quot;blog.rainshelter.net&quot; data-og-source-url=&quot;https://blog.rainshelter.net/entry/gRPC&quot; data-og-url=&quot;https://blog.rainshelter.net/entry/gRPC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dgiKqy/hyZMpRWTaO/ZkMwiVukJCBhFBSu3wjsR0/img.png?width=800&amp;amp;height=336&amp;amp;face=0_0_800_336,https://scrap.kakaocdn.net/dn/RxvJe/hyZLbOcYpx/CROk0XQX70n7fsumGRaxAK/img.png?width=800&amp;amp;height=336&amp;amp;face=0_0_800_336,https://scrap.kakaocdn.net/dn/sYwzA/hyZMr3iuIq/oGEkWVKYY5uWvUykO8uIV1/img.png?width=880&amp;amp;height=370&amp;amp;face=0_0_880_370&quot;&gt;&lt;a href=&quot;https://blog.rainshelter.net/entry/gRPC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.rainshelter.net/entry/gRPC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dgiKqy/hyZMpRWTaO/ZkMwiVukJCBhFBSu3wjsR0/img.png?width=800&amp;amp;height=336&amp;amp;face=0_0_800_336,https://scrap.kakaocdn.net/dn/RxvJe/hyZLbOcYpx/CROk0XQX70n7fsumGRaxAK/img.png?width=800&amp;amp;height=336&amp;amp;face=0_0_800_336,https://scrap.kakaocdn.net/dn/sYwzA/hyZMr3iuIq/oGEkWVKYY5uWvUykO8uIV1/img.png?width=880&amp;amp;height=370&amp;amp;face=0_0_880_370');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;gRPC&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;gRPC는 Google이 개발하고 현재 Cloud Native Computing Foundation(CNCF)에서 관리하는 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크이다.주요 개념gRPC는 클라이언트가 다른 머신의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.rainshelter.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1761143625311&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;프로토콜 버퍼(Protocol Buffers, Protobuf)&quot; data-og-description=&quot;프로토콜 버퍼(Protocol Buffers, 줄여서 Protobuf)는 구글이 개발한 데이터 직렬화(serialization) 프레임워크로, 서로 다른 시스템 간 효율적이고 안정적인 데이터 교환을 위해 사용된다.​핵심 개념프로&quot; data-og-host=&quot;blog.rainshelter.net&quot; data-og-source-url=&quot;https://blog.rainshelter.net/entry/%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%B2%84%ED%8D%BCProtocol-Buffers-Protobuf&quot; data-og-url=&quot;https://blog.rainshelter.net/entry/%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%B2%84%ED%8D%BCProtocol-Buffers-Protobuf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biVqpt/hyZLaogeWl/YdbctURI1ZTvpYRP3oPTHK/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/eKJKs/hyZK9bPnPs/TUorCjkZKgm8VI1wegqyBk/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/iNm4e/hyZLfwj41o/oVMHU3edfNyQXjuSmAtQr1/img.png?width=1134&amp;amp;height=425&amp;amp;face=0_0_1134_425&quot;&gt;&lt;a href=&quot;https://blog.rainshelter.net/entry/%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%B2%84%ED%8D%BCProtocol-Buffers-Protobuf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.rainshelter.net/entry/%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%B2%84%ED%8D%BCProtocol-Buffers-Protobuf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biVqpt/hyZLaogeWl/YdbctURI1ZTvpYRP3oPTHK/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/eKJKs/hyZK9bPnPs/TUorCjkZKgm8VI1wegqyBk/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/iNm4e/hyZLfwj41o/oVMHU3edfNyQXjuSmAtQr1/img.png?width=1134&amp;amp;height=425&amp;amp;face=0_0_1134_425');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로토콜 버퍼(Protocol Buffers, Protobuf)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프로토콜 버퍼(Protocol Buffers, 줄여서 Protobuf)는 구글이 개발한 데이터 직렬화(serialization) 프레임워크로, 서로 다른 시스템 간 효율적이고 안정적인 데이터 교환을 위해 사용된다.​핵심 개념프로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.rainshelter.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 &amp;amp; 프로그래밍/C# 서버 챌린지</category>
      <category>.NET</category>
      <category>C#</category>
      <category>grpc</category>
      <category>gRPC 예제</category>
      <category>protocol buffers</category>
      <category>게임 서버 만들기</category>
      <category>마이크로서비스</category>
      <category>마이크로서비스 구축</category>
      <category>서비스 디스커버리 패턴</category>
      <category>양방향 스트리밍</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/259</guid>
      <comments>https://rammuking.tistory.com/entry/7%EC%A3%BC%EA%B0%84-C-%EC%84%9C%EB%B2%84-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%B6%84%EC%82%B0-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4#entry259comment</comments>
      <pubDate>Wed, 22 Oct 2025 23:33:55 +0900</pubDate>
    </item>
    <item>
      <title>Protobuf vs JSON: C# 서버 성능을 10배 높이는 데이터 직렬화 비밀</title>
      <link>https://rammuking.tistory.com/entry/protobuf-vs-json-csharp-performance</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj4jDU/dJMb9PTVAn4/h1pOQo7OPHhQCrIB0d7F3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj4jDU/dJMb9PTVAn4/h1pOQo7OPHhQCrIB0d7F3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj4jDU/dJMb9PTVAn4/h1pOQo7OPHhQCrIB0d7F3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj4jDU%2FdJMb9PTVAn4%2Fh1pOQo7OPHhQCrIB0d7F3k%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;1134&quot; height=&quot;425&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Protobuf vs JSON: C# 서버 성능을 10배 높이는 데이터 직렬화 비밀&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 개발을 하다 보면 필연적으로 마주치는 고민이 있습니다. *&quot;데이터를 어떻게 더 작고 빠르게 보낼 것인가?&quot;*&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON은 사람이 읽기 편하고 범용적이지만, 대규모 트래픽을 처리하는 게임 서버나 마이크로서비스 환경에서는 그 '무거운 텍스트'가 병목의 원인이 되곤 합니다. 오늘은 구글이 이 문제를 해결하기 위해 만든 **프로토콜 버퍼(Protocol Buffers, Protobuf)**가 무엇인지, 그리고 왜 C# 고성능 서버 개발의 필수 기술인지 알아봅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프로토콜 버퍼(Protobuf)란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜 버퍼(Protobuf)는 구글이 개발한 &lt;b&gt;데이터 직렬화(Serialization) 프레임워크&lt;/b&gt;입니다. 쉽게 말해, 서로 다른 시스템(예: C# 서버와 Python 클라이언트)끼리 데이터를 주고받을 때 사용하는 '언어'와 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSON과 결정적인 차이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 차이는 &lt;b&gt;데이터의 형태&lt;/b&gt;에 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;JSON/XML:&lt;/b&gt; 사람이 읽을 수 있는 &lt;b&gt;텍스트(Text)&lt;/b&gt; 형식.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Protobuf:&lt;/b&gt; 컴퓨터가 처리하기 쉬운 &lt;b&gt;이진(Binary)&lt;/b&gt; 형식.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이 읽을 수는 없지만, 컴퓨터 입장에서는 해석(Parsing) 비용이 거의 들지 않는 구조화된 포맷이기 때문에 압도적인 성능을 자랑합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왜 Protobuf를 써야 할까? (핵심 장점)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 압도적인 성능과 효율 (JSON 대비 3~10배)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protobuf는 데이터를 바이너리로 압축하여 전송합니다. 텍스트 기반인 JSON보다 전송 크기가 훨씬 작으며, 직렬화/역직렬화 속도가 &lt;b&gt;약 3배에서 10배까지 빠릅니다&lt;/b&gt;. 이는 실시간 처리가 중요한 게임 서버나 gRPC 통신에서 결정적인 성능 차이를 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SyDlq/dJMcadf6DLa/hy5nU8IbWWTZvW6W578xU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SyDlq/dJMcadf6DLa/hy5nU8IbWWTZvW6W578xU1/img.png&quot; data-alt=&quot;[JSON vs Protobuf 데이터 크기 및 처리 속도 비교 다이어그램]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SyDlq/dJMcadf6DLa/hy5nU8IbWWTZvW6W578xU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSyDlq%2FdJMcadf6DLa%2Fhy5nU8IbWWTZvW6W578xU1%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;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[JSON vs Protobuf 데이터 크기 및 처리 속도 비교 다이어그램]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 강력한 스키마(Schema)와 타입 안정성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON은 데이터를 보낼 때 오타가 나도 모르는 경우가 많습니다. 반면, Protobuf는 &lt;code&gt;.proto&lt;/code&gt; 파일에 메시지 필드와 타입을 명확히 정의해야 합니다. 이는 개발 단계에서 형식 불일치 오류를 사전에 차단해 줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 언어 독립성 (Polyglot)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.proto&lt;/code&gt; 파일 하나만 있으면 C#, Java, Python, Go, C++ 등 다양한 언어의 전용 코드를 자동으로 생성할 수 있습니다. C# 서버와 Python AI 모델 서버가 통신해야 한다면? Protobuf가 가장 깔끔한 해결책입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;

&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4886914834712123&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-layout=&quot;in-article&quot;
     data-ad-format=&quot;fluid&quot;
     data-ad-client=&quot;ca-pub-4886914834712123&quot;
     data-ad-slot=&quot;9694145897&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 실전: C#에서 Protobuf 구현하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protobuf가 어떻게 작동하는지, 실제 C# 개발 환경을 가정해 단계별로 살펴보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 1: 스키마 정의 (.proto 파일 작성)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;code&gt;Person.proto&lt;/code&gt; 파일을 만들고 전송할 데이터 구조를 정의합니다. 각 필드에는 고유 번호(Tag)를 부여합니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;syntax = &quot;proto3&quot;; // 프로토콜 버퍼 버전 3 사용

message Person {   // 데이터 구조체 정의
  int32 id = 1;    // 고유 번호 
  string name = 2; // 고유 번호 2
  string email = 3; // 고유 번호 3
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 2: 코드 컴파일 (protoc)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의한 파일을 &lt;code&gt;protoc&lt;/code&gt; 컴파일러를 통해 컴파일하면, C#에서 바로 사용할 수 있는 &lt;code&gt;Person.cs&lt;/code&gt; 클래스 파일이 자동 생성됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 3: 직렬화 및 역직렬화 (C# Code)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 생성된 클래스를 사용하여 객체를 바이너리로 변환(직렬화)하거나 복원(역직렬화)할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// [C# 서버 예제 코드]
using Google.Protobuf;
using System.IO;

// 1. 객체 생성 (Builder 패턴과 유사)
Person user = new Person {
    Id = 1234,
    Name = &quot;Rainshelter&quot;,
    Email = &quot;blog@rainshelter.net&quot;
};

// 2. 직렬화 (Serialization): 객체 -&amp;gt; 바이너리 스트림
// JSON보다 훨씬 작은 크기의 바이트 배열로 변환됩니다.
byte[] bytes;
using (MemoryStream stream = new MemoryStream())
{
    user.WriteTo(stream);
    bytes = stream.ToArray(); 
}

// 3. 역직렬화 (Deserialization): 바이너리 스트림 -&amp;gt; 객체
Person restoredUser = Person.Parser.ParseFrom(bytes);&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tip:&lt;/b&gt; gRPC를 사용한다면 위와 같은 수동 변환 과정조차 필요 없이, 메소드 호출만으로 자동 직렬화가 수행되어 HTTP/2 위에서 고성능 통신이 가능해집니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 도입 전 고려해야 할 단점 (Trade-off)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 모든 상황에 Protobuf가 정답은 아닙니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가독성 문제:&lt;/b&gt; 바이너리 포맷이므로 와이어샤크(Wireshark) 등으로 패킷을 열어봐도 사람이 바로 읽을 수 없습니다. 디버깅 시에는 별도의 변환 도구가 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기 설정의 번거로움:&lt;/b&gt; JSON처럼 바로 데이터를 던질 수 없습니다. 반드시 &lt;code&gt;.proto&lt;/code&gt; 파일을 작성하고 컴파일하는 과정이 선행되어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 결론: 언제 사용해야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로토콜 버퍼(Protobuf)&lt;/b&gt;는 데이터 효율성과 유지보수성을 모두 갖춘 기술입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;강력 추천:&lt;/b&gt; MSA(마이크로서비스) 간 내부 통신, gRPC 서버 구축, 트래픽 비용 절감이 절실한 대규모 시스템.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비추천:&lt;/b&gt; 간단한 웹 API, 사람이 데이터를 직접 눈으로 확인하며 개발해야 하는 초기 프로토타입.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 빠른 C# 서버를 구축하고 싶다면, 지금 바로 프로젝트의 무거운 JSON을 Protobuf로 교체해 보세요.&lt;/p&gt;</description>
      <category>개발 &amp;amp; 프로그래밍/인사이트</category>
      <category>C#</category>
      <category>grpc</category>
      <category>JSON 비교</category>
      <category>protobuf</category>
      <category>데이터 직렬화</category>
      <category>서버 성능 최적화</category>
      <category>프로토콜 버퍼</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/258</guid>
      <comments>https://rammuking.tistory.com/entry/protobuf-vs-json-csharp-performance#entry258comment</comments>
      <pubDate>Wed, 22 Oct 2025 23:33:25 +0900</pubDate>
    </item>
    <item>
      <title>gRPC</title>
      <link>https://rammuking.tistory.com/entry/gRPC</link>
      <description>&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUzB9W/dJMb9hW8la8/W7tniWshgtTEht3pVThQbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUzB9W/dJMb9hW8la8/W7tniWshgtTEht3pVThQbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUzB9W/dJMb9hW8la8/W7tniWshgtTEht3pVThQbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUzB9W%2FdJMb9hW8la8%2FW7tniWshgtTEht3pVThQbk%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;880&quot; height=&quot;370&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC는 Google이 개발하고 현재 Cloud Native Computing Foundation(CNCF)에서 관리하는 &lt;b&gt;고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크&lt;/b&gt;이다.&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC는 클라이언트가 다른 머신의 서버 애플리케이션에 있는 메서드를 &lt;b&gt;로컬 객체처럼 호출&lt;/b&gt;할 수 있도록 설계되었다. 이때 데이터 전송에 &lt;b&gt;HTTP/2&lt;/b&gt; 프로토콜을 사용하여 다중 요청-응답 스트림을 하나의 연결로 주고받을 수 있다. 또한 **Protocol Buffers(프로토콜 버퍼)**를 활용해 데이터를 이진 형태로 직렬화해 빠르고 효율적인 통신이 가능하다.​&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 구성 요소&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 정의(.proto 파일)&lt;/b&gt;: 서버가 제공하는 메서드와 데이터 타입을 정의하며, 이 파일을 기반으로 각 언어별 클라이언트&amp;middot;서버 코드를 자동으로 생성한다.​&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클라이언트&amp;ndash;서버 채널&lt;/b&gt;: 클라이언트는 채널을 통해 서버에 RPC를 호출하고, 서버는 응답을 돌려준다. 채널은 여러 호출 간 재사용된다.​&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스트리밍&lt;/b&gt;: gRPC는 단방향&amp;middot;양방향 스트리밍을 모두 지원해 실시간 데이터 교환이나 대용량 전송에 적합하다.​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP/2 기반으로 &lt;b&gt;다중 요청 전송, 헤더 압축, 낮은 지연시간&lt;/b&gt;을 제공한다.​&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어와 플랫폼 독립적&lt;/b&gt;이며, 다양한 개발 언어에서 클라이언트/서버 코드를 쉽게 생성할 수 있다.​&lt;/li&gt;
&lt;li&gt;&lt;b&gt;양방향 스트리밍&lt;/b&gt;, &lt;b&gt;로드 밸런싱&lt;/b&gt;, &lt;b&gt;보안 인증(SSL/TLS)&lt;/b&gt;, &lt;b&gt;헬스체크 및 추적 기능&lt;/b&gt;을 내장하여 대규모 분산 시스템에 적합하다.&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP/2 지원이 필수라 인프라 환경이 제약될 수 있다.&lt;/li&gt;
&lt;li&gt;디버깅 및 로깅이 REST보다 어려우며, &lt;b&gt;프로토콜 버퍼 파일 관리&lt;/b&gt;가 복잡해질 수 있다.​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC는 &lt;b&gt;RESTful API보다 더 효율적이고 구조화된 통신 프레임워크&lt;/b&gt;로, 특히 &lt;b&gt;마이크로서비스(MSA)&lt;/b&gt; 아키텍처, &lt;b&gt;클라우드 네이티브 환경&lt;/b&gt;, &lt;b&gt;실시간 데이터 스트리밍 서비스&lt;/b&gt;에서 널리 사용되고 있다.​&lt;/p&gt;
&lt;/div&gt;</description>
      <category>개발 &amp;amp; 프로그래밍/인사이트</category>
      <category>grpc</category>
      <category>gRPC 마이크로서비스</category>
      <category>grpc 장단점</category>
      <category>HTTP/2</category>
      <category>protocol buffers</category>
      <category>프로토콜 버퍼</category>
      <author>Jiung.</author>
      <guid isPermaLink="true">https://rammuking.tistory.com/257</guid>
      <comments>https://rammuking.tistory.com/entry/gRPC#entry257comment</comments>
      <pubDate>Wed, 22 Oct 2025 23:27:25 +0900</pubDate>
    </item>
  </channel>
</rss>