<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>거누의 개발노트</title>
    <link>https://geonoo.tistory.com/</link>
    <description>일기처럼 쓰는 거누의 개발노트! &amp;zwj; </description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 21:38:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Gogozzi</managingEditor>
    <image>
      <title>거누의 개발노트</title>
      <url>https://tistory1.daumcdn.net/tistory/4373193/attach/ef70f541b6a34b91a15cc1c99b75db4b</url>
      <link>https://geonoo.tistory.com</link>
    </image>
    <item>
      <title>  스푸핑(Spoofing) 공격 개념 및 유형별 대응 방안</title>
      <link>https://geonoo.tistory.com/199</link>
      <description>&lt;h2 data-end=&quot;165&quot; data-start=&quot;149&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;332&quot; data-start=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;스푸핑(Spoofing)은 공격자가 &lt;b&gt;합법적인 사용자 또는 시스템을 사칭하여 보안 장벽을 우회하거나 데이터를 탈취하는 공격 기법&lt;/b&gt;입니다. IP, MAC, DNS 등 다양한 네트워크 계층에서 발생하며, &lt;b&gt;정보 유출, 서비스 마비, 악성 코드 배포 등 다양한 위협&lt;/b&gt;을 야기할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;334&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ARP, IP, DNS 등 스푸핑 유형별로 공격 방식과 보안 대책이 달라지므로, 이를 정확히 이해하고 대응 방안을 마련하는 것이 필수적&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-end=&quot;424&quot; data-start=&quot;421&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;443&quot; data-start=&quot;426&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;482&quot; data-start=&quot;445&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 스푸핑(Spoofing) 공격의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;508&quot; data-start=&quot;484&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;스푸핑(Spoofing)이란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;646&quot; data-start=&quot;509&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;646&quot; data-start=&quot;509&quot;&gt;공격자가 **다른 시스템 또는 사용자의 식별 정보를 위조(사칭)**하여,
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;646&quot; data-start=&quot;556&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;579&quot; data-start=&quot;556&quot;&gt;&lt;b&gt;네트워크에 무단 침입하거나&lt;/b&gt;,&lt;/li&gt;
&lt;li data-end=&quot;600&quot; data-start=&quot;582&quot;&gt;&lt;b&gt;정보를 가로채거나&lt;/b&gt;,&lt;/li&gt;
&lt;li data-end=&quot;646&quot; data-start=&quot;603&quot;&gt;&lt;b&gt;신뢰된 시스템인 것처럼 속여 악의적인 행위를 수행하는 공격 기법&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;661&quot; data-start=&quot;648&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;711&quot; data-start=&quot;662&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;662&quot;&gt;IP 주소, MAC 주소, ARP 정보, DNS 응답, 이메일 주소, 웹사이트 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;733&quot; data-start=&quot;713&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;스푸핑의 대표적인 유형&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;유형공격 대상결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;935&quot; data-start=&quot;734&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;935&quot; data-start=&quot;807&quot;&gt;
&lt;tr data-end=&quot;847&quot; data-start=&quot;807&quot;&gt;
&lt;td&gt;&lt;b&gt;ARP 스푸핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MAC 주소&lt;/td&gt;
&lt;td&gt;중간자 공격, 세션 탈취&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;887&quot; data-start=&quot;848&quot;&gt;
&lt;td&gt;&lt;b&gt;IP 스푸핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IP 주소&lt;/td&gt;
&lt;td&gt;방화벽 우회, 비인가 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;935&quot; data-start=&quot;888&quot;&gt;
&lt;td&gt;&lt;b&gt;DNS 스푸핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;도메인 &amp;rarr; IP&lt;/td&gt;
&lt;td&gt;피싱 사이트 유도, 악성코드 유포&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;940&quot; data-start=&quot;937&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;979&quot; data-start=&quot;942&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 ARP 스푸핑 공격 방법과 보안 대책&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1005&quot; data-start=&quot;981&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;가. ARP 스푸핑 공격 개요&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1174&quot; data-start=&quot;1006&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1070&quot; data-start=&quot;1006&quot;&gt;**ARP(Address Resolution Protocol)**는 IP &amp;harr; MAC 주소를 매핑하는 프로토콜&lt;/li&gt;
&lt;li data-end=&quot;1174&quot; data-start=&quot;1071&quot;&gt;공격자는 &lt;b&gt;허위 ARP Reply를 전송&lt;/b&gt;하여,
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1174&quot; data-start=&quot;1106&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1128&quot; data-start=&quot;1106&quot;&gt;피해자의 ARP 캐시를 조작하고,&lt;/li&gt;
&lt;li data-end=&quot;1174&quot; data-start=&quot;1131&quot;&gt;&lt;b&gt;자신의 MAC 주소를 라우터나 게이트웨이의 MAC 주소로 속인다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1192&quot; data-start=&quot;1176&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;나. 공격 방식&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1346&quot; data-start=&quot;1193&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1228&quot; data-start=&quot;1193&quot;&gt;공격자가 &lt;b&gt;자신의 MAC 주소를 게이트웨이로 위장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1272&quot; data-start=&quot;1229&quot;&gt;피해자가 게이트웨이에 데이터를 보낸다고 착각 &amp;rarr; 공격자가 데이터 수신&lt;/li&gt;
&lt;li data-end=&quot;1346&quot; data-start=&quot;1273&quot;&gt;공격자는 데이터를 분석하거나 변조 후 게이트웨이로 전달&lt;br /&gt;&amp;rarr; &lt;b&gt;MITM(Man-In-The-Middle)&lt;/b&gt; 공격 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1364&quot; data-start=&quot;1348&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;1596&quot; data-start=&quot;1365&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1422&quot; data-start=&quot;1365&quot;&gt;&lt;b&gt;정적 ARP 설정(Static ARP)&lt;/b&gt;: MAC-IP 매핑을 수동으로 등록하여 변조 방지&lt;/li&gt;
&lt;li data-end=&quot;1479&quot; data-start=&quot;1423&quot;&gt;&lt;b&gt;ARP 감시 도구 사용&lt;/b&gt;: Arpwatch, XArp 등을 통해 ARP 테이블 변화 감지&lt;/li&gt;
&lt;li data-end=&quot;1544&quot; data-start=&quot;1480&quot;&gt;&lt;b&gt;스위치 포트 보안 설정&lt;/b&gt;: 포트 기반 MAC 제한, Dynamic ARP Inspection 기능 활용&lt;/li&gt;
&lt;li data-end=&quot;1596&quot; data-start=&quot;1545&quot;&gt;&lt;b&gt;세그먼트 분리 및 VLAN 구성&lt;/b&gt;: 브로드캐스트 범위 제한으로 ARP 범위 축소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1601&quot; data-start=&quot;1598&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1639&quot; data-start=&quot;1603&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 IP 스푸핑 공격 방법과 보안 대책&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1664&quot; data-start=&quot;1641&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;가. IP 스푸핑 공격 개요&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1767&quot; data-start=&quot;1665&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1722&quot; data-start=&quot;1665&quot;&gt;공격자가 &lt;b&gt;출발지 IP 주소를 위조&lt;/b&gt;하여, 신뢰받는 사용자 또는 시스템인 것처럼 속이는 방식&lt;/li&gt;
&lt;li data-end=&quot;1767&quot; data-start=&quot;1723&quot;&gt;&lt;b&gt;TCP/IP 기반 인증 시스템&lt;/b&gt;의 허점을 악용 &amp;rarr; 비인가 접근 시도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1785&quot; data-start=&quot;1769&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;나. 공격 방식&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1919&quot; data-start=&quot;1786&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1823&quot; data-start=&quot;1786&quot;&gt;공격자가 &lt;b&gt;신뢰받는 IP 주소로 패킷을 위조하여 전송&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1869&quot; data-start=&quot;1824&quot;&gt;대상 시스템이 신뢰 IP라고 판단하여 &lt;b&gt;응답을 전송하거나 접근 허용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1919&quot; data-start=&quot;1870&quot;&gt;공격자는 응답을 받지 못해도 &lt;b&gt;DoS, 세션 하이재킹, 방화벽 우회&lt;/b&gt;에 악용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1937&quot; data-start=&quot;1921&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;2181&quot; data-start=&quot;1938&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2036&quot; data-start=&quot;1938&quot;&gt;&lt;b&gt;패킷 필터링&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2036&quot; data-start=&quot;1955&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1995&quot; data-start=&quot;1955&quot;&gt;Ingress 필터링: 외부에서 들어오는 패킷의 출발지 IP 검사&lt;/li&gt;
&lt;li data-end=&quot;2036&quot; data-start=&quot;1998&quot;&gt;Egress 필터링: 내부에서 나가는 패킷의 출발지 IP 검사&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2097&quot; data-start=&quot;2037&quot;&gt;&lt;b&gt;TCP 인증 강화&lt;/b&gt;: SYN Cookie, Sequence Number Randomization&lt;/li&gt;
&lt;li data-end=&quot;2141&quot; data-start=&quot;2098&quot;&gt;&lt;b&gt;IPSec, VPN 적용&lt;/b&gt;: 신뢰할 수 있는 터널 기반 통신 적용&lt;/li&gt;
&lt;li data-end=&quot;2181&quot; data-start=&quot;2142&quot;&gt;&lt;b&gt;침입 탐지 시스템(IDS) 도입&lt;/b&gt;: 이상 트래픽 패턴 탐지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2186&quot; data-start=&quot;2183&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2225&quot; data-start=&quot;2188&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.4 DNS 스푸핑 공격 방법과 보안 대책&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2251&quot; data-start=&quot;2227&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;가. DNS 스푸핑 공격 개요&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2348&quot; data-start=&quot;2252&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2296&quot; data-start=&quot;2252&quot;&gt;공격자가 &lt;b&gt;DNS 응답을 위조하여 잘못된 IP 주소로 사용자를 유도&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2348&quot; data-start=&quot;2297&quot;&gt;사용자는 정상 도메인에 접속한다고 믿지만, &lt;b&gt;피싱 사이트나 악성 사이트에 연결됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2366&quot; data-start=&quot;2350&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;나. 공격 방식&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2516&quot; data-start=&quot;2367&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2425&quot; data-start=&quot;2367&quot;&gt;공격자가 &lt;b&gt;DNS 요청보다 빠르게 위조된 응답 전송&lt;/b&gt; (DNS Cache Poisoning)&lt;/li&gt;
&lt;li data-end=&quot;2476&quot; data-start=&quot;2426&quot;&gt;사용자 또는 DNS 서버가 위조된 응답을 신뢰하고 &lt;b&gt;악성 IP를 캐시에 저장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2516&quot; data-start=&quot;2477&quot;&gt;이후 동일 도메인 접속 시 계속해서 &lt;b&gt;가짜 사이트로 연결&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2534&quot; data-start=&quot;2518&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;2911&quot; data-start=&quot;2535&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2535&quot;&gt;&lt;b&gt;DNSSEC(Domain Name System Security Extensions)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2628&quot; data-start=&quot;2592&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2592&quot;&gt;&lt;b&gt;DNS 응답에 전자서명 적용&lt;/b&gt; &amp;rarr; 위&amp;middot;변조 여부 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2708&quot; data-start=&quot;2629&quot;&gt;&lt;b&gt;DoH(DNS over HTTPS), DoT(DNS over TLS)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2708&quot; data-start=&quot;2678&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2708&quot; data-start=&quot;2678&quot;&gt;DNS 요청/응답을 암호화하여 중간자 공격 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2778&quot; data-start=&quot;2709&quot;&gt;&lt;b&gt;DNS 서버 보안 설정 강화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2778&quot; data-start=&quot;2735&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2778&quot; data-start=&quot;2735&quot;&gt;반복되는 DNS 요청 제한, TTL(Time to Live) 설정 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2830&quot; data-start=&quot;2779&quot;&gt;&lt;b&gt;클라이언트 측 보안&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2830&quot; data-start=&quot;2800&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2830&quot; data-start=&quot;2800&quot;&gt;최신 브라우저 사용, 악성 DNS 탐지 툴 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2911&quot; data-start=&quot;2831&quot;&gt;&lt;b&gt;신뢰할 수 있는 DNS 서버 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2911&quot; data-start=&quot;2860&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2911&quot; data-start=&quot;2860&quot;&gt;예: Google DNS(8.8.8.8), Cloudflare DNS(1.1.1.1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2916&quot; data-start=&quot;2913&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2935&quot; data-start=&quot;2918&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3023&quot; data-start=&quot;2937&quot; data-ke-size=&quot;size16&quot;&gt;스푸핑 공격은 &lt;b&gt;네트워크 통신의 신뢰 기반을 무너뜨리는 대표적인 위협&lt;/b&gt;으로, &lt;b&gt;ARP, IP, DNS 등 다양한 계층에서 발생&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3121&quot; data-start=&quot;3025&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, 각 스푸핑 공격의 &lt;b&gt;원리와 공격 흐름을 정확히 이해하고&lt;/b&gt;, &lt;b&gt;정책적&amp;middot;기술적 보안 대책을 종합적으로 수립할 수 있는 능력이 요구&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;p data-end=&quot;3138&quot; data-start=&quot;3123&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;유형공격 방식보안 대책
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3412&quot; data-start=&quot;3139&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3412&quot; data-start=&quot;3221&quot;&gt;
&lt;tr data-end=&quot;3285&quot; data-start=&quot;3221&quot;&gt;
&lt;td&gt;&lt;b&gt;ARP 스푸핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MAC 주소 위조 &amp;rarr; 중간자 공격&lt;/td&gt;
&lt;td&gt;정적 ARP, ARP 감시, 스위치 포트 보안&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3340&quot; data-start=&quot;3286&quot;&gt;
&lt;td&gt;&lt;b&gt;IP 스푸핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;출발지 IP 위조&lt;/td&gt;
&lt;td&gt;패킷 필터링, TCP 인증 강화, VPN 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3412&quot; data-start=&quot;3341&quot;&gt;
&lt;td&gt;&lt;b&gt;DNS 스푸핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가짜 DNS 응답 &amp;rarr; 피싱 유도&lt;/td&gt;
&lt;td&gt;DNSSEC, DoH/DoT, 캐시 보호, 신뢰 DNS 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/199</guid>
      <comments>https://geonoo.tistory.com/199#entry199comment</comments>
      <pubDate>Fri, 18 Apr 2025 16:50:07 +0900</pubDate>
    </item>
    <item>
      <title>  ISMS-P 간편인증 제도</title>
      <link>https://geonoo.tistory.com/198</link>
      <description>&lt;h2 data-end=&quot;148&quot; data-start=&quot;132&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;314&quot; data-start=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;**ISMS-P(Information Security Management System &amp;ndash; Personal)**는 정보보호와 개인정보보호를 통합한 &lt;b&gt;국가 공인 인증제도&lt;/b&gt;로, 기업이나 기관이 &lt;b&gt;정보 자산을 안전하게 관리하고, 개인정보를 법령에 맞게 보호하고 있음을 평가&lt;/b&gt;하는 제도입니다.&lt;/p&gt;
&lt;p data-end=&quot;478&quot; data-start=&quot;316&quot; data-ke-size=&quot;size16&quot;&gt;최근 중소기업&amp;middot;스타트업, SaaS 기업 등에게 인증 진입 장벽이 높다는 의견이 반영되어, 2023년 하반기부터 &lt;b&gt;&amp;ldquo;ISMS-P 간편인증 제도&amp;rdquo;가 도입&lt;/b&gt;되었습니다. 이는 &lt;b&gt;기존 인증 대비 부담을 줄이고, 실질적인 보안 수준을 유지할 수 있도록 간소화된 기준을 적용하는 제도&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;531&quot; data-start=&quot;480&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;ISMS-P 간편인증의 목적, 대상, 기준&lt;/b&gt;을 상세히 정리하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;536&quot; data-start=&quot;533&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;555&quot; data-start=&quot;538&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;588&quot; data-start=&quot;557&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 ISMS-P 간편인증 목적&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;624&quot; data-start=&quot;590&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;757&quot; data-start=&quot;625&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;702&quot; data-start=&quot;625&quot;&gt;기존 ISMS-P는 **관리 항목이 102개(관리체계 80개 + 개인정보보호 22개)**로 구성되어 &lt;b&gt;중소기업에게 과도한 부담&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;703&quot;&gt;간편인증은 &lt;b&gt;핵심 보호조치 중심으로 간소화&lt;/b&gt;하여 &lt;b&gt;적은 비용과 인력으로 인증 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;793&quot; data-start=&quot;759&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;874&quot; data-start=&quot;794&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;834&quot; data-start=&quot;794&quot;&gt;핵심 통제 항목 중심으로 &lt;b&gt;기초 보안 역량을 점검하고 체계화&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;874&quot; data-start=&quot;835&quot;&gt;자율적 보안 활동 유도 &amp;rarr; &lt;b&gt;보안 인프라 고도화 기반 마련&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;918&quot; data-start=&quot;876&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 스타트업, SaaS 기업, 클라우드 기반 서비스 확산 대응&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1005&quot; data-start=&quot;919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;960&quot; data-start=&quot;919&quot;&gt;IT 서비스 특성을 고려해 &lt;b&gt;적정 수준의 보안 요구사항만 요구&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1005&quot; data-start=&quot;961&quot;&gt;보안 인증을 통해 &lt;b&gt;정부&amp;middot;공공 조달 참여, 민간 B2B 신뢰성 확보&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1029&quot; data-start=&quot;1007&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;1097&quot; data-start=&quot;1030&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1067&quot; data-start=&quot;1030&quot;&gt;간편인증을 통해 &lt;b&gt;ISMS-P 본 인증으로의 전환 유도&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1097&quot; data-start=&quot;1068&quot;&gt;&lt;b&gt;정보보호 수준 향상의 디딤돌 역할&lt;/b&gt; 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1102&quot; data-start=&quot;1099&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1135&quot; data-start=&quot;1104&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 ISMS-P 간편인증 대상&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1222&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size16&quot;&gt;ISMS-P 간편인증은 &lt;b&gt;보호 대상 정보의 민감도와 조직 규모, 처리 데이터 특성을 고려&lt;/b&gt;하여 &lt;b&gt;다음과 같은 사업자군을 대상으로 적용&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;1253&quot; data-start=&quot;1224&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 중소기업, 스타트업, 1인 기업 등&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1328&quot; data-start=&quot;1254&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1290&quot; data-start=&quot;1254&quot;&gt;정보보호 담당 인력이 부족하거나 자원이 제한된 소규모 조직&lt;/li&gt;
&lt;li data-end=&quot;1328&quot; data-start=&quot;1291&quot;&gt;예: IT 스타트업, 1인 SaaS 사업자, 창업 초기 기업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1370&quot; data-start=&quot;1330&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② SaaS(Software as a Service) 기업&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1447&quot; data-start=&quot;1371&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1412&quot; data-start=&quot;1371&quot;&gt;SaaS 모델을 통해 &lt;b&gt;클라우드 기반 서비스를 제공하는 사업자&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1447&quot; data-start=&quot;1413&quot;&gt;다수 고객의 개인정보 및 민감정보를 위탁&amp;middot;처리하는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1474&quot; data-start=&quot;1449&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;1559&quot; data-start=&quot;1475&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1518&quot; data-start=&quot;1475&quot;&gt;퍼블릭 클라우드 환경에서 &lt;b&gt;서비스 인프라를 운영하며 개인정보 처리&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1559&quot; data-start=&quot;1519&quot;&gt;ISMS-P 본 인증 이전의 보안 수준 점검 목적으로도 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1608&quot; data-start=&quot;1561&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ ISMS-P 인증 대상이지만, 처리 규모가 작고 위험도가 낮은 조직&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1654&quot; data-start=&quot;1609&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1654&quot; data-start=&quot;1609&quot;&gt;연간 매출, 개인정보 처리량 등 기준에 따라 간편인증 적용 가능 여부 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1667&quot; data-start=&quot;1656&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;1749&quot; data-start=&quot;1668&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1749&quot; data-start=&quot;1668&quot;&gt;&lt;b&gt;대규모 개인정보 처리 사업자, 고위험 정보 보유 조직&lt;/b&gt; 등은 간편인증 대상에서 제외되고 &lt;b&gt;기존 ISMS-P 본 인증을 받아야 함&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1754&quot; data-start=&quot;1751&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1787&quot; data-start=&quot;1756&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 ISMS-P 간편인증 기준&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1857&quot; data-start=&quot;1789&quot; data-ke-size=&quot;size16&quot;&gt;✅ 간편인증은 &lt;b&gt;ISMS-P 본 인증의 102개 항목 중 핵심적인 보안 및 개인정보보호 항목을 추려서 적용&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;1902&quot; data-start=&quot;1859&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;총 30개 내외 항목(예정)&lt;/b&gt; &amp;rarr; &lt;b&gt;경량화된 통제 기준 적용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1960&quot; data-start=&quot;1903&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1932&quot; data-start=&quot;1903&quot;&gt;&lt;b&gt;정보보호 관리체계 영역:&lt;/b&gt; 약 20여 개&lt;/li&gt;
&lt;li data-end=&quot;1960&quot; data-start=&quot;1933&quot;&gt;&lt;b&gt;개인정보 보호 영역:&lt;/b&gt; 약 10여 개&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;구분핵심 항목 예시
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2171&quot; data-start=&quot;1962&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2171&quot; data-start=&quot;2019&quot;&gt;
&lt;tr data-end=&quot;2097&quot; data-start=&quot;2019&quot;&gt;
&lt;td&gt;&lt;b&gt;정보보호 관리체계&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;관리 책임자 지정, 위험 분석 및 대응, 인적 보안, 외부자 관리, 백업 및 복구 관리, 암호화 적용 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2171&quot; data-start=&quot;2098&quot;&gt;
&lt;td&gt;&lt;b&gt;개인정보 보호조치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수집&amp;middot;이용 동의, 처리 위탁 관리, 접근통제, 로그 관리, 개인정보 파기, 개인정보 처리방침 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2191&quot; data-start=&quot;2173&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;2338&quot; data-start=&quot;2192&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2230&quot; data-start=&quot;2192&quot;&gt;&lt;b&gt;자체 점검 체크리스트 제공&lt;/b&gt; &amp;rarr; 신청 전 자율 점검 가능&lt;/li&gt;
&lt;li data-end=&quot;2266&quot; data-start=&quot;2231&quot;&gt;&lt;b&gt;심사 기간 단축&lt;/b&gt; &amp;rarr; 평균 1~2주 이내 심사 가능&lt;/li&gt;
&lt;li data-end=&quot;2301&quot; data-start=&quot;2267&quot;&gt;&lt;b&gt;비용 절감&lt;/b&gt; &amp;rarr; 인증비용, 컨설팅 비용 부담 감소&lt;/li&gt;
&lt;li data-end=&quot;2338&quot; data-start=&quot;2302&quot;&gt;&lt;b&gt;1~2년 유효기간&lt;/b&gt; &amp;rarr; 정기 점검 및 인증 유지 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2367&quot; data-start=&quot;2340&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;2450&quot; data-start=&quot;2368&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2418&quot; data-start=&quot;2368&quot;&gt;간편인증 사업자는 &lt;b&gt;추후 보안 수준이 향상되면 ISMS-P 본 인증 전환 가능&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2450&quot; data-start=&quot;2419&quot;&gt;&lt;b&gt;중장기 보안 체계 구축 로드맵 수립에 용이&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2455&quot; data-start=&quot;2452&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2474&quot; data-start=&quot;2457&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2576&quot; data-start=&quot;2476&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ISMS-P 간편인증 제도&lt;/b&gt;는 &lt;b&gt;정보보호 인증이 부담이었던 중소기업 및 SaaS 기업 등이 보다 쉽게 인증에 접근할 수 있도록 설계된 경량화된 보안 인증 체계&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;2685&quot; data-start=&quot;2578&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;조직의 보안 수준과 규모를 고려하여 ISMS-P 본 인증과 간편인증 중 적합한 인증 체계를 제시하고, 인증 획득 및 유지 전략을 수립할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2702&quot; data-start=&quot;2687&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;2851&quot; data-start=&quot;2703&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2746&quot; data-start=&quot;2703&quot;&gt;&lt;b&gt;목적:&lt;/b&gt; 보안 인증 진입 장벽 완화, 실효성 있는 경량 인증 제공&lt;/li&gt;
&lt;li data-end=&quot;2794&quot; data-start=&quot;2747&quot;&gt;&lt;b&gt;대상:&lt;/b&gt; 중소기업, 스타트업, SaaS 기업, 소규모 개인정보 처리 조직&lt;/li&gt;
&lt;li data-end=&quot;2851&quot; data-start=&quot;2795&quot;&gt;&lt;b&gt;기준:&lt;/b&gt; 기존 102개 항목 중 약 30개 핵심 항목만 적용 (관리체계 + 개인정보보호)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/198</guid>
      <comments>https://geonoo.tistory.com/198#entry198comment</comments>
      <pubDate>Tue, 15 Apr 2025 14:05:23 +0900</pubDate>
    </item>
    <item>
      <title>  공공 부문 초거대 AI 도입&amp;middot;활용 가이드라인</title>
      <link>https://geonoo.tistory.com/197</link>
      <description>&lt;h2 data-end=&quot;171&quot; data-start=&quot;155&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;282&quot; data-start=&quot;173&quot; data-ke-size=&quot;size16&quot;&gt;최근 &lt;b&gt;초거대 인공지능(AI)&lt;/b&gt; 기술이 급격히 발전하면서, &lt;b&gt;공공 부문에서도 행정 서비스 혁신, 업무 자동화, 데이터 분석 최적화&lt;/b&gt; 등을 위해 AI 도입이 본격적으로 논의되고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;378&quot; data-start=&quot;284&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 정부는 **&amp;ldquo;공공 부문 초거대 AI 도입&amp;middot;활용 가이드라인&amp;rdquo;**을 발표하여, &lt;b&gt;초거대 AI의 개념, 도입 원칙, 사전 고려사항&lt;/b&gt; 등을 제시하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;437&quot; data-start=&quot;380&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;초거대 AI의 개념, 도입 원칙, 실무 적용을 위한 고려사항&lt;/b&gt;을 정리하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;442&quot; data-start=&quot;439&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;461&quot; data-start=&quot;444&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;489&quot; data-start=&quot;463&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 초거대 AI 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;522&quot; data-start=&quot;491&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;초거대 AI(Hyperscale AI)란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;706&quot; data-start=&quot;523&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;578&quot; data-start=&quot;523&quot;&gt;&lt;b&gt;대규모 데이터와 초고성능 연산 능력을 기반으로 스스로 학습하고 진화하는 인공지능 모델&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;631&quot; data-start=&quot;579&quot;&gt;수천억~수조 개의 매개변수(Parameters)를 가진 &lt;b&gt;대형 딥러닝 모델&lt;/b&gt;을 의미&lt;/li&gt;
&lt;li data-end=&quot;706&quot; data-start=&quot;632&quot;&gt;&lt;b&gt;GPT-4, PaLM, Claude, Naver HyperCLOVA, 삼성 SAFARI&lt;/b&gt; 등이 대표적인 초거대 AI 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;727&quot; data-start=&quot;708&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;기존 AI와의 차이점&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;구분기존 AI 모델초거대 AI
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1051&quot; data-start=&quot;728&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1051&quot; data-start=&quot;817&quot;&gt;
&lt;tr data-end=&quot;866&quot; data-start=&quot;817&quot;&gt;
&lt;td&gt;&lt;b&gt;규모(Parameters)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수백만~수십억 개&lt;/td&gt;
&lt;td&gt;&lt;b&gt;수천억~수조 개&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;927&quot; data-start=&quot;867&quot;&gt;
&lt;td&gt;&lt;b&gt;학습 데이터&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;특정 도메인 데이터&lt;/td&gt;
&lt;td&gt;&lt;b&gt;웹 전체, 멀티모달(텍스트, 이미지, 음성 등)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;986&quot; data-start=&quot;928&quot;&gt;
&lt;td&gt;&lt;b&gt;학습 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;지도학습(정형 데이터)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비지도/자기지도 학습(비정형 데이터 포함)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1051&quot; data-start=&quot;987&quot;&gt;
&lt;td&gt;&lt;b&gt;응용 가능성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;한정된 기능 수행&lt;/td&gt;
&lt;td&gt;&lt;b&gt;범용적 AI 서비스 가능 (GPT-4, DALL-E 등)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1233&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;초거대 AI의 주요 특징&lt;/b&gt;&lt;br /&gt;1️⃣ &lt;b&gt;멀티모달 AI&lt;/b&gt; &amp;rarr; 텍스트, 이미지, 음성, 영상 등 다양한 데이터 처리 가능&lt;br /&gt;2️⃣ &lt;b&gt;Few-shot Learning&lt;/b&gt; &amp;rarr; 최소한의 학습 데이터로도 강력한 성능 발휘&lt;br /&gt;3️⃣ &lt;b&gt;범용 인공지능(AGI) 가능성&lt;/b&gt; &amp;rarr; 다양한 분야에 적응할 수 있는 AI 모델&lt;/p&gt;
&lt;p data-end=&quot;1258&quot; data-start=&quot;1235&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;1387&quot; data-start=&quot;1259&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1301&quot; data-start=&quot;1259&quot;&gt;&lt;b&gt;행정 자동화&lt;/b&gt;: 민원 응대, 정책 문서 작성, 법률 검토 자동화&lt;/li&gt;
&lt;li data-end=&quot;1345&quot; data-start=&quot;1302&quot;&gt;&lt;b&gt;공공 데이터 분석&lt;/b&gt;: 빅데이터 기반 정책 수립, 도시 데이터 분석&lt;/li&gt;
&lt;li data-end=&quot;1387&quot; data-start=&quot;1346&quot;&gt;&lt;b&gt;지능형 공공 서비스&lt;/b&gt;: AI 기반 교통 관리, 스마트 헬스케어&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1392&quot; data-start=&quot;1389&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1423&quot; data-start=&quot;1394&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 초거대 AI 도입 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1514&quot; data-start=&quot;1425&quot; data-ke-size=&quot;size16&quot;&gt;정부의 **&amp;ldquo;공공 부문 초거대 AI 도입&amp;middot;활용 가이드라인&amp;rdquo;**에서는 &lt;b&gt;안전하고 신뢰할 수 있는 AI 도입을 위해 4가지 핵심 원칙&lt;/b&gt;을 제시하고 있습니다.&lt;/p&gt;
&lt;div&gt;구분설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1821&quot; data-start=&quot;1516&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1821&quot; data-start=&quot;1578&quot;&gt;
&lt;tr data-end=&quot;1643&quot; data-start=&quot;1578&quot;&gt;
&lt;td&gt;&lt;b&gt;1️⃣ 공공성(Public Interest)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;공공서비스 혁신 및 국민 편익 증대를 목표로 AI 도입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1701&quot; data-start=&quot;1644&quot;&gt;
&lt;td&gt;&lt;b&gt;2️⃣ 신뢰성(Reliability)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;초거대 AI의 오류&amp;middot;편향 최소화 및 투명성 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1756&quot; data-start=&quot;1702&quot;&gt;
&lt;td&gt;&lt;b&gt;3️⃣ 윤리성(Ethical AI)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;차별&amp;middot;편향 방지 및 개인정보 보호 원칙 준수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1821&quot; data-start=&quot;1757&quot;&gt;
&lt;td&gt;&lt;b&gt;4️⃣ 지속가능성(Sustainability)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;환경 부담 최소화 및 장기적 유지&amp;middot;관리 가능성 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1839&quot; data-start=&quot;1823&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;1932&quot; data-start=&quot;1840&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1884&quot; data-start=&quot;1840&quot;&gt;AI 도입 목적이 &lt;b&gt;행정 효율성 및 국민 서비스 향상에 부합해야 함&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1932&quot; data-start=&quot;1885&quot;&gt;단순 기술 도입이 아닌 &lt;b&gt;실제 정책&amp;middot;서비스 혁신에 기여하는 방향으로 적용&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1950&quot; data-start=&quot;1934&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;2042&quot; data-start=&quot;1951&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2004&quot; data-start=&quot;1951&quot;&gt;AI의 &lt;b&gt;결과 생성 과정(Explainability)을 명확히 설명할 수 있어야 함&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2042&quot; data-start=&quot;2005&quot;&gt;모델 학습 데이터의 신뢰성과 공공데이터 연계 방안 마련 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2060&quot; data-start=&quot;2044&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;2140&quot; data-start=&quot;2061&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2102&quot; data-start=&quot;2061&quot;&gt;AI가 &lt;b&gt;사회적 차별&amp;middot;편향을 초래하지 않도록 철저한 검증 필요&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2140&quot; data-start=&quot;2103&quot;&gt;개인정보 보호 및 데이터 보안 규정을 준수하는 방식으로 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2166&quot; data-start=&quot;2142&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;2268&quot; data-start=&quot;2167&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2207&quot; data-start=&quot;2167&quot;&gt;AI 인프라 구축 및 운영 시 &lt;b&gt;장기적 유지&amp;middot;관리 비용 고려&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2268&quot; data-start=&quot;2208&quot;&gt;&lt;b&gt;국산 AI 모델 활용 가능성 검토&lt;/b&gt;(예: Naver HyperCLOVA, LG EXAONE 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2273&quot; data-start=&quot;2270&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2311&quot; data-start=&quot;2275&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 초거대 AI 도입 시 사전 고려사항&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2386&quot; data-start=&quot;2313&quot; data-ke-size=&quot;size16&quot;&gt;초거대 AI를 공공 부문에서 효과적으로 도입하기 위해서는 &lt;b&gt;기술, 법&amp;middot;윤리, 운영 측면에서 다양한 사전 검토가 필요&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;2406&quot; data-start=&quot;2388&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;2549&quot; data-start=&quot;2407&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2455&quot; data-start=&quot;2407&quot;&gt;&lt;b&gt;AI 모델 성능 평가&lt;/b&gt; &amp;rarr; 공공 업무에 적합한 정확도&amp;middot;응답 속도 확보 필요&lt;/li&gt;
&lt;li data-end=&quot;2502&quot; data-start=&quot;2456&quot;&gt;&lt;b&gt;데이터 보안 및 접근 통제&lt;/b&gt; &amp;rarr; 공공데이터 학습 시 개인정보 보호 필수&lt;/li&gt;
&lt;li data-end=&quot;2549&quot; data-start=&quot;2503&quot;&gt;&lt;b&gt;온프레미스 vs 클라우드 AI 도입 비교&lt;/b&gt; &amp;rarr; 보안성&amp;middot;운영 효율성 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2572&quot; data-start=&quot;2551&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 법적&amp;middot;윤리적 고려사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2736&quot; data-start=&quot;2573&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2627&quot; data-start=&quot;2573&quot;&gt;&lt;b&gt;AI 생성 결과의 법적 책임&lt;/b&gt; &amp;rarr; 초거대 AI의 결정이 공공 정책에 미치는 영향 분석&lt;/li&gt;
&lt;li data-end=&quot;2678&quot; data-start=&quot;2628&quot;&gt;&lt;b&gt;윤리 가이드라인 준수&lt;/b&gt; &amp;rarr; AI 윤리기준(차별 방지, 개인정보 보호 등) 반영&lt;/li&gt;
&lt;li data-end=&quot;2736&quot; data-start=&quot;2679&quot;&gt;&lt;b&gt;AI 데이터 편향성 검토&lt;/b&gt; &amp;rarr; 학습 데이터가 특정 집단에 불리한 영향을 미치지 않도록 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2762&quot; data-start=&quot;2738&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;2915&quot; data-start=&quot;2763&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2810&quot; data-start=&quot;2763&quot;&gt;&lt;b&gt;AI 모델 지속적 학습 가능성 확보&lt;/b&gt; &amp;rarr; 최신 데이터 반영 프로세스 구축&lt;/li&gt;
&lt;li data-end=&quot;2858&quot; data-start=&quot;2811&quot;&gt;&lt;b&gt;운영 비용 절감 방안 검토&lt;/b&gt; &amp;rarr; 클라우드 AI 활용 시 비용 최적화 필요&lt;/li&gt;
&lt;li data-end=&quot;2915&quot; data-start=&quot;2859&quot;&gt;&lt;b&gt;공공 맞춤형 AI 모델 개발 가능성 고려&lt;/b&gt; &amp;rarr; 상용 AI 모델 대비 국산 AI 활용 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2939&quot; data-start=&quot;2917&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;3002&quot; data-start=&quot;2940&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2973&quot; data-start=&quot;2940&quot;&gt;&lt;b&gt;공공데이터 개방 및 AI 학습 활용 방안 수립&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3002&quot; data-start=&quot;2974&quot;&gt;&lt;b&gt;국내 법규 및 데이터 규제 준수 필요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3007&quot; data-start=&quot;3004&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3026&quot; data-start=&quot;3009&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3122&quot; data-start=&quot;3028&quot; data-ke-size=&quot;size16&quot;&gt;초거대 AI는 &lt;b&gt;공공 행정의 효율성 향상과 대국민 서비스 혁신을 위한 핵심 기술&lt;/b&gt;이지만, 신뢰성, 윤리성, 법적 리스크 등을 고려한 체계적인 도입이 필수적입니다.&lt;/p&gt;
&lt;p data-end=&quot;3231&quot; data-start=&quot;3124&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;초거대 AI의 개념, 도입 원칙 및 실무 적용 시 고려사항을 명확히 이해하고, 공공 부문에서 안전하고 효과적인 AI 활용 전략을 수립할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3248&quot; data-start=&quot;3233&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;3387&quot; data-start=&quot;3249&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3294&quot; data-start=&quot;3249&quot;&gt;&lt;b&gt;초거대 AI 개념:&lt;/b&gt; 대규모 데이터와 연산력을 기반으로 한 범용 AI&lt;/li&gt;
&lt;li data-end=&quot;3330&quot; data-start=&quot;3295&quot;&gt;&lt;b&gt;도입 원칙:&lt;/b&gt; 공공성, 신뢰성, 윤리성, 지속가능성&lt;/li&gt;
&lt;li data-end=&quot;3387&quot; data-start=&quot;3331&quot;&gt;&lt;b&gt;사전 고려사항:&lt;/b&gt; 기술적 성능, 법&amp;middot;윤리적 리스크, 운영 유지보수, 공공데이터 활용 전략&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/197</guid>
      <comments>https://geonoo.tistory.com/197#entry197comment</comments>
      <pubDate>Thu, 3 Apr 2025 09:55:45 +0900</pubDate>
    </item>
    <item>
      <title>  PoE(Power over Ethernet) 개념 및 표준</title>
      <link>https://geonoo.tistory.com/196</link>
      <description>&lt;h2 data-end=&quot;164&quot; data-start=&quot;148&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;313&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;PoE(Power over Ethernet)는 &lt;b&gt;랜 케이블(Ethernet Cable)을 통해 전력을 공급하는 기술&lt;/b&gt;로, 추가적인 전원 공급 장치 없이 네트워크 장비(예: IP 카메라, VoIP 전화기, 무선 AP 등)에 전력을 제공할 수 있는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;413&quot; data-start=&quot;315&quot; data-ke-size=&quot;size16&quot;&gt;PoE 기술은 &lt;b&gt;설치 비용 절감, 배선 간소화, 전력 관리 최적화&lt;/b&gt; 등의 장점이 있어 &lt;b&gt;스마트 빌딩, IoT 기기, 네트워크 인프라 구축&lt;/b&gt;에 널리 활용되고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;465&quot; data-start=&quot;415&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;PoE의 개념, IEEE 표준 및 국내 기술기준을 정리&lt;/b&gt;하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;470&quot; data-start=&quot;467&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;489&quot; data-start=&quot;472&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;515&quot; data-start=&quot;491&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 PoE의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;551&quot; data-start=&quot;517&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;PoE(Power over Ethernet)란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;731&quot; data-start=&quot;552&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;611&quot; data-start=&quot;552&quot;&gt;&lt;b&gt;랜 케이블(Ethernet Cable, UTP)을 통해 데이터와 전력을 동시에 전송하는 기술&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;668&quot; data-start=&quot;612&quot;&gt;&lt;b&gt;별도의 전원 공급 장치(Power Adapter) 없이&lt;/b&gt; 네트워크 장비에 전력 공급 가능&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;669&quot;&gt;&lt;b&gt;IP 기반 네트워크 장비(VoIP 전화, 무선 AP, IP 카메라, IoT 기기 등)에 주로 사용&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;805&quot; data-start=&quot;733&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;PoE의 기본 구성 요소&lt;/b&gt;&lt;br /&gt;1️⃣ &lt;b&gt;PSE (Power Sourcing Equipment, 전력 공급 장치)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;980&quot; data-start=&quot;809&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;828&quot; data-start=&quot;809&quot;&gt;PoE 전력을 공급하는 장비&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;832&quot;&gt;&lt;b&gt;PoE 스위치, PoE 인젝터&lt;/b&gt; 등이 포함됨&lt;br /&gt;2️⃣ &lt;b&gt;PD (Powered Device, 전력 수신 장치)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;930&quot; data-start=&quot;907&quot;&gt;PoE를 통해 전력을 공급받는 장비&lt;/li&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;934&quot;&gt;&lt;b&gt;IP 카메라, 무선 AP, VoIP 전화기, IoT 센서&lt;/b&gt; 등이 포함됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1000&quot; data-start=&quot;982&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;PoE의 작동 원리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1178&quot; data-start=&quot;1001&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1001&quot;&gt;&lt;b&gt;이더넷 케이블(UTP, Cat5e 이상)을 통해 DC 전원(보통 48V)을 공급&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1123&quot; data-start=&quot;1054&quot;&gt;PSE와 PD 간의 &lt;b&gt;전력 협상(Detection &amp;amp; Classification) 과정&lt;/b&gt;을 거쳐 안전한 전력 공급&lt;/li&gt;
&lt;li data-end=&quot;1178&quot; data-start=&quot;1124&quot;&gt;데이터와 전력을 동시에 전달할 수 있도록 &lt;b&gt;전력 전송 핀(Pair) 지정 방식&lt;/b&gt;을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1350&quot; data-start=&quot;1180&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;PoE의 장점&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;설치 간소화&lt;/b&gt;: 전력선 추가 없이 네트워크 장비 설치 가능&lt;br /&gt;✔ &lt;b&gt;비용 절감&lt;/b&gt;: 전기 공사 비용 절감 및 전원 어댑터 불필요&lt;br /&gt;✔ &lt;b&gt;유연성 향상&lt;/b&gt;: 전원 콘센트가 없는 곳에서도 장비 배치 가능&lt;br /&gt;✔ &lt;b&gt;안전성 강화&lt;/b&gt;: 전력 관리를 중앙에서 제어 가능&lt;/p&gt;
&lt;hr data-end=&quot;1355&quot; data-start=&quot;1352&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1388&quot; data-start=&quot;1357&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 PoE 관련 IEEE 표준&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1509&quot; data-start=&quot;1390&quot; data-ke-size=&quot;size16&quot;&gt;PoE 기술은 &lt;b&gt;IEEE 802.3 표준&lt;/b&gt;을 기반으로 정의되며, 전력 공급 방식 및 최대 전력 용량에 따라 &lt;b&gt;IEEE 802.3af, IEEE 802.3at, IEEE 802.3bt&lt;/b&gt; 표준이 존재합니다.&lt;/p&gt;
&lt;div&gt;표준명출시 연도최대 공급 전력(PSE)최대 수신 전력(PD)사용 핀주요 활용 장비
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2041&quot; data-start=&quot;1511&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2041&quot; data-start=&quot;1695&quot;&gt;
&lt;tr data-end=&quot;1781&quot; data-start=&quot;1695&quot;&gt;
&lt;td&gt;&lt;b&gt;IEEE 802.3af (PoE)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;td&gt;15.4W&lt;/td&gt;
&lt;td&gt;12.95W&lt;/td&gt;
&lt;td&gt;2-pair (4,5 / 7,8)&lt;/td&gt;
&lt;td&gt;VoIP, IP 카메라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1871&quot; data-start=&quot;1782&quot;&gt;
&lt;td&gt;&lt;b&gt;IEEE 802.3at (PoE+)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2009&lt;/td&gt;
&lt;td&gt;30W&lt;/td&gt;
&lt;td&gt;25.5W&lt;/td&gt;
&lt;td&gt;2-pair (4,5 / 7,8)&lt;/td&gt;
&lt;td&gt;무선 AP, 고화질 IP 카메라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1955&quot; data-start=&quot;1872&quot;&gt;
&lt;td&gt;&lt;b&gt;IEEE 802.3bt (PoE++) Type 3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;60W&lt;/td&gt;
&lt;td&gt;51W&lt;/td&gt;
&lt;td&gt;4-pair&lt;/td&gt;
&lt;td&gt;고성능 무선 AP, LED 조명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2041&quot; data-start=&quot;1956&quot;&gt;
&lt;td&gt;&lt;b&gt;IEEE 802.3bt (PoE++) Type 4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;100W&lt;/td&gt;
&lt;td&gt;71.3W&lt;/td&gt;
&lt;td&gt;4-pair&lt;/td&gt;
&lt;td&gt;고출력 네트워크 장비, IoT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2069&quot; data-start=&quot;2043&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;IEEE 802.3af (PoE)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2134&quot; data-start=&quot;2070&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2095&quot; data-start=&quot;2070&quot;&gt;기본적인 PoE 표준(최대 15.4W)&lt;/li&gt;
&lt;li data-end=&quot;2134&quot; data-start=&quot;2096&quot;&gt;저전력 장비(VoIP 전화기, 기본형 IP 카메라 등)에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2163&quot; data-start=&quot;2136&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;IEEE 802.3at (PoE+)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2220&quot; data-start=&quot;2164&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2189&quot; data-start=&quot;2164&quot;&gt;PoE의 업그레이드 버전(최대 30W)&lt;/li&gt;
&lt;li data-end=&quot;2220&quot; data-start=&quot;2190&quot;&gt;고해상도 IP 카메라, 고성능 무선 AP에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2250&quot; data-start=&quot;2222&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;IEEE 802.3bt (PoE++)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2327&quot; data-start=&quot;2251&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2273&quot; data-start=&quot;2251&quot;&gt;최신 PoE 표준(최대 100W)&lt;/li&gt;
&lt;li data-end=&quot;2299&quot; data-start=&quot;2274&quot;&gt;4페어 방식(모든 8개 와이어를 사용)&lt;/li&gt;
&lt;li data-end=&quot;2327&quot; data-start=&quot;2300&quot;&gt;LED 조명, 고출력 IoT 장비까지 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2332&quot; data-start=&quot;2329&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2358&quot; data-start=&quot;2334&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 국내 기술기준&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2402&quot; data-start=&quot;2360&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;PoE 관련 국내 기술 기준(국립전파연구원, 방송통신기술기준)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2427&quot; data-start=&quot;2404&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;전력 전송 및 안전 규정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2534&quot; data-start=&quot;2428&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2490&quot; data-start=&quot;2428&quot;&gt;PoE 장비는 &lt;b&gt;전력 전송 시 IEEE 표준을 준수해야 하며, 전자파 간섭(EMI)을 최소화해야 함&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2534&quot; data-start=&quot;2491&quot;&gt;최대 전력 공급 시 &lt;b&gt;전압 안정성 및 과부하 보호 기능 필수 적용&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2564&quot; data-start=&quot;2536&quot; data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;통신사업법 및 네트워크 장비 인증&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2672&quot; data-start=&quot;2565&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2615&quot; data-start=&quot;2565&quot;&gt;&lt;b&gt;PoE 스위치 및 인젝터는 KC 인증(전기용품 및 생활용품 안전관리법) 필수&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2672&quot; data-start=&quot;2616&quot;&gt;국내 네트워크 장비 제조사는 &lt;b&gt;방송통신기자재 적합성 평가(전파법)에 따라 인증 절차 진행&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2698&quot; data-start=&quot;2674&quot; data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;건물 내 PoE 배선 규정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2788&quot; data-start=&quot;2699&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2751&quot; data-start=&quot;2699&quot;&gt;&lt;b&gt;PoE 전원 공급을 위한 UTP 케이블(Cat5e, Cat6 이상) 사용 의무화&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2788&quot; data-start=&quot;2752&quot;&gt;PoE 장비의 &lt;b&gt;과전류 보호 및 접지 규격 준수 필요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2819&quot; data-start=&quot;2790&quot; data-ke-size=&quot;size16&quot;&gt;4️⃣ &lt;b&gt;공공기관 및 데이터센터 적용 가이드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2933&quot; data-start=&quot;2820&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2875&quot; data-start=&quot;2820&quot;&gt;국내 공공기관 및 데이터센터 구축 시 &lt;b&gt;IEEE 802.3at(30W) 이상 적용 권장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2933&quot; data-start=&quot;2876&quot;&gt;스마트 빌딩 및 IoT 환경에서는 &lt;b&gt;IEEE 802.3bt 기반의 고출력 PoE 사용 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2938&quot; data-start=&quot;2935&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2957&quot; data-start=&quot;2940&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3064&quot; data-start=&quot;2959&quot; data-ke-size=&quot;size16&quot;&gt;PoE(Power over Ethernet)는 &lt;b&gt;이더넷 케이블을 통해 데이터와 전력을 동시에 전송하는 기술&lt;/b&gt;로, &lt;b&gt;네트워크 장비의 배선 간소화 및 비용 절감&lt;/b&gt; 효과를 제공합니다.&lt;/p&gt;
&lt;p data-end=&quot;3227&quot; data-start=&quot;3066&quot; data-ke-size=&quot;size16&quot;&gt;현재 PoE 기술은 &lt;b&gt;IEEE 802.3af(PoE), IEEE 802.3at(PoE+), IEEE 802.3bt(PoE++)&lt;/b&gt; 등의 국제 표준을 기반으로 발전하고 있으며, 국내에서도 &lt;b&gt;전파법, KC 인증 및 네트워크 장비 규격에 맞춰 기술 기준을 마련하고 적용&lt;/b&gt;하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3323&quot; data-start=&quot;3229&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;PoE의 개념과 표준을 명확히 이해하고, 실무에서 네트워크 설계 및 장비 도입 시 적절한 PoE 표준을 적용하는 능력이 필요합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3340&quot; data-start=&quot;3325&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;3499&quot; data-start=&quot;3341&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3377&quot; data-start=&quot;3341&quot;&gt;&lt;b&gt;PoE 개념:&lt;/b&gt; 이더넷 케이블을 통한 전력 공급 기술&lt;/li&gt;
&lt;li data-end=&quot;3453&quot; data-start=&quot;3378&quot;&gt;&lt;b&gt;IEEE 표준:&lt;/b&gt; IEEE 802.3af(15.4W), IEEE 802.3at(30W), IEEE 802.3bt(100W)&lt;/li&gt;
&lt;li data-end=&quot;3499&quot; data-start=&quot;3454&quot;&gt;&lt;b&gt;국내 기술기준:&lt;/b&gt; 전파법, KC 인증, 네트워크 장비 규격 준수 필요&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/196</guid>
      <comments>https://geonoo.tistory.com/196#entry196comment</comments>
      <pubDate>Wed, 2 Apr 2025 11:04:52 +0900</pubDate>
    </item>
    <item>
      <title>  소프트웨어 품질성능 평가시험</title>
      <link>https://geonoo.tistory.com/195</link>
      <description>&lt;h2 data-end=&quot;143&quot; data-start=&quot;127&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;224&quot; data-start=&quot;145&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어는 기능적 요구사항뿐만 아니라 &lt;b&gt;성능, 신뢰성, 확장성 등의 비기능적 요구사항도 충족해야 최적의 품질을 보장&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;특히 **소프트웨어 품질성능 평가시험(Software Performance Testing)**은 시스템이 특정 환경에서 &lt;b&gt;응답 속도, 처리량, 안정성 등을 충족하는지 검증하는 과정&lt;/b&gt;으로, 성능 병목 현상을 사전에 방지하고 최적화하는 데 필수적입니다.&lt;/p&gt;
&lt;p data-end=&quot;442&quot; data-start=&quot;371&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;소프트웨어 품질성능 평가시험의 개념, 주요 평가 항목, 시험 유형 및 실무 적용 방안을 분석&lt;/b&gt;하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;447&quot; data-start=&quot;444&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;466&quot; data-start=&quot;449&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;504&quot; data-start=&quot;468&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 소프트웨어 품질성능 평가시험의 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;553&quot; data-start=&quot;506&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;소프트웨어 품질성능 평가시험(Performance Testing)이란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;665&quot; data-start=&quot;554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;554&quot;&gt;소프트웨어가 &lt;b&gt;주어진 요구사항 하에서 성능(응답 속도, 처리량, 리소스 사용량 등)을 충족하는지 검증&lt;/b&gt;하는 시험&lt;/li&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;623&quot;&gt;주요 목표: &lt;b&gt;병목 현상 파악, 최적의 성능 보장, 안정성 검증&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;683&quot; data-start=&quot;667&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;831&quot; data-start=&quot;684&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;684&quot;&gt;&lt;b&gt;ISO/IEC 25010 (소프트웨어 품질 모델)&lt;/b&gt;: 성능 효율성(Performance Efficiency) 기준 포함&lt;/li&gt;
&lt;li data-end=&quot;797&quot; data-start=&quot;758&quot;&gt;&lt;b&gt;ISO/IEC 9126&lt;/b&gt;: 소프트웨어 품질 특성 평가 기준&lt;/li&gt;
&lt;li data-end=&quot;831&quot; data-start=&quot;798&quot;&gt;&lt;b&gt;IEEE 829&lt;/b&gt;: 소프트웨어 테스트 문서 표준&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;836&quot; data-start=&quot;833&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;877&quot; data-start=&quot;838&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 소프트웨어 품질성능 평가시험의 주요 항목&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;평가 항목설명주요 지표
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1497&quot; data-start=&quot;879&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1497&quot; data-start=&quot;966&quot;&gt;
&lt;tr data-end=&quot;1046&quot; data-start=&quot;966&quot;&gt;
&lt;td&gt;&lt;b&gt;1️⃣ 응답 시간(Response Time)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;특정 요청에 대한 시스템 응답 속도&lt;/td&gt;
&lt;td&gt;평균 응답 시간(ms), 백분위 응답 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1152&quot; data-start=&quot;1047&quot;&gt;
&lt;td&gt;&lt;b&gt;2️⃣ 처리량(Throughput)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;단위 시간당 처리 가능한 트랜잭션 수&lt;/td&gt;
&lt;td&gt;TPS(Transaction per Second), QPS(Queries per Second)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1234&quot; data-start=&quot;1153&quot;&gt;
&lt;td&gt;&lt;b&gt;3️⃣ 동시 사용자 수(Concurrency)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;동시 접속 사용자가 증가할 때의 성능 변화&lt;/td&gt;
&lt;td&gt;동시 접속 사용자 수, 세션 유지율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1343&quot; data-start=&quot;1235&quot;&gt;
&lt;td&gt;&lt;b&gt;4️⃣ 자원 사용률(Resource Utilization)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CPU, 메모리, 네트워크, 디스크 사용률&lt;/td&gt;
&lt;td&gt;CPU 사용률(%), 메모리 사용량(MB), 네트워크 대역폭(Mbps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1415&quot; data-start=&quot;1344&quot;&gt;
&lt;td&gt;&lt;b&gt;5️⃣ 확장성(Scalability)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;하드웨어 및 네트워크 확장 시 성능 증가율&lt;/td&gt;
&lt;td&gt;수평적&amp;middot;수직적 확장 효율성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1497&quot; data-start=&quot;1416&quot;&gt;
&lt;td&gt;&lt;b&gt;6️⃣ 안정성(Reliability)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;장시간 운영 시 성능 저하 여부&lt;/td&gt;
&lt;td&gt;MTBF(평균 고장 간격), MTTR(평균 복구 시간)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1502&quot; data-start=&quot;1499&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1540&quot; data-start=&quot;1504&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 소프트웨어 품질성능 평가시험의 유형&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;시험 유형설명주요 목적
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2097&quot; data-start=&quot;1542&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2097&quot; data-start=&quot;1627&quot;&gt;
&lt;tr data-end=&quot;1701&quot; data-start=&quot;1627&quot;&gt;
&lt;td&gt;&lt;b&gt;1️⃣ 부하 테스트(Load Testing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정상적인 사용자 트래픽에서 시스템 성능 평가&lt;/td&gt;
&lt;td&gt;시스템 처리 능력 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1780&quot; data-start=&quot;1702&quot;&gt;
&lt;td&gt;&lt;b&gt;2️⃣ 스트레스 테스트(Stress Testing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템 한계를 초과하는 부하에서의 성능 측정&lt;/td&gt;
&lt;td&gt;장애 발생 가능성 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1858&quot; data-start=&quot;1781&quot;&gt;
&lt;td&gt;&lt;b&gt;3️⃣ 내구성 테스트(Soak Testing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;장시간 운영 시 성능 저하 여부 검증&lt;/td&gt;
&lt;td&gt;메모리 누수 및 리소스 문제 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1940&quot; data-start=&quot;1859&quot;&gt;
&lt;td&gt;&lt;b&gt;4️⃣ 스파이크 테스트(Spike Testing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;갑작스러운 트래픽 급증 시 성능 변화 측정&lt;/td&gt;
&lt;td&gt;시스템 급격한 부하 대응력 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2014&quot; data-start=&quot;1941&quot;&gt;
&lt;td&gt;&lt;b&gt;5️⃣ 회귀 테스트(Regression Testing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템 변경 후 성능 저하 여부 확인&lt;/td&gt;
&lt;td&gt;최적의 성능 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2097&quot; data-start=&quot;2015&quot;&gt;
&lt;td&gt;&lt;b&gt;6️⃣ 확장성 테스트(Scalability Testing)&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;/div&gt;
&lt;hr data-end=&quot;2102&quot; data-start=&quot;2099&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2138&quot; data-start=&quot;2104&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.4 실무 적용 방안 및 최적화 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2166&quot; data-start=&quot;2140&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;2319&quot; data-start=&quot;2167&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2197&quot; data-start=&quot;2167&quot;&gt;&lt;b&gt;JMeter&lt;/b&gt;: 오픈소스 부하 테스트 도구&lt;/li&gt;
&lt;li data-end=&quot;2235&quot; data-start=&quot;2198&quot;&gt;&lt;b&gt;LoadRunner&lt;/b&gt;: 엔터프라이즈 성능 테스트 솔루션&lt;/li&gt;
&lt;li data-end=&quot;2277&quot; data-start=&quot;2236&quot;&gt;&lt;b&gt;Gatling&lt;/b&gt;: 고성능 부하 테스트 도구 (Scala 기반)&lt;/li&gt;
&lt;li data-end=&quot;2319&quot; data-start=&quot;2278&quot;&gt;&lt;b&gt;Apache Benchmark(AB)&lt;/b&gt;: 웹 서버 성능 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2350&quot; data-start=&quot;2321&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;2510&quot; data-start=&quot;2351&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2392&quot; data-start=&quot;2351&quot;&gt;&lt;b&gt;데이터베이스 튜닝:&lt;/b&gt; 인덱스 최적화, 캐싱 적용, 쿼리 최적화&lt;/li&gt;
&lt;li data-end=&quot;2449&quot; data-start=&quot;2393&quot;&gt;&lt;b&gt;애플리케이션 튜닝:&lt;/b&gt; GC(Garbage Collection) 최적화, 비동기 처리 적용&lt;/li&gt;
&lt;li data-end=&quot;2510&quot; data-start=&quot;2450&quot;&gt;&lt;b&gt;네트워크 튜닝:&lt;/b&gt; CDN(Content Delivery Network) 적용, 로드 밸런싱 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2545&quot; data-start=&quot;2512&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ DevOps 및 CI/CD 파이프라인 적용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2647&quot; data-start=&quot;2546&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2593&quot; data-start=&quot;2546&quot;&gt;&lt;b&gt;Jenkins, GitLab CI/CD&lt;/b&gt;를 활용하여 성능 테스트를 자동화&lt;/li&gt;
&lt;li data-end=&quot;2647&quot; data-start=&quot;2594&quot;&gt;배포 전 &lt;b&gt;성능 검증 절차(Performance Validation Step) 추가&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2670&quot; data-start=&quot;2649&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;2759&quot; data-start=&quot;2671&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2716&quot; data-start=&quot;2671&quot;&gt;&lt;b&gt;오토스케일링(Auto Scaling)&lt;/b&gt; 적용으로 유동적인 트래픽 대응&lt;/li&gt;
&lt;li data-end=&quot;2759&quot; data-start=&quot;2717&quot;&gt;클라우드 네이티브 아키텍처(FaaS, Serverless) 도입 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2786&quot; data-start=&quot;2761&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;2908&quot; data-start=&quot;2787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2865&quot; data-start=&quot;2787&quot;&gt;&lt;b&gt;실시간 모니터링 도구&lt;/b&gt;: Prometheus, Grafana, ELK(Elasticsearch, Logstash, Kibana)&lt;/li&gt;
&lt;li data-end=&quot;2908&quot; data-start=&quot;2866&quot;&gt;&lt;b&gt;AIOps 기반 성능 예측&lt;/b&gt;: 머신러닝을 활용한 성능 이상 탐지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2913&quot; data-start=&quot;2910&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2932&quot; data-start=&quot;2915&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3014&quot; data-start=&quot;2934&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 품질성능 평가시험은 &lt;b&gt;응답 시간, 처리량, 안정성 등의 성능 지표를 검증하여 최적의 시스템 운영을 보장하는 필수 과정&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3107&quot; data-start=&quot;3016&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;소프트웨어 성능 테스트의 주요 개념과 평가 항목을 이해하고, 실무에서 효과적으로 성능 최적화 전략을 적용할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3124&quot; data-start=&quot;3109&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;3280&quot; data-start=&quot;3125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3168&quot; data-start=&quot;3125&quot;&gt;&lt;b&gt;평가 항목:&lt;/b&gt; 응답 속도, 처리량, 자원 사용률, 확장성, 안정성&lt;/li&gt;
&lt;li data-end=&quot;3221&quot; data-start=&quot;3169&quot;&gt;&lt;b&gt;시험 유형:&lt;/b&gt; 부하 테스트, 스트레스 테스트, 내구성 테스트, 스파이크 테스트 등&lt;/li&gt;
&lt;li data-end=&quot;3280&quot; data-start=&quot;3222&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 자동화 도구 활용, DB&amp;middot;애플리케이션 최적화, 클라우드 네이티브 아키텍처 적용&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/195</guid>
      <comments>https://geonoo.tistory.com/195#entry195comment</comments>
      <pubDate>Tue, 1 Apr 2025 11:27:09 +0900</pubDate>
    </item>
    <item>
      <title>  전자정부 정보시스템 성과 측정지표</title>
      <link>https://geonoo.tistory.com/194</link>
      <description>&lt;h2 data-end=&quot;150&quot; data-start=&quot;134&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;전자정부 정보시스템은 행정 서비스의 효율성과 국민 편의성을 높이기 위해 도입되었습니다. 하지만 단순히 시스템을 구축하는 것만으로는 성과를 보장할 수 없으며, &lt;b&gt;정량적&amp;middot;정성적 측정지표를 기반으로 지속적인 성과 평가 및 개선이 필요&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;350&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;전자정부 정보시스템의 성과를 측정하는 주요 지표와 실무 적용 방안을 분석&lt;/b&gt;하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;355&quot; data-start=&quot;352&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;374&quot; data-start=&quot;357&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;414&quot; data-start=&quot;376&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 전자정부 정보시스템 성과 측정의 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;577&quot; data-start=&quot;416&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;투자 대비 효과(ROI) 분석&lt;/b&gt; &amp;rarr; 예산 투입 대비 성과 확인&lt;br /&gt;✅ &lt;b&gt;서비스 품질 향상&lt;/b&gt; &amp;rarr; 사용자 경험 및 만족도 평가&lt;br /&gt;✅ &lt;b&gt;운영 효율성 개선&lt;/b&gt; &amp;rarr; 유지보수 비용 절감 및 자원 최적화&lt;br /&gt;✅ &lt;b&gt;정책 수립 및 개선 방향 설정&lt;/b&gt; &amp;rarr; 객관적인 데이터 기반 의사결정&lt;/p&gt;
&lt;hr data-end=&quot;582&quot; data-start=&quot;579&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;622&quot; data-start=&quot;584&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 전자정부 정보시스템 성과 측정지표 분류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;696&quot; data-start=&quot;624&quot; data-ke-size=&quot;size16&quot;&gt;전자정부 정보시스템의 성과 측정지표는 크게 &lt;b&gt;기능적 성과, 기술적 성과, 경제적 성과, 조직적 성과&lt;/b&gt;로 나눌 수 있습니다.&lt;/p&gt;
&lt;div&gt;지표 유형주요 내용예시 지표
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1106&quot; data-start=&quot;698&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1106&quot; data-start=&quot;779&quot;&gt;
&lt;tr data-end=&quot;853&quot; data-start=&quot;779&quot;&gt;
&lt;td&gt;&lt;b&gt;1️⃣ 기능적 성과&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템의 목적을 얼마나 효과적으로 달성했는가?&lt;/td&gt;
&lt;td&gt;서비스 접근성, 사용자 만족도, 업무처리 속도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;933&quot; data-start=&quot;854&quot;&gt;
&lt;td&gt;&lt;b&gt;2️⃣ 기술적 성과&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템의 안정성과 성능은 적절한가?&lt;/td&gt;
&lt;td&gt;시스템 가용성(Availability), 응답 속도, 장애 발생률&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1022&quot; data-start=&quot;934&quot;&gt;
&lt;td&gt;&lt;b&gt;3️⃣ 경제적 성과&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템 운영이 비용 절감과 생산성 향상에 기여했는가?&lt;/td&gt;
&lt;td&gt;비용 절감 효과, 투자 대비 성과(ROI), 운영 유지보수 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1106&quot; data-start=&quot;1023&quot;&gt;
&lt;td&gt;&lt;b&gt;4️⃣ 조직적 성과&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;/div&gt;
&lt;hr data-end=&quot;1111&quot; data-start=&quot;1108&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1153&quot; data-start=&quot;1113&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;2.3 전자정부 정보시스템 성과 측정지표 상세 분석&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1181&quot; data-start=&quot;1155&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1️⃣ 기능적 성과 측정지표&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시스템 활용도(Usage Rate):&lt;/b&gt; 사용 빈도 및 이용자 수 증가율&lt;br /&gt;✅ &lt;b&gt;서비스 접근성(Service Accessibility):&lt;/b&gt; 정보 취약계층(장애인, 노인)의 접근 가능 여부&lt;br /&gt;✅ &lt;b&gt;사용자 만족도(User Satisfaction):&lt;/b&gt; 시스템 사용 후 국민 및 공무원의 만족도&lt;/p&gt;
&lt;h4 data-end=&quot;1382&quot; data-start=&quot;1356&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2️⃣ 기술적 성과 측정지표&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1577&quot; data-start=&quot;1383&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시스템 가용성(System Availability):&lt;/b&gt; 시스템의 연중 무중단 운영 비율(99.9% 이상 목표)&lt;br /&gt;✅ &lt;b&gt;평균 응답 시간(Response Time):&lt;/b&gt; 웹사이트 및 서비스 응답 속도(ms)&lt;br /&gt;✅ &lt;b&gt;보안 수준(Security Compliance):&lt;/b&gt; 정보보호 관리체계(ISMS-P) 준수 여부, 침해사고 발생 횟수&lt;/p&gt;
&lt;h4 data-end=&quot;1605&quot; data-start=&quot;1579&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3️⃣ 경제적 성과 측정지표&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1775&quot; data-start=&quot;1606&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;운영 비용 절감률(Cost Reduction Rate):&lt;/b&gt; 기존 대비 유지보수 및 인프라 운영 비용 감소율&lt;br /&gt;✅ &lt;b&gt;ROI(Return on Investment):&lt;/b&gt; 투자 비용 대비 성과 창출 비율&lt;br /&gt;✅ &lt;b&gt;시스템 도입 후 업무 생산성 향상률:&lt;/b&gt; 업무 자동화 및 행정 절차 단축 효과&lt;/p&gt;
&lt;h4 data-end=&quot;1803&quot; data-start=&quot;1777&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4️⃣ 조직적 성과 측정지표&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1925&quot; data-start=&quot;1804&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;업무 효율성 개선율:&lt;/b&gt; 시스템 도입 전&amp;middot;후 처리 시간 비교&lt;br /&gt;✅ &lt;b&gt;부서 간 협업 활성화:&lt;/b&gt; 전자문서 및 데이터 공유 증가율&lt;br /&gt;✅ &lt;b&gt;정책 의사결정 지원 효과:&lt;/b&gt; 데이터 기반 정책 결정 사례 증가율&lt;/p&gt;
&lt;hr data-end=&quot;1930&quot; data-start=&quot;1927&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1965&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.4 실무 적용 방안 및 개선 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2001&quot; data-start=&quot;1967&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;2090&quot; data-start=&quot;2002&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2041&quot; data-start=&quot;2002&quot;&gt;정량적(사용량, 속도, 비용) + 정성적(만족도, 효율성) 측정&lt;/li&gt;
&lt;li data-end=&quot;2090&quot; data-start=&quot;2042&quot;&gt;KPI(Key Performance Indicator) 설정 후 지속적 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2122&quot; data-start=&quot;2092&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 국민 중심의 사용자 경험(UX) 개선&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2195&quot; data-start=&quot;2123&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2161&quot; data-start=&quot;2123&quot;&gt;웹&amp;middot;모바일 서비스의 접근성 향상(예: 음성 지원, 쉬운 UI)&lt;/li&gt;
&lt;li data-end=&quot;2195&quot; data-start=&quot;2162&quot;&gt;사용자 피드백 반영 주기 단축 및 개선사항 즉시 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2228&quot; data-start=&quot;2197&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 클라우드 및 AI 기반 행정 혁신 추진&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2312&quot; data-start=&quot;2229&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2285&quot; data-start=&quot;2229&quot;&gt;전자정부 시스템의 &lt;b&gt;클라우드 전환(Cloud Migration) 및 인공지능(AI) 적용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2312&quot; data-start=&quot;2286&quot;&gt;빅데이터 분석을 통한 행정 효율성 극대화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2338&quot; data-start=&quot;2314&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;2411&quot; data-start=&quot;2339&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2371&quot; data-start=&quot;2339&quot;&gt;&lt;b&gt;ISMS-P, 개인정보보호법 준수 여부 점검&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2411&quot; data-start=&quot;2372&quot;&gt;&lt;b&gt;재해복구(DR) 시스템 구축&lt;/b&gt; 및 장애 대응 프로세스 정립&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2437&quot; data-start=&quot;2413&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;2509&quot; data-start=&quot;2438&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2472&quot; data-start=&quot;2438&quot;&gt;국민과 공무원의 피드백을 반영한 시스템 개선 주기 설정&lt;/li&gt;
&lt;li data-end=&quot;2509&quot; data-start=&quot;2473&quot;&gt;성과 평가 결과를 기반으로 예산 편성 및 정책 수립 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2514&quot; data-start=&quot;2511&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2533&quot; data-start=&quot;2516&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2622&quot; data-start=&quot;2535&quot; data-ke-size=&quot;size16&quot;&gt;전자정부 정보시스템의 성과는 &lt;b&gt;기능적, 기술적, 경제적, 조직적 측면에서 다각도로 측정해야 하며, 정량적&amp;middot;정성적 지표를 균형 있게 고려해야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2721&quot; data-start=&quot;2624&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;성과 측정지표를 효과적으로 활용하여 전자정부 시스템의 효율성과 국민 서비스 품질을 지속적으로 향상시키는 전략을 제시할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2738&quot; data-start=&quot;2723&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;2892&quot; data-start=&quot;2739&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2780&quot; data-start=&quot;2739&quot;&gt;&lt;b&gt;성과 측정지표 유형:&lt;/b&gt; 기능적, 기술적, 경제적, 조직적 성과&lt;/li&gt;
&lt;li data-end=&quot;2836&quot; data-start=&quot;2781&quot;&gt;&lt;b&gt;주요 성과 지표:&lt;/b&gt; 시스템 가용성, 사용자 만족도, 운영 비용 절감, 업무 효율성 향상&lt;/li&gt;
&lt;li data-end=&quot;2892&quot; data-start=&quot;2837&quot;&gt;&lt;b&gt;실무 적용 방안:&lt;/b&gt; 데이터 기반 평가, UX 개선, 클라우드 및 AI 적용, 보안 강화&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/194</guid>
      <comments>https://geonoo.tistory.com/194#entry194comment</comments>
      <pubDate>Tue, 1 Apr 2025 11:04:36 +0900</pubDate>
    </item>
    <item>
      <title>  애자일(Agile) 소프트웨어 개발의 장점 및 단점</title>
      <link>https://geonoo.tistory.com/193</link>
      <description>&lt;h2 data-end=&quot;174&quot; data-start=&quot;158&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;351&quot; data-start=&quot;176&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발 환경이 급변하면서 &lt;b&gt;기존의 폭포수(Waterfall) 방식&lt;/b&gt;은 변화에 유연하게 대응하기 어려운 한계를 보였습니다. 이를 해결하기 위해 &lt;b&gt;반복적 개발(Iterative Development)과 유연한 변화 대응&lt;/b&gt;을 핵심 원칙으로 하는 &lt;b&gt;애자일(Agile) 개발 방법론&lt;/b&gt;이 등장했습니다.&lt;/p&gt;
&lt;p data-end=&quot;426&quot; data-start=&quot;353&quot; data-ke-size=&quot;size16&quot;&gt;애자일 개발은 소프트웨어를 &lt;b&gt;짧은 주기로 반복 개발하고, 고객과 긴밀한 협력을 통해 신속하게 피드백을 반영하는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;487&quot; data-start=&quot;428&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;애자일 개발의 주요 특징, 장점과 단점, 그리고 실무 적용 방안을 분석&lt;/b&gt;하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;492&quot; data-start=&quot;489&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;511&quot; data-start=&quot;494&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;553&quot; data-start=&quot;513&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.1 애자일(Agile) 소프트웨어 개발의 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;576&quot; data-start=&quot;555&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;742&quot; data-start=&quot;577&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;577&quot;&gt;&lt;b&gt;반복적(Iterative) 개발&lt;/b&gt; &amp;rarr; 기능 단위로 소프트웨어를 점진적으로 개발&lt;/li&gt;
&lt;li data-end=&quot;678&quot; data-start=&quot;628&quot;&gt;&lt;b&gt;고객과의 협업(Collaboration)&lt;/b&gt; &amp;rarr; 요구사항 변경에도 유연하게 대응&lt;/li&gt;
&lt;li data-end=&quot;742&quot; data-start=&quot;679&quot;&gt;&lt;b&gt;최소 기능 제품(MVP, Minimum Viable Product) 출시&lt;/b&gt; &amp;rarr; 빠른 시장 테스트 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;765&quot; data-start=&quot;744&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;애자일의 주요 프레임워크&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;프레임워크특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1046&quot; data-start=&quot;766&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1046&quot; data-start=&quot;826&quot;&gt;
&lt;tr data-end=&quot;881&quot; data-start=&quot;826&quot;&gt;
&lt;td&gt;&lt;b&gt;스크럼(Scrum)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정해진 기간(스프린트) 내 목표를 달성하는 팀 중심 개발 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;922&quot; data-start=&quot;882&quot;&gt;
&lt;td&gt;&lt;b&gt;칸반(Kanban)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실시간 작업 흐름을 가시적으로 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;985&quot; data-start=&quot;923&quot;&gt;
&lt;td&gt;&lt;b&gt;XP(eXtreme Programming)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;테스트 주도 개발(TDD) 및 짧은 개발 주기 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1046&quot; data-start=&quot;986&quot;&gt;
&lt;td&gt;&lt;b&gt;SAFe(Scaled Agile Framework)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;대규모 조직에서 애자일을 적용하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1051&quot; data-start=&quot;1048&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1085&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;2.2 애자일 소프트웨어 개발의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1202&quot; data-start=&quot;1087&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1️⃣ 빠른 피드백 반영 및 유연한 변경 대응&lt;/b&gt;&lt;br /&gt;✅ 짧은 개발 주기(Iteration)로 고객의 피드백을 즉각 반영 가능&lt;br /&gt;✅ &lt;b&gt;요구사항 변경에도 신속하게 대응&lt;/b&gt; &amp;rarr; 시장 변화에 빠른 적응&lt;/p&gt;
&lt;p data-end=&quot;1319&quot; data-start=&quot;1204&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2️⃣ 높은 고객 만족도&lt;/b&gt;&lt;br /&gt;✅ 고객과 지속적인 협업을 통해 &lt;b&gt;실제 필요 기능 중심으로 개발&lt;/b&gt;&lt;br /&gt;✅ 초기에 &lt;b&gt;MVP(Minimum Viable Product)를 출시하여 시장 검증 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1433&quot; data-start=&quot;1321&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3️⃣ 품질 개선 및 리스크 감소&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;테스트 주도 개발(TDD) 적용&lt;/b&gt;으로 코드 품질 향상&lt;br /&gt;✅ &lt;b&gt;짧은 배포 주기(Continuous Delivery)로 오류 조기 발견 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1530&quot; data-start=&quot;1435&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4️⃣ 개발팀의 자율성과 동기 부여&lt;/b&gt;&lt;br /&gt;✅ 팀원들이 &lt;b&gt;의사결정 과정에 적극 참여&lt;/b&gt; &amp;rarr; 책임감 증가&lt;br /&gt;✅ 단기 목표 달성(Sprint) 방식으로 성취감 상승&lt;/p&gt;
&lt;p data-end=&quot;1631&quot; data-start=&quot;1532&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5️⃣ 지속적 개선 및 최적화 가능&lt;/b&gt;&lt;br /&gt;✅ 지속적인 리팩토링(Refactoring)과 코드 개선&lt;br /&gt;✅ 실시간 협업 도구(JIRA, Trello) 활용 &amp;rarr; 생산성 향상&lt;/p&gt;
&lt;hr data-end=&quot;1636&quot; data-start=&quot;1633&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1670&quot; data-start=&quot;1638&quot; data-ke-size=&quot;size23&quot;&gt;❌ &lt;b&gt;2.3 애자일 소프트웨어 개발의 단점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1793&quot; data-start=&quot;1672&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1️⃣ 명확한 요구사항 정의가 어렵다&lt;/b&gt;&lt;br /&gt;⚠️ 초기 단계에서 전체 프로젝트 범위를 확정하기 어려움&lt;br /&gt;⚠️ 프로젝트가 진행될수록 기능이 추가되면서 일정이 길어질 가능성(스코프 크리프, Scope Creep)&lt;/p&gt;
&lt;p data-end=&quot;1919&quot; data-start=&quot;1795&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2️⃣ 문서화 부족으로 인수인계가 어려움&lt;/b&gt;&lt;br /&gt;⚠️ 애자일은 코드 중심 개발이므로 &lt;b&gt;요구사항 및 설계 문서가 부족할 수 있음&lt;/b&gt;&lt;br /&gt;⚠️ 프로젝트 종료 후, &lt;b&gt;다른 개발자가 유지보수를 하기 어려운 문제 발생&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2018&quot; data-start=&quot;1921&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3️⃣ 빈번한 요구사항 변경으로 일정 관리가 어려움&lt;/b&gt;&lt;br /&gt;⚠️ 고객 요구사항이 자주 변경되면 일정이 지연될 가능성&lt;br /&gt;⚠️ 개발팀의 피로도 증가 &amp;rarr; 생산성 저하 가능&lt;/p&gt;
&lt;p data-end=&quot;2151&quot; data-start=&quot;2020&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4️⃣ 팀워크와 커뮤니케이션이 중요&lt;/b&gt;&lt;br /&gt;⚠️ 개발팀 간 협업이 원활하지 않으면 프로젝트 진행이 지연될 수 있음&lt;br /&gt;⚠️ 대규모 조직에서는 조율이 어려워 &lt;b&gt;SAFe(Scaled Agile) 같은 확장형 애자일 모델이 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2253&quot; data-start=&quot;2153&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5️⃣ 숙련된 인력이 필요&lt;/b&gt;&lt;br /&gt;⚠️ 팀원들이 애자일 프로세스에 익숙하지 않으면 오히려 비효율 발생&lt;br /&gt;⚠️ 개발자, 기획자, 디자이너 간 &lt;b&gt;긴밀한 협업 역량이 필수&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2258&quot; data-start=&quot;2255&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2291&quot; data-start=&quot;2260&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.4 실무 적용 방안 및 해결책&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2327&quot; data-start=&quot;2293&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 초기 요구사항 정의를 위한 MVP 전략 활용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2381&quot; data-start=&quot;2328&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2381&quot; data-start=&quot;2328&quot;&gt;모든 기능을 한 번에 개발하는 것이 아니라, &lt;b&gt;핵심 기능(MVP)부터 구현 후 확장&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2413&quot; data-start=&quot;2383&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;2515&quot; data-start=&quot;2414&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2471&quot; data-start=&quot;2414&quot;&gt;요구사항을 &lt;b&gt;위키(Notion, Confluence)나 Jira에 기록하여 체계적으로 관리&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2515&quot; data-start=&quot;2472&quot;&gt;코드 리뷰(Code Review) 및 버전 관리(Git)를 철저히 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2544&quot; data-start=&quot;2517&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;2672&quot; data-start=&quot;2545&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2630&quot; data-start=&quot;2545&quot;&gt;요구사항 변경 시 &lt;b&gt;MoSCoW 기법(Must-have, Should-have, Could-have, Won&amp;rsquo;t-have)으로 우선순위 결정&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2672&quot; data-start=&quot;2631&quot;&gt;&lt;b&gt;벨로시티(Velocity) 기반 예측&lt;/b&gt;으로 현실적인 일정 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2720&quot; data-start=&quot;2674&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 팀워크 강화를 위한 정기적인 회고(Retrospective) 수행&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2794&quot; data-start=&quot;2721&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2761&quot; data-start=&quot;2721&quot;&gt;스프린트가 끝날 때마다 &lt;b&gt;회고 미팅을 진행하여 문제점을 개선&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2794&quot; data-start=&quot;2762&quot;&gt;애자일 원칙을 준수하면서도 팀별 맞춤형 방법론 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2837&quot; data-start=&quot;2796&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 대규모 조직에서는 SAFe(Scaled Agile) 적용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2942&quot; data-start=&quot;2838&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2902&quot; data-start=&quot;2838&quot;&gt;&lt;b&gt;조직 규모가 크면 SAFe(Scaled Agile Framework)를 적용하여 체계적인 애자일 운영&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2942&quot; data-start=&quot;2903&quot;&gt;역할 분담 명확화(PO, SM, 개발팀) 및 표준 프로세스 마련&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2947&quot; data-start=&quot;2944&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2966&quot; data-start=&quot;2949&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3055&quot; data-start=&quot;2968&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;애자일(Agile) 소프트웨어 개발 방법론&lt;/b&gt;은 빠른 피드백과 유연한 변경 대응을 가능하게 하여 &lt;b&gt;고객 만족도와 품질을 높이는 개발 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3174&quot; data-start=&quot;3057&quot; data-ke-size=&quot;size16&quot;&gt;그러나 &lt;b&gt;요구사항 변경에 따른 일정 관리 부담, 문서화 부족, 팀워크 중요성&lt;/b&gt; 등의 단점이 존재하며, 이를 해결하기 위한 &lt;b&gt;체계적인 문서화, 우선순위 설정, 정기적 회고 및 개선 전략이 필요&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;3255&quot; data-start=&quot;3176&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;애자일의 장점과 단점을 명확히 이해하고, 프로젝트 특성에 맞게 애자일을 적절히 적용할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3272&quot; data-start=&quot;3257&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;3429&quot; data-start=&quot;3273&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3322&quot; data-start=&quot;3273&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 빠른 피드백, 높은 고객 만족도, 리스크 감소, 개발팀의 동기 부여&lt;/li&gt;
&lt;li data-end=&quot;3371&quot; data-start=&quot;3323&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 문서화 부족, 일정 관리 어려움, 팀워크 필수, 숙련된 인력 필요&lt;/li&gt;
&lt;li data-end=&quot;3429&quot; data-start=&quot;3372&quot;&gt;&lt;b&gt;실무 적용 방안:&lt;/b&gt; MVP 전략, 문서화 보완, 일정 관리 기법 적용, 정기적인 회고 수행&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/193</guid>
      <comments>https://geonoo.tistory.com/193#entry193comment</comments>
      <pubDate>Tue, 1 Apr 2025 09:18:56 +0900</pubDate>
    </item>
    <item>
      <title>  「행정기관 및 공공기관의 클라우드 컴퓨팅 서비스 이용 기준 및 안전성 확보 등에 관한 고시」의 서비스 운영 분야 안전성 검토 항목</title>
      <link>https://geonoo.tistory.com/192</link>
      <description>&lt;h2 data-end=&quot;268&quot; data-start=&quot;252&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;458&quot; data-start=&quot;270&quot; data-ke-size=&quot;size16&quot;&gt;공공기관에서 클라우드 서비스를 이용할 때는 &lt;b&gt;보안성, 안정성, 법적 요구사항 준수&lt;/b&gt;가 필수적입니다. 이를 위해 행정안전부는 **「행정기관 및 공공기관의 클라우드 컴퓨팅 서비스 이용 기준 및 안전성 확보 등에 관한 고시」**를 제정하여, 공공기관이 클라우드 서비스를 도입하고 운영할 때 준수해야 할 기준을 명확히 제시하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;539&quot; data-start=&quot;460&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;해당 고시에서 제시하는 '서비스 운영' 분야의 안전성 검토 항목&lt;/b&gt;을 상세히 분석하고, 실무 적용 방안을 정리하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;544&quot; data-start=&quot;541&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;563&quot; data-start=&quot;546&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;610&quot; data-start=&quot;565&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 공공 클라우드 이용을 위한 주요 안전성 검토 기준&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;675&quot; data-start=&quot;612&quot; data-ke-size=&quot;size16&quot;&gt;공공기관이 클라우드 서비스를 안전하게 운영하기 위해 &lt;b&gt;고시에서 명시한 주요 검토 항목&lt;/b&gt;은 다음과 같습니다.&lt;/p&gt;
&lt;hr data-end=&quot;680&quot; data-start=&quot;677&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;718&quot; data-start=&quot;682&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 서비스 운영 분야 안전성 검토 항목&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;904&quot; data-start=&quot;720&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1️⃣ 서비스 가용성 확보&lt;/b&gt;&lt;br /&gt;✅ 클라우드 서비스의 **가용성(Availability)**을 보장하기 위한 설계 및 운영 여부&lt;br /&gt;✅ 장애 발생 시 &lt;b&gt;자동 복구(Auto Recovery) 및 이중화(Failover) 여부&lt;/b&gt;&lt;br /&gt;✅ 서비스 장애 시 &lt;b&gt;RTO(목표 복구 시간), RPO(목표 복구 시점) 충족 여부&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1083&quot; data-start=&quot;906&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2️⃣ 성능 및 확장성(Scalability) 관리&lt;/b&gt;&lt;br /&gt;✅ 서비스 증가 시 &lt;b&gt;유연한 확장(Elastic Scaling) 가능 여부&lt;/b&gt;&lt;br /&gt;✅ 트래픽 증가 대응을 위한 &lt;b&gt;로드 밸런싱(Load Balancing) 적용 여부&lt;/b&gt;&lt;br /&gt;✅ 성능 최적화를 위한 &lt;b&gt;자동 확장(Auto Scaling) 설정 여부&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1253&quot; data-start=&quot;1085&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3️⃣ 서비스 모니터링 및 운영 관리&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;클라우드 서비스의 상태 모니터링(Log &amp;amp; Metric 수집) 지원 여부&lt;/b&gt;&lt;br /&gt;✅ 장애 탐지 및 조기 경보(알림) 기능 제공 여부&lt;br /&gt;✅ 장애 발생 시 신속한 대응을 위한 &lt;b&gt;SLA(Service Level Agreement) 준수 여부&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1427&quot; data-start=&quot;1255&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4️⃣ 데이터 백업 및 복구(Backup &amp;amp; Recovery) 관리&lt;/b&gt;&lt;br /&gt;✅ 정기적인 &lt;b&gt;데이터 백업 및 복구 절차 수립&lt;/b&gt; 여부&lt;br /&gt;✅ 장애 또는 재해 발생 시 &lt;b&gt;데이터 복구 프로세스&lt;/b&gt; 검토&lt;br /&gt;✅ 공공기관에서 요구하는 &lt;b&gt;재해 복구 계획(Disaster Recovery, DR) 수립 여부&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1592&quot; data-start=&quot;1429&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5️⃣ 서비스 종료 및 이전 계획&lt;/b&gt;&lt;br /&gt;✅ 클라우드 서비스 계약 종료 시 &lt;b&gt;데이터 이전(Migration) 절차 마련&lt;/b&gt;&lt;br /&gt;✅ 타 클라우드 서비스로 이전할 수 있는 &lt;b&gt;포터블리티(Portability) 보장 여부&lt;/b&gt;&lt;br /&gt;✅ 데이터 소유권 및 삭제 절차 검토(완전 삭제 여부 포함)&lt;/p&gt;
&lt;p data-end=&quot;1742&quot; data-start=&quot;1594&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6️⃣ 보안 및 접근 통제(Security &amp;amp; Access Control)&lt;/b&gt;&lt;br /&gt;✅ 서비스 운영 시 &lt;b&gt;관리자 및 사용자 접근 제어 정책 적용&lt;/b&gt;&lt;br /&gt;✅ 권한 관리 및 감사 로그(Audit Log) 저장 여부&lt;br /&gt;✅ 클라우드 보안 인증(CSAP) 준수 여부&lt;/p&gt;
&lt;p data-end=&quot;1891&quot; data-start=&quot;1744&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7️⃣ 법적&amp;middot;규제 준수(Compliance) 사항 확인&lt;/b&gt;&lt;br /&gt;✅ 공공기관이 요구하는 &lt;b&gt;법적 준수 사항(개인정보 보호법, 정보보호 관리체계(ISMS-P) 등) 충족 여부&lt;/b&gt;&lt;br /&gt;✅ 데이터 주권(Data Sovereignty) 및 국내 데이터센터 이용 여부&lt;/p&gt;
&lt;hr data-end=&quot;1896&quot; data-start=&quot;1893&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1923&quot; data-start=&quot;1898&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 실무 적용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1954&quot; data-start=&quot;1925&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;2065&quot; data-start=&quot;1955&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2000&quot; data-start=&quot;1955&quot;&gt;공공기관별 IT 자산 및 보안 요구사항을 고려한 클라우드 보안성 평가 수행&lt;/li&gt;
&lt;li data-end=&quot;2065&quot; data-start=&quot;2001&quot;&gt;클라우드 사업자가 CSAP(Cloud Security Assurance Program) 인증을 받았는지 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2096&quot; data-start=&quot;2067&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;2188&quot; data-start=&quot;2097&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2134&quot; data-start=&quot;2097&quot;&gt;SLA 기반의 &lt;b&gt;가용성 99.9% 이상 보장 여부&lt;/b&gt; 확인&lt;/li&gt;
&lt;li data-end=&quot;2188&quot; data-start=&quot;2135&quot;&gt;&lt;b&gt;Auto Scaling 및 부하 분산(Load Balancing) 적용 여부&lt;/b&gt; 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2217&quot; data-start=&quot;2190&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;2305&quot; data-start=&quot;2218&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2259&quot; data-start=&quot;2218&quot;&gt;데이터 유실 방지를 위해 &lt;b&gt;주기적인 백업 및 복구 테스트 진행&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2305&quot; data-start=&quot;2260&quot;&gt;서비스 장애 시 &lt;b&gt;신속한 복구를 위한 DR(재해 복구) 프로세스 운영&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2330&quot; data-start=&quot;2307&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;2422&quot; data-start=&quot;2331&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2376&quot; data-start=&quot;2331&quot;&gt;공공기관의 &lt;b&gt;보안 규정 준수(개인정보 보호, 클라우드 보안 인증 등)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2422&quot; data-start=&quot;2377&quot;&gt;클라우드 사업자의 &lt;b&gt;보안성 평가 및 침해 대응 시스템 구축 여부 검토&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2451&quot; data-start=&quot;2424&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;2556&quot; data-start=&quot;2452&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2500&quot; data-start=&quot;2452&quot;&gt;클라우드 계약 종료 시 &lt;b&gt;데이터 마이그레이션(Migration) 전략 수립&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2556&quot; data-start=&quot;2501&quot;&gt;벤더 종속성(Lock-in) 최소화를 위한 &lt;b&gt;멀티 클라우드 및 하이브리드 클라우드 고려&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2561&quot; data-start=&quot;2558&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2580&quot; data-start=&quot;2563&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2733&quot; data-start=&quot;2582&quot; data-ke-size=&quot;size16&quot;&gt;**「행정기관 및 공공기관의 클라우드 컴퓨팅 서비스 이용 기준 및 안전성 확보 등에 관한 고시」**는 &lt;b&gt;공공기관이 안전하고 효율적으로 클라우드 서비스를 운영할 수 있도록 서비스 가용성, 데이터 보호, 보안성, 규제 준수 등 다양한 검토 항목을 포함하고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2846&quot; data-start=&quot;2735&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서, &lt;b&gt;공공기관 클라우드 도입 시 반드시 검토해야 할 운영 안전성 항목을 이해하고, 실무 적용을 위한 최적의 클라우드 아키텍처 및 보안 전략을 제안할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2863&quot; data-start=&quot;2848&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;3035&quot; data-start=&quot;2864&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2928&quot; data-start=&quot;2864&quot;&gt;&lt;b&gt;서비스 운영 안전성 검토 항목:&lt;/b&gt; 가용성, 성능 최적화, 모니터링, 데이터 백업, 서비스 종료 계획 등&lt;/li&gt;
&lt;li data-end=&quot;2985&quot; data-start=&quot;2929&quot;&gt;&lt;b&gt;실무 적용 방안:&lt;/b&gt; 공공기관 보안성 평가 수행, 데이터 보호 강화, 클라우드 운영 최적화&lt;/li&gt;
&lt;li data-end=&quot;3035&quot; data-start=&quot;2986&quot;&gt;&lt;b&gt;규제 준수:&lt;/b&gt; 개인정보 보호, 보안 인증(CSAP), SLA 보장 여부 검토&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/192</guid>
      <comments>https://geonoo.tistory.com/192#entry192comment</comments>
      <pubDate>Tue, 1 Apr 2025 08:54:48 +0900</pubDate>
    </item>
    <item>
      <title>  플랫폼 엔지니어링(Platform Engineering)</title>
      <link>https://geonoo.tistory.com/191</link>
      <description>&lt;h2 data-end=&quot;191&quot; data-start=&quot;175&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;328&quot; data-start=&quot;193&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 환경이 확산되고, 개발&amp;middot;운영팀(DevOps)이 복잡해지면서, &lt;b&gt;개발자들이 효율적으로 애플리케이션을 배포&amp;middot;운영할 수 있도록 지원하는 &quot;플랫폼 엔지니어링(Platform Engineering)&quot;이 중요한 역할을 하게 되었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;482&quot; data-start=&quot;330&quot; data-ke-size=&quot;size16&quot;&gt;기업들은 기존의 DevOps 방식에서 &lt;b&gt;각 개발팀이 개별적으로 인프라를 구성하고 운영하는 비효율적인 문제&lt;/b&gt;를 겪고 있으며, 이를 해결하기 위해 **개발자 중심의 내부 개발 플랫폼(IDP, Internal Developer Platform)**을 구축하는 추세입니다.&lt;/p&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;484&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;플랫폼 엔지니어링의 개념, 필요성, 핵심 구성 요소, 실무 적용 방안&lt;/b&gt;을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;551&quot; data-start=&quot;548&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;570&quot; data-start=&quot;553&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;625&quot; data-start=&quot;572&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 플랫폼 엔지니어링(Platform Engineering)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;627&quot; data-ke-size=&quot;size16&quot;&gt;**플랫폼 엔지니어링(Platform Engineering)**은 &lt;b&gt;소프트웨어 개발자들이 애플리케이션을 더 빠르고 안정적으로 개발&amp;middot;배포&amp;middot;운영할 수 있도록 지원하는 내부 플랫폼을 설계, 구축 및 운영하는 엔지니어링 분야&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;774&quot; data-start=&quot;759&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;991&quot; data-start=&quot;775&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;850&quot; data-start=&quot;775&quot;&gt;&lt;b&gt;개발자의 경험(Developer Experience, DX) 향상&lt;/b&gt; &amp;rarr; 개발자가 인프라 설정 없이 코딩과 배포에 집중 가능&lt;/li&gt;
&lt;li data-end=&quot;929&quot; data-start=&quot;851&quot;&gt;&lt;b&gt;내부 개발 플랫폼(IDP, Internal Developer Platform) 구축&lt;/b&gt; &amp;rarr; 개발&amp;middot;배포 자동화 및 일관된 환경 제공&lt;/li&gt;
&lt;li data-end=&quot;991&quot; data-start=&quot;930&quot;&gt;&lt;b&gt;DevOps, SRE(Site Reliability Engineering) 개념을 발전시킨 형태&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;996&quot; data-start=&quot;993&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1037&quot; data-start=&quot;998&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 플랫폼 엔지니어링의 필요성 및 기대 효과&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1039&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;1167&quot; data-start=&quot;1061&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1105&quot; data-start=&quot;1061&quot;&gt;&lt;b&gt;인프라 구성 부담 감소&lt;/b&gt; &amp;rarr; 개발자는 코드 작성과 기능 개발에 집중&lt;/li&gt;
&lt;li data-end=&quot;1167&quot; data-start=&quot;1106&quot;&gt;&lt;b&gt;반복적인 수작업 제거&lt;/b&gt; &amp;rarr; IaC(Infrastructure as Code) 및 자동화 도구 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1194&quot; data-start=&quot;1169&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;1285&quot; data-start=&quot;1195&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1245&quot; data-start=&quot;1195&quot;&gt;&lt;b&gt;플랫폼 내에서 보안 및 운영 정책 자동 적용&lt;/b&gt; &amp;rarr; 일관된 개발&amp;middot;배포 환경 유지&lt;/li&gt;
&lt;li data-end=&quot;1285&quot; data-start=&quot;1246&quot;&gt;&lt;b&gt;모든 팀이 공통된 인프라 스택 활용&lt;/b&gt; &amp;rarr; 운영 복잡성 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1318&quot; data-start=&quot;1287&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ DevOps 확장 및 효율적 관리 가능&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1447&quot; data-start=&quot;1319&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1386&quot; data-start=&quot;1319&quot;&gt;기존 &lt;b&gt;DevOps가 팀별 운영 모델&lt;/b&gt;이라면, &lt;b&gt;플랫폼 엔지니어링은 전체 조직 차원의 DevOps 최적화&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1447&quot; data-start=&quot;1387&quot;&gt;&lt;b&gt;개발자가 직접 Kubernetes, CI/CD 등을 설정하지 않고도 표준화된 플랫폼 제공 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1474&quot; data-start=&quot;1449&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;1576&quot; data-start=&quot;1475&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1514&quot; data-start=&quot;1475&quot;&gt;&lt;b&gt;GitOps, CI/CD 자동화 적용&lt;/b&gt; &amp;rarr; 배포 속도 증가&lt;/li&gt;
&lt;li data-end=&quot;1576&quot; data-start=&quot;1515&quot;&gt;&lt;b&gt;기능 플래그(Feature Flags) 및 Canary Deployment&lt;/b&gt; 활용 &amp;rarr; 안전한 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1581&quot; data-start=&quot;1578&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1620&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.3 플랫폼 엔지니어링의 주요 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1675&quot; data-start=&quot;1622&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 내부 개발 플랫폼(IDP, Internal Developer Platform)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1770&quot; data-start=&quot;1676&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1728&quot; data-start=&quot;1676&quot;&gt;&lt;b&gt;개발자가 직접 인프라를 설정하지 않고도 필요한 환경을 제공하는 셀프서비스 플랫폼&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1770&quot; data-start=&quot;1729&quot;&gt;예: &lt;b&gt;Spotify Backstage, Humanitec&lt;/b&gt; 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1818&quot; data-start=&quot;1772&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 인프라 자동화(Infrastructure as Code, IaC)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1873&quot; data-start=&quot;1819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1873&quot; data-start=&quot;1819&quot;&gt;Terraform, Pulumi, AWS CDK 등 코드 기반으로 인프라를 자동 생성&amp;middot;관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1903&quot; data-start=&quot;1875&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 지속적 통합 및 배포(CI/CD)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2006&quot; data-start=&quot;1904&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1946&quot; data-start=&quot;1904&quot;&gt;&lt;b&gt;GitOps 방식의 배포 자동화&lt;/b&gt; (ArgoCD, Flux 등)&lt;/li&gt;
&lt;li data-end=&quot;2006&quot; data-start=&quot;1947&quot;&gt;&lt;b&gt;CI/CD 파이프라인 구축&lt;/b&gt; (Jenkins, GitHub Actions, GitLab CI)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2043&quot; data-start=&quot;2008&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ Kubernetes 및 컨테이너 오케스트레이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2160&quot; data-start=&quot;2044&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2115&quot; data-start=&quot;2044&quot;&gt;개발자가 Kubernetes 복잡성을 직접 다루지 않고도 애플리케이션을 배포할 수 있도록 &lt;b&gt;추상화된 관리 도구 제공&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2160&quot; data-start=&quot;2116&quot;&gt;예: &lt;b&gt;Crossplane, KubeVirt, OpenShift&lt;/b&gt; 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2200&quot; data-start=&quot;2162&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 모니터링 및 관측 가능성(Observability)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2280&quot; data-start=&quot;2201&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2236&quot; data-start=&quot;2201&quot;&gt;&lt;b&gt;로그, 메트릭, 트레이싱&lt;/b&gt;을 통한 운영 안정성 확보&lt;/li&gt;
&lt;li data-end=&quot;2280&quot; data-start=&quot;2237&quot;&gt;예: Prometheus, Grafana, OpenTelemetry 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2325&quot; data-start=&quot;2282&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑥ 보안 및 정책 관리(Security &amp;amp; Compliance)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2436&quot; data-start=&quot;2326&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2390&quot; data-start=&quot;2326&quot;&gt;&lt;b&gt;RBAC(Role-Based Access Control), 서비스 메시(SM) 기반의 보안 정책 적용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2436&quot; data-start=&quot;2391&quot;&gt;예: Istio, Linkerd, OPA(Open Policy Agent)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2441&quot; data-start=&quot;2438&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2476&quot; data-start=&quot;2443&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.4 실무 적용 사례 및 도입 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2511&quot; data-start=&quot;2478&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 글로벌 기업의 플랫폼 엔지니어링 적용 사례&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;기업플랫폼 엔지니어링 도입 내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2793&quot; data-start=&quot;2513&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2793&quot; data-start=&quot;2591&quot;&gt;
&lt;tr data-end=&quot;2640&quot; data-start=&quot;2591&quot;&gt;
&lt;td&gt;&lt;b&gt;Netflix&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Spinnaker 기반의 &lt;b&gt;배포 자동화 플랫폼 구축&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2690&quot; data-start=&quot;2641&quot;&gt;
&lt;td&gt;&lt;b&gt;Spotify&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Backstage&lt;/b&gt;를 이용한 내부 개발 플랫폼 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2742&quot; data-start=&quot;2691&quot;&gt;
&lt;td&gt;&lt;b&gt;Google&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes 기반 &lt;b&gt;GKE Autopilot&lt;/b&gt; 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2793&quot; data-start=&quot;2743&quot;&gt;
&lt;td&gt;&lt;b&gt;Airbnb&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;DevOps를 플랫폼 엔지니어링으로 확장, CI/CD 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2825&quot; data-start=&quot;2795&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 기업 내 플랫폼 엔지니어링 도입 단계&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3053&quot; data-start=&quot;2827&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;현재 개발&amp;middot;운영 프로세스 분석&lt;/b&gt; &amp;rarr; 어떤 부분이 비효율적인지 진단&lt;br /&gt;2️⃣ &lt;b&gt;IDP(내부 개발 플랫폼) 구축&lt;/b&gt; &amp;rarr; 공통된 배포 및 운영 환경 제공&lt;br /&gt;3️⃣ &lt;b&gt;CI/CD 자동화 도입&lt;/b&gt; &amp;rarr; 배포 속도 향상, GitOps 적용&lt;br /&gt;4️⃣ &lt;b&gt;Kubernetes 및 클라우드 네이티브 최적화&lt;/b&gt; &amp;rarr; 인프라 운영 간소화&lt;br /&gt;5️⃣ &lt;b&gt;보안 및 정책 자동화&lt;/b&gt; &amp;rarr; 운영 안정성과 보안 강화&lt;/p&gt;
&lt;hr data-end=&quot;3058&quot; data-start=&quot;3055&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3101&quot; data-start=&quot;3060&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.5 플랫폼 엔지니어링의 미래 전망 및 발전 방향&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3129&quot; data-start=&quot;3103&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① AI 기반 자동화 플랫폼 확산&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3214&quot; data-start=&quot;3130&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3169&quot; data-start=&quot;3130&quot;&gt;AI Ops(AIOps) 및 ML 기반 인프라 최적화 기술 등장&lt;/li&gt;
&lt;li data-end=&quot;3214&quot; data-start=&quot;3170&quot;&gt;예: &lt;b&gt;Google Vertex AI, AWS DevOps Guru&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3246&quot; data-start=&quot;3216&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 플랫폼 엔지니어링과 FinOps 결합&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3311&quot; data-start=&quot;3247&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3311&quot; data-start=&quot;3247&quot;&gt;클라우드 비용 최적화까지 고려하는 &lt;b&gt;FinOps(Cloud Financial Management) 통합&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3340&quot; data-start=&quot;3313&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 개발자 경험(DX) 최적화 강화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3391&quot; data-start=&quot;3341&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3391&quot; data-start=&quot;3341&quot;&gt;개발자가 &lt;b&gt;인프라 구성 없이 애플리케이션 배포 가능하도록 셀프서비스 기능&lt;/b&gt; 확대&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3426&quot; data-start=&quot;3393&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;3492&quot; data-start=&quot;3427&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3492&quot; data-start=&quot;3427&quot;&gt;Kubernetes 기반으로 AWS, Azure, Google Cloud 등 다양한 클라우드 환경을 통합 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3497&quot; data-start=&quot;3494&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3516&quot; data-start=&quot;3499&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3614&quot; data-start=&quot;3518&quot; data-ke-size=&quot;size16&quot;&gt;**플랫폼 엔지니어링(Platform Engineering)**은 &lt;b&gt;개발자의 생산성을 높이고, 배포&amp;middot;운영을 효율화하는 내부 개발 플랫폼을 구축&amp;middot;운영하는 개념&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3733&quot; data-start=&quot;3616&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서 &lt;b&gt;플랫폼 엔지니어링의 역할, 주요 기술, 도입 전략&lt;/b&gt;을 이해하고, &lt;b&gt;기업이 DevOps에서 플랫폼 엔지니어링으로 전환하는 과정에서 최적의 솔루션을 제안할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3750&quot; data-start=&quot;3735&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;3999&quot; data-start=&quot;3751&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3807&quot; data-start=&quot;3751&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 개발자가 코드 작성과 배포에만 집중할 수 있도록 내부 개발 플랫폼(IDP) 제공&lt;/li&gt;
&lt;li data-end=&quot;3854&quot; data-start=&quot;3808&quot;&gt;&lt;b&gt;필요성:&lt;/b&gt; 인프라 관리 부담 감소, 배포 속도 증가, 운영 안정성 강화&lt;/li&gt;
&lt;li data-end=&quot;3933&quot; data-start=&quot;3855&quot;&gt;&lt;b&gt;주요 기술:&lt;/b&gt; IaC(Terraform), CI/CD(GitOps, ArgoCD), Kubernetes 자동화, 보안 정책 관리&lt;/li&gt;
&lt;li data-end=&quot;3999&quot; data-start=&quot;3934&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 글로벌 기업 사례 분석(Netflix, Spotify, Google) 및 단계적 도입 전략&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/191</guid>
      <comments>https://geonoo.tistory.com/191#entry191comment</comments>
      <pubDate>Mon, 31 Mar 2025 11:43:24 +0900</pubDate>
    </item>
    <item>
      <title>  신경망 처리장치(NPU: Neural Processing Unit)</title>
      <link>https://geonoo.tistory.com/190</link>
      <description>&lt;h2 data-end=&quot;196&quot; data-start=&quot;180&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;198&quot; data-ke-size=&quot;size16&quot;&gt;인공지능(AI) 기술의 발전과 함께 &lt;b&gt;머신러닝(ML) 및 딥러닝(Deep Learning)&lt;/b&gt; 연산을 고속 처리할 수 있는 &lt;b&gt;전용 하드웨어 가속기&lt;/b&gt;의 필요성이 증가하였습니다. 기존의 CPU(중앙처리장치)나 GPU(그래픽처리장치) 기반의 AI 연산은 전력 소모가 크고, 최적화된 연산이 어려웠습니다.&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;371&quot; data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 **AI 연산을 전담하는 NPU(Neural Processing Unit, 신경망 처리장치)**가 등장하였으며, &lt;b&gt;고속 병렬 연산 및 최적화된 AI 워크로드 처리&lt;/b&gt;를 지원합니다.&lt;/p&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;487&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;NPU의 개념, 특징, 기존 프로세서와의 비교, 실무 적용 방안&lt;/b&gt;을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;551&quot; data-start=&quot;548&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;570&quot; data-start=&quot;553&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;621&quot; data-start=&quot;572&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 NPU(Neural Processing Unit)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;752&quot; data-start=&quot;623&quot; data-ke-size=&quot;size16&quot;&gt;**NPU(Neural Processing Unit, 신경망 처리장치)**란, &lt;b&gt;인공신경망(ANN, Artificial Neural Network) 연산을 최적화하여 병렬 연산 및 고속 처리를 수행하는 전용 프로세서&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;769&quot; data-start=&quot;754&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;983&quot; data-start=&quot;770&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;851&quot; data-start=&quot;770&quot;&gt;&lt;b&gt;AI, 딥러닝 연산 특화 하드웨어&lt;/b&gt; &amp;rarr; 뉴런 연산, 행렬 곱셈(Matrix Multiplication), 활성화 함수 연산 등 최적화&lt;/li&gt;
&lt;li data-end=&quot;931&quot; data-start=&quot;852&quot;&gt;&lt;b&gt;고속 병렬 연산 지원&lt;/b&gt; &amp;rarr; &lt;b&gt;다수의 코어 및 SIMD(Single Instruction Multiple Data) 구조&lt;/b&gt; 활용&lt;/li&gt;
&lt;li data-end=&quot;983&quot; data-start=&quot;932&quot;&gt;&lt;b&gt;낮은 전력 소모&lt;/b&gt; &amp;rarr; 기존 &lt;b&gt;CPU/GPU 대비 에너지 효율적인 연산 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;988&quot; data-start=&quot;985&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1017&quot; data-start=&quot;990&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 NPU의 주요 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1041&quot; data-start=&quot;1019&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;1188&quot; data-start=&quot;1042&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;1042&quot;&gt;딥러닝 연산에서 필수적인 **행렬 연산(Matrix Multiplication)**을 병렬 처리&lt;/li&gt;
&lt;li data-end=&quot;1188&quot; data-start=&quot;1100&quot;&gt;&lt;b&gt;CNN(Convolutional Neural Network), RNN(Recurrent Neural Network)&lt;/b&gt; 등 다양한 신경망 모델 가속&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1218&quot; data-start=&quot;1190&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;1325&quot; data-start=&quot;1219&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1285&quot; data-start=&quot;1219&quot;&gt;&lt;b&gt;온칩 메모리&lt;/b&gt; 및 &lt;b&gt;최적화된 데이터 버스 구조&lt;/b&gt; 적용 &amp;rarr; 메모리 대역폭(Bandwidth) 활용 극대화&lt;/li&gt;
&lt;li data-end=&quot;1325&quot; data-start=&quot;1286&quot;&gt;&lt;b&gt;DRAM 접근 최소화&lt;/b&gt; &amp;rarr; 지연 시간(Latency) 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1347&quot; data-start=&quot;1327&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;1470&quot; data-start=&quot;1348&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1399&quot; data-start=&quot;1348&quot;&gt;&lt;b&gt;정수 연산(INT8, INT16), 부동소수점 연산(FP16, FP32)&lt;/b&gt; 지원&lt;/li&gt;
&lt;li data-end=&quot;1470&quot; data-start=&quot;1400&quot;&gt;&lt;b&gt;전용 연산 엔진(MAC: Multiply-Accumulate Unit)&lt;/b&gt; 활용 &amp;rarr; CNN 필터 연산 등 고속 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1503&quot; data-start=&quot;1472&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;1563&quot; data-start=&quot;1504&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1563&quot; data-start=&quot;1504&quot;&gt;모바일&amp;middot;임베디드 환경에서도 &lt;b&gt;AI 연산 가능&lt;/b&gt; &amp;rarr; 스마트폰, IoT 디바이스, 엣지 컴퓨팅 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1568&quot; data-start=&quot;1565&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1611&quot; data-start=&quot;1570&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 기존 프로세서(CPU/GPU)와의 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;구분CPU(중앙처리장치)GPU(그래픽처리장치)NPU(신경망처리장치)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2007&quot; data-start=&quot;1613&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2007&quot; data-start=&quot;1742&quot;&gt;
&lt;tr data-end=&quot;1804&quot; data-start=&quot;1742&quot;&gt;
&lt;td&gt;&lt;b&gt;연산 구조&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;직렬(Serial) 처리&lt;/td&gt;
&lt;td&gt;병렬(Parallel) 처리&lt;/td&gt;
&lt;td&gt;AI 최적화 병렬 연산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1852&quot; data-start=&quot;1805&quot;&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;b&gt;최고 속도 (AI 연산 최적화)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1891&quot; data-start=&quot;1853&quot;&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;b&gt;낮음 (고효율)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1950&quot; data-start=&quot;1892&quot;&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;b&gt;AI, 딥러닝, 머신러닝 연산&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2007&quot; data-start=&quot;1951&quot;&gt;
&lt;td&gt;&lt;b&gt;AI 연산 최적화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;미흡&lt;/td&gt;
&lt;td&gt;가능하지만 최적화 부족&lt;/td&gt;
&lt;td&gt;&lt;b&gt;전용 하드웨어로 최적화&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2021&quot; data-start=&quot;2009&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;2153&quot; data-start=&quot;2022&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2060&quot; data-start=&quot;2022&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;는 범용적인 역할 수행 &amp;rarr; AI 연산 속도가 느림&lt;/li&gt;
&lt;li data-end=&quot;2108&quot; data-start=&quot;2061&quot;&gt;&lt;b&gt;GPU&lt;/b&gt;는 병렬 연산을 수행하지만, 전력 소모 및 AI 연산 최적화 부족&lt;/li&gt;
&lt;li data-end=&quot;2153&quot; data-start=&quot;2109&quot;&gt;&lt;b&gt;NPU는 AI 연산에 최적화되어 성능과 전력 효율성에서 가장 우수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2158&quot; data-start=&quot;2155&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2191&quot; data-start=&quot;2160&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 NPU의 실무 적용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2216&quot; data-start=&quot;2193&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 스마트폰 및 모바일 AI&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2368&quot; data-start=&quot;2217&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2303&quot; data-start=&quot;2217&quot;&gt;&lt;b&gt;Apple Neural Engine(A15, M1)&lt;/b&gt;, &lt;b&gt;Samsung Exynos NPU&lt;/b&gt;, &lt;b&gt;Qualcomm Hexagon DSP&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2368&quot; data-start=&quot;2304&quot;&gt;카메라 이미지 처리(AI 필터, 인물 모드), 음성 인식(Siri, Google Assistant) 등 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2392&quot; data-start=&quot;2370&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 엣지 컴퓨팅 및 IoT&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2499&quot; data-start=&quot;2393&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2446&quot; data-start=&quot;2393&quot;&gt;&lt;b&gt;Nvidia Jetson, Google Coral Edge TPU&lt;/b&gt; 등 AI 가속기&lt;/li&gt;
&lt;li data-end=&quot;2499&quot; data-start=&quot;2447&quot;&gt;스마트 홈, 자율주행 드론, AIoT(인공지능 사물인터넷) 디바이스에서 AI 연산 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2519&quot; data-start=&quot;2501&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;2600&quot; data-start=&quot;2520&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2563&quot; data-start=&quot;2520&quot;&gt;&lt;b&gt;Tesla FSD Chip&lt;/b&gt;, &lt;b&gt;Nvidia Orin NPU&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2600&quot; data-start=&quot;2564&quot;&gt;객체 인식, 경로 예측, 실시간 영상 분석을 고속으로 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2627&quot; data-start=&quot;2602&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 데이터센터 및 클라우드 AI&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2750&quot; data-start=&quot;2628&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2712&quot; data-start=&quot;2628&quot;&gt;&lt;b&gt;Google TPU(Tensor Processing Unit)&lt;/b&gt;, &lt;b&gt;Amazon Inferentia&lt;/b&gt;, &lt;b&gt;Huawei Ascend&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2750&quot; data-start=&quot;2713&quot;&gt;AI 학습(Training), 추론(Inference) 가속&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2755&quot; data-start=&quot;2752&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2792&quot; data-start=&quot;2757&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.5 NPU의 발전 방향 및 미래 전망&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2821&quot; data-start=&quot;2794&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 차세대 AI 가속 기술과의 결합&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2946&quot; data-start=&quot;2822&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2886&quot; data-start=&quot;2822&quot;&gt;&lt;b&gt;뉴로모픽 컴퓨팅(Neuromorphic Computing)&lt;/b&gt; &amp;rarr; 인간 뇌 신경망 모방한 차세대 AI 칩&lt;/li&gt;
&lt;li data-end=&quot;2946&quot; data-start=&quot;2887&quot;&gt;&lt;b&gt;광학 NPU(Optical Neural Processor)&lt;/b&gt; &amp;rarr; 빛을 이용한 초고속 AI 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2976&quot; data-start=&quot;2948&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 고성능&amp;middot;저전력 NPU 개발 가속화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3067&quot; data-start=&quot;2977&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3031&quot; data-start=&quot;2977&quot;&gt;&lt;b&gt;3D TSV(Through Silicon Via) 기술&lt;/b&gt; 적용 &amp;rarr; 메모리 대역폭 증가&lt;/li&gt;
&lt;li data-end=&quot;3067&quot; data-start=&quot;3032&quot;&gt;&lt;b&gt;AI 전용 RISC-V 기반 NPU 아키텍처 개발&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3106&quot; data-start=&quot;3069&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ AI SoC(System on Chip)와의 통합&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3156&quot; data-start=&quot;3107&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3156&quot; data-start=&quot;3107&quot;&gt;CPU, GPU, DSP, NPU를 &lt;b&gt;하나의 칩에 통합&lt;/b&gt; &amp;rarr; AI 성능 극대화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3182&quot; data-start=&quot;3158&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 오픈소스 NPU 개발 확대&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3315&quot; data-start=&quot;3183&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3286&quot; data-start=&quot;3183&quot;&gt;&lt;b&gt;Open Neural Network Exchange(ONNX), MLIR(Multi-Level Intermediate Representation) 등 AI 프레임워크 지원&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3315&quot; data-start=&quot;3287&quot;&gt;&lt;b&gt;기업 맞춤형 AI 프로세서 설계 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3320&quot; data-start=&quot;3317&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3339&quot; data-start=&quot;3322&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3451&quot; data-start=&quot;3341&quot; data-ke-size=&quot;size16&quot;&gt;**NPU(Neural Processing Unit)**는 &lt;b&gt;AI 및 딥러닝 연산을 최적화하여, CPU/GPU 대비 빠른 속도와 낮은 전력 소비로 AI 연산을 수행하는 전용 하드웨어&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3559&quot; data-start=&quot;3453&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서 &lt;b&gt;NPU의 구조, CPU/GPU와의 차이, 실무 적용 사례, 미래 발전 방향&lt;/b&gt;을 이해하고, &lt;b&gt;산업별 최적의 AI 가속 솔루션을 제안할 수 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3576&quot; data-start=&quot;3561&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;3764&quot; data-start=&quot;3577&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3612&quot; data-start=&quot;3577&quot;&gt;&lt;b&gt;NPU 정의:&lt;/b&gt; AI, 신경망 연산 최적화 하드웨어&lt;/li&gt;
&lt;li data-end=&quot;3663&quot; data-start=&quot;3613&quot;&gt;&lt;b&gt;기존 프로세서(CPU/GPU)와 차이점:&lt;/b&gt; AI 연산 성능 &amp;uarr;, 전력 소모 &amp;darr;&lt;/li&gt;
&lt;li data-end=&quot;3710&quot; data-start=&quot;3664&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 스마트폰, 엣지 컴퓨팅, 자율주행, 데이터센터 AI 가속&lt;/li&gt;
&lt;li data-end=&quot;3764&quot; data-start=&quot;3711&quot;&gt;&lt;b&gt;미래 발전 방향:&lt;/b&gt; 뉴로모픽 컴퓨팅, 3D TSV 기반 AI 칩, AI SoC 통합&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/190</guid>
      <comments>https://geonoo.tistory.com/190#entry190comment</comments>
      <pubDate>Mon, 31 Mar 2025 10:44:53 +0900</pubDate>
    </item>
    <item>
      <title>  SBOM(Software Bill of Materials)</title>
      <link>https://geonoo.tistory.com/189</link>
      <description>&lt;h2 data-end=&quot;187&quot; data-start=&quot;171&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;319&quot; data-start=&quot;189&quot; data-ke-size=&quot;size16&quot;&gt;최근 &lt;b&gt;SolarWinds 해킹 사건&lt;/b&gt;이나 &lt;b&gt;Log4j 취약점 사태&lt;/b&gt;와 같은 &lt;b&gt;소프트웨어 공급망 공격&lt;/b&gt;이 증가하면서, 소프트웨어 구성 요소를 투명하게 관리하고 보안 취약점을 신속히 대응할 수 있는 체계가 중요해졌습니다.&lt;/p&gt;
&lt;p data-end=&quot;384&quot; data-start=&quot;321&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위한 핵심 방안이 **SBOM(Software Bill of Materials)**입니다.&lt;/p&gt;
&lt;p data-end=&quot;516&quot; data-start=&quot;386&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SBOM&lt;/b&gt;은 **소프트웨어의 &quot;재료 명세서&quot;**로, 해당 소프트웨어가 **어떤 구성 요소(라이브러리, 모듈, 오픈소스 등)**로 이루어졌는지 목록화하여, &lt;b&gt;보안성, 취약점 관리, 라이선스 검증&lt;/b&gt;을 강화하는 역할을 합니다.&lt;/p&gt;
&lt;p data-end=&quot;572&quot; data-start=&quot;518&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 &lt;b&gt;SBOM의 개념, 구성 요소, 필요성, 실무 적용 방안&lt;/b&gt;을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;577&quot; data-start=&quot;574&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;596&quot; data-start=&quot;579&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;652&quot; data-start=&quot;598&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 SBOM(Software Bill of Materials)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;764&quot; data-start=&quot;654&quot; data-ke-size=&quot;size16&quot;&gt;**SBOM(Software Bill of Materials)**은 **소프트웨어를 구성하는 모든 요소(코드, 라이브러리, 오픈소스, 패키지 등)**를 명세서 형태로 &lt;b&gt;구조화된 문서&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;781&quot; data-start=&quot;766&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;943&quot; data-start=&quot;782&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;839&quot; data-start=&quot;782&quot;&gt;&lt;b&gt;소프트웨어 구성 투명성 제공&lt;/b&gt; &amp;rarr; 어떤 코드, 패키지, 라이브러리가 사용됐는지 명확히 표시&lt;/li&gt;
&lt;li data-end=&quot;896&quot; data-start=&quot;840&quot;&gt;&lt;b&gt;라이선스 및 보안 취약점 관리&lt;/b&gt; &amp;rarr; 오픈소스 라이선스 위반 방지, 취약점 패치 추적 가능&lt;/li&gt;
&lt;li data-end=&quot;943&quot; data-start=&quot;897&quot;&gt;&lt;b&gt;공급망 보안 강화&lt;/b&gt; &amp;rarr; 제3자 라이브러리, 오픈소스 코드의 신뢰성 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;948&quot; data-start=&quot;945&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;981&quot; data-start=&quot;950&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 SBOM의 주요 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1024&quot; data-start=&quot;983&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 구성요소 정보 (Component Information)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1064&quot; data-start=&quot;1025&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1064&quot; data-start=&quot;1025&quot;&gt;&lt;b&gt;소프트웨어 패키지 이름, 버전, 개발자, 출처 정보&lt;/b&gt; 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1105&quot; data-start=&quot;1066&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 라이선스 정보 (License Information)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1149&quot; data-start=&quot;1106&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1149&quot; data-start=&quot;1106&quot;&gt;&lt;b&gt;각 구성요소의 오픈소스/상용 라이선스 명세&lt;/b&gt; &amp;rarr; 저작권 분쟁 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1195&quot; data-start=&quot;1151&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 취약점 정보 (Vulnerability Information)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1246&quot; data-start=&quot;1196&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1246&quot; data-start=&quot;1196&quot;&gt;&lt;b&gt;CVE 번호, 취약점 심각도, 패치 여부&lt;/b&gt; 포함 &amp;rarr; 취약점 추적 및 대응 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1289&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 빌드 정보 (Build &amp;amp; Dependency Data)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1340&quot; data-start=&quot;1290&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1340&quot; data-start=&quot;1290&quot;&gt;&lt;b&gt;빌드 환경, 종속성(Dependency) 정보&lt;/b&gt; &amp;rarr; 패키지 간 연결 구조 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1378&quot; data-start=&quot;1342&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 디지털 서명 (Digital Signature)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1419&quot; data-start=&quot;1379&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1419&quot; data-start=&quot;1379&quot;&gt;&lt;b&gt;코드 진위 검증 및 위변조 방지&lt;/b&gt; &amp;rarr; 공급망 내 신뢰성 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1424&quot; data-start=&quot;1421&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1460&quot; data-start=&quot;1426&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 SBOM의 필요성 및 기대 효과&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1487&quot; data-start=&quot;1462&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;1614&quot; data-start=&quot;1488&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1540&quot; data-start=&quot;1488&quot;&gt;&lt;b&gt;제3자 코드, 오픈소스 라이브러리 투명성 확보&lt;/b&gt; &amp;rarr; 악성 코드, 백도어 사전 차단&lt;/li&gt;
&lt;li data-end=&quot;1614&quot; data-start=&quot;1541&quot;&gt;&lt;b&gt;실제 예제:&lt;/b&gt; SolarWinds 해킹 사건 &amp;rarr; 공격자가 공급망 내부 코드 침투 &amp;rarr; SBOM이 있었다면 조기 탐지 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1638&quot; data-start=&quot;1616&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;1727&quot; data-start=&quot;1639&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1695&quot; data-start=&quot;1639&quot;&gt;&lt;b&gt;Log4j 취약점 사태&lt;/b&gt; &amp;rarr; SBOM 기반으로 사용된 오픈소스 라이브러리 즉시 추적 가능&lt;/li&gt;
&lt;li data-end=&quot;1727&quot; data-start=&quot;1696&quot;&gt;&lt;b&gt;CVE 정보 연동&lt;/b&gt; &amp;rarr; 보안 패치 누락 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1754&quot; data-start=&quot;1729&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;1817&quot; data-start=&quot;1755&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1817&quot; data-start=&quot;1755&quot;&gt;&lt;b&gt;GPL, Apache, MIT 등 오픈소스 라이선스 조건 추적&lt;/b&gt; &amp;rarr; 불법 배포 및 저작권 분쟁 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1838&quot; data-start=&quot;1819&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;1904&quot; data-start=&quot;1839&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1904&quot; data-start=&quot;1839&quot;&gt;&lt;b&gt;SBOM 제공&lt;/b&gt; &amp;rarr; 개발사, 고객 간 소프트웨어 투명성 보장 &amp;rarr; &lt;b&gt;안전한 소프트웨어 공급&lt;/b&gt; 신뢰 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1909&quot; data-start=&quot;1906&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1942&quot; data-start=&quot;1911&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 SBOM 실무 적용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1971&quot; data-start=&quot;1944&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① SBOM 생성 자동화 도구 도입&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2094&quot; data-start=&quot;1972&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2044&quot; data-start=&quot;1972&quot;&gt;&lt;b&gt;CycloneDX, SPDX, Syft, OWASP Dependency-Check&lt;/b&gt; 등 SBOM 자동 생성 도구 적용&lt;/li&gt;
&lt;li data-end=&quot;2094&quot; data-start=&quot;2045&quot;&gt;&lt;b&gt;CI/CD 파이프라인 연동&lt;/b&gt; &amp;rarr; 빌드 시점에 SBOM 자동 생성 및 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2119&quot; data-start=&quot;2096&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;2208&quot; data-start=&quot;2120&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2208&quot; data-start=&quot;2120&quot;&gt;&lt;b&gt;NVD(National Vulnerability Database)&lt;/b&gt;, &lt;b&gt;CVE DB&lt;/b&gt; 연동 &amp;rarr; SBOM 내 라이브러리와 취약점 매칭 자동 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2244&quot; data-start=&quot;2210&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ SBOM 기반 위협 탐지 및 대응 체계 수립&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2346&quot; data-start=&quot;2245&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2297&quot; data-start=&quot;2245&quot;&gt;&lt;b&gt;소프트웨어 업데이트, 패치 관리 자동화&lt;/b&gt; &amp;rarr; SBOM 변경 추적, 패치 누락 방지&lt;/li&gt;
&lt;li data-end=&quot;2346&quot; data-start=&quot;2298&quot;&gt;&lt;b&gt;공급망 보안 평가 체계 강화&lt;/b&gt; &amp;rarr; 제3자 코드/패키지의 신뢰성 검증 필수화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2371&quot; data-start=&quot;2348&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;2495&quot; data-start=&quot;2372&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2445&quot; data-start=&quot;2372&quot;&gt;**미국 행정명령(Executive Order 14028)**에 따라 &lt;b&gt;SBOM 제공 의무화&lt;/b&gt; &amp;rarr; 글로벌 시장 대응 필수&lt;/li&gt;
&lt;li data-end=&quot;2495&quot; data-start=&quot;2446&quot;&gt;&lt;b&gt;EU NIS2 Directive&lt;/b&gt; &amp;rarr; 소프트웨어 공급망 보안 강화 규제 준수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2500&quot; data-start=&quot;2497&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2532&quot; data-start=&quot;2502&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.5 SBOM 실무 사례 분석&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2559&quot; data-start=&quot;2534&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① Log4j 취약점 대응 사례&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2700&quot; data-start=&quot;2560&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2634&quot; data-start=&quot;2560&quot;&gt;&lt;b&gt;2021년 Apache Log4j 원격 코드 실행 취약점(CVE-2021-44228)&lt;/b&gt; 발생 &amp;rarr; 수천 개 기업 긴급 대응&lt;/li&gt;
&lt;li data-end=&quot;2700&quot; data-start=&quot;2635&quot;&gt;&lt;b&gt;SBOM을 사용한 기업&lt;/b&gt;은 &lt;b&gt;자사 시스템에 Log4j 포함 여부 즉시 파악&lt;/b&gt; &amp;rarr; 빠른 패치 적용 성공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2732&quot; data-start=&quot;2702&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② SolarWinds 공급망 해킹 사례&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2878&quot; data-start=&quot;2733&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2784&quot; data-start=&quot;2733&quot;&gt;&lt;b&gt;SolarWinds Orion 플랫폼 코드 변조&lt;/b&gt; &amp;rarr; 1만8천여 개 고객사 감염&lt;/li&gt;
&lt;li data-end=&quot;2819&quot; data-start=&quot;2785&quot;&gt;&lt;b&gt;SBOM 부재&lt;/b&gt;로 인해 악성 코드 침투 감지 지연&lt;/li&gt;
&lt;li data-end=&quot;2878&quot; data-start=&quot;2820&quot;&gt;&lt;b&gt;이후 SolarWinds, Microsoft 등 대기업 SBOM 도입&lt;/b&gt; &amp;rarr; 공급망 보안 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2883&quot; data-start=&quot;2880&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2902&quot; data-start=&quot;2885&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3030&quot; data-start=&quot;2904&quot; data-ke-size=&quot;size16&quot;&gt;**SBOM(Software Bill of Materials)**은 &lt;b&gt;소프트웨어 구성 요소 투명성 확보, 공급망 보안 강화, 취약점 대응 시간 단축, 라이선스 준수 관리&lt;/b&gt;를 실현하는 &lt;b&gt;차세대 필수 보안 전략&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3131&quot; data-start=&quot;3032&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서 &lt;b&gt;SBOM의 구조, 필요성, 실무 적용 방안&lt;/b&gt;을 이해하고, &lt;b&gt;기업의 소프트웨어 공급망 보안 전략 설계 및 관리 체계 수립&lt;/b&gt;을 이끌어야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;3148&quot; data-start=&quot;3133&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;3453&quot; data-start=&quot;3149&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3209&quot; data-start=&quot;3149&quot;&gt;&lt;b&gt;SBOM 정의:&lt;/b&gt; 소프트웨어 구성 요소, 버전, 라이선스, 취약점 정보를 포함한 &quot;재료 명세서&quot;&lt;/li&gt;
&lt;li data-end=&quot;3267&quot; data-start=&quot;3210&quot;&gt;&lt;b&gt;주요 구성 요소:&lt;/b&gt; 패키지 정보, 라이선스 정보, 취약점 정보, 빌드 데이터, 디지털 서명&lt;/li&gt;
&lt;li data-end=&quot;3323&quot; data-start=&quot;3268&quot;&gt;&lt;b&gt;기대 효과:&lt;/b&gt; 공급망 보안 강화, 취약점 대응 시간 단축, 오픈소스 라이선스 준수 관리&lt;/li&gt;
&lt;li data-end=&quot;3391&quot; data-start=&quot;3324&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 자동 생성 도구(CycloneDX, SPDX 등) 도입, 취약점 DB 연동, 패치 자동화 구축&lt;/li&gt;
&lt;li data-end=&quot;3453&quot; data-start=&quot;3392&quot;&gt;&lt;b&gt;실제 사례:&lt;/b&gt; Log4j 취약점 대응, SolarWinds 해킹 사례 &amp;rarr; SBOM 도입 효과 입증&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/189</guid>
      <comments>https://geonoo.tistory.com/189#entry189comment</comments>
      <pubDate>Thu, 27 Mar 2025 14:34:47 +0900</pubDate>
    </item>
    <item>
      <title>  동적 WEP 키(Dynamic WEP Key)</title>
      <link>https://geonoo.tistory.com/188</link>
      <description>&lt;h2 data-end=&quot;171&quot; data-start=&quot;155&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;173&quot; data-ke-size=&quot;size16&quot;&gt;무선 네트워크 보안에서 초기 등장한 **WEP (Wired Equivalent Privacy)**는 데이터를 암호화하여 무선 환경에서도 유선 네트워크와 동등한 보안 수준을 제공하기 위해 개발되었습니다. 그러나 &lt;b&gt;정적(Static) WEP 키&lt;/b&gt; 방식에서는 &lt;b&gt;키가 고정&lt;/b&gt;되어 있어 &lt;b&gt;키 탈취, 암호 해독, 리플레이 공격&lt;/b&gt;에 취약했습니다.&lt;/p&gt;
&lt;p data-end=&quot;481&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;이를 보완하기 위해 등장한 기술이 **동적 WEP 키(Dynamic WEP Key)**입니다. 이 기술은 &lt;b&gt;WEP 키를 주기적으로 변경&lt;/b&gt;하여, &lt;b&gt;무선 네트워크 보안성을 강화&lt;/b&gt;하는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;545&quot; data-start=&quot;483&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 동적 WEP 키의 개념, 작동 원리, 기존 WEP와의 비교, 실무 적용 방안을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;550&quot; data-start=&quot;547&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;569&quot; data-start=&quot;552&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;618&quot; data-start=&quot;571&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 동적 WEP 키(Dynamic WEP Key)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;725&quot; data-start=&quot;620&quot; data-ke-size=&quot;size16&quot;&gt;**동적 WEP 키(Dynamic WEP Key)**란, &lt;b&gt;WEP 키를 일정 주기마다 자동으로 변경&lt;/b&gt;하여 &lt;b&gt;암호 해독 및 키 탈취 위험을 줄이는 무선 네트워크 보안 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;727&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;898&quot; data-start=&quot;743&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;792&quot; data-start=&quot;743&quot;&gt;&lt;b&gt;정적 WEP의 취약점 보완&lt;/b&gt; &amp;rarr; 고정된 키 대신 &lt;b&gt;주기적 키 변경&lt;/b&gt; 적용&lt;/li&gt;
&lt;li data-end=&quot;842&quot; data-start=&quot;793&quot;&gt;&lt;b&gt;세션별 고유 키 할당&lt;/b&gt; &amp;rarr; 사용자/세션마다 &lt;b&gt;각기 다른 WEP 키&lt;/b&gt; 부여&lt;/li&gt;
&lt;li data-end=&quot;898&quot; data-start=&quot;843&quot;&gt;&lt;b&gt;인증 서버 연동 (RADIUS)&lt;/b&gt; &amp;rarr; 802.1X 인증 방식과 연계하여 키 관리 자동화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;903&quot; data-start=&quot;900&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;937&quot; data-start=&quot;905&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 동적 WEP 키의 동작 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;976&quot; data-start=&quot;939&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 사용자 인증 (802.1X + RADIUS 연동)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1137&quot; data-start=&quot;977&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1029&quot; data-start=&quot;977&quot;&gt;사용자가 AP(Access Point)에 접속 시, &lt;b&gt;802.1X 인증 절차&lt;/b&gt; 수행&lt;/li&gt;
&lt;li data-end=&quot;1095&quot; data-start=&quot;1030&quot;&gt;&lt;b&gt;EAP(Extensible Authentication Protocol)&lt;/b&gt; 기반 인증 &amp;rarr; 사용자 신원 검증&lt;/li&gt;
&lt;li data-end=&quot;1137&quot; data-start=&quot;1096&quot;&gt;&lt;b&gt;RADIUS 서버&lt;/b&gt;와 통신하여 &lt;b&gt;인증 성공 시 세션 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1165&quot; data-start=&quot;1139&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 개별 WEP 키 생성 및 할당&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1240&quot; data-start=&quot;1166&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1198&quot; data-start=&quot;1166&quot;&gt;&lt;b&gt;인증 성공한 사용자마다 고유 WEP 키 생성&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1240&quot; data-start=&quot;1199&quot;&gt;AP와 클라이언트(무선 기기)에만 공유 &amp;rarr; &lt;b&gt;제3자 접근 차단&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1265&quot; data-start=&quot;1242&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;1346&quot; data-start=&quot;1266&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1302&quot; data-start=&quot;1266&quot;&gt;&lt;b&gt;세션 지속 시간&lt;/b&gt;에 따라 &lt;b&gt;WEP 키 자동 갱신&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1346&quot; data-start=&quot;1303&quot;&gt;해커가 패킷 캡처 및 분석하더라도, &lt;b&gt;키 변경 주기에 맞춰 무력화&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1351&quot; data-start=&quot;1348&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1396&quot; data-start=&quot;1353&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 정적 WEP 키 vs 동적 WEP 키 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목정적 WEP 키(Static)동적 WEP 키(Dynamic)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1902&quot; data-start=&quot;1398&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1902&quot; data-start=&quot;1557&quot;&gt;
&lt;tr data-end=&quot;1621&quot; data-start=&quot;1557&quot;&gt;
&lt;td&gt;&lt;b&gt;키 관리 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;고정된 키 수동 설정&lt;/td&gt;
&lt;td&gt;&lt;b&gt;사용자/세션별 고유 키 자동 생성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1688&quot; data-start=&quot;1622&quot;&gt;
&lt;td&gt;&lt;b&gt;보안성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;취약 (키 탈취 시 무방비)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;보안 강화 (키 주기적 갱신)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1763&quot; data-start=&quot;1689&quot;&gt;
&lt;td&gt;&lt;b&gt;인증 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사전 공유 키 (PSK)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;802.1X + RADIUS 서버 인증&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1835&quot; data-start=&quot;1764&quot;&gt;
&lt;td&gt;&lt;b&gt;운영 복잡도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;낮음 (설정 간편)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;중간 (RADIUS 연동 필요)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1902&quot; data-start=&quot;1836&quot;&gt;
&lt;td&gt;&lt;b&gt;적용 환경&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;소규모 네트워크&lt;/td&gt;
&lt;td&gt;&lt;b&gt;기업, 공공 기관 등 대규모 환경&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1907&quot; data-start=&quot;1904&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1944&quot; data-start=&quot;1909&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 동적 WEP 키 실무 적용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1969&quot; data-start=&quot;1946&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;2067&quot; data-start=&quot;1970&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2034&quot; data-start=&quot;1970&quot;&gt;&lt;b&gt;사내 무선 네트워크 접속 시 802.1X 인증 + RADIUS 서버&lt;/b&gt; 도입 &amp;rarr; 사용자별 WEP 키 부여&lt;/li&gt;
&lt;li data-end=&quot;2067&quot; data-start=&quot;2035&quot;&gt;&lt;b&gt;내부 사용자/외부 방문자&lt;/b&gt; 구분하여 접근 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2095&quot; data-start=&quot;2069&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;2189&quot; data-start=&quot;2096&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2154&quot; data-start=&quot;2096&quot;&gt;&lt;b&gt;학교, 도서관, 공항 등 공공 Wi-Fi 환경&lt;/b&gt;에서 세션별 키 변경 적용 &amp;rarr; 해커 도청 방지&lt;/li&gt;
&lt;li data-end=&quot;2189&quot; data-start=&quot;2155&quot;&gt;&lt;b&gt;방문자 네트워크 별도 분리&lt;/b&gt; &amp;rarr; 내부망 침투 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2221&quot; data-start=&quot;2191&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ IoT/산업 설비 네트워크 보안 강화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2322&quot; data-start=&quot;2222&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2285&quot; data-start=&quot;2222&quot;&gt;&lt;b&gt;제조 공장, 스마트 팩토리&lt;/b&gt;에서 &lt;b&gt;IoT 기기 인증 + WEP 키 개별 부여&lt;/b&gt; &amp;rarr; 외부 침입 차단&lt;/li&gt;
&lt;li data-end=&quot;2322&quot; data-start=&quot;2286&quot;&gt;&lt;b&gt;기기 간 통신 암호화 유지&lt;/b&gt; &amp;rarr; 데이터 위&amp;middot;변조 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2327&quot; data-start=&quot;2324&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2366&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.5 동적 WEP 키의 한계 및 발전 방향&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2384&quot; data-start=&quot;2368&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;2549&quot; data-start=&quot;2385&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2469&quot; data-start=&quot;2385&quot;&gt;&lt;b&gt;WEP 프로토콜 자체의 구조적 취약성&lt;/b&gt; 존재 &amp;rarr; &lt;b&gt;IV(Initialization Vector)&lt;/b&gt; 반복 문제로 완전한 보안 보장 어려움&lt;/li&gt;
&lt;li data-end=&quot;2549&quot; data-start=&quot;2470&quot;&gt;&lt;b&gt;WPA/WPA2/WPA3&lt;/b&gt; 같은 후속 보안 프로토콜 등장 &amp;rarr; 현재 동적 WEP 키는 &lt;b&gt;레거시 시스템 호환성 유지&lt;/b&gt; 용도로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2566&quot; data-start=&quot;2551&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;2766&quot; data-start=&quot;2567&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2640&quot; data-start=&quot;2567&quot;&gt;&lt;b&gt;WPA3-Enterprise&lt;/b&gt;로의 전환 권장 &amp;rarr; &lt;b&gt;개인화 암호화(Personalized Encryption)&lt;/b&gt; 적용&lt;/li&gt;
&lt;li data-end=&quot;2702&quot; data-start=&quot;2641&quot;&gt;&lt;b&gt;제로 트러스트 네트워크 모델 연동&lt;/b&gt; &amp;rarr; 기기, 사용자 상태 지속 검증 + 암호 키 자동 갱신 강화&lt;/li&gt;
&lt;li data-end=&quot;2766&quot; data-start=&quot;2703&quot;&gt;&lt;b&gt;동적 WEP 키 + 네트워크 접근 제어(NAC)&lt;/b&gt; 결합 &amp;rarr; 비인가 단말기 차단 및 세션 모니터링 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2771&quot; data-start=&quot;2768&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2790&quot; data-start=&quot;2773&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2908&quot; data-start=&quot;2792&quot; data-ke-size=&quot;size16&quot;&gt;**동적 WEP 키(Dynamic WEP Key)**는 &lt;b&gt;고정된 WEP 키의 취약성을 보완&lt;/b&gt;하고, &lt;b&gt;세션별 고유 키 부여 + 주기적 키 변경&lt;/b&gt;을 통해 무선 네트워크 보안을 한층 강화하는 기술입니다.&lt;/p&gt;
&lt;p data-end=&quot;3029&quot; data-start=&quot;2910&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서 &lt;b&gt;동적 WEP 키의 동작 원리, 기존 WEP 방식과의 차이, 실무 적용 방안&lt;/b&gt;을 이해하고, &lt;b&gt;기업&amp;middot;공공기관&amp;middot;산업 현장 무선 네트워크 보안 강화 방안&lt;/b&gt;을 제시할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;3046&quot; data-start=&quot;3031&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;3316&quot; data-start=&quot;3047&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3103&quot; data-start=&quot;3047&quot;&gt;&lt;b&gt;동적 WEP 키 정의:&lt;/b&gt; WEP 키를 자동 생성, 세션별 부여, 주기적으로 변경하는 기술&lt;/li&gt;
&lt;li data-end=&quot;3148&quot; data-start=&quot;3104&quot;&gt;&lt;b&gt;기술적 장점:&lt;/b&gt; 세션별 고유 키 부여 &amp;rarr; 암호 해독/키 탈취 무력화&lt;/li&gt;
&lt;li data-end=&quot;3191&quot; data-start=&quot;3149&quot;&gt;&lt;b&gt;기존 WEP 대비 강화된 보안성:&lt;/b&gt; 정적 키 방식의 취약점 보완&lt;/li&gt;
&lt;li data-end=&quot;3253&quot; data-start=&quot;3192&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 기업 네트워크, 공공 Wi-Fi, 산업 IoT 네트워크 등 다양한 환경에 적용 가능&lt;/li&gt;
&lt;li data-end=&quot;3316&quot; data-start=&quot;3254&quot;&gt;&lt;b&gt;한계 및 발전 방향:&lt;/b&gt; WPA3, 네트워크 접근 제어(NAC) 연계 &amp;rarr; 미래형 무선 보안 모델 구축&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/188</guid>
      <comments>https://geonoo.tistory.com/188#entry188comment</comments>
      <pubDate>Fri, 21 Mar 2025 13:43:31 +0900</pubDate>
    </item>
    <item>
      <title>  제로 트러스트(Zero Trust)</title>
      <link>https://geonoo.tistory.com/187</link>
      <description>&lt;h2 data-end=&quot;158&quot; data-start=&quot;142&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;337&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;전통적인 보안 모델은 **&amp;ldquo;네트워크 내부는 신뢰하고 외부는 방어&amp;rdquo;**라는 경계 중심 접근 방식이었습니다. 그러나 &lt;b&gt;재택근무, 클라우드 확산, BYOD(Bring Your Own Device)&lt;/b&gt; 등 &lt;b&gt;경계가 사라지는 환경&lt;/b&gt;이 확대되면서, &lt;b&gt;내부 접근도 더 이상 안전하지 않다&lt;/b&gt;는 인식이 강화되고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;522&quot; data-start=&quot;339&quot; data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위한 새로운 보안 패러다임이 **제로 트러스트(Zero Trust)**입니다. **&amp;ldquo;아무도 믿지 않는다(Never Trust, Always Verify)&amp;rdquo;**를 원칙으로, &lt;b&gt;모든 사용자, 디바이스, 네트워크 접근을 검증하고 최소 권한만 부여&lt;/b&gt;하여 &lt;b&gt;내부&amp;middot;외부를 구분하지 않고 항상 검증&lt;/b&gt;하는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;581&quot; data-start=&quot;524&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 제로 트러스트의 개념, 핵심 원칙, 아키텍처 구성, 실무 적용 방안을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;586&quot; data-start=&quot;583&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;605&quot; data-start=&quot;588&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;648&quot; data-start=&quot;607&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 제로 트러스트(Zero Trust)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;740&quot; data-start=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;**제로 트러스트(Zero Trust)**란, &lt;b&gt;기본적으로 어떤 사용자&amp;middot;디바이스&amp;middot;프로세스도 신뢰하지 않고, 접근 시마다 검증을 수행하는 보안 모델&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;742&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;1023&quot; data-start=&quot;758&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;824&quot; data-start=&quot;758&quot;&gt;&lt;b&gt;무조건 검증 (Never Trust, Always Verify)&lt;/b&gt;: 내부 사용자, 디바이스도 신뢰하지 않음&lt;/li&gt;
&lt;li data-end=&quot;876&quot; data-start=&quot;825&quot;&gt;&lt;b&gt;최소 권한 부여 (Least Privilege)&lt;/b&gt;: 필요한 최소한의 권한만 부여&lt;/li&gt;
&lt;li data-end=&quot;953&quot; data-start=&quot;877&quot;&gt;&lt;b&gt;마이크로 세분화 (Micro-Segmentation)&lt;/b&gt;: 시스템, 애플리케이션, 데이터에 대한 접근을 세밀하게 구분하여 보호&lt;/li&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;954&quot;&gt;&lt;b&gt;지속적인 모니터링 (Continuous Monitoring)&lt;/b&gt;: 인증 후에도 지속적으로 상태, 행동, 위험 평가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1028&quot; data-start=&quot;1025&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1064&quot; data-start=&quot;1030&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 제로 트러스트의 핵심 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1104&quot; data-start=&quot;1066&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 사용자 검증 (User Authentication)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1252&quot; data-start=&quot;1105&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1185&quot; data-start=&quot;1105&quot;&gt;&lt;b&gt;다중 인증(MFA, Multi-Factor Authentication)&lt;/b&gt;: 비밀번호 + 생체 인증, OTP 등 추가 인증 절차 적용&lt;/li&gt;
&lt;li data-end=&quot;1252&quot; data-start=&quot;1186&quot;&gt;&lt;b&gt;SSO(Single Sign-On)&lt;/b&gt;: 한번 인증 후 여러 시스템 접근 시 추가 인증 요구 (지속적 검증)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1291&quot; data-start=&quot;1254&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 디바이스 검증 (Device Validation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1380&quot; data-start=&quot;1292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1336&quot; data-start=&quot;1292&quot;&gt;&lt;b&gt;단말기 무결성 체크&lt;/b&gt; &amp;rarr; 최신 보안 패치 여부, 운영체제 상태 검증&lt;/li&gt;
&lt;li data-end=&quot;1380&quot; data-start=&quot;1337&quot;&gt;&lt;b&gt;BYOD 관리&lt;/b&gt; &amp;rarr; 개인 기기 접근 시 보안 정책 준수 여부 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1423&quot; data-start=&quot;1382&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 네트워크 세분화 (Network Segmentation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1545&quot; data-start=&quot;1424&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1470&quot; data-start=&quot;1424&quot;&gt;&lt;b&gt;마이크로 세그먼트&lt;/b&gt; &amp;rarr; 시스템, 서비스, 데이터 단위로 접근 권한 분리&lt;/li&gt;
&lt;li data-end=&quot;1545&quot; data-start=&quot;1471&quot;&gt;&lt;b&gt;VPN 대체제로 SDP(Software Defined Perimeter)&lt;/b&gt; 도입 &amp;rarr; 인증된 사용자만 네트워크 보이게 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1590&quot; data-start=&quot;1547&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 최소 권한 제어 (Least Privilege Access)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1738&quot; data-start=&quot;1591&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1699&quot; data-start=&quot;1591&quot;&gt;&lt;b&gt;RBAC(Role-Based Access Control)&lt;/b&gt; / &lt;b&gt;ABAC(Attribute-Based Access Control)&lt;/b&gt; 적용 &amp;rarr; 역할과 속성에 기반한 최소 권한 부여&lt;/li&gt;
&lt;li data-end=&quot;1738&quot; data-start=&quot;1700&quot;&gt;&lt;b&gt;권한 상승 제한&lt;/b&gt; &amp;rarr; 특정 작업 수행 시 추가 검증 요구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1809&quot; data-start=&quot;1740&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 지속적 모니터링 및 위협 대응 (Continuous Monitoring &amp;amp; Threat Detection)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1955&quot; data-start=&quot;1810&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1885&quot; data-start=&quot;1810&quot;&gt;&lt;b&gt;행위 기반 분석(UBA, User Behavior Analytics)&lt;/b&gt; &amp;rarr; 정상 사용자의 행동 패턴 학습, 이상 징후 감지&lt;/li&gt;
&lt;li data-end=&quot;1955&quot; data-start=&quot;1886&quot;&gt;&lt;b&gt;제로 트러스트 NAC(Network Access Control)&lt;/b&gt; &amp;rarr; 네트워크 연결 후에도 지속적으로 상태 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1960&quot; data-start=&quot;1957&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2004&quot; data-start=&quot;1962&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 기존 보안 모델 vs 제로 트러스트 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목기존 보안 모델 (경계 방어)제로 트러스트(Zero Trust)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2595&quot; data-start=&quot;2006&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2595&quot; data-start=&quot;2165&quot;&gt;
&lt;tr data-end=&quot;2237&quot; data-start=&quot;2165&quot;&gt;
&lt;td&gt;&lt;b&gt;신뢰 기준&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;내부 사용자는 신뢰&lt;/td&gt;
&lt;td&gt;&lt;b&gt;모두 불신 &amp;rarr; 매번 검증&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2304&quot; data-start=&quot;2238&quot;&gt;
&lt;td&gt;&lt;b&gt;접근 제어 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;네트워크 경계 기반 허용&lt;/td&gt;
&lt;td&gt;&lt;b&gt;사용자, 디바이스, 앱 기반 검증&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2379&quot; data-start=&quot;2305&quot;&gt;
&lt;td&gt;&lt;b&gt;권한 부여&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기본 권한 부여, 관리 불완전&lt;/td&gt;
&lt;td&gt;&lt;b&gt;최소 권한 원칙(Least Privilege)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2452&quot; data-start=&quot;2380&quot;&gt;
&lt;td&gt;&lt;b&gt;침입 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;외부 침입 차단 중심&lt;/td&gt;
&lt;td&gt;&lt;b&gt;내부 이상 행동까지 감지&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2522&quot; data-start=&quot;2453&quot;&gt;
&lt;td&gt;&lt;b&gt;대응 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인증 후 자유로운 활동&lt;/td&gt;
&lt;td&gt;&lt;b&gt;지속적 상태 검증, 이상 시 차단&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2595&quot; data-start=&quot;2523&quot;&gt;
&lt;td&gt;&lt;b&gt;적용 환경&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사내 네트워크 중심&lt;/td&gt;
&lt;td&gt;&lt;b&gt;클라우드, 원격 근무, IoT 등 확장&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2600&quot; data-start=&quot;2597&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2636&quot; data-start=&quot;2602&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 제로 트러스트 실무 적용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2667&quot; data-start=&quot;2638&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 재택근무&amp;middot;원격 근무 환경 보안 강화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2791&quot; data-start=&quot;2668&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2736&quot; data-start=&quot;2668&quot;&gt;&lt;b&gt;VPN 대신 SDP(Software Defined Perimeter)&lt;/b&gt; 적용 &amp;rarr; 인증된 사용자만 네트워크 노출&lt;/li&gt;
&lt;li data-end=&quot;2791&quot; data-start=&quot;2737&quot;&gt;&lt;b&gt;다중 인증(MFA)&lt;/b&gt; + &lt;b&gt;단말기 검증&lt;/b&gt; 필수 적용 &amp;rarr; 해킹 계정&amp;middot;위조 기기 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2813&quot; data-start=&quot;2793&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;2906&quot; data-start=&quot;2814&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2863&quot; data-start=&quot;2814&quot;&gt;&lt;b&gt;클라우드 리소스 접근 제어&lt;/b&gt; &amp;rarr; 사용자, 애플리케이션, 리소스마다 개별 검증&lt;/li&gt;
&lt;li data-end=&quot;2906&quot; data-start=&quot;2864&quot;&gt;&lt;b&gt;클라우드 워크로드 보호&lt;/b&gt; &amp;rarr; 컨테이너, VM, API 접근 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2930&quot; data-start=&quot;2908&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;3038&quot; data-start=&quot;2931&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2987&quot; data-start=&quot;2931&quot;&gt;&lt;b&gt;내부 사용자 세분화된 접근 정책&lt;/b&gt; 적용 &amp;rarr; 마이크로 세분화로 부서별, 시스템별 접근 제한&lt;/li&gt;
&lt;li data-end=&quot;3038&quot; data-start=&quot;2988&quot;&gt;&lt;b&gt;내부 비정상 행동 탐지&lt;/b&gt; &amp;rarr; 관리자 계정 탈취, 데이터 유출 시도 실시간 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3089&quot; data-start=&quot;3040&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ IoT/OT(Operational Technology) 기기 보안 강화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3179&quot; data-start=&quot;3090&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3131&quot; data-start=&quot;3090&quot;&gt;&lt;b&gt;IoT 단말 무결성 검증&lt;/b&gt; &amp;rarr; 패치 여부, 비정상 트래픽 탐지&lt;/li&gt;
&lt;li data-end=&quot;3179&quot; data-start=&quot;3132&quot;&gt;&lt;b&gt;산업제어시스템(ICS) 보호&lt;/b&gt; &amp;rarr; 중요 설비 접근은 인증된 사용자만 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3184&quot; data-start=&quot;3181&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3219&quot; data-start=&quot;3186&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.5 제로 트러스트 실무 사례 분석&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3267&quot; data-start=&quot;3221&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① Google BeyondCorp (제로 트러스트 모델 도입 사례)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3371&quot; data-start=&quot;3268&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3323&quot; data-start=&quot;3268&quot;&gt;VPN 없이 모든 직원이 &lt;b&gt;기기 무결성 + 사용자 검증&lt;/b&gt; 거쳐서만 회사 시스템 접속 가능&lt;/li&gt;
&lt;li data-end=&quot;3371&quot; data-start=&quot;3324&quot;&gt;&lt;b&gt;지속적 인증 및 모니터링&lt;/b&gt; &amp;rarr; 기기 변경, 위치 변경 시 추가 인증 요구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3418&quot; data-start=&quot;3373&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 미국 국방부 (Zero Trust Architecture 적용)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3507&quot; data-start=&quot;3419&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3462&quot; data-start=&quot;3419&quot;&gt;내부망&amp;middot;외부망 구분 없이 모든 시스템 접근 시 &lt;b&gt;사용자/장치 검증&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3507&quot; data-start=&quot;3463&quot;&gt;&lt;b&gt;마이크로 세그먼트&lt;/b&gt;로 중요 군사 시스템 보호 &amp;rarr; 침입 시 확산 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3512&quot; data-start=&quot;3509&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3531&quot; data-start=&quot;3514&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3678&quot; data-start=&quot;3533&quot; data-ke-size=&quot;size16&quot;&gt;**제로 트러스트(Zero Trust)**는 **&amp;ldquo;모든 접근을 검증하고 최소 권한만 부여&amp;rdquo;**하는 &lt;b&gt;현대 보안 환경의 필수 전략&lt;/b&gt;입니다. &lt;b&gt;재택근무, 클라우드 확산, IoT 연결 증가&lt;/b&gt;에 따라 기존 경계 기반 보안 모델은 더 이상 안전하지 않습니다.&lt;/p&gt;
&lt;p data-end=&quot;3793&quot; data-start=&quot;3680&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서 &lt;b&gt;제로 트러스트의 원칙, 아키텍처 구성, 실무 적용 방안&lt;/b&gt;을 이해하고, &lt;b&gt;기업&amp;middot;기관의 보안 환경에 맞춘 제로 트러스트 설계 및 구축 방안&lt;/b&gt;을 제시할 수 있어야 합니다.&lt;/p&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/187</guid>
      <comments>https://geonoo.tistory.com/187#entry187comment</comments>
      <pubDate>Fri, 21 Mar 2025 11:20:50 +0900</pubDate>
    </item>
    <item>
      <title>  촉각 인터넷(Tactile Internet)</title>
      <link>https://geonoo.tistory.com/186</link>
      <description>&lt;h2 data-end=&quot;167&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;289&quot; data-start=&quot;169&quot; data-ke-size=&quot;size16&quot;&gt;기존 인터넷은 &lt;b&gt;정보 전달 중심&lt;/b&gt;으로 발전해왔습니다. 하지만 자율주행, 원격 의료, 산업 자동화, 메타버스 등 &lt;b&gt;실시간 상호작용&lt;/b&gt;이 요구되는 환경에서는 **지연(Latency)**이 큰 문제로 떠오릅니다.&lt;/p&gt;
&lt;p data-end=&quot;422&quot; data-start=&quot;291&quot; data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 등장한 기술이 **촉각 인터넷(Tactile Internet)**입니다. 이는 &lt;b&gt;1밀리초(ms) 이하의 초저지연 통신&lt;/b&gt;을 통해 &lt;b&gt;사람의 촉각, 동작, 반응을 실시간으로 전달&lt;/b&gt;하는 차세대 인터넷 기술입니다.&lt;/p&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;424&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 촉각 인터넷의 개념, 핵심 기술, 실무 적용 방안을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;476&quot; data-start=&quot;473&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;495&quot; data-start=&quot;478&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;543&quot; data-start=&quot;497&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 촉각 인터넷(Tactile Internet)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;688&quot; data-start=&quot;545&quot; data-ke-size=&quot;size16&quot;&gt;**촉각 인터넷(Tactile Internet)**은 &lt;b&gt;초저지연(1ms 이하)&lt;/b&gt;, &lt;b&gt;초고속 데이터 전송&lt;/b&gt;, **고신뢰성(99.999% 이상)**을 기반으로 &lt;b&gt;원격 환경에서도 실시간으로 촉각, 동작, 반응을 전달할 수 있는 인터넷 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;705&quot; data-start=&quot;690&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;877&quot; data-start=&quot;706&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;752&quot; data-start=&quot;706&quot;&gt;&lt;b&gt;초저지연(ultra-low latency)&lt;/b&gt;: 1ms 이하의 응답 시간&lt;/li&gt;
&lt;li data-end=&quot;797&quot; data-start=&quot;753&quot;&gt;&lt;b&gt;초고속 데이터 처리&lt;/b&gt;: 실시간 센서, 영상, 촉각 데이터 동시 전송&lt;/li&gt;
&lt;li data-end=&quot;842&quot; data-start=&quot;798&quot;&gt;&lt;b&gt;고신뢰성(high reliability)&lt;/b&gt;: 끊김 없는 안정적 연결&lt;/li&gt;
&lt;li data-end=&quot;877&quot; data-start=&quot;843&quot;&gt;&lt;b&gt;양방향 상호작용&lt;/b&gt;: 원격 조작 후 즉각적인 피드백&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;882&quot; data-start=&quot;879&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;914&quot; data-start=&quot;884&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 촉각 인터넷의 핵심 기술&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;941&quot; data-start=&quot;916&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 5G/6G 초저지연 네트워크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1053&quot; data-start=&quot;942&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1017&quot; data-start=&quot;942&quot;&gt;&lt;b&gt;5G URLLC (Ultra-Reliable Low Latency Communication)&lt;/b&gt;: 1ms 이하 지연시간 지원&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1018&quot;&gt;&lt;b&gt;6G&lt;/b&gt;에서는 나노초(&amp;mu;s) 단위의 초고속 반응 목표&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1087&quot; data-start=&quot;1055&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 엣지 컴퓨팅(Edge Computing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1169&quot; data-start=&quot;1088&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1135&quot; data-start=&quot;1088&quot;&gt;데이터 처리와 분석을 클라우드가 아닌 **네트워크 엣지(Edge)**에서 수행&lt;/li&gt;
&lt;li data-end=&quot;1169&quot; data-start=&quot;1136&quot;&gt;사용자와 가까운 위치에서 데이터 처리 &amp;rarr; 지연 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1208&quot; data-start=&quot;1171&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 촉각 피드백 기술 (Haptic Feedback)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1297&quot; data-start=&quot;1209&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1256&quot; data-start=&quot;1209&quot;&gt;&lt;b&gt;촉각 센서&lt;/b&gt;와 &lt;b&gt;진동 피드백 장치&lt;/b&gt;를 통해 원격에서도 실제 촉각 전달&lt;/li&gt;
&lt;li data-end=&quot;1297&quot; data-start=&quot;1257&quot;&gt;예제: 원격 로봇 수술 시 &lt;b&gt;의사가 느끼는 힘과 반발력 재현&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1329&quot; data-start=&quot;1299&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 디지털 트윈(Digital Twin)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1411&quot; data-start=&quot;1330&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1376&quot; data-start=&quot;1330&quot;&gt;현실 세계를 **디지털 복제본(트윈)**으로 만들어 원격 조작 및 반응 예측&lt;/li&gt;
&lt;li data-end=&quot;1411&quot; data-start=&quot;1377&quot;&gt;예제: 공장 설비의 상태를 실시간으로 모니터링하고 조작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1449&quot; data-start=&quot;1413&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 네트워크 슬라이싱(Network Slicing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1567&quot; data-start=&quot;1450&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1512&quot; data-start=&quot;1450&quot;&gt;5G/6G 네트워크 자원을 &lt;b&gt;서비스 별로 논리적 분할&lt;/b&gt;하여, &lt;b&gt;촉각 데이터 전용 통신 경로&lt;/b&gt; 보장&lt;/li&gt;
&lt;li data-end=&quot;1567&quot; data-start=&quot;1513&quot;&gt;예제: 응급 원격 수술 시 &lt;b&gt;전용 네트워크 경로&lt;/b&gt; 확보 &amp;rarr; 끊김 없는 고신뢰 연결 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1572&quot; data-start=&quot;1569&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1613&quot; data-start=&quot;1574&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 기존 인터넷 vs 촉각 인터넷 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목기존 인터넷촉각 인터넷 (Tactile Internet)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2086&quot; data-start=&quot;1615&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2086&quot; data-start=&quot;1762&quot;&gt;
&lt;tr data-end=&quot;1831&quot; data-start=&quot;1762&quot;&gt;
&lt;td&gt;&lt;b&gt;지연시간(Latency)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;30~100ms 이상&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1ms 이하 (초저지연)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1889&quot; data-start=&quot;1832&quot;&gt;
&lt;td&gt;&lt;b&gt;데이터 처리 위치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;클라우드 중심 처리&lt;/td&gt;
&lt;td&gt;&lt;b&gt;엣지 컴퓨팅, 실시간 처리&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1950&quot; data-start=&quot;1890&quot;&gt;
&lt;td&gt;&lt;b&gt;상호작용 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정보/영상 중심&lt;/td&gt;
&lt;td&gt;&lt;b&gt;촉각, 동작, 실시간 반응 전달&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2022&quot; data-start=&quot;1951&quot;&gt;
&lt;td&gt;&lt;b&gt;신뢰성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;중간 (~99.9%)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;99.999% 이상 고신뢰성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2086&quot; data-start=&quot;2023&quot;&gt;
&lt;td&gt;&lt;b&gt;응용 분야&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;영상 통화, 스트리밍&lt;/td&gt;
&lt;td&gt;&lt;b&gt;원격 수술, 자율주행, 산업 자동화&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2091&quot; data-start=&quot;2088&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2126&quot; data-start=&quot;2093&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 촉각 인터넷 실무 적용 분야&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2163&quot; data-start=&quot;2128&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 원격 의료(텔레서저리, Telesurgery)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2269&quot; data-start=&quot;2164&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2224&quot; data-start=&quot;2164&quot;&gt;&lt;b&gt;원격 로봇 수술&lt;/b&gt; &amp;rarr; 의사가 수술 도구를 조작하면, 로봇 팔이 실시간 반응 + 촉각 피드백 전달&lt;/li&gt;
&lt;li data-end=&quot;2269&quot; data-start=&quot;2225&quot;&gt;&lt;b&gt;의료 진단&lt;/b&gt; &amp;rarr; 원격 진단 시, 촉각 센서로 환자 상태 실시간 감지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2291&quot; data-start=&quot;2271&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;2389&quot; data-start=&quot;2292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2345&quot; data-start=&quot;2292&quot;&gt;&lt;b&gt;자율주행차 실시간 제어&lt;/b&gt; &amp;rarr; 차량 간 통신(V2X)을 통해 사고 회피, 실시간 반응&lt;/li&gt;
&lt;li data-end=&quot;2389&quot; data-start=&quot;2346&quot;&gt;&lt;b&gt;원격 드론 조종&lt;/b&gt; &amp;rarr; 드론 조종자가 실시간 환경 변화에 반응 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2415&quot; data-start=&quot;2391&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;2529&quot; data-start=&quot;2416&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2465&quot; data-start=&quot;2416&quot;&gt;&lt;b&gt;원격 로봇 조작&lt;/b&gt; &amp;rarr; 위험 지역의 로봇을 원격으로 조작하며 촉각 피드백 제공&lt;/li&gt;
&lt;li data-end=&quot;2529&quot; data-start=&quot;2466&quot;&gt;&lt;b&gt;기계 유지보수&lt;/b&gt; &amp;rarr; 고장 발생 시 원격 진단 및 수리 지원 (촉각 피드백으로 기계 진동, 상태 파악)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2557&quot; data-start=&quot;2531&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 메타버스/VR/AR 경험 강화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2659&quot; data-start=&quot;2558&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2612&quot; data-start=&quot;2558&quot;&gt;&lt;b&gt;VR 게임/훈련 시뮬레이터&lt;/b&gt; &amp;rarr; 촉각, 힘, 저항을 실시간으로 전달하여 현실감 극대화&lt;/li&gt;
&lt;li data-end=&quot;2659&quot; data-start=&quot;2613&quot;&gt;&lt;b&gt;메타버스 회의/상점&lt;/b&gt; &amp;rarr; 손짓, 악수, 제품 촉감까지 실시간 전달 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2682&quot; data-start=&quot;2661&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;2783&quot; data-start=&quot;2683&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2733&quot; data-start=&quot;2683&quot;&gt;&lt;b&gt;원격 로봇 구조&lt;/b&gt; &amp;rarr; 붕괴된 건물 내부 탐사 시 로봇 조종 + 촉각 반응 전달&lt;/li&gt;
&lt;li data-end=&quot;2783&quot; data-start=&quot;2734&quot;&gt;&lt;b&gt;우주 탐사&lt;/b&gt; &amp;rarr; 탐사 로봇을 지구에서 원격 조작하고 실시간 촉각 피드백 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2788&quot; data-start=&quot;2785&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2807&quot; data-start=&quot;2790&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2949&quot; data-start=&quot;2809&quot; data-ke-size=&quot;size16&quot;&gt;**촉각 인터넷(Tactile Internet)**은 &lt;b&gt;1ms 이하의 초저지연, 고신뢰성 통신, 실시간 상호작용&lt;/b&gt;을 통해 &lt;b&gt;원격 수술, 자율주행, 산업 자동화, 메타버스&lt;/b&gt; 등 &lt;b&gt;차세대 산업 혁신을 견인할 핵심 기술&lt;/b&gt;로 부상하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3067&quot; data-start=&quot;2951&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터시스템응용기술사로서 &lt;b&gt;촉각 인터넷의 기술적 요소, 기존 인터넷과의 차이, 실무 적용 방안&lt;/b&gt;을 이해하고, &lt;b&gt;미래 네트워크 인프라 설계 및 고신뢰성 시스템 구현 방안&lt;/b&gt;을 제시할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;3084&quot; data-start=&quot;3069&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;3247&quot; data-start=&quot;3085&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3141&quot; data-start=&quot;3085&quot;&gt;&lt;b&gt;촉각 인터넷 정의:&lt;/b&gt; 1ms 이하 초저지연, 고신뢰성, 실시간 촉각/동작/반응 전달 기술&lt;/li&gt;
&lt;li data-end=&quot;3197&quot; data-start=&quot;3142&quot;&gt;&lt;b&gt;핵심 기술:&lt;/b&gt; 5G/6G, 엣지 컴퓨팅, 촉각 피드백, 디지털 트윈, 네트워크 슬라이싱&lt;/li&gt;
&lt;li data-end=&quot;3247&quot; data-start=&quot;3198&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 원격 수술, 자율주행, 스마트팩토리, 메타버스, 재난 구조 등&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/186</guid>
      <comments>https://geonoo.tistory.com/186#entry186comment</comments>
      <pubDate>Fri, 21 Mar 2025 09:40:06 +0900</pubDate>
    </item>
    <item>
      <title>  온디바이스(On-Device)</title>
      <link>https://geonoo.tistory.com/185</link>
      <description>&lt;h2 data-end=&quot;154&quot; data-start=&quot;138&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;318&quot; data-start=&quot;156&quot; data-ke-size=&quot;size16&quot;&gt;기존 데이터 처리 방식은 대부분 &lt;b&gt;클라우드 서버 중심&lt;/b&gt;으로 이루어졌습니다. 그러나 실시간 처리, 개인정보 보호, 네트워크 지연 문제 등 다양한 한계에 직면하면서, 데이터를 &lt;b&gt;기기(디바이스) 자체에서 직접 처리&lt;/b&gt;하는 기술인 &lt;b&gt;온디바이스(On-Device)&lt;/b&gt; 방식이 등장했습니다.&lt;/p&gt;
&lt;p data-end=&quot;468&quot; data-start=&quot;320&quot; data-ke-size=&quot;size16&quot;&gt;스마트폰, IoT 기기, 자율주행차, 웨어러블 등 다양한 분야에서 &lt;b&gt;빠른 응답성과 개인정보 보호&lt;/b&gt;가 요구되면서, **온디바이스 컴퓨팅(On-Device Computing)**과 &lt;b&gt;온디바이스 AI(On-Device AI)&lt;/b&gt; 기술이 빠르게 확산되고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;518&quot; data-start=&quot;470&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 온디바이스의 개념, 특징, 장단점, 실무 적용 방안을 분석하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;523&quot; data-start=&quot;520&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;542&quot; data-start=&quot;525&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;582&quot; data-start=&quot;544&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 온디바이스(On-Device)의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;654&quot; data-start=&quot;584&quot; data-ke-size=&quot;size16&quot;&gt;**온디바이스(On-Device)**란 데이터를 &lt;b&gt;클라우드 서버가 아닌 디바이스 자체에서 처리&lt;/b&gt;하는 방식을 의미합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;782&quot; data-start=&quot;655&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;701&quot; data-start=&quot;655&quot;&gt;&lt;b&gt;데이터 수집 &amp;rarr; 분석 &amp;rarr; 실행&lt;/b&gt;까지의 과정이 디바이스 내부에서 이루어짐&lt;/li&gt;
&lt;li data-end=&quot;738&quot; data-start=&quot;702&quot;&gt;&lt;b&gt;네트워크 연결이 불안정하거나 끊겨도 동작&lt;/b&gt;할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;739&quot;&gt;&lt;b&gt;개인정보 보호 강화&lt;/b&gt;: 민감한 데이터를 외부 서버로 전송하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;787&quot; data-start=&quot;784&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;821&quot; data-start=&quot;789&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 온디바이스 기술의 주요 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;843&quot; data-start=&quot;823&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;952&quot; data-start=&quot;844&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;892&quot; data-start=&quot;844&quot;&gt;클라우드로 데이터를 보내고 응답을 기다릴 필요 없이, &lt;b&gt;즉각적인 처리&lt;/b&gt; 가능&lt;/li&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;893&quot;&gt;예제: 스마트폰 음성 인식(&amp;ldquo;Hey Siri&amp;rdquo;, &amp;ldquo;OK Google&amp;rdquo;)이 클라우드 연결 없이도 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;976&quot; data-start=&quot;954&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;1055&quot; data-start=&quot;977&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1013&quot; data-start=&quot;977&quot;&gt;Wi-Fi, LTE, 5G 연결이 불안정하거나 끊겨도 동작&lt;/li&gt;
&lt;li data-end=&quot;1055&quot; data-start=&quot;1014&quot;&gt;예제: 오프라인 상태에서도 동작하는 스마트폰 카메라 얼굴 인식 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1077&quot; data-start=&quot;1057&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;1189&quot; data-start=&quot;1078&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1131&quot; data-start=&quot;1078&quot;&gt;데이터를 외부 서버로 전송하지 않고 기기 내부에서 처리 &amp;rarr; &lt;b&gt;데이터 유출 위험 감소&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1189&quot; data-start=&quot;1132&quot;&gt;예제: 스마트폰 지문 인식 데이터, 안면 인식 정보는 서버로 전송되지 않고 디바이스 내부에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1211&quot; data-start=&quot;1191&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;1301&quot; data-start=&quot;1212&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1266&quot; data-start=&quot;1212&quot;&gt;클라우드 데이터 처리 대비 디바이스 내부에서 짧은 시간에 처리 &amp;rarr; &lt;b&gt;배터리 소모 절감&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1301&quot; data-start=&quot;1267&quot;&gt;예제: 스마트 워치의 심박수 모니터링, 활동 추적 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1322&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ AI 모델 경량화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1432&quot; data-start=&quot;1323&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1396&quot; data-start=&quot;1323&quot;&gt;딥러닝 모델을 디바이스에 탑재할 수 있도록 &lt;b&gt;경량화된 AI 모델&lt;/b&gt; 적용 (TensorFlow Lite, CoreML 등)&lt;/li&gt;
&lt;li data-end=&quot;1432&quot; data-start=&quot;1397&quot;&gt;예제: 스마트폰 카메라의 AI 기반 자동 촬영 보정 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1437&quot; data-start=&quot;1434&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1478&quot; data-start=&quot;1439&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 온디바이스 vs 클라우드 처리 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목온디바이스(On-Device)클라우드 처리(Cloud)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2055&quot; data-start=&quot;1480&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2055&quot; data-start=&quot;1627&quot;&gt;
&lt;tr data-end=&quot;1690&quot; data-start=&quot;1627&quot;&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;/tr&gt;
&lt;tr data-end=&quot;1752&quot; data-start=&quot;1691&quot;&gt;
&lt;td&gt;&lt;b&gt;응답 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;즉각적 (저지연)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;네트워크 상태에 따라 지연 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1814&quot; data-start=&quot;1753&quot;&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;/tr&gt;
&lt;tr data-end=&quot;1874&quot; data-start=&quot;1815&quot;&gt;
&lt;td&gt;&lt;b&gt;데이터 보안&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;강함 (데이터 외부 전송 없음)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데이터 외부 전송으로 유출 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1935&quot; data-start=&quot;1875&quot;&gt;
&lt;td&gt;&lt;b&gt;AI 모델 크기&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;경량화된 모델 (Lite 모델)&lt;/td&gt;
&lt;td&gt;대용량 고성능 모델 처리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1993&quot; data-start=&quot;1936&quot;&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;/tr&gt;
&lt;tr data-end=&quot;2055&quot; data-start=&quot;1994&quot;&gt;
&lt;td&gt;&lt;b&gt;적용 분야&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;스마트폰, IoT, 웨어러블 등&lt;/td&gt;
&lt;td&gt;대규모 데이터 분석, 머신러닝 훈련&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2060&quot; data-start=&quot;2057&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2094&quot; data-start=&quot;2062&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 온디바이스 실무 적용 분야&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2118&quot; data-start=&quot;2096&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;2254&quot; data-start=&quot;2119&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2179&quot; data-start=&quot;2119&quot;&gt;&lt;b&gt;AI 비서&lt;/b&gt; (Siri, Google Assistant, Bixby) &amp;rarr; 음성 인식, 명령 수행&lt;/li&gt;
&lt;li data-end=&quot;2219&quot; data-start=&quot;2180&quot;&gt;&lt;b&gt;카메라 AI&lt;/b&gt; &amp;rarr; 얼굴 인식, 장면 인식, 사진 자동 보정&lt;/li&gt;
&lt;li data-end=&quot;2254&quot; data-start=&quot;2220&quot;&gt;&lt;b&gt;건강 추적&lt;/b&gt; &amp;rarr; 심박수, 수면 패턴, 활동량 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2276&quot; data-start=&quot;2256&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;2362&quot; data-start=&quot;2277&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2326&quot; data-start=&quot;2277&quot;&gt;&lt;b&gt;온디바이스 센서 분석&lt;/b&gt; &amp;rarr; 장애물 감지, 교통 신호 인식, 실시간 경로 변경&lt;/li&gt;
&lt;li data-end=&quot;2362&quot; data-start=&quot;2327&quot;&gt;&lt;b&gt;운전자 상태 분석&lt;/b&gt; &amp;rarr; 졸음 감지, 운전 습관 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2387&quot; data-start=&quot;2364&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 스마트홈/IoT 디바이스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2475&quot; data-start=&quot;2388&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2436&quot; data-start=&quot;2388&quot;&gt;&lt;b&gt;음성 인식 AI 스피커&lt;/b&gt; &amp;rarr; &quot;불 꺼줘&quot;, &quot;에어컨 켜줘&quot; 등의 명령 수행&lt;/li&gt;
&lt;li data-end=&quot;2475&quot; data-start=&quot;2437&quot;&gt;&lt;b&gt;스마트 가전&lt;/b&gt; &amp;rarr; 에너지 효율 최적화, 사용자 패턴 학습&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2500&quot; data-start=&quot;2477&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;2574&quot; data-start=&quot;2501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2535&quot; data-start=&quot;2501&quot;&gt;&lt;b&gt;기계 고장 예측&lt;/b&gt; &amp;rarr; 장비 이상 징후 실시간 감지&lt;/li&gt;
&lt;li data-end=&quot;2574&quot; data-start=&quot;2536&quot;&gt;&lt;b&gt;로봇 제어&lt;/b&gt; &amp;rarr; 로봇팔, 드론 등 기기 동작 실시간 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2590&quot; data-start=&quot;2576&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;2665&quot; data-start=&quot;2591&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2632&quot; data-start=&quot;2591&quot;&gt;&lt;b&gt;휴대용 진단 장비&lt;/b&gt; &amp;rarr; 혈압, 심전도 분석 후 이상 징후 감지&lt;/li&gt;
&lt;li data-end=&quot;2665&quot; data-start=&quot;2633&quot;&gt;&lt;b&gt;AI 헬스케어&lt;/b&gt; &amp;rarr; 환자 상태 실시간 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2670&quot; data-start=&quot;2667&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2689&quot; data-start=&quot;2672&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2837&quot; data-start=&quot;2691&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;온디바이스(On-Device)&lt;/b&gt; 기술은 &lt;b&gt;저지연 실시간 처리, 개인정보 보호, 네트워크 의존도 최소화&lt;/b&gt; 등의 강점을 통해 &lt;b&gt;스마트폰, IoT, 자율주행, 헬스케어, 산업 자동화&lt;/b&gt; 등 &lt;b&gt;차세대 지능형 디바이스의 핵심 기술&lt;/b&gt;로 자리잡고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2961&quot; data-start=&quot;2839&quot; data-ke-size=&quot;size16&quot;&gt;정보관리기술사(이제는 컴퓨터시스템응용기술사!)로서 &lt;b&gt;온디바이스 기술의 특징, 클라우드 대비 장단점, 실무 적용 분야&lt;/b&gt;를 이해하고, &lt;b&gt;차세대 시스템 설계 및 성능 최적화 방안&lt;/b&gt;에 적극 활용할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;2978&quot; data-start=&quot;2963&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;3164&quot; data-start=&quot;2979&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3027&quot; data-start=&quot;2979&quot;&gt;&lt;b&gt;온디바이스 정의:&lt;/b&gt; 디바이스 자체에서 데이터 처리 (클라우드 의존 최소화)&lt;/li&gt;
&lt;li data-end=&quot;3073&quot; data-start=&quot;3028&quot;&gt;&lt;b&gt;기술적 특징:&lt;/b&gt; 저지연, 오프라인 작동, 개인정보 보호, 에너지 효율&lt;/li&gt;
&lt;li data-end=&quot;3116&quot; data-start=&quot;3074&quot;&gt;&lt;b&gt;클라우드 대비 장점:&lt;/b&gt; 응답 속도, 보안, 네트워크 독립성 강화&lt;/li&gt;
&lt;li data-end=&quot;3164&quot; data-start=&quot;3117&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 스마트폰, 자율주행, 스마트홈, 스마트팩토리, 헬스케어 등&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/185</guid>
      <comments>https://geonoo.tistory.com/185#entry185comment</comments>
      <pubDate>Thu, 20 Mar 2025 11:56:28 +0900</pubDate>
    </item>
    <item>
      <title>  제로데이(Zero Day) 취약점</title>
      <link>https://geonoo.tistory.com/184</link>
      <description>&lt;h2 data-end=&quot;159&quot; data-start=&quot;143&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;307&quot; data-start=&quot;161&quot; data-ke-size=&quot;size16&quot;&gt;사이버 공격이 지능화&amp;middot;고도화되면서, &lt;b&gt;패치되지 않은 취약점을 노리는 공격&lt;/b&gt;이 증가하고 있다. 특히 &lt;b&gt;제로데이(Zero Day) 취약점&lt;/b&gt;은 &lt;b&gt;공급업체가 인지하지 못한 상태에서 공격자가 먼저 악용하는 보안 취약점&lt;/b&gt;으로, 막대한 피해를 초래할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;309&quot; data-ke-size=&quot;size16&quot;&gt;**&quot;Zero Day&quot;**라는 명칭은 **공급업체가 해당 취약점을 인지한 날(0일)**이라는 의미에서 유래되었으며, &lt;b&gt;공급업체가 대응하기 전까지는 방어 수단이 사실상 없는 위협&lt;/b&gt;을 의미한다.&lt;/p&gt;
&lt;p data-end=&quot;467&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 제로데이 취약점의 개념, 공격 방식, 실무 대응 방안을 분석한다.&lt;/p&gt;
&lt;hr data-end=&quot;472&quot; data-start=&quot;469&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;491&quot; data-start=&quot;474&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;547&quot; data-start=&quot;493&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 제로데이 취약점(Zero Day Vulnerability)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;549&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;688&quot; data-start=&quot;567&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;635&quot; data-start=&quot;567&quot;&gt;**공급업체(개발사)**가 인지하지 못했거나, 인지했더라도 **패치(보안 업데이트)**가 제공되지 않은 보안 취약점&lt;/li&gt;
&lt;li data-end=&quot;688&quot; data-start=&quot;636&quot;&gt;&lt;b&gt;해커가 먼저 발견하여 공격에 악용&lt;/b&gt;하는 위험성이 크며, &lt;b&gt;방어 수단이 제한적&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;705&quot; data-start=&quot;690&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;844&quot; data-start=&quot;706&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;745&quot; data-start=&quot;706&quot;&gt;&lt;b&gt;패치 전 공격 가능&lt;/b&gt;: 공급업체가 대응하기 전에 공격 발생&lt;/li&gt;
&lt;li data-end=&quot;784&quot; data-start=&quot;746&quot;&gt;&lt;b&gt;고위험성&lt;/b&gt;: 방어책이 없어 피해 규모가 커질 가능성 높음&lt;/li&gt;
&lt;li data-end=&quot;844&quot; data-start=&quot;785&quot;&gt;&lt;b&gt;고가치 취약점&lt;/b&gt;: 해커들이 다크웹에서 높은 가격에 거래 (APT 공격, 랜섬웨어 등으로 악용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;849&quot; data-start=&quot;846&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;895&quot; data-start=&quot;851&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 제로데이 공격(Zero Day Attack) 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;918&quot; data-start=&quot;897&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;1033&quot; data-start=&quot;919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;972&quot; data-start=&quot;919&quot;&gt;공격자가 &lt;b&gt;미공개 취약점&lt;/b&gt;을 발견하여 악성 코드 삽입, 권한 탈취, 시스템 장악 수행&lt;/li&gt;
&lt;li data-end=&quot;1033&quot; data-start=&quot;973&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 웹 브라우저, 운영체제, 오피스 프로그램, 클라우드 플랫폼 등 광범위한 소프트웨어 대상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1065&quot; data-start=&quot;1035&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 익스플로잇(Exploit) 코드 제작&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1150&quot; data-start=&quot;1066&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1105&quot; data-start=&quot;1066&quot;&gt;취약점을 악용할 수 있는 &lt;b&gt;공격 코드(Exploit)&lt;/b&gt; 생성&lt;/li&gt;
&lt;li data-end=&quot;1150&quot; data-start=&quot;1106&quot;&gt;해커 커뮤니티, 다크웹에서 &lt;b&gt;제로데이 익스플로잇 코드&lt;/b&gt;가 고가에 거래&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1152&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;1280&quot; data-start=&quot;1172&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1224&quot; data-start=&quot;1172&quot;&gt;&lt;b&gt;피싱 이메일, 악성 웹사이트, 파일 다운로드&lt;/b&gt; 등을 통해 피해자 시스템 감염 유도&lt;/li&gt;
&lt;li data-end=&quot;1280&quot; data-start=&quot;1225&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 2021년 MS Exchange 서버 제로데이 공격 &amp;rarr; 기업 이메일 서버 해킹&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1306&quot; data-start=&quot;1282&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;1424&quot; data-start=&quot;1307&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1360&quot; data-start=&quot;1307&quot;&gt;공격자는 백도어(Backdoor) 설치 &amp;rarr; 시스템 장악 &amp;rarr; 데이터 유출, 추가 공격 수행&lt;/li&gt;
&lt;li data-end=&quot;1424&quot; data-start=&quot;1361&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; Stuxnet 웜(2010) &amp;rarr; 이란 원자력 발전소 공격에 사용된 제로데이 취약점 악용 사례&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1429&quot; data-start=&quot;1426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1462&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 제로데이 취약점 대응 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1506&quot; data-start=&quot;1464&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 위협 인텔리전스(Threat Intelligence) 확보&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1643&quot; data-start=&quot;1507&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1559&quot; data-start=&quot;1507&quot;&gt;&lt;b&gt;공급업체, 보안 기관, 커뮤니티&lt;/b&gt; 등과 협력하여 제로데이 취약점 정보 실시간 수집&lt;/li&gt;
&lt;li data-end=&quot;1643&quot; data-start=&quot;1560&quot;&gt;&lt;b&gt;CVE(Common Vulnerabilities and Exposures)&lt;/b&gt; 데이터베이스, &lt;b&gt;MITRE ATT&amp;amp;CK 프레임워크&lt;/b&gt; 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1685&quot; data-start=&quot;1645&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 침입 탐지 시스템(IDS) 및 차세대 방화벽(NGFW)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1780&quot; data-start=&quot;1686&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1729&quot; data-start=&quot;1686&quot;&gt;&lt;b&gt;행위 기반 탐지 기술&lt;/b&gt; 적용 &amp;rarr; 기존 시그니처 방식의 한계를 극복&lt;/li&gt;
&lt;li data-end=&quot;1780&quot; data-start=&quot;1730&quot;&gt;&lt;b&gt;비정상 행위 패턴&lt;/b&gt; 감지 후 차단 (Zero Day Exploit 방어 강화)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1816&quot; data-start=&quot;1782&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 애플리케이션 화이트리스트(Whitelist)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1890&quot; data-start=&quot;1817&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1854&quot; data-start=&quot;1817&quot;&gt;&lt;b&gt;신뢰된 프로그램만 실행&lt;/b&gt; 허용 &amp;rarr; 악성 코드 실행 차단&lt;/li&gt;
&lt;li data-end=&quot;1890&quot; data-start=&quot;1855&quot;&gt;&lt;b&gt;운영체제, 주요 앱, 서비스 프로세스 리스트 관리&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1929&quot; data-start=&quot;1892&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 패치 관리 강화 (Patch Management)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1998&quot; data-start=&quot;1930&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1968&quot; data-start=&quot;1930&quot;&gt;보안 업데이트 발표 즉시 적용 &amp;rarr; &quot;취약점 노출 시간&quot; 최소화&lt;/li&gt;
&lt;li data-end=&quot;1998&quot; data-start=&quot;1969&quot;&gt;&lt;b&gt;긴급 패치/업데이트 대응 프로세스&lt;/b&gt; 수립&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2041&quot; data-start=&quot;2000&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 네트워크 세분화 (Network Segmentation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2118&quot; data-start=&quot;2042&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2087&quot; data-start=&quot;2042&quot;&gt;핵심 시스템과 일반 사용자 네트워크 &lt;b&gt;논리적 분리&lt;/b&gt; &amp;rarr; 공격 확산 차단&lt;/li&gt;
&lt;li data-end=&quot;2118&quot; data-start=&quot;2088&quot;&gt;&lt;b&gt;IoT, 서버, 사용자 장치 구역별 통제&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2143&quot; data-start=&quot;2120&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;2209&quot; data-start=&quot;2144&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2173&quot; data-start=&quot;2144&quot;&gt;&lt;b&gt;랜섬웨어 감염 방지용 백업 시스템 구축&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2209&quot; data-start=&quot;2174&quot;&gt;&lt;b&gt;주요 데이터 실시간 백업 + 오프라인 백업 이중화&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2214&quot; data-start=&quot;2211&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2247&quot; data-start=&quot;2216&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 제로데이 실무 사례 분석&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2275&quot; data-start=&quot;2249&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① Log4j 취약점 (2021)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2492&quot; data-start=&quot;2276&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2337&quot; data-start=&quot;2276&quot;&gt;**Java 기반 로그 라이브러리(Log4j)**의 원격 코드 실행 취약점(CVE-2021-44228)&lt;/li&gt;
&lt;li data-end=&quot;2383&quot; data-start=&quot;2338&quot;&gt;&lt;b&gt;대상:&lt;/b&gt; 웹 서버, 클라우드 인프라, IoT 기기 등 광범위한 플랫폼&lt;/li&gt;
&lt;li data-end=&quot;2433&quot; data-start=&quot;2384&quot;&gt;&lt;b&gt;피해:&lt;/b&gt; 공격자가 서버 장악 &amp;rarr; 악성코드 실행, 데이터 유출, 랜섬웨어 감염&lt;/li&gt;
&lt;li data-end=&quot;2492&quot; data-start=&quot;2434&quot;&gt;&lt;b&gt;대응:&lt;/b&gt; 긴급 패치 배포, WAF(Web Application Firewall) 필터링 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2540&quot; data-start=&quot;2494&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② Microsoft Exchange 서버 제로데이 공격 (2021)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2675&quot; data-start=&quot;2541&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2593&quot; data-start=&quot;2541&quot;&gt;&lt;b&gt;MS Exchange 서버 취약점&lt;/b&gt;을 악용한 &lt;b&gt;중국 해킹 그룹(하프늄)&lt;/b&gt; 공격&lt;/li&gt;
&lt;li data-end=&quot;2633&quot; data-start=&quot;2594&quot;&gt;&lt;b&gt;피해:&lt;/b&gt; 이메일 서버 장악 &amp;rarr; 기밀정보 유출, 백도어 설치&lt;/li&gt;
&lt;li data-end=&quot;2675&quot; data-start=&quot;2634&quot;&gt;&lt;b&gt;대응:&lt;/b&gt; MS 긴급 보안 패치 배포, 시스템 관리자 권한 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2703&quot; data-start=&quot;2677&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ Stuxnet 웜 (2010)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2840&quot; data-start=&quot;2704&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2742&quot; data-start=&quot;2704&quot;&gt;&lt;b&gt;이란 원자력 시설 공격&lt;/b&gt;에 사용된 대표적인 제로데이 공격&lt;/li&gt;
&lt;li data-end=&quot;2800&quot; data-start=&quot;2743&quot;&gt;&lt;b&gt;4가지 제로데이 취약점 조합&lt;/b&gt; &amp;rarr; &lt;b&gt;윈도우 제어 시스템 감염, 원심분리기 오작동 유발&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2840&quot; data-start=&quot;2801&quot;&gt;&lt;b&gt;특징:&lt;/b&gt; 산업제어 시스템(ICS) 공격의 시작을 알린 사례&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2845&quot; data-start=&quot;2842&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2864&quot; data-start=&quot;2847&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3036&quot; data-start=&quot;2866&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제로데이 취약점&lt;/b&gt;은 &lt;b&gt;공급업체의 대응 전 공격자가 먼저 악용&lt;/b&gt;하는 &lt;b&gt;최악의 사이버 위협&lt;/b&gt; 중 하나다.&amp;nbsp; 컴퓨터시스템응용기술사로서&amp;nbsp;&lt;b&gt;위협 인텔리전스 확보, 비정상 행위 탐지, 신속 패치 대응 체계 구축&lt;/b&gt; 등 &lt;b&gt;선제적 대응 방안&lt;/b&gt;을 설계&amp;middot;운영할 수 있어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3053&quot; data-start=&quot;3038&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;3256&quot; data-start=&quot;3054&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3096&quot; data-start=&quot;3054&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 공급업체가 인지하지 못한 상태에서 악용되는 보안 취약점&lt;/li&gt;
&lt;li data-end=&quot;3146&quot; data-start=&quot;3097&quot;&gt;&lt;b&gt;공격 방식:&lt;/b&gt; 취약점 탐지 &amp;rarr; 익스플로잇 제작 &amp;rarr; 감염 유도 &amp;rarr; 백도어 설치&lt;/li&gt;
&lt;li data-end=&quot;3205&quot; data-start=&quot;3147&quot;&gt;&lt;b&gt;대응 방안:&lt;/b&gt; 위협 인텔리전스, 비정상 행위 탐지, 패치 관리, 네트워크 세분화, 백업 강화&lt;/li&gt;
&lt;li data-end=&quot;3256&quot; data-start=&quot;3206&quot;&gt;&lt;b&gt;실무 사례:&lt;/b&gt; Log4j, MS Exchange 서버 해킹, Stuxnet 웜&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/184</guid>
      <comments>https://geonoo.tistory.com/184#entry184comment</comments>
      <pubDate>Thu, 20 Mar 2025 11:05:37 +0900</pubDate>
    </item>
    <item>
      <title>  Wi-Fi 7 (IEEE 802.11be)</title>
      <link>https://geonoo.tistory.com/183</link>
      <description>&lt;h2 data-end=&quot;152&quot; data-start=&quot;136&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;321&quot; data-start=&quot;154&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 환경이 &lt;b&gt;4K/8K 영상 스트리밍, 클라우드 게임, VR/AR, 메타버스, IoT 기기 확산&lt;/b&gt; 등 고대역폭 서비스를 요구하면서 기존 Wi-Fi 기술의 한계가 드러나고 있다. 이를 해결하기 위해 차세대 무선 네트워크 기술인 **Wi-Fi 7 (IEEE 802.11be)**이 등장했다.&lt;/p&gt;
&lt;p data-end=&quot;492&quot; data-start=&quot;323&quot; data-ke-size=&quot;size16&quot;&gt;Wi-Fi 7은 **&quot;Extremely High Throughput (EHT)&quot;**를 목표로 하며, 이전 세대인 Wi-Fi 6/6E 대비 &lt;b&gt;속도, 지연시간, 용량, 신뢰성&lt;/b&gt;을 획기적으로 향상시킨다. 본 답안에서는 Wi-Fi 7의 핵심 기술, 기존 Wi-Fi와의 비교, 실무 적용 방안을 분석한다.&lt;/p&gt;
&lt;hr data-end=&quot;497&quot; data-start=&quot;494&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;516&quot; data-start=&quot;499&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;555&quot; data-start=&quot;518&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 Wi-Fi 7의 주요 특징 및 기술&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;580&quot; data-start=&quot;557&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;670&quot; data-start=&quot;581&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;631&quot; data-start=&quot;581&quot;&gt;최대 &lt;b&gt;46Gbps&lt;/b&gt; 속도 제공 (Wi-Fi 6 대비 약 &lt;b&gt;4.8배 증가&lt;/b&gt;)&lt;/li&gt;
&lt;li data-end=&quot;670&quot; data-start=&quot;632&quot;&gt;고화질 스트리밍, 클라우드 게임, 대용량 파일 전송 시간 단축&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;702&quot; data-start=&quot;672&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 대역폭 확장 (320MHz 채널 폭)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;806&quot; data-start=&quot;703&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;763&quot; data-start=&quot;703&quot;&gt;기존 Wi-Fi 6(160MHz) 대비 &lt;b&gt;2배 넓은 채널 폭&lt;/b&gt; 제공 &amp;rarr; 더 빠른 데이터 전송 가능&lt;/li&gt;
&lt;li data-end=&quot;806&quot; data-start=&quot;764&quot;&gt;2.4GHz, 5GHz, 6GHz &lt;b&gt;3개 주파수 대역 동시 지원&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;808&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ MLO (Multi-Link Operation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;954&quot; data-start=&quot;845&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;906&quot; data-start=&quot;845&quot;&gt;여러 주파수 대역(2.4GHz, 5GHz, 6GHz)을 &lt;b&gt;동시에 연결&lt;/b&gt; &amp;rarr; 대역폭 집계로 속도 향상&lt;/li&gt;
&lt;li data-end=&quot;954&quot; data-start=&quot;907&quot;&gt;하나의 링크가 혼잡하거나 끊기면 다른 링크로 자동 전환 &amp;rarr; &lt;b&gt;지연 최소화&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;983&quot; data-start=&quot;956&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 4096-QAM (4K QAM)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1079&quot; data-start=&quot;984&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1034&quot; data-start=&quot;984&quot;&gt;Wi-Fi 6의 &lt;b&gt;1024-QAM&lt;/b&gt; 대비 &lt;b&gt;4배 더 많은 데이터 전송 가능&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1079&quot; data-start=&quot;1035&quot;&gt;고밀도 데이터 변조로 전송 효율 극대화 &amp;rarr; 더 빠른 다운로드/업로드 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1146&quot; data-start=&quot;1081&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ MU-MIMO (Multi-User, Multiple Input Multiple Output) 강화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1241&quot; data-start=&quot;1147&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1195&quot; data-start=&quot;1147&quot;&gt;&lt;b&gt;Wi-Fi 6의 8개 스트림 &amp;rarr; Wi-Fi 7은 최대 16개 스트림 지원&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1241&quot; data-start=&quot;1196&quot;&gt;더 많은 기기 동시 연결 및 처리량 향상 (스마트홈, IoT 환경에 최적)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1309&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑥ OFDMA (Orthogonal Frequency Division Multiple Access) 개선&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1412&quot; data-start=&quot;1310&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1353&quot; data-start=&quot;1310&quot;&gt;여러 기기가 동시에 데이터 송수신 가능 (업링크/다운링크 효율 극대화)&lt;/li&gt;
&lt;li data-end=&quot;1412&quot; data-start=&quot;1354&quot;&gt;실시간 데이터 트래픽 처리 속도 향상 &amp;rarr; &lt;b&gt;VR/AR 지연 감소, 8K 스트리밍 안정성 향상&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1417&quot; data-start=&quot;1414&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1459&quot; data-start=&quot;1419&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 기존 Wi-Fi와 Wi-Fi 7 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목Wi-Fi 5 (802.11ac)Wi-Fi 6/6E (802.11ax)Wi-Fi 7 (802.11be)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2252&quot; data-start=&quot;1461&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2252&quot; data-start=&quot;1642&quot;&gt;
&lt;tr data-end=&quot;1728&quot; data-start=&quot;1642&quot;&gt;
&lt;td&gt;&lt;b&gt;최대 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;6.9Gbps&lt;/td&gt;
&lt;td&gt;9.6Gbps&lt;/td&gt;
&lt;td&gt;&lt;b&gt;46Gbps 이상&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1815&quot; data-start=&quot;1729&quot;&gt;
&lt;td&gt;&lt;b&gt;대역폭&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;80MHz/160MHz&lt;/td&gt;
&lt;td&gt;160MHz&lt;/td&gt;
&lt;td&gt;&lt;b&gt;320MHz (2배 증가)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1904&quot; data-start=&quot;1816&quot;&gt;
&lt;td&gt;&lt;b&gt;변조 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;256-QAM&lt;/td&gt;
&lt;td&gt;1024-QAM&lt;/td&gt;
&lt;td&gt;&lt;b&gt;4096-QAM&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1992&quot; data-start=&quot;1905&quot;&gt;
&lt;td&gt;&lt;b&gt;MIMO 스트림 수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;4x4&lt;/td&gt;
&lt;td&gt;8x8&lt;/td&gt;
&lt;td&gt;&lt;b&gt;16x16 (2배 증가)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2083&quot; data-start=&quot;1993&quot;&gt;
&lt;td&gt;&lt;b&gt;주파수 대역&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;5GHz&lt;/td&gt;
&lt;td&gt;2.4GHz / 5GHz / 6GHz&lt;/td&gt;
&lt;td&gt;&lt;b&gt;2.4GHz / 5GHz / 6GHz&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2166&quot; data-start=&quot;2084&quot;&gt;
&lt;td&gt;&lt;b&gt;지연시간(Latency)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;개선됨&lt;/td&gt;
&lt;td&gt;&lt;b&gt;초저지연 (MLO 지원)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2252&quot; data-start=&quot;2167&quot;&gt;
&lt;td&gt;&lt;b&gt;멀티 링크 지원&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;b&gt;MLO (다중 링크 동시 연결)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2257&quot; data-start=&quot;2254&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2294&quot; data-start=&quot;2259&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.3 Wi-Fi 7의 실무 적용 분야&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2317&quot; data-start=&quot;2296&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;2387&quot; data-start=&quot;2318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2387&quot; data-start=&quot;2318&quot;&gt;&lt;b&gt;8K/16K 영상 스트리밍&lt;/b&gt;, 고용량 파일 전송, 실시간 클라우드 게임 서비스 &amp;rarr; 끊김 없는 고해상도 경험 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2412&quot; data-start=&quot;2389&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 메타버스/VR/AR 환경&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2495&quot; data-start=&quot;2413&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2453&quot; data-start=&quot;2413&quot;&gt;&lt;b&gt;초저지연, 고대역폭&lt;/b&gt; 요구하는 VR/AR 디바이스 연결 강화&lt;/li&gt;
&lt;li data-end=&quot;2495&quot; data-start=&quot;2454&quot;&gt;&lt;b&gt;몰입형 메타버스&lt;/b&gt; 환경 구현 (지연 없는 실시간 렌더링 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2523&quot; data-start=&quot;2497&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 스마트홈 및 IoT 기기 확산&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2625&quot; data-start=&quot;2524&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2584&quot; data-start=&quot;2524&quot;&gt;다중 스트림 지원 및 MLO 기능으로 &lt;b&gt;스마트 가전, 센서, IoT 기기&lt;/b&gt; 안정적 동시 연결 가능&lt;/li&gt;
&lt;li data-end=&quot;2625&quot; data-start=&quot;2585&quot;&gt;예: 스마트 TV, 스마트 스피커, AIoT 기기 동시 사용 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2653&quot; data-start=&quot;2627&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;2754&quot; data-start=&quot;2654&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2719&quot; data-start=&quot;2654&quot;&gt;실시간 대용량 데이터 처리와 저지연 환경 필요 &amp;rarr; &lt;b&gt;대규모 사무실, 공장 자동화(스마트팩토리)&lt;/b&gt; 적용 가능&lt;/li&gt;
&lt;li data-end=&quot;2754&quot; data-start=&quot;2720&quot;&gt;&lt;b&gt;고성능 화상회의, 원격 제어 시스템 안정성 향상&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2781&quot; data-start=&quot;2756&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 자율주행차/차량통신(V2X)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2824&quot; data-start=&quot;2782&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2824&quot; data-start=&quot;2782&quot;&gt;차량 간 저지연 통신, 고속도로 V2X 데이터 송수신 (안전성 향상)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2829&quot; data-start=&quot;2826&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2848&quot; data-start=&quot;2831&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3058&quot; data-start=&quot;2850&quot; data-ke-size=&quot;size16&quot;&gt;Wi-Fi 7은 &lt;b&gt;초고속 데이터 처리, 저지연 통신, 대용량 기기 동시 연결&lt;/b&gt;을 통해 &lt;b&gt;차세대 네트워크 환경&lt;/b&gt;을 열어갈 핵심 기술이다. 정보관리기술사(이제는 컴퓨터시스템응용기술사!)로서 Wi-Fi 7의 &lt;b&gt;기술적 변화, 기존 기술과의 비교 분석, 실무 적용 방안&lt;/b&gt;을 이해하고, &lt;b&gt;기업 네트워크, 스마트홈, 미래 기술 인프라 설계&lt;/b&gt;에 적용할 수 있어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3075&quot; data-start=&quot;3060&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;3268&quot; data-start=&quot;3076&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3145&quot; data-start=&quot;3076&quot;&gt;&lt;b&gt;Wi-Fi 7 특징:&lt;/b&gt; 최대 46Gbps, MLO(다중 링크 동시 연결), 320MHz 대역폭, 4096-QAM&lt;/li&gt;
&lt;li data-end=&quot;3206&quot; data-start=&quot;3146&quot;&gt;&lt;b&gt;기존 기술 비교:&lt;/b&gt; Wi-Fi 6 대비 4.8배 속도 향상, 저지연&amp;middot;대용량 기기 동시 처리 강화&lt;/li&gt;
&lt;li data-end=&quot;3268&quot; data-start=&quot;3207&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 초고속 스트리밍, 메타버스, 스마트홈, 자율주행, 스마트팩토리 등 다양한 산업 분야&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>컴퓨터시스템응용기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/183</guid>
      <comments>https://geonoo.tistory.com/183#entry183comment</comments>
      <pubDate>Thu, 20 Mar 2025 10:44:09 +0900</pubDate>
    </item>
    <item>
      <title>  고대역 초고속 메모리(High Bandwidth Memory, HBM)</title>
      <link>https://geonoo.tistory.com/182</link>
      <description>&lt;h2 data-end=&quot;187&quot; data-start=&quot;171&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;402&quot; data-start=&quot;189&quot; data-ke-size=&quot;size16&quot;&gt;인공지능(AI), 머신러닝(ML), 고성능 컴퓨팅(HPC), 그래픽 처리장치(GPU) 등 데이터 처리량이 폭증하는 분야에서는 &lt;b&gt;더 빠르고 효율적인 메모리&lt;/b&gt;가 필수적이다. 기존 &lt;b&gt;DDR, GDDR 메모리&lt;/b&gt;로는 대역폭과 전력 효율의 한계에 직면하면서, 이를 해결하기 위한 혁신 기술로 **고대역 초고속 메모리(High Bandwidth Memory, HBM)**가 등장했다.&lt;/p&gt;
&lt;p data-end=&quot;516&quot; data-start=&quot;404&quot; data-ke-size=&quot;size16&quot;&gt;HBM은 &lt;b&gt;초고속 데이터 처리, 저전력, 소형화&lt;/b&gt;를 동시에 달성하는 차세대 메모리 기술로 주목받고 있다. 본 답안에서는 HBM의 개념, 구조, 기존 메모리와의 비교, 실무 적용 방안을 분석한다.&lt;/p&gt;
&lt;hr data-end=&quot;521&quot; data-start=&quot;518&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;540&quot; data-start=&quot;523&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;580&quot; data-start=&quot;542&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 고대역 초고속 메모리(HBM)의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;696&quot; data-start=&quot;582&quot; data-ke-size=&quot;size16&quot;&gt;**HBM(High Bandwidth Memory)**은 &lt;b&gt;3D 적층(3D Stacking)&lt;/b&gt; 기술과 &lt;b&gt;고속 인터페이스&lt;/b&gt;를 결합하여 &lt;b&gt;초고속 데이터 처리와 저전력&lt;/b&gt;을 실현한 메모리 기술이다.&lt;/p&gt;
&lt;p data-end=&quot;717&quot; data-start=&quot;698&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;903&quot; data-start=&quot;718&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;788&quot; data-start=&quot;718&quot;&gt;&lt;b&gt;3D TSV (Through-Silicon Via)&lt;/b&gt; 기술: 실리콘 웨이퍼를 수직으로 뚫고 메모리 칩을 수직 적층&lt;/li&gt;
&lt;li data-end=&quot;839&quot; data-start=&quot;789&quot;&gt;&lt;b&gt;Wide I/O 인터페이스:&lt;/b&gt; 기존 메모리보다 훨씬 넓은 데이터 버스 폭 제공&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;840&quot;&gt;&lt;b&gt;GPU/AI 가속기와 직접 통합:&lt;/b&gt; 메모리와 프로세서를 가까이 배치해 대기시간(Latency) 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;908&quot; data-start=&quot;905&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;941&quot; data-start=&quot;910&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 HBM의 구조와 동작 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;965&quot; data-start=&quot;943&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 3D TSV 적층 구조&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1108&quot; data-start=&quot;966&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1042&quot; data-start=&quot;966&quot;&gt;기존 DRAM은 평면(2D)으로 구성되지만, HBM은 &lt;b&gt;8~12층 DRAM 다이를 수직으로 적층&lt;/b&gt;하여 데이터 전송 경로를 단축&lt;/li&gt;
&lt;li data-end=&quot;1108&quot; data-start=&quot;1043&quot;&gt;TSV(Through-Silicon Via)를 통해 칩을 관통하여 연결 &amp;rarr; 더 넓은 대역폭과 빠른 데이터 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1142&quot; data-start=&quot;1110&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 인터페이스와 메모리 폭(Wide I/O)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1240&quot; data-start=&quot;1143&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1143&quot;&gt;기존 GDDR6이 &lt;b&gt;32bit 인터페이스&lt;/b&gt;를 사용하는 반면, &lt;b&gt;HBM은 1024bit 인터페이스&lt;/b&gt; 제공&lt;/li&gt;
&lt;li data-end=&quot;1240&quot; data-start=&quot;1209&quot;&gt;더 넓은 병렬 데이터 경로로 &lt;b&gt;대역폭 극대화&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1261&quot; data-start=&quot;1242&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;1389&quot; data-start=&quot;1262&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1317&quot; data-start=&quot;1262&quot;&gt;HBM은 &lt;b&gt;CPU/GPU/AI 프로세서&lt;/b&gt;와 &lt;b&gt;직접 연결&lt;/b&gt;하여 데이터 전송 지연 최소화&lt;/li&gt;
&lt;li data-end=&quot;1389&quot; data-start=&quot;1318&quot;&gt;&lt;b&gt;HBM은 메모리와 프로세서를 동일 패키지에 통합&lt;/b&gt; (예: AMD Radeon GPU, NVIDIA AI 가속기 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1394&quot; data-start=&quot;1391&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1430&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 기존 메모리와 HBM 비교 분석&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목DDR4/DDR5GDDR6 (그래픽 메모리)HBM (High Bandwidth Memory)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2139&quot; data-start=&quot;1432&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2139&quot; data-start=&quot;1620&quot;&gt;
&lt;tr data-end=&quot;1708&quot; data-start=&quot;1620&quot;&gt;
&lt;td&gt;&lt;b&gt;대역폭&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;25GB/s (채널당)&lt;/td&gt;
&lt;td&gt;512GB/s (GPU 전용)&lt;/td&gt;
&lt;td&gt;1.2TB/s 이상 (HBM3 기준)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1791&quot; data-start=&quot;1709&quot;&gt;
&lt;td&gt;&lt;b&gt;메모리 구조&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2D 평면형 구조&lt;/td&gt;
&lt;td&gt;2D 평면형 구조&lt;/td&gt;
&lt;td&gt;&lt;b&gt;3D TSV 적층 구조&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1879&quot; data-start=&quot;1792&quot;&gt;
&lt;td&gt;&lt;b&gt;데이터 핀 수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;64bit&lt;/td&gt;
&lt;td&gt;32bit x 8 채널&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1024bit 인터페이스&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1961&quot; data-start=&quot;1880&quot;&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;b&gt;저전력 (효율적 전력 관리)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2050&quot; data-start=&quot;1962&quot;&gt;
&lt;td&gt;&lt;b&gt;지연시간(Latency)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;&lt;b&gt;최저 (프로세서와 통합 구조)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2139&quot; data-start=&quot;2051&quot;&gt;
&lt;td&gt;&lt;b&gt;적용 분야&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PC, 서버&lt;/td&gt;
&lt;td&gt;고성능 GPU, 게임용 그래픽&lt;/td&gt;
&lt;td&gt;&lt;b&gt;AI, 머신러닝, 고성능 컴퓨팅 (HPC)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2144&quot; data-start=&quot;2141&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2176&quot; data-start=&quot;2146&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 HBM 실무 적용 분야&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2208&quot; data-start=&quot;2178&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 인공지능/머신러닝(AI/ML) 가속기&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2303&quot; data-start=&quot;2209&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2250&quot; data-start=&quot;2209&quot;&gt;AI 모델 학습과 추론에 방대한 데이터를 빠르게 처리해야 하는 환경&lt;/li&gt;
&lt;li data-end=&quot;2303&quot; data-start=&quot;2251&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; NVIDIA A100, AMD Instinct MI200 등 AI 가속기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2355&quot; data-start=&quot;2305&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 고성능 컴퓨팅(HPC, High Performance Computing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2455&quot; data-start=&quot;2356&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2397&quot; data-start=&quot;2356&quot;&gt;기상 예측, 유전자 분석, 시뮬레이션 등 초고속 연산이 필요한 분야&lt;/li&gt;
&lt;li data-end=&quot;2455&quot; data-start=&quot;2398&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 슈퍼컴퓨터용 CPU/GPU에 HBM 통합 (Intel Xeon Max 시리즈 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2483&quot; data-start=&quot;2457&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;2556&quot; data-start=&quot;2484&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2524&quot; data-start=&quot;2484&quot;&gt;대용량 데이터 분석, 클라우드 기반 AI 서비스, 영상 처리 서버&lt;/li&gt;
&lt;li data-end=&quot;2556&quot; data-start=&quot;2525&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 구글 TPU, AWS AI 인스턴스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2581&quot; data-start=&quot;2558&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 그래픽 처리장치(GPU)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2660&quot; data-start=&quot;2582&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2612&quot; data-start=&quot;2582&quot;&gt;고해상도 렌더링, 3D 그래픽, VR/AR 처리&lt;/li&gt;
&lt;li data-end=&quot;2660&quot; data-start=&quot;2613&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; AMD Radeon RX Vega 시리즈, NVIDIA H100&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2665&quot; data-start=&quot;2662&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2684&quot; data-start=&quot;2667&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2826&quot; data-start=&quot;2686&quot; data-ke-size=&quot;size16&quot;&gt;**HBM(High Bandwidth Memory)**은 &lt;b&gt;초고속 데이터 처리, 저전력, 소형화&lt;/b&gt;라는 세 가지 강점을 통해 &lt;b&gt;AI, HPC, 데이터센터, 그래픽 처리&lt;/b&gt; 등 &lt;b&gt;차세대 고성능 컴퓨팅 인프라의 핵심 메모리 기술&lt;/b&gt;로 자리잡았다.&lt;/p&gt;
&lt;p data-end=&quot;2909&quot; data-start=&quot;2828&quot; data-ke-size=&quot;size16&quot;&gt;정보관리기술사로서 HBM의 구조와 동작 원리를 이해하고, &lt;b&gt;기존 메모리와의 성능 비교 분석, 실무 적용 전략 수립&lt;/b&gt; 능력을 갖추어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;2926&quot; data-start=&quot;2911&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;3139&quot; data-start=&quot;2927&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2984&quot; data-start=&quot;2927&quot;&gt;&lt;b&gt;HBM 정의:&lt;/b&gt; 3D TSV 적층 + Wide I/O 인터페이스로 초고속 데이터 처리 가능&lt;/li&gt;
&lt;li data-end=&quot;3022&quot; data-start=&quot;2985&quot;&gt;&lt;b&gt;기술적 강점:&lt;/b&gt; 초고속 대역폭, 저전력, 고밀도 소형화&lt;/li&gt;
&lt;li data-end=&quot;3081&quot; data-start=&quot;3023&quot;&gt;&lt;b&gt;기존 메모리 비교:&lt;/b&gt; DDR/GDDR 대비 압도적인 대역폭, 낮은 지연시간, 높은 전력 효율&lt;/li&gt;
&lt;li data-end=&quot;3139&quot; data-start=&quot;3082&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; AI 가속기, HPC, 데이터센터, 그래픽 카드 등 차세대 인프라 필수 기술&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/182</guid>
      <comments>https://geonoo.tistory.com/182#entry182comment</comments>
      <pubDate>Thu, 20 Mar 2025 09:18:05 +0900</pubDate>
    </item>
    <item>
      <title>  개인정보 보호 강화기술 (Privacy Enhancing Technology, PET)</title>
      <link>https://geonoo.tistory.com/181</link>
      <description>&lt;h2 data-end=&quot;200&quot; data-start=&quot;184&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;428&quot; data-start=&quot;202&quot; data-ke-size=&quot;size16&quot;&gt;데이터의 가치가 높아지는 시대에 개인정보는 기업과 개인 모두에게 중요한 자산이다. 그러나 데이터 활용이 증가할수록 개인정보 유출, 오남용 위험도 커지고 있다. 이를 해결하기 위해 등장한 기술이 **개인정보 보호 강화기술(PET, Privacy Enhancing Technology)**이다. PET 기술은 데이터를 안전하게 처리하고, &lt;b&gt;개인정보 노출 없이 분석과 활용을 가능하게 만드는 기술&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;474&quot; data-start=&quot;430&quot; data-ke-size=&quot;size16&quot;&gt;본 답안에서는 PET의 개념, 주요 기술 유형, 실무 적용 방안을 분석한다.&lt;/p&gt;
&lt;hr data-end=&quot;479&quot; data-start=&quot;476&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;498&quot; data-start=&quot;481&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;539&quot; data-start=&quot;500&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 개인정보 보호 강화기술(PET)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;691&quot; data-start=&quot;541&quot; data-ke-size=&quot;size16&quot;&gt;  **개인정보 보호 강화기술(PET)**은 다음 두 가지 목적을 달성하는 기술이다:&lt;br /&gt;1️⃣ &lt;b&gt;개인정보 노출 최소화:&lt;/b&gt; 데이터 분석과 처리 과정에서 불필요한 개인정보 노출 방지&lt;br /&gt;2️⃣ &lt;b&gt;안전한 데이터 활용:&lt;/b&gt; 데이터 유출 위험 없이 분석과 공유 가능&lt;/p&gt;
&lt;p data-end=&quot;708&quot; data-start=&quot;693&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;793&quot; data-start=&quot;709&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;755&quot; data-start=&quot;709&quot;&gt;&lt;b&gt;Privacy by Design&lt;/b&gt; (설계 단계부터 개인정보 보호 고려)&lt;/li&gt;
&lt;li data-end=&quot;793&quot; data-start=&quot;756&quot;&gt;&lt;b&gt;데이터 최소 수집, 익명성 유지, 불필요한 노출 차단&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;798&quot; data-start=&quot;795&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;841&quot; data-start=&quot;800&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 개인정보 보호 강화기술(PET)의 주요 유형&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;883&quot; data-start=&quot;843&quot; data-ke-size=&quot;size16&quot;&gt;PET 기술은 &lt;b&gt;데이터 보호 방식&lt;/b&gt;에 따라 다음과 같이 분류된다:&lt;/p&gt;
&lt;hr data-end=&quot;888&quot; data-start=&quot;885&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;936&quot; data-start=&quot;890&quot; data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;① 데이터 변형(De-identification) 기반 기술&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1278&quot; data-start=&quot;938&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;938&quot;&gt;&lt;b&gt;익명화(Anonymization):&lt;/b&gt; 개인 식별 정보를 완전히 제거하여 재식별 불가능하게 처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1099&quot; data-start=&quot;1000&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1042&quot; data-start=&quot;1000&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 이름, 주소, 주민번호 삭제 후 데이터 분석용으로 제공&lt;/li&gt;
&lt;li data-end=&quot;1070&quot; data-start=&quot;1045&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 데이터 재식별 위험 방지&lt;/li&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;1073&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 데이터 활용성 저하 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1278&quot; data-start=&quot;1101&quot;&gt;&lt;b&gt;가명화(Pseudonymization):&lt;/b&gt; 원본 데이터를 대체 값(토큰)으로 치환하여, 원본과의 연결이 제한된 형태
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1278&quot; data-start=&quot;1175&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1204&quot; data-start=&quot;1175&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; &quot;김철수&quot; &amp;rarr; &quot;사용자1234&quot;&lt;/li&gt;
&lt;li data-end=&quot;1247&quot; data-start=&quot;1207&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 원본 데이터 복원 가능 (권한 있는 관리자만 접근)&lt;/li&gt;
&lt;li data-end=&quot;1278&quot; data-start=&quot;1250&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 복호화 키 유출 시 위험 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1283&quot; data-start=&quot;1280&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1321&quot; data-start=&quot;1285&quot; data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;② 암호화(Encryption) 기반 기술&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1729&quot; data-start=&quot;1323&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1510&quot; data-start=&quot;1323&quot;&gt;&lt;b&gt;동형암호(Homomorphic Encryption):&lt;/b&gt; 데이터를 암호화된 상태로 분석/처리 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1510&quot; data-start=&quot;1386&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1434&quot; data-start=&quot;1386&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 의료 데이터 분석 시, 암호화된 환자 정보 상태 그대로 분석 수행&lt;/li&gt;
&lt;li data-end=&quot;1475&quot; data-start=&quot;1437&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 데이터 유출 위험 최소화, 민감 정보 보호 유지&lt;/li&gt;
&lt;li data-end=&quot;1510&quot; data-start=&quot;1478&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 계산 복잡성으로 인한 처리 속도 저하&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1729&quot; data-start=&quot;1512&quot;&gt;&lt;b&gt;다자간 연산(MPC, Multi-Party Computation):&lt;/b&gt; 여러 당사자가 데이터를 공유하지 않고, 협력하여 연산 수행
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1729&quot; data-start=&quot;1593&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1653&quot; data-start=&quot;1593&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 금융기관 간 신용평가 데이터 분석 시 각 은행이 고객 데이터 노출 없이 공동 분석 가능&lt;/li&gt;
&lt;li data-end=&quot;1691&quot; data-start=&quot;1656&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 데이터 비공개 상태 유지, 협업 분석 가능&lt;/li&gt;
&lt;li data-end=&quot;1729&quot; data-start=&quot;1694&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 연산 복잡성 증가, 네트워크 오버헤드 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1734&quot; data-start=&quot;1731&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1762&quot; data-start=&quot;1736&quot; data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;③ 분산 처리 기반 기술&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2226&quot; data-start=&quot;1764&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1985&quot; data-start=&quot;1764&quot;&gt;&lt;b&gt;차등프라이버시(Differential Privacy):&lt;/b&gt; 분석 결과에 &lt;b&gt;통계적 노이즈&lt;/b&gt;를 추가하여 개별 데이터 추출 방지
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1985&quot; data-start=&quot;1843&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1910&quot; data-start=&quot;1843&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 사용자 행동 데이터 분석 시, 특정 사용자의 정보 노출 방지 (Google, Apple 활용 사례)&lt;/li&gt;
&lt;li data-end=&quot;1948&quot; data-start=&quot;1913&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 데이터 유출 방지, 집계 결과 정확도 유지&lt;/li&gt;
&lt;li data-end=&quot;1985&quot; data-start=&quot;1951&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 과도한 노이즈 처리 시 데이터 품질 저하&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2226&quot; data-start=&quot;1987&quot;&gt;&lt;b&gt;연합학습(Federated Learning):&lt;/b&gt; 데이터를 중앙 서버로 보내지 않고, 각 디바이스에서 학습을 수행한 뒤 모델만 공유
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2226&quot; data-start=&quot;2069&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2146&quot; data-start=&quot;2069&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 스마트폰 사용자 입력 패턴 분석 &amp;rarr; 개인 데이터는 스마트폰에 남아있고 모델만 서버에 전달 (Google Gboard)&lt;/li&gt;
&lt;li data-end=&quot;2187&quot; data-start=&quot;2149&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 원본 데이터 유출 위험 없음, 실시간 학습 가능&lt;/li&gt;
&lt;li data-end=&quot;2226&quot; data-start=&quot;2190&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 네트워크 병목, 모델 동기화 문제 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2231&quot; data-start=&quot;2228&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2274&quot; data-start=&quot;2233&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 개인정보 보호 강화기술(PET) 비교 분석표&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;기술 유형주요 개념장점단점실무 적용 사례
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3164&quot; data-start=&quot;2276&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3164&quot; data-start=&quot;2567&quot;&gt;
&lt;tr data-end=&quot;2686&quot; data-start=&quot;2567&quot;&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;td&gt;데이터 분석, 통계 보고서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2807&quot; data-start=&quot;2687&quot;&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;td&gt;의료 데이터 분석, 금융 데이터 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2924&quot; data-start=&quot;2808&quot;&gt;
&lt;td&gt;&lt;b&gt;다자간 연산 (MPC)&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;td&gt;은행 간 신용평가, 공동 데이터 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3042&quot; data-start=&quot;2925&quot;&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;td&gt;사용자 행동 분석, 통계 데이터 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3164&quot; data-start=&quot;3043&quot;&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;td&gt;스마트폰 키보드, 음성 인식 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3169&quot; data-start=&quot;3166&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3188&quot; data-start=&quot;3171&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3346&quot; data-start=&quot;3190&quot; data-ke-size=&quot;size16&quot;&gt;개인정보 보호 강화기술(PET)은 &lt;b&gt;데이터 활용과 개인정보 보호&lt;/b&gt;라는 상충된 목표를 동시에 달성할 수 있는 중요한 기술이다. 정보관리기술사로서 PET 기술을 이해하고, &lt;b&gt;익명화, 동형암호, 차등프라이버시, 연합학습&lt;/b&gt; 등 상황에 맞는 기술을 설계&amp;middot;적용할 수 있어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3363&quot; data-start=&quot;3348&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;3519&quot; data-start=&quot;3364&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3408&quot; data-start=&quot;3364&quot;&gt;&lt;b&gt;PET 개념:&lt;/b&gt; 개인정보 노출 없이 데이터 활용 가능하게 하는 기술&lt;/li&gt;
&lt;li data-end=&quot;3471&quot; data-start=&quot;3409&quot;&gt;&lt;b&gt;유형:&lt;/b&gt; 데이터 변형(익명화/가명화), 암호화(동형암호/MPC), 분산처리(차등프라이버시/연합학습)&lt;/li&gt;
&lt;li data-end=&quot;3519&quot; data-start=&quot;3472&quot;&gt;&lt;b&gt;기술사 관점:&lt;/b&gt; 데이터 활용과 개인정보 보호 균형을 맞춘 설계 능력 필수&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/181</guid>
      <comments>https://geonoo.tistory.com/181#entry181comment</comments>
      <pubDate>Thu, 20 Mar 2025 08:56:26 +0900</pubDate>
    </item>
    <item>
      <title>  스토리지 가상화(Storage Virtualization) 유형별 특징</title>
      <link>https://geonoo.tistory.com/180</link>
      <description>&lt;h2 data-end=&quot;178&quot; data-start=&quot;162&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;489&quot; data-start=&quot;180&quot; data-ke-size=&quot;size16&quot;&gt;기업의 데이터가 폭발적으로 증가함에 따라 &lt;b&gt;스토리지 자원의 효율적 관리와 확장성&lt;/b&gt;이 점점 더 중요해지고 있다. 이를 해결하기 위한 기술이 바로 **스토리지 가상화(Storage Virtualization)**이다. 스토리지 가상화는 물리적인 스토리지를 논리적으로 통합하고, 사용자나 애플리케이션에 **하나의 통합된 스토리지 풀(Pool)**처럼 보이게 만드는 기술이다. 이를 통해 &lt;b&gt;자원 활용률 극대화&lt;/b&gt;, &lt;b&gt;운영 효율성 향상&lt;/b&gt;, &lt;b&gt;유연한 확장성&lt;/b&gt;을 실현할 수 있다. 본 답안에서는 스토리지 가상화의 개념과 주요 유형별 특징을 분석한다.&lt;/p&gt;
&lt;hr data-end=&quot;494&quot; data-start=&quot;491&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;511&quot; data-start=&quot;496&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;567&quot; data-start=&quot;513&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 스토리지 가상화(Storage Virtualization)의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;657&quot; data-start=&quot;569&quot; data-ke-size=&quot;size16&quot;&gt;스토리지 가상화란 &lt;b&gt;물리적 스토리지를 논리적으로 추상화하여, 응용 프로그램과 사용자가 물리적 위치를 인식하지 않고 사용할 수 있도록 만드는 기술&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;674&quot; data-start=&quot;659&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;835&quot; data-start=&quot;675&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;717&quot; data-start=&quot;675&quot;&gt;&lt;b&gt;자원 통합:&lt;/b&gt; 여러 스토리지를 하나의 통합된 논리 볼륨으로 관리&lt;/li&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;718&quot;&gt;&lt;b&gt;확장성:&lt;/b&gt; 용량 추가 시 재구성이 필요 없이 유연하게 확장&lt;/li&gt;
&lt;li data-end=&quot;795&quot; data-start=&quot;758&quot;&gt;&lt;b&gt;성능 최적화:&lt;/b&gt; 데이터 접근 경로 최적화 및 중복 제거&lt;/li&gt;
&lt;li data-end=&quot;835&quot; data-start=&quot;796&quot;&gt;&lt;b&gt;고가용성:&lt;/b&gt; 장애 발생 시 자동 복구 및 데이터 보호 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;840&quot; data-start=&quot;837&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;873&quot; data-start=&quot;842&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 스토리지 가상화의 유형별 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;968&quot; data-start=&quot;875&quot; data-ke-size=&quot;size16&quot;&gt;스토리지 가상화는 구현 위치에 따라 크게 &lt;b&gt;호스트 기반&lt;/b&gt;, &lt;b&gt;네트워크 기반&lt;/b&gt;, &lt;b&gt;스토리지 기반&lt;/b&gt; 세 가지 유형으로 나뉩니다. 각 유형별 특징을 분석해봅시다!&lt;/p&gt;
&lt;hr data-end=&quot;973&quot; data-start=&quot;970&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1017&quot; data-start=&quot;975&quot; data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;① 호스트 기반(Host-based) 스토리지 가상화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1198&quot; data-start=&quot;1019&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1088&quot; data-start=&quot;1019&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 스토리지 가상화 기능이 서버(호스트) 내부의 소프트웨어 또는 하이퍼바이저(가상화 플랫폼)에 구현된 형태&lt;/li&gt;
&lt;li data-end=&quot;1137&quot; data-start=&quot;1089&quot;&gt;&lt;b&gt;동작 방식:&lt;/b&gt; 호스트 서버가 스토리지 볼륨을 추상화하여 가상 디스크로 제공&lt;/li&gt;
&lt;li data-end=&quot;1198&quot; data-start=&quot;1138&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; VMware vSAN, Microsoft Storage Spaces, Linux LVM&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1334&quot; data-start=&quot;1200&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✨ 특징:&lt;/b&gt;&lt;br /&gt;✔️ &lt;b&gt;소규모 환경에 적합:&lt;/b&gt; 단일 서버나 소규모 클러스터 구성에 유용&lt;br /&gt;✔️ &lt;b&gt;저비용:&lt;/b&gt; 별도의 하드웨어 추가 없이 서버 내 소프트웨어로 구성&lt;br /&gt;✔️ &lt;b&gt;하이퍼컨버지드 인프라( HCI)&lt;/b&gt; 구축 시 필수&lt;/p&gt;
&lt;p data-end=&quot;1420&quot; data-start=&quot;1336&quot; data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;확장성 한계:&lt;/b&gt; 서버 자원(CPU, 메모리, 네트워크)에 종속 &amp;rarr; 대규모 환경엔 부적합&lt;br /&gt;❌ &lt;b&gt;서버 장애 시 데이터 접근 불가 위험&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1425&quot; data-start=&quot;1422&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1473&quot; data-start=&quot;1427&quot; data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;② 네트워크 기반(Network-based) 스토리지 가상화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1619&quot; data-start=&quot;1475&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1557&quot; data-start=&quot;1475&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 스토리지 가상화 기능이 SAN(Storage Area Network) 패브릭이나 전용 가상화 어플라이언스(장비)에 구현된 형태&lt;/li&gt;
&lt;li data-end=&quot;1619&quot; data-start=&quot;1558&quot;&gt;&lt;b&gt;동작 방식:&lt;/b&gt; SAN 스위치 또는 가상화 컨트롤러가 다수의 물리적 스토리지를 가상 풀로 묶어 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1785&quot; data-start=&quot;1621&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✨ 특징:&lt;/b&gt;&lt;br /&gt;✔️ &lt;b&gt;대규모 확장성:&lt;/b&gt; 수십~수백 개의 스토리지 장비를 통합 관리 가능&lt;br /&gt;✔️ &lt;b&gt;이기종 스토리지 통합:&lt;/b&gt; 벤더가 다른 스토리지 장비도 하나의 논리 풀로 통합 가능&lt;br /&gt;✔️ &lt;b&gt;고가용성:&lt;/b&gt; 장애 발생 시 경로 자동 전환(Failover), RAID 보호 강화&lt;/p&gt;
&lt;p data-end=&quot;1874&quot; data-start=&quot;1787&quot; data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;고비용:&lt;/b&gt; SAN 패브릭 구축, 전용 가상화 장비 도입 비용 증가&lt;br /&gt;❌ &lt;b&gt;설치/운영 복잡도 증가:&lt;/b&gt; SAN 패브릭 관리 및 장애 대응 복잡&lt;/p&gt;
&lt;p data-end=&quot;1892&quot; data-start=&quot;1876&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;2002&quot; data-start=&quot;1893&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1932&quot; data-start=&quot;1893&quot;&gt;&lt;b&gt;IBM SAN Volume Controller (SVC)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1955&quot; data-start=&quot;1933&quot;&gt;&lt;b&gt;Dell EMC VPLEX&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2002&quot; data-start=&quot;1956&quot;&gt;&lt;b&gt;Hitachi VSP (Virtual Storage Platform)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2007&quot; data-start=&quot;2004&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2055&quot; data-start=&quot;2009&quot; data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;③ 스토리지 기반(Storage-based) 스토리지 가상화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2161&quot; data-start=&quot;2057&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2102&quot; data-start=&quot;2057&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 스토리지 장비(컨트롤러) 자체가 가상화 기능을 제공하는 형태&lt;/li&gt;
&lt;li data-end=&quot;2161&quot; data-start=&quot;2103&quot;&gt;&lt;b&gt;동작 방식:&lt;/b&gt; 고급 스토리지 장비 자체에 가상화 엔진이 내장되어 볼륨을 논리적으로 통합 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2309&quot; data-start=&quot;2163&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✨ 특징:&lt;/b&gt;&lt;br /&gt;✔️ &lt;b&gt;고성능:&lt;/b&gt; 스토리지 컨트롤러의 하드웨어 가속 기능 덕분에 성능 우수&lt;br /&gt;✔️ &lt;b&gt;장비 내 기능 통합:&lt;/b&gt; 스냅샷, 복제, 자동 티어링 기능 기본 지원&lt;br /&gt;✔️ &lt;b&gt;안정성:&lt;/b&gt; 장비 내부에서 데이터 복구, 복제, 백업 기능 내장&lt;/p&gt;
&lt;p data-end=&quot;2393&quot; data-start=&quot;2311&quot; data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;벤더 종속성:&lt;/b&gt; 특정 벤더 제품만 지원 &amp;rarr; 이기종 스토리지 통합 어려움&lt;br /&gt;❌ &lt;b&gt;비용 부담:&lt;/b&gt; 고성능 스토리지 컨트롤러 비용이 높음&lt;/p&gt;
&lt;p data-end=&quot;2411&quot; data-start=&quot;2395&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;2497&quot; data-start=&quot;2412&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2437&quot; data-start=&quot;2412&quot;&gt;&lt;b&gt;Dell EMC PowerMax&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2472&quot; data-start=&quot;2438&quot;&gt;&lt;b&gt;NetApp AFF (All Flash FAS)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2497&quot; data-start=&quot;2473&quot;&gt;&lt;b&gt;Hitachi VSP E990&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2502&quot; data-start=&quot;2499&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2534&quot; data-start=&quot;2504&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 스토리지 가상화 유형 비교표&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목호스트 기반네트워크 기반스토리지 기반
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3220&quot; data-start=&quot;2536&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3220&quot; data-start=&quot;2726&quot;&gt;
&lt;tr data-end=&quot;2806&quot; data-start=&quot;2726&quot;&gt;
&lt;td&gt;&lt;b&gt;설치 위치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버(호스트) 내&lt;/td&gt;
&lt;td&gt;SAN 패브릭 / 전용 장비&lt;/td&gt;
&lt;td&gt;스토리지 컨트롤러 내장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2884&quot; data-start=&quot;2807&quot;&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;2962&quot; data-start=&quot;2885&quot;&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;3040&quot; data-start=&quot;2963&quot;&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;고성능, 스냅샷&amp;middot;복제 기능 내장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3120&quot; data-start=&quot;3041&quot;&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;3220&quot; data-start=&quot;3121&quot;&gt;
&lt;td&gt;&lt;b&gt;대표 사례&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;VMware vSAN, LVM&lt;/td&gt;
&lt;td&gt;IBM SVC, Dell EMC VPLEX&lt;/td&gt;
&lt;td&gt;Dell PowerMax, NetApp AFF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3225&quot; data-start=&quot;3222&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3242&quot; data-start=&quot;3227&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3435&quot; data-start=&quot;3244&quot; data-ke-size=&quot;size16&quot;&gt;스토리지 가상화는 &lt;b&gt;저장 공간의 효율적 통합과 관리&lt;/b&gt;를 가능하게 해주며, &lt;b&gt;확장성, 성능, 가용성&lt;/b&gt;을 크게 향상시킨다. 정보관리기술사로서 인프라 설계 시 &lt;b&gt;환경의 규모, 예산, 성능 요구사항, 확장성&lt;/b&gt;을 고려하여 &lt;b&gt;호스트 기반&lt;/b&gt;, &lt;b&gt;네트워크 기반&lt;/b&gt;, &lt;b&gt;스토리지 기반&lt;/b&gt; 가상화 중 최적의 방식을 선택할 수 있어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3452&quot; data-start=&quot;3437&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;3551&quot; data-start=&quot;3453&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3480&quot; data-start=&quot;3453&quot;&gt;&lt;b&gt;호스트 기반:&lt;/b&gt; 저비용, 소규모 환경&lt;/li&gt;
&lt;li data-end=&quot;3517&quot; data-start=&quot;3481&quot;&gt;&lt;b&gt;네트워크 기반:&lt;/b&gt; 대규모 확장, 이기종 스토리지 통합&lt;/li&gt;
&lt;li data-end=&quot;3551&quot; data-start=&quot;3518&quot;&gt;&lt;b&gt;스토리지 기반:&lt;/b&gt; 고성능, 고가용성, 벤더 종속&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/180</guid>
      <comments>https://geonoo.tistory.com/180#entry180comment</comments>
      <pubDate>Tue, 18 Mar 2025 13:36:36 +0900</pubDate>
    </item>
    <item>
      <title>  인터미턴트 컴퓨팅(Intermittent Computing)</title>
      <link>https://geonoo.tistory.com/179</link>
      <description>&lt;h2 data-end=&quot;182&quot; data-start=&quot;166&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;408&quot; data-start=&quot;184&quot; data-ke-size=&quot;size16&quot;&gt;사물인터넷(IoT), 웨어러블 디바이스, 센서 네트워크 등 초저전력 장치의 확산이 가속화되면서 &lt;b&gt;지속적인 전력 공급이 어려운 환경&lt;/b&gt;에서도 안정적으로 작동할 수 있는 컴퓨팅 기술이 필요해졌다. 이를 해결하기 위한 기술 중 하나가 **인터미턴트 컴퓨팅(Intermittent Computing)**이다. 본 답안에서는 인터미턴트 컴퓨팅의 개념, 동작 원리, 주요 기술, 실무 적용 방안을 분석한다.&lt;/p&gt;
&lt;hr data-end=&quot;413&quot; data-start=&quot;410&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;432&quot; data-start=&quot;415&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;489&quot; data-start=&quot;434&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 인터미턴트 컴퓨팅(Intermittent Computing)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;584&quot; data-start=&quot;491&quot; data-ke-size=&quot;size16&quot;&gt;인터미턴트 컴퓨팅은 &lt;b&gt;불안정한 전력 공급 환경에서도 동작을 유지하기 위해, 장치가 전원이 들어올 때마다 이전 상태를 복원하여 작업을 이어서 수행하는 기술&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;601&quot; data-start=&quot;586&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;827&quot; data-start=&quot;602&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;676&quot; data-start=&quot;602&quot;&gt;&lt;b&gt;불안정한 전력 공급&lt;/b&gt;: 배터리가 없거나, 에너지 하베스팅(태양광, 진동, RF 신호 등)으로 간헐적 전력이 들어오는 환경&lt;/li&gt;
&lt;li data-end=&quot;759&quot; data-start=&quot;677&quot;&gt;&lt;b&gt;작업 상태 유지&lt;/b&gt;: 전원이 끊겨도 현재 작업 상태(메모리, 레지스터 등)를 저장하고, 전력이 다시 들어오면 &lt;b&gt;중단된 위치부터 재개&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;827&quot; data-start=&quot;760&quot;&gt;&lt;b&gt;초저전력 환경 대응&lt;/b&gt;: 웨어러블, IoT 센서, 의료 기기 등 지속적인 작동이 필요한 저전력 디바이스에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;832&quot; data-start=&quot;829&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;856&quot; data-start=&quot;834&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 동작 원리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;898&quot; data-start=&quot;858&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 체크포인트 기반 상태 저장 (Checkpointing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1062&quot; data-start=&quot;899&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;899&quot;&gt;프로세스 실행 중 특정 시점(체크포인트)마다 &lt;b&gt;메모리, 레지스터, 변수 상태&lt;/b&gt;를 저장&lt;/li&gt;
&lt;li data-end=&quot;991&quot; data-start=&quot;953&quot;&gt;전력 공급이 중단되면 마지막 체크포인트 상태에서 &lt;b&gt;재시작&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1062&quot; data-start=&quot;992&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 온도 센서가 온도 데이터를 1분마다 측정하고 전송 &amp;rarr; 전원 중단 후 복구 시, 마지막 측정 상태부터 재개&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1102&quot; data-start=&quot;1064&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 분할 실행 (Task-based Execution)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1271&quot; data-start=&quot;1103&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1149&quot; data-start=&quot;1103&quot;&gt;하나의 큰 작업을 **여러 개의 작은 작업 단위(Task)**로 나눠서 처리&lt;/li&gt;
&lt;li data-end=&quot;1205&quot; data-start=&quot;1150&quot;&gt;전력 공급이 중간에 끊겨도 완료된 작은 작업은 &lt;b&gt;다시 수행하지 않고&lt;/b&gt; 다음 작업부터 진행&lt;/li&gt;
&lt;li data-end=&quot;1271&quot; data-start=&quot;1206&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 이미지 분석 작업을 픽셀 블록 단위로 분할하여, 전원이 복구되면 완료된 블록 이후부터 계속 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1296&quot; data-start=&quot;1273&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;1433&quot; data-start=&quot;1297&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1362&quot; data-start=&quot;1297&quot;&gt;전력 차단 시에도 데이터가 유지되는 &lt;b&gt;비휘발성 메모리(NVM, Non-Volatile Memory)&lt;/b&gt; 활용&lt;/li&gt;
&lt;li data-end=&quot;1433&quot; data-start=&quot;1363&quot;&gt;대표 기술: &lt;b&gt;FRAM(Ferroelectric RAM)&lt;/b&gt;, &lt;b&gt;MRAM(Magnetoresistive RAM)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1438&quot; data-start=&quot;1435&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1471&quot; data-start=&quot;1440&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 인터미턴트 컴퓨팅의 장단점&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목장점단점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2004&quot; data-start=&quot;1473&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2004&quot; data-start=&quot;1661&quot;&gt;
&lt;tr data-end=&quot;1746&quot; data-start=&quot;1661&quot;&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;/tr&gt;
&lt;tr data-end=&quot;1831&quot; data-start=&quot;1747&quot;&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;/tr&gt;
&lt;tr data-end=&quot;1915&quot; data-start=&quot;1832&quot;&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;/tr&gt;
&lt;tr data-end=&quot;2004&quot; data-start=&quot;1916&quot;&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;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2009&quot; data-start=&quot;2006&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2037&quot; data-start=&quot;2011&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 실무 적용 분야&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2060&quot; data-start=&quot;2039&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① IoT 센서 네트워크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2156&quot; data-start=&quot;2061&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2105&quot; data-start=&quot;2061&quot;&gt;태양광, 바람, 환경 에너지 수집 기반의 &lt;b&gt;배터리 없는 IoT 센서&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2156&quot; data-start=&quot;2106&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 농장 토양 센서 &amp;rarr; 에너지 하베스팅으로 작동, 데이터 중단 없이 수집&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2177&quot; data-start=&quot;2158&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;2276&quot; data-start=&quot;2178&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2218&quot; data-start=&quot;2178&quot;&gt;헬스케어 웨어러블, 스마트 워치 등 &lt;b&gt;소형 배터리 기반 장치&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2276&quot; data-start=&quot;2219&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 심박수 측정 웨어러블 &amp;rarr; 전력 부족 상황에서도 측정 중단 없이 이어서 데이터 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2298&quot; data-start=&quot;2278&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;2387&quot; data-start=&quot;2299&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2335&quot; data-start=&quot;2299&quot;&gt;&lt;b&gt;심장박동 모니터링, 혈당 센서&lt;/b&gt; 등 인체 삽입형 장치&lt;/li&gt;
&lt;li data-end=&quot;2387&quot; data-start=&quot;2336&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 전력 공급이 간헐적인 인체 센서 &amp;rarr; 데이터 손실 방지 및 지속 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2410&quot; data-start=&quot;2389&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;2501&quot; data-start=&quot;2411&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2450&quot; data-start=&quot;2411&quot;&gt;심해 탐사, 우주 탐사 기기 등 &lt;b&gt;전력 확보가 어려운 환경&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2501&quot; data-start=&quot;2451&quot;&gt;&lt;b&gt;예제:&lt;/b&gt; 화성 탐사 로봇 &amp;rarr; 태양광 불안정 시에도 데이터 수집 중단 없이 복구&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2506&quot; data-start=&quot;2503&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2525&quot; data-start=&quot;2508&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2739&quot; data-start=&quot;2527&quot; data-ke-size=&quot;size16&quot;&gt;인터미턴트 컴퓨팅은 &lt;b&gt;전력 공급이 불안정하거나 초저전력이 요구되는 환경&lt;/b&gt;에서 &lt;b&gt;중단 없는 데이터 처리와 작업 수행&lt;/b&gt;을 가능하게 하는 혁신 기술이다. 정보관리기술사로서 &lt;b&gt;IoT, 웨어러블, 의료기기, 우주탐사&lt;/b&gt; 등 다양한 분야에서 이를 적용할 수 있는 방안을 고려하고, &lt;b&gt;에너지 하베스팅, 체크포인트 저장, 비휘발성 메모리 활용&lt;/b&gt; 등 최신 기술 동향을 이해해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;2756&quot; data-start=&quot;2741&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;2940&quot; data-start=&quot;2757&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2799&quot; data-start=&quot;2757&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 전력 중단에도 상태 저장 후 복원하여 작업 이어서 수행&lt;/li&gt;
&lt;li data-end=&quot;2840&quot; data-start=&quot;2800&quot;&gt;&lt;b&gt;핵심 기술:&lt;/b&gt; 체크포인트 저장, 분할 실행, 비휘발성 메모리&lt;/li&gt;
&lt;li data-end=&quot;2887&quot; data-start=&quot;2841&quot;&gt;&lt;b&gt;주요 분야:&lt;/b&gt; IoT 센서, 웨어러블, 의료 임플란트, 극한 탐사 장치&lt;/li&gt;
&lt;li data-end=&quot;2940&quot; data-start=&quot;2888&quot;&gt;&lt;b&gt;기술사 관점:&lt;/b&gt; 초저전력 환경 대응 방안 제시, 데이터 손실 방지 설계 능력 필수&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/179</guid>
      <comments>https://geonoo.tistory.com/179#entry179comment</comments>
      <pubDate>Tue, 18 Mar 2025 12:52:30 +0900</pubDate>
    </item>
    <item>
      <title>  RIP(Routing Information Protocol)과 OSPF(Open Shortest Path First) 비교</title>
      <link>https://geonoo.tistory.com/178</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크에서는 데이터를 목적지까지 효율적으로 전달하기 위해 라우팅 프로토콜이 필요하다. 그중 대표적인 &lt;b&gt;RIP&lt;/b&gt;(Routing Information Protocol)과 &lt;b&gt;OSPF&lt;/b&gt;(Open Shortest Path First)는 내부 라우팅 프로토콜(IGP, Interior Gateway Protocol)의 핵심이다. 이 두 프로토콜은 동작 방식, 성능, 확장성 등에서 큰 차이를 보인다. 본 답안에서는 RIP과 OSPF의 개념, 동작 원리, 차이점을 분석하고, 실무 적용 방안을 제시한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 RIP (Routing Information Protocol)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 정의:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;거리 벡터(Distance Vector) 라우팅 프로토콜&lt;/li&gt;
&lt;li&gt;*홉 수(Hop Count)**를 기준으로 경로를 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최대 홉 수: 15홉 (16홉은 도달 불가로 간주)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 동작 방식:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우터는 &lt;b&gt;30초마다&lt;/b&gt; 라우팅 테이블을 인접 라우터에 &lt;b&gt;전체&lt;/b&gt; 전달&lt;/li&gt;
&lt;li&gt;목적지까지 홉 수가 가장 적은 경로를 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 장점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;구성 간편:&lt;/b&gt; 설정과 운영이 쉬움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;작은 네트워크에 적합:&lt;/b&gt; 소규모 LAN 환경에 적합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 단점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;확장성 부족:&lt;/b&gt; 홉 제한(15홉)으로 대규모 네트워크에는 부적합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;수렴 속도 느림:&lt;/b&gt; 경로 변경 시 수렴 시간이 오래 걸림 (Count to Infinity 문제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;네트워크 트래픽 부담:&lt;/b&gt; 주기적인 전체 라우팅 정보 전송으로 네트워크 부하 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 실무 적용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작은 지사망, 소규모 사무실 네트워크&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교육 목적&lt;/b&gt; (초보자용 네트워크 실습 환경)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 OSPF (Open Shortest Path First)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 정의:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;링크 상태(Link State) 라우팅 프로토콜&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dijkstra의 최단 경로 알고리즘&lt;/b&gt;을 기반으로 경로를 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 동작 방식:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우터는 **링크 상태 데이터베이스(LSDB)**를 구축하여 &lt;b&gt;토폴로지 맵&lt;/b&gt;을 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변경 사항 발생 시&lt;/b&gt;에만 업데이트 &amp;rarr; 트래픽 최소화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Area&lt;/b&gt; 개념을 도입하여 대규모 네트워크도 효율적으로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 장점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;빠른 수렴:&lt;/b&gt; 링크 상태 변화 시 바로 재계산 &amp;rarr; 다운타임 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;확장성 우수:&lt;/b&gt; Area 구성을 통해 대규모 네트워크 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;효율적인 트래픽 관리:&lt;/b&gt; 변경 사항만 전송하여 네트워크 부하 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;정밀한 경로 계산:&lt;/b&gt; 대역폭, 지연시간 등 다양한 경로 비용 고려&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 단점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;설정 복잡:&lt;/b&gt; Area, Cost 설정 등 초기 구성 복잡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;자원 소모:&lt;/b&gt; CPU, 메모리 요구량이 RIP보다 높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 실무 적용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;대규모 기업 네트워크, ISP(인터넷 서비스 제공자) 망&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 링크 상태 고려가 필요한 환경&lt;/b&gt; (예: 병원, 금융망 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 RIP vs OSPF 비교표&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;항목 RIP (Routing Information Protocol) OSPF (Open Shortest Path First)&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;거리 벡터 방식 (Hop Count 기준)&lt;/td&gt;
&lt;td&gt;링크 상태 방식 (다익스트라 알고리즘)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;메트릭 기준&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;홉 수 (최대 15홉 제한)&lt;/td&gt;
&lt;td&gt;비용(Cost: 대역폭, 지연시간 등 고려)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;수렴 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;느림 (Count to Infinity 문제 발생)&lt;/td&gt;
&lt;td&gt;빠름 (링크 상태 변경 시 즉시 반영)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;네트워크 부하&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;주기적 전체 테이블 전송 (30초마다)&lt;/td&gt;
&lt;td&gt;변경 사항만 전송 (트래픽 효율적)&lt;/td&gt;
&lt;/tr&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;대규모 네트워크에 적합 (Area 구조 지원)&lt;/td&gt;
&lt;/tr&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;복잡함 (Area, Cost 설정 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;리소스 사용량&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;낮음 (CPU, 메모리 부담 적음)&lt;/td&gt;
&lt;td&gt;높음 (메모리, CPU 부담 존재)&lt;/td&gt;
&lt;/tr&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;기업 네트워크, ISP, 대규모 데이터센터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 실무 적용 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 네트워크 규모에 따른 선택&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;소규모 네트워크:&lt;/b&gt; RIP (설정이 쉽고 유지보수 용이)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대규모 네트워크:&lt;/b&gt; OSPF (확장성과 성능 우수)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 안정성 요구에 따른 선택&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수렴 속도가 중요한 환경:&lt;/b&gt; OSPF (빠른 장애 복구 필요 시)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단순한 네트워크 환경:&lt;/b&gt; RIP (성능 요구가 낮고 간편한 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 자원 효율 고려&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU, 메모리 리소스 제한 환경:&lt;/b&gt; RIP&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자원 여유가 있는 고성능 라우터:&lt;/b&gt; OSPF&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RIP과 OSPF는 각각 장단점이 뚜렷한 라우팅 프로토콜이다. 정보관리기술사로서 네트워크 설계 시 &lt;b&gt;네트워크 규모, 수렴 속도, 자원 효율, 관리 난이도&lt;/b&gt;를 종합적으로 분석하여 적절한 프로토콜을 선택해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RIP:&lt;/b&gt; 간편하고 소규모 네트워크에 적합하지만, 수렴 속도와 확장성 한계 존재&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OSPF:&lt;/b&gt; 복잡하지만 대규모 네트워크에 적합하고, 빠른 수렴과 효율적 트래픽 관리 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 네트워크 규모와 요구사항에 따라 프로토콜 선택 전략 수립&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/178</guid>
      <comments>https://geonoo.tistory.com/178#entry178comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:47:19 +0900</pubDate>
    </item>
    <item>
      <title>  객체 간의 데이터 보호를 위한 정보은닉(Information Hiding)</title>
      <link>https://geonoo.tistory.com/177</link>
      <description>&lt;h2 data-end=&quot;194&quot; data-start=&quot;178&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;477&quot; data-start=&quot;196&quot; data-ke-size=&quot;size16&quot;&gt;네트워크에서는 데이터를 목적지까지 효율적으로 전달하기 위해 라우팅 프로토콜이 필요하다. 그중 대표적인 &lt;b&gt;RIP&lt;/b&gt;(Routing Information Protocol)과 &lt;b&gt;OSPF&lt;/b&gt;(Open Shortest Path First)는 내부 라우팅 프로토콜(IGP, Interior Gateway Protocol)의 핵심이다. 이 두 프로토콜은 동작 방식, 성능, 확장성 등에서 큰 차이를 보인다. 본 답안에서는 RIP과 OSPF의 개념, 동작 원리, 차이점을 분석하고, 실무 적용 방안을 제시한다.&lt;/p&gt;
&lt;hr data-end=&quot;482&quot; data-start=&quot;479&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;501&quot; data-start=&quot;484&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;555&quot; data-start=&quot;503&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 RIP (Routing Information Protocol)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;570&quot; data-start=&quot;557&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;679&quot; data-start=&quot;571&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;606&quot; data-start=&quot;571&quot;&gt;거리 벡터(Distance Vector) 라우팅 프로토콜&lt;/li&gt;
&lt;li data-end=&quot;642&quot; data-start=&quot;607&quot;&gt;**홉 수(Hop Count)**를 기준으로 경로를 선택&lt;/li&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;643&quot;&gt;&lt;b&gt;최대 홉 수: 15홉 (16홉은 도달 불가로 간주)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;697&quot; data-start=&quot;681&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;771&quot; data-start=&quot;698&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;743&quot; data-start=&quot;698&quot;&gt;라우터는 &lt;b&gt;30초마다&lt;/b&gt; 라우팅 테이블을 인접 라우터에 &lt;b&gt;전체&lt;/b&gt; 전달&lt;/li&gt;
&lt;li data-end=&quot;771&quot; data-start=&quot;744&quot;&gt;목적지까지 홉 수가 가장 적은 경로를 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;850&quot; data-start=&quot;773&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 장점:&lt;/b&gt;&lt;br /&gt;✔️ &lt;b&gt;구성 간편:&lt;/b&gt; 설정과 운영이 쉬움&lt;br /&gt;✔️ &lt;b&gt;작은 네트워크에 적합:&lt;/b&gt; 소규모 LAN 환경에 적합&lt;/p&gt;
&lt;p data-end=&quot;1022&quot; data-start=&quot;852&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 단점:&lt;/b&gt;&lt;br /&gt;❌ &lt;b&gt;확장성 부족:&lt;/b&gt; 홉 제한(15홉)으로 대규모 네트워크에는 부적합&lt;br /&gt;❌ &lt;b&gt;수렴 속도 느림:&lt;/b&gt; 경로 변경 시 수렴 시간이 오래 걸림 (Count to Infinity 문제)&lt;br /&gt;❌ &lt;b&gt;네트워크 트래픽 부담:&lt;/b&gt; 주기적인 전체 라우팅 정보 전송으로 네트워크 부하 발생&lt;/p&gt;
&lt;p data-end=&quot;1040&quot; data-start=&quot;1024&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;1101&quot; data-start=&quot;1041&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1041&quot;&gt;&lt;b&gt;작은 지사망, 소규모 사무실 네트워크&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1101&quot; data-start=&quot;1070&quot;&gt;&lt;b&gt;교육 목적&lt;/b&gt; (초보자용 네트워크 실습 환경)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1106&quot; data-start=&quot;1103&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1156&quot; data-start=&quot;1108&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 OSPF (Open Shortest Path First)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1158&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;1244&quot; data-start=&quot;1172&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1202&quot; data-start=&quot;1172&quot;&gt;링크 상태(Link State) 라우팅 프로토콜&lt;/li&gt;
&lt;li data-end=&quot;1244&quot; data-start=&quot;1203&quot;&gt;&lt;b&gt;Dijkstra의 최단 경로 알고리즘&lt;/b&gt;을 기반으로 경로를 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1262&quot; data-start=&quot;1246&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;1392&quot; data-start=&quot;1263&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1315&quot; data-start=&quot;1263&quot;&gt;라우터는 **링크 상태 데이터베이스(LSDB)**를 구축하여 &lt;b&gt;토폴로지 맵&lt;/b&gt;을 생성&lt;/li&gt;
&lt;li data-end=&quot;1351&quot; data-start=&quot;1316&quot;&gt;&lt;b&gt;변경 사항 발생 시&lt;/b&gt;에만 업데이트 &amp;rarr; 트래픽 최소화&lt;/li&gt;
&lt;li data-end=&quot;1392&quot; data-start=&quot;1352&quot;&gt;&lt;b&gt;Area&lt;/b&gt; 개념을 도입하여 대규모 네트워크도 효율적으로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1583&quot; data-start=&quot;1394&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 장점:&lt;/b&gt;&lt;br /&gt;✔️ &lt;b&gt;빠른 수렴:&lt;/b&gt; 링크 상태 변화 시 바로 재계산 &amp;rarr; 다운타임 최소화&lt;br /&gt;✔️ &lt;b&gt;확장성 우수:&lt;/b&gt; Area 구성을 통해 대규모 네트워크 지원&lt;br /&gt;✔️ &lt;b&gt;효율적인 트래픽 관리:&lt;/b&gt; 변경 사항만 전송하여 네트워크 부하 감소&lt;br /&gt;✔️ &lt;b&gt;정밀한 경로 계산:&lt;/b&gt; 대역폭, 지연시간 등 다양한 경로 비용 고려&lt;/p&gt;
&lt;p data-end=&quot;1676&quot; data-start=&quot;1585&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 단점:&lt;/b&gt;&lt;br /&gt;❌ &lt;b&gt;설정 복잡:&lt;/b&gt; Area, Cost 설정 등 초기 구성 복잡&lt;br /&gt;❌ &lt;b&gt;자원 소모:&lt;/b&gt; CPU, 메모리 요구량이 RIP보다 높음&lt;/p&gt;
&lt;p data-end=&quot;1694&quot; data-start=&quot;1678&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;1778&quot; data-start=&quot;1695&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1734&quot; data-start=&quot;1695&quot;&gt;&lt;b&gt;대규모 기업 네트워크, ISP(인터넷 서비스 제공자) 망&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1778&quot; data-start=&quot;1735&quot;&gt;&lt;b&gt;다양한 링크 상태 고려가 필요한 환경&lt;/b&gt; (예: 병원, 금융망 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1783&quot; data-start=&quot;1780&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1817&quot; data-start=&quot;1785&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 RIP vs OSPF 비교표&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;항목RIP (Routing Information Protocol)OSPF (Open Shortest Path First)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2617&quot; data-start=&quot;1819&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2617&quot; data-start=&quot;2004&quot;&gt;
&lt;tr data-end=&quot;2077&quot; data-start=&quot;2004&quot;&gt;
&lt;td&gt;&lt;b&gt;라우팅 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;거리 벡터 방식 (Hop Count 기준)&lt;/td&gt;
&lt;td&gt;링크 상태 방식 (다익스트라 알고리즘)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2155&quot; data-start=&quot;2078&quot;&gt;
&lt;td&gt;&lt;b&gt;메트릭 기준&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;홉 수 (최대 15홉 제한)&lt;/td&gt;
&lt;td&gt;비용(Cost: 대역폭, 지연시간 등 고려)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2233&quot; data-start=&quot;2156&quot;&gt;
&lt;td&gt;&lt;b&gt;수렴 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;느림 (Count to Infinity 문제 발생)&lt;/td&gt;
&lt;td&gt;빠름 (링크 상태 변경 시 즉시 반영)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2304&quot; data-start=&quot;2234&quot;&gt;
&lt;td&gt;&lt;b&gt;네트워크 부하&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;주기적 전체 테이블 전송 (30초마다)&lt;/td&gt;
&lt;td&gt;변경 사항만 전송 (트래픽 효율적)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2382&quot; data-start=&quot;2305&quot;&gt;
&lt;td&gt;&lt;b&gt;확장성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;소규모 네트워크에 적합&lt;/td&gt;
&lt;td&gt;대규모 네트워크에 적합 (Area 구조 지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2468&quot; data-start=&quot;2383&quot;&gt;
&lt;td&gt;&lt;b&gt;구성 난이도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;쉬움&lt;/td&gt;
&lt;td&gt;복잡함 (Area, Cost 설정 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2546&quot; data-start=&quot;2469&quot;&gt;
&lt;td&gt;&lt;b&gt;리소스 사용량&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;낮음 (CPU, 메모리 부담 적음)&lt;/td&gt;
&lt;td&gt;높음 (메모리, CPU 부담 존재)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2617&quot; data-start=&quot;2547&quot;&gt;
&lt;td&gt;&lt;b&gt;실무 적용 사례&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;소규모 사무실, 교육용 네트워크&lt;/td&gt;
&lt;td&gt;기업 네트워크, ISP, 대규모 데이터센터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2622&quot; data-start=&quot;2619&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2650&quot; data-start=&quot;2624&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 실무 적용 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2676&quot; data-start=&quot;2652&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;2751&quot; data-start=&quot;2677&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2715&quot; data-start=&quot;2677&quot;&gt;&lt;b&gt;소규모 네트워크:&lt;/b&gt; RIP (설정이 쉽고 유지보수 용이)&lt;/li&gt;
&lt;li data-end=&quot;2751&quot; data-start=&quot;2716&quot;&gt;&lt;b&gt;대규모 네트워크:&lt;/b&gt; OSPF (확장성과 성능 우수)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2776&quot; data-start=&quot;2753&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;2864&quot; data-start=&quot;2777&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2820&quot; data-start=&quot;2777&quot;&gt;&lt;b&gt;수렴 속도가 중요한 환경:&lt;/b&gt; OSPF (빠른 장애 복구 필요 시)&lt;/li&gt;
&lt;li data-end=&quot;2864&quot; data-start=&quot;2821&quot;&gt;&lt;b&gt;단순한 네트워크 환경:&lt;/b&gt; RIP (성능 요구가 낮고 간편한 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2884&quot; data-start=&quot;2866&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;2948&quot; data-start=&quot;2885&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2916&quot; data-start=&quot;2885&quot;&gt;&lt;b&gt;CPU, 메모리 리소스 제한 환경:&lt;/b&gt; RIP&lt;/li&gt;
&lt;li data-end=&quot;2948&quot; data-start=&quot;2917&quot;&gt;&lt;b&gt;자원 여유가 있는 고성능 라우터:&lt;/b&gt; OSPF&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2953&quot; data-start=&quot;2950&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2972&quot; data-start=&quot;2955&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3093&quot; data-start=&quot;2974&quot; data-ke-size=&quot;size16&quot;&gt;RIP과 OSPF는 각각 장단점이 뚜렷한 라우팅 프로토콜이다. 정보관리기술사로서 네트워크 설계 시 &lt;b&gt;네트워크 규모, 수렴 속도, 자원 효율, 관리 난이도&lt;/b&gt;를 종합적으로 분석하여 적절한 프로토콜을 선택해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3110&quot; data-start=&quot;3095&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;3266&quot; data-start=&quot;3111&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3162&quot; data-start=&quot;3111&quot;&gt;&lt;b&gt;RIP:&lt;/b&gt; 간편하고 소규모 네트워크에 적합하지만, 수렴 속도와 확장성 한계 존재&lt;/li&gt;
&lt;li data-end=&quot;3219&quot; data-start=&quot;3163&quot;&gt;&lt;b&gt;OSPF:&lt;/b&gt; 복잡하지만 대규모 네트워크에 적합하고, 빠른 수렴과 효율적 트래픽 관리 가능&lt;/li&gt;
&lt;li data-end=&quot;3266&quot; data-start=&quot;3220&quot;&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 네트워크 규모와 요구사항에 따라 프로토콜 선택 전략 수립&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/177</guid>
      <comments>https://geonoo.tistory.com/177#entry177comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:46:48 +0900</pubDate>
    </item>
    <item>
      <title>  TAM-SAM-SOM 프레임워크 - 시장 규모 추정 방법</title>
      <link>https://geonoo.tistory.com/176</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시장 분석은 새로운 사업이나 프로젝트의 성공 가능성을 판단하기 위한 필수 과정이다. 그 중 TAM-SAM-SOM 프레임워크는 시장 규모를 단계적으로 추정하여 현실적인 시장 목표를 설정하도록 돕는다. 본 답안에서는 해당 프레임워크의 정의, 각 구성 요소, 실무 적용 방안에 대해 서술한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 TAM-SAM-SOM 프레임워크 정의 및 단계별 설명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;TAM (Total Addressable Market, 총 시장 규모)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 제품이나 서비스가 진출할 수 있는 &lt;b&gt;이론상 최대 시장 규모&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;특정 지역, 산업, 고객군의 제약이 없는 전체 시장 잠재력&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 예제:&lt;/b&gt; 전 세계 온라인 음식 배달 시장 규모가 1,500억 달러라고 하면, 이 수치가 TAM이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;SAM (Serviceable Addressable Market, 접근 가능 시장)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 진출 가능한 시장 규모&lt;/li&gt;
&lt;li&gt;지역, 제품 특성, 기술적 제약, 규제 등을 고려하여 TAM에서 현실적으로 접근 가능한 시장을 추린 값&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 예제:&lt;/b&gt; 한국 내 온라인 음식 배달 시장이 100억 달러라면, 한국 시장이 해당 서비스의 SAM이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;SOM (Serviceable Obtainable Market, 확보 가능한 시장)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 우리 회사가 &lt;b&gt;경쟁력과 자원&lt;/b&gt;을 고려했을 때 차지할 수 있는 시장 점유율&lt;/li&gt;
&lt;li&gt;경쟁사, 브랜드 인지도, 가격 전략, 마케팅 역량 등을 종합 분석하여 산출&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 예제:&lt;/b&gt; 배달 서비스 초기 진입 시 서울, 경기 일부 지역에서 시장 점유율 5%를 예상한다면, 약 5억 달러가 SOM이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 실무 적용 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 시장 데이터 수집 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;산업 리서치 보고서 (Gartner, Statista, Frost &amp;amp; Sullivan 등)&lt;/li&gt;
&lt;li&gt;정부 통계 자료 및 공공 데이터 활용&lt;/li&gt;
&lt;li&gt;경쟁사 분석 및 고객 인터뷰&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 데이터 분석 기법:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TAM: 매출 기준 상향식(Bottom-up) 분석, 인구 통계 기반 분석&lt;/li&gt;
&lt;li&gt;SAM: 지역, 기술, 법적 제약 등 세분화 조건 적용&lt;/li&gt;
&lt;li&gt;SOM: SWOT 분석, 경쟁사 시장 점유율, 시장 진입 전략 평가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 시장 전략 수립:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TAM&lt;/b&gt;을 기준으로 시장 잠재력을 인식하되, &lt;b&gt;SAM&lt;/b&gt;을 중심으로 현실적인 진입 전략을 수립하고, &lt;b&gt;SOM&lt;/b&gt;을 기반으로 초기 목표 시장 점유율과 수익성을 구체화해야 한다.&lt;/li&gt;
&lt;li&gt;예를 들어, SaaS(Software as a Service) 스타트업의 경우, &lt;b&gt;TAM&lt;/b&gt;을 글로벌 시장으로 보고, &lt;b&gt;SAM&lt;/b&gt;은 특정 산업군과 지역으로 좁히며, &lt;b&gt;SOM&lt;/b&gt;은 초기 고객 확보 전략(예: 스타트업 대상 무료 제공 후 유료 전환)으로 현실적인 시장 점유율을 추정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TAM-SAM-SOM 프레임워크는 시장 분석 시 이론적 규모(TAM), 현실적 접근 가능성(SAM), 실제 확보 가능성(SOM)을 구분하여 명확하고 단계적인 시장 전략을 수립할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보관리기술사로서 프로젝트 기획 단계에서 시장 분석이 필요한 경우, 이 프레임워크를 활용하여 &lt;b&gt;사업성 평가, 투자 유치, 프로젝트 방향성 설정&lt;/b&gt;에 기여할 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TAM:&lt;/b&gt; 최대 시장 규모&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SAM:&lt;/b&gt; 실제 접근 가능 시장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SOM:&lt;/b&gt; 우리가 확보 가능한 시장&lt;/li&gt;
&lt;li&gt;실무 데이터 수집과 분석 기법을 결합하여 현실적인 시장 전략 수립&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/176</guid>
      <comments>https://geonoo.tistory.com/176#entry176comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:46:10 +0900</pubDate>
    </item>
    <item>
      <title>  정적 SQL(Static SQL)과 동적 SQL(Dynamic SQL) 비교</title>
      <link>https://geonoo.tistory.com/175</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스를 설계하고 운영할 때, SQL 쿼리는 정적 방식과 동적 방식 두 가지로 나눌 수 있다. 이를 적절히 선택하지 않으면 &lt;b&gt;성능 저하, 보안 문제, 유지보수 어려움&lt;/b&gt;이 발생할 수 있다. 본 답안에서는 정적 SQL과 동적 SQL의 개념과 차이점, 실무 적용 방안을 비교 분석한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 정적 SQL(Static SQL)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL 문장이 &lt;b&gt;컴파일 시점에 고정&lt;/b&gt;되어 실행 시 변경되지 않는 SQL.&lt;/li&gt;
&lt;li&gt;주로 &lt;b&gt;Prepared Statement&lt;/b&gt; 또는 &lt;b&gt;Stored Procedure&lt;/b&gt; 형태로 작성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;변수 값만 바뀌고 SQL 구조는 변하지 않음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컴파일 시 최적화된 실행 계획(Execution Plan)&lt;/b&gt; 생성 &amp;rarr; &lt;b&gt;성능 향상&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL Injection 공격에 강함&lt;/b&gt; (파라미터 바인딩 덕분)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT * FROM users WHERE user_id = ?;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;성능 우수:&lt;/b&gt; 미리 컴파일된 실행 계획 재사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;보안 강화:&lt;/b&gt; SQL Injection 방어 (파라미터 바인딩)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;유지보수 용이:&lt;/b&gt; 쿼리 구조가 고정되어 가독성, 유지보수성 향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;유연성 부족:&lt;/b&gt; 조건, 테이블, 컬럼이 변경되면 새로운 쿼리 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;복잡한 조건 처리 한계:&lt;/b&gt; 조건이 여러 개로 분기될 때 코드가 길어짐&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 동적 SQL(Dynamic SQL)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL 문장이 &lt;b&gt;실행 시점에 생성&lt;/b&gt;되는 SQL&lt;/li&gt;
&lt;li&gt;사용자 입력, 조건에 따라 SQL 구조 자체가 변동될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;쿼리 구조 자체를 문자열로 조합&lt;/b&gt;하여 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 조건 처리 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실행 시마다 새로운 실행 계획&lt;/b&gt;이 생성되므로 오버헤드 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;php
복사편집
$sql = &quot;SELECT * FROM users WHERE &quot; . $condition;

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;유연성 높음:&lt;/b&gt; 조건, 테이블, 컬럼 변경에 대응 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;복합 검색 지원:&lt;/b&gt; 다양한 조건, 다중 검색 쿼리에 유리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;관리 시스템, 레포트 생성 등에 적합&lt;/b&gt; (쿼리 구조가 상황에 따라 바뀔 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;성능 저하:&lt;/b&gt; 실행 계획 재사용 불가 &amp;rarr; 매번 새로운 계획 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;SQL Injection 위험:&lt;/b&gt; 입력값이 직접 삽입되면 보안 취약점 발생 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;가독성 저하:&lt;/b&gt; 복잡한 쿼리 문자열 조립 시 코드 난독화 우려&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 정적 SQL vs 동적 SQL 비교표&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;항목 정적 SQL (Static SQL) 동적 SQL (Dynamic SQL)&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;/tr&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;/tr&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;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SQL Injection&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;가독성/유지보수성&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;적용 사례&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.4 실무 적용 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 정적 SQL 추천 상황&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;반복 실행되는 동일 구조 쿼리:&lt;/b&gt; 예) 로그인, 제품 목록 조회&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트랜잭션 처리:&lt;/b&gt; 데이터 정합성 보장이 중요한 경우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안이 중요한 경우:&lt;/b&gt; 예) 사용자 인증, 민감 정보 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 동적 SQL 추천 상황&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;복합 검색 조건이 빈번한 경우:&lt;/b&gt; 예) 쇼핑몰의 상품 필터 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보고서 생성:&lt;/b&gt; 조회 조건이 수시로 바뀌는 경우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리자 기능:&lt;/b&gt; 다양한 조건에 따라 쿼리 조합이 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 보안 강화 전략 (동적 SQL일 때)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Prepared Statement 적용:&lt;/b&gt; 동적 SQL도 파라미터 바인딩 강제&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력 값 검증:&lt;/b&gt; 숫자, 문자열 타입 체크&lt;/li&gt;
&lt;li&gt;&lt;b&gt;화이트리스트 방식 적용:&lt;/b&gt; 허용된 값만 허용 (테이블/컬럼 변경 방지)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 SQL과 동적 SQL은 &lt;b&gt;유연성 vs 성능/보안&lt;/b&gt;이라는 트레이드오프 관계를 가진다. 정보관리기술사로서 설계 시 &lt;b&gt;성능 요구사항, 유지보수성, 보안성&lt;/b&gt;을 종합 고려하여 상황에 맞는 SQL 방식을 선택해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정적 SQL:&lt;/b&gt; 성능 우수, 보안 강화 &amp;rarr; 반복 조회, 트랜잭션 처리에 적합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 SQL:&lt;/b&gt; 유연성 높음 &amp;rarr; 복합 검색, 보고서 생성에 적합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 이슈 관리:&lt;/b&gt; 동적 SQL 사용 시 Prepared Statement, 입력 검증 필수&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/175</guid>
      <comments>https://geonoo.tistory.com/175#entry175comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:42:34 +0900</pubDate>
    </item>
    <item>
      <title>  이미지 데이터 어노테이션(Data Annotation) 유형과 기법</title>
      <link>https://geonoo.tistory.com/174</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝, 특히 컴퓨터 비전 모델의 성능은 &lt;b&gt;정확한 학습 데이터&lt;/b&gt;에 크게 의존한다. 이를 위해 &lt;b&gt;이미지 데이터 어노테이션(Data Annotation)&lt;/b&gt; 과정이 필요하다. 어노테이션은 이미지에 의미 있는 정보를 부여하여 **모델이 학습할 수 있도록 지도 데이터(라벨링 데이터)**를 생성하는 작업이다. 본 답안에서는 주요 어노테이션 유형과 실무 적용 기법을 설명한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 이미지 데이터 어노테이션 유형&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 분류(Classification) 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 전체에 하나의 라벨을 부여하여 &lt;b&gt;카테고리&lt;/b&gt;를 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고양이, 개, 자동차 등 분류&lt;/li&gt;
&lt;li&gt;의료 데이터에서 정상/암 진단 이미지 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 경계 상자(Bounding Box) 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 주변에 &lt;b&gt;직사각형 박스&lt;/b&gt;를 그려 위치와 크기를 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 분야:&lt;/b&gt; 객체 탐지(Object Detection), 자율주행 자동차&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt; 교차로 차량 감지, 물류창고 제품 위치 인식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 폴리곤(Polygon) 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡한 형태의 객체를 정밀하게 감싸는 다각형 영역 지정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 분야:&lt;/b&gt; 비정형 객체 감지, 의료 이미지 분석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt; 드론 촬영 이미지에서 건물 윤곽 추출, 폐암 CT 이미지 영역 감지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 키포인트(Keypoint) 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 **특정 지점(관절, 얼굴 특징 등)**에 점을 찍어 위치 정보 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 분야:&lt;/b&gt; 포즈 추정(Pose Estimation), 얼굴 인식, 행동 인식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt; 사람의 팔, 다리, 얼굴 눈/코/입 위치 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑤ 분할(Segmentation) 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 &lt;b&gt;모든 픽셀 단위&lt;/b&gt;를 구분하여 영역 할당
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;세그먼트 분류:&lt;/b&gt; 각 픽셀에 라벨 부여 (예: 배경, 사람, 차 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인스턴스 분할:&lt;/b&gt; 객체 개별 인식 (예: 사람 1, 사람 2 구분)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 분야:&lt;/b&gt; 자율주행(차선/보행자 감지), 의료 영상 분석(세포/장기 영역 분할)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;⑥ 라인(Line) &amp;amp; 스플라인(Spline) 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;곡선이나 경로를 따라 선을 그리는 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 분야:&lt;/b&gt; 도로 차선 감지, 로봇 경로 계획&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt; 자율주행차 차선 인식, 드론 비행 경로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 이미지 어노테이션 기법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 수동 어노테이션(Manual Annotation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람이 직접 이미지를 보고 라벨링 수행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; 정확도 높음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점:&lt;/b&gt; 시간과 비용이 많이 듦&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 반자동 어노테이션(Semi-Automatic Annotation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 모델이 기본 라벨링을 수행하고 사람이 검수 및 수정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt; AI가 초안 라벨링 후 사람이 다듬는 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; 속도와 정확도 균형 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 자동 어노테이션(Automatic Annotation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Pre-trained 모델&lt;/b&gt;이나 &lt;b&gt;컴퓨터 비전 알고리즘&lt;/b&gt;을 이용해 자동 라벨링 수행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제:&lt;/b&gt; YOLO 모델을 이용한 객체 탐지 후 자동 라벨링&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; 대규모 데이터 처리에 적합, 비용 절감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점:&lt;/b&gt; 라벨 정확도가 떨어질 수 있음 &amp;rarr; 검수 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 실무 적용 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 프로젝트 목적에 따른 어노테이션 유형 선택&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분류 모델 &amp;rarr; &lt;b&gt;분류 어노테이션&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;객체 탐지 &amp;rarr; &lt;b&gt;Bounding Box, Polygon&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;세밀한 이미지 분석 &amp;rarr; &lt;b&gt;Segmentation&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;행동 인식 &amp;rarr; &lt;b&gt;Keypoint&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 데이터 품질 관리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크로스 검수(Double Review) 체계 도입&lt;/li&gt;
&lt;li&gt;노이즈 라벨 제거, 품질 평가 지표(F1 Score 등) 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 어노테이션 도구 활용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상용 도구: &lt;b&gt;Labelbox, Supervisely, CVAT&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;오픈소스 도구: &lt;b&gt;LabelImg, VIA, COCO Annotator&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 데이터 증강(Data Augmentation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;회전, 확대/축소, 밝기 조정&lt;/b&gt; 등을 통해 학습 데이터 다양성 확대 &amp;rarr; 모델 성능 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 데이터 어노테이션은 &lt;b&gt;머신러닝 모델의 학습 품질을 좌우하는 핵심 작업&lt;/b&gt;이다. 목적에 맞는 어노테이션 유형과 기법을 선택하고, 데이터 품질 관리와 도구 활용을 병행해야 &lt;b&gt;정확하고 확장성 있는 학습 데이터셋&lt;/b&gt;을 구축할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;어노테이션 유형:&lt;/b&gt; 분류, Bounding Box, Polygon, Keypoint, Segmentation, Line/Spline&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기법:&lt;/b&gt; 수동, 반자동, 자동&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실무 적용:&lt;/b&gt; 목적별 유형 선택, 품질 관리, 도구 활용, 데이터 증강&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/174</guid>
      <comments>https://geonoo.tistory.com/174#entry174comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:33:08 +0900</pubDate>
    </item>
    <item>
      <title>  머신러닝 성능 지표 (Machine Learning Performance Metrics)</title>
      <link>https://geonoo.tistory.com/173</link>
      <description>&lt;h2 data-end=&quot;172&quot; data-start=&quot;156&quot; data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;173&quot; data-ke-size=&quot;size16&quot;&gt;머신러닝 모델의 성능을 객관적으로 평가하는 것은 모델 개발의 핵심 과정이다. 잘못된 지표를 사용하면 모델이 실제 문제를 제대로 해결하지 못할 위험이 있으며, 적절한 지표 선택이 성공적인 시스템 구현으로 이어진다. 본 답안에서는 주요 성능 지표와 실무 적용 방안을 정리한다.&lt;/p&gt;
&lt;hr data-end=&quot;332&quot; data-start=&quot;329&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;351&quot; data-start=&quot;334&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;385&quot; data-start=&quot;353&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 머신러닝 성능 지표의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;424&quot; data-start=&quot;387&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;분류(Classification) 모델 성능 지표&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;452&quot; data-start=&quot;426&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(1) 정확도 (Accuracy)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;495&quot; data-start=&quot;453&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;482&quot; data-start=&quot;453&quot;&gt;전체 데이터 중 모델이 올바르게 분류한 비율&lt;/li&gt;
&lt;li data-end=&quot;495&quot; data-start=&quot;483&quot;&gt;&lt;b&gt;계산식:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdWBc/btsMO05DJvW/ePJdlRnKWFyLSZitTzRT9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdWBc/btsMO05DJvW/ePJdlRnKWFyLSZitTzRT9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdWBc/btsMO05DJvW/ePJdlRnKWFyLSZitTzRT9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmdWBc%2FbtsMO05DJvW%2FePJdlRnKWFyLSZitTzRT9k%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;363&quot; height=&quot;81&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;661&quot; data-start=&quot;549&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;574&quot; data-start=&quot;549&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 직관적이고 이해하기 쉬움&lt;/li&gt;
&lt;li data-end=&quot;661&quot; data-start=&quot;575&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 데이터 불균형 상황에서는 부적절 (예: 환자 100명 중 99명이 건강하고 1명이 환자일 때, 99% 정확도가 의미가 없을 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;666&quot; data-start=&quot;663&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;668&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(2) 정밀도 (Precision)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;752&quot; data-start=&quot;696&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;739&quot; data-start=&quot;696&quot;&gt;모델이 '긍정(Positive)'이라고 예측한 것 중 실제로 맞은 비율&lt;/li&gt;
&lt;li data-end=&quot;752&quot; data-start=&quot;740&quot;&gt;&lt;b&gt;계산식:&lt;/b&gt;​&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cewzr6/btsMMCMqvE7/3tS3y2cYzrqlQtxql8NCb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cewzr6/btsMMCMqvE7/3tS3y2cYzrqlQtxql8NCb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cewzr6/btsMMCMqvE7/3tS3y2cYzrqlQtxql8NCb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcewzr6%2FbtsMMCMqvE7%2F3tS3y2cYzrqlQtxql8NCb0%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;250&quot; height=&quot;82&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;850&quot; data-start=&quot;792&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;850&quot; data-start=&quot;792&quot;&gt;&lt;b&gt;실무 예제:&lt;/b&gt; 스팸 필터에서 스팸이라고 예측한 이메일이 실제로 스팸일 확률을 측정할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;855&quot; data-start=&quot;852&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;881&quot; data-start=&quot;857&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(3) 재현율 (Recall)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;942&quot; data-start=&quot;882&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;929&quot; data-start=&quot;882&quot;&gt;실제 '긍정(Positive)'인 데이터 중 모델이 얼마나 잘 잡아냈는지 평가&lt;/li&gt;
&lt;li data-end=&quot;942&quot; data-start=&quot;930&quot;&gt;&lt;b&gt;계산식:&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1044&quot; data-start=&quot;979&quot;&gt;&lt;b&gt;실무 예제:&lt;/b&gt; 암 진단 모델에서 실제 환자를 놓치지 않는 것이 중요하므로 재현율이 더 중요한 지표가 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1049&quot; data-start=&quot;1046&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1079&quot; data-start=&quot;1051&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(4) F1 점수 (F1 Score)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1112&quot; data-start=&quot;1080&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;1080&quot;&gt;정밀도와 재현율의 조화 평균&lt;/li&gt;
&lt;li data-end=&quot;1112&quot; data-start=&quot;1100&quot;&gt;&lt;b&gt;계산식:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN2QmJ/btsMNqdpqRb/FD4YHm41WvMOP5eK8zlvy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN2QmJ/btsMNqdpqRb/FD4YHm41WvMOP5eK8zlvy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN2QmJ/btsMNqdpqRb/FD4YHm41WvMOP5eK8zlvy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN2QmJ%2FbtsMNqdpqRb%2FFD4YHm41WvMOP5eK8zlvy1%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;311&quot; height=&quot;75&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1238&quot; data-start=&quot;1186&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1238&quot; data-start=&quot;1186&quot;&gt;&lt;b&gt;실무 예제:&lt;/b&gt; 데이터 불균형 상황에서 정밀도와 재현율의 균형을 맞춰야 할 때 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1243&quot; data-start=&quot;1240&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1319&quot; data-start=&quot;1245&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(5) ROC-AUC (Receiver Operating Characteristic - Area Under Curve)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1452&quot; data-start=&quot;1320&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1344&quot; data-start=&quot;1320&quot;&gt;모델의 전체적인 성능을 평가하는 지표&lt;/li&gt;
&lt;li data-end=&quot;1374&quot; data-start=&quot;1345&quot;&gt;&lt;b&gt;AUC 값이 1에 가까울수록 좋은 모델&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1452&quot; data-start=&quot;1375&quot;&gt;&lt;b&gt;실무 예제:&lt;/b&gt; 금융 사기 탐지 모델처럼 True Positive와 False Positive를 균형 있게 판단해야 할 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1457&quot; data-start=&quot;1454&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1492&quot; data-start=&quot;1459&quot; data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;회귀(Regression) 모델 성능 지표&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1540&quot; data-start=&quot;1494&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(1) 평균 제곱 오차 (MSE, Mean Squared Error)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1594&quot; data-start=&quot;1541&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1569&quot; data-start=&quot;1541&quot;&gt;예측값과 실제값의 차이를 제곱해 평균 낸 값&lt;/li&gt;
&lt;li data-end=&quot;1594&quot; data-start=&quot;1570&quot;&gt;값이 클수록 예측 오차가 크다는 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1643&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(2) 평균 절대 오차 (MAE, Mean Absolute Error)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1675&quot; data-start=&quot;1644&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1675&quot; data-start=&quot;1644&quot;&gt;오차의 절대값을 평균 낸 값으로, 해석이 직관적임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1705&quot; data-start=&quot;1677&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;(3) 결정 계수 (R&amp;sup2; Score)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1805&quot; data-start=&quot;1706&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1747&quot; data-start=&quot;1706&quot;&gt;모델이 데이터를 얼마나 잘 설명하는지 평가 (1에 가까울수록 좋음)&lt;/li&gt;
&lt;li data-end=&quot;1805&quot; data-start=&quot;1748&quot;&gt;&lt;b&gt;실무 예제:&lt;/b&gt; 부동산 가격 예측 모델에서 가격 변동을 얼마나 잘 설명하는지 확인할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1810&quot; data-start=&quot;1807&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1837&quot; data-start=&quot;1812&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 실무 적용 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1864&quot; data-start=&quot;1839&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;1955&quot; data-start=&quot;1865&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1895&quot; data-start=&quot;1865&quot;&gt;&lt;b&gt;이진 분류:&lt;/b&gt; 정밀도, 재현율, F1 점수&lt;/li&gt;
&lt;li data-end=&quot;1927&quot; data-start=&quot;1896&quot;&gt;&lt;b&gt;불균형 데이터:&lt;/b&gt; ROC-AUC, F1 점수&lt;/li&gt;
&lt;li data-end=&quot;1955&quot; data-start=&quot;1928&quot;&gt;&lt;b&gt;회귀 모델:&lt;/b&gt; MSE, MAE, R&amp;sup2;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1981&quot; data-start=&quot;1957&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;2089&quot; data-start=&quot;1982&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2034&quot; data-start=&quot;1982&quot;&gt;&lt;b&gt;고객 이탈 예측:&lt;/b&gt; 재현율(Recall) 우선 &amp;rarr; 이탈 고객 놓치지 않는 게 중요&lt;/li&gt;
&lt;li data-end=&quot;2089&quot; data-start=&quot;2035&quot;&gt;&lt;b&gt;추천 시스템:&lt;/b&gt; 정확도(Accuracy) 우선 &amp;rarr; 추천이 잘 맞아야 사용자 경험 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2119&quot; data-start=&quot;2091&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;2204&quot; data-start=&quot;2120&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2167&quot; data-start=&quot;2120&quot;&gt;Hyperparameter 튜닝 시, 지표 변화 추적 &amp;rarr; 과적합/과소적합 방지&lt;/li&gt;
&lt;li data-end=&quot;2204&quot; data-start=&quot;2168&quot;&gt;배포 후에도 모델 성능 지속 추적 (MLOps 환경 적용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2209&quot; data-start=&quot;2206&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2228&quot; data-start=&quot;2211&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2344&quot; data-start=&quot;2229&quot; data-ke-size=&quot;size16&quot;&gt;머신러닝 모델의 성공 여부는 성능 지표를 얼마나 잘 선택하고 해석하느냐에 달려 있다. 정보관리기술사로서 데이터 기반 시스템을 설계할 때, 모델의 목적과 데이터 특성을 고려한 성능 지표 선정이 필수적이다.&lt;/p&gt;
&lt;p data-end=&quot;2361&quot; data-start=&quot;2346&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;2461&quot; data-start=&quot;2362&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2402&quot; data-start=&quot;2362&quot;&gt;분류 모델: 정확도, 정밀도, 재현율, F1 점수, ROC-AUC&lt;/li&gt;
&lt;li data-end=&quot;2426&quot; data-start=&quot;2403&quot;&gt;회귀 모델: MSE, MAE, R&amp;sup2;&lt;/li&gt;
&lt;li data-end=&quot;2461&quot; data-start=&quot;2427&quot;&gt;문제 유형과 비즈니스 목표에 맞는 지표 선택 전략 필수&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/173</guid>
      <comments>https://geonoo.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:32:26 +0900</pubDate>
    </item>
    <item>
      <title>  형상관리의 개념과 형상관리 기준선(Baseline)</title>
      <link>https://geonoo.tistory.com/172</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발 프로젝트에서는 요구사항 변경, 코드 수정, 문서 갱신 등이 지속적으로 발생한다. 이를 제대로 관리하지 않으면 프로젝트 혼란, 품질 저하, 일정 지연으로 이어질 수 있다. 이를 방지하기 위해 **형상관리(Configuration Management)**가 필요하다. 본 답안에서는 형상관리의 개념과 형상관리 기준선(Baseline)의 정의 및 실무 적용 방안을 설명한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 형상관리의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형상관리는 &lt;b&gt;소프트웨어 개발 산출물의 변경을 체계적으로 관리&lt;/b&gt;하는 활동이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 목적은 다음과 같다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항, 설계, 코드, 문서 등 산출물의 &lt;b&gt;일관성 유지&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;변경 사항의 &lt;b&gt;추적성과 가시성 확보&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;불필요한 변경 방지 및 &lt;b&gt;버전 충돌 방지&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;최종 제품의 &lt;b&gt;품질 보증&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 형상관리의 주요 활동&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 형상 식별 (Configuration Identification)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관리할 대상(코드, 문서, 실행 파일 등)을 정의하고 고유 식별자를 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 형상 통제 (Configuration Control)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 요청(요구사항 변경, 코드 수정 등)을 접수하고, 검토 및 승인 과정을 거쳐 반영 여부를 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 형상 감사 (Configuration Audit)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;산출물이 정의된 기준과 일치하는지 검증&lt;/li&gt;
&lt;li&gt;기능 감사(Functional Audit): 요구사항 충족 여부 확인&lt;/li&gt;
&lt;li&gt;물리 감사(Physical Audit): 문서, 코드, 실행 파일 등 물리적 산출물의 일관성 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;④ 형상 상태 보고 (Configuration Status Accounting)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 이력과 상태 정보를 기록 및 보고하여 추적성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.3 형상관리 기준선(Baseline)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;*형상관리 기준선(Baseline)**은 특정 시점의 산출물을 &lt;b&gt;공식 승인된 참조 지점&lt;/b&gt;으로 고정한 상태를 의미한다.&lt;/li&gt;
&lt;li&gt;이후 변경이 발생하면 반드시 &lt;b&gt;형상 통제 절차&lt;/b&gt;를 통해 관리&lt;/li&gt;
&lt;li&gt;프로젝트 진행 중 여러 기준선을 설정하여 단계별 진척을 관리할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.4 형상관리 기준선의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;기능 기준선 (Functional Baseline)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 정의 단계에서 설정되는 기준선&lt;/li&gt;
&lt;li&gt;요구사항 명세서, 인터페이스 정의서 등이 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;설계 기준선 (Design Baseline)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설계 완료 후 설정되는 기준선&lt;/li&gt;
&lt;li&gt;아키텍처 설계서, 데이터 모델, API 명세서 등이 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;제품 기준선 (Product Baseline)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발 완료 후 설정되는 기준선&lt;/li&gt;
&lt;li&gt;최종 코드, 실행 파일, 사용자 매뉴얼, 테스트 결과 보고서 등이 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.5 실무 적용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;① 형상관리 도구 활용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Git, SVN, Jenkins, Azure DevOps&lt;/b&gt; 등 형상관리 도구를 활용하여 코드와 문서 변경 사항을 통제&lt;/li&gt;
&lt;li&gt;Branch 전략 (Git Flow)으로 기능 개발, 버그 수정, 배포 관리 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;② 형상 변경 관리 프로세스 정립&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 요청 &amp;rarr; 영향 분석 &amp;rarr; 검토 및 승인 &amp;rarr; 반영 &amp;rarr; 검증 순으로 변경 절차 수립&lt;/li&gt;
&lt;li&gt;변경 승인 위원회(CCB, Configuration Control Board) 운영으로 무분별한 변경 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;③ 형상 감사 프로세스 실행&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 주요 단계마다 기준선을 기준으로 감사 진행 (예: 개발 완료 시 기능 감사 &amp;rarr; 제품 인수 시 물리 감사)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형상관리는 프로젝트 산출물의 변경 사항을 체계적으로 관리하여 &lt;b&gt;일관성, 품질, 추적성&lt;/b&gt;을 보장하는 핵심 활동이다. 특히 형상관리 기준선을 통해 &lt;b&gt;공식 참조 지점&lt;/b&gt;을 설정하고, 이후 변경을 엄격히 관리함으로써 프로젝트 성공 가능성을 높일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;형상관리:&lt;/b&gt; 변경 사항의 식별, 통제, 감사, 상태 보고로 일관성과 추적성 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;형상관리 기준선:&lt;/b&gt; 공식 승인된 참조 지점 (기능 기준선, 설계 기준선, 제품 기준선)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실무 적용:&lt;/b&gt; Git, 변경 프로세스 수립, 형상 감사 진행&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/172</guid>
      <comments>https://geonoo.tistory.com/172#entry172comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:28:53 +0900</pubDate>
    </item>
    <item>
      <title>  터크만 사다리 모델(Tuckman Ladder Model)</title>
      <link>https://geonoo.tistory.com/171</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ &lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 팀의 성과는 팀원 간의 협력과 상호작용에 크게 좌우된다. 터크만(Bruce Tuckman)은 팀의 발달 과정을 5단계로 나누어 설명하였으며, 이를 통해 팀의 성장과정과 리더십 역할을 이해할 수 있다. 본 답안에서는 터크만 사다리 모델의 각 단계별 특징과 실무 적용 방안에 대해 서술한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;2.1 터크만 사다리 모델의 5단계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;형성 단계 (Forming)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀원들이 처음 만나 서로를 탐색하는 단계&lt;/li&gt;
&lt;li&gt;역할과 책임이 불분명하고, 리더에게 의존도가 높음&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 적용:&lt;/b&gt; 프로젝트 초기 킥오프 미팅(Kick-off Meeting)에서 목표와 역할을 명확히 정의하고, WBS(Work Breakdown Structure)와 RACI Matrix(책임 할당표)를 수립해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;격동 단계 (Storming)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀원 간 갈등과 충돌이 발생하는 단계&lt;/li&gt;
&lt;li&gt;의견 불일치와 리더십 도전에 직면&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 적용:&lt;/b&gt; PMBOK의 갈등 관리 전략(회피, 수용, 타협, 협력)을 활용해 갈등을 조율하며, SCRUM의 Daily Stand-up Meeting으로 지속적인 커뮤니케이션을 유지해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;규범화 단계 (Norming)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀원들이 서로의 강점과 차이를 인정하며 협력이 강화되는 단계&lt;/li&gt;
&lt;li&gt;공동의 규칙과 절차가 정착되기 시작&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 적용:&lt;/b&gt; 팀 규칙을 명확히 문서화하고, 팀 내 성과를 공유하여 동기부여를 강화할 수 있다. OKR(Objective and Key Results)을 도입해 팀 목표를 구체화할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4️⃣ &lt;b&gt;수행 단계 (Performing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀이 성숙하여 자율적으로 문제를 해결하며, 고성과를 달성하는 단계&lt;/li&gt;
&lt;li&gt;리더의 개입이 최소화되고, 팀원들이 능동적으로 협업&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 적용:&lt;/b&gt; 애자일(Agile) 방식을 적용해 팀의 자율성을 극대화하고, Sprint Review 등을 통해 지속적인 개선 문화를 정착시켜야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5️⃣ &lt;b&gt;해산 단계 (Adjourning)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 종료 후 팀이 해체되는 단계&lt;/li&gt;
&lt;li&gt;성과 회고와 지식 공유가 이루어지는 시기&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;실무 적용:&lt;/b&gt; Retrospective Meeting(회고 회의)을 통해 팀의 성과와 문제점을 분석하고, Lessons Learned 문서를 작성하여 향후 프로젝트에 활용할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2.2 리더십의 역할과 전략&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계마다 리더십 스타일도 유연하게 변화해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;형성 단계:&lt;/b&gt; 방향 제시와 목표 공유&lt;/li&gt;
&lt;li&gt;&lt;b&gt;격동 단계:&lt;/b&gt; 중재자 및 동기 부여자 역할&lt;/li&gt;
&lt;li&gt;&lt;b&gt;규범화 단계:&lt;/b&gt; 협력 촉진 및 팀 규칙 강화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수행 단계:&lt;/b&gt; 자율성 보장 및 지원자 역할&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해산 단계:&lt;/b&gt; 성과 인정과 팀원들의 미래 준비 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터크만 사다리 모델은 팀의 성장 과정을 체계적으로 이해하고 관리할 수 있는 유용한 프레임워크다. 정보관리기술사로서 프로젝트를 성공적으로 이끌기 위해서는 각 단계에 따른 팀의 상태를 진단하고, 적절한 리더십과 관리 전략을 적용하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터크만 모델의 5단계: 형성, 격동, 규범화, 수행, 해산&lt;/li&gt;
&lt;li&gt;각 단계에 맞는 실무 적용 방안과 리더십 전략 제시&lt;/li&gt;
&lt;li&gt;정보관리기술사는 기술적 역량뿐 아니라, 팀 관리와 리더십을 통해 프로젝트 성공을 이끌어야 함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/171</guid>
      <comments>https://geonoo.tistory.com/171#entry171comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:28:09 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 게시물 검색/조회 리펙토링 하기 - Querydsl, MySQL Full Text Search</title>
      <link>https://geonoo.tistory.com/170</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 아래와 같이 작성되어있는 코드를 QueryDSL을 이용해서 분기처리를 최소화하고, MySQL Full Text Search를 적용해보려고 한다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;@Transactional
public PageBoardResponseDto getBoardList(FilterEnum filter, String keyword, Pageable pageable, String email, SubEnum sub) {
    Page&amp;lt;Board&amp;gt; boardPage;
    if(sub.equals(SubEnum.title)){
        if(Objects.equals(filter, FilterEnum.challenge)) {
            log.info(&quot;title, challenge search&quot;);
            boardPage = boardRepository.findByTitleContainingAndCategory(keyword, Category.CHALLENGE, pageable);
        } else if(Objects.equals(filter, FilterEnum.daily)) {
            log.info(&quot;title, daily search&quot;);
            boardPage = boardRepository.findByTitleContainingAndCategory(keyword, Category.DAILY, pageable);
        } else if(Objects.equals(filter, FilterEnum.my)){
            log.info(&quot;title, my search&quot;);
            User user = getUser(email);
            boardPage = boardRepository.findByTitleContainingAndUser(keyword, user, pageable);
        }else{
            log.info(&quot;title search&quot;);
            boardPage = boardRepository.findByTitleContaining(keyword, pageable);
        }
    }else if(sub.equals(SubEnum.content)){
        if(Objects.equals(filter, FilterEnum.challenge)) {
            log.info(&quot;content, challenge search&quot;);
            boardPage = boardRepository.findByContentContainingAndCategory(keyword, Category.CHALLENGE, pageable);
        } else if(Objects.equals(filter, FilterEnum.daily)) {
            log.info(&quot;content, daily search&quot;);
            boardPage = boardRepository.findByContentContainingAndCategory(keyword, Category.DAILY, pageable);
        } else if(Objects.equals(filter, FilterEnum.my)){
            log.info(&quot;content, my search&quot;);
            User user = getUser(email);
            boardPage = boardRepository.findByContentContainingAndUser(keyword, user, pageable);
        }else{
            log.info(&quot;content search&quot;);
            boardPage = boardRepository.findByContentContaining(keyword, pageable);
        }
    }else{
        if(Objects.equals(filter, FilterEnum.challenge)) {
            log.info(&quot;challenge search&quot;);
            boardPage = boardRepository.findAllByCategory(Category.CHALLENGE, pageable);
        } else if(Objects.equals(filter, FilterEnum.daily)) {
            log.info(&quot;daily search&quot;);
            boardPage = boardRepository.findAllByCategory(Category.DAILY, pageable);
        } else if(Objects.equals(filter, FilterEnum.my)){
            log.info(&quot;my search&quot;);
            User user = getUser(email);
            boardPage = boardRepository.findByUser(user, pageable);
        }else{
            log.info(&quot;search&quot;);
            boardPage = boardRepository.findAll(pageable);
        }
    }


    return new PageBoardResponseDto(
            BoardResponseDto.getDtoList(boardPage.getContent()),
            boardPage
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 첫번째 해줘야할 일은 쿼리 DSL을 사용하려면, build.gradle 셋팅을 해주어야 한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;buildscript {
    ext {
        queryDslVersion = &quot;5.0.0&quot;
    }
}

plugins {
	...
    //querydsl 추가
    id &quot;com.ewerk.gradle.plugins.querydsl&quot; version &quot;1.0.10&quot;
	...
}

...

dependencies {
    ...
    
    //querydsl 추가
    implementation &quot;com.querydsl:querydsl-jpa:${queryDslVersion}&quot;
    implementation &quot;com.querydsl:querydsl-apt:${queryDslVersion}&quot;
    
	...

}

...

def querydslDir = &quot;$buildDir/generated/querydsl&quot;

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}
sourceSets {
    main.java.srcDir querydslDir
}
compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;fetchResults() - deprecated&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCToO/btrHFQP8lir/JZQvG6CVWfCw6sKqiquxf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCToO/btrHFQP8lir/JZQvG6CVWfCw6sKqiquxf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCToO/btrHFQP8lir/JZQvG6CVWfCw6sKqiquxf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCToO%2FbtrHFQP8lir%2FJZQvG6CVWfCw6sKqiquxf0%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;481&quot; height=&quot;392&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;queryDsl의 fetchResult의 경우 count를 하기위해선 count용 쿼리를 만들어서 실행해야 하는데, 카운트를 하려는 select 쿼리를 기반으로 count 쿼리를 만들어 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;groupby having 절을 사용하는 등의 복잡한 쿼리 문에서 예외가 발생한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더불어 대부분의 dialect에서는 count쿼리가 유효하지만 JPQL에서는 아니다. 더 찾아보니 모든 dialect에서 지원하는 것도 아니라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 카운트하려면 그냥&lt;span&gt;&amp;nbsp;&lt;/span&gt;fetch()&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 쓰고 따로 자바쪽에서 count를 세거나 카운트 쿼리를 따로 작성하면 된다. fetchCount() 도 마찬가지로 fetch().size() 를 이용해서 풀어 나가야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;List&amp;lt;BoardResponseDtoV2&amp;gt; content = queryFactory.
        select(Projections.fields(BoardResponseDtoV2.class,
                board.id.as(&quot;boardId&quot;),
                board.content.as(&quot;boardContent&quot;),
                board.imageUrl,
                board.title,
                board.category,
                board.user.email.as(&quot;authorEmail&quot;),
                board.user.username.as(&quot;authorNick&quot;),
                board.user.profileImageUrl.as(&quot;authorProfileImageUrl&quot;),
                board.chatRoomId,
                board.createdDate.as(&quot;boardCreatedDate&quot;),
                Projections.constructor(BoardTodoResponseDto.class, board.boardTodo).as(&quot;todo&quot;)
                ))
        .from(board)
        .leftJoin(board.boardTodo, boardTodo)
        .leftJoin(board.user, user)
        .where(filterEq(searchCondition.getFilter(), searchCondition.getUser()))
        .offset(pageable.getOffset())
        .limit(pageable.getPageSize())
        .fetch();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[해당 오류 발생]&lt;br /&gt;&lt;/b&gt;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. as col_10_0_, boardtodo6_.id as id1_1_, boardtodo6_.created_date as created_2_' at line 1&lt;/p&gt;
&lt;pre id=&quot;code_1658240763852&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select
        board0_.id as col_0_0_,
        board0_.content as col_1_0_,
        board0_.image_url as col_2_0_,
        board0_.title as col_3_0_,
        board0_.category as col_4_0_,
        user2_.email as col_5_0_,
        user2_.username as col_6_0_,
        user2_.profile_image_url as col_7_0_,
        board0_.chat_room_id as col_8_0_,
        board0_.created_date as col_9_0_,
        . as col_10_0_,
        boardtodo6_.id as id1_1_,
        boardtodo6_.created_date as created_2_1_,
        boardtodo6_.modified_date as modified3_1_,
        boardtodo6_.board_id as board_id7_1_,
        boardtodo6_.category as category4_1_,
        boardtodo6_.content as content5_1_,
        boardtodo6_.todo_date as todo_dat6_1_ 
    from
        board board0_ 
    left outer join
        board_todo boardtodo1_ 
            on board0_.id=boardtodo1_.board_id 
    left outer join
        user user2_ 
            on board0_.user_user_seq=user2_.user_seq 
    inner join
        board_todo boardtodo6_ 
            on board0_.id=boardtodo6_.board_id limit ?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board_todo 테이블이 2번 조인을 하고 있다 왜일까...?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[원인]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;List로 조회되는  boardTodo를 Aggregation 하지 못해서&lt;span&gt; &lt;/span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;라는 불문명한 컬럼 사용&lt;/li&gt;
&lt;li&gt;board.boardTodo와&lt;span&gt;&amp;nbsp;&lt;/span&gt;.leftJoin(board.boardTodo, board)이 각각 적용되어 boardTodo에 대한 Inner Join과 Outer Join이 모두 발생했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/342&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jojoldu.tistory.com/342&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658240833068&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Querydsl 에서 OneToMany 관계에서 Left Outer Join 이 필요할 경우&quot; data-og-description=&quot;안녕하세요? 이번 시간에는 JPA와 Querydsl을 사용하실때 OneToMany 관계에서 Left Join (Outer Join) 이 필요할 경우 어떻게 하면 될지에 대해서 소개 드리겠습니다. 모든 코드는 Github에 있으니 필요시 참고&quot; data-og-host=&quot;jojoldu.tistory.com&quot; data-og-source-url=&quot;https://jojoldu.tistory.com/342&quot; data-og-url=&quot;https://jojoldu.tistory.com/342&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gKLoG/hyO8W8d7Mt/a42uvBH1po9xieiXvByTr1/img.png?width=800&amp;amp;height=208&amp;amp;face=0_0_800_208,https://scrap.kakaocdn.net/dn/gjzhP/hyO8Q70nNl/2w3yHj2IsnEblI5nbaNDiK/img.png?width=800&amp;amp;height=208&amp;amp;face=0_0_800_208,https://scrap.kakaocdn.net/dn/ckS70n/hyO8Rsj5Ou/AmQ9aynvQIzbWLcSlFUoTK/img.png?width=3216&amp;amp;height=904&amp;amp;face=0_0_3216_904&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/342&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jojoldu.tistory.com/342&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gKLoG/hyO8W8d7Mt/a42uvBH1po9xieiXvByTr1/img.png?width=800&amp;amp;height=208&amp;amp;face=0_0_800_208,https://scrap.kakaocdn.net/dn/gjzhP/hyO8Q70nNl/2w3yHj2IsnEblI5nbaNDiK/img.png?width=800&amp;amp;height=208&amp;amp;face=0_0_800_208,https://scrap.kakaocdn.net/dn/ckS70n/hyO8Rsj5Ou/AmQ9aynvQIzbWLcSlFUoTK/img.png?width=3216&amp;amp;height=904&amp;amp;face=0_0_3216_904');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Querydsl 에서 OneToMany 관계에서 Left Outer Join 이 필요할 경우&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요? 이번 시간에는 JPA와 Querydsl을 사용하실때 OneToMany 관계에서 Left Join (Outer Join) 이 필요할 경우 어떻게 하면 될지에 대해서 소개 드리겠습니다. 모든 코드는 Github에 있으니 필요시 참고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jojoldu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[해결]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;List&amp;lt;Board&amp;gt; content = queryFactory.
        selectFrom(board)
        .where(filterEq(searchCondition.getFilter(), searchCondition.getUser()))
        .offset(pageable.getOffset())
        .limit(pageable.getPageSize())
        .fetch();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 엔티티만 조회해서 boardTodo를 Lazy Loading으로 in 절로 가져오는 방식으로 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[오류 발생]&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;No enum constant com.example.backend.board.domain.Category.daily&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;[원인]&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;FilterEnum 과 Category 가 대소문자의 차이가 있어서 마지막 else 부분에서 같은 enum을 찾을 수 없었다.&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private BooleanExpression filterEq(FilterEnum filterEnum, User user) {
    if (filterEnum == null){
        return null;
    }else if(filterEnum.my.equals(filterEnum)){
        return board.user.eq(user);
    }else{
        return board.category.eq(Category.valueOf(filterEnum.name()));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[해결]&lt;br /&gt;&lt;/b&gt;그래서 아래 처럼 바꿔 주었다.&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;private BooleanExpression filterEq(FilterEnum filterEnum, User user) {
    if (filterEnum == null){
        return null;
    }else if(filterEnum.my.equals(filterEnum)){
        return board.user.eq(user);
    }else{
        return board.category.eq(Category.valueOf(filterEnum.name().toUpperCase()));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[ MYSQL 8 - FULL TEXT SEARCH SETTING ]&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. TITLE, CONTENT -&amp;gt; TEXT Type 으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 아래 쿼리로 FULLTEXT 인덱스 생성&lt;/p&gt;
&lt;pre id=&quot;code_1658250908181&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE board ADD FULLTEXT INDEX idx_board_content_title(title, content) WITH PARSER NGRAM;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;board&amp;nbsp;WHERE&amp;nbsp;MATCH(title,&amp;nbsp;content)&amp;nbsp;AGAINST(&quot;'미슐'&amp;nbsp;&quot;&amp;nbsp;in&amp;nbsp;boolean&amp;nbsp;mode);&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPM99/btrHJKugYAI/WWN7FefBVEuWT9KTycpakk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPM99/btrHJKugYAI/WWN7FefBVEuWT9KTycpakk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPM99/btrHJKugYAI/WWN7FefBVEuWT9KTycpakk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPM99%2FbtrHJKugYAI%2FWWN7FefBVEuWT9KTycpakk%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;1842&quot; height=&quot;510&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 1 글자 검색 까지 하려면, RDS 파라미터 그룹에서 해당 값 변경해주기! , 그리고 데이터베이스 재부팅!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0scdT/btrHJZLSlYh/ONTadR9UiG8YwCe0xQnVfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0scdT/btrHJZLSlYh/ONTadR9UiG8YwCe0xQnVfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0scdT/btrHJZLSlYh/ONTadR9UiG8YwCe0xQnVfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0scdT%2FbtrHJZLSlYh%2FONTadR9UiG8YwCe0xQnVfk%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;2150&quot; height=&quot;594&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.&amp;nbsp; IDX DROP 한다음 다시 생성해야함&lt;/p&gt;
&lt;pre id=&quot;code_1658253143276&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE board drop INDEX idx_board_content_title;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leRJ0/btrHK0KcI0S/myi1vUOLMb44JCvV1SN9B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leRJ0/btrHK0KcI0S/myi1vUOLMb44JCvV1SN9B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leRJ0/btrHK0KcI0S/myi1vUOLMb44JCvV1SN9B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleRJ0%2FbtrHK0KcI0S%2Fmyi1vUOLMb44JCvV1SN9B1%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;1716&quot; height=&quot;458&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 제목으로 검색과 내용으로 검색이 따로 구현되어야 하기때문에&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658253455851&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE board ADD FULLTEXT INDEX idx_board_title(title) WITH PARSER NGRAM;
ALTER TABLE board ADD FULLTEXT INDEX idx_board_content(content) WITH PARSER NGRAM;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 인덱스들도 추가!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. match 함수를 사용하기 위해 프로젝트 설정&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;spring.jpa.properties.hibernate.dialect=com.example.backend.config.MySQL8DialectCustom&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;public class MySQL8DialectCustom extends MySQL8Dialect {

    public MySQL8DialectCustom(){
        super();

        registerFunction(
                &quot;match&quot;,
                new SQLFunctionTemplate(StandardBasicTypes.DOUBLE, &quot;match(?1) against (?2 in boolean mode)&quot;)
        );
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 테스트 코드 작성!&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;@Test
    public void matchTest(){
        NumberTemplate booleanTemplate = Expressions.numberTemplate(Double.class,
                &quot;function('match',{0},{1})&quot;, board.title, &quot;+&quot; + &quot;나다&quot; + &quot;*&quot;);

        List&amp;lt;Board&amp;gt; content = queryFactory.
                select(board)
                .from(board)
                .where(booleanTemplate.gt(0))
                .fetch();

//        for (Board board1 : content) {
//            System.out.println(&quot;boardTitle = &quot; + board1.getTitle());
//            System.out.println(&quot;boardContent = &quot; + board1.getContent());
//        }

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 쿼리 확인!&lt;/p&gt;
&lt;pre id=&quot;code_1658292665559&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select
        board0_.id as id1_0_,
        board0_.created_date as created_2_0_,
        board0_.modified_date as modified3_0_,
        board0_.category as category4_0_,
        board0_.chat_room_id as chat_roo5_0_,
        board0_.content as content6_0_,
        board0_.image_url as image_ur7_0_,
        board0_.participating_count as particip8_0_,
        board0_.title as title9_0_,
        board0_.user_user_seq as user_us10_0_ 
    from
        board board0_ 
    where
        match(board0_.title) against (? in boolean mode)&amp;gt;?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 적용&lt;/p&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;private BooleanExpression keywordAndSubject(String keyword, SubEnum subEnum){
    if (subEnum == null){
        return null;
    }else if (isEmpty(keyword)){
        return null;
    }else if(subEnum.title.equals(subEnum)){
        NumberTemplate booleanTemplate = Expressions.numberTemplate(Double.class,
                &quot;function('match',{0},{1})&quot;, board.title, &quot;+&quot; + keyword + &quot;*&quot;);
        return booleanTemplate.gt(0);
    }else if(subEnum.content.equals(subEnum)){
        NumberTemplate booleanTemplate = Expressions.numberTemplate(Double.class,
                &quot;function('match',{0},{1})&quot;, board.content, &quot;+&quot; + keyword + &quot;*&quot;);
        return booleanTemplate.gt(0);
    }else{
        NumberTemplate booleanTemplate = Expressions.numberTemplate(Double.class,
                &quot;function('matchs',{0},{1},{2})&quot;, board.title, board.content, &quot;+&quot; + keyword + &quot;*&quot;);
        return booleanTemplate.gt(0);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;List&amp;lt;Board&amp;gt; content = queryFactory.
        selectFrom(board)
        .where(
                filterEq(searchCondition.getFilter(), searchCondition.getUser()),
                keywordAndSubject(searchCondition.getKeyword(), searchCondition.getSub())
        )
        .offset(pageable.getOffset())
        .limit(pageable.getPageSize())
        .fetch();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring</category>
      <category>full text</category>
      <category>MATCH</category>
      <category>mysql full text search</category>
      <category>querydsl</category>
      <category>Spring</category>
      <category>Spring-Boot</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/170</guid>
      <comments>https://geonoo.tistory.com/170#entry170comment</comments>
      <pubDate>Wed, 20 Jul 2022 15:57:59 +0900</pubDate>
    </item>
    <item>
      <title>assertThat().extracting().containsExactly() error</title>
      <link>https://geonoo.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;QueryDSL 강의를 듣는 중에 assertThat().extracting().containsExactly() 해당 코드를 작성하면 containsExactly에서 컴파일 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 시켜보면 아래와 같은 에러 메시지를 확인 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1657387482458&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java: cannot find symbol
  symbol:   method containsExactly(java.lang.String,java.lang.String)
  location: class org.assertj.core.api.AbstractObjectAssert&amp;lt;capture#1 of ?,capture#2 of ?&amp;gt;&lt;/code&gt;&lt;/pre&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;1228&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pN0Qu/btrGVkJucuW/QONd692TZnPkBhjhRKekj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pN0Qu/btrGVkJucuW/QONd692TZnPkBhjhRKekj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pN0Qu/btrGVkJucuW/QONd692TZnPkBhjhRKekj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpN0Qu%2FbtrGVkJucuW%2FQONd692TZnPkBhjhRKekj0%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;1228&quot; height=&quot;156&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&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;extracting 메소드가 단일 인자를 받지 못하는 것 같다. 강의에서는 되었었는데, 버전이 바뀌면서 단일개는 못받는 것일까?&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@CheckReturnValue
public AbstractListAssert&amp;lt;?, List&amp;lt;?&amp;gt;, Object, ObjectAssert&amp;lt;Object&amp;gt;&amp;gt; extracting(String... propertiesOrFields) {
  Tuple values = byName(propertiesOrFields).apply(actual);
  String extractedPropertiesOrFieldsDescription = extractedDescriptionOf(propertiesOrFields);
  String description = mostRelevantDescription(info.description(), extractedPropertiesOrFieldsDescription);
  return newListAssertInstance(values.toList()).withAssertionState(myself).as(description);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용하고 있는 extracting 메소드를 확인해 봤을 땐, String을 여러개 받고 있긴 하다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;assertThat(result).extracting(&quot;username&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 처럼 사용했을 때도 오류가 없어서 어떤 메소드를 사용하고 있는지 확인 해봤다.&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;@CheckReturnValue
public AbstractObjectAssert&amp;lt;?, ?&amp;gt; extracting(String propertyOrField) {
  return super.extracting(propertyOrField, this::newObjectAssert);
}&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1657388833166&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;org.assertj.core.util.introspection.IntrospectionError: 
Can't find any field or property with name 'username'.
Error when introspecting properties was :
- No getter for property 'username' in java.util.ArrayList 
Error when introspecting fields was :
- Unable to obtain the value of the field &amp;lt;'username'&amp;gt; from &amp;lt;[Member(id=3, username=member1, age=10), Member(id=4, username=member2, age=20)]&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 에러가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #202124;&quot;&gt;이름이 'username'인 필드나 속성을 찾을 수 없다는 에러인것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위 에러에서 username이 보이는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/31792&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/questions/31792&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657389530064&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;jUnit5는 extracting을 어떻게 대체하나요? - 인프런 | 질문 &amp;amp; 답변&quot; data-og-description=&quot;extracting().containsExactly()를 실행하는데 오류가 나서 대체 메소드를 찾는 중인데 잘 되지가 않네요 - 질문 &amp;amp; 답변 | 인프런...&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/31792&quot; data-og-url=&quot;https://www.inflearn.com/questions/31792&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cw3N43/hyO3nDDlJ4/q0CS31rSyFTEk6Ki8lTZ61/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464,https://scrap.kakaocdn.net/dn/bi6vHB/hyO3gYOjgp/LmEZsHXzZV1aPhRAfp46A1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/31792&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/31792&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cw3N43/hyO3nDDlJ4/q0CS31rSyFTEk6Ki8lTZ61/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464,https://scrap.kakaocdn.net/dn/bi6vHB/hyO3gYOjgp/LmEZsHXzZV1aPhRAfp46A1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;jUnit5는 extracting을 어떻게 대체하나요? - 인프런 | 질문 &amp;amp; 답변&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;extracting().containsExactly()를 실행하는데 오류가 나서 대체 메소드를 찾는 중인데 잘 되지가 않네요 - 질문 &amp;amp; 답변 | 인프런...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 문제를 겪고 있는 사람이 있었다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 방법은 아래 Assertions를 import 하면 금방 해결이 된다...&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;import static org.assertj.core.api.Assertions.*;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윽... 아까운 내시간..&lt;/p&gt;</description>
      <category>트러블 슈팅</category>
      <category>assertThat</category>
      <category>containsExactly</category>
      <category>extracting</category>
      <category>인프런</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/169</guid>
      <comments>https://geonoo.tistory.com/169#entry169comment</comments>
      <pubDate>Sun, 10 Jul 2022 03:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[WARN]firstResult/maxResults specified with collection fetch; applying in memory!</title>
      <link>https://geonoo.tistory.com/165</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;원인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;firstResult/maxResults specified with collection fetch; applying in memory!&lt;/b&gt;&lt;br /&gt;라는 경고가 떴다.&lt;br /&gt;동작에 문제는 없지만 메모리 낭비를 한다는 내용인 것 같다.&lt;br /&gt;경고를 보아 아마 fetch join 시 offset limit 을 걸어둔 것과 연관이 있는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니 위 경고가 의미하는 것은&lt;br /&gt;fetch join 과 pagination 을 같이 할 시&lt;br /&gt;&quot;모든 데이터&quot;를 전부 가져와 메모리에서 걸러낸다는 것이다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@EntityGraph(attributePaths = {&quot;user&quot;, &quot;boardTodo&quot;}, type = EntityGraph.EntityGraphType.LOAD)
Page&amp;lt;Board&amp;gt; findByTitleContainingAndCategory(String keyword, Category category, Pageable pageable);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Board와 user, boardTodo는 oneToMany 연관관계를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Board가 여러개의 BoardTodo를 가질 수 있기 때문에 Board가 중복되어서 조회된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 쿼리에서도 중복되어서 조회되는것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, 모든 데이터를 가져와서 JVM 메모리에서 페이지네이션을 하기 때문에 만약 많은 사람들이 서비스를 이용한다면 속도는 확실히 느려질 것이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;오류 해결&lt;/h4&gt;
&lt;p id=&quot;1단계-entitygraph-어노테이션-제거&quot; data-ke-size=&quot;size16&quot;&gt;1. @EntityGraph 어노테이션 제거&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;//    @EntityGraph(attributePaths = {&quot;user&quot;, &quot;boardTodo&quot;}, type = EntityGraph.EntityGraphType.LOAD)
    Page&amp;lt;Board&amp;gt; findAll(Pageable pageable);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;application.properties 수정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;spring.jpa.properties.hibernate.default_batch_fetch_size=1000&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. @BatchSize 어노테이션 적용&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@OneToMany(mappedBy = &quot;board&quot;, cascade = CascadeType.ALL)
@BatchSize(size=100)
private Set&amp;lt;BoardTodo&amp;gt; boardTodo = new LinkedHashSet&amp;lt;&amp;gt;();

@ManyToOne
@JoinColumn(nullable = false)
private User user;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용했으나, &lt;span style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;org.hibernate.LazyInitializationException 해당 오류 발생&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;이 오류는 board를 조회까지는 성공했는데, &lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;BoardTodoResponseDto.getBoardTodoList(board.getBoardTodo());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;BoardResponseDto에서 위 처럼 BoardTodoList를 호출해서 사용할 때 영속성 컨텍스트가 종료되어 버려서, 지연 로딩을 할 수 없어서 발생하는 오류라고 판단 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;JPA에서 지연로딩을 하려면 항상 영속성 컨텍스트가 있어야 하는데, 해당 메서드를 호출하기 전에 영속성 컨텍스트가 종료되어서 지연로딩을 할 수 없던 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Service의 메소드 위에 @Transactional 어노테이션을 붙여주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션은 데이터베이스 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Transactional 관련한 내용은 아래 링크를 참조했고, 나도 언제한번 제대로 정리해야겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devkingdom.tistory.com/287&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devkingdom.tistory.com/287&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657260256796&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] @Transactional 정리&quot; data-og-description=&quot;하이 .. 요즘 지속적으로 JPA 에 대해 공부를 하고 있는데 JPA를 SpringBoot에서 사용하면서 습관적으로 생각하지 않고 CREATE, UPDATE, DELETE API 메서드를 만들때 @Transactional 어노테이션을 사용하였다. 그.&quot; data-og-host=&quot;devkingdom.tistory.com&quot; data-og-source-url=&quot;https://devkingdom.tistory.com/287&quot; data-og-url=&quot;https://devkingdom.tistory.com/287&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4vETI/hyO0QgKW1j/E4y1H6tdLEKj2uHjF4jwG0/img.png?width=441&amp;amp;height=114&amp;amp;face=0_0_441_114,https://scrap.kakaocdn.net/dn/dhAb6Q/hyO1XFlVTz/6VTevJAPIcR7a2j1oO0U8k/img.png?width=441&amp;amp;height=114&amp;amp;face=0_0_441_114&quot;&gt;&lt;a href=&quot;https://devkingdom.tistory.com/287&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devkingdom.tistory.com/287&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4vETI/hyO0QgKW1j/E4y1H6tdLEKj2uHjF4jwG0/img.png?width=441&amp;amp;height=114&amp;amp;face=0_0_441_114,https://scrap.kakaocdn.net/dn/dhAb6Q/hyO1XFlVTz/6VTevJAPIcR7a2j1oO0U8k/img.png?width=441&amp;amp;height=114&amp;amp;face=0_0_441_114');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] @Transactional 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;하이 .. 요즘 지속적으로 JPA 에 대해 공부를 하고 있는데 JPA를 SpringBoot에서 사용하면서 습관적으로 생각하지 않고 CREATE, UPDATE, DELETE API 메서드를 만들때 @Transactional 어노테이션을 사용하였다. 그.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devkingdom.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>트러블 슈팅</category>
      <category>EntityGraph</category>
      <category>Transactional</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/165</guid>
      <comments>https://geonoo.tistory.com/165#entry165comment</comments>
      <pubDate>Fri, 8 Jul 2022 15:15:05 +0900</pubDate>
    </item>
    <item>
      <title>No primary or single unique constructor found for interface org.springframework.data.domain.Pageable</title>
      <link>https://geonoo.tistory.com/164</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 발생 배경&lt;/h4&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;@ApiOperation(value = &quot;전체 게시글 목록 조회&quot;)
@ApiImplicitParams({
    @ApiImplicitParam(name = &quot;filter&quot;, value = &quot;카테고리(daily/challenge/my)&quot;, required = false, dataType = &quot;string&quot;, paramType = &quot;query&quot;),
    @ApiImplicitParam(name = &quot;keyword&quot;, value = &quot;검색 키워드&quot;, required = false, dataType = &quot;string&quot;, paramType = &quot;query&quot;),
    @ApiImplicitParam(name = &quot;pageable&quot;, value = &quot;페이징 값(size, page, sort)&quot;, required = false, dataType = &quot;string&quot;, paramType = &quot;query&quot;),
    @ApiImplicitParam(name = &quot;sub&quot;, value = &quot;(제목/내용으로 검색)title/content&quot;, required = false, dataType = &quot;string&quot;, paramType = &quot;query&quot;)
})
@ApiImplicitParam(name = &quot;Authorization&quot;, value = &quot;Access Token&quot;, required = true, allowEmptyValue = false, paramType = &quot;header&quot;, dataTypeClass = String.class, example = &quot;access_token&quot;)
@GetMapping(&quot;/board&quot;)
public ResponseEntity&amp;lt;PageBoardResponseDto&amp;gt; getBoardList(
        @RequestParam(required = false) FilterEnum filter,
        @RequestParam(defaultValue = &quot;&quot;) String keyword,
        @RequestParam(required = false) SubEnum sub,
        @PageableDefault(size=10, sort=&quot;createdDate&quot;, direction= Sort.Direction.DESC) Pageable pageable
) {
    LoadUser.loginAndNickCheck();
    PageBoardResponseDto responseDto = boardService.getBoardList(
            filter, keyword, pageable, LoadUser.getEmail(), sub
    );
    return ResponseEntity.status(HttpStatus.OK).body(responseDto);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 게시글 목록과 검색을 같이하는 API를 작성중에,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;No&amp;nbsp;primary&amp;nbsp;or&amp;nbsp;single&amp;nbsp;unique&amp;nbsp;constructor&amp;nbsp;found&amp;nbsp;for&amp;nbsp;interface&amp;nbsp;org.springframework.data.domain.Pageable&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 오류가 발생했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;발생원인파악&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/52355490/no-primary-or-default-constructor-found-for-interface-org-springframework-data-d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/52355490/no-primary-or-default-constructor-found-for-interface-org-springframework-data-d&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657253043244&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;No primary or default constructor found for interface org.springframework.data.domain.Pageable&quot; data-og-description=&quot;I was trying to implement Pageable in my RestController and running into issues with this error message &amp;quot;No primary or default constructor found for interface org.springframework.data.domain.Pageab...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/52355490/no-primary-or-default-constructor-found-for-interface-org-springframework-data-d&quot; data-og-url=&quot;https://stackoverflow.com/questions/52355490/no-primary-or-default-constructor-found-for-interface-org-springframework-data-d&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cIatd0/hyO17nAnlj/RVmOsx5WClOcWYNls5pcI1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/52355490/no-primary-or-default-constructor-found-for-interface-org-springframework-data-d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/52355490/no-primary-or-default-constructor-found-for-interface-org-springframework-data-d&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cIatd0/hyO17nAnlj/RVmOsx5WClOcWYNls5pcI1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;No primary or default constructor found for interface org.springframework.data.domain.Pageable&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I was trying to implement Pageable in my RestController and running into issues with this error message &quot;No primary or default constructor found for interface org.springframework.data.domain.Pageab...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swagger config 클래스에 Pageable 을 파라미터로 받을 수 있게 설정해야한다는 내용이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 해당 페이지에서 나온데로 Swagger config에 아래 메소드를 추가해 주었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;오류 해결&lt;/h4&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;@Override
public void addArgumentResolvers(List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers) {
    argumentResolvers.add( new PageableHandlerMethodArgumentResolver());
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>트러블 슈팅</category>
      <category>Spring</category>
      <category>Swagger</category>
      <category>트러블슈팅</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/164</guid>
      <comments>https://geonoo.tistory.com/164#entry164comment</comments>
      <pubDate>Fri, 8 Jul 2022 13:08:54 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot OAuth2.0 적용기</title>
      <link>https://geonoo.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트가 진행되고 일주일이 지나서야 블로그를 적을 시간이 났다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내가 맡은 기능은 로그인/회원가입, 소셜 로그인/회원가입 기능을 맡았다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z7nOx/btrGjbAp6ml/J3147b2Q33V2XUkHHAU871/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z7nOx/btrGjbAp6ml/J3147b2Q33V2XUkHHAU871/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z7nOx/btrGjbAp6ml/J3147b2Q33V2XUkHHAU871/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz7nOx%2FbtrGjbAp6ml%2FJ3147b2Q33V2XUkHHAU871%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;634&quot; height=&quot;1018&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;많은 구글페이지를 찾아봤지만, 아래만한 곳이 없었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://deeplify.dev/back-end/spring/oauth2-social-login#%EC%A0%84%EC%B2%B4-%EC%8B%9C%ED%80%80%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://deeplify.dev/back-end/spring/oauth2-social-login#%EC%A0%84%EC%B2%B4-%EC%8B%9C%ED%80%80%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656784276965&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] OAuth2 소셜 로그인 가이드 (구글, 페이스북, 네이버, 카카오)&quot; data-og-description=&quot;스프링부트를 이용하여 구글, 페이스북, 네이버, 카카오 OAuth2 로그인 구현하는 방법에 대해서 소개합니다.&quot; data-og-host=&quot;deeplify.dev&quot; data-og-source-url=&quot;https://deeplify.dev/back-end/spring/oauth2-social-login#%EC%A0%84%EC%B2%B4-%EC%8B%9C%ED%80%80%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8&quot; data-og-url=&quot;https://deeplify.dev/back-end/spring/oauth2-social-login&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ce6mel/hyOYgLPpEN/eYGd428ghKXq3ifVrl86G1/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300,https://scrap.kakaocdn.net/dn/dnsuX4/hyOYqVdyxM/fdz2qEvK22oxowIVodshTK/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300&quot;&gt;&lt;a href=&quot;https://deeplify.dev/back-end/spring/oauth2-social-login#%EC%A0%84%EC%B2%B4-%EC%8B%9C%ED%80%80%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://deeplify.dev/back-end/spring/oauth2-social-login#%EC%A0%84%EC%B2%B4-%EC%8B%9C%ED%80%80%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ce6mel/hyOYgLPpEN/eYGd428ghKXq3ifVrl86G1/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300,https://scrap.kakaocdn.net/dn/dnsuX4/hyOYqVdyxM/fdz2qEvK22oxowIVodshTK/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring Boot] OAuth2 소셜 로그인 가이드 (구글, 페이스북, 네이버, 카카오)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링부트를 이용하여 구글, 페이스북, 네이버, 카카오 OAuth2 로그인 구현하는 방법에 대해서 소개합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;deeplify.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 블로그를 클론 코딩한 Git 레포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/geonoo/Oauth2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/geonoo/Oauth2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656899102183&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - geonoo/Oauth2: oauth2.0 적용기&quot; data-og-description=&quot;oauth2.0 적용기. Contribute to geonoo/Oauth2 development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/geonoo/Oauth2&quot; data-og-url=&quot;https://github.com/geonoo/Oauth2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YR5Zi/hyOYjiBFcO/SL7kiuu7quJM02jVkvtCp1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/geonoo/Oauth2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/geonoo/Oauth2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YR5Zi/hyOYjiBFcO/SL7kiuu7quJM02jVkvtCp1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - geonoo/Oauth2: oauth2.0 적용기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;oauth2.0 적용기. Contribute to geonoo/Oauth2 development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 코드는 git에서 확인할 수 있습니다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JIGRv/btrGnX91OuB/rEqvpQ0FFE8nhTqTCKqOz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JIGRv/btrGnX91OuB/rEqvpQ0FFE8nhTqTCKqOz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JIGRv/btrGnX91OuB/rEqvpQ0FFE8nhTqTCKqOz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJIGRv%2FbtrGnX91OuB%2FrEqvpQ0FFE8nhTqTCKqOz0%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;584&quot; height=&quot;376&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 사용자가 소셜 로그인 버튼 클릭!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blctpi/btrGkejtIRU/xaYmHlc6G5Og4idMkNbTbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blctpi/btrGkejtIRU/xaYmHlc6G5Og4idMkNbTbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blctpi/btrGkejtIRU/xaYmHlc6G5Og4idMkNbTbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblctpi%2FbtrGkejtIRU%2FxaYmHlc6G5Og4idMkNbTbK%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;402&quot; height=&quot;350&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://localhost:8080/oauth2/authorization/{provider-id}?redirect_uri=http://localhost:3000&lt;/li&gt;
&lt;li&gt;위 URL로 버튼 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #000000;&quot;&gt;Redirect : Authorization Code Request with Back-End Redirect Url&lt;br /&gt;&amp;nbsp; &amp;nbsp; 리다이렉트와&amp;nbsp; 인가코드를 요청한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 소셜로그인 할 수 있는 Redirect Url과 인 코드를 반환해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 소셜로그인을 할 수 있는 로그인 페이지를 제공해준다. ( 해당 로그인 페이지는 카카오, 구글, 네이버에서 열리는 페이지이다. )&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-04 오전 11.55.29.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pt9uI/btrGlgCvuh2/PNAvvFIrHsAxmQw4L1tg30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pt9uI/btrGlgCvuh2/PNAvvFIrHsAxmQw4L1tg30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pt9uI/btrGlgCvuh2/PNAvvFIrHsAxmQw4L1tg30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpt9uI%2FbtrGlgCvuh2%2FPNAvvFIrHsAxmQw4L1tg30%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;297&quot; height=&quot;437&quot; data-filename=&quot;스크린샷 2022-07-04 오전 11.55.29.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오라면 이러한 페이지를 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Neaz1/btrGnV5uCdn/f6Gqk84HIRniKryLCm5WfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Neaz1/btrGnV5uCdn/f6Gqk84HIRniKryLCm5WfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Neaz1/btrGnV5uCdn/f6Gqk84HIRniKryLCm5WfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNeaz1%2FbtrGnV5uCdn%2Ff6Gqk84HIRniKryLCm5WfK%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;553&quot; height=&quot;746&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 사용자는 로그인 및 동의를 진행하면 소셜 인가서버로 내용이 전달이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 소셜 인가서버에서는 인가 코드를 반환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 받은 인가코드와 함께 Access-Token을 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Access-Token을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Access-Token와 함께 사용자 정보를 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 사용자 정보를 받는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Back-End 서버에서는 받은 유저정보를 DB에 저장한다.&lt;/li&gt;
&lt;li&gt;JWT 토큰과 Refresh 토큰을 만든다.&lt;/li&gt;
&lt;li&gt;Refresh토큰을 DB에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/59IjC/btrGnXhUWz8/NYscWN2rhVUvZRm4eWq5LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/59IjC/btrGnXhUWz8/NYscWN2rhVUvZRm4eWq5LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/59IjC/btrGnXhUWz8/NYscWN2rhVUvZRm4eWq5LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F59IjC%2FbtrGnXhUWz8%2FNYscWN2rhVUvZRm4eWq5LK%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;366&quot; height=&quot;384&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 마지막으로 다시 프론트로 Redirect 시키면서 만들었던 토큰들도 반환해준다. Refresh토큰을 쿠키에 넣고, JWT토큰은 URL 파라미터로 주는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방식이 얼추 이해가 된다면 아래 전체 프로세스를 봤을때, 이해가 될 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;springboot-oauth.jpeg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi3V9r/btrGsnGJx0h/chKOOqj2k7EM1hQUsuajx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi3V9r/btrGsnGJx0h/chKOOqj2k7EM1hQUsuajx0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi3V9r/btrGsnGJx0h/chKOOqj2k7EM1hQUsuajx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi3V9r%2FbtrGsnGJx0h%2FchKOOqj2k7EM1hQUsuajx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;942&quot; data-filename=&quot;springboot-oauth.jpeg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&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;1. 구글 정보는 전부 받아지는데, 카카오, 네이버는 User정보를 보내주는 형식이 달라서 Json을 읽어주는 곳을 수정해야했다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class GoogleOAuth2UserInfo extends OAuth2UserInfo {

    public GoogleOAuth2UserInfo(Map&amp;lt;String, Object&amp;gt; attributes) {
        super(attributes);
    }

    @Override
    public String getId() {
        return (String) attributes.get(&quot;sub&quot;);
    }

    @Override
    public String getName() {
        return (String) attributes.get(&quot;name&quot;);
    }

    @Override
    public String getEmail() {
        return (String) attributes.get(&quot;email&quot;);
    }

    @Override
    public String getImageUrl() {
        return (String) attributes.get(&quot;picture&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class KakaoOAuth2UserInfo extends OAuth2UserInfo {

    public KakaoOAuth2UserInfo(Map&amp;lt;String, Object&amp;gt; attributes) {
        super(attributes);
    }

    @Override
    public String getId() {
        return attributes.get(&quot;id&quot;).toString();
    }

    @Override
    public String getName() {
        Map&amp;lt;String, Object&amp;gt; properties = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;properties&quot;);

        if (properties == null) {
            return null;
        }

        return (String) properties.get(&quot;nickname&quot;);
    }

    @Override
    public String getEmail() {
        Map&amp;lt;String, Object&amp;gt; kakaoAccount = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;kakao_account&quot;);
        return (String) kakaoAccount.get(&quot;email&quot;);
    }

    @Override
    public String getImageUrl() {
        Map&amp;lt;String, Object&amp;gt; properties = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;properties&quot;);

        if (properties == null) {
            return null;
        }

        return (String) properties.get(&quot;thumbnail_image&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class NaverOAuth2UserInfo extends OAuth2UserInfo {

    public NaverOAuth2UserInfo(Map&amp;lt;String, Object&amp;gt; attributes) {
        super(attributes);
    }

    @Override
    public String getId() {
        Map&amp;lt;String, Object&amp;gt; response = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;response&quot;);

        if (response == null) {
            return null;
        }

        return (String) response.get(&quot;id&quot;);
    }

    @Override
    public String getName() {
        Map&amp;lt;String, Object&amp;gt; response = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;response&quot;);

        if (response == null) {
            return null;
        }

        return (String) response.get(&quot;name&quot;);
    }

    @Override
    public String getEmail() {
        Map&amp;lt;String, Object&amp;gt; response = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;response&quot;);

        if (response == null) {
            return null;
        }

        return (String) response.get(&quot;email&quot;);
    }

    @Override
    public String getImageUrl() {
        Map&amp;lt;String, Object&amp;gt; response = (Map&amp;lt;String, Object&amp;gt;) attributes.get(&quot;response&quot;);

        if (response == null) {
            return null;
        }

        return (String) response.get(&quot;profile_image&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 우리 사이트에서 Email인증을 통해 가입한 유저가 만약 소셜로그인을 하려고 한다면, 같은 이메일 주소라면 바로 소셜로그인이 될 수 있게 하는 로직도 필요했다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
@Slf4j
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

    private final UserRepository userRepository;

    @Override
    @Transactional
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User user = super.loadUser(userRequest);

        try {
            return this.process(userRequest, user);
        } catch (AuthenticationException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new InternalAuthenticationServiceException(ex.getMessage(), ex.getCause());
        }
    }

    private OAuth2User process(OAuth2UserRequest userRequest, OAuth2User user) {
        ProviderType providerType = ProviderType.valueOf(userRequest.getClientRegistration().getRegistrationId().toUpperCase());

        OAuth2UserInfo userInfo = OAuth2UserInfoFactory.getOAuth2UserInfo(providerType, user.getAttributes());
        User savedUser = userRepository.findByUserId(userInfo.getId());
        //이미 가입된 회원
        if (savedUser != null) {
            if (providerType != savedUser.getProviderType()) {
                throw new OAuthProviderMissMatchException(
                        &quot;Looks like you're signed up with &quot; + providerType +
                                &quot; account. Please use your &quot; + savedUser.getProviderType() + &quot; account to login.&quot;
                );
            }
        } else {
            //이미 로컬로 가입한 회원
            Optional&amp;lt;User&amp;gt; optionalUser = userRepository.findByEmail(userInfo.getEmail());
            if (optionalUser.isPresent()) {
                //소셜로그인 할 수 있게 변경
                savedUser = optionalUser.get();
                savedUser.updateSocialId(userInfo.getId(), providerType);
            }else{
                //최초 가입
                savedUser = createUser(userInfo, providerType);
            }
        }

        return UserPrincipal.create(savedUser, user.getAttributes());
    }

    private User createUser(OAuth2UserInfo userInfo, ProviderType providerType) {
        User user = new User(
                userInfo.getId(),
                userInfo.getEmail(),
                &quot;Y&quot;,
                userInfo.getImageUrl(),
                providerType,
                RoleType.USER
        );
        log.info(&quot;before saveAndFlush&quot;);
        return userRepository.saveAndFlush(user);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. OAuth2AuthenticationSuccessHandler에서 jwt토큰과 refresh토큰을 함께 보내주는 방식을 선택했다. 또한 가입한 유저의 닉네임은 우리 서비스에서 중복을 허용되면 안되기 때문에, 닉네임을 입력할 수 있게 구분해주는 flag를 보내주었다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        Optional&amp;lt;String&amp;gt; redirectUri = CookieUtil.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME)
                .map(Cookie::getValue);

        if(redirectUri.isPresent() &amp;amp;&amp;amp; !isAuthorizedRedirectUri(redirectUri.get())) {
            throw new IllegalArgumentException(&quot;Sorry! We've got an Unauthorized Redirect URI and can't proceed with the authentication&quot;);
        }

        String targetUrl = redirectUri.orElse(getDefaultTargetUrl());

        OAuth2AuthenticationToken authToken = (OAuth2AuthenticationToken) authentication;
        ProviderType providerType = ProviderType.valueOf(authToken.getAuthorizedClientRegistrationId().toUpperCase());

        OidcUser user = ((OidcUser) authentication.getPrincipal());
        OAuth2UserInfo userInfo = OAuth2UserInfoFactory.getOAuth2UserInfo(providerType, user.getAttributes());
        if (userInfo.getEmail() == null){
            throw new CustomException(ErrorCode.NEED_EMAIL);
        }
        Collection&amp;lt;? extends GrantedAuthority&amp;gt; authorities = ((OidcUser) authentication.getPrincipal()).getAuthorities();

        RoleType roleType = hasAuthority(authorities, RoleType.ADMIN.getCode()) ? RoleType.ADMIN : RoleType.USER;

        String username = userRepository.findByUserId(userInfo.getId()).getUsername();

        Date now = new Date();
        AuthToken accessToken = tokenProvider.createAuthToken(
                userInfo.getEmail(),
                roleType.getCode(),
                username,
                new Date(now.getTime() + appProperties.getAuth().getTokenExpiry())
        );

        // refresh 토큰 설정
        long refreshTokenExpiry = appProperties.getAuth().getRefreshTokenExpiry();

        AuthToken refreshToken = tokenProvider.createAuthToken(
                appProperties.getAuth().getTokenSecret(),
                new Date(now.getTime() + refreshTokenExpiry)
        );

        // DB 저장
        UserRefreshToken userRefreshToken = userRefreshTokenRepository.findByEmail(userInfo.getEmail());
        if (userRefreshToken != null) {
            userRefreshToken.setRefreshToken(refreshToken.getToken());
        } else {
            userRefreshToken = new UserRefreshToken(userInfo.getEmail(), refreshToken.getToken());
            userRefreshTokenRepository.saveAndFlush(userRefreshToken);
        }

//        쿠키에 넣지 않고 파라미터로 넘겨주는 방식으로 변경
        String nickCheck = (username == null) ? &quot;N&quot; : &quot;Y&quot;;
        return UriComponentsBuilder.fromUriString(targetUrl)
                .queryParam(&quot;access&quot;, accessToken.getToken())
                .queryParam(&quot;refresh&quot;, refreshToken.getToken())
                .queryParam(&quot;nick&quot;, nickCheck)
                .build().toUriString();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 예전방식의 카카오 로그인으로 구현했다가, 해당 소스를 보고 작성했던 카카오 로그인은 걷어 내게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 삽질이 없었으면 조금더 빨리 구현할 수 있지 않았을까 라고 생각하지만, 처음 삽질이 있어서 이 로직을 이해하는데, 어느정도 도움이 되었다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 시작하고 벌써 일주일이 지났다. 앞으로도 이러한 문제들을 해결하면서 꾸준히 작성해 나가야겠다.&lt;/p&gt;</description>
      <category>Spring</category>
      <category>oauth2</category>
      <category>spring boot</category>
      <category>구글</category>
      <category>네이버</category>
      <category>로그인</category>
      <category>소셜 로그인</category>
      <category>카카오</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/163</guid>
      <comments>https://geonoo.tistory.com/163#entry163comment</comments>
      <pubDate>Mon, 4 Jul 2022 12:54:09 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot - Github Action, S3, EC2, CodeDeploy 연동</title>
      <link>https://geonoo.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Github Action을 이용해서 Spring Boot(Gradle) 웹 어플리케이션을 자동으로 빌드해주는 과적을 작성하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 build를 하고, 빌드된 jar파일을 EC2 서버에 접근해서 올리는 번거로운 작업이 사라지게 되어서 개발에만 집중할 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBCGB/btrFzNmbwAR/roFSU19mpzgDfwNktBaBEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBCGB/btrFzNmbwAR/roFSU19mpzgDfwNktBaBEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBCGB/btrFzNmbwAR/roFSU19mpzgDfwNktBaBEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBCGB%2FbtrFzNmbwAR%2FroFSU19mpzgDfwNktBaBEK%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;697&quot; height=&quot;422&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;738&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;h4 data-ke-size=&quot;size20&quot;&gt;[S3 버킷 만들기]&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Di4Mx/btrFvZHM4iH/Rk8JmgNKvK73nQ2mECep60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Di4Mx/btrFvZHM4iH/Rk8JmgNKvK73nQ2mECep60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Di4Mx/btrFvZHM4iH/Rk8JmgNKvK73nQ2mECep60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDi4Mx%2FbtrFvZHM4iH%2FRk8JmgNKvK73nQ2mECep60%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;629&quot; height=&quot;896&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTgRT7/btrFyQKwcr1/9a93vsoECSIZvMik5wfzSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTgRT7/btrFyQKwcr1/9a93vsoECSIZvMik5wfzSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTgRT7/btrFyQKwcr1/9a93vsoECSIZvMik5wfzSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTgRT7%2FbtrFyQKwcr1%2F9a93vsoECSIZvMik5wfzSK%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;627&quot; height=&quot;910&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이름만 정하고 나머지는 기본 설정값으로 만들기&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[AWS IAM 사용자 만들기] - 권한추가하기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5tkzy/btrFvZVmjl4/wuKMFtSEBJ4KOhfjZWiUFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5tkzy/btrFvZVmjl4/wuKMFtSEBJ4KOhfjZWiUFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5tkzy/btrFvZVmjl4/wuKMFtSEBJ4KOhfjZWiUFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5tkzy%2FbtrFvZVmjl4%2FwuKMFtSEBJ4KOhfjZWiUFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;1070&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AmazonS3FullAccess&lt;br /&gt;AWSCodeDeployFullAccess&lt;br /&gt;AWSCodeDeployRole&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;권한 위에 3개 추가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babC6K/btrFycfWYjm/q4DmyTxQv5K8OGkWmXJnJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babC6K/btrFycfWYjm/q4DmyTxQv5K8OGkWmXJnJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babC6K/btrFycfWYjm/q4DmyTxQv5K8OGkWmXJnJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbabC6K%2FbtrFycfWYjm%2Fq4DmyTxQv5K8OGkWmXJnJ1%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;692&quot; height=&quot;1102&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-23 오후 3.00.34.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTb8YI/btrFzxxabgR/d1vddUYTkFCuPY8I1KuzpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTb8YI/btrFzxxabgR/d1vddUYTkFCuPY8I1KuzpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTb8YI/btrFzxxabgR/d1vddUYTkFCuPY8I1KuzpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTb8YI%2FbtrFzxxabgR%2Fd1vddUYTkFCuPY8I1KuzpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;822&quot; data-filename=&quot;스크린샷 2022-06-23 오후 3.00.34.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;키 잘 저장해 놓기&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[AWS IAM 역할 만들기]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. CodeDeploy 용 역할&lt;/b&gt;&lt;br /&gt;&lt;span&gt;AWSCodeDeployRole&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2220&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q2gfw/btrFzv7cJY2/Z0AjtGCjjuKSUNRcGZM0n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q2gfw/btrFzv7cJY2/Z0AjtGCjjuKSUNRcGZM0n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q2gfw/btrFzv7cJY2/Z0AjtGCjjuKSUNRcGZM0n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ2gfw%2FbtrFzv7cJY2%2FZ0AjtGCjjuKSUNRcGZM0n1%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;2220&quot; height=&quot;778&quot; data-origin-width=&quot;2220&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv5Oya/btrFz4H0BHf/UU2KJJoqcZAdV26WVLmU51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv5Oya/btrFz4H0BHf/UU2KJJoqcZAdV26WVLmU51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv5Oya/btrFz4H0BHf/UU2KJJoqcZAdV26WVLmU51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv5Oya%2FbtrFz4H0BHf%2FUU2KJJoqcZAdV26WVLmU51%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;2084&quot; height=&quot;920&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2iHs/btrFzxKISlE/XEcNl8Wbm1TT5prHXABsik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2iHs/btrFzxKISlE/XEcNl8Wbm1TT5prHXABsik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2iHs/btrFzxKISlE/XEcNl8Wbm1TT5prHXABsik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2iHs%2FbtrFzxKISlE%2FXEcNl8Wbm1TT5prHXABsik%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;678&quot; height=&quot;844&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;2. EC2 용 역할&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vtNuI/btrFyLI8Koe/4lAlJwuVlNZeEofbsIRfT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vtNuI/btrFyLI8Koe/4lAlJwuVlNZeEofbsIRfT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vtNuI/btrFyLI8Koe/4lAlJwuVlNZeEofbsIRfT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvtNuI%2FbtrFyLI8Koe%2F4lAlJwuVlNZeEofbsIRfT0%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;612&quot; height=&quot;998&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AmazonS3FullAccess&lt;br /&gt;AWSCodeDeployFullAccess&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G3P2F/btrFz4nKYLR/WAd1YftQV04JaFUVXkBBck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G3P2F/btrFz4nKYLR/WAd1YftQV04JaFUVXkBBck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G3P2F/btrFz4nKYLR/WAd1YftQV04JaFUVXkBBck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG3P2F%2FbtrFz4nKYLR%2FWAd1YftQV04JaFUVXkBBck%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;631&quot; height=&quot;484&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2개 만들기 완료!&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;1188&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yej8D/btrFzFaRzZJ/GHt6ugaSFrN4j4EhZSkdJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yej8D/btrFzFaRzZJ/GHt6ugaSFrN4j4EhZSkdJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yej8D/btrFzFaRzZJ/GHt6ugaSFrN4j4EhZSkdJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyej8D%2FbtrFzFaRzZJ%2FGHt6ugaSFrN4j4EhZSkdJ0%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;1188&quot; height=&quot;164&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[ EC2 생성 / 설정]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우분투 서버 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbQWmV/btrFyRW2A0h/KEWIdjrGB4K8ei0O4htjb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbQWmV/btrFyRW2A0h/KEWIdjrGB4K8ei0O4htjb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbQWmV/btrFyRW2A0h/KEWIdjrGB4K8ei0O4htjb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbQWmV%2FbtrFyRW2A0h%2FKEWIdjrGB4K8ei0O4htjb1%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;723&quot; height=&quot;984&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보안 규칙 변경&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Irmd7/btrFvWdX98b/KAymrWMWMA8gv3XGCPbMhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Irmd7/btrFvWdX98b/KAymrWMWMA8gv3XGCPbMhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Irmd7/btrFvWdX98b/KAymrWMWMA8gv3XGCPbMhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIrmd7%2FbtrFvWdX98b%2FKAymrWMWMA8gv3XGCPbMhk%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;706&quot; height=&quot;279&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IAM 역할 수정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl6Fi0/btrFxi1YlyP/4zxbJUnkl8JoRukFBSKJxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl6Fi0/btrFxi1YlyP/4zxbJUnkl8JoRukFBSKJxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl6Fi0/btrFxi1YlyP/4zxbJUnkl8JoRukFBSKJxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl6Fi0%2FbtrFxi1YlyP%2F4zxbJUnkl8JoRukFBSKJxk%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;644&quot; height=&quot;870&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위에서 만들었던 EC2용 역할 추가&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;1766&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2cvXu/btrFz4g2Tq6/nYWoppXGTmjIGJKTUZcUU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2cvXu/btrFz4g2Tq6/nYWoppXGTmjIGJKTUZcUU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2cvXu/btrFz4g2Tq6/nYWoppXGTmjIGJKTUZcUU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2cvXu%2FbtrFz4g2Tq6%2FnYWoppXGTmjIGJKTUZcUU1%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;1766&quot; height=&quot;798&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EC2 인스턴스 식별을 위한 태그 추가&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;1722&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXj7H/btrFyctCmcd/ULnI2TUdwV4siIwf7o8Wek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXj7H/btrFyctCmcd/ULnI2TUdwV4siIwf7o8Wek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXj7H/btrFyctCmcd/ULnI2TUdwV4siIwf7o8Wek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXj7H%2FbtrFyctCmcd%2FULnI2TUdwV4siIwf7o8Wek%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;1722&quot; height=&quot;792&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[AWS codeDeploy 만들기]&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsGIhh/btrFAi7bLdp/eipxTuzKQcs0SmqKAKdUbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsGIhh/btrFAi7bLdp/eipxTuzKQcs0SmqKAKdUbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsGIhh/btrFAi7bLdp/eipxTuzKQcs0SmqKAKdUbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsGIhh%2FbtrFAi7bLdp%2FeipxTuzKQcs0SmqKAKdUbK%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;1720&quot; height=&quot;784&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;만든 애플리케이션의 배포 그룹 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-23 오후 3.49.33.png&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3ZMh/btrFzOr0lBu/OuHR0K68zuPukjVKlJkMqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3ZMh/btrFzOr0lBu/OuHR0K68zuPukjVKlJkMqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3ZMh/btrFzOr0lBu/OuHR0K68zuPukjVKlJkMqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3ZMh%2FbtrFzOr0lBu%2FOuHR0K68zuPukjVKlJkMqK%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;742&quot; height=&quot;764&quot; data-filename=&quot;스크린샷 2022-06-23 오후 3.49.33.png&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IAM에서 codeDeploy용으로 만든 역할을 선택할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WIHZp/btrFybnXHUJ/rxfa46Ht7nA4lA7LPx0tW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WIHZp/btrFybnXHUJ/rxfa46Ht7nA4lA7LPx0tW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WIHZp/btrFybnXHUJ/rxfa46Ht7nA4lA7LPx0tW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWIHZp%2FbtrFybnXHUJ%2Frxfa46Ht7nA4lA7LPx0tW1%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;707&quot; height=&quot;842&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EC2, 인스턴스에서 만든 태그를 선택한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf38Rk/btrFADDnos3/3lSii5BLsLNQGRj8iKqDzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf38Rk/btrFADDnos3/3lSii5BLsLNQGRj8iKqDzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf38Rk/btrFADDnos3/3lSii5BLsLNQGRj8iKqDzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf38Rk%2FbtrFADDnos3%2F3lSii5BLsLNQGRj8iKqDzK%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;658&quot; height=&quot;562&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[내 EC2 접근 / 환경 설정]&lt;/b&gt;&lt;/h4&gt;
&lt;p id=&quot;codedeploy-agent-operations-install-ubuntu&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ubuntu Server용 CodeDeploy 에이전트 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655967930666&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S2y1z/btrFACdrDKP/pL3dURCbHLJd4F6kNpUA71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S2y1z/btrFACdrDKP/pL3dURCbHLJd4F6kNpUA71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S2y1z/btrFACdrDKP/pL3dURCbHLJd4F6kNpUA71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS2y1z%2FbtrFACdrDKP%2FpL3dURCbHLJd4F6kNpUA71%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;1404&quot; height=&quot;478&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설치 완료&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;My Repository Settings -&amp;gt; Secrets -&amp;gt; Actions&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;저장해둔 AWS IAM 사용자 키 설정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7br9t/btrFyb2hXNx/843w1GOD4p8aCNUoeCbDf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7br9t/btrFyb2hXNx/843w1GOD4p8aCNUoeCbDf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7br9t/btrFyb2hXNx/843w1GOD4p8aCNUoeCbDf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7br9t%2FbtrFyb2hXNx%2F843w1GOD4p8aCNUoeCbDf1%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;1752&quot; height=&quot;134&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIYHxI/btrFvrLPbnc/3x3SwW4tPqh4dA29H0s6Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIYHxI/btrFvrLPbnc/3x3SwW4tPqh4dA29H0s6Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIYHxI/btrFvrLPbnc/3x3SwW4tPqh4dA29H0s6Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIYHxI%2FbtrFvrLPbnc%2F3x3SwW4tPqh4dA29H0s6Yk%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;386&quot; height=&quot;217&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0IOUK/btrFyc1cdbF/GSVVK95e2819BRtij62pI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0IOUK/btrFyc1cdbF/GSVVK95e2819BRtij62pI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0IOUK/btrFyc1cdbF/GSVVK95e2819BRtij62pI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0IOUK%2FbtrFyc1cdbF%2FGSVVK95e2819BRtij62pI0%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;591&quot; height=&quot;780&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Github Action 파일 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOgb9Z/btrFximRqoj/P0ciwo7alI8YNkER78gnJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOgb9Z/btrFximRqoj/P0ciwo7alI8YNkER78gnJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOgb9Z/btrFximRqoj/P0ciwo7alI8YNkER78gnJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOgb9Z%2FbtrFximRqoj%2FP0ciwo7alI8YNkER78gnJ0%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;1678&quot; height=&quot;134&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHAssb/btrFzOSCvHV/bKau3c7XjVgN6NeaHDj9KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHAssb/btrFzOSCvHV/bKau3c7XjVgN6NeaHDj9KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHAssb/btrFzOSCvHV/bKau3c7XjVgN6NeaHDj9KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHAssb%2FbtrFzOSCvHV%2FbKau3c7XjVgN6NeaHDj9KK%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;423&quot; height=&quot;454&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1655960430787&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# This is a basic workflow to help you get started with Actions
name: Build and Deploy Spring Boot to AWS EC2

# main 브랜치에 푸쉬 했을때
on:
  push:
    branches: [ main ]

# 해당 코드에서 사용될 변수 설정
env:
  PROJECT_NAME: magazine
  BUCKET_NAME: geonoo-test
  CODE_DEPLOY_APP_NAME: codeDeploy-test
  DEPLOYMENT_GROUP_NAME: codeDeploy-test

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        
      - name: Setup Java JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
       
       ## gitignore한 파일 생성해주기
       ## create application.properties
      - name: make application-aws.properties
        if: true # branch가 develop일 때
        run: |
          # spring의 resources 경로로 이동
          cd ./src/main/resources
          touch ./application-aws.properties
          # GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
          echo &quot;${{ secrets.PROPERTIES }}&quot; &amp;gt; ./application-aws.properties
        shell: bash
		
        #gradlew 파일 실행권한 설정
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash
      
        #빌드 시작
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
        
        #프로젝트 zip파일로 압축
      - name: Make Zip File
        run: zip -qq -r ./$GITHUB_SHA.zip .
        shell: bash
      
        #aws 접근 id, key
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2
      	
        # s3에 압축한 zip파일 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
		
        # s3에 업로드한 파일 code Deploy에서 배포 요청
      - name: Code Deploy
        run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name $DEPLOYMENT_GROUP_NAME --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;appspec.yml&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/magazine
    overwrite: yes

permissions:
  - object: /
    pattern: &quot;**&quot;
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: /scripts/deploy.sh
      timeout: 60
      runas: ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;scripts라는 폴더 만들고 그안에 deploy.sh 파일 생성, 아래는 파일내용&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/magazine
cd $REPOSITORY

APP_NAME=cicd-test
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

CURRENT_PID=$(pgrep -f $APP_NAME)

if [ -z $CURRENT_PID ]
then
  echo &quot;&amp;gt; 종료할것 없음.&quot;
else
  echo &quot;&amp;gt; kill -9 $CURRENT_PID&quot;
  kill -15 $CURRENT_PID
  sleep 5
fi

echo &quot;&amp;gt; $JAR_PATH 배포&quot;
nohup java -jar $JAR_PATH &amp;gt; /dev/null 2&amp;gt; /dev/null &amp;lt; /dev/null &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcFnXo/btrFvVePSaC/DNlAwDvsNvsg8raT8pNU51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcFnXo/btrFvVePSaC/DNlAwDvsNvsg8raT8pNU51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcFnXo/btrFvVePSaC/DNlAwDvsNvsg8raT8pNU51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcFnXo%2FbtrFvVePSaC%2FDNlAwDvsNvsg8raT8pNU51%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;405&quot; height=&quot;489&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mepmx/btrFzxqQGSv/NOxWeKqE9i3KoRX14WlAS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mepmx/btrFzxqQGSv/NOxWeKqE9i3KoRX14WlAS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mepmx/btrFzxqQGSv/NOxWeKqE9i3KoRX14WlAS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmepmx%2FbtrFzxqQGSv%2FNOxWeKqE9i3KoRX14WlAS0%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;2122&quot; height=&quot;452&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;452&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;</description>
      <category>Spring</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/162</guid>
      <comments>https://geonoo.tistory.com/162#entry162comment</comments>
      <pubDate>Thu, 23 Jun 2022 17:31:35 +0900</pubDate>
    </item>
    <item>
      <title>메일 전송과 파일 공유</title>
      <link>https://geonoo.tistory.com/161</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;텔넷&lt;/b&gt;&lt;/h4&gt;
&lt;div id=&quot;bodyContent&quot;&gt;
&lt;div id=&quot;mw-content-text&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;텔넷&lt;/b&gt;(telnet)이란 사용자의 컴퓨터에서 네트워크를 이용하여 &lt;b&gt;원격지에 떨어져 있는 서버에 접속하여 자료를 교환할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로토콜&lt;/b&gt;을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텔넷은 &lt;b&gt;보안상 문제가 있기 때문에&lt;/b&gt;, 텔넷 대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;SSH를 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텔넷의&lt;span&gt;&amp;nbsp;&lt;/span&gt;포트&lt;span&gt;&amp;nbsp;&lt;/span&gt;번호는 23번이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 입력한 비밀번호를 &lt;b&gt;변형없이 전송하기 때문에,&lt;/b&gt; 데이터를 관찰하는 &lt;b&gt;누구라도 데이터(비밀번호)를 볼 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biaqPK/btrFnBAZZT9/fVWrqkVreFcNw5kIUCiuY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biaqPK/btrFnBAZZT9/fVWrqkVreFcNw5kIUCiuY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biaqPK/btrFnBAZZT9/fVWrqkVreFcNw5kIUCiuY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiaqPK%2FbtrFnBAZZT9%2FfVWrqkVreFcNw5kIUCiuY1%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;721&quot; height=&quot;712&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSH&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SSH는 &lt;b&gt;Secure Shell의 줄임말&lt;/b&gt;로, &lt;b&gt;원격 호스트에 접속하기 위해 사용되는 보안 프로토콜&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;양방향의 모든 트래픽을 암호한다. ( 출발지, 목적지 )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전하게 정보교환이 가능해 널리 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22번 포트를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csPjjM/btrFpRbf0z3/cBxcf2AFoL8EUagT13FHhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csPjjM/btrFpRbf0z3/cBxcf2AFoL8EUagT13FHhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csPjjM/btrFpRbf0z3/cBxcf2AFoL8EUagT13FHhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsPjjM%2FbtrFpRbf0z3%2FcBxcf2AFoL8EUagT13FHhK%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;557&quot; height=&quot;275&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SMTP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단순 메일 전송 프로토콜(Simple Mail Transfer Protocol)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #555555;&quot;&gt;25번 포트를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; IMAP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메일이 도착한 후, 메일을 읽는 과정에서는 일반적으로 IMAP 프로토콜이 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;IMAP을 사용하면 &lt;b&gt;메일이 서버에 남아 있기 때문에 수신자가 여러 곳에서 메일에 접근&lt;/b&gt;할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;P2P (pear to pear)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;인터넷에 연결된 다수의 개별 사용자들이 직접 데이터를 주고받는 것을 말한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;영어로 Peer란 '동료'라는 뜻인데, 그 뜻에는 네트워크에 연결된 모든 컴퓨터들이 서로 대등한 동료의 입장에서 데이터나 주변장치 등을 공유할 수 있다는 의미를 담고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4dvAv/btrFoRv0txO/Qvqob4bEo6TcKThy0FQCRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4dvAv/btrFoRv0txO/Qvqob4bEo6TcKThy0FQCRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4dvAv/btrFoRv0txO/Qvqob4bEo6TcKThy0FQCRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4dvAv%2FbtrFoRv0txO%2FQvqob4bEo6TcKThy0FQCRK%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;586&quot; height=&quot;874&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;에드혹과 비슷한 개념&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비트토렌트&lt;/b&gt;는 영화와 TV 프로그램처럼 용량이 크고 인기 있는 파일 공유할 때 특히 유용하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파일을 다운로드 할 때 이미 다운 받은 다른 사용자에게 각각 조각을 다운 받아서 하나의 파일로 다운받을 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비트코인도 P2P 프로토콜을 사용한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <category>P2P</category>
      <category>ssh</category>
      <category>메일전송</category>
      <category>텔넷</category>
      <category>파일공유</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/161</guid>
      <comments>https://geonoo.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 21 Jun 2022 22:39:55 +0900</pubDate>
    </item>
    <item>
      <title>[항해] 주특기 2주차 회고</title>
      <link>https://geonoo.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;JPA에서는 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두 가지 방식이 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이 두 가지 방식을 간단하게 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오는 것이고, 지연 로딩은 필요한 시점에 연관된 데이터를 불러오는 것이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 즉시로딩(EAGAL)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1655695634994&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;

    @ManyToOne(fetch = FetchType.EAGER) //Team, 즉시로딩
    @JoinColumn(name = &quot;team_id&quot;)
    Team team;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Member 객체를 조회한다면,&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655695857910&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//멤버를 조회하는 쿼리
select
    member0_.id as id1_0_,
    member0_.team_id as team_id3_0_,
    member0_.username as username2_0_ 
from
    Member member0_

//팀을 조회하는 쿼리
select
    team0_.id as id1_3_0_,
    team0_.name as name2_3_0_ 
from
    Team team0_ 
where
    team0_.id=?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;다음과 같이 즉시 로딩(EAGER) 방식을 사용하면 Member를 조회하는 시점에 바로 Team까지 불러오는 쿼리를 날려 한꺼번에 데이터를 불러오는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;지연 로딩(LAZY)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1655695988513&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;

    @ManyToOne(fetch = FetchType.LAZY)// Team, 지연로딩
    @JoinColumn(name = &quot;team_id&quot;)
    Team team;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Member 객체를 조회한다면,&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655696074804&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Member만 조회
select
    member0_.id as id1_0_,
    member0_.team_id as team_id3_0_,
    member0_.username as username2_0_ 
from
    Member member0_&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연 로딩을 사용하면 Member를 조회하는 시점이 아닌 실제 Team을 사용하는 시점에 쿼리가 나가도록 할 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제의 즉시 로딩에서는 Member와 연관된 Team이 1개여서 Team을 조회하는 쿼리가 1개 나갔지만, 만약 Member를 조회하는 메소드를 사용했는데 연관된 Team이 1000개라면? Member를 조회하는 쿼리를 하나 날렸을 뿐인데 Team을 조회하는 SQL 쿼리 1000개가 추가로 나가게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가급적이면 기본적으로 지연 로딩을 사용하는 것이 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 fetch의 디폴트 값은 @xxToOne에서는 EAGER, @xxToMany에서는 LAZY이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;N+1 문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;/b&gt;위에서 설명하는것 처럼 EAGER를 사용해서 Member를 조회하려고 할 때, Team이 1000개가 있다면 Member를 조회하려고 했을 때, 쿼리가 1000+1개를 날릴것이다. 이것이 N+1문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 지연 로딩을 사용한다고 해서 N+1문제가 사라지는것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연 로딩도 결론적으로는 Team을 찾으려고 할 때, 1000개를 호출해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 그래서 이문제를 해결하려면&lt;span data-offset-key=&quot;785d26fe79694832bb625b3c054bc898:2&quot; data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiVFQyU4MiVBQyVFQyU4QiVBNCUyMCVFQyU5QSVCMCVFQiVBNiVBQyVFQSVCMCU4MCUyMCVFQyU5QiU5MCVFRCU5NSU5OCVFQiU4QSU5NCUyMCVFQyVCRCU5NCVFQiU5MyU5QyVFQiU4QSU5NCUyMCUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTJDJTIyc2VsZWN0aW9ucyUyMiUzQSU1QiU1RCU3RCUyQyU3QiUyMm9iamVjdCUyMiUzQSUyMmxlYWYlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIyc2VsZWN0JTIwKiUyMGZyb20lMjBvd25lciUyMGxlZnQlMjBqb2luJTIwY2F0JTIwb24lMjBjYXQub3duZXJfaWQlMjAlM0QlMjBvd25lci5pZCUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTdCJTIyb2JqZWN0JTIyJTNBJTIybWFyayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJjb2RlJTIyJTJDJTIyZGF0YSUyMiUzQSU3QiU3RCU3RCU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlMkMlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiUyMCVFQyU5RCVCQyUyMCVFQSVCMiU4MyVFQyU5RCVCNCVFQiU4QiVBNC4lMjAlRUMlQjUlOUMlRUMlQTAlODElRUQlOTklOTQlRUIlOTAlOUMlMjAlRUMlQkYlQkMlRUIlQTYlQUMlRUIlQTUlQkMlMjAlRUMlOUElQjAlRUIlQTYlQUMlRUElQjAlODAlMjAlRUMlQTclODElRUMlQTAlOTElMjAlRUMlODIlQUMlRUMlOUElQTklRUQlOTUlQTAlMjAlRUMlODglOTglMjAlRUMlOUUlODglRUIlOEIlQTQuJTIwRmV0Y2glMjBqb2luJUVDJTlEJTg0JTIwJUVDJTgyJUFDJUVDJTlBJUE5JUVEJTk1JTk4JUVCJThBJTk0JTIwJUVBJUIyJTgzJUVDJTlEJUI0JUVCJThCJUE0LiUyMCVFRCU5NSU5OCVFQyVBNyU4MCVFQiVBNyU4QyUyMCVFQyU5RCVCNCVFQiU4QSU5NCUyMGpwYVJlcG9zaXRvcnklRUMlOTclOTAlRUMlODQlOUMlMjAlRUMlQTAlOUMlRUElQjMlQjUlRUQlOTUlQjQlRUMlQTMlQkMlRUIlOEElOTQlMjAlRUElQjIlODMlRUMlOUQlODAlMjAlRUMlOTUlODQlRUIlOEIlODglRUElQjMlQTAlMjBKUFFMJUVCJUExJTlDJTIwJUVDJTlFJTkxJUVDJTg0JUIxJUVEJTk1JUI0JUVDJTk1JUJDJTIwJUVEJTk1JTlDJUVCJThCJUE0LiUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTJDJTIyc2VsZWN0aW9ucyUyMiUzQSU1QiU1RCU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMmViNmQwMzk1MjAzZDRhNWY5ZTE0YjE1ZTlhZjhlYTcyJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyZjhmNGM1OGNjNDQ3NDJhMmIyOTcyYjg4OTgwMDRmZGQlMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjI2NWYxMzQyOWM5MWM0ZDVlYTcwZjJkMGY5NjQ5NWRmYyUyMiU3RA==&quot;&gt;&amp;nbsp;Fetch join을 사용하는 것이다. 하지만 이는 jpaRepository에서 제공해주는 것은 아니고 JPQL로 작성해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJoZWFkaW5nLTIlMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMkZldGNoJTIwam9pbiUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTJDJTIyc2VsZWN0aW9ucyUyMiUzQSU1QiU1RCU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjlmZGQwODI2YTEwNjQwZmRhM2M3YTlmNWQ2ZGFlOTRkJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyYmRmNzdmMWI0NGU1NGUwNDgyYTQ5MTEzYWE1ZWI5ZTglMjIlN0QlMkMlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTJDJTIyc2VsZWN0aW9ucyUyMiUzQSU1QiU1RCU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjc4NWQyNmZlNzk2OTQ4MzJiYjYyNWIzYzA1NGJjODk4JTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyYjFkOTFlYWYxYzM3NGM1OGFlN2ViOTQ3NTE4NGQ0YjElMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjI0NWVkNDUzN2JkZTY0ZWMwOTc3YjM4NGU2ODg5Yjk3MiUyMiU3RA==&quot;&gt;
&lt;div data-rnw-media-class=&quot;1472-195__1470-_b1430-195&quot;&gt;
&lt;div&gt;
&lt;div data-rnw-media-class=&quot;1471-__1469&quot;&gt;
&lt;div&gt;
&lt;div data-key=&quot;aeeaaad55d9c41158bf591d727e15b7c&quot;&gt;
&lt;div data-block-content=&quot;aeeaaad55d9c41158bf591d727e15b7c&quot;&gt;
&lt;h4 data-rnw-media-class=&quot;211__210&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-key=&quot;6d96117aa51042278da2e18aa5a874a4&quot;&gt;&lt;span data-offset-key=&quot;6d96117aa51042278da2e18aa5a874a4:0&quot;&gt;Fetch join&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1655699900245&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Query(&quot;select m from Member m join fetch m.team&quot;)
List&amp;lt;Member&amp;gt; findAllJoinFetch();&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div data-rnw-media-class=&quot;1472-195__1470-_b1430-195&quot;&gt;
&lt;div&gt;
&lt;div data-rnw-media-class=&quot;1471-__1469&quot;&gt;
&lt;div&gt;
&lt;div data-key=&quot;210ddc4f77d94c7b82f230e6b4e3cbca&quot;&gt;
&lt;div data-block-content=&quot;210ddc4f77d94c7b82f230e6b4e3cbca&quot;&gt;
&lt;div&gt;&lt;span data-key=&quot;512c0ec1a28a42adbd53ea2357f94b15&quot;&gt;&lt;span data-offset-key=&quot;512c0ec1a28a42adbd53ea2357f94b15:0&quot;&gt;Fetch Join 단점,&lt;/span&gt;&lt;/span&gt;&lt;span data-key=&quot;512c0ec1a28a42adbd53ea2357f94b15&quot;&gt;&lt;span data-offset-key=&quot;512c0ec1a28a42adbd53ea2357f94b15:0&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span data-key=&quot;512c0ec1a28a42adbd53ea2357f94b15&quot;&gt;&lt;span data-offset-key=&quot;512c0ec1a28a42adbd53ea2357f94b15:0&quot;&gt;Fetch Join을 사용하게 되면 데이터 호출 시점에 모든 연관 관계의 데이터를 가져오기 때문에 FetchType을 Lazy로 해놓는것이 무의미하다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMkZldGNoJTIwSm9pbiVFQyU5RCU4NCUyMCVFQyU4MiVBQyVFQyU5QSVBOSVFRCU5NSU5OCVFQSVCMiU4QyUyMCVFQiU5MCU5OCVFQiVBOSVCNCUyMCVFQiU4RCVCMCVFQyU5RCVCNCVFRCU4NCVCMCUyMCVFRCU5OCVCOCVFQyVCNiU5QyUyMCVFQyU4QiU5QyVFQyVBMCU5MCVFQyU5NyU5MCUyMCVFQiVBQSVBOCVFQiU5MyVBMCUyMCVFQyU5NyVCMCVFQSVCNCU4MCUyMCVFQSVCNCU4MCVFQSVCMyU4NCVFQyU5RCU5OCUyMCVFQiU4RCVCMCVFQyU5RCVCNCVFRCU4NCVCMCVFQiVBNSVCQyUyMCVFQSVCMCU4MCVFQyVBMCVCOCVFQyU5OCVBNCVFQSVCOCVCMCUyMCVFQiU5NSU4QyVFQiVBQyVCOCVFQyU5NyU5MCUyMEZldGNoVHlwZSVFQyU5RCU4NCUyMExhenklRUIlQTElOUMlMjAlRUQlOTUlQjQlRUIlODYlOTMlRUIlOEElOTQlRUElQjIlODMlRUMlOUQlQjQlMjAlRUIlQUMlQjQlRUMlOUQlOTglRUIlQUYlQjglRUQlOTUlOTglRUIlOEIlQTQuJTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlMkMlMjJzZWxlY3Rpb25zJTIyJTNBJTVCJTVEJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNDJmZjI5ZmI1Yjc5NDZjZTg0NjllOGMxZGQ4OTU2MDAlMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjI5YTczOWMyZTkwNWE0MjI1OTdiZWFlNjc5OWZmMDRhNCUyMiU3RCUyQyU3QiUyMm9iamVjdCUyMiUzQSUyMmJsb2NrJTIyJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIyb2JqZWN0JTIyJTNBJTIydGV4dCUyMiUyQyUyMmxlYXZlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMmxlYWYlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIyJUVCJTk4JTkwJUVEJTk1JTlDJTJDJTIwJUVEJThFJTk4JUVDJTlEJUI0JUVDJUE3JTk1JTIwJUVDJUJGJUJDJUVCJUE2JUFDJUVCJUE1JUJDJTIwJUVDJTgyJUFDJUVDJTlBJUE5JUVEJTk1JUEwJTIwJUVDJTg4JTk4JTIwJUVDJTk3JTg2JUVCJThCJUE0LiUyMCVFRCU5NSU5OCVFQiU4MiU5OCVFQyU5RCU5OCUyMCVFQyVCRiVCQyVFQiVBNiVBQyVFQiVBQyVCOCVFQyU5QyVCQyVFQiVBMSU5QyUyMCVFQSVCMCU4MCVFQyVBMCVCOCVFQyU5OCVBNCVFQiU4QiVBNCUyMCVFQiVCMyVCNCVFQiU4QiU4OCUyMCVFRCU4RSU5OCVFQyU5RCVCNCVFQyVBNyU5NSUyMCVFQiU4QiVBOCVFQyU5QyU4NCVFQiVBMSU5QyUyMCVFQiU4RCVCMCVFQyU5RCVCNCVFRCU4NCVCMCVFQiVBNSVCQyUyMCVFQSVCMCU4MCVFQyVBMCVCOCVFQyU5OCVBNCVFQiU4QSU5NCVFQSVCMiU4MyVFQyU5RCVCNCUyMCVFQiVCNiU4OCVFQSVCMCU4MCVFQiU4QSVBNSVFRCU5NSU5OCVFQiU4QiVBNC4lMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjJlNGMyZTkwNjY5MDc0NjUxOTA0NGQ5MDE2NTkzZTc4NyUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjViODFiMjAxZGYwZjRiMzY4YjYyZjZmMWZiNTUzMTI3JTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyMmVjY2NhNzI1NTI1NGFlMmI3MDRmNTU1NGRiNWIwY2IlMjIlN0Q=&quot;&gt;
&lt;div data-rnw-media-class=&quot;1472-195__1470-_b1430-195&quot;&gt;
&lt;div&gt;
&lt;div data-rnw-media-class=&quot;1471-__1469&quot;&gt;
&lt;div&gt;
&lt;div data-key=&quot;5b81b201df0f4b368b62f6f1fb553127&quot;&gt;
&lt;div data-block-content=&quot;5b81b201df0f4b368b62f6f1fb553127&quot;&gt;
&lt;div&gt;&lt;span data-key=&quot;e4c2e906690746519044d9016593e787&quot;&gt;&lt;span data-offset-key=&quot;e4c2e906690746519044d9016593e787:0&quot;&gt;또한, 페이징 쿼리를 사용할 수 없다. 하나의 쿼리문으로 가져오다 보니 페이징 단위로 데이터를 가져오는것이 불가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJoZWFkaW5nLTIlMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMkVudGl0eUdyYXBoJTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlMkMlMjJzZWxlY3Rpb25zJTIyJTNBJTVCJTVEJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyN2QyZGVkMmJjMWY3NDQzMGI5Nzg1MWVkYTVjODIyOGQlMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIxZGRlYjJhMjA0OTE0MzA1YmFkZjM5MDZhZDRmM2Q3ZSUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjk1Yzg4ODAyYTNkZjRlMDg5YzJmM2MxOGFlNDQ1MDljJTIyJTdE&quot;&gt;EntityGraph&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1655700932362&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@EntityGraph(attributePaths = &quot;team&quot;)
@Query(&quot;select m from Member m&quot;)
List&amp;lt;Member&amp;gt; findAllEntityGraph();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiU0MEVudGl0eUdyYXBoJTIwJUVDJTlEJTk4JTIwYXR0cmlidXRlUGF0aHMlRUMlOTclOTAlMjAlRUMlQkYlQkMlRUIlQTYlQUMlMjAlRUMlODglOTglRUQlOTYlODklRUMlOEIlOUMlMjAlRUIlQjAlOTQlRUIlQTElOUMlMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQUMlMjAlRUQlOTUlODQlRUIlOTMlOUMlRUIlQUElODUlRUMlOUQlODQlMjAlRUMlQTclODAlRUMlQTAlOTUlRUQlOTUlOTglRUIlQTklQjQlMjBMYXp5JUVBJUIwJTgwJTIwJUVDJTk1JTg0JUVCJThCJThDJTIwRWFnZXIlMjAlRUMlQTElQjAlRUQlOUElOEMlRUIlQTElOUMlMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQTQlRUElQjIlOEMlMjAlRUIlOTAlOUMlRUIlOEIlQTQuJTIwRmV0Y2glMjBqb2luJUVBJUIzJUJDJTIwJUVCJThGJTk5JUVDJTlEJUJDJUVEJTk1JTk4JUVBJUIyJThDJTIwSlBRTCVFQyU5RCU4NCUyMCVFQyU4MiVBQyVFQyU5QSVBOSVFRCU5NSU5OCVFQyU5NyVBQyUyMHF1ZXJ5JTIwJUVCJUFDJUI4JUVDJTlEJTg0JTIwJUVDJTlFJTkxJUVDJTg0JUIxJUVEJTk1JTk4JUVBJUIzJUEwJTIwJUVEJTk1JTg0JUVDJTlBJTk0JUVEJTk1JTlDJTIwJUVDJTk3JUIwJUVBJUI0JTgwJUVBJUI0JTgwJUVBJUIzJTg0JUVCJUE1JUJDJTIwRW50aXR5R3JhcGglRUMlOTclOTAlMjAlRUMlODQlQTQlRUMlQTAlOTUlRUQlOTUlOTglRUIlQTklQjQlMjAlRUIlOTAlOUMlRUIlOEIlQTQuJTIwJUVBJUI3JUI4JUVCJUE2JUFDJUVBJUIzJUEwJTIwRmV0Y2glMjBqb2luJUVBJUIzJUJDJUVCJThBJTk0JTIwJUVCJThCJUE0JUVCJUE1JUI0JUVBJUIyJThDJTIwam9pbiUyMCVFQiVBQyVCOCVFQyU5RCVCNCUyMG91dGVyJTIwam9pbiVFQyU5QyVCQyVFQiVBMSU5QyUyMCVFQyU4QiVBNCVFRCU5NiU4OSVFQiU5MCU5OCVFQiU4QSU5NCUyMCVFQSVCMiU4MyVFQyU5RCU4NCUyMCVFRCU5OSU5NSVFQyU5RCVCOCVFRCU5NSVBMCUyMCVFQyU4OCU5OCUyMCVFQyU5RSU4OCVFQiU4QiVBNC4lMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIzNGUxNTRhZTNjOTY0OWE5YWJmNWE4NDAwZDFkZGFhZCUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjIwMzAwM2RjZTYyYjRkNjFhYzYyZDVmOGY4ODBhYmVkJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNWJhMmM3YjNmZTZmNDMzZGI2YjgxMTQ5NGNhZDI3ODglMjIlN0Q=&quot;&gt;@EntityGraph 의 attributePaths에 쿼리 수행시 바로 가져올 필드명을 지정하면 Lazy가 아닌 Eager 조회로 가져오게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiU0MEVudGl0eUdyYXBoJTIwJUVDJTlEJTk4JTIwYXR0cmlidXRlUGF0aHMlRUMlOTclOTAlMjAlRUMlQkYlQkMlRUIlQTYlQUMlMjAlRUMlODglOTglRUQlOTYlODklRUMlOEIlOUMlMjAlRUIlQjAlOTQlRUIlQTElOUMlMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQUMlMjAlRUQlOTUlODQlRUIlOTMlOUMlRUIlQUElODUlRUMlOUQlODQlMjAlRUMlQTclODAlRUMlQTAlOTUlRUQlOTUlOTglRUIlQTklQjQlMjBMYXp5JUVBJUIwJTgwJTIwJUVDJTk1JTg0JUVCJThCJThDJTIwRWFnZXIlMjAlRUMlQTElQjAlRUQlOUElOEMlRUIlQTElOUMlMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQTQlRUElQjIlOEMlMjAlRUIlOTAlOUMlRUIlOEIlQTQuJTIwRmV0Y2glMjBqb2luJUVBJUIzJUJDJTIwJUVCJThGJTk5JUVDJTlEJUJDJUVEJTk1JTk4JUVBJUIyJThDJTIwSlBRTCVFQyU5RCU4NCUyMCVFQyU4MiVBQyVFQyU5QSVBOSVFRCU5NSU5OCVFQyU5NyVBQyUyMHF1ZXJ5JTIwJUVCJUFDJUI4JUVDJTlEJTg0JTIwJUVDJTlFJTkxJUVDJTg0JUIxJUVEJTk1JTk4JUVBJUIzJUEwJTIwJUVEJTk1JTg0JUVDJTlBJTk0JUVEJTk1JTlDJTIwJUVDJTk3JUIwJUVBJUI0JTgwJUVBJUI0JTgwJUVBJUIzJTg0JUVCJUE1JUJDJTIwRW50aXR5R3JhcGglRUMlOTclOTAlMjAlRUMlODQlQTQlRUMlQTAlOTUlRUQlOTUlOTglRUIlQTklQjQlMjAlRUIlOTAlOUMlRUIlOEIlQTQuJTIwJUVBJUI3JUI4JUVCJUE2JUFDJUVBJUIzJUEwJTIwRmV0Y2glMjBqb2luJUVBJUIzJUJDJUVCJThBJTk0JTIwJUVCJThCJUE0JUVCJUE1JUI0JUVBJUIyJThDJTIwam9pbiUyMCVFQiVBQyVCOCVFQyU5RCVCNCUyMG91dGVyJTIwam9pbiVFQyU5QyVCQyVFQiVBMSU5QyUyMCVFQyU4QiVBNCVFRCU5NiU4OSVFQiU5MCU5OCVFQiU4QSU5NCUyMCVFQSVCMiU4MyVFQyU5RCU4NCUyMCVFRCU5OSU5NSVFQyU5RCVCOCVFRCU5NSVBMCUyMCVFQyU4OCU5OCUyMCVFQyU5RSU4OCVFQiU4QiVBNC4lMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIzNGUxNTRhZTNjOTY0OWE5YWJmNWE4NDAwZDFkZGFhZCUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjIwMzAwM2RjZTYyYjRkNjFhYzYyZDVmOGY4ODBhYmVkJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNWJhMmM3YjNmZTZmNDMzZGI2YjgxMTQ5NGNhZDI3ODglMjIlN0Q=&quot;&gt;Fetch join과 동일하게 JPQL을 사용하여 query 문을 작성하고 필요한 연관관계를 EntityGraph에 설정하면 된다. 그리고 Fetch join과는 다르게 join 문이 outer join으로 실행되는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiU0MEVudGl0eUdyYXBoJTIwJUVDJTlEJTk4JTIwYXR0cmlidXRlUGF0aHMlRUMlOTclOTAlMjAlRUMlQkYlQkMlRUIlQTYlQUMlMjAlRUMlODglOTglRUQlOTYlODklRUMlOEIlOUMlMjAlRUIlQjAlOTQlRUIlQTElOUMlMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQUMlMjAlRUQlOTUlODQlRUIlOTMlOUMlRUIlQUElODUlRUMlOUQlODQlMjAlRUMlQTclODAlRUMlQTAlOTUlRUQlOTUlOTglRUIlQTklQjQlMjBMYXp5JUVBJUIwJTgwJTIwJUVDJTk1JTg0JUVCJThCJThDJTIwRWFnZXIlMjAlRUMlQTElQjAlRUQlOUElOEMlRUIlQTElOUMlMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQTQlRUElQjIlOEMlMjAlRUIlOTAlOUMlRUIlOEIlQTQuJTIwRmV0Y2glMjBqb2luJUVBJUIzJUJDJTIwJUVCJThGJTk5JUVDJTlEJUJDJUVEJTk1JTk4JUVBJUIyJThDJTIwSlBRTCVFQyU5RCU4NCUyMCVFQyU4MiVBQyVFQyU5QSVBOSVFRCU5NSU5OCVFQyU5NyVBQyUyMHF1ZXJ5JTIwJUVCJUFDJUI4JUVDJTlEJTg0JTIwJUVDJTlFJTkxJUVDJTg0JUIxJUVEJTk1JTk4JUVBJUIzJUEwJTIwJUVEJTk1JTg0JUVDJTlBJTk0JUVEJTk1JTlDJTIwJUVDJTk3JUIwJUVBJUI0JTgwJUVBJUI0JTgwJUVBJUIzJTg0JUVCJUE1JUJDJTIwRW50aXR5R3JhcGglRUMlOTclOTAlMjAlRUMlODQlQTQlRUMlQTAlOTUlRUQlOTUlOTglRUIlQTklQjQlMjAlRUIlOTAlOUMlRUIlOEIlQTQuJTIwJUVBJUI3JUI4JUVCJUE2JUFDJUVBJUIzJUEwJTIwRmV0Y2glMjBqb2luJUVBJUIzJUJDJUVCJThBJTk0JTIwJUVCJThCJUE0JUVCJUE1JUI0JUVBJUIyJThDJTIwam9pbiUyMCVFQiVBQyVCOCVFQyU5RCVCNCUyMG91dGVyJTIwam9pbiVFQyU5QyVCQyVFQiVBMSU5QyUyMCVFQyU4QiVBNCVFRCU5NiU4OSVFQiU5MCU5OCVFQiU4QSU5NCUyMCVFQSVCMiU4MyVFQyU5RCU4NCUyMCVFRCU5OSU5NSVFQyU5RCVCOCVFRCU5NSVBMCUyMCVFQyU4OCU5OCUyMCVFQyU5RSU4OCVFQiU4QiVBNC4lMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIzNGUxNTRhZTNjOTY0OWE5YWJmNWE4NDAwZDFkZGFhZCUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjIwMzAwM2RjZTYyYjRkNjFhYzYyZDVmOGY4ODBhYmVkJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNWJhMmM3YjNmZTZmNDMzZGI2YjgxMTQ5NGNhZDI3ODglMjIlN0Q=&quot;&gt;테이블 join을 해오기 때문에 중복된 데이터가 나올 수 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;div data-rnw-media-class=&quot;1472-195__1470-_b1430-195&quot;&gt;
&lt;div&gt;
&lt;div data-rnw-media-class=&quot;1471-__1469&quot;&gt;
&lt;div&gt;
&lt;div data-block-content=&quot;380b3d3547184ba7a44e9354eb5e1c47&quot;&gt;
&lt;div&gt;
&lt;div data-key=&quot;5f53378026a247e69a829546fe2e4586&quot;&gt;
&lt;div&gt;&lt;span data-key=&quot;2bcb6b457f0e4844933ccf754d192441&quot;&gt;&lt;span data-offset-key=&quot;2bcb6b457f0e4844933ccf754d192441:0&quot;&gt;1. 컬렉션을 Set을 사용하게 되면 중복을 허용하지 않는 자료구조이기 때문에 중복된 데이터를 제거할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-rnw-media-class=&quot;1472-195__1470-_b1430-195&quot; data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMmJsb2NrJTIyJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIyb2JqZWN0JTIyJTNBJTIydGV4dCUyMiUyQyUyMmxlYXZlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMmxlYWYlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIyJUVDJUJCJUFDJUVCJUEwJTg5JUVDJTg1JTk4JUVDJTlEJTg0JTIwU2V0JUVDJTlEJTg0JTIwJUVDJTgyJUFDJUVDJTlBJUE5JUVEJTk1JTk4JUVBJUIyJThDJTIwJUVCJTkwJTk4JUVCJUE5JUI0JTIwJUVDJUE0JTkxJUVCJUIzJUI1JUVDJTlEJTg0JTIwJUVEJTk3JTg4JUVDJTlBJUE5JUVEJTk1JTk4JUVDJUE3JTgwJTIwJUVDJTk1JThBJUVCJThBJTk0JTIwJUVDJTlFJTkwJUVCJUEzJThDJUVBJUI1JUFDJUVDJUExJUIwJUVDJTlEJUI0JUVBJUI4JUIwJTIwJUVCJTk1JThDJUVCJUFDJUI4JUVDJTk3JTkwJTIwJUVDJUE0JTkxJUVCJUIzJUI1JUVCJTkwJTlDJTIwJUVCJThEJUIwJUVDJTlEJUI0JUVEJTg0JUIwJUVCJUE1JUJDJTIwJUVDJUEwJTlDJUVBJUIxJUIwJUVEJTk1JUEwJTIwJUVDJTg4JTk4JTIwJUVDJTlFJTg4JUVCJThCJUE0LiUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTJDJTIyc2VsZWN0aW9ucyUyMiUzQSU1QiU1RCU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjQ1YzVlN2IzYmU5ZTQ1M2U4YTJkMDQ2ZWI4Y2YwZGMwJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyYjJmNjdhZjRhYTlkNDUwM2I3NGNhZDVkNjc4MzdmYWMlMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjI3ZDFjNzM5OWM1Zjc0MDY2OGUxNjRlNGQxMzkwNGU5MiUyMiU3RCUyQyU3QiUyMm9iamVjdCUyMiUzQSUyMmJsb2NrJTIyJTJDJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIyb2JqZWN0JTIyJTNBJTIyYmxvY2slMjIlMkMlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyaXNWb2lkJTIyJTNBZmFsc2UlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJ0ZXh0JTIyJTJDJTIybGVhdmVzJTIyJTNBJTVCJTdCJTIyb2JqZWN0JTIyJTNBJTIybGVhZiUyMiUyQyUyMnRleHQlMjIlM0ElMjJKUFFMJUVDJTlEJTg0JTIwJUVDJTgyJUFDJUVDJTlBJUE5JUVEJTk1JTk4JUVBJUI4JUIwJTIwJUVCJTk1JThDJUVCJUFDJUI4JUVDJTk3JTkwJTIwZGlzdGluY3QlRUIlQTUlQkMlMjAlRUMlODIlQUMlRUMlOUElQTklRUQlOTUlOTglRUMlOTclQUMlMjAlRUMlQTQlOTElRUIlQjMlQjUlRUIlOTAlOUMlMjAlRUIlOEQlQjAlRUMlOUQlQjQlRUQlODQlQjAlRUIlQTUlQkMlMjAlRUMlQTElQjAlRUQlOUElOEMlRUQlOTUlOTglRUMlQTclODAlMjAlRUMlOTUlOEElRUMlOUQlODQlMjAlRUMlODglOTglMjAlRUMlOUUlODglRUIlOEIlQTQuJTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlMkMlMjJzZWxlY3Rpb25zJTIyJTNBJTVCJTVEJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNzQyYjkxZTRjNmM5NGNhNTlkZmQ5MDI3MDAyOTllOTclMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjJlNGI1YTAxZTZjMmE0NzkxYjhmOWE1ODQyNDJlNDNkNiUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjcxZjBiZTZjZjBjNDQ1Y2Y5ODhhMDNhNzMzNmI2ZmJkJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNWVlNDU2ODc3ZGQ1NGVmNGE2YTg3MDM0ZmU0ZDZkMzUlMjIlN0Q=&quot;&gt;
&lt;div data-rnw-media-class=&quot;1471-__1469&quot;&gt;
&lt;div data-block-content=&quot;71f0be6cf0c445cf988a03a7336b6fbd&quot;&gt;
&lt;div data-key=&quot;e4b5a01e6c2a4791b8f9a584242e43d6&quot;&gt;
&lt;div&gt;&lt;span data-key=&quot;742b91e4c6c94ca59dfd902700299e97&quot;&gt;&lt;span data-offset-key=&quot;742b91e4c6c94ca59dfd902700299e97:0&quot;&gt;2. JPQL을 사용하기 때문에 distinct를 사용하여 중복된 데이터를 조회하지 않을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJoZWFkaW5nLTIlMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMkVudGl0eUdyYXBoJTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlMkMlMjJzZWxlY3Rpb25zJTIyJTNBJTVCJTVEJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyN2QyZGVkMmJjMWY3NDQzMGI5Nzg1MWVkYTVjODIyOGQlMjIlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIxZGRlYjJhMjA0OTE0MzA1YmFkZjM5MDZhZDRmM2Q3ZSUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjk1Yzg4ODAyYTNkZjRlMDg5YzJmM2MxOGFlNDQ1MDljJTIyJTdE&quot;&gt;QueryDSL 사용해보기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1655701612787&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// QueryDSL로 구현한 예제
return from(member.leftJoin(member.teams, team)
                   .fetchJoin()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1655701914136&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface PostCustomRepository {

    List&amp;lt;Post&amp;gt; findAllInnerFetchJoin();

    List&amp;lt;Post&amp;gt; findAllInnerFetchJoinWithDistinct();
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1655701869498&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
public class PostCustomRepositoryImpl implements PostCustomRepository {

    private final JPAQueryFactory jpaQueryFactory;

    public PostCustomRepositoryImpl(JPAQueryFactory jpaQueryFactory) {
        this.jpaQueryFactory = jpaQueryFactory;
    }

    @Override
    public List&amp;lt;Post&amp;gt; findAllInnerFetchJoin() {
        return jpaQueryFactory.selectFrom(post)
            .innerJoin(post.comments)
            .fetchJoin()
            .fetch();
    }

    @Override
    public List&amp;lt;Post&amp;gt; findAllInnerFetchJoinWithDistinct() {
        return jpaQueryFactory.selectFrom(post)
            .distinct()
            .innerJoin(post.comments)
            .fetchJoin()
            .fetch();    
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&quot;nosql-데이터베이스-사용이-더-좋을-때&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크를 사용한다면 프레임워크에 맞는 규칙이나 패턴에 맞추어야하는것이고, 라이브러리는 자유롭게 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;@RestControllerAdvice를 이용해서 예외를 처리해 봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RestFul, 연관관계, N+1 문제, 로그인 방식, JWT, JPA, Spring Dta JPA...&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;실전 프로젝트까지 앞으로 일주일 남았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실전프로젝트를 잘 하기 위해서 앞으로 더 준비하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번주는 블로그에 정리할 부분을 깃에 정리해서 블로그 작성을 거의 못했다. ㅠ.ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/geonoo/magazine&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/geonoo/magazine&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655611794574&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - geonoo/magazine: 매거진 사이트 만들기&quot; data-og-description=&quot;매거진 사이트 만들기. Contribute to geonoo/magazine development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/geonoo/magazine&quot; data-og-url=&quot;https://github.com/geonoo/magazine&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgADJT/hyONLNr7FF/lpubLkKGi2eViXhGpAG55k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/geonoo/magazine&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/geonoo/magazine&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgADJT/hyONLNr7FF/lpubLkKGi2eViXhGpAG55k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - geonoo/magazine: 매거진 사이트 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;매거진 사이트 만들기. Contribute to geonoo/magazine development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>항해</category>
      <category>MVC</category>
      <category>NoSQL</category>
      <category>ORM</category>
      <category>SQL</category>
      <category>항해</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/160</guid>
      <comments>https://geonoo.tistory.com/160#entry160comment</comments>
      <pubDate>Sun, 19 Jun 2022 13:08:22 +0900</pubDate>
    </item>
    <item>
      <title>와이파이 - 셀룰러폰 - LTE, 5G</title>
      <link>https://geonoo.tistory.com/159</link>
      <description>&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;무선 전자기파를 사용하여 데이터를 전송하므로 신호가 충분한 장소라면 어디서든 통신 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sj2st/btrELUgfyYt/JqukmnsnNvy1lZnRHj6aLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sj2st/btrELUgfyYt/JqukmnsnNvy1lZnRHj6aLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sj2st/btrELUgfyYt/JqukmnsnNvy1lZnRHj6aLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSj2st%2FbtrELUgfyYt%2FJqukmnsnNvy1lZnRHj6aLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;320&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;와이파이는 상표 이름&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이파이의 원래 이름은 IEEE 802.11이라는 공식 이름이 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이파이는 산업 단체인 와이파이 연합의 등록 상표라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IEEE는 전기전자기술자협회라는 전문가 단체고 802.11은 표준의 번호이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;블루투스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블루투스도 802.11 무선 통신과 같은 2.4GHz 주파수 대역을 사용&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnu4x3/btrELTVY63N/OBDBrPs5B5clLZ1kwYiR80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnu4x3/btrELTVY63N/OBDBrPs5B5clLZ1kwYiR80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnu4x3/btrELTVY63N/OBDBrPs5B5clLZ1kwYiR80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnu4x3%2FbtrELTVY63N%2FOBDBrPs5B5clLZ1kwYiR80%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;324&quot; height=&quot;323&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;RFID&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전자 도어록, 식별 태그, 증명서 등에 활용되는 저전력 무선 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;GPS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위성으로부터 신호가 도착하는데 걸리는 시간을 사용해서 지상의 자신의 위치를 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;휴대폰이 영어로 셀룰러폰인 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&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;&quot;&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;&quot;&gt;그 지역들을 연결해 봤더니 마치 세포(cell) 모양 같았았고 휴대폰을 &quot;세포 모양의(cellular) 전화기(phone)&quot;이라는 뜻에서 &quot;cellular phone&quot;으로 부르기 시작했다고 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;LTE, 5G 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5G는 LTE에 비해 전송속도가 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시에 VR, AR 등의 다양한 기기에 연결이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 기술 - 에지 컴퓨팅, 네트워크 슬라이싱&lt;/p&gt;</description>
      <category>CS</category>
      <category>CS</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/159</guid>
      <comments>https://geonoo.tistory.com/159#entry159comment</comments>
      <pubDate>Tue, 14 Jun 2022 17:27:55 +0900</pubDate>
    </item>
    <item>
      <title>[항해] 주특기 1주차 회고</title>
      <link>https://geonoo.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 셋팅부터 강의까지 많은것들을 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 빌드도구에 대해서 정리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/145&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655074242067&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 빌드? 빌드도구? - gradle, maven&quot; data-og-description=&quot;빌드? 프로그래머가 작성한 소스 코드를&amp;nbsp;실행할 수 있는 독립적인 형태(.war, .jar)로 변환하는 과정 및 결과를 말한다. 변환하는 과정에는 컴파일 과정도 포함이 된다. 예를 들어 개발자가 이클립&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/145&quot; data-og-url=&quot;https://geonoo.tistory.com/145&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dNP72d/hyOJF7hXGY/zjhyI7OmH9EwbUyEAktbb1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Fl1p3/hyOLaEAoXH/ePNyAb8lOmeCWao0duD85K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LyU82/hyOJCJtdGg/whAOTGzW5dE2k3u0HHs5OK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/145&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dNP72d/hyOJF7hXGY/zjhyI7OmH9EwbUyEAktbb1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Fl1p3/hyOLaEAoXH/ePNyAb8lOmeCWao0duD85K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LyU82/hyOJCJtdGg/whAOTGzW5dE2k3u0HHs5OK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] 빌드? 빌드도구? - gradle, maven&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;빌드? 프로그래머가 작성한 소스 코드를&amp;nbsp;실행할 수 있는 독립적인 형태(.war, .jar)로 변환하는 과정 및 결과를 말한다. 변환하는 과정에는 컴파일 과정도 포함이 된다. 예를 들어 개발자가 이클립&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런다음 Spring Boot 셋팅하는 방법을 배웠고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/146&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/146&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655074295410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Boot 셋팅 - IntelliJ IDEA&quot; data-og-description=&quot;IDE : IntelliJ IDEA Spring Boot 환경 구성하기 1. new Project - Name : 프로젝트 이름을 적어준다. - Location : 프로젝트를 저장할 공간 설정 - Language : 프로그래밍 언어 설정 - Type : 빌드 도구 선택 -..&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/146&quot; data-og-url=&quot;https://geonoo.tistory.com/146&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EBxoL/hyOK6WujNM/WERiz7PVQVY62YnG4jdrKk/img.png?width=800&amp;amp;height=631&amp;amp;face=0_0_800_631,https://scrap.kakaocdn.net/dn/HFfG7/hyOJHcXhRg/6dKel8CCaAIXZtimVo3Ik0/img.png?width=800&amp;amp;height=631&amp;amp;face=0_0_800_631,https://scrap.kakaocdn.net/dn/QA3eD/hyOK6CbrcE/WAoWHekifcq4BfyIsfRDbk/img.png?width=2122&amp;amp;height=1544&amp;amp;face=0_0_2122_1544&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/146&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/146&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EBxoL/hyOK6WujNM/WERiz7PVQVY62YnG4jdrKk/img.png?width=800&amp;amp;height=631&amp;amp;face=0_0_800_631,https://scrap.kakaocdn.net/dn/HFfG7/hyOJHcXhRg/6dKel8CCaAIXZtimVo3Ik0/img.png?width=800&amp;amp;height=631&amp;amp;face=0_0_800_631,https://scrap.kakaocdn.net/dn/QA3eD/hyOK6CbrcE/WAoWHekifcq4BfyIsfRDbk/img.png?width=2122&amp;amp;height=1544&amp;amp;face=0_0_2122_1544');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 셋팅 - IntelliJ IDEA&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;IDE : IntelliJ IDEA Spring Boot 환경 구성하기 1. new Project - Name : 프로젝트 이름을 적어준다. - Location : 프로젝트를 저장할 공간 설정 - Language : 프로그래밍 언어 설정 - Type : 빌드 도구 선택 -..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA도 사용해 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/147&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/147&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655074370260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Java Persistence API - JPA&quot; data-og-description=&quot;Java Persistence API(JPA) JPA는 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 실제로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. Persistence(영속&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/147&quot; data-og-url=&quot;https://geonoo.tistory.com/147&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4ES0G/hyOK2T5u8Y/VeSwKg8lx31HBmLuBeoshK/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/iTNAr/hyOLdOQpAn/NwLfniqVHHj9M8P1AvRxJ0/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/bxaVNX/hyOJHYiNEF/8Ksj4OLT2X1dJCxi7oL5MK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/147&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/147&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4ES0G/hyOK2T5u8Y/VeSwKg8lx31HBmLuBeoshK/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/iTNAr/hyOLdOQpAn/NwLfniqVHHj9M8P1AvRxJ0/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/bxaVNX/hyOJHYiNEF/8Ksj4OLT2X1dJCxi7oL5MK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] Java Persistence API - JPA&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java Persistence API(JPA) JPA는 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 실제로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. Persistence(영속&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용했던건 Spring Data JPA를 사용했는데, JPA의 차이를 모르고 사용했지만 지금은 차이점 정도는 알게되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w70LP/btrEuqURwXa/87MR6KUjMzImSBqrBi0NX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w70LP/btrEuqURwXa/87MR6KUjMzImSBqrBi0NX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w70LP/btrEuqURwXa/87MR6KUjMzImSBqrBi0NX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw70LP%2FbtrEuqURwXa%2F87MR6KUjMzImSBqrBi0NX0%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;492&quot; height=&quot;990&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두개의 차이를 말 할 때 사용하는 그림이다. Spring Data JPA는 JPA를 사용하기 위한 모듈이고, JPA는 &lt;span style=&quot;background-color: #f8f8f8; color: #e96900;&quot;&gt;EntityManager&lt;/span&gt;&lt;span style=&quot;color: #e96900;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;를 사용하고 Hibernate의 구현체 이다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f8f8f8; color: #e96900;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #e96900;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/149&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/149&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655074919039&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring Data JPA 기본 사용법 ( JpaRepository )&quot; data-og-description=&quot;1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 2. 도메인 객체 생성 @Getter @NoArgsConstructor @Entity public class Comment extends BaseTimeEntity { @Id @Genera..&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/149&quot; data-og-url=&quot;https://geonoo.tistory.com/149&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eJAxLv/hyOJHqtYMH/Q0dClCJi73m6bFexBxH8Bk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/mpvnf/hyOJv4EnaF/cJAUcRsCJhFToFYa8Ywrf0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cv2pYE/hyOK2s1ef6/OVikNb93Uv1u9KGM4cPz5k/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/149&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/149&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eJAxLv/hyOJHqtYMH/Q0dClCJi73m6bFexBxH8Bk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/mpvnf/hyOJv4EnaF/cJAUcRsCJhFToFYa8Ywrf0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cv2pYE/hyOK2s1ef6/OVikNb93Uv1u9KGM4cPz5k/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] Spring Data JPA 기본 사용법 ( JpaRepository )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 2. 도메인 객체 생성 @Getter @NoArgsConstructor @Entity public class Comment extends BaseTimeEntity { @Id @Genera..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #e96900;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MVC패턴과 객체지향 그리고 Controller, Repository, Service에대해서 정리해봤다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #e96900;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;부족한점이 많아서 정리해야하는 부분이 너무 많았다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #e96900;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/151&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/151&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655075000897&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;객체지향(Object Oriented Programming) 정리&quot; data-og-description=&quot;면접에서 꼭 질문하는 꼬리에 꼬리를 무는 객체지향에대해서 공부해 보려고 한다. 객체&amp;nbsp;지향&amp;nbsp;프로그래밍(Object&amp;nbsp;Oriented&amp;nbsp;Programming) 먼저 객체란 우리가 실생활에서 쓰는 모든 것을 객체라고 한다&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/151&quot; data-og-url=&quot;https://geonoo.tistory.com/151&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fnMsJ/hyOJwCwWw9/7KkB8k1zTsjJhDTsm0Icp0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ExKUB/hyOJCpaRLV/G4zK0i5duqulWYhvbgfjgK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bJg3ed/hyOJD2Gn8M/zrSkGsc9p7QVkQLL7dkvmk/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/151&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/151&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fnMsJ/hyOJwCwWw9/7KkB8k1zTsjJhDTsm0Icp0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ExKUB/hyOJCpaRLV/G4zK0i5duqulWYhvbgfjgK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bJg3ed/hyOJD2Gn8M/zrSkGsc9p7QVkQLL7dkvmk/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;객체지향(Object Oriented Programming) 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;면접에서 꼭 질문하는 꼬리에 꼬리를 무는 객체지향에대해서 공부해 보려고 한다. 객체&amp;nbsp;지향&amp;nbsp;프로그래밍(Object&amp;nbsp;Oriented&amp;nbsp;Programming) 먼저 객체란 우리가 실생활에서 쓰는 모든 것을 객체라고 한다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/148&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655074823943&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] MVC 패턴 (ORM, SQL) - 회고&quot; data-og-description=&quot; Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다. 처음으로 JPA를 사용해봤고 정리해봤다. https://geonoo.tistory.com/147?category=1077864 [Spring] Java Persistence API - JPA Java Persistence API(..&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/148&quot; data-og-url=&quot;https://geonoo.tistory.com/148&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZnpvw/hyOK1Vba2Y/KrMkr6D9x2dO0feRRAJubK/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/bCcPIW/hyOJGyncde/lFcAe6JMKCIqxzvlOfkbtK/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/4P51A/hyOK96KsQ2/N2Ew5f58Ouvv7KrZ8MkVyK/img.png?width=1174&amp;amp;height=740&amp;amp;face=0_0_1174_740&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/148&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZnpvw/hyOK1Vba2Y/KrMkr6D9x2dO0feRRAJubK/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/bCcPIW/hyOJGyncde/lFcAe6JMKCIqxzvlOfkbtK/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/4P51A/hyOK96KsQ2/N2Ew5f58Ouvv7KrZ8MkVyK/img.png?width=1174&amp;amp;height=740&amp;amp;face=0_0_1174_740');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] MVC 패턴 (ORM, SQL) - 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt; Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다. 처음으로 JPA를 사용해봤고 정리해봤다. https://geonoo.tistory.com/147?category=1077864 [Spring] Java Persistence API - JPA Java Persistence API(..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/152&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/152&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655075038095&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Controller, Service, Repository&quot; data-og-description=&quot;Controller, Service, Repository를 알기전에는 MVC 패턴에 대해서 이해해야 한다. https://geonoo.tistory.com/148 [Spring] MVC 패턴 (ORM, SQL) - 회고  Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다..&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/152&quot; data-og-url=&quot;https://geonoo.tistory.com/152&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cX49kJ/hyOJvjivIr/82hkDKeTxpYSTkmNQnySmK/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/b8tqS9/hyOK6vp9u3/nC5pN6Er3zvSQNAIktlDyk/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/dCfeiO/hyOJAkDELa/BUTO2nO1PZELCx6O5LjdGK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/152&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/152&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cX49kJ/hyOJvjivIr/82hkDKeTxpYSTkmNQnySmK/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/b8tqS9/hyOK6vp9u3/nC5pN6Er3zvSQNAIktlDyk/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/dCfeiO/hyOJAkDELa/BUTO2nO1PZELCx6O5LjdGK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Controller, Service, Repository&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Controller, Service, Repository를 알기전에는 MVC 패턴에 대해서 이해해야 한다. https://geonoo.tistory.com/148 [Spring] MVC 패턴 (ORM, SQL) - 회고  Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gitignore 관련한 문제도 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/150&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/150&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655074961573&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Git] gitignore - properties&quot; data-og-description=&quot;Git에 프로젝트를 올리면 apllication.properties 같이 데이터베이스 정보나 AWS정보가 같이 올라간다. .gitignore 파일을 이용하면 파일이 원격레포지토리에서 보이지 않게 된다. /.nb-gradle/ ### VS Code ### ...&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/150&quot; data-og-url=&quot;https://geonoo.tistory.com/150&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uydba/hyOJstkZ4E/ZAMU9hW7p0vAHxrRNov8dk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gpE4H/hyOK27CN0Z/8DjEre3l1wsrkXk6vK8GJ0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bchbcT/hyOK36w80d/c604Yf0B50A51NTf04C4Xk/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/150&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/150&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uydba/hyOJstkZ4E/ZAMU9hW7p0vAHxrRNov8dk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gpE4H/hyOK27CN0Z/8DjEre3l1wsrkXk6vK8GJ0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bchbcT/hyOK36w80d/c604Yf0B50A51NTf04C4Xk/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Git] gitignore - properties&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git에 프로젝트를 올리면 apllication.properties 같이 데이터베이스 정보나 AWS정보가 같이 올라간다. .gitignore 파일을 이용하면 파일이 원격레포지토리에서 보이지 않게 된다. /.nb-gradle/ ### VS Code ### ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DI와 IoC에 대해서도 알게되었고 Spring 컨테이너와 빈에대해서도 어떤일을 하는지 정도는 설명할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/153&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655075105376&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] DI(Dependency Injection)를 사용하는 이유&quot; data-og-description=&quot;Spring boot에서 DI를 사용하게된 이유를 알려면 강한결합과 느슨한결합에 대해서 알아야한다. 강합결합과 느슨한결합 중 강한 결합은 문제가 있는데, 어떤 문제인지 예제를 통해서 알아보면 먼저 &quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/153&quot; data-og-url=&quot;https://geonoo.tistory.com/153&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1FQ95/hyOLhRfulN/KKWm5t5lZDjYccCQj0081k/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/clhjB6/hyOLdOQFws/5g6hrwNKOin22kHdgITsZ1/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/Me8nS/hyOLbXNxdM/aR9v5Ylor63i6p0hhDPA40/img.png?width=1436&amp;amp;height=928&amp;amp;face=0_0_1436_928&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/153&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1FQ95/hyOLhRfulN/KKWm5t5lZDjYccCQj0081k/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/clhjB6/hyOLdOQFws/5g6hrwNKOin22kHdgITsZ1/img.png?width=800&amp;amp;height=532&amp;amp;face=0_0_800_532,https://scrap.kakaocdn.net/dn/Me8nS/hyOLbXNxdM/aR9v5Ylor63i6p0hhDPA40/img.png?width=1436&amp;amp;height=928&amp;amp;face=0_0_1436_928');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] DI(Dependency Injection)를 사용하는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring boot에서 DI를 사용하게된 이유를 알려면 강한결합과 느슨한결합에 대해서 알아야한다. 강합결합과 느슨한결합 중 강한 결합은 문제가 있는데, 어떤 문제인지 예제를 통해서 알아보면 먼저&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/156&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655075128314&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 컨테이너와 빈&quot; data-og-description=&quot;스프링&amp;nbsp;컨테이너와&amp;nbsp;빈 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bea&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/156&quot; data-og-url=&quot;https://geonoo.tistory.com/156&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/A5Uqg/hyOJwWNU5b/G8dBKAx1BV0VFodAJTT5U1/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/buBeeF/hyOK4K8Uw1/c8KMFgSosGvwlTmGZlSWn0/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/gVo4c/hyOK78VV5k/Lt43HNUjiWAHcRy9lQFXg0/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/156&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/A5Uqg/hyOJwWNU5b/G8dBKAx1BV0VFodAJTT5U1/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/buBeeF/hyOK4K8Uw1/c8KMFgSosGvwlTmGZlSWn0/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/gVo4c/hyOK78VV5k/Lt43HNUjiWAHcRy9lQFXg0/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] 스프링 컨테이너와 빈&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링&amp;nbsp;컨테이너와&amp;nbsp;빈 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bea&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 XSS, CSRF, DNS, CS 스터디 공부도 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/157&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655075253860&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;XSS, CSRF&quot; data-og-description=&quot;XSS(CSS) 크로스사이트 스크립트 란 XSS 공격방법은 해커가 웹 페이지에서 악성 스크립트를 넣습니다. 예를들어 게시판 사이트가 있으면 게시판에 글쓰는 공간에 악성 스크립트를 넣는것이죠. 그&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/157&quot; data-og-url=&quot;https://geonoo.tistory.com/157&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/n1Xj0/hyOJwWN16a/A2SBloGHnWJEqLaMdJjir0/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/FSs1J/hyOJsmzGSp/gpB7xvQWhzucXu765p5stk/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/GwAih/hyOJAZcBxj/yxPRwitNKQ0i5EuwS5St50/img.png?width=1276&amp;amp;height=750&amp;amp;face=0_0_1276_750&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/157&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/n1Xj0/hyOJwWN16a/A2SBloGHnWJEqLaMdJjir0/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/FSs1J/hyOJsmzGSp/gpB7xvQWhzucXu765p5stk/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/GwAih/hyOJAZcBxj/yxPRwitNKQ0i5EuwS5St50/img.png?width=1276&amp;amp;height=750&amp;amp;face=0_0_1276_750');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;XSS, CSRF&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;XSS(CSS) 크로스사이트 스크립트 란 XSS 공격방법은 해커가 웹 페이지에서 악성 스크립트를 넣습니다. 예를들어 게시판 사이트가 있으면 게시판에 글쓰는 공간에 악성 스크립트를 넣는것이죠. 그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/154&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/154&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655075264216&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;DNS(Domain Name System)?&quot; data-og-description=&quot;도메인이라는것은 웹사이트 주소를 말한다. www.geonoo.com 에서 geonoo.com 이 도메인에 해당한다. www는 호스트 네임이라고 불리고 www 말고도 mail, shop 과같이 다른 것이 올 수도 있다. 우리가 웹 브라&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/154&quot; data-og-url=&quot;https://geonoo.tistory.com/154&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/C2KHK/hyOK1Vbjt2/nyP160JazwwuligvP2Hya0/img.png?width=800&amp;amp;height=297&amp;amp;face=0_0_800_297,https://scrap.kakaocdn.net/dn/yCiY0/hyOLb4zhMi/EDdnCxoKACtA5AGCZQjmF1/img.png?width=800&amp;amp;height=297&amp;amp;face=0_0_800_297,https://scrap.kakaocdn.net/dn/SnL2U/hyOJwoYFoM/WtkfduyPlql4HQfy3mFUO1/img.png?width=1462&amp;amp;height=848&amp;amp;face=0_0_1462_848&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/154&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/154&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/C2KHK/hyOK1Vbjt2/nyP160JazwwuligvP2Hya0/img.png?width=800&amp;amp;height=297&amp;amp;face=0_0_800_297,https://scrap.kakaocdn.net/dn/yCiY0/hyOLb4zhMi/EDdnCxoKACtA5AGCZQjmF1/img.png?width=800&amp;amp;height=297&amp;amp;face=0_0_800_297,https://scrap.kakaocdn.net/dn/SnL2U/hyOJwoYFoM/WtkfduyPlql4HQfy3mFUO1/img.png?width=1462&amp;amp;height=848&amp;amp;face=0_0_1462_848');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;DNS(Domain Name System)?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;도메인이라는것은 웹사이트 주소를 말한다. www.geonoo.com 에서 geonoo.com 이 도메인에 해당한다. www는 호스트 네임이라고 불리고 www 말고도 mail, shop 과같이 다른 것이 올 수도 있다. 우리가 웹 브라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번주는 정신없이 개념정리하고 코드 작성하다보니 일주일이 끝나 있었다.&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;꾸준히 하는게 중요하지 일주일 바짝한다고 좋은게 아니라는걸 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 열심히는 하겠지만 너무 나 자신한태 채찍질만 하지 말아야겠다.&lt;/p&gt;</description>
      <category>항해</category>
      <category>주특기</category>
      <category>항해</category>
      <category>회고</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/158</guid>
      <comments>https://geonoo.tistory.com/158#entry158comment</comments>
      <pubDate>Mon, 13 Jun 2022 08:15:50 +0900</pubDate>
    </item>
    <item>
      <title>XSS, CSRF</title>
      <link>https://geonoo.tistory.com/157</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;XSS(CSS) 크로스사이트 스크립트 란&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpeKgn/btrEmaJMSKG/yYl6UqrESWzJSSoXOqKzl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpeKgn/btrEmaJMSKG/yYl6UqrESWzJSSoXOqKzl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpeKgn/btrEmaJMSKG/yYl6UqrESWzJSSoXOqKzl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpeKgn%2FbtrEmaJMSKG%2FyYl6UqrESWzJSSoXOqKzl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;750&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격방법은 해커가 웹 페이지에서 악성 스크립트를 넣습니다.&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;악성 스크립트가 실행되면서 해커에게 사용자의 정보가 넘어오게 되는 공격 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;공격자는 이런 공격을 통해 사용자의 개인정보, 세션쿠키정보, 악성코드 다운로드 등을 이용해 공격을 수행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CSRF(크로스사이트 요청 변조)란?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1FlcH/btrEmbBWHG4/ocWJgekq8N2bNixUbv0MQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1FlcH/btrEmbBWHG4/ocWJgekq8N2bNixUbv0MQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1FlcH/btrEmbBWHG4/ocWJgekq8N2bNixUbv0MQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1FlcH%2FbtrEmbBWHG4%2FocWJgekq8N2bNixUbv0MQK%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;571&quot; height=&quot;646&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS와 같이 악성 스크립트를 삽입하는 것까지는 같지만 사용자가 악성 스크립트가 포함된 게시글을 열람했을 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 권한으로 웹서버에 공격을 가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS와 다른점은 웹서버에 CSRF 스크립트를 실행 시킨다는 점이죠.&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;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;공격이 실행되는 위치입니다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;XSS는 클라이언트&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;PC&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;에서 실행되며 사용자의 정보를 탈취하는 것이고&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;, CSRF&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;는 위조된 요청을 서버에 보내어 서버단에서 스크립트가 실행됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;두가지 공격에 대한 대응방안&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;쿠키에 저장되는 정보나 서버에서 내려주는 정보를 읽지 못하게 &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;정보를 암호화 해야합니다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;게시물을 등록할 때나 사용자 입력이 들어가는 페이지라면 스크립트 코드가 적용되지 않게 특수문자를 변환해야 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;요청할 때의 도메인을 검사하여, 올바르게 웹페이지에서 요청한건지 검증해야합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;사용자&amp;nbsp; 세션에 임의의 난수 값을 저장하고, 사용자의 요청 마다 해당 난수 값을 포함 시켜 전송해야합니다. 이렇게 하면 서버에서 내려준 난수값과 사용자가 요청한 난수값이 일치한다면 사용자가 보낸 요청인지 판단할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>CS</category>
      <category>CSRF</category>
      <category>xss</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/157</guid>
      <comments>https://geonoo.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 9 Jun 2022 13:36:59 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 스프링 컨테이너와 빈</title>
      <link>https://geonoo.tistory.com/156</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링&amp;nbsp;컨테이너와&amp;nbsp;빈&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 말하는 자바 객체를 스프링에서는 빈(Bean)이라고 부른다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저번에 공부했던  IoC와 DI의 원리가 이 스프링 컨테이너에 적용된다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸시킬 수 있는데, 스프링 컨테이너가 이 역할을 대신해 준다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 컨테이너의 종류&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BeanFactory&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할을 한다.&lt;/span&gt;&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;color: #000000;&quot;&gt;빈을 추가할 때는 이런식으로 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654742056883&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class AppConfig {

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(discountPolicy());
    }

    @Bean
    public FixDiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPhAH4/btrEmP57C7K/RpM6rE4PKLPMZc7mYF1FGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPhAH4/btrEmP57C7K/RpM6rE4PKLPMZc7mYF1FGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPhAH4/btrEmP57C7K/RpM6rE4PKLPMZc7mYF1FGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPhAH4%2FbtrEmP57C7K%2FRpM6rE4PKLPMZc7mYF1FGK%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;314&quot; height=&quot;204&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이제 컨테이너 안에 들어가 있는 빈을 사용해보자&lt;/p&gt;
&lt;pre id=&quot;code_1654742422857&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {

    public static void main(String[] args) {
        final BeanFactory beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
        final OrderService orderService = beanFactory.getBean(&quot;orderService&quot;, OrderService.class);
        final Order order = orderService.createOrder(15, &quot;샤프&quot;, 3000);
        System.out.println(order.getDiscountPrice());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BeanFactory를 AnnotationConfigApplicationContext로 구현하고, AppConfig를 구성정보로 지정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 빈 저장소에서 orderService를 가져올건데 OrderService 타입을 지정해주지 않으면 Object 타입으로 오니 주의해야한다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654742840131&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4e718207
13:52:20.460 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
13:52:20.738 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
13:52:20.741 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
13:52:20.743 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
13:52:20.745 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
13:52:20.758 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
13:52:20.767 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderService'
13:52:20.793 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'discountPolicy'
1000&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뭔가 긴 빈 이름은 미리 정의된 초기 빈들이고 appConfig, orderService, discountPolicy가 우리가 등록한 빈이라는 사실을 알 수 있다. 또한, OrderService는 DiscountPolicy를 주입해 주어야 하는데 스프링 컨테이너가 알아서 주입을 해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ApplicationContext&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ApplicationContext도 BeanFactory처럼 빈을 관리할 수 있습니다. Main 코드에서 BeanFactory를 ApplicationContext로만 바꾸고 실행해 보면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654743011642&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {

    public static void main(String[] args) {
        final ApplicationContext beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
        final OrderService orderService = beanFactory.getBean(&quot;orderService&quot;, OrderService.class);
        final Order order = orderService.createOrder(15, &quot;샤프&quot;, 3000);
        System.out.println(order.getDiscountPrice());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 결과를 얻을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1654743041464&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;13:56:08.105 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4e718207
13:56:08.136 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
13:56:08.391 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
13:56:08.396 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
13:56:08.398 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
13:56:08.401 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
13:56:08.417 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
13:56:08.431 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderService'
13:56:08.458 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'discountPolicy'
1000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 이유는 &lt;b&gt;ApplicationContext&lt;/b&gt;가 &lt;b&gt;BeanFactory&lt;/b&gt;의 상속을 받았기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654743547110&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

	...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;완전 정확히 BeanFactory 자체에 상속을 받은 것은 아니지만 빈을 관리하는 기능을 물려받은 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 ApplicationContext는 그 외에도 국제화가 지원되는 텍스트 메시지 관리, 이미지같은 파일 자원을 로드, 리너스로 등록된 빈에게 이벤트 발생 알림 등 부가적인 기능을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 스프링 컨테이너하면 주로 이 ApplicationContext를 뜻한다고 한다.&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&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;BeanFactory는 처음으로 getBean() 메소드가 호출된 시점에서야 해당 빈을 생성&lt;/b&gt;하고, &lt;br /&gt;&lt;b&gt;ApplicationContext는 Context 초기화 시점에 모든 싱글톤 빈을 미리 로드&lt;/b&gt;한 후 &lt;b&gt;애플리케이션 가동 후에는 빈을 지연 없이 받을 수 있다.&lt;/b&gt;&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;22-06-09 싱글톤 컨테이너에 대해 정리하기&lt;/p&gt;</description>
      <category>Spring</category>
      <category>spirng</category>
      <category>빈</category>
      <category>스프링컨테이너</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/156</guid>
      <comments>https://geonoo.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 9 Jun 2022 12:06:44 +0900</pubDate>
    </item>
    <item>
      <title>파일 시스템과 블록 &amp;amp; 파일을 휴지통에 넣을 때...</title>
      <link>https://geonoo.tistory.com/155</link>
      <description>&lt;h4 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;파일 시스템은 운영체제에서 하드디스크, USB메모리 등과 장치 같은 물리적인 저장 매체를 파일과 &lt;b&gt;폴더의 계층 구조&lt;/b&gt;처럼 보이게 하는 부분이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceAbeU/btrEiOgaG6i/sLvvmKFbsyCxsfNIqIzIEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceAbeU/btrEiOgaG6i/sLvvmKFbsyCxsfNIqIzIEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceAbeU/btrEiOgaG6i/sLvvmKFbsyCxsfNIqIzIEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceAbeU%2FbtrEiOgaG6i%2FsLvvmKFbsyCxsfNIqIzIEk%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;468&quot; height=&quot;748&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 시스템&lt;/b&gt;은 다양한 종류의 &lt;b&gt;정보를 조직화하고 저장&lt;/b&gt;하지만, 운영체제는 &lt;b&gt;모두 동일한 인터페이스&lt;/b&gt;로 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 시스템&lt;/b&gt;은 &lt;b&gt;모든 정보를 관리&lt;/b&gt;하면서 &lt;b&gt;애플리케이션이나 운영체제의 나머지 부분이 정보를 읽고 쓸 수 있도록 접근 가능&lt;/b&gt;하게 만든다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 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;한 파일이 사용하는 바이트를 다른&amp;nbsp; 파일이 사용하는 바이트와 같은 블록에 저장하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2,500바이트의 메일이 있다고 하면 1,000바이트 짜리 블록 세 개에 저장되는데 500바이트가 낭비된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;낭비되는 부분을 관리하는 비용보다 보조기억장치의 용량을 늘리는 비용이 더 저렴하기 때문에 낭비하면서 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 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;윈도우 컴퓨터나 맥 컴퓨터의 기본 파일 개수가 80~90만개라고 하는데, 이 파일 위치들은 어떻게 관리될까?&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;&lt;b&gt;* 엔트리? 디렉터리 엔트리라고 하며, 디렉터리를 표현하는 데 쓰이는 자료 구조&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9352Q/btrEivOGJOZ/dSfaFv2eS3YFCnhe1SUArk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9352Q/btrEivOGJOZ/dSfaFv2eS3YFCnhe1SUArk/img.png&quot; data-alt=&quot;블록 번호 목록을 담고있는 블록을 참조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9352Q/btrEivOGJOZ/dSfaFv2eS3YFCnhe1SUArk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9352Q%2FbtrEivOGJOZ%2FdSfaFv2eS3YFCnhe1SUArk%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;523&quot; height=&quot;524&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;블록 번호 목록을 담고있는 블록을 참조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSD는 &lt;b&gt;장치의 각 영역이 사용될 수 있는 횟수가 제한이 있기 때문에&lt;/b&gt;, SSD 내부 소프트웨어에서 &lt;b&gt;각 블록이 몇 번이나 사용되었는지 파악&lt;/b&gt;하고, 모든 &lt;b&gt;블럭이 거의 같은 횟수로 사용되도록 데이터를 옮기&lt;/b&gt;는데, 이 처리를 &lt;b&gt;웨어 레벨링&lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) Mac PC에서 파일결로가 /User/bwk/book/book.txt 라면 파일 시스템은 파일 시스템의 최상위에서 Users를 찾고, 다음으로 그 폴더에서 bwk를 찾을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일시스템이 찾는 방법이나 내가 찾는 방법이나 비슷한것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzlHk5/btrEjUGIPZO/4eFa0UMzkFjhk3PvZol2z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzlHk5/btrEjUGIPZO/4eFa0UMzkFjhk3PvZol2z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzlHk5/btrEjUGIPZO/4eFa0UMzkFjhk3PvZol2z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzlHk5%2FbtrEjUGIPZO%2F4eFa0UMzkFjhk3PvZol2z0%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;542&quot; height=&quot;692&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 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;/b&gt; &lt;b&gt;새로운 엔트리에 넣으면서 이름, 날짜 등을 넣고 크기는 0으로 표시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 데이터를 사용하면 &lt;b&gt;파일 시스템이 미사용 블록을 찾아서 데이터를 복사해 넣고&lt;/b&gt;, 폴더의 블록 목록에 블록들을 삽입하면 정상으로 생성 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴지통이라는 폴더에 이동하는것과 같다고 보면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;휴지통 비우기가 원래 의도 했던 제거 작업에 가깝다.&lt;/b&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;휴지통 비우기를 해서 블록이 미사용 목록에 들어가지만, 새로운 파일이 할당되기 전까지는 아직 삭제되지 않은 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;그래서 제거한 파일이 복구가 가능했던 것이고, 완벽하게 지우려면  부시면 된다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무튼 컴퓨터에 기록하는 모든 정보에는 무슨 말을 쓸지 신중해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;다른&amp;nbsp; 파일 시스템&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CD-ROM, DVD, USB, SD카드 모두 파일 계층 구조로 되어있는 파일 시스템처럼 정보에 접근 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... 관련해서는 생략 &lt;s&gt;(현재 시각 2:48)&lt;/s&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷한 아이디어를 적용한 다른 사례를 하나만 더 살펴보고 끝내보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 파일 시스템이 있는데, 이 시스템은 소프트웨어를 활용해서 &lt;b&gt;다른 컴퓨터의 파일 시스템이 마치 자신의 컴퓨터에 있는 것처럼 파일 탐색기, 파인더, 또는 다른 프로그램을 사용하여 접근하게 해준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사나 학교에서 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제가 달라도 균일한 인터페이스를 제공함으로써 파일 구조가 로컬 컴퓨터에 있는 일반 파일 시스템 처럼 보이게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번쯤 들어본 NAS랑 비슷하다고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAS? &lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;컴퓨터에 직접 연결하지 않고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;네트워크&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;를 통해 데이터를 주고 받는 저장장치이다.&lt;br /&gt;N&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;etwork&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;A&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;ttached&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;S&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;torage. 네트워크 결합 스토리지. 쉽게 말하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;LAN&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;으로 연결하는 외장 하드디스크&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;048&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/048.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/048.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <category>파일시스템</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/155</guid>
      <comments>https://geonoo.tistory.com/155#entry155comment</comments>
      <pubDate>Thu, 9 Jun 2022 02:59:13 +0900</pubDate>
    </item>
    <item>
      <title>DNS(Domain Name System)?</title>
      <link>https://geonoo.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;도메인이라는것은 웹사이트 주소를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;www.geonoo.com&lt;/b&gt; 에서 &lt;b&gt;geonoo.com&lt;/b&gt; 이 도메인에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;www&lt;/b&gt;는 호스트 네임이라고 불리고 www 말고도 mail, shop 과같이 다른 것이 올 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpBW7B/btrEhp0IzHs/CffHw5zKq5iM5z9TvaOjc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpBW7B/btrEhp0IzHs/CffHw5zKq5iM5z9TvaOjc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpBW7B/btrEhp0IzHs/CffHw5zKq5iM5z9TvaOjc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpBW7B%2FbtrEhp0IzHs%2FCffHw5zKq5iM5z9TvaOjc0%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;510&quot; height=&quot;338&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 웹 브라우저에서 네이버라는 웹사이트를 들어가고 싶은데 그러려면 네이버 서버의 IP주소를 알아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리가 전화번호를 다 못 외우듯이 IP주소도 숫자로 되어있기 때문에 외우기는 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 아래와 같이 전화번호부 처럼 도메인과 IP주소로 관리를 하는것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 : www.naver.com&lt;br /&gt;IP : 223.130.200.104&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이러한 &lt;b&gt;도메인과 IP들이 저장되어있는 곳을 DNS라고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예를 들어 내가 AWS에서 구매한 내 컴퓨터를 가비아, 후이즈같은 사이트에서 도메인을 구입해서 연결해주었다고 가정해보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 컴퓨터 브라우저에서&amp;nbsp; &lt;a href=&quot;http://www.geonoo.com&quot;&gt;www.geonoo.com&lt;/a&gt; 으로 접속하려고 하려고 하면 내 브라우저는 해당 서버의 IP를 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 브라우저는 PC에 설정된 &lt;b&gt;Local&lt;/b&gt; DNS 서버에게 해당 도메인과 IP를 가지고 있는지 물어본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ms5ak/btrEdSwAtwo/pvGtD1N4yCSMKzKIJlVVMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ms5ak/btrEdSwAtwo/pvGtD1N4yCSMKzKIJlVVMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ms5ak/btrEdSwAtwo/pvGtD1N4yCSMKzKIJlVVMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fms5ak%2FbtrEdSwAtwo%2FpvGtD1N4yCSMKzKIJlVVMk%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;280&quot; height=&quot;442&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Local DNS에 geonoo.com 이라는 주소가 이미 저장되어있을 수도 있고 없을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소가 이미 있다면 바로 IP주소를 찾았으니, 접속이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 없다면 Local DNS가 Root DNS 서버에게 geonoo.com 이라는 IP를 어디서 찾을 수 있는지 물어본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beez6p/btrEfCT6pYz/plm21KYkqsZ9PCzsyb9ark/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beez6p/btrEfCT6pYz/plm21KYkqsZ9PCzsyb9ark/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beez6p/btrEfCT6pYz/plm21KYkqsZ9PCzsyb9ark/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbeez6p%2FbtrEfCT6pYz%2Fplm21KYkqsZ9PCzsyb9ark%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;493&quot; height=&quot;233&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(Root DNS서버는 전 세계 13개가 있다고 하고 한국에는 없지만 미러 서버가 이를 대신한다고 한다.)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 Root DNS 서버는 먼저 .com 들이 모여있는 DNS 서버의 IP주소를 반환 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 Local DNS 서버는 .com이 모여있는 곳에가서 다시 geonoo.com 이라는 서버가 있는지 물어본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH72Um/btrEeXYtc65/VRUdWvblEK4k0Dckdtcz51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH72Um/btrEeXYtc65/VRUdWvblEK4k0Dckdtcz51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH72Um/btrEeXYtc65/VRUdWvblEK4k0Dckdtcz51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH72Um%2FbtrEeXYtc65%2FVRUdWvblEK4k0Dckdtcz51%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;576&quot; height=&quot;223&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 .com DNS서버는 geonoo.com&amp;nbsp;이&amp;nbsp; 모여있는 DNS 서버 IP를 반환할 것이고 Local DNS 서버는 해당 IP에가서 최종적으로 www.geonoo.com 을 찾을 수 있을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KULxf/btrEhp7Pqyh/KEkKpnh9yHfXwT4gKtCv5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KULxf/btrEhp7Pqyh/KEkKpnh9yHfXwT4gKtCv5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KULxf/btrEhp7Pqyh/KEkKpnh9yHfXwT4gKtCv5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKULxf%2FbtrEhp7Pqyh%2FKEkKpnh9yHfXwT4gKtCv5K%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;689&quot; height=&quot;848&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 마지막으로 Local DNS 서버가 내 컴퓨터에게 www.geonoo.com의 IP주소를 반환해줄 것이고, 우리는 www.geonoo.com에 접근할 수 있는것이다.&lt;/p&gt;</description>
      <category>CS</category>
      <category>CS</category>
      <category>dns</category>
      <category>내 서버 접근</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/154</guid>
      <comments>https://geonoo.tistory.com/154#entry154comment</comments>
      <pubDate>Wed, 8 Jun 2022 13:35:12 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] DI(Dependency Injection)를 사용하는 이유</title>
      <link>https://geonoo.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring boot에서 DI를 사용하게된 이유를 알려면 강한결합과 느슨한결합에 대해서 알아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강합결합과 느슨한결합 중 강한 결합은 문제가 있는데, 어떤 문제인지 예제를 통해서 알아보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Controller1에서 Service1 객체를 생성해서 사용했다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;public class Controller1 {
    private final Service1 service1;

    public Controller1() {
        this.service1 = new Service1();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Service1은 Repository1 객체를 생성해서 사용했다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;public class Controller1 {
    private final Service1 service1;

    public Controller1() {
        this.service1 = new Service1();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Repostiroy1 객체가 이렇게 되어있다가&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public class Repository1 { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 처럼 데이터베이스의 ID와 PW가 필요해졌다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;public class Repository1 {

    public Repository1(String id, String pw) {
    // DB 연결
    Connection connection = DriverManager.getConnection(&quot;jdbc:h2:mem:geonoodb&quot;, id, pw);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 Repository1의 코드가 변경되어서 아래 처럼 모든 Controller를 수정해야하는 경우가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lhhev/btrD9GC4rAj/hAOs0hK4bKK814wVMwHos1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lhhev/btrD9GC4rAj/hAOs0hK4bKK814wVMwHos1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lhhev/btrD9GC4rAj/hAOs0hK4bKK814wVMwHos1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLhhev%2FbtrD9GC4rAj%2FhAOs0hK4bKK814wVMwHos1%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;572&quot; height=&quot;381&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&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;그렇다면 이러한 문제를 해결할 방법은 어떤것이 있을지 생각해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 해야할 일을 정리해 본다면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 객체에 대한 객체 생성은 딱 1번만 하고 싶다.&lt;/li&gt;
&lt;li&gt;생성된 객체를 모든 곳에서 재사용 하고 싶다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방법을 적용하려면,  repository1에서 new 객체를 생성하고 Service와 Controller는 생성되어있는 객체를 사용하기만 하면되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시를 들어서 생각해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Repositroy1에서 객체를 생성했다.&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;public class Repository1 { ... }

// 객체 생성
Repository1 repository1 = new Repository1();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AL3p2/btrEaNa2izk/dv2ThUYXfbRIfSC7HGo8K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AL3p2/btrEaNa2izk/dv2ThUYXfbRIfSC7HGo8K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AL3p2/btrEaNa2izk/dv2ThUYXfbRIfSC7HGo8K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAL3p2%2FbtrEaNa2izk%2Fdv2ThUYXfbRIfSC7HGo8K1%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;307&quot; height=&quot;334&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&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;그런다음 Service1 클래스 선언 및 객체 생성 해보자.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Class Service1 {
    private final Repository1 repitory1;

    // repository1 객체 사용
    public Service1(Repository1 repository1) {
        //this.repository1 = new Repository1();
        this.repository1 = repository1;
    }
}

// 객체 생성
Service1 service1 = new Service1(repository1);&lt;/code&gt;&lt;/pre&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;1368&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZK8a0/btrEczJ65F4/Y6E9d0AmkcchqJYKJEUo90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZK8a0/btrEczJ65F4/Y6E9d0AmkcchqJYKJEUo90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZK8a0/btrEczJ65F4/Y6E9d0AmkcchqJYKJEUo90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZK8a0%2FbtrEczJ65F4%2FY6E9d0AmkcchqJYKJEUo90%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;608&quot; height=&quot;152&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service는 repository1 객체를 가지고 있고 이 객체는 생성되있는 객체를 다시 사용한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller까지 변경해주자&lt;/p&gt;
&lt;pre id=&quot;code_1654588163606&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Class Controller1 {
	private final Service1 service1;

	// service1 객체 사용
	public Controller1(Service1 service1) {
		//this.service1 = new Service1();
		this.service1 = service1;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아까와 같이 데이터베이스 연결을 해야하는데, id와 pw가 필요하다면?&lt;/p&gt;
&lt;pre id=&quot;code_1654588252938&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Repository1 {

	public Repository1(String id, String pw) {
    // DB 연결
    Connection connection = DriverManager.getConnection(&quot;jdbc:h2:mem:geonoodb&quot;, id, pw);
  }
}

// 객체 생성
String id = &quot;sa&quot;;
String pw = &quot;&quot;;
Repository1 repository1 = new Repository1(id, pw);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게만 변경해주면 Service, Controller는 변경하지 않고도 원하는 로직이 수행 가능해 졌다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPVC8h/btrEc3KGSLv/m7FbbQjUOeG3D0kWKFPAUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPVC8h/btrEc3KGSLv/m7FbbQjUOeG3D0kWKFPAUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPVC8h/btrEc3KGSLv/m7FbbQjUOeG3D0kWKFPAUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPVC8h%2FbtrEc3KGSLv%2Fm7FbbQjUOeG3D0kWKFPAUK%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;664&quot; height=&quot;928&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯 repository1가 변경되어도 Service와 Controller에 있는 코드는 정상적으로 돌아가게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이렇게 변경된 결합을 느슨한 결합이라고 한다. (강한결합 -&amp;gt; 느슨한 결합)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼이제 DI에 대해서 공부해보자&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IoC(&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;IoC: Inversion of Control&lt;/span&gt;) ; 제어의 역전&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻은 프로그램의 흐름이 뒤바뀌었다는 의미이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWX8G2/btrEbEEYAMf/VedILOLDvTsSk2TuXf7EE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWX8G2/btrEbEEYAMf/VedILOLDvTsSk2TuXf7EE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWX8G2/btrEbEEYAMf/VedILOLDvTsSk2TuXf7EE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWX8G2%2FbtrEbEEYAMf%2FVedILOLDvTsSk2TuXf7EE0%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;643&quot; height=&quot;178&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&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;먼저 왼쪽에있는 그림은 Controller에서 Service를 생성하고 Service에서 respository를 생성하여 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽은 Repository에서 생성된 객체를 Service에서 재사용해서 Service를 생성하고 다시 Controller에서 Service를 재사용 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상황을 제어의 역전(IoC)라고 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Controller -&amp;gt; Service -&amp;gt; Repository&lt;/li&gt;
&lt;li&gt;Repository -&amp;gt; Service -&amp;gt; Controller&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이렇게 용도에 맞게 객체를 그냥 가져다 사용하는것을 DI라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 차근차근 알아봤듯이 DI는 유연성을 확보하고 결합도를 낮출수 있는것이다.&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;DI, IoC에 대해서 어느정도 이해는 가지만 실제로 코드로 적용하려면 IoC컨테이너와 Bean에대해서 알아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 주제는 정해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너와 Bean에 대해 공부해 봐야곘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/156?category=1077864&quot;&gt;https://geonoo.tistory.com/156?category=1077864&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1654744183427&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 컨테이너와 빈&quot; data-og-description=&quot;스프링&amp;nbsp;컨테이너와&amp;nbsp;빈 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bea&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/156?category=1077864&quot; data-og-url=&quot;https://geonoo.tistory.com/156&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ci6qna/hyOIeNZ1Sa/qkgkeCkGVEfWzGUQZ3uuTK/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/q9WBt/hyOGSluuKm/nfQtyZHEVH1xgumZ4lDIm1/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/dM2BZf/hyOIjBMjzA/6eAqjIUQpcKrJ4vrhlC1ak/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/156?category=1077864&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/156?category=1077864&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ci6qna/hyOIeNZ1Sa/qkgkeCkGVEfWzGUQZ3uuTK/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/q9WBt/hyOGSluuKm/nfQtyZHEVH1xgumZ4lDIm1/img.png?width=670&amp;amp;height=436&amp;amp;face=0_0_670_436,https://scrap.kakaocdn.net/dn/dM2BZf/hyOIjBMjzA/6eAqjIUQpcKrJ4vrhlC1ak/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] 스프링 컨테이너와 빈&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링&amp;nbsp;컨테이너와&amp;nbsp;빈 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bea&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Spring</category>
      <category>DI</category>
      <category>IOC</category>
      <category>강한결합</category>
      <category>느슨한결합</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/153</guid>
      <comments>https://geonoo.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 7 Jun 2022 17:52:36 +0900</pubDate>
    </item>
    <item>
      <title>Controller, Service, Repository</title>
      <link>https://geonoo.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Controller, Service, Repository를 알기전에는 MVC 패턴에 대해서 이해해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/148&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654581178903&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] MVC 패턴 (ORM, SQL) - 회고&quot; data-og-description=&quot; Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다. 처음으로 JPA를 사용해봤고 정리해봤다. https://geonoo.tistory.com/147?category=1077864 [Spring] Java Persistence API - JPA Java Persistence API(..&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/148&quot; data-og-url=&quot;https://geonoo.tistory.com/148&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bulS2Q/hyOGSxnWtU/sQBAKjuIiRz3IyMAIO6Cdk/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/bkAwHI/hyOGVt7qba/Yq5kJpujAp3kGRkFMyPQB1/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/eKeM54/hyOFvRmvsJ/MdLlr67VpsOMWCVnMSgtn1/img.png?width=1174&amp;amp;height=740&amp;amp;face=0_0_1174_740&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/148&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bulS2Q/hyOGSxnWtU/sQBAKjuIiRz3IyMAIO6Cdk/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/bkAwHI/hyOGVt7qba/Yq5kJpujAp3kGRkFMyPQB1/img.png?width=800&amp;amp;height=504&amp;amp;face=0_0_800_504,https://scrap.kakaocdn.net/dn/eKeM54/hyOFvRmvsJ/MdLlr67VpsOMWCVnMSgtn1/img.png?width=1174&amp;amp;height=740&amp;amp;face=0_0_1174_740');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] MVC 패턴 (ORM, SQL) - 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt; Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다. 처음으로 JPA를 사용해봤고 정리해봤다. https://geonoo.tistory.com/147?category=1077864 [Spring] Java Persistence API - JPA Java Persistence API(..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MVC패턴에 대해서 간략이 정리해 봤고, 그럼 MVC 패턴을 사용하는 이유는 무엇일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론 역할에 따른 분리로 인해서 유지보수성, 확장성, 유연성이 증가하고, 코드의 중복도 사라지는 효과때문에 MVC 패턴을 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC패턴 설명과 똑같이 Controller은 MVC에서 C에 해당 하며 주로 사용자의 요청을 처리 한 후 지정된 뷰에 모델 객체를 넘겨주는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 요청이 진입하는 지점이며 요청에 따라 어떤 처리를 할지 결정을 Service에 넘겨준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Service에서 실질적으로 처리한 내용을 다시 Controller가 받고 받은것을 Controller가 넘겨주는 역할을 하는것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5gXK/btrD8NCjpWq/iARlDfWeGeh0QQMERPjCKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5gXK/btrD8NCjpWq/iARlDfWeGeh0QQMERPjCKk/img.png&quot; data-alt=&quot;Controller 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5gXK/btrD8NCjpWq/iARlDfWeGeh0QQMERPjCKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5gXK%2FbtrD8NCjpWq%2FiARlDfWeGeh0QQMERPjCKk%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;360&quot; height=&quot;239&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Controller 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&quot;service-란&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스에는 사용자의 요구사항을 처리하는 로직이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB의 데이터가 필요할 때는 Repository 에게 요청을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규모 프로젝트일 수록 Service의 내용이 비대해질 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pVVgr/btrD1sZw9wH/XOYlcViKWgW0oHnzfqo0tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pVVgr/btrD1sZw9wH/XOYlcViKWgW0oHnzfqo0tK/img.png&quot; data-alt=&quot;Service와 Repository&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pVVgr/btrD1sZw9wH/XOYlcViKWgW0oHnzfqo0tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpVVgr%2FbtrD1sZw9wH%2FXOYlcViKWgW0oHnzfqo0tK%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;390&quot; height=&quot;82&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Service와 Repository&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&quot;service-란&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Repository&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Entity에 의해 생성된 DB에 접근하는 메서드 들을 사용하기 위한 인터페이스입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;쉽게 말해 DB 연결, 해제, 자원을 관리하고 CRUD 작업을 처리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfWGe/btrEcPTcEFy/p8UOePpIGZQoA7Grz1e4Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfWGe/btrEcPTcEFy/p8UOePpIGZQoA7Grz1e4Ak/img.png&quot; data-alt=&quot;Repository&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfWGe/btrEcPTcEFy/p8UOePpIGZQoA7Grz1e4Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyfWGe%2FbtrEcPTcEFy%2Fp8UOePpIGZQoA7Grz1e4Ak%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;397&quot; height=&quot;107&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Repository&lt;/figcaption&gt;
&lt;/figure&gt;
&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;1408&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfrqi/btrD6x07n9H/iHkXEVeWcvNfcAf2BEvpg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfrqi/btrD6x07n9H/iHkXEVeWcvNfcAf2BEvpg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfrqi/btrD6x07n9H/iHkXEVeWcvNfcAf2BEvpg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwfrqi%2FbtrD6x07n9H%2FiHkXEVeWcvNfcAf2BEvpg1%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;599&quot; height=&quot;227&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&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;p data-ke-size=&quot;size16&quot;&gt;간단한 게시판 만들때 Controller에서 Repository를 바로 호출하게 구현한적이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면 Service의 역할을 나누어 놓는 이유가 사라지기 때문에 다음에는 역할에 맞는 로직으로 구현해봐야겠다.&lt;/p&gt;</description>
      <category>Spring</category>
      <category>Controller</category>
      <category>repository</category>
      <category>service</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/152</guid>
      <comments>https://geonoo.tistory.com/152#entry152comment</comments>
      <pubDate>Tue, 7 Jun 2022 15:13:53 +0900</pubDate>
    </item>
    <item>
      <title>객체지향(Object Oriented Programming) 정리</title>
      <link>https://geonoo.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;면접에서 꼭 질문하는 꼬리에 꼬리를 무는 객체지향에대해서 공부해 보려고 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;객체&amp;nbsp;지향&amp;nbsp;프로그래밍(Object&amp;nbsp;Oriented&amp;nbsp;Programming)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 객체란 우리가 실생활에서 쓰는 모든 것을 객체라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 예로 선풍기, 노트북 주변에 있는 모든것들이 객체가 될 수 있다. 사물뿐만 아니라 동물, 사람도 마찬가지로 객체가 될 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 객체 지향 프로그래밍은 먼저 &lt;b&gt;객체를 파악&lt;/b&gt;하고, 이 &lt;b&gt;객체들이 무슨 역할&lt;/b&gt;을 하는지 &lt;span style=&quot;color: #000000;&quot;&gt;정의하여 &lt;b&gt;객체들 간의 상호작용&lt;/b&gt;을 통해 프로그램을 만드는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결론, &lt;b&gt;필요한 데이터를 추상화&lt;/b&gt; 시켜서 상태와 행위를 가진 &lt;b&gt;객체를 만들고&lt;/b&gt; 그 객체들간의&lt;b&gt; 상호작용을 통해 로직을 구성&lt;/b&gt;하는 방법론인거다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추상화&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;b&gt;추상화&lt;/b&gt;시킨다는 말은 어떤 의미일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공통의 속성이나 기능을 묶어서 이름을 붙이는것을 의미&lt;/b&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;그리고 동물들은 각각 공통의 속성들을 가지고 있을 것이다. 예를들어 키나, 몸무게, 달리기 등과 같이 말이다.&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;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public abstract class Animal {
    String name;
    int speed;

    Animal(String name, int speed){
        this.name = name;
        this.speed = speed;
    }

    abstract void run();

}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;public class Turtle extends Animal {

    Turtle(String name, int speed) {
        super(name, speed);
    }

    @Override
    void run() {
        System.out.println(this.name+&quot;는 &quot;+speed+&quot;의 속도로 달린다.&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;public class Rabbit extends Animal {
    Rabbit(String name, int speed) {
        super(name, speed);
    }

    @Override
    void run() {
        System.out.println(this.name+&quot;는 &quot;+speed+&quot;의 속도로 달린다.&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Match {

    public static void main(String[] args) {
        Rabbit rabbit = new Rabbit(&quot;토끼&quot;, 5);
        Turtle turtle = new Turtle(&quot;거북이&quot;, 1);

        rabbit.run();
        turtle.run();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동물이라는 객체로 추상화해서 공통의 속성이나 메소드를 묶어서 이름을 붙여 놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;속성들을 재정의 할 필요가 없어졌고 메소드도 통일감있게 작성할 수 있게 되었다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;결론적으로 추상화를 하는 이유는 중복코드가 줄고 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;코드의 재사용성이 증가하기 때문에 추상화를 하는 목적이 된다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상위 개념의 특징을 하위 개념이 물려받는 것이 상속이다! (우리가 알고있는 개념과 같다.)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 위에 있는 코드에 상속이라는 개념이 들어가있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동물(Animal)객체가&amp;nbsp; 상위 개념이고 거북이와 토끼가 속성들을 물려 받은 것이다. - (&lt;b&gt;extends&lt;/b&gt;)&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class Rabbit extends Animal {
    Rabbit(String name, int speed) {
        super(name, speed);
    }

    @Override
    void run() {
        System.out.println(this.name+&quot;는 &quot;+speed+&quot;의 속도로 달린다.&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;추상화를 한 뒤에는 상속이라는 개념이 따라 올 수 밖에 없는것같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;열심히 추상화를 했지만 묶어놓은 기능을 사용하려면 결국 상속을 받아서 사용해야 하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;상속은 예제와 같이 속성이나 메서드를 재사용한다. 이로 인해 코드가 줄어든다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그래서 메소드(이용방법)만 접근가능하고 속성값들은 접근할 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 코드로 작성해보면&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class Turtle extends Animal {

    private int hungry = 10;

    Turtle(String name, int speed) {
        super(name, speed);
    }

    @Override
    void run() {
        System.out.println(this.name+&quot;는 &quot;+speed+&quot;의 속도로 달린다.&quot;);
        hungry(); // 달렸더니 허기가 지는군요.
    }

    public void hungry(){
        hungry++;
        System.out.println(&quot;열심히 달렸더니 허기가 지군요.&quot;);
    }

    public void eat(){
        hungry--;
        System.out.println(name+&quot; 이(가) 밥을먹어서 배고픔 지수가 &quot; +this.hungry+&quot;가 되었습니다.&quot;);
    }

    public void status(){
        System.out.println(name+&quot;의 배고픔 지수는 &quot; +this.hungry+&quot; 입니다.&quot;);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class Match {

    public static void main(String[] args) {
        Turtle turtle = new Turtle(&quot;거북이&quot;, 1);

        turtle.status();
        turtle.run();
        turtle.status();
        turtle.eat();
        turtle.status();
    }
}

//거북이의 배고픔 지수는 10 입니다.
//거북이는 1의 속도로 달린다.
//열심히 달렸더니 허기가 지군요.
//거북이의 배고픔 지수는 11 입니다.
//거북이 이(가) 밥을먹어서 배고픔 지수가 10가 되었습니다.
//거북이의 배고픔 지수는 10 입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;배고픈데 배고픈게 아닌게되는? 밥을 먹어야하는데 허기짐지수가 높아서 밥을 먹어야 하는 상황이 오지 않는 오류가 생기는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;함수 &lt;b&gt;중심적인 구조적 프로그래밍 언어에서는 프로그램 내부에서 데이터가 어디서 어떻게 변경되는지 파악하기 어려웠다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그로 인해 유지보수가 어려웠지만 &lt;b&gt;객체지향에서는 캡슐화를 통해서 유지보수성이 향상된 것이다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Getter &amp;amp; Setter&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 private로 멤버변수의 접근을 제한했지만 public 메서드로 Getter나 Setter를 만들었다.&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;&lt;b&gt;Getter나 Setter메소드로 접근하기 때문에, 올바르지 않은 예를 들어 타입을 맞추지 못했거나, 유효성을 통과하지 못할 데이터가 들어온다면 메소드를 통해서 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;클래스와&lt;/span&gt;&lt;span&gt; 인스턴스&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 우리는 매일 같이 클래스와 인스턴스를 보면서도 정확히 이게 머라고 말하기 어려울 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘부터는 확실히 설명할 수 있어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스(Class)는 간단히 객체를 만들기 위한 &lt;b&gt;틀 또는 설계도&lt;/b&gt;라고 생각하면 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스는 &lt;b&gt;설계도를 바탕으로&lt;/b&gt; 소프트웨어 세계에 &lt;b&gt;구현된 구체적인 실체&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 설계도를 작성하고 그걸 바탕으로 소프트웨어에서 사용가능한 구체적인 실체를 만들어내는 셈인거다.&lt;/p&gt;
&lt;h4 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;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;웹사전에 따르면, 다형성의 일반적인 의미는 '다양한 형태로 나타날 수 있는 능력'이라고 한다.&lt;/span&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;위에 예시들에서 토끼와 거북이는 동물이라는 객체의 속성과 메소드를 상속받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에 run()라는 메소드를 재정의 해서 사용했는데, 이 부분을 &lt;b&gt;오버라이딩이&lt;/b&gt;라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오버로딩이라는 개념은 같은 이름 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것을 의미한다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Run {
    static public void hungry(){
        System.out.println(&quot;열심히 달렸더니 허기가 지군요.&quot;);
    }
    static public void hungry(String name){
        System.out.println(name+&quot;이 열심히 달렸더니 허기가 지군요.&quot;);
    }
    static public void hungry(String name, int hungry){
        System.out.println(name+&quot;이 열심히 달렸더니 허기가 지군요. &quot;+hungry+&quot;만큼 배가 고파요!&quot;);
    }

    public static void main(String[] args) {
        hungry();
        hungry(&quot;토끼&quot;);
        hungry(&quot;토끼&quot;, 100);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드 처럼 메소드명은 같지만 매개변수 타입이나 개수를 변경하여 매개변수에 따라 다르게 호출하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향하면 빠질 수 없는 키워드인 추상화, 상속, 캡슐화, 클래스와 인터페이스 그리고 다형성에 대해서 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 키워드로 인해서 우리는 객체지향의 장단점을 알 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드를 재사용할 수 있다.&lt;/p&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 유지보수가 쉽다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 &lt;b&gt;객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 대향 프로젝트에 적합하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 &lt;b&gt;개발할 때 업무 분담하기 쉽다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 처리 속도가 상대적으로 느리다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 객체가 많으면 용량이 커질 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. 설계시 많은 시간과 노력이 필요하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>CS</category>
      <category>객체지향</category>
      <category>다형성</category>
      <category>상속</category>
      <category>인스턴스</category>
      <category>추상화</category>
      <category>캡슐화</category>
      <category>클래스</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/151</guid>
      <comments>https://geonoo.tistory.com/151#entry151comment</comments>
      <pubDate>Tue, 7 Jun 2022 11:15:19 +0900</pubDate>
    </item>
    <item>
      <title>[Git] gitignore - properties</title>
      <link>https://geonoo.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Git에 프로젝트를 올리면 apllication.properties 같이 데이터베이스 정보나 AWS정보가 같이 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.gitignore 파일을 이용하면 파일이 원격레포지토리에서 보이지 않게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1654398895317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/.nb-gradle/

### VS Code ###
.vscode/

**/application.properties&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이런식으로 작성하고 git push 해주면되는데 .gitignore파일에 등록하지 못하고 깃에 올려 버렸다면 잘 적용이 되지 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 역시 구글링을 하게 되는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youngjinmo.github.io/2021/03/apply-new-gitignore/&quot;&gt;https://youngjinmo.github.io/2021/03/apply-new-gitignore/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654398725203&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Gitignore 새로 반영하기&quot; data-og-description=&quot;이미 변경관리에 의해 관리되고 있는 파일이라면 이후에 gitignore에 추가하더라도 변경관리에서 계속 추적이 될 수 있다. 이 때 gitignore를 변경관리에 적용하기 위해서는 변경관리가 추적중인 캐&quot; data-og-host=&quot;youngjinmo.github.io&quot; data-og-source-url=&quot;https://youngjinmo.github.io/2021/03/apply-new-gitignore/&quot; data-og-url=&quot;http://youngjinmo.github.io/2021/03/apply-new-gitignore/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DdLbN/hyOFKeVjip/FUs6bvDKWGPGUhhylJZVhk/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683,https://scrap.kakaocdn.net/dn/K49xf/hyOEcD7sj6/MKVY0Xzrckaq3FfB9NbuwK/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683,https://scrap.kakaocdn.net/dn/cbbvCi/hyOFJmMirO/WRb6rK8gq76ggps60I4I30/img.png?width=2080&amp;amp;height=1542&amp;amp;face=0_0_2080_1542&quot;&gt;&lt;a href=&quot;https://youngjinmo.github.io/2021/03/apply-new-gitignore/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngjinmo.github.io/2021/03/apply-new-gitignore/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DdLbN/hyOFKeVjip/FUs6bvDKWGPGUhhylJZVhk/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683,https://scrap.kakaocdn.net/dn/K49xf/hyOEcD7sj6/MKVY0Xzrckaq3FfB9NbuwK/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683,https://scrap.kakaocdn.net/dn/cbbvCi/hyOFJmMirO/WRb6rK8gq76ggps60I4I30/img.png?width=2080&amp;amp;height=1542&amp;amp;face=0_0_2080_1542');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gitignore 새로 반영하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이미 변경관리에 의해 관리되고 있는 파일이라면 이후에 gitignore에 추가하더라도 변경관리에서 계속 추적이 될 수 있다. 이 때 gitignore를 변경관리에 적용하기 위해서는 변경관리가 추적중인 캐&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngjinmo.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;위 블로그에서 말했듯이 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;이미 변경관리에 의해 관리되고 있는 파일이라면 이후에 gitignore에 추가하더라도 변경관리에서 계속 추적이 된다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;이 때 gitignore를 변경관리에 적용하기 위해서는 변경관리가 추적중인 캐시 파일을 삭제하고 새로 올려야 한다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;그런데 터미널에서 사용하는 git 프로그램이 필요 했다. Git Desktop에서는 명령어 치는곳이 없는거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;a href=&quot;https://velog.io/@wijoonwu/Mac-OS-%EC%97%90%EC%84%9C-Git-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@wijoonwu/Mac-OS-%EC%97%90%EC%84%9C-Git-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654399229604&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;맥에서 Git 설치하기&quot; data-og-description=&quot;Mac OS 에서 Git 설치하기&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@wijoonwu/Mac-OS-%EC%97%90%EC%84%9C-Git-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@wijoonwu/Mac-OS-에서-Git-설치하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qSNzW/hyOEgsXnY8/h3Xp0R0sO90uLVped3eGRK/img.png?width=1394&amp;amp;height=966&amp;amp;face=0_0_1394_966,https://scrap.kakaocdn.net/dn/Cr5Sn/hyOFCHXBab/TRVtJ9nmSiMqwYKM9HFsKk/img.png?width=1394&amp;amp;height=966&amp;amp;face=0_0_1394_966,https://scrap.kakaocdn.net/dn/lrMot/hyOEodudZU/rteebPm6oEQkHbg0NZNTo1/img.png?width=2092&amp;amp;height=1540&amp;amp;face=0_0_2092_1540&quot;&gt;&lt;a href=&quot;https://velog.io/@wijoonwu/Mac-OS-%EC%97%90%EC%84%9C-Git-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@wijoonwu/Mac-OS-%EC%97%90%EC%84%9C-Git-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qSNzW/hyOEgsXnY8/h3Xp0R0sO90uLVped3eGRK/img.png?width=1394&amp;amp;height=966&amp;amp;face=0_0_1394_966,https://scrap.kakaocdn.net/dn/Cr5Sn/hyOFCHXBab/TRVtJ9nmSiMqwYKM9HFsKk/img.png?width=1394&amp;amp;height=966&amp;amp;face=0_0_1394_966,https://scrap.kakaocdn.net/dn/lrMot/hyOEodudZU/rteebPm6oEQkHbg0NZNTo1/img.png?width=2092&amp;amp;height=1540&amp;amp;face=0_0_2092_1540');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;맥에서 Git 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mac OS 에서 Git 설치하기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 보면 쉽게 설치 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git을 설치하고 해당 폴더로 이동한다음&lt;/p&gt;
&lt;pre id=&quot;code_1654399374491&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rm -r --cached .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 날려주고 다시 push 해주면 잘 적용되는걸 볼 수 있다!!&lt;/p&gt;</description>
      <category>Git</category>
      <category>Git</category>
      <category>gitignore</category>
      <category>Properties</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/150</guid>
      <comments>https://geonoo.tistory.com/150#entry150comment</comments>
      <pubDate>Sun, 5 Jun 2022 12:23:51 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Spring Data JPA 기본 사용법 ( JpaRepository )</title>
      <link>https://geonoo.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 의존성 추가&lt;/p&gt;
&lt;pre id=&quot;code_1654396797239&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-data-jpa'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 도메인 객체 생성&lt;/p&gt;
&lt;pre id=&quot;code_1654396842745&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter @NoArgsConstructor @Entity
public class Comment extends BaseTimeEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String comment;

    @Column(nullable = false)
    private Long postId;

    public Comment(CommentDto commentDto){
        this.comment = commentDto.getComment();
        this.postId = commentDto.getPost_id();
    }

    public void update(CommentDto commentDto){
        this.comment = commentDto.getComment();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Repository 생성&lt;/p&gt;
&lt;pre id=&quot;code_1654396908084&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface CommentRepository extends JpaRepository&amp;lt;Comment, Long&amp;gt; {
    List&amp;lt;Comment&amp;gt; findAllByPostId(Long post_id);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 정의한 메소드 사용&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@GetMapping(&quot;/api/comment/{id}&quot;)
public List&amp;lt;Comment&amp;gt; listComment(@PathVariable Long id){
    return commentRepository.findAllByPostId(id);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Repository 구현하는 규칙&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA는 메소드 이름만으로 쿼리를 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 작성한&amp;nbsp;&lt;b&gt;List&amp;lt;Comment&amp;gt; findAllByPostId(Long post_id);&amp;nbsp;&lt;/b&gt;해당 구문을 보면 해석해 보면 findAll (comment) 전부 찾아볼건데 postId로 찾는다는 거다. 이렇게만 작성해주면 JPA가 알아서 SQL문을 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Method&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;804&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;met&lt;/span&gt;&lt;span&gt;hod&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;기능&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;save()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;레코드 저장 (insert, update)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;findOne()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;primary key로 레코드 한건 찾기&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;findAll()&lt;/span&gt;&lt;/td&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;count()&lt;/span&gt;&lt;/td&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;레코드 갯수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;delete()&lt;/span&gt;&lt;/td&gt;
&lt;td rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;레코드 삭제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Keyword&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 190px;&quot; border=&quot;1&quot; width=&quot;804&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;메서드 이름&amp;nbsp;키워드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;샘플&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;And&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByEmailAndUserId(String email, String userId)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;여러필드를 and 로 검색&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Or&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByEmailOrUserId(String email, String userId)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;여러필드를 or 로 검색&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Between&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByCreatedAtBetween(Date fromDate, Date toDate)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;필드의 두 값 사이에 있는 항목 검색&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;LessThan&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByAgeGraterThanEqual(int age)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;작은 항목 검색&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;GreaterThanEqual&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByAgeGraterThanEqual(int age)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;크거나 같은 항목 검색&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Like&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByNameLike(String name)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;like 검색&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;IsNull&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByJobIsNull()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;null 인 항목 검색&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;In&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByJob(String &amp;hellip; jobs)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;여러 값중에 하나인 항목 검색&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;OrderBy&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;findByEmailOrderByNameAsc(String email)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;검색 결&lt;/span&gt;&lt;span&gt;과를 정렬하여 전달&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도만 알고있으면 우리가 사용하려는 대부분의 쿼리문은 이런식으로 작성이 가능하다고 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 외우지 않아도 IDE에 자동완성 기능이 있기 때문에 훨씬 수월하게 개발을 할 수 있게 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 컬럼명이나 해당 개체의 필드명들은 파스칼로 적어주는게 좋다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 표말고도 JPA 참조문서를 찾아보면 더 많은 예시를 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html&quot;&gt;https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654397677600&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring Data JPA - Reference Documentation&quot; data-og-description=&quot;Example 11. Repository definitions using Domain Classes with mixed Annotations interface JpaPersonRepository extends Repository { &amp;hellip; } interface MongoDBPersonRepository extends Repository { &amp;hellip; } @Entity @Document public class Person { &amp;hellip; } This example &quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html&quot; data-og-url=&quot;https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Data JPA - Reference Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Example 11. Repository definitions using Domain Classes with mixed Annotations interface JpaPersonRepository extends Repository { &amp;hellip; } interface MongoDBPersonRepository extends Repository { &amp;hellip; } @Entity @Document public class Person { &amp;hellip; } This example&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리문도 사용가능&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public interface UserRepository extends JpaRepository&amp;lt;User, Long&amp;gt; {

  @Query(&quot;select u from User u where u.emailAddress = ?1&quot;)
  User findByEmailAddress(String emailAddress);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL문이 복잡해서 메소드 이름만으로 해결이 안될때는 직접 쿼리하는 방법도 있다.&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;답은 참조문서에 다 있는거 같다.&lt;/p&gt;</description>
      <category>Spring</category>
      <category>JPA</category>
      <category>Spring</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/149</guid>
      <comments>https://geonoo.tistory.com/149#entry149comment</comments>
      <pubDate>Sun, 5 Jun 2022 11:58:38 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] MVC 패턴 (ORM, SQL) - 회고</title>
      <link>https://geonoo.tistory.com/148</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; Spring 프레임워크로 간단한 웹 서버를 구현해 보고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음으로 JPA를 사용해봤고 정리해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/147?category=1077864&quot;&gt;https://geonoo.tistory.com/147?category=1077864&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1654392028550&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Java Persistence API - JPA&quot; data-og-description=&quot;Java Persistence API(JPA) JPA는 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 실제로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. Persistence(영속&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/147?category=1077864&quot; data-og-url=&quot;https://geonoo.tistory.com/147&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YcApy/hyOEbLTxzB/MmHvzN2vxyRS6Rgwh5a6F1/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/cFYFme/hyOEhejzxA/yGqr28ahwa9RmAnLviNxDK/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/qmVG0/hyOEcYmCNd/conuBUxi3ImVgemTmzuTUK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/147?category=1077864&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/147?category=1077864&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YcApy/hyOEbLTxzB/MmHvzN2vxyRS6Rgwh5a6F1/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/cFYFme/hyOEhejzxA/yGqr28ahwa9RmAnLviNxDK/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/qmVG0/hyOEcYmCNd/conuBUxi3ImVgemTmzuTUK/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] Java Persistence API - JPA&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java Persistence API(JPA) JPA는 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 실제로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. Persistence(영속&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM은 RDB의 테이블을 객체로 매핑하는 기술로 해당 기술을 이용한 대표적인 라이브러리가 JPA가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 설명해서 웹 서비스를 개발 할 때 SQL문을 필수적으로 작성해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스의 데이터를 꺼내오거나 수정하거나 해야 했으니까...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 JPA를 사용하므로서 대부분의 SQL문은 작성하지 않아도 되게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;(SQL은 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어)&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MVC 패턴&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;MVC 는 &lt;b&gt;Model, View, Controller&lt;/b&gt;의 약자 입니다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mgaiX/btrD1sQ3IP2/1j4p8EakqWGeFWubFS1P8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mgaiX/btrD1sQ3IP2/1j4p8EakqWGeFWubFS1P8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mgaiX/btrD1sQ3IP2/1j4p8EakqWGeFWubFS1P8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmgaiX%2FbtrD1sQ3IP2%2F1j4p8EakqWGeFWubFS1P8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;740&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 웹 브라우저를 통해서 URL을 호출하면 Controller에서 요청들을 받고 그안에서 로직이나 데이터가 필요하다면 Model에서 호출해서 모델에 구성된 로직이나 데이터베이스에 접근해서 데이터를 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가져온 데이터를 다시 Controller가 받게되고 그 데이터를 VIEW에게 보내주고 VIEW는 최종적으로 사용자에게 데이터와 로직이 적용된 화면을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MVC패턴은 처음부터&lt;/b&gt; Model, View, Controller가 &lt;b&gt;나누어져 있지는 않았다고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MeDws/btrDVMDLoTk/Gk2KIahiziokncdMH6Wq0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MeDws/btrDVMDLoTk/Gk2KIahiziokncdMH6Wq0K/img.png&quot; data-alt=&quot;model 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MeDws/btrDVMDLoTk/Gk2KIahiziokncdMH6Wq0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMeDws%2FbtrDVMDLoTk%2FGk2KIahiziokncdMH6Wq0K%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;547&quot; height=&quot;231&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;model 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림의 방식이 &lt;b&gt;Model 1 방식인데 &lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;View와 Controller를 JSP에서 모두 구현하는 구조이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;MVC Model1 구조는 흐름이 단순하기 때문에 개발이 쉽고 &lt;b&gt;중소형 프로젝트에 적합&lt;/b&gt;하다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;하지만 프로젝트의 규모가 커질수록 유지보수가 어려워지고, View와 Controller가 하나의 JSP에 합쳐져 있기때문에 &lt;b&gt;프론트엔드 개발자와 백엔드 개발자의 협업에 어려움이 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db072u/btrD0sqClLI/JCgOLPgq1L18Gz8MzGBQEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db072u/btrD0sqClLI/JCgOLPgq1L18Gz8MzGBQEK/img.png&quot; data-alt=&quot;model 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db072u/btrD0sqClLI/JCgOLPgq1L18Gz8MzGBQEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb072u%2FbtrD0sqClLI%2FJCgOLPgq1L18Gz8MzGBQEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;448&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;model 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Controller와 View를 분리된 방식이 model2 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Controller와 View를 분리함으로써 클라이언트의 요청처리 부분과 응답처리 부분을 분리하여 &lt;b&gt;각 로직을 독립적으로 수행할 수 있게 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;그래서 이제는 프론트개발 따로 백엔드 영역 따로 개발이 가능해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;물론 J&lt;b&gt;SP를 사용하는 곳은 줄어들고 있지만 MVC 패턴은 비슷하게 가져가고 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model은 데이터베이스와 연동하여 사용자의 입출력 데이터를 &lt;b&gt;내부 로직으로 처리하는 역할&lt;/b&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;다시말해서, 모델은 컨트롤러가 호출을 하면 DB와 연동하여 사용자의 입출력 데이터를 다루는 일과 같은 데이터와 연관된 비즈니스 로직을 처리하는 역할을 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Model과 View 사이를 이어주는 인터페이스 역할&lt;/b&gt;을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model을 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려주는 역할을 하는것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;View&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;View는 클라이언트 측 기술은 HTML/CSS/Javascript들을 모와둔 컨테이너이며, 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View는 사용자에게 보여주는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;화면(UI)&lt;/b&gt;이 해당되고, 사용자와 상호작용을 하며 컨트롤러로부터 받은 모델의 결과값을 사용자에게 화면으로 출력하는 일을 한다.&lt;/p&gt;
&lt;h4 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;/b&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;모르는 부분도 많고 해야할 일도 많지만 알고리즘 공부할 때보다 재밌게 공부하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회고 끝.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/149&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/149&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654399512338&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] JPA 기본 사용법 ( JpaRepository )&quot; data-og-description=&quot;1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 2. 도메인 객체 생성 @Getter @NoArgsConstructor @Entity public class Comment extends BaseTimeEntity { @Id @Genera..&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/149&quot; data-og-url=&quot;https://geonoo.tistory.com/149&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dWL2RW/hyOEmfFVOu/Wcw6VYzMKULKZEFlUGciJ1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/J8tIA/hyOFGXTHWJ/RkVlqikx8e6yCyk2BYE9f0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dQpnjx/hyOEi5o2Z1/tO3qET5QOlxKtMvTnRek71/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/149&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/149&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dWL2RW/hyOEmfFVOu/Wcw6VYzMKULKZEFlUGciJ1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/J8tIA/hyOFGXTHWJ/RkVlqikx8e6yCyk2BYE9f0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dQpnjx/hyOEi5o2Z1/tO3qET5QOlxKtMvTnRek71/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] JPA 기본 사용법 ( JpaRepository )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 2. 도메인 객체 생성 @Getter @NoArgsConstructor @Entity public class Comment extends BaseTimeEntity { @Id @Genera..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/150&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://geonoo.tistory.com/150&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654399519608&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;gitignore - properties&quot; data-og-description=&quot;Git에 프로젝트를 올리면 apllication.properties 같이 데이터베이스 정보나 AWS정보가 같이 올라간다. .gitignore 파일을 이용하면 파일이 원격레포지토리에서 보이지 않게 된다. /.nb-gradle/ ### VS Code ### ...&quot; data-og-host=&quot;geonoo.tistory.com&quot; data-og-source-url=&quot;https://geonoo.tistory.com/150&quot; data-og-url=&quot;https://geonoo.tistory.com/150&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1Cop6/hyOEfnjnah/pZ8KL5spGP7kGkYahEip1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bwQ26G/hyOEdC1SGk/Piy46rG91kG7jr9wijxlK1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dlChZx/hyOEcc46iH/YATNxhMRf4OE6sU97iz9f0/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748&quot;&gt;&lt;a href=&quot;https://geonoo.tistory.com/150&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geonoo.tistory.com/150&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1Cop6/hyOEfnjnah/pZ8KL5spGP7kGkYahEip1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bwQ26G/hyOEdC1SGk/Piy46rG91kG7jr9wijxlK1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dlChZx/hyOEcc46iH/YATNxhMRf4OE6sU97iz9f0/img.jpg?width=884&amp;amp;height=748&amp;amp;face=0_0_884_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;gitignore - properties&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git에 프로젝트를 올리면 apllication.properties 같이 데이터베이스 정보나 AWS정보가 같이 올라간다. .gitignore 파일을 이용하면 파일이 원격레포지토리에서 보이지 않게 된다. /.nb-gradle/ ### VS Code ### ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geonoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Spring</category>
      <category>JPA</category>
      <category>MVC패턴</category>
      <category>ORM</category>
      <category>SQL</category>
      <category>항해</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/148</guid>
      <comments>https://geonoo.tistory.com/148#entry148comment</comments>
      <pubDate>Sun, 5 Jun 2022 11:17:07 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Java Persistence API - JPA</title>
      <link>https://geonoo.tistory.com/147</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Java Persistence API(JPA)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA는 현재 자바 진영의 ORM 기술 표준으로, &lt;b&gt;인터페이스의 모음&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;실제로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Persistence(영속성)은 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;간단하게,JPA는 JAVA 데이터베이스 관련한 API라고 생각하면 이해가 쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIqMaR/btrDVmLYDfl/eFwPKdIYSJyzGuFA8LpZg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIqMaR/btrDVmLYDfl/eFwPKdIYSJyzGuFA8LpZg0/img.png&quot; data-alt=&quot;동작 원리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIqMaR/btrDVmLYDfl/eFwPKdIYSJyzGuFA8LpZg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIqMaR%2FbtrDVmLYDfl%2FeFwPKdIYSJyzGuFA8LpZg0%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;494&quot; height=&quot;229&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동작 원리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 클래스랑 데이터베이스의 테이블이랑 어떻게 매핑을 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 ORM이라는 기술이 나온다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; ORM(&lt;span&gt;&lt;span&gt;Object-Relational Mapping&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체와 관계형데이터베이스의 테이블을 매핑한다는 뜻으로, 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; JPA를 사용하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;b&gt;JPA는 반복적인 CRUD SQL을 처리해준다.&lt;/b&gt; JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;추가적으로 JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 &lt;b&gt;SQL을 직접 작성하여 사용할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;JPA를 사용하여 얻을 수 있는 가장 큰 것은 &lt;b&gt;SQL아닌 객체 중심으로 개발할 수 있다는 것이다. &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;hibernate&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Hibernate&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, JPA라는 ORM 기술 표준을 구현한 것이 Hibernate이므로, JPA를 사용하려면 Hibernate를 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laxCp/btrDV5CAB2b/4M3LC4ywIvESgkk7k5CFk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laxCp/btrDV5CAB2b/4M3LC4ywIvESgkk7k5CFk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laxCp/btrDV5CAB2b/4M3LC4ywIvESgkk7k5CFk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaxCp%2FbtrDV5CAB2b%2F4M3LC4ywIvESgkk7k5CFk0%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;300&quot; height=&quot;173&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Simple Usage&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;객체와 테이블 매핑 : @Entity, @Table&lt;/li&gt;
&lt;li&gt;필드와 컬럼 매핑 : @Column&lt;/li&gt;
&lt;li&gt;기본키 매핑 : @Id&lt;/li&gt;
&lt;li&gt;연관관계 매핑 : @ManyToOne, @JoinColumn&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654306272168&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@Entity // 기본 테이블임을 나타낸다.
@NoArgsConstructor // 기본 생성자를 대신 생성 해준다.
public class Post extends BaseTimeEntity {
	
    //먼저 기본키가 id이고, DB가 id값을 자동으로 생성해주는데 이것을 IDENTITY 전략 이라고 한다.
    //@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 AUTO_INCREMENT
    //@GenerationType.IDENTITY id는 해당 특정 열에 대해서만 고유합니다.
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false) //Null 이면 안됌
    private String title;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;위 코드 처럼 도메인이 있으면 Hibernate에서 제공 해주는 JPA API를 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654306382555&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface PostRepository extends JpaRepository&amp;lt;Post, Long&amp;gt; {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;JpaRepository를 상속 받을 인터페이스를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654306495897&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/api/post&quot;)
public Post addPost(@RequestBody PostDto postDto) {

    Post post = new Post(postDto);
    return postRepository.save(post);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;그리고 생성한 인터페이스를 사용해서 여러 메소드를 사용해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;참조&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://dbjh.tistory.com/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dbjh.tistory.com/77&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654305648237&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring JPA] JPA 란?&quot; data-og-description=&quot;이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이&quot; data-og-host=&quot;dbjh.tistory.com&quot; data-og-source-url=&quot;https://dbjh.tistory.com/77&quot; data-og-url=&quot;https://dbjh.tistory.com/77&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zynyy/hyOEbqFwc8/dARsmSTWkrKpEvnnqkjCd1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=75_323_312_581,https://scrap.kakaocdn.net/dn/b9jERi/hyOCGMAmtQ/UqCqFDTjzuRpMkqpwxMZs0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=75_323_312_581,https://scrap.kakaocdn.net/dn/iq8vl/hyOCCpSX8r/Mjic4joVgVsfE9cl5Ne8tK/img.png?width=1999&amp;amp;height=593&amp;amp;face=0_0_1999_593&quot;&gt;&lt;a href=&quot;https://dbjh.tistory.com/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbjh.tistory.com/77&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zynyy/hyOEbqFwc8/dARsmSTWkrKpEvnnqkjCd1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=75_323_312_581,https://scrap.kakaocdn.net/dn/b9jERi/hyOCGMAmtQ/UqCqFDTjzuRpMkqpwxMZs0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=75_323_312_581,https://scrap.kakaocdn.net/dn/iq8vl/hyOCCpSX8r/Mjic4joVgVsfE9cl5Ne8tK/img.png?width=1999&amp;amp;height=593&amp;amp;face=0_0_1999_593');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring JPA] JPA 란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dbjh.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654305810403&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[JPA] JPA란 - Heee's Development Blog&quot; data-og-description=&quot;Step by step goes a long way.&quot; data-og-host=&quot;gmlwjd9405.github.io&quot; data-og-source-url=&quot;https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&quot; data-og-url=&quot;http://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ruKxg/hyOEbxqVlm/mZ78xiRCLjdlJqsoLATY1k/img.png?width=1999&amp;amp;height=656&amp;amp;face=0_0_1999_656,https://scrap.kakaocdn.net/dn/baxLYy/hyOCP3QN3u/Ch9VELPLDuKJUjZ57oLn60/img.png?width=1999&amp;amp;height=593&amp;amp;face=0_0_1999_593,https://scrap.kakaocdn.net/dn/iItJo/hyOCHxYUlI/qmUP0Z4u6n2zVpBjcWybV0/img.png?width=1999&amp;amp;height=593&amp;amp;face=0_0_1999_593&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ruKxg/hyOEbxqVlm/mZ78xiRCLjdlJqsoLATY1k/img.png?width=1999&amp;amp;height=656&amp;amp;face=0_0_1999_656,https://scrap.kakaocdn.net/dn/baxLYy/hyOCP3QN3u/Ch9VELPLDuKJUjZ57oLn60/img.png?width=1999&amp;amp;height=593&amp;amp;face=0_0_1999_593,https://scrap.kakaocdn.net/dn/iItJo/hyOCHxYUlI/qmUP0Z4u6n2zVpBjcWybV0/img.png?width=1999&amp;amp;height=593&amp;amp;face=0_0_1999_593');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JPA] JPA란 - Heee's Development Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Step by step goes a long way.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gmlwjd9405.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----2022-06-04-----&lt;/p&gt;</description>
      <category>Spring</category>
      <category>JPA</category>
      <category>ORM</category>
      <category>Spring</category>
      <category>spring boot</category>
      <author>Gogozzi</author>
      <guid isPermaLink="true">https://geonoo.tistory.com/147</guid>
      <comments>https://geonoo.tistory.com/147#entry147comment</comments>
      <pubDate>Sat, 4 Jun 2022 10:39:22 +0900</pubDate>
    </item>
  </channel>
</rss>