<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>미노드로그</title>
    <link>https://teck10.tistory.com/</link>
    <description>IT기술 블로그로 기술을 정리하고 공유하기 위해 운영되는 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 12:50:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>미노드</managingEditor>
    <image>
      <title>미노드로그</title>
      <url>https://tistory1.daumcdn.net/tistory/1973431/attach/5b97f720da2d40ab9113883608c93585</url>
      <link>https://teck10.tistory.com</link>
    </image>
    <item>
      <title>[프론트] SPA(Single Page Application)</title>
      <link>https://teck10.tistory.com/524</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEQAA&quot; data-sfc-cp=&quot;&quot;&gt;프론트엔드가 SPA(Single Page Application, 단일 페이지 애플리케이션)로 구성된다는 것은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;웹 애플리케이션에 필요한 모든 정적 리소스를 최초 접근 시 한 번만 다운로드하고, 이후에는 페이지 새로고침 없이 필요한 데이터만 비동기(AJAX)로 가져와 화면을 갱신하는 방식&lt;/b&gt;을 의미합니다.&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_d,Z48ele_e&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_c/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAIQAA&quot; data-sfc-cp=&quot;&quot;&gt;전통적인 멀티 페이지 애플리케이션(MPA)과 달리, 앱(App)과 유사한 부드러운 사용자 경험을 제공하여 모던 웹 개발의 주류 패러다임으로 자리 잡았습니다.&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_j,Z48ele_k&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_i/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;hr data-processed=&quot;true&quot; data-serialized-params=&quot;[]&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;1. SPA의 주요 특징 및 장점&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_s,Z48ele_t&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_r/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;빠른 사용자 경험(UX):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;화면 전환 시 서버에서 HTML을 새로 받아오지 않고 화면의 일부분만 DOM 구조를 통해 교체하므로 네이티브 앱과 유사한 빠른 상호작용이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;서버 부하 감소:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;웹 페이지 전체를 렌더링하는 대신, 데이터(JSON)만 서버에서 가져오기 때문에 서버의 부담이 줄어듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;프론트-백엔드 분리:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프론트엔드(React, Vue 등)와 백엔드(API)가 명확히 분리되어 개발 효율성이 향상되고, 프론트엔드 개발자가 사용자 인터페이스에만 집중할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAw&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;앱과 유사한 구조:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;한 번 로드되면 페이지 이동이 없으므로, 하이브리드 앱 개발에 매우 적합합니다.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_18,Z48ele_19&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_17/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;2. SPA의 단점 및 도전 과제&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_1h,Z48ele_1i&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_1g/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAcQAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;초기 로딩 속도:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;처음에 HTML, CSS, JS 등 모든 리소스를 한 번에 다운로드하므로 초기 로딩 시간이 길어질 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAcQAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;검색 엔진 최적화(SEO)의 어려움:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;초기 HTML이 비어있는 쉘(Shell) 형태인 경우가 많아 검색 봇이 데이터를 수집하기 어렵습니다. (SSR 기술 등으로 해결 가능).&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAcQAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;보안 이슈:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터가 클라이언트 사이드에서 처리되기 때문에, 비즈니스 로직이 노출되거나 API가 취약해질 수 있어 보안 대책이 중요합니다.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_1u,Z48ele_1v&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_1t/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;3. SPA 구현 기술 (2026 트렌드)&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_22,Z48ele_23&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_21/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAkQAA&quot; data-sfc-cp=&quot;&quot;&gt;2026년 기준, SPA를 구현하는 대표적인 라이브러리와 프레임워크는 다음과 같습니다:&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_26,Z48ele_27&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_25/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAsQAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;React:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가장 널리 사용되는 라이브러리로, 유연성이 높습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAsQAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Vue.js:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이해하기 쉽고 사용성이 좋습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAsQAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Angular:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대규모 엔터프라이즈 프로젝트에 적합한 강력한 프레임워크입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAsQAw&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Svelte/SvelteKit:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;빠른 속도를 자랑하며 성능 중심 개발자들에게 인기가 높습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAsQBA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Next.js/Nuxt:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SPA의 SEO 문제를 해결하기 위해 SSR(Server Side Rendering)을 결합한 하이브리드 방식이 주류를 이룹니다.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_3n,Z48ele_3o&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_3m/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;4. SPA를 사용하기 좋은 경우&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_3t,Z48ele_3u&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_3s/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA0QAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;애플리케이션 내 상호작용이 많고(예: SNS, 대시보드), 빠르고 즉각적인 반응이 필요한 서비스.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA0QAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;사용자 데이터가 실시간으로 변경되는 경우.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA0QAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;네이티브 앱 형태로 전환을 고려하는 웹 서비스.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_43,Z48ele_44&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_42/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA4QAA&quot; data-sfc-cp=&quot;&quot;&gt;반면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정적 콘텐츠 위주의 블로그나 SEO가 매우 중요한 사이트&lt;/b&gt;라면 SPA 대신 SSR(Server-Side Rendering)이나 SSG(Static Site Generation) 방식을 고려해야 합니다.&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;Z48ele_48,Z48ele_49&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=Z48ele_47/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description>
      <category>IT기술/html</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/524</guid>
      <comments>https://teck10.tistory.com/524#entry524comment</comments>
      <pubDate>Thu, 12 Feb 2026 21:40:47 +0900</pubDate>
    </item>
    <item>
      <title>[프론트] 프론트 서버(BFF/SSR)</title>
      <link>https://teck10.tistory.com/523</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;1. BFF (Backend for Frontend)&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_o,AsqDTe_p&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_n/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAA&quot; data-sfc-cp=&quot;&quot;&gt;BFF는 특정 프론트엔드(웹, 모바일 앱, 데스크톱 등)에 최적화된 맞춤형 백엔드 서버를 의미합니다.&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_s,AsqDTe_t&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_r/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;배경&lt;/b&gt;: 마이크로서비스 아키텍처(MSA)에서 프론트엔드가 여러 백엔드 API를 직접 호출하면 데이터 가공이 복잡하고 비효율적인 문제를 해결하기 위해 등장했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;데이터 통합 및 가공&lt;/b&gt;: 여러 마이크로서비스에서 데이터를 가져와 화면에 맞게 정리(API 오케스트레이션)하여 전달.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQAw&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;프론트 친화적 API&lt;/b&gt;: 프론트엔드 개발자가 원하는 구조의 API 제공.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQBA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;보안/인증&lt;/b&gt;: 프론트엔드-백엔드 사이의 인증 로직, CORS 정책 등을 처리하여 클라이언트 사이드 보안 강화.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQBQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 프론트엔드의 비즈니스 로직 복잡성 감소, 클라이언트별 최적화된 데이터 제공, API 변화에 대한 유연성.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAUQBg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: 클라이언트별로 BFF를 관리해야 하므로 복잡성 증가, 관리/유지보수 부담.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_1j,AsqDTe_1k&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_1i/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-processed=&quot;true&quot; data-serialized-params=&quot;[]&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;2. SSR (Server-Side Rendering)&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_1x,AsqDTe_1y&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_1w/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAgQAA&quot; data-sfc-cp=&quot;&quot;&gt;SSR은 서버에서 페이지를 렌더링하여 완전한 HTML을 브라우저에 보내는 방식입니다.&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_21,AsqDTe_22&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_20/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;배경&lt;/b&gt;: 클라이언트 사이드 렌더링(CSR)의 초기 로딩 속도 저하와 검색 엔진 최적화(SEO) 문제를 해결하기 위해 다시 주목받고 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;초기 페이지 렌더링&lt;/b&gt;: 사용자가 URL에 접속하면 서버에서 데이터를 받아 HTML을 미리 생성.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQAw&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;SEO 향상&lt;/b&gt;: 검색 봇이 렌더링된 HTML을 쉽게 크롤링할 수 있어 검색 노출에 유리.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQBA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 빠른 초기 로딩 속도(TTI, FCP 개선), 뛰어난 SEO.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQBQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: 서버 부하 증가, CSR 대비 페이지 이동 시 상호작용 속도가 느릴 수 있음.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_3l,AsqDTe_3m&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_3k/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-processed=&quot;true&quot; data-serialized-params=&quot;[]&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;3. BFF와 SSR의 관계 및 활용&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_3y,AsqDTe_3z&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_3x/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA0QAA&quot; data-sfc-cp=&quot;&quot;&gt;현대적인 프론트엔드 서버는 종종 BFF와 SSR의 역할을 모두 수행합니다. 특히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Next.js&lt;/b&gt;가 그 대표적인 예입니다.&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_43,AsqDTe_44&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_42/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA4QAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;데이터 요청 및 렌더링&lt;/b&gt;: SSR을 통해 서버에서 데이터를 요청(BFF 역할)하고, 그 데이터를 사용하여 HTML을 렌더링(SSR 역할)합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA4QAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;프론트엔드 개발자의 영역 확대&lt;/b&gt;: 과거 UI 구현에 집중했던 프론트엔드 개발자가 Node.js 기반의 BFF/SSR 서버를 직접 구축하고 관리하게 되었습니다.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_4d,AsqDTe_4e&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_4c/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #001d35;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CA8QAA&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #e5edff;&quot;&gt;요약하자면, BFF는 '데이터의 가공'에 집중하고, SSR은 '화면의 렌더링'에 집중하여, 두 기술 모두 프론트엔드 생산성과 사용자 경험(UX)을 극대화하는 데 사용됩니다.&lt;/span&gt;&lt;/b&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AsqDTe_4k,AsqDTe_4l&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AsqDTe_4j/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description>
      <category>IT기술/html</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/523</guid>
      <comments>https://teck10.tistory.com/523#entry523comment</comments>
      <pubDate>Thu, 12 Feb 2026 21:39:33 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] aws cli에서 사용하기 좋은 명령</title>
      <link>https://teck10.tistory.com/522</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp;EC2&amp;nbsp;ssm&amp;nbsp;연결가능한지&amp;nbsp;확인 &lt;br /&gt;aws&amp;nbsp;ssm&amp;nbsp;describe-instance-information&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--region&amp;nbsp;ap-northeast-2&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--filters&amp;nbsp;Key=InstanceIds,Values=&amp;lt;새로운-instance-id&amp;gt; &lt;br /&gt;###&amp;nbsp;InstanceInformationList:&amp;nbsp;[]&amp;nbsp;&amp;nbsp;&amp;nbsp;이런식으로나오면&amp;nbsp;ssm연결불가능함 &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;인스턴스에서&amp;nbsp;ssm&amp;nbsp;agent&amp;nbsp;띄우는법 &lt;br /&gt;sudo&amp;nbsp;dnf&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;amazon-ssm-agent &lt;br /&gt;sudo&amp;nbsp;systemctl&amp;nbsp;enable&amp;nbsp;amazon-ssm-agent &lt;br /&gt;sudo&amp;nbsp;systemctl&amp;nbsp;start&amp;nbsp;amazon-ssm-agent &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;이&amp;nbsp;인스턴스가&amp;nbsp;있는&amp;nbsp;VPC&amp;nbsp;/&amp;nbsp;Subnet&amp;nbsp;/&amp;nbsp;SG&amp;nbsp;/&amp;nbsp;IAM&amp;nbsp;Instance&amp;nbsp;Profile&amp;nbsp;확인 &lt;br /&gt;aws&amp;nbsp;ec2&amp;nbsp;describe-instances&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--region&amp;nbsp;ap-northeast-2&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--instance-ids&amp;nbsp;$INSTANCE_ID&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--query&amp;nbsp;&quot;Reservations[0].Instances[0].{VpcId:VpcId,SubnetId:SubnetId,Az:Placement.AvailabilityZone,SGs:SecurityGroups[*].GroupId,IamProfileArn:IamInstanceProfile.Arn}&quot;&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--output&amp;nbsp;json &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;VPC에&amp;nbsp;SSM&amp;nbsp;관련&amp;nbsp;VPC&amp;nbsp;Endpoint가&amp;nbsp;있는지&amp;nbsp;확인 &lt;br /&gt;VPC_ID=vpc-xxxx &lt;br /&gt;aws&amp;nbsp;ec2&amp;nbsp;describe-vpc-endpoints&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--region&amp;nbsp;ap-northeast-2&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--filters&amp;nbsp;Name=vpc-id,Values=$VPC_ID&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--query&amp;nbsp;&quot;VpcEndpoints[].{Id:VpcEndpointId,Service:ServiceName,Type:VpcEndpointType,State:State}&quot;&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--output&amp;nbsp;table &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;terraform&amp;nbsp;console&amp;nbsp;로&amp;nbsp;현재&amp;nbsp;테라폼에서&amp;nbsp;사용가능한&amp;nbsp;변수&amp;nbsp;확인하기 &lt;br /&gt;terraform&amp;nbsp;console &lt;br /&gt;&amp;gt;&amp;nbsp;var.enable_eks &lt;br /&gt;&amp;gt;&amp;nbsp;var.enable_bastion &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;EC2&amp;nbsp;인스턴스에서&amp;nbsp;실행시&amp;nbsp;사용된&amp;nbsp;userData&amp;nbsp;스크립트&amp;nbsp;확인하기 &lt;br /&gt;aws&amp;nbsp;ec2&amp;nbsp;describe-instance-attribute&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--region&amp;nbsp;ap-northeast-2&amp;nbsp;--instance-id&amp;nbsp;i-02f4ba579ed76a1ea&amp;nbsp;--attribute&amp;nbsp;userData&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--query&amp;nbsp;&quot;UserData.Value&quot;&amp;nbsp;--output&amp;nbsp;text&amp;nbsp;|&amp;nbsp;base64&amp;nbsp;-d&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-n&amp;nbsp;80 &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;EC2&amp;nbsp;Console&amp;nbsp;Output&amp;nbsp;(중요,&amp;nbsp;많이씀) &lt;br /&gt;#&amp;nbsp;커널&amp;nbsp;메시지,ㅡ,&amp;nbsp;cloud-init&amp;nbsp;진행&amp;nbsp;로그&amp;nbsp;일부 &lt;br /&gt;#&amp;nbsp;user_data에서&amp;nbsp;/dev/console로&amp;nbsp;찍은&amp;nbsp;로그 &lt;br /&gt;aws&amp;nbsp;ec2&amp;nbsp;get-console-output&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--region&amp;nbsp;ap-northeast-2&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--instance-id&amp;nbsp;i-xxxxxxxxxxxxxxxxx&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--latest&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--query&amp;nbsp;&quot;Output&quot;&amp;nbsp;\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;--output&amp;nbsp;text&amp;nbsp;|&amp;nbsp;tail&amp;nbsp;-n&amp;nbsp;200 &lt;/p&gt;</description>
      <category>IT기술/클라우드, VM, AWS</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/522</guid>
      <comments>https://teck10.tistory.com/522#entry522comment</comments>
      <pubDate>Tue, 10 Feb 2026 23:31:20 +0900</pubDate>
    </item>
    <item>
      <title>[Webflux] 이해하기, webflux는 무엇인가?</title>
      <link>https://teck10.tistory.com/521</link>
      <description>&lt;p&gt;WebFlux로 “외부 HTTP 호출 → 응답 수신”을 할 때&lt;br&gt;스레드를 잡아두지 않고(Non-blocking), 데이터가 도착하는 이벤트에 반응해서 다음 단계로 흘려보내는 파이프라인으로 동작한다.&lt;br&gt;이 구조로 대기 기간이 없는 Nonblocking 방식의 통신을 지원한다.&lt;/p&gt;
&lt;p&gt;Webflux 구성요소를 정리해보면 다음과 같다.&lt;/p&gt;
&lt;p&gt;호출 주체: WebClient&lt;/p&gt;
&lt;p&gt;반환 타입: Mono / Flux (응답을 담는 그릇)&lt;/p&gt;
&lt;p&gt;외부 응답을 “값”으로 받는 게 아니라 “스트림”으로 받는다.&lt;br&gt;Mono&lt;T&gt;: 응답 0~1개 (보통 단건 응답)&lt;br&gt;Flux&lt;T&gt;: 응답 여러 개 (SSE/스트리밍/페이지 분할 등)&lt;/p&gt;
&lt;p&gt;요청 구성에 필요한 것 준비&lt;/p&gt;
&lt;p&gt;(1) URL / QueryParam&lt;br&gt;.uri(&amp;quot;https://...&amp;quot;) 또는 .uri(uriBuilder -&amp;gt; uriBuilder.path(&amp;quot;/x&amp;quot;).queryParam(&amp;quot;a&amp;quot;, 1).build())&lt;br&gt;(2) Method&lt;br&gt;.get() / .post() / .put() / .delete()&lt;br&gt;(3) Headers (인증/추적/콘텐츠 협상)&lt;br&gt;Authorization(Bearer/API-Key), Content-Type / Accept, Trace/Correlation-Id (로그 추적용)&lt;br&gt;(4) Body (POST/PUT)&lt;br&gt;JSON: .bodyValue(reqDto), Form: .body(BodyInserters.fromFormData(...)), 파일 멀티파트: MultipartBodyBuilder&lt;/p&gt;
&lt;p&gt;응답 수신에 필요한 것들&lt;/p&gt;
&lt;p&gt;(1) 상태코드 처리: retrieve() + onStatus(...)&lt;br&gt;(2) 바디 파싱: bodyToMono(...) / bodyToFlux(...)&lt;br&gt;(3) 타임아웃/리트라이/서킷브레이커 같은 “복원력”&lt;/p&gt;
&lt;p&gt;Thread/Blocking 규칙: “절대 막지 말기”&lt;/p&gt;
&lt;p&gt;WebFlux 에서 가장 중요한 단 하나:&lt;br&gt;.block(), .join(), JDBC 같은 블로킹 호출을 같은 체인에서 섞으면 WebFlux의 장점이 깨짐&lt;br&gt;왜냐면 WebFlux는 이벤트 루프 기반이라, 블로킹이 들어오면 이벤트 루프 스레드를 점유해버려서 전체 처리량이 떨어진다.&lt;/p&gt;
&lt;p&gt;가능하면 R2DBC(DB), reactive driver를 쓰는 게 정석&lt;/p&gt;
&lt;p&gt;“내 서비스”에서 컨트롤러까지 이어지는 형태&lt;/p&gt;
&lt;p&gt;외부 호출 결과를 WebFlux 컨트롤러가 그대로 리턴할 때의 이상적인 흐름:&lt;/p&gt;
&lt;p&gt;Controller는 Mono&lt;Res&gt;를 반환&lt;/p&gt;
&lt;p&gt;Service는 WebClient로 외부 호출하고 Mono로 반환&lt;/p&gt;
&lt;p&gt;중간에 매핑/검증/에러처리/로깅을 map/flatMap/onErrorMap/doOnNext 등으로 체이닝&lt;/p&gt;
&lt;p&gt;즉, “받은 다음 처리”가 아니라 &lt;strong&gt;“받으면 처리하도록 선언”&lt;/strong&gt;하는 스타일.&lt;/p&gt;
&lt;p&gt;필수인 부가 요소&lt;/p&gt;
&lt;p&gt;외부 호출은 “호출 성공” 뒤에 필요할 수 있는 요소&lt;/p&gt;
&lt;p&gt;로깅/트레이싱: request-id, response time, status 기록&lt;/p&gt;
&lt;p&gt;메트릭: 성공/실패/latency&lt;/p&gt;
&lt;p&gt;에러 모델링: 외부 에러를 내부 에러코드로 매핑 (예: PG 오류 → 우리 도메인 에러)&lt;/p&gt;
&lt;p&gt;논블로킹(Non-blocking)이란?&lt;br&gt;“기다림 자체가 없다”&lt;/p&gt;
&lt;p&gt;스레드가 I/O 대기 때문에 멈추지 않음&lt;/p&gt;
&lt;p&gt;“데이터 준비됨” 이벤트가 올 때만 처리&lt;/p&gt;
&lt;p&gt;보통 이벤트 루프(Event Loop) 구조&lt;/p&gt;
&lt;p&gt;WebFlux에서의 논블로킹&lt;br&gt;WebFlux는:&lt;/p&gt;
&lt;p&gt;요청 N개 = 소수 이벤트 루프 스레드&lt;/p&gt;
&lt;p&gt;외부 API 대기 중에도 스레드는 놀지 않음&lt;/p&gt;
&lt;p&gt;비동기: 언제 올지 모르는 결과를 Mono/Flux로 표현&lt;/p&gt;
&lt;p&gt;논블로킹: 그 결과를 기다리느라 스레드를 묶지 않음&lt;/p&gt;
&lt;p&gt;WebFlux: 비동기와 논블로킹을 동시에 강제하는 모델&lt;/p&gt;
&lt;p&gt;기존 MVC에서는 &lt;/p&gt;
&lt;p&gt;요청 1개 = 스레드 1개&lt;/p&gt;
&lt;p&gt;외부 API 1초 지연 → 스레드 1초 점유 (대기, blocking)&lt;/p&gt;
&lt;p&gt;비동기로 할 수 있지만, 대기가 필요할 수 있어 논블로킹은 아니다.&lt;/p&gt;</description>
      <category>IT기술/spring</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/521</guid>
      <comments>https://teck10.tistory.com/521#entry521comment</comments>
      <pubDate>Tue, 23 Dec 2025 10:58:51 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] CSRF 가 무엇?</title>
      <link>https://teck10.tistory.com/520</link>
      <description>&lt;h1 data-end=&quot;163&quot; data-start=&quot;116&quot;&gt;1. CSRF(Cross-Site Request Forgery)가 무엇인가?&lt;/h1&gt;
&lt;p data-end=&quot;215&quot; data-start=&quot;164&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;유저의 브라우저를 속여서, 유저가 의도하지 않은 요청을 서버로 보내게 만드는 공격&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;229&quot; data-start=&quot;217&quot; data-ke-size=&quot;size20&quot;&gt;예시로 이해해보자&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;359&quot; data-start=&quot;230&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;308&quot; data-start=&quot;230&quot;&gt;사용자가 A사이트(admin.example.com)에 로그인했음&lt;br /&gt;&amp;rarr; 브라우저에는 JSESSIONID 같은 &lt;b&gt;쿠키가 저장됨&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;330&quot; data-start=&quot;310&quot;&gt;사용자가 악성 사이트 B를 방문&lt;/li&gt;
&lt;li data-end=&quot;359&quot; data-start=&quot;332&quot;&gt;그 사이트가 숨겨진 HTML을 자동 제출함:&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;form&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;action&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;a href=&quot;https://admin.example.com/user/delete&quot;&gt;https://admin.example.com/user/delete&lt;/a&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;method&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;POST&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;input&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;type&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;hidden&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;name&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;userId&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;100&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;form&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;script&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;document&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;forms&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;&lt;span&gt;submit&lt;/span&gt;&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;script&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;4. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;브라우저는 &lt;/span&gt;&lt;b&gt;자동으로 쿠키(JSESSIONID)를 붙여서&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; A 서버로 요청을 보냄&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서버는 &quot;정상 로그인된 사용자&quot;라고 착각하고 요청을 처리함&lt;/p&gt;
&lt;p data-end=&quot;696&quot; data-start=&quot;639&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;CSRF는 &amp;lsquo;브라우저가 자동으로 쿠키를 요청에 넣는 동작&amp;rsquo;을 악용한 공격&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-end=&quot;739&quot; data-start=&quot;703&quot; data-ke-size=&quot;size23&quot;&gt;2. Spring Security csrf()의 역할&lt;/h3&gt;
&lt;p data-end=&quot;792&quot; data-start=&quot;740&quot; data-ke-size=&quot;size16&quot;&gt;Spring Security는 기본적으로 &lt;b&gt;CSRF를 방어하기 위해 아래 조건을 확인함&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;872&quot; data-start=&quot;794&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;830&quot; data-start=&quot;794&quot;&gt;POST/PUT/PATCH/DELETE 같은 요청이 올 때&lt;/li&gt;
&lt;li data-end=&quot;859&quot; data-start=&quot;831&quot;&gt;요청 안에 CSRF Token이 있는지 검사&lt;/li&gt;
&lt;li data-end=&quot;872&quot; data-start=&quot;860&quot;&gt;없으면 요청을 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;901&quot; data-start=&quot;874&quot; data-ke-size=&quot;size16&quot;&gt;즉, CSRF Token 체계를 강제하는 장치.&lt;/p&gt;
&lt;hr data-end=&quot;906&quot; data-start=&quot;903&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;956&quot; data-start=&quot;908&quot; data-ke-size=&quot;size23&quot;&gt;3. csrf().disable() &amp;rarr; false 로 바꿔서 끌 때의 효과&lt;/h3&gt;
&lt;h4 data-end=&quot;995&quot; data-start=&quot;958&quot; data-ke-size=&quot;size20&quot;&gt;  &lt;b&gt;true = CSRF 보호 활성화 (기본값)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1084&quot; data-start=&quot;996&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1022&quot; data-start=&quot;996&quot;&gt;HTML Form 기반 프로젝트에서 필요&lt;/li&gt;
&lt;li data-end=&quot;1084&quot; data-start=&quot;1023&quot;&gt;다음 조건 충족해야 요청 허용됨:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1084&quot; data-start=&quot;1046&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1062&quot; data-start=&quot;1046&quot;&gt;요청에 CSRF 토큰 존재&lt;/li&gt;
&lt;li data-end=&quot;1084&quot; data-start=&quot;1065&quot;&gt;토큰이 서버에 저장된 값과 일치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1191&quot; data-start=&quot;1086&quot; data-ke-size=&quot;size16&quot;&gt;❗ HTML form 에 hidden input으로 _csrf 값을 넣어야 함&lt;br /&gt;❗ REST API 클라이언트(axios, fetch)는 매 요청마다 헤더로 CSRF 토큰을 보내야 함&lt;/p&gt;
&lt;h4 data-end=&quot;1245&quot; data-start=&quot;1193&quot; data-ke-size=&quot;size20&quot;&gt;❗ &lt;b&gt;false = CSRF 보호 비활성화 (csrf().disable() )&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1334&quot; data-start=&quot;1246&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1260&quot; data-start=&quot;1246&quot;&gt;&lt;b&gt;토큰 검사 없음&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1294&quot; data-start=&quot;1261&quot;&gt;서버는 POST/PUT/DELETE 요청을 그대로 허용함&lt;/li&gt;
&lt;li data-end=&quot;1334&quot; data-start=&quot;1295&quot;&gt;브라우저 쿠키 기반 인증이면 매우 위험해짐 &amp;rarr; CSRF 공격에 취약&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1339&quot; data-start=&quot;1336&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1376&quot; data-start=&quot;1341&quot; data-ke-size=&quot;size23&quot;&gt;4. CSRF를 꺼도 안전한 경우 (핵심 이해 포인트)&lt;/h3&gt;
&lt;h4 data-end=&quot;1420&quot; data-start=&quot;1378&quot; data-ke-size=&quot;size20&quot;&gt;  JWT 기반 인증 + Authorization Header 사용&lt;/h4&gt;
&lt;p data-end=&quot;1459&quot; data-start=&quot;1421&quot; data-ke-size=&quot;size16&quot;&gt;JWT가 &lt;b&gt;쿠키에 들어가지 않고&lt;/b&gt;, 매 요청마다 이렇게 보낸다면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Authorization: Bearer &amp;lt;jwt&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1601&quot; data-start=&quot;1498&quot; data-ke-size=&quot;size16&quot;&gt;➡️ 브라우저는 자동으로 Authorization 헤더를 넣지 못함&lt;br /&gt;➡️ 공격자가 악성 페이지에서 요청을 보내도 JWT를 실을 수 없음&lt;br /&gt;➡️ &lt;b&gt;CSRF 자체가 성립하지 않음&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1665&quot; data-start=&quot;1662&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1693&quot; data-start=&quot;1667&quot; data-ke-size=&quot;size23&quot;&gt;5. CSRF를 반드시 켜야 하는 경우&lt;/h3&gt;
&lt;h4 data-end=&quot;1725&quot; data-start=&quot;1695&quot; data-ke-size=&quot;size20&quot;&gt;세션 기반 로그인(JSESSIONID 사용)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Cookie: JSESSIONID=abc123 &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1820&quot; data-start=&quot;1765&quot; data-ke-size=&quot;size16&quot;&gt;이런 형태라면 브라우저는 자동으로 쿠키를 첨부함 &amp;rarr; CSRF 성립&lt;br /&gt;&amp;rarr; 반드시 CSRF를 켜야 함&lt;/p&gt;
&lt;h4 data-end=&quot;1844&quot; data-start=&quot;1822&quot; data-ke-size=&quot;size20&quot;&gt;JWT를 쿠키에 저장하는 경우&lt;/h4&gt;
&lt;p data-end=&quot;1859&quot; data-start=&quot;1845&quot; data-ke-size=&quot;size16&quot;&gt;토큰이 쿠키로 내려온다면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Cookie: accessToken=eyJhbGciOi... &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1941&quot; data-start=&quot;1908&quot; data-ke-size=&quot;size16&quot;&gt;이 경우도 쿠키는 자동 첨부되므로 &lt;b&gt;CSRF 공격 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1946&quot; data-start=&quot;1943&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1973&quot; data-start=&quot;1948&quot; data-ke-size=&quot;size23&quot;&gt;6. 핵심 요약 (가장 중요한 4줄)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2228&quot; data-start=&quot;1975&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2020&quot; data-start=&quot;1975&quot;&gt;&lt;b&gt;CSRF는 브라우저가 쿠키를 자동으로 보내는 특성을 악용한 공격이다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2084&quot; data-start=&quot;2021&quot;&gt;&lt;b&gt;CSRF true(=보호 ON)&lt;/b&gt; &amp;rarr; POST/PUT/DELETE 는 반드시 CSRF 토큰 검증 필요.&lt;/li&gt;
&lt;li data-end=&quot;2148&quot; data-start=&quot;2085&quot;&gt;&lt;b&gt;CSRF false(=보호 OFF)&lt;/b&gt; &amp;rarr; 토큰 검사 없이 요청 허용 &amp;rarr; 쿠키 기반 인증이면 매우 위험.&lt;/li&gt;
&lt;li data-end=&quot;2228&quot; data-start=&quot;2149&quot;&gt;&lt;b&gt;JWT를 쿠키에 저장하지 않고 Authorization 헤더로만 사용한다면 CSRF는 성립하지 않으므로 disable이 안전하다.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>IT기술/html</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/520</guid>
      <comments>https://teck10.tistory.com/520#entry520comment</comments>
      <pubDate>Wed, 10 Dec 2025 15:46:49 +0900</pubDate>
    </item>
    <item>
      <title>[암호] aes, sha 알고리즘의 특징</title>
      <link>https://teck10.tistory.com/519</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;업무를 진행하며 암호화 알고리즘으로 어떤 것을 선택해야 할지 판단 기준이 모호하고 어려운 부분이 있어 이부분에 대해 정리하고 넘어가려고 한다.&lt;/p&gt;
&lt;h3 data-end=&quot;127&quot; data-start=&quot;85&quot; data-ke-size=&quot;size23&quot;&gt;1. AES (Advanced Encryption Standard)&lt;/h3&gt;
&lt;p data-end=&quot;146&quot; data-start=&quot;128&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 대칭키 암호화 알고리즘&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;917&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgPHSs/dJMcagKHMV2/0kOJgO5vloMCV0e7tBRyVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgPHSs/dJMcagKHMV2/0kOJgO5vloMCV0e7tBRyVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgPHSs/dJMcagKHMV2/0kOJgO5vloMCV0e7tBRyVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgPHSs%2FdJMcagKHMV2%2F0kOJgO5vloMCV0e7tBRyVk%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;917&quot; height=&quot;644&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;146&quot; data-start=&quot;128&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;229&quot; data-start=&quot;202&quot;&gt;&lt;b&gt;암호화&amp;middot;복호화에 동일한 키를 사용&lt;/b&gt;한다.&lt;/li&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;230&quot;&gt;데이터를 &lt;b&gt;숨기는 용도(기밀성)&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;254&quot;&gt;블록 단위로 데이터를 암호화한다. ( 128bit, 192bit, 256bit 키 지원 )&lt;/li&gt;
&lt;li data-end=&quot;366&quot; data-start=&quot;338&quot;&gt;키 길이가 길수록 안전하지만 연산량이 약간 증가&lt;/li&gt;
&lt;li data-end=&quot;409&quot; data-start=&quot;367&quot;&gt;AES-256은 현재 &lt;b&gt;전 세계적으로 가장 강력한 표준 대칭키 암호&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;429&quot; data-start=&quot;411&quot; data-ke-size=&quot;size20&quot;&gt;1.1 동작 방식(운용 모드)&lt;/h4&gt;
&lt;p data-end=&quot;460&quot; data-start=&quot;430&quot; data-ke-size=&quot;size16&quot;&gt;블록암호라 &amp;ldquo;어떻게 묶어서 암호화할지&amp;rdquo; 모드가 중요함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;593&quot; data-start=&quot;461&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;498&quot; data-start=&quot;461&quot;&gt;&lt;b&gt;ECB&lt;/b&gt;: 블록 반복 노출 &amp;rarr; 보안 취약 (실무에서 금지)&lt;/li&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;499&quot;&gt;&lt;b&gt;CBC&lt;/b&gt;: 초기화 벡터(IV) 필요, 패딩 필요 (AES/CBC/PKCS5Padding)&lt;/li&gt;
&lt;li data-end=&quot;566&quot; data-start=&quot;531&quot;&gt;&lt;b&gt;GCM&lt;/b&gt;: 암호 + 무결성 검증까지 제공 &amp;rarr; 최신 표준&lt;/li&gt;
&lt;li data-end=&quot;593&quot; data-start=&quot;567&quot;&gt;&lt;b&gt;CTR&lt;/b&gt;: 패딩 불필요, 병렬처리 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;603&quot; data-start=&quot;595&quot; data-ke-size=&quot;size20&quot;&gt;1.2 장단점&lt;/h4&gt;
&lt;p data-end=&quot;603&quot; data-start=&quot;595&quot; data-ke-size=&quot;size16&quot;&gt;✔ 장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;663&quot; data-start=&quot;604&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;613&quot; data-start=&quot;604&quot;&gt;매우 빠름&lt;/li&gt;
&lt;li data-end=&quot;631&quot; data-start=&quot;614&quot;&gt;대용량 데이터 처리 적합&lt;/li&gt;
&lt;li data-end=&quot;663&quot; data-start=&quot;632&quot;&gt;하드웨어 가속(AES-NI) 지원으로 성능 뛰어남&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;673&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;✔ 단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;740&quot; data-start=&quot;674&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;710&quot; data-start=&quot;674&quot;&gt;키 관리가 어렵다(같은 키를 양쪽 모두 안전하게 보관해야 함)&lt;/li&gt;
&lt;li data-end=&quot;740&quot; data-start=&quot;711&quot;&gt;키가 유출되면 복호화 가능 &amp;rarr; 기밀성 완전히 붕괴&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. SHA (Secure Hash Algorithm)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 해시 함수 / 단방향 함수&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etWG8o/dJMcahbL4Zf/Pb0WfPnk8pVWuJJLcNjLPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etWG8o/dJMcahbL4Zf/Pb0WfPnk8pVWuJJLcNjLPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etWG8o/dJMcahbL4Zf/Pb0WfPnk8pVWuJJLcNjLPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FetWG8o%2FdJMcahbL4Zf%2FPb0WfPnk8pVWuJJLcNjLPK%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;1042&quot; height=&quot;745&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;745&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;888&quot; data-start=&quot;859&quot;&gt;입력 데이터를 &lt;b&gt;고정 길이의 해시값으로 변환&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;938&quot; data-start=&quot;889&quot;&gt;&lt;b&gt;절대 복호화 불가능(단방향)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 암호가 아니라 &lt;b&gt;지문&lt;/b&gt; 만드는 방식, 역함수가 없어 복호화 불가능&lt;br /&gt;&amp;rarr; 레인보우 테이블(Rainbow Table)&lt;/li&gt;
&lt;li data-end=&quot;971&quot; data-start=&quot;951&quot;&gt;데이터가 바뀌었는지 확인(무결성)&lt;/li&gt;
&lt;li data-end=&quot;994&quot; data-start=&quot;972&quot;&gt;비밀번호 저장(평문 대신 해시 저장)&lt;/li&gt;
&lt;li data-end=&quot;1016&quot; data-start=&quot;995&quot;&gt;디지털 서명&amp;middot;토큰 생성(JWT 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1032&quot; data-start=&quot;1018&quot; data-ke-size=&quot;size20&quot;&gt;2.1 해시 함수 종류&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1115&quot; data-start=&quot;1033&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1033&quot;&gt;SHA-1 (취약) &amp;mdash; 사용 금지&lt;/li&gt;
&lt;li data-end=&quot;1083&quot; data-start=&quot;1054&quot;&gt;&lt;b&gt;SHA-256&lt;/b&gt; &amp;mdash; 가장 널리 사용되는 표준&lt;/li&gt;
&lt;li data-end=&quot;1115&quot; data-start=&quot;1084&quot;&gt;SHA-384, SHA-512 &amp;mdash; 더 긴 해시값 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1125&quot; data-start=&quot;1117&quot; data-ke-size=&quot;size20&quot;&gt;2.2 해시 함수 특성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1241&quot; data-start=&quot;1126&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1164&quot; data-start=&quot;1126&quot;&gt;동일 입력 &amp;rarr; 항상 동일 해시값 출력 (Deterministic)&lt;/li&gt;
&lt;li data-end=&quot;1205&quot; data-start=&quot;1165&quot;&gt;입력 조금만 바뀌어도 완전히 다른 값 출력 (Avalanche 효과)&lt;/li&gt;
&lt;li data-end=&quot;1226&quot; data-start=&quot;1206&quot;&gt;해시값으로 원래 데이터 복원 불가&lt;/li&gt;
&lt;li data-end=&quot;1241&quot; data-start=&quot;1227&quot;&gt;충돌이 발생하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1251&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size20&quot;&gt;2.3 장단점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1298&quot; data-start=&quot;1252&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1260&quot; data-start=&quot;1252&quot;&gt;빠르고 단순&lt;/li&gt;
&lt;li data-end=&quot;1277&quot; data-start=&quot;1261&quot;&gt;데이터 무결성 체크에 최적&lt;/li&gt;
&lt;li data-end=&quot;1298&quot; data-start=&quot;1278&quot;&gt;저장 공간 적게 사용(고정 길이)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1434&quot; data-start=&quot;1309&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1335&quot; data-start=&quot;1309&quot;&gt;암호화가 아니므로 &lt;b&gt;데이터 보호 불가능&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1434&quot; data-start=&quot;1336&quot;&gt;단독으로 비밀번호 보호에 쓰면 위험 &amp;rarr; 단순 SHA-256(password) 금지&lt;br /&gt;&amp;rarr; 반드시 salt + 반복 횟수 필요 (PBKDF2, bcrypt, scrypt)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.4 Salt&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?? **Salt(솔트)**는 해시(Hash) 과정에 섞어 넣는 &lt;b&gt;임의의 랜덤 문자열&lt;/b&gt;.&lt;br /&gt;SHA-256 같은 해시는 &lt;b&gt;같은 입력 &amp;rarr; 같은 출력&lt;/b&gt;이라는 특징 때문에, 보안에서 취약점이 생기는데, 이를 막기 위한 필수 요소가 바로 salt &lt;br /&gt;- Salt가 추가되면 이렇게 바뀐다. (즉 기존의 hash값으로 찾는게 불가능해진다. 미리 계산된 값으로 추적 불가능)&lt;br /&gt;SHA256(&quot;123456&quot;&amp;nbsp;+&amp;nbsp;salt1)&amp;nbsp;&amp;rarr;&amp;nbsp;8fa1... &lt;br /&gt;SHA256(&quot;123456&quot;&amp;nbsp;+&amp;nbsp;salt2)&amp;nbsp;&amp;rarr;&amp;nbsp;c21e...&lt;/p&gt;
&lt;p data-end=&quot;764&quot; data-start=&quot;736&quot; data-ke-size=&quot;size16&quot;&gt;1) 사용자별로 다른 salt를 사용, salt는 &lt;b&gt;각 계정마다 랜덤 생성&lt;/b&gt;하는 게 원칙.&lt;br /&gt;2) salt는 비밀키가 아니며, 평문으로 DB에 저장해도 괜찮다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; salt의 목적은 비밀번호 패턴을 깨뜨리는 것이지 감추는 게 아님. &lt;br /&gt;3) 길고 예측불가능해야 한다. (8~16바이트 이상 랜덤값 사용.)&lt;br /&gt;4) 반복 연산(PBKDF2/bcrypt/argon2)과 함께 써야 더욱 안전 &lt;br /&gt;&amp;nbsp;&amp;nbsp; SHA-256 단독 + salt &amp;rarr; 여전히 빠르기 때문에 공격자도 빨리 계산 가능&lt;br /&gt;&amp;nbsp; &amp;nbsp;➡ 그래서 bcrypt / PBKDF2 / Argon2 같은 &amp;ldquo;느린 해시 함수&amp;rdquo;를 사용해야 안전함.&lt;/p&gt;
&lt;h1 data-end=&quot;1451&quot; data-start=&quot;1441&quot;&gt;비교 요약&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1700&quot; data-start=&quot;1453&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;AES&lt;/td&gt;
&lt;td&gt;SHA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1519&quot; data-start=&quot;1495&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1500&quot; data-start=&quot;1495&quot;&gt;유형&lt;/td&gt;
&lt;td data-end=&quot;1510&quot; data-start=&quot;1500&quot; data-col-size=&quot;sm&quot;&gt;대칭키 암호화&lt;/td&gt;
&lt;td data-end=&quot;1519&quot; data-start=&quot;1510&quot; data-col-size=&quot;sm&quot;&gt;해시 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1551&quot; data-start=&quot;1520&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1525&quot; data-start=&quot;1520&quot;&gt;목적&lt;/td&gt;
&lt;td data-end=&quot;1535&quot; data-start=&quot;1525&quot; data-col-size=&quot;sm&quot;&gt;데이터 기밀성&lt;/td&gt;
&lt;td data-end=&quot;1551&quot; data-start=&quot;1535&quot; data-col-size=&quot;sm&quot;&gt;무결성, 비밀번호 해싱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1584&quot; data-start=&quot;1552&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1559&quot; data-start=&quot;1552&quot;&gt;키 존재&lt;/td&gt;
&lt;td data-end=&quot;1578&quot; data-start=&quot;1559&quot; data-col-size=&quot;sm&quot;&gt;있음(암호화&amp;middot;복호화 동일 키)&lt;/td&gt;
&lt;td data-end=&quot;1584&quot; data-start=&quot;1578&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1603&quot; data-start=&quot;1585&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1591&quot; data-start=&quot;1585&quot;&gt;역변환&lt;/td&gt;
&lt;td data-end=&quot;1596&quot; data-start=&quot;1591&quot; data-col-size=&quot;sm&quot;&gt;가능&lt;/td&gt;
&lt;td data-end=&quot;1603&quot; data-start=&quot;1596&quot; data-col-size=&quot;sm&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1649&quot; data-start=&quot;1604&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1612&quot; data-start=&quot;1604&quot;&gt;출력 길이&lt;/td&gt;
&lt;td data-end=&quot;1629&quot; data-start=&quot;1612&quot; data-col-size=&quot;sm&quot;&gt;입력 크기와 동일(암호문)&lt;/td&gt;
&lt;td data-end=&quot;1649&quot; data-start=&quot;1629&quot; data-col-size=&quot;sm&quot;&gt;고정 크기(예: 256bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1700&quot; data-start=&quot;1650&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1657&quot; data-start=&quot;1650&quot;&gt;사용 예&lt;/td&gt;
&lt;td data-end=&quot;1679&quot; data-start=&quot;1657&quot; data-col-size=&quot;sm&quot;&gt;파일 암호화, TLS, DB 암호화&lt;/td&gt;
&lt;td data-end=&quot;1700&quot; data-start=&quot;1679&quot; data-col-size=&quot;sm&quot;&gt;JWT, 비밀번호 저장, 체크섬&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 언제 AES, 언제 SHA?&lt;/h3&gt;
&lt;h4 data-end=&quot;1749&quot; data-start=&quot;1729&quot; data-ke-size=&quot;size20&quot;&gt;  AES 사용해야 할 상황&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1838&quot; data-start=&quot;1750&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1772&quot; data-start=&quot;1750&quot;&gt;DB에 중요한 값을 암호화해야 함&lt;/li&gt;
&lt;li data-end=&quot;1792&quot; data-start=&quot;1773&quot;&gt;통신 데이터를 암호화해야 함&lt;/li&gt;
&lt;li data-end=&quot;1838&quot; data-start=&quot;1793&quot;&gt;파일을 저장하는데 외부 유출 위험이 있음&lt;br /&gt;➡ &lt;b&gt;복호화가 필요한 데이터&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1860&quot; data-start=&quot;1840&quot; data-ke-size=&quot;size20&quot;&gt;  SHA 사용해야 할 상황&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1941&quot; data-start=&quot;1861&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1872&quot; data-start=&quot;1861&quot;&gt;비밀번호 저장&lt;/li&gt;
&lt;li data-end=&quot;1891&quot; data-start=&quot;1873&quot;&gt;데이터가 변경되었는지 검증&lt;/li&gt;
&lt;li data-end=&quot;1941&quot; data-start=&quot;1892&quot;&gt;토큰 서명(JWT의 Signature 부분)&lt;br /&gt;➡ &lt;b&gt;복호화가 필요 없는 데이터&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고, Spring Security 표준 암호화 방식인 BCrypt 도 단방향 암호화, 해시 방식.&lt;/b&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;1840&quot; data-end=&quot;1860&quot;&gt;  Spring Security 기본 PasswordEncoder는 &lt;b&gt;BCryptPasswordEncoder&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;278&quot; data-start=&quot;272&quot; 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-end=&quot;372&quot; data-start=&quot;279&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;295&quot; data-start=&quot;279&quot;&gt;자동 솔팅(salt 포함)&lt;/li&gt;
&lt;li data-end=&quot;327&quot; data-start=&quot;296&quot;&gt;비용(cost factor)로 연산 난이도 조절 가능&lt;/li&gt;
&lt;li data-end=&quot;343&quot; data-start=&quot;328&quot;&gt;무차별 대입 공격에 강함&lt;/li&gt;
&lt;li data-end=&quot;372&quot; data-start=&quot;344&quot;&gt;Java/Spring 진영에서 가장 널리 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;501&quot; data-start=&quot;374&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;501&quot; data-start=&quot;376&quot; data-ke-size=&quot;size16&quot;&gt;Spring Security 5+에서는 PasswordEncoderFactories.createDelegatingPasswordEncoder() 의 기본 알고리즘이 {bcrypt} 로 되어 있음 &amp;rarr; 표준 채택이라는 의미.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT기술/Hello기술</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/519</guid>
      <comments>https://teck10.tistory.com/519#entry519comment</comments>
      <pubDate>Tue, 25 Nov 2025 13:27:20 +0900</pubDate>
    </item>
    <item>
      <title>집사고나서 나가는 세금 정리하기, 취득세부터 재산세 등</title>
      <link>https://teck10.tistory.com/518</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 2025년 10월 기준, 집을 살 때, 보유하고 있을 때, 팔 때, 상속할 때 들어가는 세금에 대해 정리해보자.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 집 살때, 매매할 때 세금&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 433px;&quot; border=&quot;1&quot; data-end=&quot;665&quot; data-start=&quot;106&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;665&quot; data-start=&quot;184&quot;&gt;
&lt;tr style=&quot;height: 13px;&quot;&gt;
&lt;td style=&quot;height: 13px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;height: 13px;&quot;&gt;세목명&lt;/td&gt;
&lt;td style=&quot;height: 13px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;height: 13px;&quot;&gt;주요 세율 / 계산 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 273px;&quot; data-end=&quot;404&quot; data-start=&quot;184&quot;&gt;
&lt;td style=&quot;height: 273px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;196&quot; data-start=&quot;184&quot;&gt;&lt;b&gt;① 취득세&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 273px;&quot; data-end=&quot;216&quot; data-start=&quot;196&quot; data-col-size=&quot;sm&quot;&gt;부동산을 취득할 때 내는 지방세&lt;/td&gt;
&lt;td style=&quot;height: 273px;&quot; data-end=&quot;253&quot; data-start=&quot;216&quot; data-col-size=&quot;sm&quot;&gt;집을 매매&amp;middot;증여&amp;middot;상속 등으로 &lt;b&gt;소유권을 취득할 때&lt;/b&gt; 부과됨&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;중요, 취득세는 대출이 안된다. 이거 감안해서 대출해야한다.&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 273px;&quot; data-end=&quot;404&quot; data-start=&quot;253&quot; data-col-size=&quot;lg&quot;&gt;- 일반 주택: &lt;b&gt;1~3% (누진세)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;bull; 6억 이하: 1%&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;bull; 6억~9억: 2%&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;bull; 9억 초과: 3%&lt;br /&gt;- &lt;b&gt;조정대상지역 2주택&lt;/b&gt;: 8%&lt;br /&gt;- &lt;b&gt;조정대상지역&lt;/b&gt; &lt;b&gt;3주택 이상&lt;/b&gt;: 12%&lt;br /&gt;※ 현재 서울전역, 경기 일부 지역은 조정대상지역이다.&lt;br /&gt;- &lt;b&gt;비조정대상지역&lt;/b&gt; 1~2주택 : 1~3%&lt;br /&gt;- &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;비조정대상지역&lt;/b&gt;&lt;span&gt; 3주택 : 8%&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;- &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;비조정대상지역&lt;/b&gt;&lt;span&gt; 4주택 12.4~13.4%&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;- &lt;b&gt;오피스텔&amp;middot;상가&lt;/b&gt;: 4.6% (지방교육세 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot; data-end=&quot;481&quot; data-start=&quot;405&quot;&gt;
&lt;td style=&quot;height: 42px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;428&quot; data-start=&quot;405&quot;&gt;&lt;b&gt;② 농어촌특별세 / 지방교육세&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;439&quot; data-start=&quot;428&quot; data-col-size=&quot;sm&quot;&gt;취득세의 부가세&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;456&quot; data-start=&quot;439&quot; data-col-size=&quot;sm&quot;&gt;취득세의 일정 비율로 추가&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;481&quot; data-start=&quot;456&quot; data-col-size=&quot;lg&quot;&gt;보통 &lt;b&gt;취득세의 10~20%&lt;/b&gt; 수준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 63px;&quot; data-end=&quot;578&quot; data-start=&quot;482&quot;&gt;
&lt;td style=&quot;height: 63px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;494&quot; data-start=&quot;482&quot;&gt;&lt;b&gt;③ 인지세&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 63px;&quot; data-end=&quot;507&quot; data-start=&quot;494&quot; data-col-size=&quot;sm&quot;&gt;매매계약서 작성 시&lt;/td&gt;
&lt;td style=&quot;height: 63px;&quot; data-end=&quot;527&quot; data-start=&quot;507&quot; data-col-size=&quot;sm&quot;&gt;부동산 매매계약서에 붙이는 세금&lt;/td&gt;
&lt;td style=&quot;height: 63px;&quot; data-end=&quot;578&quot; data-start=&quot;527&quot; data-col-size=&quot;lg&quot;&gt;거래금액별로 정액&lt;br /&gt;&amp;bull; 1억~10억: 15만 원&lt;br /&gt;&amp;bull; 10억 초과: 35만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot; data-end=&quot;665&quot; data-start=&quot;579&quot;&gt;
&lt;td style=&quot;height: 42px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;597&quot; data-start=&quot;579&quot;&gt;&lt;b&gt;④ 중개보수(수수료)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;615&quot; data-start=&quot;597&quot; data-col-size=&quot;sm&quot;&gt;세금은 아니지만 실비로 발생&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;631&quot; data-start=&quot;615&quot; data-col-size=&quot;sm&quot;&gt;부동산 중개업소 이용 시&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;665&quot; data-start=&quot;631&quot; data-col-size=&quot;lg&quot;&gt;매매금액의 &lt;b&gt;0.4~0.9%&lt;/b&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 집 사고나서, 보유하고 있을 때 세금&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 244px;&quot; border=&quot;1&quot; data-end=&quot;1249&quot; data-start=&quot;714&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;세목명&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;세율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot; data-end=&quot;931&quot; data-start=&quot;792&quot;&gt;
&lt;td style=&quot;height: 80px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;804&quot; data-start=&quot;792&quot;&gt;&lt;b&gt;① 재산세&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 80px;&quot; data-end=&quot;827&quot; data-start=&quot;804&quot; data-col-size=&quot;sm&quot;&gt;매년 6월 1일 기준 소유자에게 부과&lt;br /&gt;1년에 &lt;b&gt;2번 (7월 / 9월)&lt;/b&gt; 납부 가능 &lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;height: 80px;&quot; data-end=&quot;844&quot; data-start=&quot;827&quot; data-col-size=&quot;sm&quot;&gt;지방세로 시&amp;middot;군&amp;middot;구에 납부&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;가장중요&lt;br /&gt;&quot;재산세&quot;안내려고 6월1일 전에 판매하는 사람도있음. &lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 80px;&quot; data-end=&quot;931&quot; data-start=&quot;844&quot; data-col-size=&quot;md&quot;&gt;- 과세표준 &amp;times; 0.1~0.4%&lt;br /&gt;&amp;bull; 6억 이하 0.1% / 6~15억 0.15% / 15억 초과 0.4%&lt;br /&gt;- &lt;b&gt;7월, 9월 2회 분납&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;986&quot; data-start=&quot;932&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;946&quot; data-start=&quot;932&quot;&gt;&lt;b&gt;② 지방교육세&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;957&quot; data-start=&quot;946&quot; data-col-size=&quot;sm&quot;&gt;재산세의 부가세&lt;br /&gt;재센세 낼때 포함해서 납부&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;970&quot; data-start=&quot;957&quot; data-col-size=&quot;sm&quot;&gt;재산세의 일정 비율&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;986&quot; data-start=&quot;970&quot; data-col-size=&quot;md&quot;&gt;재산세의 &lt;b&gt;20%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 84px;&quot; data-end=&quot;1144&quot; data-start=&quot;987&quot;&gt;
&lt;td style=&quot;height: 84px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1007&quot; data-start=&quot;987&quot;&gt;&lt;b&gt;③ 종합부동산세(종부세)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 84px;&quot; data-end=&quot;1031&quot; data-start=&quot;1007&quot; data-col-size=&quot;sm&quot;&gt;일정 금액 이상의 부동산을 보유한 경우 매년 부&lt;/td&gt;
&lt;td style=&quot;height: 84px;&quot; data-end=&quot;1045&quot; data-start=&quot;1031&quot; data-col-size=&quot;sm&quot;&gt;국세 (국세청 부과)&lt;/td&gt;
&lt;td style=&quot;height: 84px;&quot; data-end=&quot;1144&quot; data-start=&quot;1045&quot; data-col-size=&quot;md&quot;&gt;- &lt;b&gt;공시가격 합산 12억 초과 (1주택자 기준)&lt;/b&gt;&lt;br /&gt;- &lt;b&gt;세율: 0.5~6.0%&lt;/b&gt; (누진)&lt;br /&gt;- &lt;span style=&quot;color: #006dd7;&quot;&gt;1주택자 기준 공시가격 &lt;b&gt;12억 원 이하&lt;/b&gt;는 &lt;b&gt;비과세&lt;/b&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot; data-end=&quot;1249&quot; data-start=&quot;1145&quot;&gt;
&lt;td style=&quot;height: 42px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1159&quot; data-start=&quot;1145&quot;&gt;&lt;b&gt;④ 임대소득세&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;1172&quot; data-start=&quot;1159&quot; data-col-size=&quot;sm&quot;&gt;임대 수익 발생 시&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;1190&quot; data-start=&quot;1172&quot; data-col-size=&quot;sm&quot;&gt;월세&amp;middot;전세보증금 간주이자 등&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot; data-end=&quot;1249&quot; data-start=&quot;1190&quot; data-col-size=&quot;md&quot;&gt;- 연 2천만 원 이하: 분리과세 14%&lt;br /&gt;- 초과: 종합소득세 누진세율 적용 (6.6~45%)&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;h3 data-ke-size=&quot;size23&quot;&gt;3. 집 팔때, 나가는 세금&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양도세는 중요한데, 양도세때문에 팔때 차익보다 더 나가는 경우도 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;세목명&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;주요 세율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1567&quot; data-start=&quot;1370&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1384&quot; data-start=&quot;1370&quot;&gt;&lt;b&gt;① 양도소득세 (양도세)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1405&quot; data-start=&quot;1384&quot; data-col-size=&quot;sm&quot;&gt;부동산을 팔아서 이익이 발생할 때&lt;/td&gt;
&lt;td data-end=&quot;1437&quot; data-start=&quot;1405&quot; data-col-size=&quot;sm&quot;&gt;&amp;ldquo;양도차익 = 양도가 - 취득가 - 필요경비&amp;rdquo;로 계산&lt;/td&gt;
&lt;td data-end=&quot;1567&quot; data-start=&quot;1437&quot; data-col-size=&quot;md&quot;&gt;- 기본세율: &lt;b&gt;6~45% 누진&lt;/b&gt;&lt;br /&gt;- &lt;b&gt;1주택자 비과세 요건 (보유하고 거주까지 해야함.)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;&amp;bull;&lt;span&gt; 12억 미만 주택&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;bull; 2년 이상 보유&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;bull; 실거주 2년 (조정지역)&lt;/span&gt;&lt;br /&gt;- &lt;b&gt;단기 양도 시 중과&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;bull; 1년 미만: 70%&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt; &amp;nbsp;&amp;bull; 2년 미만: 60%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; &lt;b&gt;② 지방소득세&lt;/b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;양도소득세의 부가세&lt;/td&gt;
&lt;td&gt;양도소득세의 10%&lt;/td&gt;
&lt;td&gt;예: 양도세 1천만 원이면 지방소득세 100만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; &lt;b&gt;③ 중개보수 / 법무사비용&lt;/b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;세금은 아니지만 발생&lt;/td&gt;
&lt;td&gt;매도 시에도 부담 가능&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;4. 상속할 때, 물려줄 때 세금&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2196&quot; data-start=&quot;1763&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;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;주요세율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1976&quot; data-start=&quot;1841&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1853&quot; data-start=&quot;1841&quot;&gt;&lt;b&gt;① 상속세&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1873&quot; data-start=&quot;1853&quot;&gt;사망으로 재산이 이전될 때 부과&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1890&quot; data-start=&quot;1873&quot;&gt;피상속인의 재산 전체 대상&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1976&quot; data-start=&quot;1890&quot;&gt;- &lt;b&gt;과세표준 = (총재산 - 공제액)&lt;/b&gt;&lt;br /&gt;- &lt;b&gt;기본공제 5억 원&lt;/b&gt; (배우자 등 추가공제 가능)&lt;br /&gt;- 세율: &lt;b&gt;10~50% 누진, 상속되는 비용에 따라 누적됨&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2105&quot; data-start=&quot;1977&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1989&quot; data-start=&quot;1977&quot;&gt;&lt;b&gt;② 증여세&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2008&quot; data-start=&quot;1989&quot;&gt;살아있을 때 재산을 무상 이전&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2024&quot; data-start=&quot;2008&quot;&gt;배우자&amp;middot;자녀 등 증여 시&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2105&quot; data-start=&quot;2024&quot;&gt;- &lt;b&gt;공제한도&lt;/b&gt;&lt;br /&gt;&amp;bull; 배우자 6억 / 자녀 5천만 / 부모&amp;rarr;자녀 5천만 / 미성년자 2천만&lt;br /&gt;- &lt;b&gt;세율: 10~50% 누진&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2196&quot; data-start=&quot;2106&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2122&quot; data-start=&quot;2106&quot;&gt;&lt;b&gt;③ 취득세(2차)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2144&quot; data-start=&quot;2122&quot;&gt;증여&amp;middot;상속으로 인한 소유권 이전 시&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2160&quot; data-start=&quot;2144&quot;&gt;상속&amp;middot;증여받은 사람이 냄&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2196&quot; data-start=&quot;2160&quot;&gt;- 상속: 0.8~2.8%&lt;br /&gt;- 증여: 3.5~4.6%&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내생활/나의 기록</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/518</guid>
      <comments>https://teck10.tistory.com/518#entry518comment</comments>
      <pubDate>Fri, 10 Oct 2025 23:15:59 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EKS kubernetes RBAC 권한이 없는 문제 해결하기.</title>
      <link>https://teck10.tistory.com/517</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CmH6s/btsMuL3WoU3/krze7k1hXo9kKNCSYHeigk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CmH6s/btsMuL3WoU3/krze7k1hXo9kKNCSYHeigk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CmH6s/btsMuL3WoU3/krze7k1hXo9kKNCSYHeigk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCmH6s%2FbtsMuL3WoU3%2Fkrze7k1hXo9kKNCSYHeigk%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;1480&quot; height=&quot;312&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eks를 만들었는데 eks의 내부 정보를 확인할 수 없다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터 노드의 메트릭정보나 pod정보를 확인할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 권한을 추가해도 해결할 수 없었는데, 해결방법은 직접 eks에 들어가 auth 정보를 추가해서 RBAC 권한을 획득하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 2가지인데, 아래처럼 eks의 aws-auth Config-Map 에 Role 정보나 IAM 사용자 정보를 추가해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpqzoj/btsMwsPGTSD/3wCeoL3SUTKk0uSAcEZfkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpqzoj/btsMwsPGTSD/3wCeoL3SUTKk0uSAcEZfkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpqzoj/btsMwsPGTSD/3wCeoL3SUTKk0uSAcEZfkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpqzoj%2FbtsMwsPGTSD%2F3wCeoL3SUTKk0uSAcEZfkK%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;509&quot; height=&quot;169&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl&amp;nbsp;get&amp;nbsp;configmap&amp;nbsp;-n&amp;nbsp;kube-system &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 해보면 config-map 정보가 나오는데 여기서 aws-auth 정보를 갱신해주면 된다.&lt;br /&gt;kubectl&amp;nbsp;edit&amp;nbsp;configmap&amp;nbsp;aws-auth&amp;nbsp;-n&amp;nbsp;kube-system &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 수정하면 aws Console에서도 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp;Please&amp;nbsp;edit&amp;nbsp;the&amp;nbsp;object&amp;nbsp;below.&amp;nbsp;Lines&amp;nbsp;beginning&amp;nbsp;with&amp;nbsp;a&amp;nbsp;'#'&amp;nbsp;will&amp;nbsp;be&amp;nbsp;ignored, &lt;br /&gt;#&amp;nbsp;and&amp;nbsp;an&amp;nbsp;empty&amp;nbsp;file&amp;nbsp;will&amp;nbsp;abort&amp;nbsp;the&amp;nbsp;edit.&amp;nbsp;If&amp;nbsp;an&amp;nbsp;error&amp;nbsp;occurs&amp;nbsp;while&amp;nbsp;saving&amp;nbsp;this&amp;nbsp;file&amp;nbsp;will&amp;nbsp;be &lt;br /&gt;#&amp;nbsp;reopened&amp;nbsp;with&amp;nbsp;the&amp;nbsp;relevant&amp;nbsp;failures. &lt;br /&gt;# &lt;br /&gt;apiVersion:&amp;nbsp;v1 &lt;br /&gt;data: &lt;br /&gt;&amp;nbsp;&amp;nbsp;mapRoles:&amp;nbsp;| &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;groups: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;system:bootstrappers &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;system:nodes &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rolearn: arn:aws:iam::430223317801:role/ec2-role-bootstrap-role&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username:&amp;nbsp;system:node:{{EC2PrivateDNSName}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;mapUsers:&amp;nbsp;| &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- userarn: arn:aws:iam::430223317801:user/rcsp_jhbae_admin &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username:&amp;nbsp;rcsp_jhbae_admin &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;groups: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;system:masters &lt;br /&gt;kind:&amp;nbsp;ConfigMap &lt;br /&gt;metadata: &lt;br /&gt;&amp;nbsp;&amp;nbsp;creationTimestamp:&amp;nbsp;&quot;2025-02-24T05:28:40Z&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;aws-auth &lt;br /&gt;&amp;nbsp;&amp;nbsp;namespace:&amp;nbsp;kube-system &lt;br /&gt;&amp;nbsp;&amp;nbsp;resourceVersion:&amp;nbsp;&quot;311297&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;uid:&amp;nbsp;f5ae0fd2-ac35-4ca8-a82a-28999bc1a697&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정하게되면, 아래처럼 알림 창이 사라진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b57XpE/btsMwtnvP2u/r4ZhebeNVtlWyI2FKwOOxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b57XpE/btsMwtnvP2u/r4ZhebeNVtlWyI2FKwOOxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b57XpE/btsMwtnvP2u/r4ZhebeNVtlWyI2FKwOOxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb57XpE%2FbtsMwtnvP2u%2Fr4ZhebeNVtlWyI2FKwOOxk%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;1467&quot; height=&quot;592&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws 콘솔에서 노드 정보도 보이게되며, 리소스 확인도 가능해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvk09K/btsMvB0MmqK/hGJqt6ED3AU8lGOzxOX620/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvk09K/btsMvB0MmqK/hGJqt6ED3AU8lGOzxOX620/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvk09K/btsMvB0MmqK/hGJqt6ED3AU8lGOzxOX620/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcvk09K%2FbtsMvB0MmqK%2FhGJqt6ED3AU8lGOzxOX620%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;1432&quot; height=&quot;657&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IT기술/클라우드, VM, AWS</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/517</guid>
      <comments>https://teck10.tistory.com/517#entry517comment</comments>
      <pubDate>Tue, 25 Feb 2025 16:12:05 +0900</pubDate>
    </item>
    <item>
      <title>[Mysql] DBeaver 덤프 옵션 정리</title>
      <link>https://teck10.tistory.com/516</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DBeaver로 덤프 파일을 만드려고 하는데, 옵션 설명이 모호하여 한번 정리하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB마다 비슷비슷하게 제공하는 옵션들이 각기 다른 이름으로 존재한다.&lt;br /&gt;이를 인터페이스 형식으로 공통된 이름으로 풀어서 DBeaver가 제공하는걸로 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6OzWr/btsL4E5pobd/ChyaNw5LdR9gyHe0cHvK20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6OzWr/btsL4E5pobd/ChyaNw5LdR9gyHe0cHvK20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6OzWr/btsL4E5pobd/ChyaNw5LdR9gyHe0cHvK20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6OzWr%2FbtsL4E5pobd%2FChyaNw5LdR9gyHe0cHvK20%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;818&quot; height=&quot;531&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션은 총 9개가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;No CREATE statements&lt;br /&gt;Add DROP statements&lt;br /&gt;Disable keys&lt;br /&gt;Extended inserts&lt;br /&gt;Dump events&lt;br /&gt;Additional comments&lt;br /&gt;Remove DEFINER&lt;br /&gt;Dump binaries in hex&lt;br /&gt;Structure only&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. No CREATE statements&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;br /&gt;테이블을 생성하는 CREATE TABLE 문을 포함하지 않음.&lt;br /&gt;즉, 테이블의 구조(Schema)는 내보내지 않고, 데이터(INSERT INTO)만 덤프 파일에 포함됨.&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;/li&gt;
&lt;li&gt;동일한 구조의 테이블에 데이터만 추가하려는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `users` (`id`, `name`, `email`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;'Alice'&lt;/span&gt;, &lt;span&gt;'alice@example.com'&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Add DROP statements&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;br /&gt;덤프 파일에 DROP TABLE 문을 추가하여, 백업 복원 시 기존 테이블을 먼저 삭제한 후 다시 생성하도록 함.&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;/li&gt;
&lt;li&gt;기존 테이블과 충돌을 방지하기 위해 삭제 후 새로 생성하려는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;DROP&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; IF &lt;span&gt;EXISTS&lt;/span&gt; `users`; &lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; `users` ( `id` &lt;span&gt;INT&lt;/span&gt; &lt;span&gt;PRIMARY&lt;/span&gt; KEY, `name` &lt;span&gt;VARCHAR&lt;/span&gt;(&lt;span&gt;255&lt;/span&gt;), `email` &lt;span&gt;VARCHAR&lt;/span&gt;(&lt;span&gt;255&lt;/span&gt;) );&lt;br /&gt;&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `users` (`id`, `name`, `email`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;'Alice'&lt;/span&gt;, &lt;span&gt;'alice@example.com'&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Disable keys&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;br /&gt;ALTER TABLE ... DISABLE KEYS; 문을 포함하여, 테이블의 인덱스를 비활성화한 후 데이터를 삽입한 다음 다시 활성화함.&lt;br /&gt;&lt;b&gt;대량 데이터 삽입 시 성능을 향상&lt;/b&gt;시킬 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 데이터를 한 번에 삽입해야 할 때&lt;/li&gt;
&lt;li&gt;테이블의 인덱스를 재구성하여 성능을 최적화할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; `users` DISABLE KEYS; &lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `users` (`id`, `name`, `email`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;'Alice'&lt;/span&gt;, &lt;span&gt;'alice@example.com'&lt;/span&gt;); &lt;br /&gt;&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `users` (`id`, `name`, `email`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;2&lt;/span&gt;, &lt;span&gt;'Bob'&lt;/span&gt;, &lt;span&gt;'bob@example.com'&lt;/span&gt;); &lt;br /&gt;&lt;span&gt;ALTER&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; `users` ENABLE KEYS;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Extended inserts&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;br /&gt;INSERT 문을 하나씩 실행하는 것이 아니라 여러 개의 행을 한 번에 삽입하는 INSERT INTO ... VALUES (...), (...), (...) 방식으로 덤프를 생성함.&lt;br /&gt;&lt;b&gt;파일 크기를 줄이고, 덤프 복원 속도를 개선&lt;/b&gt;할 수 있음.&lt;br /&gt;데이터가 너무 많을경우 안하는게 나을수도있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 덤프 파일의 크기를 줄이고 싶을 때&lt;/li&gt;
&lt;li&gt;백업 복원 속도를 높이고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `users` (`id`, `name`, `email`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;'Alice'&lt;/span&gt;, &lt;span&gt;'alice@example.com'&lt;/span&gt;), (&lt;span&gt;2&lt;/span&gt;, &lt;span&gt;'Bob'&lt;/span&gt;, &lt;span&gt;'bob@example.com'&lt;/span&gt;), (&lt;span&gt;3&lt;/span&gt;, &lt;span&gt;'Charlie'&lt;/span&gt;, &lt;span&gt;'charlie@example.com'&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Dump events&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;br /&gt;MySQL의 **이벤트(Event)**를 포함하여 덤프를 생성함.&lt;br /&gt;이벤트는 특정 시간에 자동으로 실행되는 작업(예: 스케줄러 역할)임.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL에서 &lt;b&gt;이벤트 스케줄러&lt;/b&gt;를 사용하고 있으며, 백업 시 포함해야 할 때&lt;/li&gt;
&lt;li&gt;데이터 변경 작업을 자동화하는 MySQL 이벤트를 백업하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt; EVENT `my_event` &lt;span&gt;ON&lt;/span&gt; SCHEDULE &lt;span&gt;EVERY&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;DAY&lt;/span&gt; DO &lt;span&gt;UPDATE&lt;/span&gt; users &lt;span&gt;SET&lt;/span&gt; last_login &lt;span&gt;=&lt;/span&gt; NOW() &lt;span&gt;WHERE&lt;/span&gt; active &lt;span&gt;=&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. Additional comments&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;br /&gt;덤프 파일에 추가적인 **주석(Comment)**을 포함하여, 각 부분의 역할을 명확히 설명함.&lt;br /&gt;덤프 파일을 사람이 쉽게 읽고 이해할 수 있도록 도와줌.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백업 파일을 다른 사람이 확인해야 하는 경우&lt;/li&gt;
&lt;li&gt;복원 시 중요한 정보를 쉽게 확인할 수 있도록 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;-- 테이블 생성&lt;/span&gt; &lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; `users` ( `id` &lt;span&gt;INT&lt;/span&gt; &lt;span&gt;PRIMARY&lt;/span&gt; KEY, `name` &lt;span&gt;VARCHAR&lt;/span&gt;(&lt;span&gt;255&lt;/span&gt;), `email` &lt;span&gt;VARCHAR&lt;/span&gt;(&lt;span&gt;255&lt;/span&gt;) );&lt;br /&gt;&lt;span&gt;-- 데이터 삽입&lt;/span&gt; &lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `users` (`id`, `name`, `email`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;'Alice'&lt;/span&gt;, &lt;span&gt;'alice@example.com'&lt;/span&gt;); &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. Remove DEFINER&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;br /&gt;DEFINER= 구문을 제거하여, &lt;b&gt;스토어드 프로시저(Stored Procedure), 트리거(Trigger), 이벤트(Event)&lt;/b&gt; 등을 덤프할 때 특정 사용자의 권한 정보가 포함되지 않도록 함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 환경(예: 로컬 개발 &amp;rarr; 운영 서버)으로 덤프를 이동할 때&lt;/li&gt;
&lt;li&gt;특정 사용자 계정이 없는 환경에서도 덤프 파일을 실행할 수 있도록 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;➡ (옵션 활성화 전)&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;sql&lt;/span&gt;&lt;/b&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;DEFINER&lt;span&gt;=&lt;/span&gt;`root`@`localhost`&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;PROCEDURE&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;`my_procedure`()&lt;br /&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;SELECT&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;users;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;END&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;b&gt;➡ (옵션 활성화 후) sql&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;PROCEDURE&lt;/span&gt; `my_procedure`() &lt;br /&gt;&lt;span&gt;BEGIN&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;SELECT&lt;/span&gt; &lt;span&gt;*&lt;/span&gt; &lt;span&gt;FROM&lt;/span&gt; users; &lt;br /&gt;&lt;span&gt;END&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. Dump binaries in hex&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;br /&gt;&lt;b&gt;BLOB(Binary Large Object)&lt;/b&gt; 또는 &lt;b&gt;VARBINARY&lt;/b&gt; 같은 **이진 데이터(Binary Data)**를 16진수(Hex) 형식으로 덤프함.&lt;br /&gt;일반적인 텍스트 덤프보다 복원 속도가 느려질 수 있지만, 이진 데이터를 정확하게 유지할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지, 파일, 비디오 등의 바이너리 데이터를 포함한 테이블을 백업할 때&lt;/li&gt;
&lt;li&gt;데이터 손실 없이 정확하게 복원해야 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; `files` (`id`, `file_data`) &lt;span&gt;VALUES&lt;/span&gt; (&lt;span&gt;1&lt;/span&gt;,&lt;span&gt;0xFFD8FFE000104A46494600010101006000600000FFDB0043&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. Structure only&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;br /&gt;테이블의 구조(Schema)만 덤프하고, 데이터(INSERT INTO)는 포함하지 않음.&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;/li&gt;
&lt;li&gt;새로운 환경에서 동일한 테이블을 만들고 데이터를 따로 삽입할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 예시 (옵션 활성화 시)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;복사&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; `users` ( `id` &lt;span&gt;INT&lt;/span&gt; &lt;span&gt;PRIMARY&lt;/span&gt; KEY, `name` &lt;span&gt;VARCHAR&lt;/span&gt;(&lt;span&gt;255&lt;/span&gt;), `email` &lt;span&gt;VARCHAR&lt;/span&gt;(&lt;span&gt;255&lt;/span&gt;) ); &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;No CREATE statements&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CREATE TABLE 없이 데이터만 덤프&lt;/td&gt;
&lt;td&gt;기존 테이블에 데이터 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Add DROP statements&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;DROP TABLE을 추가하여 테이블 삭제 후 복원&lt;/td&gt;
&lt;td&gt;테이블 덮어쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Disable keys&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인덱스 비활성화 후 데이터 삽입&lt;/td&gt;
&lt;td&gt;대량 데이터 삽입 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Extended inserts&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;여러 행을 한 번에 삽입&lt;/td&gt;
&lt;td&gt;백업 파일 크기 줄이기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Dump events&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MySQL 이벤트 포함&lt;/td&gt;
&lt;td&gt;이벤트 스케줄러 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Additional comments&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SQL 주석 추가&lt;/td&gt;
&lt;td&gt;문서화 및 가독성 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Remove DEFINER&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;DEFINER= 제거&lt;/td&gt;
&lt;td&gt;사용자 계정 영향 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Dump binaries in hex&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;BLOB/VARBINARY 데이터를 HEX로 저장&lt;/td&gt;
&lt;td&gt;이진 데이터 백업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Structure only&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데이터 없이 테이블 구조만 저장&lt;/td&gt;
&lt;td&gt;스키마 백업&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 일반적인 선택은 이걸로&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxhXnA/btsL4P6LRmA/oZfD0r1hpisXopN6B4ekAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxhXnA/btsL4P6LRmA/oZfD0r1hpisXopN6B4ekAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxhXnA/btsL4P6LRmA/oZfD0r1hpisXopN6B4ekAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxhXnA%2FbtsL4P6LRmA%2FoZfD0r1hpisXopN6B4ekAk%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;826&quot; height=&quot;532&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IT기술/DB</category>
      <category>DBeaver</category>
      <category>dump</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/516</guid>
      <comments>https://teck10.tistory.com/516#entry516comment</comments>
      <pubDate>Tue, 4 Feb 2025 10:20:26 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 직렬화(Serializable) 이해하기</title>
      <link>https://teck10.tistory.com/514</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;직렬화(serialize)란?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; 컴퓨터 과학의 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px;&quot;&gt;오브젝트를 직렬화하는 과정은 오브젝트를 마샬링한다고도 한다&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;조금 더 쉽게 풀어보면, Object 또는 Data를 바이트 스트림(stream of bytes) 형태로 연속전인(serial) 데이터로 변환하는 것을 직렬화(serialize) 라고 한다.&lt;br /&gt;그 반대 개념인 역직렬화는(Deserialize)는 바이트로 변환된 데이터를 원래대로 Object 또는 Data로 변환하는 기술이다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727830241750&quot; class=&quot;prolog&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[ 바이트 스트림 이란? ]
스트림은 클라이언트나 서버 간에 출발지 목적지로 입출력하기 위한 데이터가 흐르는 통로를 말한다.
자바는 스트림의 기본 단위를 바이트로 두고 있기 때문에, 네트워크, 데이터베이스로 전송하기 위해 최소 단위인 바이트 스트림으로 변환하여 처리한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이펙티브 자바 에서도 다뤘던 내용인데 직렬화 는 되도록이면 피하는게 좋다고 했었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다만 직렬화를 사용해야 하는 경우가 있는데, 어떤 경우일까?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 컴퓨터의 시스템에서도 사용 할수 있도록 전송하기 위해 데이터 화 시켜야 할 경우(json으로 변환, xml로 변환, 기타 포멧의 파일로 변환) 직렬화를 사용한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;--------------------------&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTHui/btsJR0PQFJv/8qz2WkFqhIF8iI6VE7LL5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTHui/btsJR0PQFJv/8qz2WkFqhIF8iI6VE7LL5K/img.png&quot; data-alt=&quot;출처 : infa dev&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTHui/btsJR0PQFJv/8qz2WkFqhIF8iI6VE7LL5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTHui%2FbtsJR0PQFJv%2F8qz2WkFqhIF8iI6VE7LL5K%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;1113&quot; height=&quot;548&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : infa dev&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;- 세션 클러스터링 처럼, 세션이 공유되어야 할 경우 (세션 데이터를 저장, 공유하려면 이를 데이터 화 해야 한다.)&lt;br /&gt;- 캐시 DB (redis) 같이 데이터 화 시켜 저장해야 할 경우&lt;br /&gt;- DB에 저장시켜야 할 경우&lt;br /&gt;- 특정 format 파일로 변환하여 저장 할 경우 (json, csv, xml 등)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바에서 직렬화 사용하면 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 작업들을 수행하려면 직렬화가 필요하다.&lt;br /&gt;그렇다면 직렬화를 사용함으로 써 느낄 수 있는 장점은 어떤 것들이 있을까?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.레퍼런스 타입에 대해 제약 없이 외부에 내보낼 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 자바로 개발하는 프로그램이 다른 언어로 만들어진 어플리케이션과 호환이 가능하도록 해준다.&lt;br /&gt;수신/송신 측면에서 모두 가능하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 자바 시스템에서 개발에 최적화 되어있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바는 객체 지향 개발을 지향하며 개발하는데 최적화 되어있다.&lt;br /&gt;&lt;span&gt;&lt;span&gt;프리미티브 타입(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;byte &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;short &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;int &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;long &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;float &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;double &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;char &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;boolean)&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;은 왠만한 프로그래밍 언어가 공통적으로 사용하는 타입이기 때문에, 이러한 값들을 JSON 으로도 충분히 상호 이용이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 자바의 온갖 컬렉션이나 참조 타입(String), 클래스, 인터페이스 타입들은 어떨까?&lt;br /&gt;사용자가 커스텀하게 값 타입을 만들어 사용하는 경우, 단순 파일 포맷만으로는 타입 갯수가 한계가 있다. &lt;br /&gt;그래서 이들을 외부에 내보내기 위해선 각 데이터를 매칭시키는 별도의 파싱(parsing)이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 직렬화를 이용하면, 비록 파이썬이나 자바스크립트와 같은 다른 시스템에서는 사용하지 못할 수도 있으나,&lt;br /&gt;직렬화 기본 조건만 지킨다면 그냥 바로 외부에 보낼수가 있다.&lt;br /&gt;그리고 역직렬화를 통해 읽어들이면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;별도 파싱 작업 없이&lt;span&gt; &lt;/span&gt;&lt;/span&gt;데이터 타입이 자동으로 맞춰지도록 할 수 있다.&lt;br /&gt;즉, 직렬화, 역직렬화를 통해 파일을 만들어 외부로 보내고, 다시 읽어들이는 과정에서 별도 파싱 작업 없이&lt;br /&gt;자바 클래스로 만들어 기능들을 곧바로 다시 이용할 수 있는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 결론만 이야기 한다면, 요즘은 범용적인 JSON을 이용하는 추세가 점점 늘고 있다.&lt;br /&gt;자바 객체를 JSON으로 변경해서 파일로 써버리면 되고, 읽을 때 에도 이에 맞춰 받도록 하면 되는데 굳이 직렬화를 할 필요가 없을 수 있다.&lt;br /&gt;따라서 JSON 이냐 직렬화 이냐 에 대한 명확한 정답은 없고 '목적에 따라 적절히 써야 한다' 정도로 정리한다.&lt;br /&gt;이펙티브 자바 책에서도 직렬화의 대안을 찾으라고 나오기도 하니...&lt;br /&gt;그리고 업무를 수행하면서 implements&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #373e48; text-align: left;&quot;&gt;Serializable&lt;span&gt; 를 보게 되었는데, 이거때문에 이 글을 쓰게 되었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;자바_직렬화_사용법&quot; style=&quot;background-color: #ffffff; color: #262d40; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;참고 블로그&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A7%81%EB%A0%AC%ED%99%94Serializable-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A7%81%EB%A0%AC%ED%99%94Serializable-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0&lt;/a&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT기술/CS(ComputerScience)</category>
      <category>CS</category>
      <category>java</category>
      <category>Serializable</category>
      <category>역직렬화</category>
      <category>직렬화</category>
      <author>미노드</author>
      <guid isPermaLink="true">https://teck10.tistory.com/514</guid>
      <comments>https://teck10.tistory.com/514#entry514comment</comments>
      <pubDate>Wed, 2 Oct 2024 09:52:32 +0900</pubDate>
    </item>
  </channel>
</rss>