<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>찰나의 개발흔적</title>
    <link>https://aonee.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 12:03:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>aonee</managingEditor>
    <image>
      <title>찰나의 개발흔적</title>
      <url>https://tistory1.daumcdn.net/tistory/3543837/attach/43b952e7912d4c86ad2b914b5a5b5734</url>
      <link>https://aonee.tistory.com</link>
    </image>
    <item>
      <title>[Exadata day5] exadata 총정리</title>
      <link>https://aonee.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Exadata 동작 전반흐름&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&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;694&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5jrn/dJMb86aeQNo/9H1RDImS2xlgEQBkbUdbt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5jrn/dJMb86aeQNo/9H1RDImS2xlgEQBkbUdbt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5jrn/dJMb86aeQNo/9H1RDImS2xlgEQBkbUdbt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5jrn%2FdJMb86aeQNo%2F9H1RDImS2xlgEQBkbUdbt0%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;694&quot; height=&quot;469&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;469&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;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;ldquo;필요한 데이터만 위로 보내라&amp;rdquo;Exadata는&lt;br /&gt;스토리지에서 똑똑하게 걸러(=Smart Scan),&lt;br /&gt;압축을 활용해 I/O를 줄이고(=HCC),&lt;br /&gt;플래시로 빠르게 읽는(=Flash Cache) 구조까지 통합해&lt;br /&gt;엔드-투-엔드로 병목을 낮추는 아키텍처&lt;/blockquote&gt;
&lt;h1 data-end=&quot;115&quot; data-start=&quot;91&quot;&gt;Exadata 동작 흐름&lt;/h1&gt;
&lt;h2 data-end=&quot;150&quot; data-start=&quot;117&quot; data-ke-size=&quot;size26&quot;&gt;1) 클라이언트 &amp;rarr; DB 서버: &amp;ldquo;SQL 나왔습니다!&amp;rdquo;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;254&quot; data-start=&quot;151&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;178&quot; data-start=&quot;151&quot;&gt;사용자가 SELECT 같은 SQL을 날립니다.&lt;/li&gt;
&lt;li data-end=&quot;254&quot; data-start=&quot;179&quot;&gt;DB 서버(인스턴스)가 받아서 &amp;ldquo;이건 &lt;b&gt;Smart Scan&lt;/b&gt;으로 &lt;b&gt;스토리지에서 처리&lt;/b&gt;시키는 게 유리한가?&amp;rdquo;를 먼저 판단해요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;280&quot; data-start=&quot;256&quot; data-ke-size=&quot;size26&quot;&gt;2) 오프로딩 결정(iDB 명령 전송)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;433&quot; data-start=&quot;281&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;386&quot; data-start=&quot;281&quot;&gt;&lt;b&gt;가능하면&lt;/b&gt; DB 서버는 블록을 통째로 읽지 않고, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;iDB&lt;/b&gt;(Exadata 전용 프로토콜)&lt;/span&gt;로 &lt;b&gt;&amp;ldquo;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;이런 조건으로 스캔해줘&amp;rdquo;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; 라는 명령을 &lt;b&gt;스토리지 셀&lt;/b&gt;&lt;/span&gt;에게 보냅니다.&lt;/li&gt;
&lt;li data-end=&quot;433&quot; data-start=&quot;387&quot;&gt;이게 바로 &lt;b&gt;Smart Storage/Smart Scan 오프로딩&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;1106&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjrwGp/dJMb9MXcOlQ/cKrOzfOFz4sfS6aMDTHC6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjrwGp/dJMb9MXcOlQ/cKrOzfOFz4sfS6aMDTHC6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjrwGp/dJMb9MXcOlQ/cKrOzfOFz4sfS6aMDTHC6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjrwGp%2FdJMb9MXcOlQ%2FcKrOzfOFz4sfS6aMDTHC6k%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;1106&quot; height=&quot;545&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;489&quot; data-start=&quot;435&quot; data-ke-size=&quot;size26&quot;&gt;3) Exadata Storage Cell: &amp;ldquo;필요한 것만 골라드림&amp;rdquo; (&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Smart Scan&lt;/span&gt;)&lt;/h2&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;490&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;680&quot; data-start=&quot;529&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;577&quot; data-start=&quot;529&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Row Filtering&lt;/b&gt;:&lt;/span&gt; WHERE 조건에 &lt;b&gt;맞는 행만&lt;/b&gt; 추립니다.&lt;/li&gt;
&lt;li data-end=&quot;630&quot; data-start=&quot;578&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Column Projection&lt;/b&gt;&lt;/span&gt;: SELECT에 &lt;b&gt;필요한 컬럼만&lt;/b&gt; 뽑습니다.&lt;/li&gt;
&lt;li data-end=&quot;680&quot; data-start=&quot;631&quot;&gt;일부 &lt;b&gt;조인/집계&lt;/b&gt;도 셀 수준에서 처리할 수 있어, DB 서버가 할 일이 줄어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;731&quot; data-start=&quot;682&quot; data-ke-size=&quot;size16&quot;&gt;➡ 결과적으로 &amp;ldquo;필요한 것만&amp;rdquo; 추출되니 &lt;b&gt;네트워크로 오가는 데이터가 확 줄어듭니다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;770&quot; data-start=&quot;733&quot; data-ke-size=&quot;size26&quot;&gt;4) &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Flash Cache&lt;/span&gt;: &amp;ldquo;자주 쓰면 플래시에서 번개같이&amp;rdquo;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;998&quot; data-start=&quot;771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;818&quot; data-start=&quot;771&quot;&gt;스토리지 셀은 먼저 &lt;b&gt;Flash Cache&lt;/b&gt;(플래시 기반 캐시)를 확인합니다.&lt;/li&gt;
&lt;li data-end=&quot;877&quot; data-start=&quot;819&quot;&gt;&lt;b&gt;자주 읽는 데이터&lt;/b&gt;나 최근 접근한 부분은 디스크 대신 &lt;b&gt;플래시에서 고속 읽기&lt;/b&gt;가 됩니다.&lt;/li&gt;
&lt;li data-end=&quot;949&quot; data-start=&quot;878&quot;&gt;쓰기 패턴이 아주 강한 경우엔(옵션) &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Write-back&lt;/b&gt;&lt;/span&gt; 모드로 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;플래시에 먼저 기록 후 나중에 디스크로&lt;/span&gt; 내립니다.&lt;/li&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;950&quot;&gt;(&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Redo 로그는 별도로 &lt;b&gt;Smart Flash Log&lt;/b&gt;가 커밋 지연을 줄여줌&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1037&quot; data-start=&quot;1000&quot; data-ke-size=&quot;size26&quot;&gt;5) &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;HCC&lt;/span&gt;(하이브리드 컬럼 압축): &amp;ldquo;공간도 성능도 아낀다&amp;rdquo;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1243&quot; data-start=&quot;1038&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1081&quot; data-start=&quot;1038&quot;&gt;DW/아카이브성 대용량 테이블은 종종 &lt;b&gt;HCC&lt;/b&gt;로 압축되어 저장됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1180&quot; data-start=&quot;1082&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;스토리지 셀&lt;/b&gt;이 &lt;b&gt;압축 해제 및 필터링&lt;/b&gt;&lt;/span&gt;을 같이 해줘서,&lt;br /&gt;압축된 데이터라도 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;적은 I/O&lt;/span&gt;로 많은 로우&lt;/b&gt;를 훑고, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;필요분만&lt;/b&gt; DB 서버로&lt;/span&gt; 보내요.&lt;/li&gt;
&lt;li data-end=&quot;1243&quot; data-start=&quot;1181&quot;&gt;즉 &amp;ldquo;&lt;b&gt;압축 + 오프로딩&lt;/b&gt;&amp;rdquo; 조합으로 &lt;b&gt;디스크&amp;rarr;네트워크&amp;rarr;DB 서버&lt;/b&gt; 모든 구간의 부하를 감소시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1267&quot; data-start=&quot;1245&quot; data-ke-size=&quot;size26&quot;&gt;6) &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;DB 서버:&lt;/span&gt; &amp;ldquo;받아서 마무리&amp;rdquo;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1361&quot; data-start=&quot;1268&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1331&quot; data-start=&quot;1268&quot;&gt;여러 스토리지 셀에서 온 &lt;b&gt;가벼워진 결과셋&lt;/b&gt;을 &lt;b&gt;DB 서버가 합치고&lt;/b&gt;(병렬 쿼리 결과 병합과 유사)&lt;/li&gt;
&lt;li data-end=&quot;1361&quot; data-start=&quot;1332&quot;&gt;나머지 연산(정렬/집계 일부 등)을 마무리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1382&quot; data-start=&quot;1363&quot; data-ke-size=&quot;size26&quot;&gt;7) 최종 결과 &amp;rarr; 클라이언트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1508&quot; data-start=&quot;1383&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1409&quot; data-start=&quot;1383&quot;&gt;DB 서버가 결과를 클라이언트에게 반환.&lt;/li&gt;
&lt;li data-end=&quot;1469&quot; data-start=&quot;1410&quot;&gt;블록 덩어리를 잔뜩 끌어오던 전통 방식보다 &lt;b&gt;CPU&amp;middot;네트워크&amp;middot;디스크 I/O가 모두 절약&lt;/b&gt;됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1508&quot; data-start=&quot;1470&quot;&gt;그래서 &lt;b&gt;더 빠른 쿼리, 더 많은 동시 처리&lt;/b&gt;가 가능해집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1513&quot; data-start=&quot;1510&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1531&quot; data-start=&quot;1515&quot; data-ke-size=&quot;size26&quot;&gt;핵심 키워드 한 줄 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1811&quot; data-start=&quot;1532&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1596&quot; data-start=&quot;1532&quot;&gt;&lt;b&gt;Smart Storage/Smart Scan&lt;/b&gt;: &lt;b&gt;스토리지에서 미리 걸러서&lt;/b&gt; 필요한 것만 위로 보냄&lt;/li&gt;
&lt;li data-end=&quot;1644&quot; data-start=&quot;1597&quot;&gt;&lt;b&gt;iDB&lt;/b&gt;: DB &amp;harr; 스토리지 셀 간 &lt;b&gt;오프로딩 지시용 전용 프로토콜&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1699&quot; data-start=&quot;1645&quot;&gt;&lt;b&gt;Flash Cache&lt;/b&gt;: &lt;b&gt;자주 쓰는 데이터&lt;/b&gt;를 플래시에 캐싱해 &lt;b&gt;읽기 가속&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1754&quot; data-start=&quot;1700&quot;&gt;&lt;b&gt;HCC&lt;/b&gt;: &lt;b&gt;고압축 + 스토리지 측 해제/필터링&lt;/b&gt;으로 &lt;b&gt;I/O&amp;middot;네트워크 절감&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1811&quot; data-start=&quot;1755&quot;&gt;(보너스) &lt;b&gt;Smart Flash Log&lt;/b&gt;: &lt;b&gt;Redo 커밋 지연&lt;/b&gt; 감소(OLTP에 효과)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1816&quot; data-start=&quot;1813&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1831&quot; data-start=&quot;1818&quot; data-ke-size=&quot;size26&quot;&gt;언제 특히 효과적?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1974&quot; data-start=&quot;1832&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1878&quot; data-start=&quot;1832&quot;&gt;&lt;b&gt;풀 스캔이 많은 DW/분석 쿼리&lt;/b&gt;: 조건/컬럼을 스토리지에서 미리 정리&lt;/li&gt;
&lt;li data-end=&quot;1928&quot; data-start=&quot;1879&quot;&gt;&lt;b&gt;대용량 테이블&lt;/b&gt;: HCC + Smart Scan으로 &lt;b&gt;읽기량 대폭 감소&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1974&quot; data-start=&quot;1929&quot;&gt;&lt;b&gt;자주 반복 조회&lt;/b&gt;: Flash Cache로 &lt;b&gt;랜덤 읽기 지연&lt;/b&gt; 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1992&quot; data-start=&quot;1976&quot; data-ke-size=&quot;size26&quot;&gt;언제 덜 쓰일 수 있나?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2103&quot; data-start=&quot;1993&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2048&quot; data-start=&quot;1993&quot;&gt;&lt;b&gt;인덱스 소량 조회(OLTP형, PK=값 하나)&lt;/b&gt;: 버퍼 캐시 히트가 더 유리할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;2103&quot; data-start=&quot;2049&quot;&gt;&lt;b&gt;Smart Scan 비대상 객체/연산&lt;/b&gt;(예: 일부 LOB/가상컬럼/특정 인덱스 스캔 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2108&quot; data-start=&quot;2105&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2274&quot; data-start=&quot;2110&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2274&quot; data-start=&quot;2110&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2274&quot; data-start=&quot;2110&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2274&quot; data-start=&quot;2110&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;2308&quot; data-start=&quot;2286&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;b&gt;Exadata와 병렬 처리&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsj6xL/dJMb9WFrqOr/EOMb53KP3vVZo2oo59DkC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsj6xL/dJMb9WFrqOr/EOMb53KP3vVZo2oo59DkC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsj6xL/dJMb9WFrqOr/EOMb53KP3vVZo2oo59DkC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsj6xL%2FdJMb9WFrqOr%2FEOMb53KP3vVZo2oo59DkC0%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;1119&quot; height=&quot;569&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2355&quot; data-start=&quot;2310&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2559&quot; data-start=&quot;2357&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2419&quot; data-start=&quot;2357&quot;&gt;✅ &lt;b&gt;Smart Scan&lt;/b&gt;: PX Slave가 스토리지에서 필요한 데이터만 읽음 &amp;rarr; I/O 대폭 감소&lt;/li&gt;
&lt;li data-end=&quot;2467&quot; data-start=&quot;2420&quot;&gt;✅ &lt;b&gt;Storage Offloading&lt;/b&gt;: 서버로 올라오는 데이터 량 줄임&lt;/li&gt;
&lt;li data-end=&quot;2509&quot; data-start=&quot;2468&quot;&gt;✅ &lt;b&gt;Flash Cache 병렬 읽기&lt;/b&gt;: 플래시에서 초고속 읽기&lt;/li&gt;
&lt;li data-end=&quot;2559&quot; data-start=&quot;2510&quot;&gt;✅ &lt;b&gt;InfiniBand / RoCE 네트워크&lt;/b&gt;: 병렬 노드 간 빠른 데이터 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2628&quot; data-start=&quot;2561&quot; data-ke-size=&quot;size16&quot;&gt;  Exadata에서는 병렬 처리를 하면 CPU 부하가 덜하고, &lt;b&gt;속도 향상이 선형적&lt;/b&gt;으로 나오는 경우는 경우가 많음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1747&quot; data-start=&quot;1707&quot; data-ke-size=&quot;size26&quot;&gt;병렬도(Degree of Parallelism, DOP)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1798&quot; data-start=&quot;1749&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1778&quot; data-start=&quot;1749&quot;&gt;&lt;b&gt;DOP&lt;/b&gt;: 병렬로 작업할 PX 프로세스 개수&lt;/li&gt;
&lt;li data-end=&quot;1798&quot; data-start=&quot;1779&quot;&gt;수동 설정 또는 자동 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; emp PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 테이블에 병렬도 8 설정&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1869&quot; data-start=&quot;1858&quot; data-ke-size=&quot;size16&quot;&gt;또는 SQL 힌트로:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(emp, 8) */&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; emp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;  병렬도 = PX Slave 수&lt;br /&gt;  너무 높게 잡으면 CPU 과부하 발생하므로 주의 ⚠️&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2912&quot; data-start=&quot;2886&quot; data-ke-size=&quot;size26&quot;&gt;병렬 처리 관련 주요 파라미터&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;파라미터설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3193&quot; data-start=&quot;2914&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3193&quot; data-start=&quot;2948&quot;&gt;
&lt;tr data-end=&quot;2998&quot; data-start=&quot;2948&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2973&quot; data-start=&quot;2948&quot;&gt;PARALLEL_MAX_SERVERS&lt;/td&gt;
&lt;td data-end=&quot;2998&quot; data-start=&quot;2973&quot; data-col-size=&quot;sm&quot;&gt;전체 병렬 Slave 프로세스 최대 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3037&quot; data-start=&quot;2999&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3024&quot; data-start=&quot;2999&quot;&gt;PARALLEL_MIN_SERVERS&lt;/td&gt;
&lt;td data-end=&quot;3037&quot; data-start=&quot;3024&quot; data-col-size=&quot;sm&quot;&gt;최소 프로세스 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3088&quot; data-start=&quot;3038&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3065&quot; data-start=&quot;3038&quot;&gt;PARALLEL_DEGREE_POLICY&lt;/td&gt;
&lt;td data-end=&quot;3088&quot; data-start=&quot;3065&quot; data-col-size=&quot;sm&quot;&gt;AUTO / MANUAL 병렬 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3143&quot; data-start=&quot;3089&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3121&quot; data-start=&quot;3089&quot;&gt;PARALLEL_MIN_TIME_THRESHOLD&lt;/td&gt;
&lt;td data-end=&quot;3143&quot; data-start=&quot;3121&quot; data-col-size=&quot;sm&quot;&gt;병렬 실행으로 전환되는 기준 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3193&quot; data-start=&quot;3144&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3169&quot; data-start=&quot;3144&quot;&gt;PARALLEL_FORCE_LOCAL&lt;/td&gt;
&lt;td data-end=&quot;3193&quot; data-start=&quot;3169&quot; data-col-size=&quot;sm&quot;&gt;병렬 실행 시 로컬 노드만 사용 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3253&quot; data-start=&quot;3195&quot; data-ke-size=&quot;size16&quot;&gt;  특히 DW 환경에서는 PARALLEL_DEGREE_POLICY = AUTO 를 많이 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;Exadata 병렬 SQL&lt;/blockquote&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;150&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4059&quot; data-start=&quot;4021&quot;&gt;&lt;b&gt;작성법&lt;/b&gt;은 &amp;ldquo;객체 속성/힌트/세션 설정&amp;rdquo; 3가지를 쓴다.&lt;/li&gt;
&lt;li data-end=&quot;4094&quot; data-start=&quot;4060&quot;&gt;&lt;b&gt;대상&lt;/b&gt;은 &lt;b&gt;큰 스캔/집계/적재&lt;/b&gt;(DW/배치).&lt;/li&gt;
&lt;li data-end=&quot;4169&quot; data-start=&quot;4095&quot;&gt;&lt;b&gt;Exadata&lt;/b&gt;에선 병렬 + Smart Scan/Direct Path/HCC가 맞물리며 &lt;b&gt;효율이 기가 막히게&lt;/b&gt; 올라간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;155&quot; data-start=&quot;152&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;174&quot; data-start=&quot;157&quot;&gt;1) 기본 설정(세션/DB)&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-- 자동 병렬화 권장 (Exadata에서 특히 효과적)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; parallel_degree_policy &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; AUTO; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- MANUAL이면 힌트/속성만 적용&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; parallel_min_time_threshold &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;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 10초&amp;uarr; 추정 작업만 자동 병렬&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 병렬 DML 사용할 때&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION ENABLE PARALLEL DML; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;499&quot; data-start=&quot;433&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;499&quot; data-start=&quot;435&quot; data-ke-size=&quot;size16&quot;&gt;팁: 전역 기본값은 DBA가 PARALLEL_DEGREE_POLICY=AUTO 로 운영 설계하는 게 보통입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;504&quot; data-start=&quot;501&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;526&quot; data-start=&quot;506&quot;&gt;2) 객체/SQL 단위 병렬 지정&lt;/h1&gt;
&lt;h2 data-end=&quot;556&quot; data-start=&quot;528&quot; data-ke-size=&quot;size26&quot;&gt;(A) 객체(테이블/인덱스)에 병렬 속성 부여&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 테이블 기본 병렬도(DOP) 8&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; INDEX sales_idx PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 해제: ALTER TABLE sales NOPARALLEL;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;726&quot; data-start=&quot;699&quot; data-ke-size=&quot;size26&quot;&gt;(B) SQL 힌트로 병렬 지정(가장 흔함)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-- 대용량 SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(sales, 8) */&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; txn_date &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'2025-01-01'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- CTAS (Create Table As Select)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales_y25 NOLOGGING PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(16) */&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; txn_date &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'2025-01-01'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- INSERT APPEND (Direct Path + 병렬 적재)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION ENABLE PARALLEL DML; &lt;/span&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ APPEND PARALLEL(sales_y25, 16) */&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;INTO&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales_y25 &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(sales, 16) */&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; txn_date &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'2025-01-01'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- 병렬 UPDATE/DELETE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION ENABLE PARALLEL DML; &lt;/span&gt;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(orders, 8) */&lt;/span&gt;&lt;/span&gt;&lt;span&gt; orders &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; status &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;span&gt;'CLOSED'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; order_dt &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SYSDATE &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;span&gt;90&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(orders, 8) */&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; orders &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; order_dt &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SYSDATE &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;span&gt;365&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1536&quot; data-start=&quot;1451&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1536&quot; data-start=&quot;1453&quot; data-ke-size=&quot;size16&quot;&gt;실무 팁: &lt;b&gt;대량 로딩은&lt;/b&gt; INSERT /*+ APPEND PARALLEL */ + NOLOGGING(복구정책 확인) 조합을 많이 씁니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1541&quot; data-start=&quot;1538&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1572&quot; data-start=&quot;1543&quot;&gt;3) 분배 전략 힌트(PX간 데이터 이동 최적화)&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-- 조인 키 기준 해시 분배(많이 씀)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;span&gt;/*+ PARALLEL(orders, 16) PARALLEL(customers, 16) PQ_DISTRIBUTE(orders HASH, customers HASH) */&lt;/span&gt; ... &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; orders &lt;/span&gt;&lt;span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; customers &lt;/span&gt;&lt;span&gt;&lt;span&gt;USING&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(customer_id); &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;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;span&gt;/*+ PARALLEL(big_t, 16) PARALLEL(dim_t, 16) PQ_DISTRIBUTE(dim_t BROADCAST, big_t HASH) */&lt;/span&gt; ... &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; big_t &lt;/span&gt;&lt;span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; dim_t &lt;/span&gt;&lt;span&gt;&lt;span&gt;USING&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(key); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;2040&quot; data-start=&quot;1971&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2040&quot; data-start=&quot;1973&quot; data-ke-size=&quot;size16&quot;&gt;파티션 테이블이면 &lt;b&gt;Partition-wise Join&lt;/b&gt;(자연스럽게 발생)으로 &lt;b&gt;데이터 재분배 최소화&lt;/b&gt; &amp;rarr; 성능&amp;uarr;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2045&quot; data-start=&quot;2042&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2070&quot; data-start=&quot;2047&quot;&gt;4) Exadata에서 잘 먹히는 패턴&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2305&quot; data-start=&quot;2072&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2144&quot; data-start=&quot;2072&quot;&gt;&lt;b&gt;큰 범위 스캔&lt;/b&gt; + PARALLEL &amp;rarr; &lt;b&gt;Smart Scan 오프로딩&lt;/b&gt;으로 서버로 올라오는 데이터가 확 줄어듦&lt;/li&gt;
&lt;li data-end=&quot;2209&quot; data-start=&quot;2145&quot;&gt;&lt;b&gt;Direct Path&lt;/b&gt;(APPEND, CTAS) &amp;rarr; 버퍼캐시 우회 + 플래시/디스크 순차 읽기 최적&lt;/li&gt;
&lt;li data-end=&quot;2254&quot; data-start=&quot;2210&quot;&gt;&lt;b&gt;여러 파일/파티션&lt;/b&gt; &amp;rarr; PX 슬레이브가 &lt;b&gt;일감을 잘 나눠 가짐&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2305&quot; data-start=&quot;2255&quot;&gt;&lt;b&gt;HCC(압축 테이블)&lt;/b&gt; &amp;rarr; 스토리지에서 압축 해제+필터링, 병렬 스캔 효율 극대화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2310&quot; data-start=&quot;2307&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2324&quot; data-start=&quot;2312&quot;&gt;5) 모니터링/검증&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-- 실행계획에 PX 단계 확인&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(DBMS_XPLAN.DISPLAY_CURSOR(&lt;/span&gt;&lt;span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;'ALLSTATS LAST +PARALLEL'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)); &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- PX 통계: 어떤 TQ(전송 큐)로 어떻게 분배됐는지 확인&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; V$PQ_TQSTAT; &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;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; V$PX_SESSION; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; V$PX_PROCESS; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;2662&quot; data-start=&quot;2583&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2662&quot; data-start=&quot;2585&quot; data-ke-size=&quot;size16&quot;&gt;계획에서 PX COORDINATOR, PX SEND/RECEIVE, PX PARTITION 등이 보이면 병렬이 제대로 동작 중.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2667&quot; data-start=&quot;2664&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2686&quot; data-start=&quot;2669&quot;&gt;6) 성능/안정성 체크리스트&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3180&quot; data-start=&quot;2688&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2747&quot; data-start=&quot;2688&quot;&gt;&lt;b&gt;대상 선정&lt;/b&gt;: 수백 GB~TB급 스캔&amp;middot;집계/적재 작업에만 병렬. OLTP 단건 처리는 비권장.&lt;/li&gt;
&lt;li data-end=&quot;2809&quot; data-start=&quot;2748&quot;&gt;&lt;b&gt;DOP(병렬도)&lt;/b&gt;: 코어수&amp;middot;I/O&amp;middot;동시 작업 수를 고려. 과도한 DOP는 경합/스케줄 지연 초래.&lt;/li&gt;
&lt;li data-end=&quot;2951&quot; data-start=&quot;2810&quot;&gt;&lt;b&gt;리소스 관리&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2951&quot; data-start=&quot;2828&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2898&quot; data-start=&quot;2828&quot;&gt;PARALLEL_MAX_SERVERS(총 PX 한도), PARALLEL_SERVERS_TARGET(소프트 한도)&lt;/li&gt;
&lt;li data-end=&quot;2951&quot; data-start=&quot;2901&quot;&gt;멀티테넌트/PDB라면 &lt;b&gt;리소스 매니저 + IORM&lt;/b&gt;로 DB/PDB별 공정성 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3008&quot; data-start=&quot;2952&quot;&gt;&lt;b&gt;TEMP/UNDO 여유&lt;/b&gt;: 대용량 집계/정렬/조인 시 Temp&amp;middot;Undo 사용량 크게 증가&lt;/li&gt;
&lt;li data-end=&quot;3067&quot; data-start=&quot;3009&quot;&gt;&lt;b&gt;LOGGING 정책&lt;/b&gt;: 대량 적재에서 NOLOGGING은 빠르지만 복구 전략(백업) 필수&lt;/li&gt;
&lt;li data-end=&quot;3121&quot; data-start=&quot;3068&quot;&gt;&lt;b&gt;통계 최신화&lt;/b&gt;: 잘못된 카디널리티로 병렬/분배 전략이 꼬이지 않게 &lt;b&gt;통계 갱신&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3180&quot; data-start=&quot;3122&quot;&gt;&lt;b&gt;소테이블 브로드캐스트 주의&lt;/b&gt;: 작은 줄 알았던 테이블이 커지면 오히려 병목 &amp;rarr; 분배 전략 재점검&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3185&quot; data-start=&quot;3182&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3204&quot; data-start=&quot;3187&quot;&gt;7) 자주 쓰는 스니펫 모음&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-- ① 테이블 기본 병렬도와 NOLOGGING&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; fact_sales PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NOLOGGING; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- ② CTAS로 분할/정렬까지 한 번에&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; fact_sales_y25 PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NOLOGGING TABLESPACE data_ts &lt;/span&gt;&lt;span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(16) */&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;span&gt; &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;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; fact_sales &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales_dt &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'2025-01-01'&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; INDEX fact_sales_y25_ix1 &lt;/span&gt;&lt;span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;/span&gt;&lt;span&gt; fact_sales_y25(customer_id) PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NOLOGGING; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-- ④ 병렬 MERGE (대량 업서트)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION ENABLE PARALLEL DML; &lt;/span&gt;&lt;span&gt;&lt;span&gt;MERGE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ PARALLEL(t, 12) PARALLEL(s, 12) */&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;INTO&lt;/span&gt;&lt;/span&gt;&lt;span&gt; tgt t &lt;/span&gt;&lt;span&gt;&lt;span&gt;USING&lt;/span&gt;&lt;/span&gt;&lt;span&gt; src s &lt;/span&gt;&lt;span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (t.key &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; s.key) &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; MATCHED &lt;/span&gt;&lt;span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ... &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHEN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;NOT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; MATCHED &lt;/span&gt;&lt;span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;INSERT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;span&gt;/*+ PARALLEL(a, 12) PARALLEL(b, 12) PQ_DISTRIBUTE(a HASH, b HASH) */&lt;/span&gt; ... &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; big_a a &lt;/span&gt;&lt;span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; big_b b &lt;/span&gt;&lt;span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;/span&gt;&lt;span&gt; b.k &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; a.k; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4009&quot; data-start=&quot;4006&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/174</guid>
      <comments>https://aonee.tistory.com/174#entry174comment</comments>
      <pubDate>Fri, 24 Oct 2025 14:57:07 +0900</pubDate>
    </item>
    <item>
      <title>[Exadata day4] 통합운영 아키텍처, 마이그레이션, 대용량 데이터 로딩, 모니터링</title>
      <link>https://aonee.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;827&quot; data-start=&quot;797&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;10~12장: 운영 및 데이터 로딩&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;950&quot; data-start=&quot;828&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;867&quot; data-start=&quot;828&quot;&gt;&lt;b&gt;10장&lt;/b&gt;: Consolidation 전략 및 권장 아키텍처&lt;/li&gt;
&lt;li data-end=&quot;905&quot; data-start=&quot;868&quot;&gt;&lt;b&gt;11장&lt;/b&gt;: 데이터베이스 마이그레이션 방법(논리/물리적)&lt;/li&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;906&quot;&gt;&lt;b&gt;12장&lt;/b&gt;: 대용량 데이터 로딩(DBFS, ACFS, 외부 파일 시스템)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;989&quot; data-start=&quot;957&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;13~16장: 모니터링&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1214&quot; data-start=&quot;990&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1040&quot; data-start=&quot;990&quot;&gt;&lt;b&gt;13장:&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Exadata Database Machine&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Platform Monitoring :: 엑사데이터머신&lt;/li&gt;
&lt;li data-end=&quot;1040&quot; data-start=&quot;990&quot;&gt;&lt;b&gt;14장&lt;/b&gt;: Monitoring Exadata System Software Components :: 엑사 시스템 소프트웨어 구성요소&lt;/li&gt;
&lt;li data-end=&quot;1094&quot; data-start=&quot;1041&quot;&gt;&lt;b&gt;15장&lt;/b&gt;: &amp;nbsp;Configuring Enterprise Manager Cloud Control to Monitor Exadata Database Machine ::&amp;nbsp;&lt;/li&gt;
&lt;li data-end=&quot;1152&quot; data-start=&quot;1095&quot;&gt;&lt;b&gt;16장&lt;/b&gt;: Monitoring&amp;nbsp;Exadata&amp;nbsp;Storage&amp;nbsp;Servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #333333; text-align: start;&quot;&gt;오늘 배운 내용 요약정리&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;10장: Consolidation 전략 및 권장 아키텍처&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;=&lt;/blockquote&gt;
&lt;h3 data-end=&quot;283&quot; data-start=&quot;255&quot; data-ke-size=&quot;size23&quot;&gt;1. Consolidation(통합)의 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;386&quot; data-start=&quot;284&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;318&quot; data-start=&quot;284&quot;&gt;&lt;b&gt;비용 절감&lt;/b&gt;: 하드웨어, 라이선스, 운영 인력 효율화&lt;/li&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;319&quot;&gt;&lt;b&gt;자원 효율 극대화&lt;/b&gt;: CPU, 메모리, I/O 활용도 향상&lt;/li&gt;
&lt;li data-end=&quot;386&quot; data-start=&quot;357&quot;&gt;&lt;b&gt;관리 표준화&lt;/b&gt;: 패치&amp;middot;백업&amp;middot;보안 정책 단일화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;405&quot; data-start=&quot;388&quot; data-ke-size=&quot;size23&quot;&gt;2. 권장 아키텍처 유형&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;방식설명특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;660&quot; data-start=&quot;406&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;660&quot; data-start=&quot;446&quot;&gt;
&lt;tr data-end=&quot;510&quot; data-start=&quot;446&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;467&quot; data-start=&quot;446&quot;&gt;&lt;b&gt;멀티테넌트(CDB/PDB)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;487&quot; data-start=&quot;467&quot; data-col-size=&quot;sm&quot;&gt;한 인스턴스에 여러 PDB 운영&lt;/td&gt;
&lt;td data-end=&quot;510&quot; data-start=&quot;487&quot; data-col-size=&quot;sm&quot;&gt;경량&amp;middot;패치 일원화&amp;middot;신속 마이그레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;562&quot; data-start=&quot;511&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;524&quot; data-start=&quot;511&quot;&gt;&lt;b&gt;스키마 통합&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;546&quot; data-start=&quot;524&quot; data-col-size=&quot;sm&quot;&gt;하나의 DB 인스턴스에 여러 스키마&lt;/td&gt;
&lt;td data-end=&quot;562&quot; data-start=&quot;546&quot; data-col-size=&quot;sm&quot;&gt;단순하지만 격리성 약함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;609&quot; data-start=&quot;563&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;578&quot; data-start=&quot;563&quot;&gt;&lt;b&gt;VM 기반 통합&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;591&quot; data-start=&quot;578&quot; data-col-size=&quot;sm&quot;&gt;KVM 가상화 활용&lt;/td&gt;
&lt;td data-end=&quot;609&quot; data-start=&quot;591&quot; data-col-size=&quot;sm&quot;&gt;격리성&amp;uarr;, 자원 분리 명확&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;660&quot; data-start=&quot;610&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;627&quot; data-start=&quot;610&quot;&gt;&lt;b&gt;Bare Metal&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;647&quot; data-start=&quot;627&quot; data-col-size=&quot;sm&quot;&gt;전통적 단일 DB 인스턴스 통합&lt;/td&gt;
&lt;td data-end=&quot;660&quot; data-start=&quot;647&quot; data-col-size=&quot;sm&quot;&gt;단순하나 유연성&amp;darr;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;717&quot; data-start=&quot;662&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Exadata 권장 통합 방식&lt;/b&gt;: 멀티테넌트 + Instance Caging + IORM&lt;/p&gt;
&lt;h3 data-end=&quot;741&quot; data-start=&quot;719&quot; data-ke-size=&quot;size23&quot;&gt;3. CPU 및 메모리 통합 전략&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;922&quot; data-start=&quot;742&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;790&quot; data-start=&quot;742&quot;&gt;CPU_COUNT로 &lt;b&gt;Instance Caging&lt;/b&gt; 설정 &amp;rarr; 자원 분배/보장&lt;/li&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;791&quot;&gt;&lt;b&gt;오버프로비저닝&lt;/b&gt; vs &lt;b&gt;파티셔닝&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;883&quot; data-start=&quot;819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;853&quot; data-start=&quot;819&quot;&gt;오버프로비저닝: 자원 공유(성능 민감도 낮은 DB에 적합)&lt;/li&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;856&quot;&gt;파티셔닝: 자원 보장(핵심 업무 DB에 적합)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;922&quot; data-start=&quot;884&quot;&gt;메모리는 전체 물리 메모리의 &lt;b&gt;75~85% 이내&lt;/b&gt;만 사용 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;961&quot; data-start=&quot;924&quot; data-ke-size=&quot;size23&quot;&gt;4. I/O Resource Management (IORM)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1053&quot; data-start=&quot;962&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1004&quot; data-start=&quot;962&quot;&gt;여러 DB가 공존할 때 &lt;b&gt;디스크 I/O 자원 보장&lt;/b&gt;을 위한 핵심 기능&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1005&quot;&gt;DB별&amp;middot;PDB별 IORM plan 설정 &amp;rarr; 특정 DB의 과도한 I/O 점유 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;program -&amp;gt; process (자원(cpu, memory)할당받은 상태)-&amp;gt;thread&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스할당상태 :&amp;nbsp;program -&amp;gt; mainmemory (RAM) &amp;lt;- cpu&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자원 부족하면 LRU 기반으로 관리. 내보내는 작업 swap(HDD, SDD) swapping 잦으면 성능 down&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11장: 데이터베이스 마이그레이션 방법(논리/물리적)&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1116&quot; data-start=&quot;1097&quot; data-ke-size=&quot;size23&quot;&gt;1. 마이그레이션 설계 순서&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1259&quot; data-start=&quot;1117&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1171&quot; data-start=&quot;1117&quot;&gt;&lt;b&gt;소스 DB 아키텍처 파악&lt;/b&gt; (CDB or Non-CDB, OS/Endian, 캐릭터셋)&lt;/li&gt;
&lt;li data-end=&quot;1195&quot; data-start=&quot;1172&quot;&gt;&lt;b&gt;타깃 Exadata 용량 계획&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1220&quot; data-start=&quot;1196&quot;&gt;&lt;b&gt;Downtime 허용 여부 판단&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1240&quot; data-start=&quot;1221&quot;&gt;&lt;b&gt;마이그레이션 방식 결정&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1259&quot; data-start=&quot;1241&quot;&gt;&lt;b&gt;테스트 후 실제 이관&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1264&quot; data-start=&quot;1261&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1294&quot; data-start=&quot;1266&quot; data-ke-size=&quot;size23&quot;&gt;2. 물리적 마이그레이션 (Physical)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1331&quot; data-start=&quot;1295&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1331&quot; data-start=&quot;1295&quot;&gt;&lt;b&gt;특징&lt;/b&gt;: 구조 변경 없음, 빠르고 안정적, 다운타임 짧음&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;방식설명장점제약
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1638&quot; data-start=&quot;1333&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1638&quot; data-start=&quot;1385&quot;&gt;
&lt;tr data-end=&quot;1448&quot; data-start=&quot;1385&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1396&quot; data-start=&quot;1385&quot;&gt;&lt;b&gt;RMAN&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1420&quot; data-start=&quot;1396&quot; data-col-size=&quot;sm&quot;&gt;백업/복구 또는 Duplicate 활용&lt;/td&gt;
&lt;td data-end=&quot;1429&quot; data-start=&quot;1420&quot; data-col-size=&quot;sm&quot;&gt;안정성 높음&lt;/td&gt;
&lt;td data-end=&quot;1448&quot; data-start=&quot;1429&quot; data-col-size=&quot;md&quot;&gt;OS/Endian 호환 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1534&quot; data-start=&quot;1449&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1466&quot; data-start=&quot;1449&quot;&gt;&lt;b&gt;Data Guard&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1501&quot; data-start=&quot;1466&quot;&gt;Physical Standby 구성 후 switchover&lt;/td&gt;
&lt;td data-end=&quot;1516&quot; data-start=&quot;1501&quot; data-col-size=&quot;sm&quot;&gt;실시간, 다운타임 최소&lt;/td&gt;
&lt;td data-end=&quot;1534&quot; data-start=&quot;1516&quot; data-col-size=&quot;md&quot;&gt;라이선스 필요, 구성 복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1638&quot; data-start=&quot;1535&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1550&quot; data-start=&quot;1535&quot;&gt;&lt;b&gt;TTS/TTDB&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1575&quot; data-start=&quot;1550&quot; data-col-size=&quot;sm&quot;&gt;테이블스페이스 단위 또는 전체 DB 이관&lt;/td&gt;
&lt;td data-end=&quot;1586&quot; data-start=&quot;1575&quot; data-col-size=&quot;sm&quot;&gt;가장 빠른 방법&lt;/td&gt;
&lt;td data-end=&quot;1638&quot; data-start=&quot;1586&quot; data-col-size=&quot;md&quot;&gt;TTDB는 Endian 동일 필요, TTS는 RMAN CONVERT로 엔디언 변환 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1665&quot; data-start=&quot;1640&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;1712&quot; data-start=&quot;1666&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1712&quot; data-start=&quot;1666&quot;&gt;&lt;b&gt;TTS로 bulk 이관 + GoldenGate로 동기화 + Cutover&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1717&quot; data-start=&quot;1714&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1746&quot; data-start=&quot;1719&quot; data-ke-size=&quot;size23&quot;&gt;3. 논리적 마이그레이션 (Logical)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1775&quot; data-start=&quot;1747&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1775&quot; data-start=&quot;1747&quot;&gt;&lt;b&gt;특징&lt;/b&gt;: 구조 변경 가능, 유연하지만 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;방식설명장점제약
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2095&quot; data-start=&quot;1777&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2095&quot; data-start=&quot;1829&quot;&gt;
&lt;tr data-end=&quot;1898&quot; data-start=&quot;1829&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1859&quot; data-start=&quot;1829&quot;&gt;&lt;b&gt;Data Pump (expdp/impdp)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1875&quot; data-start=&quot;1859&quot; data-col-size=&quot;sm&quot;&gt;구조&amp;middot;데이터 논리적 덤프&lt;/td&gt;
&lt;td data-end=&quot;1886&quot; data-start=&quot;1875&quot; data-col-size=&quot;sm&quot;&gt;버전 호환 유연&lt;/td&gt;
&lt;td data-end=&quot;1898&quot; data-start=&quot;1886&quot; data-col-size=&quot;sm&quot;&gt;대용량 시 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1974&quot; data-start=&quot;1899&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1932&quot; data-start=&quot;1899&quot;&gt;&lt;b&gt;Insert as Select (DB Link)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1948&quot; data-start=&quot;1932&quot; data-col-size=&quot;sm&quot;&gt;네트워크 통해 직접 적재&lt;/td&gt;
&lt;td data-end=&quot;1960&quot; data-start=&quot;1948&quot; data-col-size=&quot;sm&quot;&gt;별도 파일 불필요&lt;/td&gt;
&lt;td data-end=&quot;1974&quot; data-start=&quot;1960&quot; data-col-size=&quot;sm&quot;&gt;다운타임 발생 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2044&quot; data-start=&quot;1975&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1997&quot; data-start=&quot;1975&quot;&gt;&lt;b&gt;Logical Standby&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2019&quot; data-start=&quot;1997&quot; data-col-size=&quot;sm&quot;&gt;SQL apply 기반 실시간 복제&lt;/td&gt;
&lt;td data-end=&quot;2029&quot; data-start=&quot;2019&quot; data-col-size=&quot;sm&quot;&gt;다운타임 최소&lt;/td&gt;
&lt;td data-end=&quot;2044&quot; data-start=&quot;2029&quot; data-col-size=&quot;sm&quot;&gt;제약 많고 구성 복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2095&quot; data-start=&quot;2045&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2062&quot; data-start=&quot;2045&quot;&gt;&lt;b&gt;GoldenGate&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2071&quot; data-start=&quot;2062&quot; data-col-size=&quot;sm&quot;&gt;실시간 복제&lt;/td&gt;
&lt;td data-end=&quot;2081&quot; data-start=&quot;2071&quot; data-col-size=&quot;sm&quot;&gt;다운타임 최소&lt;/td&gt;
&lt;td data-end=&quot;2095&quot; data-start=&quot;2081&quot; data-col-size=&quot;sm&quot;&gt;추가 라이선스 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2100&quot; data-start=&quot;2097&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2120&quot; data-start=&quot;2102&quot; data-ke-size=&quot;size23&quot;&gt;4. 멀티테넌트 환경 이관&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2246&quot; data-start=&quot;2121&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2180&quot; data-start=&quot;2121&quot;&gt;Non-CDB &amp;rarr; CDB 이관:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2180&quot; data-start=&quot;2143&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2180&quot; data-start=&quot;2143&quot;&gt;&lt;b&gt;Unplug/Plug + Non-CDB to PDB 변환&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2246&quot; data-start=&quot;2181&quot;&gt;CDB &amp;rarr; CDB 간:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2246&quot; data-start=&quot;2198&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2219&quot; data-start=&quot;2198&quot;&gt;&lt;b&gt;Unplug/Plug PDB&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2246&quot; data-start=&quot;2222&quot;&gt;다운타임 최소, 가장 빠른 방식 중 하나&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2295&quot; data-start=&quot;2248&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;12장: 대용량 데이터 로딩(DBFS, ACFS, 외부 파일 시스템)&lt;/blockquote&gt;
&lt;h3 data-end=&quot;2379&quot; data-start=&quot;2348&quot; data-ke-size=&quot;size23&quot;&gt;1. Exadata에서 대용량 적재 시 고려 사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2501&quot; data-start=&quot;2380&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2411&quot; data-start=&quot;2380&quot;&gt;&lt;b&gt;병렬성 확보&lt;/b&gt; (Granule 단위 병렬 처리)&lt;/li&gt;
&lt;li data-end=&quot;2452&quot; data-start=&quot;2412&quot;&gt;&lt;b&gt;압축 파일은 병렬 granule 불가&lt;/b&gt; &amp;rarr; 미리 압축 해제 권장&lt;/li&gt;
&lt;li data-end=&quot;2501&quot; data-start=&quot;2453&quot;&gt;&lt;b&gt;I/O 대역폭 최대로 활용&lt;/b&gt;하기 위해 Direct Path Load 적극 활용&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;h3 data-end=&quot;2541&quot; data-start=&quot;2508&quot; data-ke-size=&quot;size23&quot;&gt;2. DBFS / ACFS / 외부 파일 시스템 차이&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;파일시스템설명특징사용 예
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2841&quot; data-start=&quot;2543&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2841&quot; data-start=&quot;2609&quot;&gt;
&lt;tr data-end=&quot;2688&quot; data-start=&quot;2609&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2620&quot; data-start=&quot;2609&quot;&gt;&lt;b&gt;DBFS&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2646&quot; data-start=&quot;2620&quot; data-col-size=&quot;sm&quot;&gt;DB 테이블에 저장된 파일을 파일처럼 접근&lt;/td&gt;
&lt;td data-end=&quot;2670&quot; data-start=&quot;2646&quot; data-col-size=&quot;sm&quot;&gt;안정성, 백업 용이, 성능은 다소 낮음&lt;/td&gt;
&lt;td data-end=&quot;2688&quot; data-start=&quot;2670&quot; data-col-size=&quot;sm&quot;&gt;소규모 파일, 안정성 중요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2764&quot; data-start=&quot;2689&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2700&quot; data-start=&quot;2689&quot;&gt;&lt;b&gt;ACFS&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2718&quot; data-start=&quot;2700&quot;&gt;ASM 기반 범용 파일시스템&lt;/td&gt;
&lt;td data-end=&quot;2745&quot; data-start=&quot;2718&quot; data-col-size=&quot;sm&quot;&gt;Exadata에서 가장 권장되는 파일 시스템&lt;/td&gt;
&lt;td data-end=&quot;2764&quot; data-start=&quot;2745&quot; data-col-size=&quot;sm&quot;&gt;대용량 CSV, 데이터 적재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2841&quot; data-start=&quot;2765&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2784&quot; data-start=&quot;2765&quot;&gt;&lt;b&gt;외부 FS(NFS 등)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2798&quot; data-start=&quot;2784&quot; data-col-size=&quot;sm&quot;&gt;외부 스토리지 마운트&lt;/td&gt;
&lt;td data-end=&quot;2828&quot; data-start=&quot;2798&quot; data-col-size=&quot;sm&quot;&gt;간편, 병렬 처리는 가능하지만 네트워크 병목 주의&lt;/td&gt;
&lt;td data-end=&quot;2841&quot; data-start=&quot;2828&quot; data-col-size=&quot;sm&quot;&gt;임시 적재/ETL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2871&quot; data-start=&quot;2843&quot; data-ke-size=&quot;size16&quot;&gt;  실무에서는 &lt;b&gt;ACFS가 대용량 로딩 표준&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2876&quot; data-start=&quot;2873&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2904&quot; data-start=&quot;2878&quot; data-ke-size=&quot;size23&quot;&gt;3. 외부 테이블 &amp;amp; 병렬 Granule&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3029&quot; data-start=&quot;2906&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2931&quot; data-start=&quot;2906&quot;&gt;&lt;b&gt;Granule 크기&lt;/b&gt;: 기본 10MB&lt;/li&gt;
&lt;li data-end=&quot;2968&quot; data-start=&quot;2932&quot;&gt;&lt;b&gt;Granule 생성 불가&lt;/b&gt;: 압축 파일, 시리얼 디바이스&lt;/li&gt;
&lt;li data-end=&quot;3003&quot; data-start=&quot;2969&quot;&gt;&lt;b&gt;병렬도&lt;/b&gt;는 granule 수 or 파일 개수로 결정됨&lt;/li&gt;
&lt;li data-end=&quot;3029&quot; data-start=&quot;3004&quot;&gt;여러 파일로 나누는 것이 병렬 처리에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ext_data ( id NUMBER, name VARCHAR2(&lt;/span&gt;&lt;span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) ) ORGANIZATION &lt;/span&gt;&lt;span&gt;&lt;span&gt;EXTERNAL&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ( TYPE ORACLE_LOADER &lt;/span&gt;&lt;span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DIRECTORY acfs_dir ACCESS PARAMETERS ( RECORDS DELIMITED &lt;/span&gt;&lt;span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NEWLINE FIELDS TERMINATED &lt;/span&gt;&lt;span&gt;&lt;span&gt;BY&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;span&gt; ) LOCATION (&lt;/span&gt;&lt;span&gt;&lt;span&gt;'file1.csv'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;'file2.csv'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;'file3.csv'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) ) PARALLEL &lt;/span&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3332&quot; data-start=&quot;3329&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3351&quot; data-start=&quot;3334&quot; data-ke-size=&quot;size23&quot;&gt;4. 로딩 성능 향상 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3528&quot; data-start=&quot;3352&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3404&quot; data-start=&quot;3352&quot;&gt;Direct Path Load (INSERT /*+ APPEND PARALLEL */)&lt;/li&gt;
&lt;li data-end=&quot;3438&quot; data-start=&quot;3405&quot;&gt;ACFS + 여러 파일 + Granule 기반 병렬 적재&lt;/li&gt;
&lt;li data-end=&quot;3473&quot; data-start=&quot;3439&quot;&gt;로딩 후 NOLOGGING 옵션 사용 시 redo 감소&lt;/li&gt;
&lt;li data-end=&quot;3498&quot; data-start=&quot;3474&quot;&gt;임시 인덱스 생성 지연 (로딩 후 생성)&lt;/li&gt;
&lt;li data-end=&quot;3528&quot; data-start=&quot;3499&quot;&gt;압축 사용 지양 (병렬 granule 분할 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3533&quot; data-start=&quot;3530&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3553&quot; data-start=&quot;3535&quot; data-ke-size=&quot;size26&quot;&gt;  최종 핵심 포인트 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분핵심 개념키워드
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3788&quot; data-start=&quot;3555&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3788&quot; data-start=&quot;3607&quot;&gt;
&lt;tr data-end=&quot;3660&quot; data-start=&quot;3607&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3613&quot; data-start=&quot;3607&quot;&gt;10장&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3621&quot; data-start=&quot;3613&quot;&gt;통합 전략&lt;/td&gt;
&lt;td data-end=&quot;3660&quot; data-start=&quot;3621&quot; data-col-size=&quot;md&quot;&gt;멀티테넌트, Instance Caging, IORM, 자원 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3722&quot; data-start=&quot;3661&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3667&quot; data-start=&quot;3661&quot;&gt;11장&lt;/td&gt;
&lt;td data-end=&quot;3676&quot; data-start=&quot;3667&quot; data-col-size=&quot;sm&quot;&gt;마이그레이션&lt;/td&gt;
&lt;td data-end=&quot;3722&quot; data-start=&quot;3676&quot; data-col-size=&quot;md&quot;&gt;TTS, RMAN, Data Pump, GoldenGate, 논리 vs 물리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3788&quot; data-start=&quot;3723&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3729&quot; data-start=&quot;3723&quot;&gt;12장&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3738&quot; data-start=&quot;3729&quot;&gt;대용량 적재&lt;/td&gt;
&lt;td data-end=&quot;3788&quot; data-start=&quot;3738&quot; data-col-size=&quot;md&quot;&gt;Granule 10MB, ACFS 권장, 병렬 적재, Direct Path Load&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3793&quot; data-start=&quot;3790&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;3808&quot; data-start=&quot;3795&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;실무 TIP&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3951&quot; data-start=&quot;3809&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3889&quot; data-start=&quot;3809&quot;&gt;Consolidation 설계 단계에서 자원(CPU/메모리/I/O) 분배를 확정해두면 나중에 마이그레이션, 로딩 작업이 훨씬 수월합니다.&lt;/li&gt;
&lt;li data-end=&quot;3951&quot; data-start=&quot;3890&quot;&gt;Exadata의 &lt;b&gt;병렬성과 Smart Scan&lt;/b&gt;은 &amp;ldquo;파일 준비&amp;rdquo; 단계에서 대부분 성능이 결정됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;10장 Consolidation Options and Recommendations&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;125&quot; data-start=&quot;96&quot;&gt;Exadata 운영&amp;middot;통합 핵심 정리&lt;/h1&gt;
&lt;h2 data-end=&quot;142&quot; data-start=&quot;127&quot; data-ke-size=&quot;size26&quot;&gt;1) 메모리 운영 원칙&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;319&quot; data-start=&quot;144&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;187&quot; data-start=&quot;144&quot;&gt;&lt;b&gt;전체 서버 기준 여유 메모리&lt;/b&gt;: 항상 **최소 5%**는 남겨두기&lt;/li&gt;
&lt;li data-end=&quot;245&quot; data-start=&quot;188&quot;&gt;&lt;b&gt;DB들이 합쳐 쓰는 상한&lt;/b&gt;: &lt;b&gt;RAM의 75~85% 이내&lt;/b&gt; (권장 상한 = &lt;b&gt;85%&lt;/b&gt;)&lt;/li&gt;
&lt;li data-end=&quot;319&quot; data-start=&quot;246&quot;&gt;&lt;b&gt;초기 배분 감각&lt;/b&gt;: 통합 환경이면 &lt;b&gt;주요 DB 1개당 ~40~45% 수준&lt;/b&gt;에서 시작해 점증(다른 작업/OS 여유 고려)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;344&quot; data-start=&quot;321&quot; data-ke-size=&quot;size23&quot;&gt;HugePages(=대페이지) 필수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;586&quot; data-start=&quot;345&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;397&quot; data-start=&quot;345&quot;&gt;기본 4KB 대신 &lt;b&gt;2MB 페이지&lt;/b&gt;로 메모리 할당 &amp;rarr; &lt;b&gt;TLB 미스&amp;darr;, 스왑 방지&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;586&quot; data-start=&quot;398&quot;&gt;DB 파라미터:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;586&quot; data-start=&quot;413&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;476&quot; data-start=&quot;413&quot;&gt;USE_LARGE_PAGES=ONLY (권장; HugePages 없으면 기동 실패해서 설정 누락 방지)&lt;/li&gt;
&lt;li data-end=&quot;586&quot; data-start=&quot;479&quot;&gt;&lt;b&gt;주의&lt;/b&gt;: HugePages 사용 시 &lt;b&gt;AMM(Automatic Memory Management)&lt;/b&gt; &lt;b&gt;미지원&lt;/b&gt; &amp;rarr; &lt;b&gt;ASMM&lt;/b&gt;(SGA_TARGET/ PGA_AGG&amp;hellip;)으로 운용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;606&quot; data-start=&quot;588&quot; data-ke-size=&quot;size23&quot;&gt;메모리 계산(러프 가이드)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;853&quot; data-start=&quot;607&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;607&quot;&gt;&lt;b&gt;OLTP&lt;/b&gt;: 총 메모리 &amp;asymp; SGA + PGA + (PROCESSES &amp;times; 4MB 오버헤드)&lt;/li&gt;
&lt;li data-end=&quot;755&quot; data-start=&quot;666&quot;&gt;&lt;b&gt;DW&lt;/b&gt;: 병렬&amp;middot;해시/정렬 많아 &lt;b&gt;PGA 3배 가중&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;755&quot; data-start=&quot;706&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;755&quot; data-start=&quot;706&quot;&gt;총 메모리 &amp;asymp; SGA + (PGA &amp;times; 3) + (PROCESSES &amp;times; 4MB)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;853&quot; data-start=&quot;756&quot;&gt;PGA 관련
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;853&quot; data-start=&quot;767&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;796&quot; data-start=&quot;767&quot;&gt;목표치: PGA_AGGREGATE_TARGET&lt;/li&gt;
&lt;li data-end=&quot;853&quot; data-start=&quot;799&quot;&gt;&lt;b&gt;하드 상한&lt;/b&gt;: PGA_AGGREGATE_LIMIT&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;858&quot; data-start=&quot;855&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;884&quot; data-start=&quot;860&quot; data-ke-size=&quot;size26&quot;&gt;2) OS 커널 파라미터(리눅스) 요령&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1176&quot; data-start=&quot;886&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;886&quot;&gt;&lt;b&gt;공유메모리 식별자 수&lt;/b&gt;: kernel.shmmni &lt;b&gt;&amp;gt; DB 개수&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;983&quot; data-start=&quot;933&quot;&gt;&lt;b&gt;최대 공유메모리 세그먼트 크기&lt;/b&gt;: kernel.shmmax &amp;asymp; RAM의 85%&lt;/li&gt;
&lt;li data-end=&quot;1142&quot; data-start=&quot;984&quot;&gt;&lt;b&gt;세마포어&lt;/b&gt; (kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1142&quot; data-start=&quot;1042&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1090&quot; data-start=&quot;1042&quot;&gt;&lt;b&gt;SEMMNS(시스템 총 세마포)&lt;/b&gt; &amp;ge; &lt;b&gt;모든 DB의 PROCESSES 합&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1142&quot; data-start=&quot;1093&quot;&gt;&lt;b&gt;SEMMSL(집합당 최대 세마포)&lt;/b&gt; &amp;ge; &lt;b&gt;가장 큰 DB의 PROCESSES&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1176&quot; data-start=&quot;1143&quot;&gt;요지는: &lt;b&gt;OS 세마포 한도 &amp;ge; DB 프로세스 수요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1181&quot; data-start=&quot;1178&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1210&quot; data-start=&quot;1183&quot; data-ke-size=&quot;size26&quot;&gt;3) 프로세스/세션&amp;middot;병렬 관리 베스트프랙티스&lt;/h2&gt;
&lt;h3 data-end=&quot;1244&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size23&quot;&gt;PROCESSES(동시 접속 한도; DB 파라미터)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1318&quot; data-start=&quot;1245&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1284&quot; data-start=&quot;1245&quot;&gt;&lt;b&gt;2~10개 DB 통합&lt;/b&gt;: 50 + (50 &amp;times; DB개수)&lt;/li&gt;
&lt;li data-end=&quot;1318&quot; data-start=&quot;1285&quot;&gt;&lt;b&gt;11개 이상&lt;/b&gt;: 450 + (10 &amp;times; DB개수)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1332&quot; data-start=&quot;1320&quot; data-ke-size=&quot;size23&quot;&gt;병렬 서버 상한&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1459&quot; data-start=&quot;1333&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1390&quot; data-start=&quot;1333&quot;&gt;&lt;b&gt;2소켓 서버&lt;/b&gt;: 모든 DB의 PARALLEL_MAX_SERVERS 합 &amp;le; &lt;b&gt;240&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1419&quot; data-start=&quot;1391&quot;&gt;&lt;b&gt;8소켓 서버&lt;/b&gt;: 합 &amp;le; &lt;b&gt;1280&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1459&quot; data-start=&quot;1420&quot;&gt;&lt;b&gt;Data Guard redo apply 병렬&lt;/b&gt; &amp;le; &lt;b&gt;16&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1479&quot; data-start=&quot;1461&quot; data-ke-size=&quot;size23&quot;&gt;활성 세션(프로세스) 밀도&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1564&quot; data-start=&quot;1480&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1521&quot; data-start=&quot;1480&quot;&gt;&lt;b&gt;일반 워크로드&lt;/b&gt;: &lt;b&gt;Active &amp;le; 5 &amp;times; CPU_COUNT&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1564&quot; data-start=&quot;1522&quot;&gt;&lt;b&gt;매우 CPU집약&lt;/b&gt;: &lt;b&gt;Active &amp;le; 1 &amp;times; CPU_COUNT&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1575&quot; data-start=&quot;1566&quot; data-ke-size=&quot;size23&quot;&gt;연결 관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1699&quot; data-start=&quot;1576&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1606&quot; data-start=&quot;1576&quot;&gt;&lt;b&gt;커넥션 풀&lt;/b&gt;(UCP/Hikari 등) 사용&lt;/li&gt;
&lt;li data-end=&quot;1650&quot; data-start=&quot;1607&quot;&gt;필요 시 &lt;b&gt;Shared Server(공유 서버)&lt;/b&gt; 로 프로세스 감소&lt;/li&gt;
&lt;li data-end=&quot;1699&quot; data-start=&quot;1651&quot;&gt;&lt;b&gt;연결 폭주(rate limit)&lt;/b&gt; 방지(미들웨어/리스너/Firewall 레벨)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1704&quot; data-start=&quot;1701&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1738&quot; data-start=&quot;1706&quot; data-ke-size=&quot;size26&quot;&gt;4) CPU 자원 분배: Instance Caging&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2073&quot; data-start=&quot;1740&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1787&quot; data-start=&quot;1740&quot;&gt;DB별 CPU_COUNT로 &lt;b&gt;코어 할당&lt;/b&gt; (DB 리소스 매니지먼트의 핵심)&lt;/li&gt;
&lt;li data-end=&quot;1902&quot; data-start=&quot;1788&quot;&gt;&lt;b&gt;두 방식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1902&quot; data-start=&quot;1801&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1847&quot; data-start=&quot;1801&quot;&gt;&lt;b&gt;파티션(보장)&lt;/b&gt;: 총합 &amp;le; 물리 코어 &amp;rarr; &lt;b&gt;항상 보장&lt;/b&gt;(미션 크리티컬)&lt;/li&gt;
&lt;li data-end=&quot;1902&quot; data-start=&quot;1850&quot;&gt;&lt;b&gt;오버프로비저닝&lt;/b&gt;: 총합이 물리 코어 초과 가능 &amp;rarr; &lt;b&gt;유휴 코어 공유&lt;/b&gt;(비크리티컬)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2073&quot; data-start=&quot;1903&quot;&gt;권장
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2073&quot; data-start=&quot;1910&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1939&quot; data-start=&quot;1910&quot;&gt;DB별 CPU_COUNT &lt;b&gt;최소 2&lt;/b&gt; 이상&lt;/li&gt;
&lt;li data-end=&quot;1965&quot; data-start=&quot;1942&quot;&gt;&lt;b&gt;중요 DB의 합계 &amp;le; 물리 코어&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2009&quot; data-start=&quot;1968&quot;&gt;&lt;b&gt;덜 중요한 DB&lt;/b&gt;는 &lt;b&gt;최대 3배수&lt;/b&gt; 내에서 오버프로비저닝 가능&lt;/li&gt;
&lt;li data-end=&quot;2073&quot; data-start=&quot;2012&quot;&gt;하드 캡 필요 시 &lt;b&gt;Resource Manager&lt;/b&gt;의 MAX_UTILIZATION_LIMIT로 상한&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2078&quot; data-start=&quot;2075&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2114&quot; data-start=&quot;2080&quot; data-ke-size=&quot;size26&quot;&gt;5) HugePages &amp;amp; 스와핑 이야기 (이해 포인트)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2266&quot; data-start=&quot;2116&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2176&quot; data-start=&quot;2116&quot;&gt;프로세스가 많아지고 메모리가 부족하면 &lt;b&gt;swap-out&lt;/b&gt;/&lt;b&gt;swap-in&lt;/b&gt; 발생 &amp;rarr; &lt;b&gt;지연&amp;uarr;&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2266&quot; data-start=&quot;2177&quot;&gt;HugePages(2MB) 사용 + USE_LARGE_PAGES=ONLY &amp;rarr;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2266&quot; data-start=&quot;2228&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2266&quot; data-start=&quot;2228&quot;&gt;스왑 사실상 차단, &lt;b&gt;메모리 파편화&amp;darr;&lt;/b&gt;, 대용량 SGA 안정화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2271&quot; data-start=&quot;2268&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2292&quot; data-start=&quot;2273&quot; data-ke-size=&quot;size26&quot;&gt;6) 스토리지&amp;middot;보안&amp;middot;역할 분리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2429&quot; data-start=&quot;2294&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2356&quot; data-start=&quot;2294&quot;&gt;&lt;b&gt;DB(oracle)&lt;/b&gt; vs &lt;b&gt;ASM(grid)&lt;/b&gt; &lt;b&gt;OS 계정/그룹 분리&lt;/b&gt;(권한&amp;middot;보안&amp;middot;책임 분리)&lt;/li&gt;
&lt;li data-end=&quot;2392&quot; data-start=&quot;2357&quot;&gt;백업/FRA 용량 사전 확보, IORM 정책 검토(우선순위)&lt;/li&gt;
&lt;li data-end=&quot;2429&quot; data-start=&quot;2393&quot;&gt;인덱스 전략 재검토(Exadata Smart Scan과 병행)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2434&quot; data-start=&quot;2431&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2457&quot; data-start=&quot;2436&quot; data-ke-size=&quot;size26&quot;&gt;7) 가상화(KVM) 통합 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2614&quot; data-start=&quot;2459&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2515&quot; data-start=&quot;2459&quot;&gt;Exadata X8M+는 &lt;b&gt;KVM&lt;/b&gt; 권장, &lt;b&gt;SR-IOV&lt;/b&gt;로 &lt;b&gt;RoCE 성능 근접&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2562&quot; data-start=&quot;2516&quot;&gt;&lt;b&gt;VM 단위&lt;/b&gt;로 &lt;b&gt;CPU/메모리&lt;/b&gt; 지정, &lt;b&gt;라이선스도 VM 단위&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2614&quot; data-start=&quot;2563&quot;&gt;&lt;b&gt;DB마다 VM 1개씩&lt;/b&gt;은 &lt;b&gt;오버헤드&amp;uarr;&lt;/b&gt; &amp;rarr; &lt;b&gt;업무/조직 단위로 적절히 통합&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2619&quot; data-start=&quot;2616&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2651&quot; data-start=&quot;2621&quot; data-ke-size=&quot;size26&quot;&gt;8) 멀티테넌트(PDB) 마이그레이션이 쉬운 이유&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2749&quot; data-start=&quot;2653&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2704&quot; data-start=&quot;2653&quot;&gt;&lt;b&gt;Unplug/Plug&lt;/b&gt; 으로 &lt;b&gt;PDB 단위 이동&lt;/b&gt; &amp;rarr; &lt;b&gt;속도&amp;uarr;, 다운타임&amp;darr;&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2749&quot; data-start=&quot;2705&quot;&gt;여러 PDB &lt;b&gt;병렬 이관&lt;/b&gt; 가능, 패치/업그레이드 &lt;b&gt;일괄 관리 용이&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2754&quot; data-start=&quot;2751&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2778&quot; data-start=&quot;2756&quot; data-ke-size=&quot;size26&quot;&gt;9) 마이그레이션 옵션 단기 비교표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;유형예장점유의점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3082&quot; data-start=&quot;2780&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3082&quot; data-start=&quot;2820&quot;&gt;
&lt;tr data-end=&quot;2971&quot; data-start=&quot;2820&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2831&quot; data-start=&quot;2820&quot;&gt;&lt;b&gt;물리계열&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2895&quot; data-start=&quot;2831&quot;&gt;RMAN(Backup/Duplicate), &lt;b&gt;Data Guard Physical&lt;/b&gt;, &lt;b&gt;TTS/TTDB&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2927&quot; data-start=&quot;2895&quot; data-col-size=&quot;sm&quot;&gt;다운타임 최소(특히 DG), &lt;b&gt;TTS 가장 빠름&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2971&quot; data-start=&quot;2927&quot; data-col-size=&quot;sm&quot;&gt;TTDB는 엔디언 불가, TTS는 RMAN으로 엔디언 변환 필요 시 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3082&quot; data-start=&quot;2972&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2983&quot; data-start=&quot;2972&quot;&gt;&lt;b&gt;논리계열&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;3043&quot; data-start=&quot;2983&quot; data-col-size=&quot;md&quot;&gt;Data Pump, &lt;b&gt;Logical Standby&lt;/b&gt;, INSERT&amp;hellip;SELECT, GoldenGate&lt;/td&gt;
&lt;td data-end=&quot;3060&quot; data-start=&quot;3043&quot; data-col-size=&quot;sm&quot;&gt;구조 재구성/버전 간 유연&lt;/td&gt;
&lt;td data-end=&quot;3082&quot; data-start=&quot;3060&quot; data-col-size=&quot;sm&quot;&gt;변환/적재 시간, 논리 변환 이슈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;3177&quot; data-start=&quot;3084&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3177&quot; data-start=&quot;3086&quot; data-ke-size=&quot;size16&quot;&gt;실무 상: &lt;b&gt;초기 대량&lt;/b&gt;은 &lt;b&gt;TTS/파일적재(External/SQL*Loader)&lt;/b&gt;, &lt;b&gt;변경분 동기화&lt;/b&gt;는 &lt;b&gt;GoldenGate&lt;/b&gt;로 혼합이 가장 흔함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;3182&quot; data-start=&quot;3179&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3217&quot; data-start=&quot;3184&quot; data-ke-size=&quot;size26&quot;&gt;10) 파일 적재(External Table) 성능 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3390&quot; data-start=&quot;3219&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3252&quot; data-start=&quot;3219&quot;&gt;&lt;b&gt;10MB granule&lt;/b&gt; 자동 분할로 병렬 읽기&lt;/li&gt;
&lt;li data-end=&quot;3290&quot; data-start=&quot;3253&quot;&gt;&lt;b&gt;압축 파일은 granule 불가&lt;/b&gt; &amp;rarr; &lt;b&gt;풀고 적재&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3353&quot; data-start=&quot;3291&quot;&gt;&lt;b&gt;여러 파일&lt;/b&gt;, &lt;b&gt;비슷한 크기&lt;/b&gt;, External LOCATION은 &lt;b&gt;큰 파일&amp;rarr;작은 파일 순&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3390&quot; data-start=&quot;3354&quot;&gt;Direct Path / APPEND / 병렬 옵션 적극 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;273&quot; data-start=&quot;207&quot; data-ke-size=&quot;size26&quot;&gt;  13장: Exadata Database Machine Platform Monitoring (플랫폼 모니터링)&lt;/h2&gt;
&lt;h3 data-end=&quot;289&quot; data-start=&quot;275&quot; data-ke-size=&quot;size23&quot;&gt;1. 모니터링 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;414&quot; data-start=&quot;290&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;391&quot; data-start=&quot;290&quot;&gt;하드웨어 + 소프트웨어 스택을 &lt;b&gt;엔드 투 엔드(End-to-End)&lt;/b&gt; 로 감시&lt;br /&gt;(DB &amp;harr; Storage &amp;harr; Infiniband &amp;harr; Cell &amp;harr; OS &amp;harr; Network)&lt;/li&gt;
&lt;li data-end=&quot;414&quot; data-start=&quot;392&quot;&gt;장애 징후 조기 발견 및 가용성 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;433&quot; data-start=&quot;416&quot; data-ke-size=&quot;size23&quot;&gt;2. 주요 모니터링 계층&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;계층대상도구
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;671&quot; data-start=&quot;434&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;671&quot; data-start=&quot;474&quot;&gt;
&lt;tr data-end=&quot;525&quot; data-start=&quot;474&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;483&quot; data-start=&quot;474&quot;&gt;데이터베이스&lt;/td&gt;
&lt;td data-end=&quot;508&quot; data-start=&quot;483&quot; data-col-size=&quot;sm&quot;&gt;인스턴스, PDB, SQL, I/O 대기&lt;/td&gt;
&lt;td data-end=&quot;525&quot; data-start=&quot;508&quot; data-col-size=&quot;sm&quot;&gt;AWR, ASH, OEM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;566&quot; data-start=&quot;526&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;533&quot; data-start=&quot;526&quot;&gt;스토리지&lt;/td&gt;
&lt;td data-end=&quot;550&quot; data-start=&quot;533&quot; data-col-size=&quot;sm&quot;&gt;셀 서버, 디스크, 플래시&lt;/td&gt;
&lt;td data-end=&quot;566&quot; data-start=&quot;550&quot; data-col-size=&quot;sm&quot;&gt;CellCLI, OEM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;621&quot; data-start=&quot;567&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;574&quot; data-start=&quot;567&quot;&gt;네트워크&lt;/td&gt;
&lt;td data-end=&quot;598&quot; data-start=&quot;574&quot; data-col-size=&quot;sm&quot;&gt;InfiniBand, RoCE, 이더넷&lt;/td&gt;
&lt;td data-end=&quot;621&quot; data-start=&quot;598&quot; data-col-size=&quot;sm&quot;&gt;ibstat, nm2env, OEM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;671&quot; data-start=&quot;622&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;628&quot; data-start=&quot;622&quot;&gt;플랫폼&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;645&quot; data-start=&quot;628&quot;&gt;노드 상태, 하드웨어 센서&lt;/td&gt;
&lt;td data-end=&quot;671&quot; data-start=&quot;645&quot; data-col-size=&quot;sm&quot;&gt;ILOM, dcli, ipmitool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;690&quot; data-start=&quot;673&quot; data-ke-size=&quot;size23&quot;&gt;3. 표준 모니터링 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;868&quot; data-start=&quot;691&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;723&quot; data-start=&quot;691&quot;&gt;&lt;b&gt;AWR / ADDM&lt;/b&gt;: DB 성능 및 리소스 병목&lt;/li&gt;
&lt;li data-end=&quot;766&quot; data-start=&quot;724&quot;&gt;&lt;b&gt;dcli&lt;/b&gt;: 여러 노드에 명령 병렬 실행 (Exadata 표준 툴)&lt;/li&gt;
&lt;li data-end=&quot;824&quot; data-start=&quot;767&quot;&gt;&lt;b&gt;ILOM (Integrated Lights Out Manager)&lt;/b&gt;: HW 상태 및 장애 알람&lt;/li&gt;
&lt;li data-end=&quot;868&quot; data-start=&quot;825&quot;&gt;&lt;b&gt;OS Watcher&lt;/b&gt;: CPU/Memory/Network I/O 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;933&quot; data-start=&quot;870&quot; data-ke-size=&quot;size16&quot;&gt;  모니터링을 &lt;b&gt;계층별로 나눠서 보는 게 핵심&lt;/b&gt;입니다. (DB &amp;rarr; Storage &amp;rarr; Network &amp;rarr; HW)&lt;/p&gt;
&lt;hr data-end=&quot;938&quot; data-start=&quot;935&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;996&quot; data-start=&quot;940&quot; data-ke-size=&quot;size26&quot;&gt;  14장: Monitoring Exadata System Software Components&lt;/h2&gt;
&lt;h3 data-end=&quot;1009&quot; data-start=&quot;998&quot; data-ke-size=&quot;size23&quot;&gt;1. 구성요소&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;구성 요소역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1246&quot; data-start=&quot;1010&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1246&quot; data-start=&quot;1049&quot;&gt;
&lt;tr data-end=&quot;1102&quot; data-start=&quot;1049&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1077&quot; data-start=&quot;1049&quot;&gt;&lt;b&gt;Cell Server (CELLSRV)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1102&quot; data-start=&quot;1077&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan, I/O 요청 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1152&quot; data-start=&quot;1103&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1132&quot; data-start=&quot;1103&quot;&gt;&lt;b&gt;Management Server (MS)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1152&quot; data-start=&quot;1132&quot; data-col-size=&quot;sm&quot;&gt;모니터링&amp;middot;알림&amp;middot;상태 정보 수집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1197&quot; data-start=&quot;1153&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1179&quot; data-start=&quot;1153&quot;&gt;&lt;b&gt;RS&lt;/b&gt; (Restart Server)&lt;/td&gt;
&lt;td data-end=&quot;1197&quot; data-start=&quot;1179&quot; data-col-size=&quot;sm&quot;&gt;프로세스 감시&amp;middot;자동 재시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1246&quot; data-start=&quot;1198&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1216&quot; data-start=&quot;1198&quot;&gt;&lt;b&gt;ibsw&lt;/b&gt; / RoCE&lt;/td&gt;
&lt;td data-end=&quot;1246&quot; data-start=&quot;1216&quot; data-col-size=&quot;sm&quot;&gt;InfiniBand 또는 RoCE 네트워크 계층&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1266&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size23&quot;&gt;2. 주요 모니터링 명령어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1493&quot; data-start=&quot;1267&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1312&quot; data-start=&quot;1267&quot;&gt;cellcli -e &quot;LIST ALERTHISTORY&quot; : 알람 이력 확인&lt;/li&gt;
&lt;li data-end=&quot;1358&quot; data-start=&quot;1313&quot;&gt;cellcli -e &quot;LIST METRICCURRENT&quot; : 실시간 메트릭&lt;/li&gt;
&lt;li data-end=&quot;1405&quot; data-start=&quot;1359&quot;&gt;cellcli -e &quot;LIST METRICHISTORY&quot; : 히스토리 메트릭&lt;/li&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1406&quot;&gt;cellcli -e &quot;LIST THRESHOLD&quot; : 임계치 설정 조회&lt;/li&gt;
&lt;li data-end=&quot;1493&quot; data-start=&quot;1450&quot;&gt;cellcli -e &quot;ALTER THRESHOLD&quot; : 경보 조건 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1550&quot; data-start=&quot;1495&quot; data-ke-size=&quot;size16&quot;&gt;  Storage Cell 단의 &lt;b&gt;메트릭 기반 알람 시스템&lt;/b&gt;을 정확히 이해하는 게 중요합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1567&quot; data-start=&quot;1552&quot; data-ke-size=&quot;size23&quot;&gt;3. 모니터링 포인트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1656&quot; data-start=&quot;1568&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1568&quot;&gt;CELLSRV 상태 및 재시작 이력&lt;/li&gt;
&lt;li data-end=&quot;1608&quot; data-start=&quot;1590&quot;&gt;플래시 캐시 Hit Ratio&lt;/li&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1609&quot;&gt;디스크 리빌드 상태&lt;/li&gt;
&lt;li data-end=&quot;1634&quot; data-start=&quot;1622&quot;&gt;네트워크 연결 이상&lt;/li&gt;
&lt;li data-end=&quot;1656&quot; data-start=&quot;1635&quot;&gt;SMART 알람(디스크 HW 이슈)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1713&quot; data-start=&quot;1658&quot; data-ke-size=&quot;size16&quot;&gt;  Exadata의 고가용성은 &lt;b&gt;RS + MS + Threshold 알람&lt;/b&gt;에 크게 의존합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1718&quot; data-start=&quot;1715&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1799&quot; data-start=&quot;1720&quot; data-ke-size=&quot;size26&quot;&gt;  15장: Configuring &lt;span&gt;Oracle Enterprise Manager Cloud Control&lt;/span&gt; to Monitor Exadata&lt;/h2&gt;
&lt;h3 data-end=&quot;1837&quot; data-start=&quot;1801&quot; data-ke-size=&quot;size23&quot;&gt;1. OEM(Cloud Control) 통합 모니터링 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1942&quot; data-start=&quot;1838&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1873&quot; data-start=&quot;1838&quot;&gt;DB + Storage + Network + HW를 한 눈에&lt;/li&gt;
&lt;li data-end=&quot;1911&quot; data-start=&quot;1874&quot;&gt;알람 통합 관리 (Threshold &amp;amp; Notification)&lt;/li&gt;
&lt;li data-end=&quot;1942&quot; data-start=&quot;1912&quot;&gt;Capacity Planning 및 성능 분석 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1956&quot; data-start=&quot;1944&quot; data-ke-size=&quot;size23&quot;&gt;2. 구성 요소&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;구성 요소역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2139&quot; data-start=&quot;1957&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2139&quot; data-start=&quot;1996&quot;&gt;
&lt;tr data-end=&quot;2021&quot; data-start=&quot;1996&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2009&quot; data-start=&quot;1996&quot;&gt;OEM Server&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2021&quot; data-start=&quot;2009&quot;&gt;중앙 관리 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2056&quot; data-start=&quot;2022&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2034&quot; data-start=&quot;2022&quot;&gt;OMS Agent&lt;/td&gt;
&lt;td data-end=&quot;2056&quot; data-start=&quot;2034&quot; data-col-size=&quot;sm&quot;&gt;각 노드/스토리지에서 데이터 수집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2105&quot; data-start=&quot;2057&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2079&quot; data-start=&quot;2057&quot;&gt;Plug-in for Exadata&lt;/td&gt;
&lt;td data-end=&quot;2105&quot; data-start=&quot;2079&quot; data-col-size=&quot;sm&quot;&gt;Exadata 전용 메트릭 및 상태 수집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2139&quot; data-start=&quot;2106&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2127&quot; data-start=&quot;2106&quot;&gt;Notification Rules&lt;/td&gt;
&lt;td data-end=&quot;2139&quot; data-start=&quot;2127&quot; data-col-size=&quot;sm&quot;&gt;경보 알림 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2153&quot; data-start=&quot;2141&quot; data-ke-size=&quot;size23&quot;&gt;3. 설정 절차&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2325&quot; data-start=&quot;2154&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2197&quot; data-start=&quot;2154&quot;&gt;OMS Agent를 모든 DB Node 및 Storage Cell에 배포&lt;/li&gt;
&lt;li data-end=&quot;2224&quot; data-start=&quot;2198&quot;&gt;Exadata Plug-in 설치 및 등록&lt;/li&gt;
&lt;li data-end=&quot;2262&quot; data-start=&quot;2225&quot;&gt;DB, Storage, Network 컴포넌트를 OEM에 등록&lt;/li&gt;
&lt;li data-end=&quot;2293&quot; data-start=&quot;2263&quot;&gt;경보 정책(Notification Rule) 설정&lt;/li&gt;
&lt;li data-end=&quot;2325&quot; data-start=&quot;2294&quot;&gt;대시보드 / Capacity Planning 활성화&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2377&quot; data-start=&quot;2327&quot; data-ke-size=&quot;size16&quot;&gt;  실무에서는 OEM을 통해 &lt;b&gt;알람 자동화 + 통합 모니터링&lt;/b&gt;하는 환경이 표준입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2400&quot; data-start=&quot;2379&quot; data-ke-size=&quot;size23&quot;&gt;4. OEM에서 주로 보는 지표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2500&quot; data-start=&quot;2401&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2417&quot; data-start=&quot;2401&quot;&gt;DB 성능 (AWR 기반)&lt;/li&gt;
&lt;li data-end=&quot;2458&quot; data-start=&quot;2418&quot;&gt;Storage Server 메트릭 (IOPS, Flash Cache)&lt;/li&gt;
&lt;li data-end=&quot;2474&quot; data-start=&quot;2459&quot;&gt;Infiniband 상태&lt;/li&gt;
&lt;li data-end=&quot;2491&quot; data-start=&quot;2475&quot;&gt;HW 센서(온도/팬/전원)&lt;/li&gt;
&lt;li data-end=&quot;2500&quot; data-start=&quot;2492&quot;&gt;알람 이벤트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2505&quot; data-start=&quot;2502&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2552&quot; data-start=&quot;2507&quot; data-ke-size=&quot;size26&quot;&gt;  16장: Monitoring Exadata Storage Servers&lt;/h2&gt;
&lt;h3 data-end=&quot;2583&quot; data-start=&quot;2554&quot; data-ke-size=&quot;size23&quot;&gt;1. Storage Server 주요 컴포넌트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2657&quot; data-start=&quot;2584&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2602&quot; data-start=&quot;2584&quot;&gt;CELLSRV (I/O 처리)&lt;/li&gt;
&lt;li data-end=&quot;2619&quot; data-start=&quot;2603&quot;&gt;MS (상태 관리/메트릭)&lt;/li&gt;
&lt;li data-end=&quot;2634&quot; data-start=&quot;2620&quot;&gt;RS (Restart)&lt;/li&gt;
&lt;li data-end=&quot;2657&quot; data-start=&quot;2635&quot;&gt;디스크 / 플래시 / IB 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2662&quot; data-start=&quot;2659&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2680&quot; data-start=&quot;2664&quot; data-ke-size=&quot;size23&quot;&gt;2. 주요 모니터링 툴&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;도구특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2851&quot; data-start=&quot;2681&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2851&quot; data-start=&quot;2709&quot;&gt;
&lt;tr data-end=&quot;2747&quot; data-start=&quot;2709&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2723&quot; data-start=&quot;2709&quot;&gt;&lt;b&gt;CellCLI&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2747&quot; data-start=&quot;2723&quot; data-col-size=&quot;sm&quot;&gt;Storage Cell 관리 기본 툴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2777&quot; data-start=&quot;2748&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2759&quot; data-start=&quot;2748&quot;&gt;&lt;b&gt;dcli&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2777&quot; data-start=&quot;2759&quot; data-col-size=&quot;sm&quot;&gt;다중 노드 명령 병렬 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2814&quot; data-start=&quot;2778&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2791&quot; data-start=&quot;2778&quot;&gt;&lt;b&gt;ExaCLI&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2814&quot; data-start=&quot;2791&quot;&gt;OEM Agent 없이 로컬 CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2851&quot; data-start=&quot;2815&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2838&quot; data-start=&quot;2815&quot;&gt;&lt;b&gt;Metric/Threshold&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2851&quot; data-start=&quot;2838&quot;&gt;자동 경보 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;# 알람 조회&lt;/span&gt;&lt;/span&gt;&lt;span&gt; cellcli -e &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;LIST ALERTHISTORY&quot;&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;span&gt; cellcli -e &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;LIST METRICCURRENT&quot;&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;span&gt; cellcli -e &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;LIST THRESHOLD&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2983&quot; data-start=&quot;2980&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3015&quot; data-start=&quot;2985&quot; data-ke-size=&quot;size23&quot;&gt;3. Storage Server에서 중요한 지표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3207&quot; data-start=&quot;3016&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3080&quot; data-start=&quot;3016&quot;&gt;&lt;b&gt;I/O 지표&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3080&quot; data-start=&quot;3031&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3054&quot; data-start=&quot;3031&quot;&gt;IOPS / MBPS / Latency&lt;/li&gt;
&lt;li data-end=&quot;3080&quot; data-start=&quot;3057&quot;&gt;Flash Cache Hit Ratio&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3135&quot; data-start=&quot;3081&quot;&gt;&lt;b&gt;디스크 상태&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3135&quot; data-start=&quot;3096&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3135&quot; data-start=&quot;3096&quot;&gt;Predictive Failures, Rebuild Progress&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3167&quot; data-start=&quot;3136&quot;&gt;&lt;b&gt;네트워크 상태&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3167&quot; data-start=&quot;3152&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3167&quot; data-start=&quot;3152&quot;&gt;IB/RoCE 장애 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3207&quot; data-start=&quot;3168&quot;&gt;&lt;b&gt;알람 이력&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3207&quot; data-start=&quot;3182&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3207&quot; data-start=&quot;3182&quot;&gt;Threshold, 디스크 SMART 경보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3266&quot; data-start=&quot;3209&quot; data-ke-size=&quot;size16&quot;&gt;  특히 &amp;ldquo;Flash Cache Hit Ratio&amp;rdquo;는 Exadata 성능을 좌우하는 대표 지표입니다.&lt;/p&gt;
&lt;hr data-end=&quot;3271&quot; data-start=&quot;3268&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3290&quot; data-start=&quot;3273&quot; data-ke-size=&quot;size23&quot;&gt;4. 알람 및 장애 대응&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3428&quot; data-start=&quot;3291&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3324&quot; data-start=&quot;3291&quot;&gt;임계치(Threshold)는 Cell 수준에서 설정 가능&lt;/li&gt;
&lt;li data-end=&quot;3355&quot; data-start=&quot;3325&quot;&gt;알람 발생 시 OEM / CLI에서 바로 확인 가능&lt;/li&gt;
&lt;li data-end=&quot;3390&quot; data-start=&quot;3356&quot;&gt;RS 프로세스가 CELLSRV 자동 재시작 &amp;rarr; 가용성 유지&lt;/li&gt;
&lt;li data-end=&quot;3428&quot; data-start=&quot;3391&quot;&gt;디스크 실패 시 &lt;b&gt;ASM redundancy&lt;/b&gt;로 서비스 지속&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3433&quot; data-start=&quot;3430&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3453&quot; data-start=&quot;3435&quot; data-ke-size=&quot;size26&quot;&gt;  최종 핵심 포인트 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;장주제핵심 키워드
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3750&quot; data-start=&quot;3455&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3750&quot; data-start=&quot;3502&quot;&gt;
&lt;tr data-end=&quot;3562&quot; data-start=&quot;3502&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3508&quot; data-start=&quot;3502&quot;&gt;13장&lt;/td&gt;
&lt;td data-end=&quot;3519&quot; data-start=&quot;3508&quot; data-col-size=&quot;sm&quot;&gt;플랫폼 모니터링&lt;/td&gt;
&lt;td data-end=&quot;3562&quot; data-start=&quot;3519&quot; data-col-size=&quot;md&quot;&gt;End-to-End 모니터링, ILOM, dcli, OS Watcher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3619&quot; data-start=&quot;3563&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3569&quot; data-start=&quot;3563&quot;&gt;14장&lt;/td&gt;
&lt;td data-end=&quot;3579&quot; data-start=&quot;3569&quot; data-col-size=&quot;sm&quot;&gt;SW 컴포넌트&lt;/td&gt;
&lt;td data-end=&quot;3619&quot; data-start=&quot;3579&quot; data-col-size=&quot;md&quot;&gt;CELLSRV / MS / RS / Threshold Alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3674&quot; data-start=&quot;3620&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3626&quot; data-start=&quot;3620&quot;&gt;15장&lt;/td&gt;
&lt;td data-end=&quot;3635&quot; data-start=&quot;3626&quot; data-col-size=&quot;sm&quot;&gt;OEM 연동&lt;/td&gt;
&lt;td data-end=&quot;3674&quot; data-start=&quot;3635&quot; data-col-size=&quot;md&quot;&gt;Plug-in, 알람 자동화, Capacity Dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3750&quot; data-start=&quot;3675&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3681&quot; data-start=&quot;3675&quot;&gt;16장&lt;/td&gt;
&lt;td data-end=&quot;3693&quot; data-start=&quot;3681&quot; data-col-size=&quot;sm&quot;&gt;스토리지 모니터링&lt;/td&gt;
&lt;td data-end=&quot;3750&quot; data-start=&quot;3693&quot; data-col-size=&quot;md&quot;&gt;CellCLI, dcli, Flash Cache Hit Ratio, IOPS, Threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3755&quot; data-start=&quot;3752&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;3770&quot; data-start=&quot;3757&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;실무 TIP&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3933&quot; data-start=&quot;3771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3819&quot; data-start=&quot;3771&quot;&gt;운영팀은 대부분 ① CLI + ② OEM + ③ 알람 메일 조합으로 운영합니다.&lt;/li&gt;
&lt;li data-end=&quot;3875&quot; data-start=&quot;3820&quot;&gt;특히 &lt;b&gt;Storage Cell의 Alert/Metric&lt;/b&gt;은 장애 사전 방지의 핵심입니다.&lt;/li&gt;
&lt;li data-end=&quot;3933&quot; data-start=&quot;3876&quot;&gt;Exadata 성능 이슈 대부분은 DB가 아니라 &lt;b&gt;Storage Layer&lt;/b&gt;에서 시작됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11장 &lt;b&gt;Migrating&amp;nbsp;&lt;/b&gt;Databases to Exadata&amp;nbsp;Database&amp;nbsp;Machine&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&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;490&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DDK61/dJMb9P0HsWl/ekUB7tpx3j0izHXmIZACgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DDK61/dJMb9P0HsWl/ekUB7tpx3j0izHXmIZACgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DDK61/dJMb9P0HsWl/ekUB7tpx3j0izHXmIZACgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDDK61%2FdJMb9P0HsWl%2FekUB7tpx3j0izHXmIZACgK%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;490&quot; height=&quot;275&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q57iW/dJMb9N9EvZw/kQ6PIdMkcsuWo2r0H22uj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q57iW/dJMb9N9EvZw/kQ6PIdMkcsuWo2r0H22uj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q57iW/dJMb9N9EvZw/kQ6PIdMkcsuWo2r0H22uj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ57iW%2FdJMb9N9EvZw%2FkQ6PIdMkcsuWo2r0H22uj1%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;903&quot; height=&quot;505&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;189&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;Oracle Exadata&lt;/span&gt;&lt;/b&gt; 도입 시 가장 헷갈리기 쉬운 부분 중 하나가 바로   &lt;b&gt;&amp;ldquo;기존 스토리지 용량/성능&amp;rdquo;과 &amp;ldquo;Exadata 스토리지 용량/성능&amp;rdquo;의 차이&lt;/b&gt;를 제대로 이해하고 &lt;b&gt;용량 계획(capacity planning)&lt;/b&gt; 을 세우는 것입니다.&lt;/p&gt;
&lt;p data-end=&quot;226&quot; data-start=&quot;191&quot; data-ke-size=&quot;size16&quot;&gt;아래는 이 내용을 &lt;b&gt;쉽고 실무적으로 정리한 가이드&lt;/b&gt;입니다 &lt;/p&gt;
&lt;hr data-end=&quot;231&quot; data-start=&quot;228&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;275&quot; data-start=&quot;233&quot; data-ke-size=&quot;size26&quot;&gt;  1. 왜 용량 계획(capacity planning)이 중요한가?&lt;/h2&gt;
&lt;p data-end=&quot;451&quot; data-start=&quot;277&quot; data-ke-size=&quot;size16&quot;&gt;Exadata는 단순히 디스크 용량만 보고 설계하는 장비가 아닙니다.&lt;br /&gt;✅ I/O 성능(IOPS, MBPS)&lt;br /&gt;✅ Smart Flash Cache / PMEM 등 가속 기능&lt;br /&gt;✅ 장애 상황 시 리던던시(ASM redundancy) 용량까지&lt;br /&gt;&amp;rarr; 모두 고려해야만 안정적인 성능과 가용성을 보장할 수 있어요.&lt;/p&gt;
&lt;blockquote data-end=&quot;514&quot; data-start=&quot;453&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;514&quot; data-start=&quot;455&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;단순 디스크 크기만 보고 마이그레이션하면 성능이 안 나올 수 있다&amp;rdquo;&lt;/b&gt; 는 게 핵심 경고입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;519&quot; data-start=&quot;516&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;552&quot; data-start=&quot;521&quot; data-ke-size=&quot;size26&quot;&gt;  2. 현재 시스템 I/O 특성 파악이 첫 단계&lt;/h2&gt;
&lt;h3 data-end=&quot;570&quot; data-start=&quot;554&quot; data-ke-size=&quot;size23&quot;&gt;수집해야 할 핵심 지표&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;지표설명수집 방법
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;909&quot; data-start=&quot;571&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;909&quot; data-start=&quot;619&quot;&gt;
&lt;tr data-end=&quot;707&quot; data-start=&quot;619&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;648&quot; data-start=&quot;619&quot;&gt;&lt;b&gt;IOPS&lt;/b&gt; (I/Os per second)&lt;/td&gt;
&lt;td data-end=&quot;662&quot; data-start=&quot;648&quot; data-col-size=&quot;sm&quot;&gt;초당 읽기/쓰기 횟수&lt;/td&gt;
&lt;td data-end=&quot;707&quot; data-start=&quot;662&quot; data-col-size=&quot;sm&quot;&gt;AWR에서 physical reads, physical writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;786&quot; data-start=&quot;708&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;735&quot; data-start=&quot;708&quot;&gt;&lt;b&gt;MBPS&lt;/b&gt; (MB per second)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;751&quot; data-start=&quot;735&quot;&gt;초당 처리되는 데이터 양&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;786&quot; data-start=&quot;751&quot;&gt;AWR에서 physical I/O disk bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;835&quot; data-start=&quot;787&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;800&quot; data-start=&quot;787&quot;&gt;&lt;b&gt;데이터 총량&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;815&quot; data-start=&quot;800&quot;&gt;디스크 실제 사용 용량&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;835&quot; data-start=&quot;815&quot;&gt;OS, DB 또는 스토리지 툴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;909&quot; data-start=&quot;836&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;857&quot; data-start=&quot;836&quot;&gt;&lt;b&gt;Peak 시점 I/O 부하&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;875&quot; data-start=&quot;857&quot;&gt;평균이 아닌 피크 구간 기준&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;909&quot; data-start=&quot;875&quot;&gt;AWR Top Activity / peak 시간대 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;927&quot; data-start=&quot;911&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;AWR 예시 쿼리&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (physical_read_bytes &lt;/span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt; physical_write_bytes) &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;span&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; MBPS, (physical_reads &lt;/span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt; physical_writes) &lt;/span&gt;&lt;span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; IOPS &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$sysstat &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;'physical reads'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'physical writes'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'physical write total bytes'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'physical read total bytes'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1244&quot; data-start=&quot;1187&quot; data-ke-size=&quot;size16&quot;&gt;또는 AWR Report &amp;rarr; &amp;ldquo;Instance Activity Stats&amp;rdquo; 섹션에서도 직접 확인 가능.&lt;/p&gt;
&lt;hr data-end=&quot;1249&quot; data-start=&quot;1246&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1278&quot; data-start=&quot;1251&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 3. Exadata 스토리지의 특성 이해&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목기존 스토리지Exadata
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1620&quot; data-start=&quot;1280&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1620&quot; data-start=&quot;1349&quot;&gt;
&lt;tr data-end=&quot;1396&quot; data-start=&quot;1349&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1354&quot; data-start=&quot;1349&quot;&gt;구조&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1367&quot; data-start=&quot;1354&quot;&gt;일반 SAN/NAS&lt;/td&gt;
&lt;td data-end=&quot;1396&quot; data-start=&quot;1367&quot; data-col-size=&quot;sm&quot;&gt;Smart Flash + Disk + PMEM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1456&quot; data-start=&quot;1397&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1409&quot; data-start=&quot;1397&quot;&gt;IOPS/MBPS&lt;/td&gt;
&lt;td data-end=&quot;1422&quot; data-start=&quot;1409&quot; data-col-size=&quot;sm&quot;&gt;디스크 성능에 종속&lt;/td&gt;
&lt;td data-end=&quot;1456&quot; data-start=&quot;1422&quot; data-col-size=&quot;sm&quot;&gt;Flash Cache, PMEM, RoCE로 대폭 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1506&quot; data-start=&quot;1457&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1466&quot; data-start=&quot;1457&quot;&gt;데이터 압축&lt;/td&gt;
&lt;td data-end=&quot;1472&quot; data-start=&quot;1466&quot; data-col-size=&quot;sm&quot;&gt;제한적&lt;/td&gt;
&lt;td data-end=&quot;1506&quot; data-start=&quot;1472&quot; data-col-size=&quot;sm&quot;&gt;Hybrid Columnar Compression 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1559&quot; data-start=&quot;1507&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1515&quot; data-start=&quot;1507&quot;&gt;장애 허용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1525&quot; data-start=&quot;1515&quot;&gt;보통 RAID&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1559&quot; data-start=&quot;1525&quot;&gt;ASM Redundancy + Cell Failover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1620&quot; data-start=&quot;1560&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1567&quot; data-start=&quot;1560&quot;&gt;네트워크&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1576&quot; data-start=&quot;1567&quot;&gt;TCP/IP&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1620&quot; data-start=&quot;1576&quot;&gt;RoCE (RDMA over Converged Ethernet) 초저지연&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1622&quot; data-ke-size=&quot;size16&quot;&gt;  Exadata는 &lt;b&gt;같은 물리 디스크 용량이라도&lt;/b&gt; 실제로는 더 &lt;b&gt;높은 처리량(Throughput)&lt;/b&gt; 을 낼 수 있습니다.&lt;br /&gt;예: 기존 SAN 20TB = Exadata 20TB보다 I/O 성능이 훨씬 낮을 가능성 큼.&lt;/p&gt;
&lt;hr data-end=&quot;1755&quot; data-start=&quot;1752&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1787&quot; data-start=&quot;1757&quot; data-ke-size=&quot;size26&quot;&gt;  4. Exadata 용량 산정 단계별 가이드&lt;/h2&gt;
&lt;h3 data-end=&quot;1813&quot; data-start=&quot;1789&quot; data-ke-size=&quot;size23&quot;&gt;Step 1.   현재 시스템 파악&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1851&quot; data-start=&quot;1814&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1851&quot; data-start=&quot;1814&quot;&gt;AWR에서 Peak IOPS, MBPS, 총 데이터 사이즈 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1884&quot; data-start=&quot;1853&quot; data-ke-size=&quot;size23&quot;&gt;Step 2.   Exadata 모델 스펙 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2003&quot; data-start=&quot;1885&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1946&quot; data-start=&quot;1885&quot;&gt;공식 스펙: &lt;a href=&quot;https://www.oracle.com/exadata&quot; data-end=&quot;1946&quot; data-start=&quot;1894&quot;&gt;oracle.com/exadata&lt;span aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;2003&quot; data-start=&quot;1947&quot;&gt;노드 수, Flash 용량, 디스크 용량, I/O 처리 성능(I/O bandwidth, IOPS)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2031&quot; data-start=&quot;2005&quot; data-ke-size=&quot;size23&quot;&gt;Step 3. ✨ 성능 최적화 요소 반영&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2146&quot; data-start=&quot;2032&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2063&quot; data-start=&quot;2032&quot;&gt;Smart Flash Cache &amp;rarr; 디스크 부하 감소&lt;/li&gt;
&lt;li data-end=&quot;2116&quot; data-start=&quot;2064&quot;&gt;Hybrid Columnar Compression &amp;rarr; 용량 절감 (최대 10배 이상 가능)&lt;/li&gt;
&lt;li data-end=&quot;2146&quot; data-start=&quot;2117&quot;&gt;PMEM / RoCE &amp;rarr; 읽기 지연시간 대폭 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2202&quot; data-start=&quot;2148&quot; data-ke-size=&quot;size16&quot;&gt;  예: 현재 100TB 데이터를 압축해 Exadata에서는 30~40TB만 필요할 수도 있음.&lt;/p&gt;
&lt;h3 data-end=&quot;2240&quot; data-start=&quot;2204&quot; data-ke-size=&quot;size23&quot;&gt;Step 4.   장애 상황 고려 (Redundancy)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2315&quot; data-start=&quot;2241&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2315&quot; data-start=&quot;2241&quot;&gt;ASM &lt;b&gt;NORMAL&lt;/b&gt; 또는 &lt;b&gt;HIGH&lt;/b&gt; Redundancy 적용 시&lt;br /&gt;&amp;rarr; 실사용 가능한 스토리지가 &lt;b&gt;줄어듭니다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;ASM 모드사용 가능 용량 비율설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2444&quot; data-start=&quot;2317&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2444&quot; data-start=&quot;2393&quot;&gt;
&lt;tr data-end=&quot;2419&quot; data-start=&quot;2393&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2402&quot; data-start=&quot;2393&quot;&gt;NORMAL&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2410&quot; data-start=&quot;2402&quot;&gt;약 50%&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2419&quot; data-start=&quot;2410&quot;&gt;2중 미러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2444&quot; data-start=&quot;2420&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2427&quot; data-start=&quot;2420&quot;&gt;HIGH&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2435&quot; data-start=&quot;2427&quot;&gt;약 33%&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2444&quot; data-start=&quot;2435&quot;&gt;3중 미러&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2500&quot; data-start=&quot;2446&quot; data-ke-size=&quot;size16&quot;&gt;  예: 100TB RAW 용량 &amp;rarr; NORMAL redundancy 사용 시 실사용 약 50TB&lt;/p&gt;
&lt;h3 data-end=&quot;2534&quot; data-start=&quot;2502&quot; data-ke-size=&quot;size23&quot;&gt;Step 5. ⚠️ 장애 후 I/O 성능 여유 확보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2619&quot; data-start=&quot;2535&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2580&quot; data-start=&quot;2535&quot;&gt;Cell 1~2대 장애 상황에서도 &lt;b&gt;요구 IOPS/MBPS를 충족&lt;/b&gt;해야 함&lt;/li&gt;
&lt;li data-end=&quot;2619&quot; data-start=&quot;2581&quot;&gt;Peak 기준 I/O에 여유 버퍼(보통 20~30%)를 더해 산정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2624&quot; data-start=&quot;2621&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2672&quot; data-start=&quot;2626&quot; data-ke-size=&quot;size26&quot;&gt;  5. Smart Flash Cache / Compression 고려 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목기존Exadata 적용 후 (예시)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2956&quot; data-start=&quot;2674&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2956&quot; data-start=&quot;2750&quot;&gt;
&lt;tr data-end=&quot;2776&quot; data-start=&quot;2750&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2759&quot; data-start=&quot;2750&quot;&gt;원본 데이터&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2767&quot; data-start=&quot;2759&quot;&gt;100TB&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2776&quot; data-start=&quot;2767&quot;&gt;100TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2813&quot; data-start=&quot;2777&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2801&quot; data-start=&quot;2777&quot;&gt;Hybrid Compression 적용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2805&quot; data-start=&quot;2801&quot;&gt;-&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2813&quot; data-start=&quot;2805&quot;&gt;40TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2861&quot; data-start=&quot;2814&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2838&quot; data-start=&quot;2814&quot;&gt;Smart Flash Cache Hit&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2842&quot; data-start=&quot;2838&quot;&gt;-&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2861&quot; data-start=&quot;2842&quot;&gt;70~80% 디스크 오프로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2908&quot; data-start=&quot;2862&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2874&quot; data-start=&quot;2862&quot;&gt;필요 디스크 용량&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2882&quot; data-start=&quot;2874&quot;&gt;100TB&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2908&quot; data-start=&quot;2882&quot;&gt;약 50TB (Redundancy 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2956&quot; data-start=&quot;2909&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2921&quot; data-start=&quot;2909&quot;&gt;Peak MBPS&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2929&quot; data-start=&quot;2921&quot;&gt;4GB/s&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2956&quot; data-start=&quot;2929&quot;&gt;Flash+RoCE로 더 적은 디스크 부하&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3010&quot; data-start=&quot;2958&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;같은 데이터를 훨씬 작은 물리 용량과 더 적은 디스크 I/O로 처리 가능&lt;/b&gt;하게 됨.&lt;/p&gt;
&lt;hr data-end=&quot;3015&quot; data-start=&quot;3012&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3034&quot; data-start=&quot;3017&quot; data-ke-size=&quot;size26&quot;&gt;  6. 핵심 체크리스트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3255&quot; data-start=&quot;3036&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3080&quot; data-start=&quot;3036&quot;&gt;AWR에서 현재 &lt;b&gt;Peak IOPS / MBPS&lt;/b&gt; 확보했는가?&lt;/li&gt;
&lt;li data-end=&quot;3119&quot; data-start=&quot;3081&quot;&gt;실제 &lt;b&gt;데이터 용량&lt;/b&gt;과 &lt;b&gt;성장률&lt;/b&gt;을 반영했는가?&lt;/li&gt;
&lt;li data-end=&quot;3174&quot; data-start=&quot;3120&quot;&gt;Exadata의 Flash / PMEM / Compression 효과를 반영했는가?&lt;/li&gt;
&lt;li data-end=&quot;3213&quot; data-start=&quot;3175&quot;&gt;Redundancy 적용 후 실사용 용량을 계산했는가?&lt;/li&gt;
&lt;li data-end=&quot;3255&quot; data-start=&quot;3214&quot;&gt;장애 상황에서도 SLA를 충족할 수 있는 I/O 여유를 뒀는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3260&quot; data-start=&quot;3257&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3272&quot; data-start=&quot;3262&quot; data-ke-size=&quot;size26&quot;&gt;✅ 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;포인트설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3569&quot; data-start=&quot;3274&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3569&quot; data-start=&quot;3305&quot;&gt;
&lt;tr data-end=&quot;3349&quot; data-start=&quot;3305&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3320&quot; data-start=&quot;3305&quot;&gt;  &lt;b&gt;현황 파악&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;3349&quot; data-start=&quot;3320&quot; data-col-size=&quot;sm&quot;&gt;AWR로 IOPS&amp;middot;MBPS&amp;middot;용량을 정확히 수집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3402&quot; data-start=&quot;3350&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3374&quot; data-start=&quot;3350&quot;&gt;  &lt;b&gt;Exadata sizing&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;3402&quot; data-start=&quot;3374&quot; data-col-size=&quot;sm&quot;&gt;성능 + 용량 + 장애 대비까지 고려해야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3465&quot; data-start=&quot;3403&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3421&quot; data-start=&quot;3403&quot;&gt;✨ &lt;b&gt;최적화 기능 반영&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;3465&quot; data-start=&quot;3421&quot; data-col-size=&quot;sm&quot;&gt;Flash Cache, PMEM, HCC 압축으로 실제 요구 용량 줄이기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3523&quot; data-start=&quot;3466&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3489&quot; data-start=&quot;3466&quot;&gt;⚠️ &lt;b&gt;Redundancy 감안&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;3523&quot; data-start=&quot;3489&quot; data-col-size=&quot;sm&quot;&gt;NORMAL/HIGH 모드에 따라 실사용 용량이 줄어듦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3569&quot; data-start=&quot;3524&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3539&quot; data-start=&quot;3524&quot;&gt;  &lt;b&gt;여유 확보&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;3569&quot; data-start=&quot;3539&quot; data-col-size=&quot;sm&quot;&gt;장애 후에도 SLA 충족할 여유 성능 확보 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3574&quot; data-start=&quot;3571&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;  정리하자면, Exadata는 &lt;b&gt;단순 디스크 용량 비교가 아니라&lt;/b&gt;,&lt;br /&gt;✅ &lt;b&gt;IOPS&amp;middot;MBPS&amp;middot;압축 효과&amp;middot;Flash 활용도&amp;middot;장애 허용력&lt;/b&gt;까지 함께 계산해야 올바른 용량 계획이 가능합니다.&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-style=&quot;style1&quot;&gt;TTS (Transportable Tablespace)&lt;br /&gt;한 데이터베이스의 테이블스페이스를 통째로 다른 데이터베이스로 이관하는 기능 &lt;/blockquote&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;269&quot; data-start=&quot;260&quot; data-ke-size=&quot;size23&quot;&gt;  개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;410&quot; data-start=&quot;270&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;302&quot; data-start=&quot;270&quot;&gt;테이블스페이스를 &lt;b&gt;익스포트(export)&lt;/b&gt; 해서&lt;/li&gt;
&lt;li data-end=&quot;359&quot; data-start=&quot;303&quot;&gt;다른 DB에서 &lt;b&gt;임포트(import)&lt;/b&gt; 하는 방식으로 &lt;b&gt;빠른 데이터 마이그레이션&lt;/b&gt;이 가능.&lt;/li&gt;
&lt;li data-end=&quot;410&quot; data-start=&quot;360&quot;&gt;&lt;b&gt;데이터 파일 그대로 복사&lt;/b&gt;하기 때문에 Data Pump만 쓰는 것보다 훨씬 빠름.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;425&quot; data-start=&quot;412&quot; data-ke-size=&quot;size23&quot;&gt;  TTS 특징&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;602&quot; data-start=&quot;426&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;602&quot; data-start=&quot;454&quot;&gt;
&lt;tr data-end=&quot;473&quot; data-start=&quot;454&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;459&quot; data-start=&quot;454&quot;&gt;대상&lt;/td&gt;
&lt;td data-end=&quot;473&quot; data-start=&quot;459&quot; data-col-size=&quot;sm&quot;&gt;테이블스페이스 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;506&quot; data-start=&quot;474&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;479&quot; data-start=&quot;474&quot;&gt;방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;506&quot; data-start=&quot;479&quot;&gt;메타데이터 Export + 데이터파일 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;529&quot; data-start=&quot;507&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;512&quot; data-start=&quot;507&quot;&gt;속도&lt;/td&gt;
&lt;td data-end=&quot;529&quot; data-start=&quot;512&quot; data-col-size=&quot;sm&quot;&gt;빠름 (파일 직접 이동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;559&quot; data-start=&quot;530&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;537&quot; data-start=&quot;530&quot;&gt;주 용도&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;559&quot; data-start=&quot;537&quot;&gt;마이그레이션 / 클론 / 아카이브&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;602&quot; data-start=&quot;560&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;565&quot; data-start=&quot;560&quot;&gt;조건&lt;/td&gt;
&lt;td data-end=&quot;602&quot; data-start=&quot;565&quot; data-col-size=&quot;sm&quot;&gt;플랫폼 엔디언(Endian) 확인 필요 (다르면 변환 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;653&quot; data-start=&quot;604&quot; data-ke-size=&quot;size16&quot;&gt;  예: 운영 DB의 특정 테이블스페이스만 다른 DW 서버로 옮길 때 자주 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Exadata&amp;nbsp;Migration&amp;nbsp;Considerations&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; 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;540&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccLkEf/dJMb9Lxef81/mLZQYZrR6FWgAizAFrmCok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccLkEf/dJMb9Lxef81/mLZQYZrR6FWgAizAFrmCok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccLkEf/dJMb9Lxef81/mLZQYZrR6FWgAizAFrmCok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccLkEf%2FdJMb9Lxef81%2FmLZQYZrR6FWgAizAFrmCok%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;540&quot; height=&quot;343&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;172&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle Exadata&lt;/span&gt; 로 마이그레이션할 때는 단순히 DB만 옮기면 되는 게 아니라, &lt;b&gt;Exadata 전용 성능 최적화 설정 및 호환성 조건&lt;/b&gt;을 충족해야 합니다. 아래에 핵심 요구사항과 추천 설정을 &lt;b&gt;이유와 함께 정리&lt;/b&gt;해드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;177&quot; data-start=&quot;174&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;204&quot; data-start=&quot;179&quot; data-ke-size=&quot;size26&quot;&gt;  1. 플랫폼 및 아키텍처 기본 사항&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;380&quot; data-start=&quot;206&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;380&quot; data-start=&quot;247&quot;&gt;
&lt;tr data-end=&quot;303&quot; data-start=&quot;247&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;253&quot; data-start=&quot;247&quot;&gt;플랫폼&lt;/td&gt;
&lt;td data-end=&quot;269&quot; data-start=&quot;253&quot; data-col-size=&quot;sm&quot;&gt;64비트 Intel 기반&lt;/td&gt;
&lt;td data-end=&quot;303&quot; data-start=&quot;269&quot; data-col-size=&quot;md&quot;&gt;32비트 OS나 DB는 Exadata에서 지원되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;380&quot; data-start=&quot;304&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;318&quot; data-start=&quot;304&quot;&gt;엔디언(Endian)&lt;/td&gt;
&lt;td data-end=&quot;334&quot; data-start=&quot;318&quot; data-col-size=&quot;sm&quot;&gt;Little Endian&lt;/td&gt;
&lt;td data-end=&quot;380&quot; data-start=&quot;334&quot; data-col-size=&quot;md&quot;&gt;기존 플랫폼이 Big Endian이면 마이그레이션 시 endian 변환 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;473&quot; data-start=&quot;382&quot; data-ke-size=&quot;size16&quot;&gt;  예: 기존이 SPARC(Solaris) Big Endian 환경이라면 RMAN CONVERT나 Data Pump 방식 등 endian 변환 작업이 필요합니다.&lt;/p&gt;
&lt;hr data-end=&quot;478&quot; data-start=&quot;475&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;503&quot; data-start=&quot;480&quot; data-ke-size=&quot;size26&quot;&gt;  2. 소프트웨어 호환성 요구사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;705&quot; data-start=&quot;505&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;621&quot; data-start=&quot;505&quot;&gt;&lt;b&gt;Exadata Storage Server&lt;/b&gt;, &lt;b&gt;ASM(Automatic Storage Management)&lt;/b&gt;, 그리고 &lt;b&gt;DB 소프트웨어 버전&lt;/b&gt;은 반드시 &lt;b&gt;서로 호환되는 버전&lt;/b&gt;이어야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;705&quot; data-start=&quot;622&quot;&gt;예: &lt;span&gt;Oracle Exadata X8M&lt;/span&gt; 의 경우 [Doc ID 2724126.1]에 권장 버전이 명시되어 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;802&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;팁:&lt;/b&gt; 마이그레이션 전 버전 정합성 점검이 필수입니다.&lt;br /&gt;특히 PDB/CDB 환경을 쓰는 경우 ASM/Storage Server 버전도 꼼꼼히 확인해야 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;807&quot; data-start=&quot;804&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;838&quot; data-start=&quot;809&quot; data-ke-size=&quot;size26&quot;&gt;⚙️ 3. ASM Disk Group 권장 설정&lt;/h2&gt;
&lt;p data-end=&quot;894&quot; data-start=&quot;840&quot; data-ke-size=&quot;size16&quot;&gt;Exadata에서 ASM Disk Group을 구성할 때는 다음과 같은 설정을 강력 권장합니다 &lt;/p&gt;
&lt;div&gt;
&lt;div&gt;속성권장 값설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1180&quot; data-start=&quot;896&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1180&quot; data-start=&quot;948&quot;&gt;
&lt;tr data-end=&quot;1002&quot; data-start=&quot;948&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;960&quot; data-start=&quot;948&quot;&gt;AU_SIZE&lt;/td&gt;
&lt;td data-end=&quot;967&quot; data-start=&quot;960&quot; data-col-size=&quot;sm&quot;&gt;4 MB&lt;/td&gt;
&lt;td data-end=&quot;1002&quot; data-start=&quot;967&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan 최적화 (4MB 단위로 효율적 읽기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1055&quot; data-start=&quot;1003&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1022&quot; data-start=&quot;1003&quot;&gt;COMPATIBLE.ASM&lt;/td&gt;
&lt;td data-end=&quot;1037&quot; data-start=&quot;1022&quot; data-col-size=&quot;sm&quot;&gt;DB 버전과 동일 이상&lt;/td&gt;
&lt;td data-end=&quot;1055&quot; data-start=&quot;1037&quot; data-col-size=&quot;sm&quot;&gt;Exadata 기능 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1121&quot; data-start=&quot;1056&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1077&quot; data-start=&quot;1056&quot;&gt;COMPATIBLE.RDBMS&lt;/td&gt;
&lt;td data-end=&quot;1092&quot; data-start=&quot;1077&quot; data-col-size=&quot;sm&quot;&gt;DB 버전과 동일 이상&lt;/td&gt;
&lt;td data-end=&quot;1121&quot; data-start=&quot;1092&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan 등 고급 기능 활성화 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1180&quot; data-start=&quot;1122&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1150&quot; data-start=&quot;1122&quot;&gt;cell.smart_scan_capable&lt;/td&gt;
&lt;td data-end=&quot;1157&quot; data-start=&quot;1150&quot; data-col-size=&quot;sm&quot;&gt;TRUE&lt;/td&gt;
&lt;td data-end=&quot;1180&quot; data-start=&quot;1157&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan 가능 여부 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1296&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size16&quot;&gt;  AU_SIZE를 4MB로 하면 Exadata의 Smart Scan이 &lt;b&gt;대용량 연속 스캔(&amp;gt;=4MB)&lt;/b&gt; 을 효율적으로 처리할 수 있어 &lt;b&gt;Flash Cache 및 I/O 성능&lt;/b&gt;이 극대화됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1301&quot; data-start=&quot;1298&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1331&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size26&quot;&gt;  4. DB 초기화 파라미터 설정 (필수)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;파라미터권장값설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1619&quot; data-start=&quot;1333&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1619&quot; data-start=&quot;1388&quot;&gt;
&lt;tr data-end=&quot;1444&quot; data-start=&quot;1388&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1403&quot; data-start=&quot;1388&quot;&gt;COMPATIBLE&lt;/td&gt;
&lt;td data-end=&quot;1417&quot; data-start=&quot;1403&quot; data-col-size=&quot;sm&quot;&gt;11.2.0.1 이상&lt;/td&gt;
&lt;td data-end=&quot;1444&quot; data-start=&quot;1417&quot; data-col-size=&quot;sm&quot;&gt;Exadata 기능 전체 사용을 위해 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1517&quot; data-start=&quot;1445&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1467&quot; data-start=&quot;1445&quot;&gt;DB_BLOCK_CHECKSUM&lt;/td&gt;
&lt;td data-end=&quot;1485&quot; data-start=&quot;1467&quot; data-col-size=&quot;sm&quot;&gt;TYPICAL 또는 FULL&lt;/td&gt;
&lt;td data-end=&quot;1517&quot; data-start=&quot;1485&quot; data-col-size=&quot;sm&quot;&gt;Exadata HARD(하드웨어 체크섬) 기능 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1565&quot; data-start=&quot;1518&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1536&quot; data-start=&quot;1518&quot;&gt;DB_BLOCK_SIZE&lt;/td&gt;
&lt;td data-end=&quot;1549&quot; data-start=&quot;1536&quot; data-col-size=&quot;sm&quot;&gt;8 KB (기본값)&lt;/td&gt;
&lt;td data-end=&quot;1565&quot; data-start=&quot;1549&quot; data-col-size=&quot;sm&quot;&gt;일반적으로 그대로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1619&quot; data-start=&quot;1566&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1590&quot; data-start=&quot;1566&quot;&gt;DB_CREATE_FILE_DEST&lt;/td&gt;
&lt;td data-end=&quot;1602&quot; data-start=&quot;1590&quot; data-col-size=&quot;sm&quot;&gt;ASM 경로 사용&lt;/td&gt;
&lt;td data-end=&quot;1619&quot; data-start=&quot;1602&quot; data-col-size=&quot;sm&quot;&gt;Exadata 환경 표준&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1693&quot; data-start=&quot;1621&quot; data-ke-size=&quot;size16&quot;&gt;  DB_BLOCK_CHECKSUM을 켜두면 블록 손상 여부를 하드웨어 차원에서 빠르게 탐지할 수 있어 안정성이 높아집니다.&lt;/p&gt;
&lt;hr data-end=&quot;1698&quot; data-start=&quot;1695&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1730&quot; data-start=&quot;1700&quot; data-ke-size=&quot;size26&quot;&gt;  5. Extent Size 및 I/O 최적화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1917&quot; data-start=&quot;1732&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1780&quot; data-start=&quot;1732&quot;&gt;Exadata는 &lt;b&gt;최소 4MB 이상의 연속적인 스캔&lt;/b&gt;에서 최고의 성능을 냅니다.&lt;/li&gt;
&lt;li data-end=&quot;1917&quot; data-start=&quot;1781&quot;&gt;따라서:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1917&quot; data-start=&quot;1790&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1813&quot; data-start=&quot;1790&quot;&gt;&lt;b&gt;ASM AU_SIZE = 4MB&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1869&quot; data-start=&quot;1816&quot;&gt;&lt;b&gt;DB Extent Size&lt;/b&gt;는 AU_SIZE의 배수(8MB, 16MB 등)로 설정 권장&lt;/li&gt;
&lt;li data-end=&quot;1917&quot; data-start=&quot;1872&quot;&gt;대용량 테이블스페이스는 Extent 크기를 키워 Smart Scan 효율 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1996&quot; data-start=&quot;1919&quot; data-ke-size=&quot;size16&quot;&gt;  예: DW 환경에서 8MB Extent로 설정하면 디스크 I/O 오버헤드를 줄이고 Smart Scan 처리량을 극대화할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2001&quot; data-start=&quot;1998&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2019&quot; data-start=&quot;2003&quot; data-ke-size=&quot;size26&quot;&gt;  6. 추가 고려사항&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2321&quot; data-start=&quot;2021&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2321&quot; data-start=&quot;2049&quot;&gt;
&lt;tr data-end=&quot;2102&quot; data-start=&quot;2049&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2058&quot; data-start=&quot;2049&quot;&gt;버전 호환성&lt;/td&gt;
&lt;td data-end=&quot;2102&quot; data-start=&quot;2058&quot; data-col-size=&quot;md&quot;&gt;ASM, Storage Server, DB 모두 권장 버전으로 업그레이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2160&quot; data-start=&quot;2103&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2112&quot; data-start=&quot;2103&quot;&gt;데이터 변환&lt;/td&gt;
&lt;td data-end=&quot;2160&quot; data-start=&quot;2112&quot; data-col-size=&quot;md&quot;&gt;Big Endian &amp;rarr; Little Endian 마이그레이션 시 사전 변환 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2222&quot; data-start=&quot;2161&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2166&quot; data-start=&quot;2161&quot;&gt;압축&lt;/td&gt;
&lt;td data-end=&quot;2222&quot; data-start=&quot;2166&quot; data-col-size=&quot;md&quot;&gt;Hybrid Columnar Compression 활성화 가능 (특히 DW 환경에서 효과 큼)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2272&quot; data-start=&quot;2223&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2236&quot; data-start=&quot;2223&quot;&gt;Redundancy&lt;/td&gt;
&lt;td data-end=&quot;2272&quot; data-start=&quot;2236&quot; data-col-size=&quot;md&quot;&gt;ASM NORMAL 또는 HIGH 모드 적용 (장애 대비)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2321&quot; data-start=&quot;2273&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2286&quot; data-start=&quot;2273&quot;&gt;Smart Scan&lt;/td&gt;
&lt;td data-end=&quot;2321&quot; data-start=&quot;2286&quot; data-col-size=&quot;md&quot;&gt;테이블/쿼리 구조가 연속 스캔에 유리해야 최대 성능 발휘&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2326&quot; data-start=&quot;2323&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2338&quot; data-start=&quot;2328&quot; data-ke-size=&quot;size26&quot;&gt;✅ 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목권장 설정 / 요구 사항이유
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2711&quot; data-start=&quot;2340&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2711&quot; data-start=&quot;2415&quot;&gt;
&lt;tr data-end=&quot;2454&quot; data-start=&quot;2415&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2421&quot; data-start=&quot;2415&quot;&gt;플랫폼&lt;/td&gt;
&lt;td data-end=&quot;2444&quot; data-start=&quot;2421&quot; data-col-size=&quot;sm&quot;&gt;64bit, Little Endian&lt;/td&gt;
&lt;td data-end=&quot;2454&quot; data-start=&quot;2444&quot; data-col-size=&quot;sm&quot;&gt;호환성 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2526&quot; data-start=&quot;2455&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2463&quot; data-start=&quot;2455&quot;&gt;소프트웨어&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2497&quot; data-start=&quot;2463&quot;&gt;ASM / Storage Server / DB 버전 일치&lt;/td&gt;
&lt;td data-end=&quot;2526&quot; data-start=&quot;2497&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan 및 Flash 기능 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2564&quot; data-start=&quot;2527&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2541&quot; data-start=&quot;2527&quot;&gt;ASM AU_SIZE&lt;/td&gt;
&lt;td data-end=&quot;2547&quot; data-start=&quot;2541&quot; data-col-size=&quot;sm&quot;&gt;4MB&lt;/td&gt;
&lt;td data-end=&quot;2564&quot; data-start=&quot;2547&quot; data-col-size=&quot;sm&quot;&gt;대용량 스캔 성능 극대화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2610&quot; data-start=&quot;2565&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2578&quot; data-start=&quot;2565&quot;&gt;COMPATIBLE&lt;/td&gt;
&lt;td data-end=&quot;2592&quot; data-start=&quot;2578&quot; data-col-size=&quot;sm&quot;&gt;11.2.0.1 이상&lt;/td&gt;
&lt;td data-end=&quot;2610&quot; data-start=&quot;2592&quot; data-col-size=&quot;sm&quot;&gt;Exadata 기능 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2662&quot; data-start=&quot;2611&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2631&quot; data-start=&quot;2611&quot;&gt;DB_BLOCK_CHECKSUM&lt;/td&gt;
&lt;td data-end=&quot;2649&quot; data-start=&quot;2631&quot; data-col-size=&quot;sm&quot;&gt;TYPICAL 또는 FULL&lt;/td&gt;
&lt;td data-end=&quot;2662&quot; data-start=&quot;2649&quot; data-col-size=&quot;sm&quot;&gt;블록 무결성 검사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2711&quot; data-start=&quot;2663&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2677&quot; data-start=&quot;2663&quot;&gt;Extent Size&lt;/td&gt;
&lt;td data-end=&quot;2687&quot; data-start=&quot;2677&quot; data-col-size=&quot;sm&quot;&gt;4MB의 배수&lt;/td&gt;
&lt;td data-end=&quot;2711&quot; data-start=&quot;2687&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan I/O 효율 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2716&quot; data-start=&quot;2713&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2920&quot; data-start=&quot;2718&quot; data-ke-size=&quot;size16&quot;&gt;  정리하자면, Exadata로 마이그레이션할 때는 &lt;b&gt;단순 DB 마이그레이션이 아니라&lt;/b&gt;,&lt;br /&gt;✅ &lt;b&gt;64bit 호환성&lt;/b&gt;,&lt;br /&gt;✅ &lt;b&gt;ASM/DB 설정 최적화&lt;/b&gt;,&lt;br /&gt;✅ &lt;b&gt;AU/Extent Size 조정&lt;/b&gt;,&lt;br /&gt;✅ &lt;b&gt;COMPATIBLE 파라미터 설정&lt;/b&gt;,&lt;br /&gt;✅ &lt;b&gt;Smart Scan 환경 구성&lt;/b&gt;&lt;br /&gt;이 모두 맞아야 최대 성능을 낼 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Primary, Standby, Redo Log &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;212&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;Primary, Standby, Redo Log 이 세 가지는 &lt;b&gt;&lt;span&gt;Oracle Data Guard&lt;/span&gt;&lt;/b&gt; 의 핵심 구조를 이해하는 데 아주 중요합니다.&lt;br /&gt;쉽게 말해서 이 관계는   &lt;b&gt;&amp;ldquo;Primary DB에서 발생한 변경을 Standby DB로 실시간(or 거의 실시간) 복제하기 위한 메커니즘&amp;rdquo;&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-end=&quot;242&quot; data-start=&quot;214&quot; data-ke-size=&quot;size16&quot;&gt;아래에 그림 없이 개념을 단계별로 설명해볼게요  &lt;/p&gt;
&lt;hr data-end=&quot;247&quot; data-start=&quot;244&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;263&quot; data-start=&quot;249&quot; data-ke-size=&quot;size26&quot;&gt;  1. 기본 개념&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;용어역할설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;516&quot; data-start=&quot;265&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;516&quot; data-start=&quot;308&quot;&gt;
&lt;tr data-end=&quot;366&quot; data-start=&quot;308&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;334&quot; data-start=&quot;308&quot;&gt;  &lt;b&gt;Primary Database&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;344&quot; data-start=&quot;334&quot; data-col-size=&quot;sm&quot;&gt;주(主) DB&lt;/td&gt;
&lt;td data-end=&quot;366&quot; data-start=&quot;344&quot; data-col-size=&quot;sm&quot;&gt;실제 서비스가 동작하는 운영 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;442&quot; data-start=&quot;367&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;393&quot; data-start=&quot;367&quot;&gt;  &lt;b&gt;Standby Database&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;404&quot; data-start=&quot;393&quot; data-col-size=&quot;sm&quot;&gt;대기(備) DB&lt;/td&gt;
&lt;td data-end=&quot;442&quot; data-start=&quot;404&quot; data-col-size=&quot;sm&quot;&gt;Primary와 동일한 데이터를 복제해둔 백업 DB (DR용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;516&quot; data-start=&quot;443&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;461&quot; data-start=&quot;443&quot;&gt;  &lt;b&gt;Redo Log&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;469&quot; data-start=&quot;461&quot; data-col-size=&quot;sm&quot;&gt;변경 기록&lt;/td&gt;
&lt;td data-end=&quot;516&quot; data-start=&quot;469&quot; data-col-size=&quot;sm&quot;&gt;Primary에서 발생한 &lt;b&gt;모든 트랜잭션 변경 내용을 기록&lt;/b&gt;하는 로그 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;649&quot; data-start=&quot;518&quot; data-ke-size=&quot;size16&quot;&gt;  즉, Primary에서 &lt;b&gt;INSERT / UPDATE / DELETE / COMMIT&lt;/b&gt; 같은 변경이 일어나면,&lt;br /&gt;이 내용이 먼저 &lt;b&gt;Redo Log에 기록&lt;/b&gt;되고,&lt;br /&gt;이 로그를 Standby로 전달하여 &lt;b&gt;동기화&lt;/b&gt;합니다.&lt;/p&gt;
&lt;hr data-end=&quot;654&quot; data-start=&quot;651&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;679&quot; data-start=&quot;656&quot; data-ke-size=&quot;size26&quot;&gt;  2. Redo Log가 하는 일&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;903&quot; data-start=&quot;681&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;706&quot; data-start=&quot;681&quot;&gt;Primary DB에서 트랜잭션 발생&lt;/li&gt;
&lt;li data-end=&quot;746&quot; data-start=&quot;707&quot;&gt;해당 변경이 &lt;b&gt;Redo Log Buffer&lt;/b&gt;에 먼저 기록됨&lt;/li&gt;
&lt;li data-end=&quot;800&quot; data-start=&quot;747&quot;&gt;일정 시점(또는 commit 시) &amp;rarr; &lt;b&gt;Online Redo Log 파일&lt;/b&gt;에 기록됨&lt;/li&gt;
&lt;li data-end=&quot;851&quot; data-start=&quot;801&quot;&gt;Data Guard가 이 &lt;b&gt;Redo 데이터를 전송&lt;/b&gt; (Redo Transport)&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;852&quot;&gt;Standby에서 Redo Apply가 이를 읽어 DB에 적용함 (Redo Apply)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;959&quot; data-start=&quot;905&quot; data-ke-size=&quot;size16&quot;&gt;  결과적으로 Standby DB는 Primary DB와 거의 실시간으로 데이터가 동일해집니다.&lt;/p&gt;
&lt;hr data-end=&quot;964&quot; data-start=&quot;961&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;989&quot; data-start=&quot;966&quot; data-ke-size=&quot;size26&quot;&gt;  3. 동작 흐름 정리 (단계별)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;Primary&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DB] | ├─ &lt;/span&gt;&lt;span&gt;&lt;span&gt;1.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 사용자 변경 발생 ├─ &lt;/span&gt;&lt;span&gt;&lt;span&gt;2.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Redo &lt;/span&gt;&lt;span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;/span&gt;&lt;span&gt;에 기록 (Redo &lt;/span&gt;&lt;span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Buffer &amp;rarr; Online Redo &lt;/span&gt;&lt;span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) ├─ &lt;/span&gt;&lt;span&gt;&lt;span&gt;3.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; LNS(&lt;/span&gt;&lt;span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Network Service) 프로세스가 Redo 전송 ▼ [Standby DB] ├─ &lt;/span&gt;&lt;span&gt;&lt;span&gt;4.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; RFS(Remote File &lt;/span&gt;&lt;span&gt;&lt;span&gt;Server&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)가 Redo 수신 ├─ &lt;/span&gt;&lt;span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Standby Redo &lt;/span&gt;&lt;span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;/span&gt;&lt;span&gt;에 기록 ├─ &lt;/span&gt;&lt;span&gt;&lt;span&gt;6.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; MRP(Media Recovery Process)가 Redo 적용 ▼ [데이터 동기화 완료 ✅] &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1293&quot; data-start=&quot;1290&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1324&quot; data-start=&quot;1295&quot; data-ke-size=&quot;size26&quot;&gt;  4. Standby Redo Log의 역할&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1479&quot; data-start=&quot;1326&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1403&quot; data-start=&quot;1326&quot;&gt;Standby DB도 &lt;b&gt;Redo를 받기 위한 전용 Redo Log&lt;/b&gt;(Standby Redo Log, SRL)를 갖고 있어야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1446&quot; data-start=&quot;1404&quot;&gt;Primary에서 전송된 Redo가 &lt;b&gt;SRL에 실시간으로 저장&lt;/b&gt;되고,&lt;/li&gt;
&lt;li data-end=&quot;1479&quot; data-start=&quot;1447&quot;&gt;MRP 프로세스가 이 로그를 적용해 데이터 반영합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1566&quot; data-start=&quot;1481&quot; data-ke-size=&quot;size16&quot;&gt;  Standby Redo Log가 없다면 Archive Log 전송을 기다려야 해서 실시간성이 떨어집니다. (최신 DR 환경에서는 거의 필수로 구성)&lt;/p&gt;
&lt;hr data-end=&quot;1571&quot; data-start=&quot;1568&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1591&quot; data-start=&quot;1573&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 5. Redo 전송 방식&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;모드특징설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1776&quot; data-start=&quot;1593&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1776&quot; data-start=&quot;1640&quot;&gt;
&lt;tr data-end=&quot;1707&quot; data-start=&quot;1640&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1654&quot; data-start=&quot;1640&quot;&gt;&lt;b&gt;SYNC 모드&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1663&quot; data-start=&quot;1654&quot; data-col-size=&quot;sm&quot;&gt;실시간 전송&lt;/td&gt;
&lt;td data-end=&quot;1707&quot; data-start=&quot;1663&quot; data-col-size=&quot;sm&quot;&gt;Primary의 트랜잭션 COMMIT 시점에 Standby 반영까지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1776&quot; data-start=&quot;1708&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1723&quot; data-start=&quot;1708&quot;&gt;&lt;b&gt;ASYNC 모드&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1732&quot; data-start=&quot;1723&quot; data-col-size=&quot;sm&quot;&gt;비동기 전송&lt;/td&gt;
&lt;td data-end=&quot;1776&quot; data-start=&quot;1732&quot; data-col-size=&quot;sm&quot;&gt;Primary COMMIT 후 Standby로 전송 (약간의 지연 발생)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1837&quot; data-start=&quot;1778&quot; data-ke-size=&quot;size16&quot;&gt;  금융, 중요 서비스는 &lt;b&gt;SYNC&lt;/b&gt;, 일반 서비스나 원거리 DR은 &lt;b&gt;ASYNC&lt;/b&gt;를 많이 씁니다.&lt;/p&gt;
&lt;hr data-end=&quot;1842&quot; data-start=&quot;1839&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1864&quot; data-start=&quot;1844&quot; data-ke-size=&quot;size26&quot;&gt;  6. 로그 파일 종류 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;로그 유형위치역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2165&quot; data-start=&quot;1866&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2165&quot; data-start=&quot;1918&quot;&gt;
&lt;tr data-end=&quot;1963&quot; data-start=&quot;1918&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1936&quot; data-start=&quot;1918&quot;&gt;Online Redo Log&lt;/td&gt;
&lt;td data-end=&quot;1946&quot; data-start=&quot;1936&quot; data-col-size=&quot;sm&quot;&gt;Primary&lt;/td&gt;
&lt;td data-end=&quot;1963&quot; data-start=&quot;1946&quot; data-col-size=&quot;sm&quot;&gt;변경 내역을 실시간 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2024&quot; data-start=&quot;1964&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1978&quot; data-start=&quot;1964&quot;&gt;Archive Log&lt;/td&gt;
&lt;td data-end=&quot;1988&quot; data-start=&quot;1978&quot; data-col-size=&quot;sm&quot;&gt;Primary&lt;/td&gt;
&lt;td data-end=&quot;2024&quot; data-start=&quot;1988&quot; data-col-size=&quot;sm&quot;&gt;Online Redo Log가 다 차면 보관용으로 아카이브&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2090&quot; data-start=&quot;2025&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2044&quot; data-start=&quot;2025&quot;&gt;Standby Redo Log&lt;/td&gt;
&lt;td data-end=&quot;2054&quot; data-start=&quot;2044&quot; data-col-size=&quot;sm&quot;&gt;Standby&lt;/td&gt;
&lt;td data-end=&quot;2090&quot; data-start=&quot;2054&quot; data-col-size=&quot;sm&quot;&gt;Primary로부터 전송받은 Redo 데이터를 실시간 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2165&quot; data-start=&quot;2091&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2122&quot; data-start=&quot;2091&quot;&gt;Archived Redo (from Primary)&lt;/td&gt;
&lt;td data-end=&quot;2132&quot; data-start=&quot;2122&quot; data-col-size=&quot;sm&quot;&gt;Standby&lt;/td&gt;
&lt;td data-end=&quot;2165&quot; data-start=&quot;2132&quot; data-col-size=&quot;sm&quot;&gt;필요 시 Archive Log를 전송받아 복구에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2170&quot; data-start=&quot;2167&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2201&quot; data-start=&quot;2172&quot; data-ke-size=&quot;size26&quot;&gt;  7. Redo &amp;amp; Failover 시나리오&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2360&quot; data-start=&quot;2203&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2315&quot; data-start=&quot;2203&quot;&gt;Primary 장애 발생 시 &amp;rarr; Standby가 Redo를 모두 적용 완료 상태라면&lt;br /&gt;  &lt;b&gt;즉시 Standby를 Primary로 승격&lt;/b&gt; 가능 (Failover / Switchover)&lt;/li&gt;
&lt;li data-end=&quot;2360&quot; data-start=&quot;2316&quot;&gt;Redo가 잘 동기화돼 있어야 RPO(복구 시점 손실)가 0에 가까워집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2365&quot; data-start=&quot;2362&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2377&quot; data-start=&quot;2367&quot; data-ke-size=&quot;size26&quot;&gt;✅ 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구성 요소역할설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2674&quot; data-start=&quot;2379&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2674&quot; data-start=&quot;2431&quot;&gt;
&lt;tr data-end=&quot;2461&quot; data-start=&quot;2431&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2444&quot; data-start=&quot;2431&quot;&gt;Primary DB&lt;/td&gt;
&lt;td data-end=&quot;2449&quot; data-start=&quot;2444&quot; data-col-size=&quot;sm&quot;&gt;운영&lt;/td&gt;
&lt;td data-end=&quot;2461&quot; data-start=&quot;2449&quot; data-col-size=&quot;sm&quot;&gt;변경 발생 주체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2509&quot; data-start=&quot;2462&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2473&quot; data-start=&quot;2462&quot;&gt;Redo Log&lt;/td&gt;
&lt;td data-end=&quot;2481&quot; data-start=&quot;2473&quot; data-col-size=&quot;sm&quot;&gt;변경 기록&lt;/td&gt;
&lt;td data-end=&quot;2509&quot; data-start=&quot;2481&quot; data-col-size=&quot;sm&quot;&gt;Primary에서 발생한 모든 트랜잭션 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2568&quot; data-start=&quot;2510&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2523&quot; data-start=&quot;2510&quot;&gt;Standby DB&lt;/td&gt;
&lt;td data-end=&quot;2531&quot; data-start=&quot;2523&quot; data-col-size=&quot;sm&quot;&gt;복제 대상&lt;/td&gt;
&lt;td data-end=&quot;2568&quot; data-start=&quot;2531&quot; data-col-size=&quot;sm&quot;&gt;Primary의 변경을 Redo Log 기반으로 실시간 반영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2631&quot; data-start=&quot;2569&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2588&quot; data-start=&quot;2569&quot;&gt;Standby Redo Log&lt;/td&gt;
&lt;td data-end=&quot;2597&quot; data-start=&quot;2588&quot; data-col-size=&quot;sm&quot;&gt;중간 저장소&lt;/td&gt;
&lt;td data-end=&quot;2631&quot; data-start=&quot;2597&quot; data-col-size=&quot;sm&quot;&gt;Primary의 Redo를 받아 Standby에서 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2674&quot; data-start=&quot;2632&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2645&quot; data-start=&quot;2632&quot;&gt;SYNC/ASYNC&lt;/td&gt;
&lt;td data-end=&quot;2653&quot; data-start=&quot;2645&quot; data-col-size=&quot;sm&quot;&gt;전송 방식&lt;/td&gt;
&lt;td data-end=&quot;2674&quot; data-start=&quot;2653&quot; data-col-size=&quot;sm&quot;&gt;동기 vs 비동기 Redo 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2692&quot; data-start=&quot;2676&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;2833&quot; data-start=&quot;2693&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2749&quot; data-start=&quot;2693&quot;&gt;Redo Log는 단순한 로그 파일이 아니라 &lt;b&gt;Standby 동기화의 핵심 매개체&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;2797&quot; data-start=&quot;2750&quot;&gt;Standby는 Redo를 기반으로 Primary와 똑같은 상태를 유지합니다.&lt;/li&gt;
&lt;li data-end=&quot;2833&quot; data-start=&quot;2798&quot;&gt;이 구조 덕분에 장애 시 빠르게 DR로 전환할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Physical Standby 와 Logical Standby &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3576&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;105&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle Data Guard&lt;/span&gt; 환경에서 &lt;b&gt;Standby Database&lt;/b&gt;는 크게 &lt;b&gt;두 가지 유형&lt;/b&gt;이 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;150&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;  Physical Standby 와 Logical Standby&lt;/p&gt;
&lt;p data-end=&quot;223&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;이 둘은 &lt;b&gt;Primary DB로부터 Redo를 어떻게 적용하느냐&lt;/b&gt; 방식이 완전히 다릅니다.&lt;br /&gt;아래에서 쉽게 정리해볼게요 &lt;/p&gt;
&lt;hr data-end=&quot;228&quot; data-start=&quot;225&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;244&quot; data-start=&quot;230&quot; data-ke-size=&quot;size26&quot;&gt;  1. 개념 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분Physical StandbyLogical Standby
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;637&quot; data-start=&quot;246&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;637&quot; data-start=&quot;341&quot;&gt;
&lt;tr data-end=&quot;404&quot; data-start=&quot;341&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;353&quot; data-start=&quot;341&quot;&gt;데이터 복제 방식&lt;/td&gt;
&lt;td data-end=&quot;377&quot; data-start=&quot;353&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;Redo 블록 단위&lt;/b&gt; 그대로 적용&lt;/td&gt;
&lt;td data-end=&quot;404&quot; data-start=&quot;377&quot; data-col-size=&quot;sm&quot;&gt;Redo를 &lt;b&gt;SQL로 변환해서&lt;/b&gt; 재실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;473&quot; data-start=&quot;405&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;414&quot; data-start=&quot;405&quot;&gt;데이터 구조&lt;/td&gt;
&lt;td data-end=&quot;436&quot; data-start=&quot;414&quot; data-col-size=&quot;sm&quot;&gt;Primary와 &lt;b&gt;완전히 동일&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;473&quot; data-start=&quot;436&quot; data-col-size=&quot;sm&quot;&gt;Primary와 논리적으로 동일(구조는 약간 다를 수 있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;508&quot; data-start=&quot;474&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;482&quot; data-start=&quot;474&quot;&gt;적용 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;495&quot; data-start=&quot;482&quot;&gt;Redo Apply&lt;/td&gt;
&lt;td data-end=&quot;508&quot; data-start=&quot;495&quot; data-col-size=&quot;sm&quot;&gt;SQL Apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;559&quot; data-start=&quot;509&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;517&quot; data-start=&quot;509&quot;&gt;활용 목적&lt;/td&gt;
&lt;td data-end=&quot;532&quot; data-start=&quot;517&quot; data-col-size=&quot;sm&quot;&gt;고가용성(HA), DR&lt;/td&gt;
&lt;td data-end=&quot;559&quot; data-start=&quot;532&quot; data-col-size=&quot;sm&quot;&gt;DR + 리포팅/ETL 등 읽기 부하 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;603&quot; data-start=&quot;560&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;568&quot; data-start=&quot;560&quot;&gt;변경 허용&lt;/td&gt;
&lt;td data-end=&quot;583&quot; data-start=&quot;568&quot; data-col-size=&quot;sm&quot;&gt;읽기 전용(일반적으로)&lt;/td&gt;
&lt;td data-end=&quot;603&quot; data-start=&quot;583&quot; data-col-size=&quot;sm&quot;&gt;일부 객체 수정 및 추가 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;637&quot; data-start=&quot;604&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;612&quot; data-start=&quot;604&quot;&gt;복구 속도&lt;/td&gt;
&lt;td data-end=&quot;617&quot; data-start=&quot;612&quot; data-col-size=&quot;sm&quot;&gt;빠름&lt;/td&gt;
&lt;td data-end=&quot;637&quot; data-start=&quot;617&quot; data-col-size=&quot;sm&quot;&gt;느림(변환 및 적용 오버헤드)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;642&quot; data-start=&quot;639&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;681&quot; data-start=&quot;644&quot; data-ke-size=&quot;size26&quot;&gt; ️ 2. Physical Standby (물리적 스탠바이)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehfIty/dJMb9XK69ko/G1glXaKKKtmF3YMckBrGOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehfIty/dJMb9XK69ko/G1glXaKKKtmF3YMckBrGOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehfIty/dJMb9XK69ko/G1glXaKKKtmF3YMckBrGOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehfIty%2FdJMb9XK69ko%2FG1glXaKKKtmF3YMckBrGOK%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;638&quot; height=&quot;477&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;692&quot; data-start=&quot;683&quot; data-ke-size=&quot;size23&quot;&gt;  정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;789&quot; data-start=&quot;693&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;751&quot; data-start=&quot;693&quot;&gt;Primary DB의 Redo 데이터를 &lt;b&gt;Block 단위 그대로&lt;/b&gt; Standby에 적용하는 방식.&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;752&quot;&gt;Primary와 &lt;b&gt;물리적으로 완전히 동일한 복제본&lt;/b&gt;을 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;802&quot; data-start=&quot;791&quot; data-ke-size=&quot;size23&quot;&gt;⚡ 동작 방식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;964&quot; data-start=&quot;803&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;833&quot; data-start=&quot;803&quot;&gt;Primary에서 트랜잭션 발생 &amp;rarr; Redo 생성&lt;/li&gt;
&lt;li data-end=&quot;855&quot; data-start=&quot;834&quot;&gt;Redo가 Standby로 전송됨&lt;/li&gt;
&lt;li data-end=&quot;922&quot; data-start=&quot;856&quot;&gt;Standby의 MRP(Media Recovery Process)가 Redo를 그대로 적용 (Redo Apply)&lt;/li&gt;
&lt;li data-end=&quot;964&quot; data-start=&quot;923&quot;&gt;Standby는 Primary와 데이터가 완전히 동일한 상태로 유지됨&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Primary ──&lt;/span&gt;&lt;span&gt;&lt;span&gt;Redo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(블록단위)──▶ Physical Standby &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1025&quot; data-start=&quot;1016&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1159&quot; data-start=&quot;1026&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1056&quot; data-start=&quot;1026&quot;&gt;✅ 구조 및 데이터가 Primary와 100% 동일&lt;/li&gt;
&lt;li data-end=&quot;1077&quot; data-start=&quot;1057&quot;&gt;✅ Redo 적용이 빠르고 안정적&lt;/li&gt;
&lt;li data-end=&quot;1104&quot; data-start=&quot;1078&quot;&gt;✅ 장애 발생 시 빠른 Failover 가능&lt;/li&gt;
&lt;li data-end=&quot;1159&quot; data-start=&quot;1105&quot;&gt;⚠️ 읽기 전용 모드(기본) &amp;mdash; 단, Active Data Guard 라이선스로 읽기 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1204&quot; data-start=&quot;1161&quot; data-ke-size=&quot;size16&quot;&gt;  일반적인 &lt;b&gt;DR(재해 복구)&lt;/b&gt; 구성에서 가장 널리 쓰이는 방식입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1209&quot; data-start=&quot;1206&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1246&quot; data-start=&quot;1211&quot; data-ke-size=&quot;size26&quot;&gt;  3. Logical Standby (논리적 스탠바이)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQNcnr/dJMb9XK69kr/rykkx4N4KQR7fh0MZxFzkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQNcnr/dJMb9XK69kr/rykkx4N4KQR7fh0MZxFzkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQNcnr/dJMb9XK69kr/rykkx4N4KQR7fh0MZxFzkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQNcnr%2FdJMb9XK69kr%2Frykkx4N4KQR7fh0MZxFzkK%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;638&quot; height=&quot;476&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;1257&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size23&quot;&gt;  정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1356&quot; data-start=&quot;1258&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1321&quot; data-start=&quot;1258&quot;&gt;Primary DB의 Redo 데이터를 받아 &lt;b&gt;SQL 문장으로 변환 후&lt;/b&gt; Standby에 재적용하는 방식.&lt;/li&gt;
&lt;li data-end=&quot;1356&quot; data-start=&quot;1322&quot;&gt;데이터 결과는 동일하지만, 물리적 구조는 조금 달라도 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1369&quot; data-start=&quot;1358&quot; data-ke-size=&quot;size23&quot;&gt;⚡ 동작 방식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1501&quot; data-start=&quot;1370&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1400&quot; data-start=&quot;1370&quot;&gt;Primary에서 트랜잭션 발생 &amp;rarr; Redo 생성&lt;/li&gt;
&lt;li data-end=&quot;1422&quot; data-start=&quot;1401&quot;&gt;Redo가 Standby로 전송됨&lt;/li&gt;
&lt;li data-end=&quot;1478&quot; data-start=&quot;1423&quot;&gt;Standby의 LSP(Logical Standby Process)가 Redo &amp;rarr; SQL 변환&lt;/li&gt;
&lt;li data-end=&quot;1501&quot; data-start=&quot;1479&quot;&gt;SQL Apply로 데이터를 재적용&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Primary&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ──Redo&amp;rarr;&lt;/span&gt;&lt;span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 변환──▶ Logical Standby &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1562&quot; data-start=&quot;1553&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1739&quot; data-start=&quot;1563&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1601&quot; data-start=&quot;1563&quot;&gt;✅ Standby에서도 DML, DDL 가능 (일부 테이블 제외)&lt;/li&gt;
&lt;li data-end=&quot;1628&quot; data-start=&quot;1602&quot;&gt;✅ 리포팅/ETL/분석용으로 병행 활용 가능&lt;/li&gt;
&lt;li data-end=&quot;1657&quot; data-start=&quot;1629&quot;&gt;⚠️ SQL 변환 오버헤드 &amp;rarr; 적용 속도가 느림&lt;/li&gt;
&lt;li data-end=&quot;1683&quot; data-start=&quot;1658&quot;&gt;⚠️ 모든 데이터 타입이 지원되는 건 아님&lt;/li&gt;
&lt;li data-end=&quot;1739&quot; data-start=&quot;1684&quot;&gt;⚠️ 특정 기능/객체는 변환 불가 (e.g. SecureFile LOB, 일부 XML 타입 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1773&quot; data-start=&quot;1741&quot; data-ke-size=&quot;size16&quot;&gt;  주로 &lt;b&gt;운영 + 분석 분리&lt;/b&gt; 목적으로 사용됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1778&quot; data-start=&quot;1775&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1814&quot; data-start=&quot;1780&quot; data-ke-size=&quot;size26&quot;&gt;  4. Physical vs Logical 비교 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목Physical StandbyLogical Standby
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2252&quot; data-start=&quot;1816&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2252&quot; data-start=&quot;1913&quot;&gt;
&lt;tr data-end=&quot;1965&quot; data-start=&quot;1913&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1921&quot; data-start=&quot;1913&quot;&gt;적용 방식&lt;/td&gt;
&lt;td data-end=&quot;1942&quot; data-start=&quot;1921&quot; data-col-size=&quot;sm&quot;&gt;Redo Apply (블록 단위)&lt;/td&gt;
&lt;td data-end=&quot;1965&quot; data-start=&quot;1942&quot; data-col-size=&quot;sm&quot;&gt;SQL Apply (SQL 재실행)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1992&quot; data-start=&quot;1966&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1975&quot; data-start=&quot;1966&quot;&gt;동기화 속도&lt;/td&gt;
&lt;td data-end=&quot;1980&quot; data-start=&quot;1975&quot; data-col-size=&quot;sm&quot;&gt;빠름&lt;/td&gt;
&lt;td data-end=&quot;1992&quot; data-start=&quot;1980&quot; data-col-size=&quot;sm&quot;&gt;상대적으로 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2044&quot; data-start=&quot;1993&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2002&quot; data-start=&quot;1993&quot;&gt;데이터 구조&lt;/td&gt;
&lt;td data-end=&quot;2019&quot; data-start=&quot;2002&quot; data-col-size=&quot;sm&quot;&gt;Primary와 완전 동일&lt;/td&gt;
&lt;td data-end=&quot;2044&quot; data-start=&quot;2019&quot; data-col-size=&quot;sm&quot;&gt;논리적으로 동일, 일부 구조 변경 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2076&quot; data-start=&quot;2045&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2050&quot; data-start=&quot;2045&quot;&gt;활용&lt;/td&gt;
&lt;td data-end=&quot;2061&quot; data-start=&quot;2050&quot; data-col-size=&quot;sm&quot;&gt;DR, 고가용성&lt;/td&gt;
&lt;td data-end=&quot;2076&quot; data-start=&quot;2061&quot; data-col-size=&quot;sm&quot;&gt;DR + 리포팅/분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2138&quot; data-start=&quot;2077&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2085&quot; data-start=&quot;2077&quot;&gt;변경 허용&lt;/td&gt;
&lt;td data-end=&quot;2120&quot; data-start=&quot;2085&quot; data-col-size=&quot;sm&quot;&gt;읽기 전용 (Active Data Guard로 읽기 가능)&lt;/td&gt;
&lt;td data-end=&quot;2138&quot; data-start=&quot;2120&quot; data-col-size=&quot;sm&quot;&gt;읽기 + 제한적 쓰기 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2188&quot; data-start=&quot;2139&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2153&quot; data-start=&quot;2139&quot;&gt;Failover 속도&lt;/td&gt;
&lt;td data-end=&quot;2158&quot; data-start=&quot;2153&quot; data-col-size=&quot;sm&quot;&gt;빠름&lt;/td&gt;
&lt;td data-end=&quot;2188&quot; data-start=&quot;2158&quot; data-col-size=&quot;sm&quot;&gt;느림 (SQL 변환 및 적용 상태에 따라 다름)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2216&quot; data-start=&quot;2189&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2197&quot; data-start=&quot;2189&quot;&gt;지원 객체&lt;/td&gt;
&lt;td data-end=&quot;2203&quot; data-start=&quot;2197&quot; data-col-size=&quot;sm&quot;&gt;대부분&lt;/td&gt;
&lt;td data-end=&quot;2216&quot; data-start=&quot;2203&quot; data-col-size=&quot;sm&quot;&gt;일부 객체 제외됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2252&quot; data-start=&quot;2217&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2225&quot; data-start=&quot;2217&quot;&gt;유지 관리&lt;/td&gt;
&lt;td data-end=&quot;2230&quot; data-start=&quot;2225&quot; data-col-size=&quot;sm&quot;&gt;단순&lt;/td&gt;
&lt;td data-end=&quot;2252&quot; data-start=&quot;2230&quot; data-col-size=&quot;sm&quot;&gt;변환/적용 이슈로 복잡할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2257&quot; data-start=&quot;2254&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2281&quot; data-start=&quot;2259&quot; data-ke-size=&quot;size26&quot;&gt;  5. 실무에서의 활용 시나리오&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;시나리오추천 유형
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2546&quot; data-start=&quot;2283&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2546&quot; data-start=&quot;2327&quot;&gt;
&lt;tr data-end=&quot;2370&quot; data-start=&quot;2327&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2348&quot; data-start=&quot;2327&quot;&gt;단순 DR(재해 복구), 고가용성&lt;/td&gt;
&lt;td data-end=&quot;2370&quot; data-start=&quot;2348&quot; data-col-size=&quot;md&quot;&gt;✅ Physical Standby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2439&quot; data-start=&quot;2371&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2391&quot; data-start=&quot;2371&quot;&gt;DR + 리포팅 서버 병행 사용&lt;/td&gt;
&lt;td data-end=&quot;2439&quot; data-start=&quot;2391&quot; data-col-size=&quot;md&quot;&gt;✅ Logical Standby (또는 Active Physical + 리포팅)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2490&quot; data-start=&quot;2440&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2468&quot; data-start=&quot;2440&quot;&gt;Failover/Switchover 빠른 전환&lt;/td&gt;
&lt;td data-end=&quot;2490&quot; data-start=&quot;2468&quot; data-col-size=&quot;md&quot;&gt;✅ Physical Standby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2546&quot; data-start=&quot;2491&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2509&quot; data-start=&quot;2491&quot;&gt;DW/ETL/분석 작업 분리&lt;/td&gt;
&lt;td data-end=&quot;2546&quot; data-start=&quot;2509&quot; data-col-size=&quot;md&quot;&gt;Logical Standby (단, 변환 호환성 확인 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2659&quot; data-start=&quot;2548&quot; data-ke-size=&quot;size16&quot;&gt;  대부분의 기업은 운영 DR은 &lt;b&gt;Physical Standby&lt;/b&gt;로 구성하고,&lt;br /&gt;리포팅이 필요한 경우 &lt;b&gt;Logical Standby 또는 Active Data Guard&lt;/b&gt;를 추가로 씁니다.&lt;/p&gt;
&lt;hr data-end=&quot;2664&quot; data-start=&quot;2661&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2685&quot; data-start=&quot;2666&quot; data-ke-size=&quot;size26&quot;&gt;  6. 관련 주요 프로세스&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;프로세스Standby 유형역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2896&quot; data-start=&quot;2687&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2896&quot; data-start=&quot;2754&quot;&gt;
&lt;tr data-end=&quot;2781&quot; data-start=&quot;2754&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2760&quot; data-start=&quot;2754&quot;&gt;LNS&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2770&quot; data-start=&quot;2760&quot;&gt;Primary&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2781&quot; data-start=&quot;2770&quot;&gt;Redo 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2809&quot; data-start=&quot;2782&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2788&quot; data-start=&quot;2782&quot;&gt;RFS&lt;/td&gt;
&lt;td data-end=&quot;2798&quot; data-start=&quot;2788&quot; data-col-size=&quot;sm&quot;&gt;Standby&lt;/td&gt;
&lt;td data-end=&quot;2809&quot; data-start=&quot;2798&quot; data-col-size=&quot;sm&quot;&gt;Redo 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2849&quot; data-start=&quot;2810&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2816&quot; data-start=&quot;2810&quot;&gt;MRP&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2835&quot; data-start=&quot;2816&quot;&gt;Physical Standby&lt;/td&gt;
&lt;td data-end=&quot;2849&quot; data-start=&quot;2835&quot; data-col-size=&quot;sm&quot;&gt;Redo Apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2896&quot; data-start=&quot;2850&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2856&quot; data-start=&quot;2850&quot;&gt;LSP&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2874&quot; data-start=&quot;2856&quot;&gt;Logical Standby&lt;/td&gt;
&lt;td data-end=&quot;2896&quot; data-start=&quot;2874&quot; data-col-size=&quot;sm&quot;&gt;Redo &amp;rarr; SQL 변환 및 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2901&quot; data-start=&quot;2898&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2913&quot; data-start=&quot;2903&quot; data-ke-size=&quot;size26&quot;&gt;✅ 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분Physical StandbyLogical Standby
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3146&quot; data-start=&quot;2915&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3146&quot; data-start=&quot;3010&quot;&gt;
&lt;tr data-end=&quot;3041&quot; data-start=&quot;3010&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3020&quot; data-start=&quot;3010&quot;&gt;Redo 처리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3031&quot; data-start=&quot;3020&quot;&gt;Block 단위&lt;/td&gt;
&lt;td data-end=&quot;3041&quot; data-start=&quot;3031&quot; data-col-size=&quot;sm&quot;&gt;SQL 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3058&quot; data-start=&quot;3042&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3047&quot; data-start=&quot;3042&quot;&gt;속도&lt;/td&gt;
&lt;td data-end=&quot;3052&quot; data-start=&quot;3047&quot; data-col-size=&quot;sm&quot;&gt;빠름&lt;/td&gt;
&lt;td data-end=&quot;3058&quot; data-start=&quot;3052&quot; data-col-size=&quot;sm&quot;&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3079&quot; data-start=&quot;3059&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3064&quot; data-start=&quot;3059&quot;&gt;구조&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3069&quot; data-start=&quot;3064&quot;&gt;동일&lt;/td&gt;
&lt;td data-end=&quot;3079&quot; data-start=&quot;3069&quot; data-col-size=&quot;sm&quot;&gt;논리적 동등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3105&quot; data-start=&quot;3080&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3085&quot; data-start=&quot;3080&quot;&gt;용도&lt;/td&gt;
&lt;td data-end=&quot;3093&quot; data-start=&quot;3085&quot; data-col-size=&quot;sm&quot;&gt;DR/HA&lt;/td&gt;
&lt;td data-end=&quot;3105&quot; data-start=&quot;3093&quot; data-col-size=&quot;sm&quot;&gt;DR + 리포팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3123&quot; data-start=&quot;3106&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3112&quot; data-start=&quot;3106&quot;&gt;복잡도&lt;/td&gt;
&lt;td data-end=&quot;3117&quot; data-start=&quot;3112&quot; data-col-size=&quot;sm&quot;&gt;단순&lt;/td&gt;
&lt;td data-end=&quot;3123&quot; data-start=&quot;3117&quot; data-col-size=&quot;sm&quot;&gt;복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3146&quot; data-start=&quot;3124&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3135&quot; data-start=&quot;3124&quot;&gt;Failover&lt;/td&gt;
&lt;td data-end=&quot;3140&quot; data-start=&quot;3135&quot; data-col-size=&quot;sm&quot;&gt;빠름&lt;/td&gt;
&lt;td data-end=&quot;3146&quot; data-start=&quot;3140&quot; data-col-size=&quot;sm&quot;&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;  대부분의 DR 설계는 Physical Standby를 기본으로 하고,&lt;br /&gt;특수한 분석 용도나 부하 분산이 필요할 때만 Logical Standby를 씁니다.&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-style=&quot;style1&quot;&gt;12장 Bulk Data Loading&lt;/blockquote&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; 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;634&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZuank/dJMb9QeeQrG/PLyUsgbMXrVxLqTGTp1e5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZuank/dJMb9QeeQrG/PLyUsgbMXrVxLqTGTp1e5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZuank/dJMb9QeeQrG/PLyUsgbMXrVxLqTGTp1e5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZuank%2FdJMb9QeeQrG%2FPLyUsgbMXrVxLqTGTp1e5k%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;382&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;DB&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;FS&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;extraction traslation staging area loading&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;star shema&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;sorce로부터 data불러올 때 file로 끌어온다&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;exa는 file로 소스 불러오지 않고 asm storage에서 불러옴&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-style=&quot;style1&quot;&gt;File 기반 적재 (Staging Area 활용)&lt;/blockquote&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; 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;657&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uyvFe/dJMb9VGw0aY/vcSDY7iehiXJwNWEK6RRb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uyvFe/dJMb9VGw0aY/vcSDY7iehiXJwNWEK6RRb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uyvFe/dJMb9VGw0aY/vcSDY7iehiXJwNWEK6RRb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuyvFe%2FdJMb9VGw0aY%2FvcSDY7iehiXJwNWEK6RRb1%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;657&quot; height=&quot;427&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;staging area영역을 어디로 구성할거냐?&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;엑사머신 바깥쪽에 둘건지 external. 별도 스토리지 사용. SAN, NAS&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;엑사머신 안쪽에 둘건지 internal. DBFS(db관리 파일시스템), ACFS(asm관리 파일시스템)&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;엑사머신 바깥쪽에 둔다는 것은 별도 서버 사용. SAN, NAS&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;946&quot; data-start=&quot;937&quot; data-ke-size=&quot;size23&quot;&gt;  개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1052&quot; data-start=&quot;947&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;996&quot; data-start=&quot;947&quot;&gt;소스 시스템의 데이터를 파일(CSV, Flat File, Parquet 등)로 떨궈서&lt;/li&gt;
&lt;li data-end=&quot;1029&quot; data-start=&quot;997&quot;&gt;&lt;b&gt;Staging Area&lt;/b&gt;(중간 저장소)에 옮긴 뒤&lt;/li&gt;
&lt;li data-end=&quot;1052&quot; data-start=&quot;1030&quot;&gt;Exadata로 로드하는 방식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1079&quot; data-start=&quot;1054&quot; data-ke-size=&quot;size23&quot;&gt;  Staging Area 구성 옵션&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;위치설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1259&quot; data-start=&quot;1080&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1259&quot; data-start=&quot;1110&quot;&gt;
&lt;tr data-end=&quot;1168&quot; data-start=&quot;1110&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1137&quot; data-start=&quot;1110&quot;&gt;ACFS / DBFS (Exadata 내부)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1168&quot; data-start=&quot;1137&quot;&gt;Exadata의 파일 시스템에 staging 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1222&quot; data-start=&quot;1169&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1186&quot; data-start=&quot;1169&quot;&gt;NAS / SAN (외부)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1222&quot; data-start=&quot;1186&quot;&gt;별도의 스토리지에 staging 후 Exadata에서 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1259&quot; data-start=&quot;1223&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1240&quot; data-start=&quot;1223&quot;&gt;외장 디스크 / 테이프 등&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1259&quot; data-start=&quot;1240&quot;&gt;물리적 매체로 전송 후 적재&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1326&quot; data-start=&quot;1261&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;주의:&lt;/b&gt; Exadata 내부 서버 디스크(로컬 HDD)에 staging 파일을 두는 건 권장되지 않습니다.&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-style=&quot;style1&quot;&gt;DBFS?&lt;/blockquote&gt;
&lt;h2 data-end=&quot;254&quot; data-start=&quot;234&quot; data-ke-size=&quot;size26&quot;&gt;  1. DBFS란 무엇인가?&lt;/h2&gt;
&lt;p data-end=&quot;338&quot; data-start=&quot;256&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle Database File System&lt;/span&gt;(DBFS)는&lt;br /&gt;  &lt;b&gt;데이터베이스를 파일 시스템처럼 사용하는 기능&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;423&quot; data-start=&quot;340&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;370&quot; data-start=&quot;340&quot;&gt;내부적으로는 DB 테이블에 데이터를 저장하지만,&lt;/li&gt;
&lt;li data-end=&quot;423&quot; data-start=&quot;371&quot;&gt;외부에서는 일반 POSIX 파일 시스템(리눅스 파일 시스템)처럼 접근할 수 있게 해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;[Application / Loader]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; │ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; ▼ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;[ DBFS Mount (POSIX FS) ]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; │ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; ▼ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;[ Oracle Database (SecureFiles LOB) ]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; │ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; ▼&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;[ Exadata Storage ]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;610&quot; data-start=&quot;607&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;640&quot; data-start=&quot;612&quot; data-ke-size=&quot;size26&quot;&gt;  2. DBFS Staging의 동작 방식&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1021&quot; data-start=&quot;642&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;716&quot; data-start=&quot;642&quot;&gt;&lt;b&gt;Staging 파일 업로드&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;716&quot; data-start=&quot;669&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;716&quot; data-start=&quot;669&quot;&gt;CSV, TXT, Parquet 등 대용량 데이터를 DBFS 마운트 지점에 업로드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;817&quot; data-start=&quot;718&quot;&gt;&lt;b&gt;DBFS 내부 저장&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;817&quot; data-start=&quot;741&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;780&quot; data-start=&quot;741&quot;&gt;파일은 DB 내부의 &lt;b&gt;SecureFile LOB&lt;/b&gt; 컬럼에 저장됨&lt;/li&gt;
&lt;li data-end=&quot;817&quot; data-start=&quot;784&quot;&gt;실제 물리적 저장소는 Exadata의 ASM 디스크 그룹&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;942&quot; data-start=&quot;819&quot;&gt;&lt;b&gt;POSIX 파일 인터페이스 제공&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;942&quot; data-start=&quot;849&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;886&quot; data-start=&quot;849&quot;&gt;OS에서 ls, cp, rm 같은 명령으로 접근 가능&lt;/li&gt;
&lt;li data-end=&quot;942&quot; data-start=&quot;890&quot;&gt;SQL*Loader, External Table 등에서 &lt;b&gt;파일 경로로 바로 로딩 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1021&quot; data-start=&quot;944&quot;&gt;&lt;b&gt;DB 기능 활용 가능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1021&quot; data-start=&quot;968&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1021&quot; data-start=&quot;968&quot;&gt;DBFS에 저장된 파일도 RMAN 백업, Flashback, Data Guard 동기화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1026&quot; data-start=&quot;1023&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1050&quot; data-start=&quot;1028&quot; data-ke-size=&quot;size26&quot;&gt;  3. DBFS의 특징 및 장점&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1377&quot; data-start=&quot;1052&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1377&quot; data-start=&quot;1080&quot;&gt;
&lt;tr data-end=&quot;1131&quot; data-start=&quot;1080&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1104&quot; data-start=&quot;1080&quot;&gt;  &lt;b&gt;파일 시스템처럼 사용 가능&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1131&quot; data-start=&quot;1104&quot; data-col-size=&quot;sm&quot;&gt;OS에서 mount 후 일반 파일처럼 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1179&quot; data-start=&quot;1132&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1160&quot; data-start=&quot;1132&quot;&gt;  &lt;b&gt;SecureFile LOB에 저장&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1179&quot; data-start=&quot;1160&quot; data-col-size=&quot;sm&quot;&gt;DB 내부에 안전하게 저장됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1221&quot; data-start=&quot;1180&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1200&quot; data-start=&quot;1180&quot;&gt;⚡ &lt;b&gt;트랜잭션 일관성 보장&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1221&quot; data-start=&quot;1200&quot; data-col-size=&quot;sm&quot;&gt;DB 데이터와 동기적으로 관리됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1283&quot; data-start=&quot;1222&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1245&quot; data-start=&quot;1222&quot;&gt;  &lt;b&gt;고가용성 기능 연계 가능&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1283&quot; data-start=&quot;1245&quot; data-col-size=&quot;sm&quot;&gt;ASM, RMAN, Flashback, Data Guard 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1327&quot; data-start=&quot;1284&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1307&quot; data-start=&quot;1284&quot;&gt;  &lt;b&gt;보안 및 권한 관리 용이&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1327&quot; data-start=&quot;1307&quot; data-col-size=&quot;sm&quot;&gt;DB 계정 및 권한 관리 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1377&quot; data-start=&quot;1328&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1349&quot; data-start=&quot;1328&quot;&gt;  &lt;b&gt;Exadata 최적화&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1377&quot; data-start=&quot;1349&quot; data-col-size=&quot;sm&quot;&gt;로딩 시 내부 경로 사용 &amp;rarr; 빠른 적재 속도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1450&quot; data-start=&quot;1379&quot; data-ke-size=&quot;size16&quot;&gt;  즉, 단순한 &amp;ldquo;파일 폴더&amp;rdquo;가 아니라&lt;br /&gt;✅ &lt;b&gt;DB의 고가용성과 보안을 그대로 적용할 수 있는 스테이징 스토리지&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1455&quot; data-start=&quot;1452&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1482&quot; data-start=&quot;1457&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 4. DBFS를 이용한 스테이징 예시&lt;/h2&gt;
&lt;h3 data-end=&quot;1498&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size23&quot;&gt;① DBFS 마운트&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;# 예: 리눅스에서 DBFS를 마운트&lt;/span&gt;&lt;/span&gt;&lt;span&gt; dbfs_client username@TNS_ALIAS /mnt/dbfs &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1586&quot; data-start=&quot;1574&quot; data-ke-size=&quot;size23&quot;&gt;② 파일 업로드&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;cp&lt;/span&gt;&lt;/span&gt;&lt;span&gt; /data/bulk/orders_202510.csv /mnt/dbfs/ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1667&quot; data-start=&quot;1643&quot; data-ke-size=&quot;size23&quot;&gt;③ External Table로 로딩&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ext_orders ( order_id NUMBER, order_date &lt;/span&gt;&lt;span&gt;&lt;span&gt;DATE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, amount NUMBER ) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ORGANIZATION &lt;/span&gt;&lt;span&gt;&lt;span&gt;EXTERNAL&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ( TYPE ORACLE_LOADER &lt;/span&gt;&lt;span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DIRECTORY dbfs_dir ACCESS &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;PARAMETERS ( RECORDS DELIMITED &lt;/span&gt;&lt;span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;/span&gt;&lt;span&gt; NEWLINE FIELDS TERMINATED &lt;/span&gt;&lt;span&gt;&lt;span&gt;BY&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;span&gt; ) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; LOCATION (&lt;/span&gt;&lt;span&gt;&lt;span&gt;'orders_202510.csv'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) ) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;REJECT LIMIT UNLIMITED; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size16&quot;&gt;  DBFS 경로에 올린 파일을 바로 External Table로 읽어 들임.&lt;/p&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size16&quot;&gt;예시2 ) 실습 예시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNWqWP/dJMb8V0QPFM/byXnxKWCeaQt4nqtKOMAcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNWqWP/dJMb8V0QPFM/byXnxKWCeaQt4nqtKOMAcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNWqWP/dJMb8V0QPFM/byXnxKWCeaQt4nqtKOMAcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNWqWP%2FdJMb8V0QPFM%2FbyXnxKWCeaQt4nqtKOMAcK%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;548&quot; height=&quot;543&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;2044&quot; data-start=&quot;2041&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2081&quot; data-start=&quot;2046&quot; data-ke-size=&quot;size26&quot;&gt;  5. DBFS vs 외부 NAS/SAN 스테이징 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목DBFSNAS/SAN 등 외부 스토리지
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2421&quot; data-start=&quot;2083&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2421&quot; data-start=&quot;2164&quot;&gt;
&lt;tr data-end=&quot;2196&quot; data-start=&quot;2164&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2172&quot; data-start=&quot;2164&quot;&gt;설치 위치&lt;/td&gt;
&lt;td data-end=&quot;2190&quot; data-start=&quot;2172&quot; data-col-size=&quot;sm&quot;&gt;DB 내부 (Exadata)&lt;/td&gt;
&lt;td data-end=&quot;2196&quot; data-start=&quot;2190&quot; data-col-size=&quot;sm&quot;&gt;외부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2238&quot; data-start=&quot;2197&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2202&quot; data-start=&quot;2197&quot;&gt;성능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2223&quot; data-start=&quot;2202&quot;&gt;Exadata 내부 경로 &amp;rarr; 빠름&lt;/td&gt;
&lt;td data-end=&quot;2238&quot; data-start=&quot;2223&quot; data-col-size=&quot;sm&quot;&gt;네트워크 I/O 경유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2291&quot; data-start=&quot;2239&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2245&quot; data-start=&quot;2239&quot;&gt;가용성&lt;/td&gt;
&lt;td data-end=&quot;2274&quot; data-start=&quot;2245&quot; data-col-size=&quot;sm&quot;&gt;ASM, RMAN, Data Guard 등 연계&lt;/td&gt;
&lt;td data-end=&quot;2291&quot; data-start=&quot;2274&quot; data-col-size=&quot;sm&quot;&gt;외부 스토리지 별도 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2334&quot; data-start=&quot;2292&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2300&quot; data-start=&quot;2292&quot;&gt;권한 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2315&quot; data-start=&quot;2300&quot;&gt;DB 권한 체계로 통합&lt;/td&gt;
&lt;td data-end=&quot;2334&quot; data-start=&quot;2315&quot; data-col-size=&quot;sm&quot;&gt;OS/NAS 별도 관리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2372&quot; data-start=&quot;2335&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2340&quot; data-start=&quot;2335&quot;&gt;백업&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2360&quot; data-start=&quot;2340&quot;&gt;RMAN 등으로 통합 백업 가능&lt;/td&gt;
&lt;td data-end=&quot;2372&quot; data-start=&quot;2360&quot; data-col-size=&quot;sm&quot;&gt;별도 백업 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2421&quot; data-start=&quot;2373&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2383&quot; data-start=&quot;2373&quot;&gt;마운트 편의성&lt;/td&gt;
&lt;td data-end=&quot;2403&quot; data-start=&quot;2383&quot; data-col-size=&quot;sm&quot;&gt;POSIX 파일 인터페이스 제공&lt;/td&gt;
&lt;td data-end=&quot;2421&quot; data-start=&quot;2403&quot; data-col-size=&quot;sm&quot;&gt;일반 파일 공유 방식 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2476&quot; data-start=&quot;2423&quot; data-ke-size=&quot;size16&quot;&gt;  Exadata 환경에서는 NAS보다 DBFS가 성능&amp;middot;관리성 면에서 우수한 경우가 많습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2481&quot; data-start=&quot;2478&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2505&quot; data-start=&quot;2483&quot; data-ke-size=&quot;size26&quot;&gt;⚠️ 6. DBFS 사용 시 주의점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2627&quot; data-start=&quot;2507&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2551&quot; data-start=&quot;2507&quot;&gt;  DB 내부에 파일이 저장되므로 &lt;b&gt;DB 저장소 용량 관리&lt;/b&gt;가 중요&lt;/li&gt;
&lt;li data-end=&quot;2584&quot; data-start=&quot;2552&quot;&gt;⚡ 대량 병렬 적재 시 IOPS 부하를 고려해야 함&lt;/li&gt;
&lt;li data-end=&quot;2627&quot; data-start=&quot;2585&quot;&gt;  DB 사용자 권한 체계와 잘 맞춰야 함 (파일 접근 = DB 권한)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2632&quot; data-start=&quot;2629&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2644&quot; data-start=&quot;2634&quot; data-ke-size=&quot;size26&quot;&gt;✅ 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2872&quot; data-start=&quot;2646&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2872&quot; data-start=&quot;2674&quot;&gt;
&lt;tr data-end=&quot;2709&quot; data-start=&quot;2674&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2685&quot; data-start=&quot;2674&quot;&gt;  DBFS란&lt;/td&gt;
&lt;td data-end=&quot;2709&quot; data-start=&quot;2685&quot; data-col-size=&quot;sm&quot;&gt;DB를 파일 시스템처럼 활용하는 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2751&quot; data-start=&quot;2710&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2721&quot; data-start=&quot;2710&quot;&gt;  저장 방식&lt;/td&gt;
&lt;td data-end=&quot;2751&quot; data-start=&quot;2721&quot; data-col-size=&quot;sm&quot;&gt;SecureFile LOB으로 DB 내부에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2782&quot; data-start=&quot;2752&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2759&quot; data-start=&quot;2752&quot;&gt;⚡ 장점&lt;/td&gt;
&lt;td data-end=&quot;2782&quot; data-start=&quot;2759&quot; data-col-size=&quot;sm&quot;&gt;고성능, 고가용성, 트랜잭션 일관성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2829&quot; data-start=&quot;2783&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2791&quot; data-start=&quot;2783&quot;&gt;  활용&lt;/td&gt;
&lt;td data-end=&quot;2829&quot; data-start=&quot;2791&quot; data-col-size=&quot;sm&quot;&gt;External Table, SQL*Loader 스테이징 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2872&quot; data-start=&quot;2830&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2838&quot; data-start=&quot;2830&quot;&gt;  관리&lt;/td&gt;
&lt;td data-end=&quot;2872&quot; data-start=&quot;2838&quot; data-col-size=&quot;sm&quot;&gt;ASM, RMAN, Data Guard 등과 연계 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2946&quot; data-start=&quot;2874&quot; data-ke-size=&quot;size16&quot;&gt;  즉, DBFS를 사용하면 Exadata 내부에서 파일 적재를 &lt;b&gt;보안성&amp;middot;안정성&amp;middot;속도&lt;/b&gt; 모두 확보하면서 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3238&quot; data-start=&quot;3148&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/173</guid>
      <comments>https://aonee.tistory.com/173#entry173comment</comments>
      <pubDate>Thu, 23 Oct 2025 16:44:38 +0900</pubDate>
    </item>
    <item>
      <title>[Exadata day3] 자원 및 성능 관리 (IORM &amp;amp; 성능 튜닝 &amp;amp; Smart Scan 실행 조건 및 모니터링)</title>
      <link>https://aonee.tistory.com/172</link>
      <description>&lt;h3 data-end=&quot;633&quot; data-start=&quot;606&quot; data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;7~9장: 자원 및 성능 관리&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;790&quot; data-start=&quot;634&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;634&quot;&gt;&lt;b&gt;7장&lt;/b&gt;: I/O Resource Management (IORM) 계획 및 모니터링&lt;/li&gt;
&lt;li data-end=&quot;753&quot; data-start=&quot;687&quot;&gt;&lt;b&gt;8장&lt;/b&gt;: 성능 튜닝(PMEM/Flash, In-Memory Columnar, Latency Capping)&lt;/li&gt;
&lt;li data-end=&quot;790&quot; data-start=&quot;754&quot;&gt;&lt;b&gt;9장&lt;/b&gt;: Smart Scan 실행 조건 및 모니터링 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;오늘 배운 내용 요약정리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;7장: I/O Resource Management (IORM) 계획 및 모니터링&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;br /&gt;IORM ?&lt;br /&gt;I/O Resource Management&lt;br /&gt;  여러 종류의 워크로드(Workload)가 하나의 Exadata 환경을 공유할 때&lt;br /&gt;* 워크로드 (EX) 1. OLTP (온라인 트랜잭션) 2.분석(Reporting) 3.ETL (배치 작업) 4.테스트 및 개발&lt;br /&gt;  동시에 I/O를 요청하면 발생하는 경쟁에서,&lt;br /&gt;각 워크로드에 공정하고 예측 가능한 I/O 자원 할당을 보장하는 핵심 기술&lt;br /&gt;즉, 중요한 워크로드에 우선순위를 부여하거나, 비율대로 자원을 나누는 역할을 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;예를 들어, 하나의 Exadata에 아래와 같은 워크로드가 있다고 해봅시다 &lt;/b&gt;&lt;br /&gt;DB1: OLTP / Reporting&lt;br /&gt;DB2: ETL / Batch&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IORM Category Plan 예시:&lt;/b&gt;&lt;br /&gt;Category Interactive (OLTP, Reporting) &amp;rarr; 70%&lt;br /&gt;Category Batch (ETL) &amp;rarr; 30%&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IORM 동작:&lt;/b&gt;&lt;br /&gt;총&amp;nbsp;I/O&amp;nbsp;자원&amp;nbsp;100%&amp;nbsp;중&amp;nbsp;Interactive&amp;nbsp;Category&amp;nbsp;&amp;rarr;&amp;nbsp;70%&amp;nbsp;우선 배정&amp;nbsp;Batch&amp;nbsp;Category&amp;nbsp;&amp;rarr;&amp;nbsp;30%&amp;nbsp;배정&lt;br /&gt;  OLTP 요청이 몰릴 경우, IORM이 자동으로 Batch의 I/O를 제한하고 OLTP에 우선순위를 줍니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IORM 핵심 개념 요소&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Workload ?&lt;br /&gt;데이터베이스에서 실행되는 작업 (OLTP, Batch, ETL 등)&lt;br /&gt;Consumer Group ? &lt;br /&gt;특정 워크로드를 묶어 관리하는 그룹 (DB 내부 단위)&lt;br /&gt;Category ? &lt;br /&gt;여러 DB에 걸친 Consumer Group을 묶는 상위 단위 (IORM 단위)&lt;br /&gt;Resource Plan ?&lt;br /&gt;자원 할당 정책 (비율, 우선순위 등) 정의&lt;br /&gt;Objective ? &lt;br /&gt;IORM이 자원을 관리하는 목표 모드 (basic, auto, balanced, low_latency 등)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;8장 성능 최적화.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;성능 최적화(Performance Optimization) 시 고려해야 할 핵심 영역&lt;/b&gt;&lt;br /&gt;&lt;b&gt;PMEM&lt;/b&gt; 초저지연 읽기 성능 향상 OLTP 속도 &amp;uarr;&lt;br /&gt;&lt;b&gt;Flash Cache&lt;/b&gt; 핫데이터 캐싱 디스크 I/O 감소 &lt;br /&gt;&lt;b&gt;In-memory Cache&lt;/b&gt; Column Store DW 분석 속도 &amp;uarr; &lt;br /&gt;&lt;b&gt;Compression&lt;/b&gt; Hybrid Columnar Compression 공간 절감 + I/O 절감 &lt;br /&gt;&lt;b&gt;Index&lt;/b&gt; 전략적 최소화 불필요한 오버헤드 제거 &lt;br /&gt;&lt;b&gt;ASM 설정&lt;/b&gt; AU/Extent 조정 I/O 효율 최적화 &lt;br /&gt;&lt;b&gt;시스템 통계&lt;/b&gt; Exadata 전용 지표 모니터링 병목 정확히 파악 &lt;br /&gt;&lt;b&gt;Timeout 설정&lt;/b&gt; 환경별 튜닝 장애 감지 및 안정성 확보&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PMEM Cache Mode 종류&lt;/b&gt;&lt;br /&gt;  Write-Through&lt;br /&gt;(기본/권장)데이터가 PMEM과 Flash/HDD에 동시에 기록됨안정성 높음, 데이터 유실 위험 없음대부분의 운영 환경&lt;br /&gt;  Write-Back&lt;br /&gt;고성능 모드먼저 PMEM에 쓰고 나중에 Flash/HDD로 내림응답속도 향상, 장애 시 데이터 손실 위험 있음성능 테스트나 극단적 저지연이 필요한 경우&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;9장 스마트 스캔 실행조건 및 모니터링 방법&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Smart Scan ?&lt;/b&gt; &lt;br /&gt;Exadata의 스토리지 오프로딩(Storage Offload) 기능&lt;br /&gt;  스캔 작업을 DB 서버가 아니라 스토리지 셀에서 처리하여&lt;br /&gt;  네트워크 트래픽을 줄이고, 쿼리 성능을 획기적으로 높이는 기능&lt;br /&gt;&lt;br /&gt;그런데 아&lt;b&gt;래와 같은 상황에서는 Smart Scan이 비활성화&lt;/b&gt;되어 전통적인 블록 기반 I/O로 처리되기 때문에 성능 향상을 기대할 수 없다.&lt;br /&gt;1. Clustered Table &lt;br /&gt;스캔 클러스터 테이블은 저장 구조가 일반 테이블과 달라서 스토리지 셀에서 효율적 오프로딩 불가 &lt;br /&gt;2. Index-Organized Table(IOT) &lt;br /&gt;데이터가 인덱스에 직접 저장되는 구조라 Smart Scan 대상이 아님 &lt;br /&gt;3. 압축 인덱스의 Fast Full Scan &lt;br /&gt;스토리지 셀에서 압축 인덱스를 해제하며 스캔하는 기능 미지원 &lt;br /&gt;4. Reverse Key Index Fast Full Scan &lt;br /&gt;Reverse Key는 정렬 순서가 뒤섞여 있어 스토리지에서 순차 스캔 불가능&lt;br /&gt;5. Row-level dependency tracking활성화된 테이블 &lt;br /&gt;내부적인 추가 메타데이터 관리로 오프로딩 불가능 &lt;br /&gt;6. ROWID 순서로 결과 반환 &lt;br /&gt;정렬 순서를 보장하기 위해 블록 단위 전송 필요 &lt;br /&gt;7. CREATE INDEX ... NOSORT &lt;br /&gt;인덱스 생성 시 기존 데이터 정렬 유지로 Direct Path Read 미발생 &lt;br /&gt;8. LOB / LONG 컬럼이 포함된 쿼리&lt;br /&gt;LOB/LONG은 Smart Scan 대상에서 제외됨 (길이가 크고 처리 방식 다름) &lt;br /&gt;9. Flashback Versions Query 사용 시 &lt;br /&gt;Undo 데이터 접근 필요로 스토리지 오프로딩 불가 &lt;br /&gt;10. 255개 초과 컬럼 참조 &lt;br /&gt;Smart Scan의 최대 컬럼 처리 제한 초과 &lt;br /&gt;11. Tablespace가 암호화되어 있고, 셀 기반 복호화가 비활성화된 경우&lt;br /&gt;DB 서버에서 복호화를 해야 하므로 Smart Scan 불가 &lt;br /&gt;12. Virtual Column 기반 Predicate 사용 &lt;br /&gt;가상 컬럼은 스토리지 셀에서 계산 불가(논리식 평가 필요)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;모니터링 스마트 스캔 ?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;V$SESSION_EVENT 세션단위로 스마트스캔이 일어났는지 확인 불가&lt;br /&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;v$system_event&lt;/b&gt; &lt;/span&gt;시스템 단위로 스마트스캔 일어났는지 확은 가능함&lt;br /&gt;but, 확인 방법은 처음 실행 후 다시 실행했을 때 스마트 스캔이 일어났는지 확인함&lt;br /&gt;6216 -&amp;gt; 6509 아, 스마트스캔 실행됐구나 확인가능함&lt;br /&gt;아니면 트레이스파일로 마스터프로세스랑 슬래이브프로세스가 실행한 걸 확인하여 알 수도 있음&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;I/O&amp;nbsp;Resource&amp;nbsp;Management&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qf3Zq/dJMb9WZJH9j/5s1hI2RBadokj4DhlV33rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qf3Zq/dJMb9WZJH9j/5s1hI2RBadokj4DhlV33rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qf3Zq/dJMb9WZJH9j/5s1hI2RBadokj4DhlV33rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqf3Zq%2FdJMb9WZJH9j%2F5s1hI2RBadokj4DhlV33rK%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;532&quot; height=&quot;328&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;328&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-end=&quot;136&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;**I/O Resource Management(IORM)**가 왜 중요한지를 이해하는 핵심 개념입니다.&lt;/p&gt;
&lt;p data-end=&quot;271&quot; data-start=&quot;138&quot; data-ke-size=&quot;size16&quot;&gt;즉, **스토리지를 여러 데이터베이스와 워크로드가 공유(Shared Storage)**할 때의&lt;br /&gt;✅ 장점과 ⚠️ 단점을 설명하고, 왜 &lt;b&gt;IORM이 필수적인 관리 도구인지&lt;/b&gt; 연결되는 주제입니다.&lt;/p&gt;
&lt;hr data-end=&quot;276&quot; data-start=&quot;273&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;303&quot; data-start=&quot;278&quot; data-ke-size=&quot;size26&quot;&gt;  1. Shared Storage란?&lt;/h2&gt;
&lt;blockquote data-end=&quot;363&quot; data-start=&quot;305&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;363&quot; data-start=&quot;307&quot; data-ke-size=&quot;size16&quot;&gt;  여러 데이터베이스(혹은 여러 워크로드)가 &lt;b&gt;동일한 스토리지 시스템&lt;/b&gt;을 공유하여 사용하는 구조&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;426&quot; data-start=&quot;365&quot; data-ke-size=&quot;size16&quot;&gt;Exadata 환경에서는 DB 서버 여러 개가 하나의 스토리지 셀 풀(Pool)을 공유하는 게 일반적입니다 &lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;[DB1]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;[DB2]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;[DB3]&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;span&gt;+ | &lt;/span&gt;&lt;span&gt;&lt;span&gt;Shared&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Exadata&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | | &lt;/span&gt;&lt;span&gt;&lt;span&gt;Storage&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Servers&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;span&gt;+ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;587&quot; data-start=&quot;584&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;623&quot; data-start=&quot;589&quot; data-ke-size=&quot;size26&quot;&gt;  2. Shared Storage의 주요 &lt;b&gt;장점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;653&quot; data-start=&quot;625&quot; data-ke-size=&quot;size23&quot;&gt;✅ (1) &lt;b&gt;스토리지 자원 활용도 향상&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;784&quot; data-start=&quot;654&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;712&quot; data-start=&quot;654&quot;&gt;하나의 DB만 사용하는 전용 스토리지일 경우 &amp;rarr; &lt;b&gt;최대 피크 용량 기준으로 과다 설계&lt;/b&gt;해야 함&lt;/li&gt;
&lt;li data-end=&quot;742&quot; data-start=&quot;713&quot;&gt;하지만 실제 사용량은 들쭉날쭉 &amp;rarr; 자원 낭비 발생&lt;/li&gt;
&lt;li data-end=&quot;784&quot; data-start=&quot;743&quot;&gt;공유 스토리지를 사용하면, &lt;b&gt;여유 자원을 다른 DB가 활용&lt;/b&gt; 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;792&quot; data-start=&quot;786&quot; data-ke-size=&quot;size16&quot;&gt;  예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;883&quot; data-start=&quot;793&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;812&quot; data-start=&quot;793&quot;&gt;DB1이 오전에만 트래픽이 몰림&lt;/li&gt;
&lt;li data-end=&quot;832&quot; data-start=&quot;813&quot;&gt;DB2는 오후에만 트래픽이 있음&lt;/li&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;833&quot;&gt;하나의 스토리지 풀에서 DB1, DB2가 자원을 시간대별로 나눠 쓰면 더 효율적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;888&quot; data-start=&quot;885&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;917&quot; data-start=&quot;890&quot; data-ke-size=&quot;size23&quot;&gt;✅ (2) &lt;b&gt;운영 및 관리 비용 절감&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1012&quot; data-start=&quot;918&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;946&quot; data-start=&quot;918&quot;&gt;스토리지 시스템을 DB마다 따로 둘 필요가 없음&lt;/li&gt;
&lt;li data-end=&quot;982&quot; data-start=&quot;947&quot;&gt;유지보수 대상 장비 수가 줄어듦 &amp;rarr; 관리 인력 및 비용 절감&lt;/li&gt;
&lt;li data-end=&quot;1012&quot; data-start=&quot;983&quot;&gt;자원 풀링(Pooling)으로 향후 확장성도 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1017&quot; data-start=&quot;1014&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1052&quot; data-start=&quot;1019&quot; data-ke-size=&quot;size26&quot;&gt;⚠️ 3. Shared Storage의 단점 및 문제점&lt;/h2&gt;
&lt;p data-end=&quot;1096&quot; data-start=&quot;1054&quot; data-ke-size=&quot;size16&quot;&gt;공유 환경은 자원 효율성을 높이는 대신, &lt;b&gt;경쟁&lt;/b&gt;이 발생할 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1139&quot; data-start=&quot;1098&quot; data-ke-size=&quot;size23&quot;&gt;⚡ (1) 워크로드 간 간섭 (Resource Contention)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1201&quot; data-start=&quot;1140&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1201&quot; data-start=&quot;1140&quot;&gt;한 DB에서 대규모 병렬 쿼리가 실행되면,&lt;br /&gt;다른 DB의 중요한 트랜잭션 성능이 급격히 떨어질 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1209&quot; data-start=&quot;1203&quot; data-ke-size=&quot;size16&quot;&gt;  예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1299&quot; data-start=&quot;1210&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1244&quot; data-start=&quot;1210&quot;&gt;DB1: 대형 보고서 쿼리 (Full Table Scan)&lt;/li&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1245&quot;&gt;DB2: 실시간 주문 트랜잭션&lt;br /&gt;&amp;rarr; DB1이 I/O를 독점하면 DB2의 응답 속도가 느려짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1304&quot; data-start=&quot;1301&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1334&quot; data-start=&quot;1306&quot; data-ke-size=&quot;size23&quot;&gt;⚡ (2) 워크로드 간 우선순위 조정 어려움&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1445&quot; data-start=&quot;1335&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1368&quot; data-start=&quot;1335&quot;&gt;수작업으로 스케줄링하거나 시간대를 나눠야 하는 경우 발생&lt;/li&gt;
&lt;li data-end=&quot;1445&quot; data-start=&quot;1369&quot;&gt;특히 &lt;b&gt;관리자가 여러 명&lt;/b&gt;일 경우 조율이 쉽지 않음
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1445&quot; data-start=&quot;1404&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1422&quot; data-start=&quot;1404&quot;&gt;&amp;ldquo;나는 분석 작업 해야 한다&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1445&quot; data-start=&quot;1425&quot;&gt;&amp;ldquo;나는 서비스 트랜잭션이 먼저다&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1494&quot; data-start=&quot;1447&quot; data-ke-size=&quot;size16&quot;&gt;  이로 인해 피크 시간대에는 성능 병목(bottleneck)이 빈번히 발생합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1499&quot; data-start=&quot;1496&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1542&quot; data-start=&quot;1501&quot; data-ke-size=&quot;size23&quot;&gt;⚡ (3) 과잉 프로비저닝(Over-Provisioning)의 유혹&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1626&quot; data-start=&quot;1543&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1579&quot; data-start=&quot;1543&quot;&gt;문제를 해결하기 위해 스토리지를 더 크게 구축하는 경우가 많음&lt;/li&gt;
&lt;li data-end=&quot;1626&quot; data-start=&quot;1580&quot;&gt;하지만 이건 결국 **공유의 장점(비용 절감)**을 무력화시키는 결과가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1631&quot; data-start=&quot;1628&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1660&quot; data-start=&quot;1633&quot; data-ke-size=&quot;size26&quot;&gt;  4. IORM이 필요한 이유 (해결책)&lt;/h2&gt;
&lt;p data-end=&quot;1734&quot; data-start=&quot;1662&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle I/O Resource Manager&lt;/span&gt; (IORM)은 바로 위의 문제를 해결하기 위해 설계되었습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;문제IORM 해결 방식
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1972&quot; data-start=&quot;1736&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1972&quot; data-start=&quot;1782&quot;&gt;
&lt;tr data-end=&quot;1841&quot; data-start=&quot;1782&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1800&quot; data-start=&quot;1782&quot;&gt;특정 워크로드가 I/O 독점&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1841&quot; data-start=&quot;1800&quot;&gt;Consumer Group / Category 기반 자원 비율 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1891&quot; data-start=&quot;1842&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1857&quot; data-start=&quot;1842&quot;&gt;워크로드 우선순위 충돌&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1891&quot; data-start=&quot;1857&quot;&gt;Priority 설정으로 중요한 워크로드에 우선권 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1934&quot; data-start=&quot;1892&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1904&quot; data-start=&quot;1892&quot;&gt;피크 시간대 충돌&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1934&quot; data-start=&quot;1904&quot;&gt;Category Plan을 통해 자동 자원 분배&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1972&quot; data-start=&quot;1935&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1946&quot; data-start=&quot;1935&quot;&gt;관리자 간 충돌&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1972&quot; data-start=&quot;1946&quot;&gt;정책 기반으로 자동화, 수동 조율 최소화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;1974&quot; data-ke-size=&quot;size16&quot;&gt;  예를 들어, OLTP 업무에 높은 우선순위를 부여하고, ETL이나 Batch는 남는 자원만 사용하게 설정 가능.&lt;/p&gt;
&lt;hr data-end=&quot;2044&quot; data-start=&quot;2041&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2082&quot; data-start=&quot;2046&quot; data-ke-size=&quot;size26&quot;&gt;  5. 예시: IORM Category Plan으로 해결&lt;/h2&gt;
&lt;p data-end=&quot;2115&quot; data-start=&quot;2084&quot; data-ke-size=&quot;size16&quot;&gt;두 개의 DB가 공유 스토리지에서 운영 중이라고 가정 &lt;/p&gt;
&lt;div&gt;
&lt;div&gt;DB워크로드Category비중
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2261&quot; data-start=&quot;2117&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2261&quot; data-start=&quot;2182&quot;&gt;
&lt;tr data-end=&quot;2220&quot; data-start=&quot;2182&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2188&quot; data-start=&quot;2182&quot;&gt;DB1&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2199&quot; data-start=&quot;2188&quot;&gt;실시간 OLTP&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2213&quot; data-start=&quot;2199&quot;&gt;Interactive&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2220&quot; data-start=&quot;2213&quot;&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2261&quot; data-start=&quot;2221&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2227&quot; data-start=&quot;2221&quot;&gt;DB2&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2239&quot; data-start=&quot;2227&quot;&gt;Batch 분석&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2254&quot; data-start=&quot;2239&quot;&gt;Batch&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2261&quot; data-start=&quot;2254&quot;&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2281&quot; data-start=&quot;2263&quot; data-ke-size=&quot;size16&quot;&gt;IORM 설정 (CellCLI):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; alter iormplan objective=auto cellcli&amp;gt; add iormcategory name=Interactive, level=1, allocation=70 cellcli&amp;gt; add iormcategory name=Batch, level=2, allocation=30 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2524&quot; data-start=&quot;2462&quot; data-ke-size=&quot;size16&quot;&gt;  피크 시간대에 OLTP가 몰려도 DB2는 자원을 뺏기지 않고 &lt;b&gt;설정된 범위 내에서만 사용&lt;/b&gt;하게 됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;2529&quot; data-start=&quot;2526&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2572&quot; data-start=&quot;2531&quot; data-ke-size=&quot;size26&quot;&gt;  6. Shared Storage + IORM = 균형 잡힌 구조&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목IORM 적용 전IORM 적용 후
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3091&quot; data-start=&quot;2574&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3091&quot; data-start=&quot;2771&quot;&gt;
&lt;tr data-end=&quot;2848&quot; data-start=&quot;2771&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2800&quot; data-start=&quot;2771&quot;&gt;성능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2820&quot; data-start=&quot;2800&quot;&gt;비정상적 워크로드에 의해 흔들림&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2848&quot; data-start=&quot;2820&quot;&gt;안정적, 우선순위 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2932&quot; data-start=&quot;2849&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2876&quot; data-start=&quot;2849&quot;&gt;자원 사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2902&quot; data-start=&quot;2876&quot;&gt;비효율적 / 편중됨&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2932&quot; data-start=&quot;2902&quot;&gt;공정하게 분배됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3013&quot; data-start=&quot;2933&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2960&quot; data-start=&quot;2933&quot;&gt;관리 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2984&quot; data-start=&quot;2960&quot;&gt;수작업, 시간대 분리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3013&quot; data-start=&quot;2984&quot;&gt;자동 정책 기반 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3091&quot; data-start=&quot;3014&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3043&quot; data-start=&quot;3014&quot;&gt;비용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3067&quot; data-start=&quot;3043&quot;&gt;과잉 투자 유도 가능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3091&quot; data-start=&quot;3067&quot;&gt;최소 자원으로 최적 활용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3096&quot; data-start=&quot;3093&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3108&quot; data-start=&quot;3098&quot; data-ke-size=&quot;size26&quot;&gt;✅ 7. 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3339&quot; data-start=&quot;3110&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3198&quot; data-start=&quot;3110&quot;&gt;  &lt;b&gt;Shared Storage&lt;/b&gt;는 자원 효율성과 관리비 절감이라는 장점이 있지만,&lt;br /&gt;⚡ &lt;b&gt;워크로드 충돌&lt;/b&gt;이라는 구조적 리스크가 존재합니다.&lt;/li&gt;
&lt;li data-end=&quot;3261&quot; data-start=&quot;3199&quot;&gt;⚙️ &lt;b&gt;IORM&lt;/b&gt;은 이러한 충돌을 자동으로 관리하고, 우선순위 기반 자원 분배를 통해 성능을 보장합니다.&lt;/li&gt;
&lt;li data-end=&quot;3339&quot; data-start=&quot;3262&quot;&gt;  실제 운영에서는 Consumer Group + Category + CDB Resource Plan을 조합하여 유연하게 제어합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;I/O Resource Management Concepts&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VHwVf/dJMb86aetbX/xCynnUmPXDmtK1f6J1OV8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VHwVf/dJMb86aetbX/xCynnUmPXDmtK1f6J1OV8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VHwVf/dJMb86aetbX/xCynnUmPXDmtK1f6J1OV8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVHwVf%2FdJMb86aetbX%2FxCynnUmPXDmtK1f6J1OV8k%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;845&quot; height=&quot;535&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;535&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-end=&quot;197&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;I/O Resource Management (IORM)&lt;/span&gt;**는&lt;br /&gt;  여러 종류의 워크로드(Workload)가 하나의 Exadata 환경을 공유할 때&lt;br /&gt;  각 워크로드에 &lt;b&gt;공정하고 예측 가능한 I/O 자원 할당&lt;/b&gt;을 보장하는 핵심 기술입니다.&lt;/p&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;199&quot; data-ke-size=&quot;size16&quot;&gt;아래에 개념을 아주 쉽게 정리해드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;227&quot; data-start=&quot;224&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;251&quot; data-start=&quot;229&quot; data-ke-size=&quot;size26&quot;&gt;  1. 왜 IORM이 필요한가?&lt;/h2&gt;
&lt;p data-end=&quot;285&quot; data-start=&quot;253&quot; data-ke-size=&quot;size16&quot;&gt;현실의 데이터베이스 환경에는 다양한 워크로드가 공존합니다.&lt;/p&gt;
&lt;p data-end=&quot;289&quot; data-start=&quot;287&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;363&quot; data-start=&quot;290&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;313&quot; data-start=&quot;290&quot;&gt; &amp;zwj;  OLTP (온라인 트랜잭션)&lt;/li&gt;
&lt;li data-end=&quot;332&quot; data-start=&quot;314&quot;&gt;  분석(Reporting)&lt;/li&gt;
&lt;li data-end=&quot;349&quot; data-start=&quot;333&quot;&gt;  ETL (배치 작업)&lt;/li&gt;
&lt;li data-end=&quot;363&quot; data-start=&quot;350&quot;&gt;  테스트 및 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;479&quot; data-start=&quot;365&quot; data-ke-size=&quot;size16&quot;&gt;  이런 워크로드가 동시에 I/O를 요청하면 &lt;b&gt;경쟁이 발생&lt;/b&gt;합니다.&lt;br /&gt;  IORM은 이 경쟁 상황에서 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;중요한 워크로드에 우선순위를 부여&lt;/b&gt;하거나, &lt;b&gt;비율대로 자원을 나누는&lt;/b&gt; 역할&lt;/span&gt;을 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;484&quot; data-start=&quot;481&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;508&quot; data-start=&quot;486&quot; data-ke-size=&quot;size26&quot;&gt;  2. IORM 핵심 개념 요소&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;개념설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;851&quot; data-start=&quot;510&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;851&quot; data-start=&quot;538&quot;&gt;
&lt;tr data-end=&quot;594&quot; data-start=&quot;538&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;553&quot; data-start=&quot;538&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Workload&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;594&quot; data-start=&quot;553&quot; data-col-size=&quot;md&quot;&gt;데이터베이스에서 실행되는 작업&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; (OLTP, Batch, ETL 등)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;650&quot; data-start=&quot;595&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;616&quot; data-start=&quot;595&quot;&gt;&lt;b&gt;Consumer Group&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;650&quot; data-start=&quot;616&quot; data-col-size=&quot;md&quot;&gt;특정 워크로드를 묶어 관리하는 그룹 (DB 내부 단위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;714&quot; data-start=&quot;651&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;666&quot; data-start=&quot;651&quot;&gt;&lt;b&gt;Category&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;714&quot; data-start=&quot;666&quot; data-col-size=&quot;md&quot;&gt;여러 DB에 걸친 Consumer Group을 묶는 상위 단위 (IORM 단위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;763&quot; data-start=&quot;715&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;735&quot; data-start=&quot;715&quot;&gt;&lt;b&gt;Resource Plan&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;763&quot; data-start=&quot;735&quot; data-col-size=&quot;md&quot;&gt;자원 할당 정책 (비율, 우선순위 등) 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;851&quot; data-start=&quot;764&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;780&quot; data-start=&quot;764&quot;&gt;&lt;b&gt;Objective&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;851&quot; data-start=&quot;780&quot; data-col-size=&quot;md&quot;&gt;IORM이 자원을 관리하는 목표 모드 (basic, auto, balanced, low_latency 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;856&quot; data-start=&quot;853&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;891&quot; data-start=&quot;858&quot; data-ke-size=&quot;size26&quot;&gt;  3. Consumer Group과 Category&lt;/h2&gt;
&lt;h3 data-end=&quot;914&quot; data-start=&quot;893&quot; data-ke-size=&quot;size23&quot;&gt;  Consumer Group&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;987&quot; data-start=&quot;915&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;940&quot; data-start=&quot;915&quot;&gt;데이터베이스 내에서 특정 워크로드를 그룹화&lt;/li&gt;
&lt;li data-end=&quot;987&quot; data-start=&quot;941&quot;&gt;예: OLTP_GROUP, REPORT_GROUP, ETL_GROUP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1004&quot; data-start=&quot;989&quot; data-ke-size=&quot;size23&quot;&gt;  Category&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1094&quot; data-start=&quot;1005&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1045&quot; data-start=&quot;1005&quot;&gt;여러 DB의 Consumer Group을 &lt;b&gt;카테고리 단위로 통합&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1094&quot; data-start=&quot;1046&quot;&gt;예: Interactive (OLTP 중심), Batch (야간 배치 중심)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1149&quot; data-start=&quot;1096&quot; data-ke-size=&quot;size16&quot;&gt;  이를 통해 Exadata는 &lt;b&gt;DB 간에도&lt;/b&gt; 자원을 우선순위에 따라 배분할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1154&quot; data-start=&quot;1151&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1182&quot; data-start=&quot;1156&quot; data-ke-size=&quot;size26&quot;&gt;  4. Resource Plan의 종류&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;계획 유형대상설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1493&quot; data-start=&quot;1184&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1493&quot; data-start=&quot;1261&quot;&gt;
&lt;tr data-end=&quot;1322&quot; data-start=&quot;1261&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1288&quot; data-start=&quot;1261&quot;&gt;&lt;b&gt;Intradatabase Plan&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1322&quot; data-start=&quot;1288&quot; data-col-size=&quot;sm&quot;&gt;단일 DB 내 Consumer Group 간 자원 배분&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1372&quot; data-start=&quot;1323&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1350&quot; data-start=&quot;1323&quot;&gt;&lt;b&gt;Interdatabase Plan&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1372&quot; data-start=&quot;1350&quot; data-col-size=&quot;sm&quot;&gt;여러 DB 인스턴스 간 자원 배분&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1430&quot; data-start=&quot;1373&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1400&quot; data-start=&quot;1373&quot;&gt;&lt;b&gt;Category Plan&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1430&quot; data-start=&quot;1400&quot; data-col-size=&quot;sm&quot;&gt;여러 DB에 걸친 Category 간 자원 배분&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1493&quot; data-start=&quot;1431&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1458&quot; data-start=&quot;1431&quot;&gt;&lt;b&gt;CDB Resource Plan&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1493&quot; data-start=&quot;1458&quot; data-col-size=&quot;sm&quot;&gt;하나의 CDB 안에서 PDB 간 자원 배분 (멀티테넌트)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1555&quot; data-start=&quot;1495&quot; data-ke-size=&quot;size16&quot;&gt;  이 네 가지 Plan은 &lt;b&gt;IORM 레벨에서 동시에 작동할 수 있으며&lt;/b&gt;, 계층적으로 영향을 미칩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1560&quot; data-start=&quot;1557&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1578&quot; data-start=&quot;1562&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 5. 작동 방식 예시&lt;/h2&gt;
&lt;p data-end=&quot;1623&quot; data-start=&quot;1580&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 하나의 Exadata에 아래와 같은 워크로드가 있다고 해봅시다 &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1667&quot; data-start=&quot;1625&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1648&quot; data-start=&quot;1625&quot;&gt;DB1: OLTP / Reporting&lt;/li&gt;
&lt;li data-end=&quot;1667&quot; data-start=&quot;1649&quot;&gt;DB2: ETL / Batch&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1691&quot; data-start=&quot;1669&quot; data-ke-size=&quot;size16&quot;&gt;IORM Category Plan 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1771&quot; data-start=&quot;1692&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1740&quot; data-start=&quot;1692&quot;&gt;Category Interactive (OLTP, Reporting) &amp;rarr; 70%&lt;/li&gt;
&lt;li data-end=&quot;1771&quot; data-start=&quot;1741&quot;&gt;Category Batch (ETL) &amp;rarr; 30%&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1781&quot; data-start=&quot;1773&quot; data-ke-size=&quot;size16&quot;&gt;IORM 동작:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;총 &lt;/span&gt;&lt;span&gt;&lt;span&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;O&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 자원 &lt;/span&gt;&lt;span&gt;&lt;span&gt;100&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;span&gt;&lt;span&gt;Interactive&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;&lt;span&gt;70&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;span&gt;&lt;span&gt;Batch&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;&lt;span&gt;30&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;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1930&quot; data-start=&quot;1867&quot; data-ke-size=&quot;size16&quot;&gt;  OLTP 요청이 몰릴 경우, IORM이 자동으로 Batch의 I/O를 제한하고 OLTP에 우선순위를 줍니다.&lt;/p&gt;
&lt;hr data-end=&quot;1935&quot; data-start=&quot;1932&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1954&quot; data-start=&quot;1937&quot; data-ke-size=&quot;size26&quot;&gt;  6. 실무 설정 예시&lt;/h2&gt;
&lt;h3 data-end=&quot;1994&quot; data-start=&quot;1956&quot; data-ke-size=&quot;size23&quot;&gt;  Category Plan 생성 및 적용 (CellCLI)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; alter iormplan objective=auto cellcli&amp;gt; alter iormplan catPlan=&lt;/span&gt;&lt;span&gt;&lt;span&gt;'cat_plan1'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; cellcli&amp;gt; add iormcategory name=Interactive, level=1, allocation=70 cellcli&amp;gt; add iormcategory name=Batch, level=2, allocation=30 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2278&quot; data-start=&quot;2219&quot; data-ke-size=&quot;size16&quot;&gt;  objective=auto는 자동으로 I/O를 분배하면서 OLTP 워크로드를 우선하는 모드입니다.&lt;/p&gt;
&lt;hr data-end=&quot;2283&quot; data-start=&quot;2280&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2301&quot; data-start=&quot;2285&quot; data-ke-size=&quot;size26&quot;&gt;  7. 모니터링 예시&lt;/h2&gt;
&lt;p data-end=&quot;2316&quot; data-start=&quot;2303&quot; data-ke-size=&quot;size16&quot;&gt;IORM Plan 확인:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; list iormplan &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2371&quot; data-start=&quot;2353&quot; data-ke-size=&quot;size16&quot;&gt;Category 사용량 모니터링:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; list metriccurrent &lt;/span&gt;&lt;span&gt;&lt;span&gt;where&lt;/span&gt;&lt;/span&gt;&lt;span&gt; objectType=&lt;/span&gt;&lt;span&gt;&lt;span&gt;'CATEGORY'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2461&quot; data-start=&quot;2441&quot; data-ke-size=&quot;size16&quot;&gt;DB Resource Plan 확인:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$rsrc_plan; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$rsrc_consumer_group; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2541&quot; data-start=&quot;2538&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2572&quot; data-start=&quot;2543&quot; data-ke-size=&quot;size26&quot;&gt;  8. IORM Objective 설정 모드&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;모드설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2807&quot; data-start=&quot;2574&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2807&quot; data-start=&quot;2627&quot;&gt;
&lt;tr data-end=&quot;2679&quot; data-start=&quot;2627&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2647&quot; data-start=&quot;2627&quot;&gt;basic&lt;/td&gt;
&lt;td data-end=&quot;2679&quot; data-start=&quot;2647&quot; data-col-size=&quot;sm&quot;&gt;IORM 비활성 상태 (모든 워크로드가 자원 공유)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2725&quot; data-start=&quot;2680&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2700&quot; data-start=&quot;2680&quot;&gt;auto&lt;/td&gt;
&lt;td data-end=&quot;2725&quot; data-start=&quot;2700&quot; data-col-size=&quot;sm&quot;&gt;자동 우선순위 및 할당 (권장 기본값)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2758&quot; data-start=&quot;2726&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2746&quot; data-start=&quot;2726&quot;&gt;balanced&lt;/td&gt;
&lt;td data-end=&quot;2758&quot; data-start=&quot;2746&quot; data-col-size=&quot;sm&quot;&gt;균형 있게 분배&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2807&quot; data-start=&quot;2759&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2779&quot; data-start=&quot;2759&quot;&gt;low_latency&lt;/td&gt;
&lt;td data-end=&quot;2807&quot; data-start=&quot;2779&quot; data-col-size=&quot;sm&quot;&gt;지연 시간 최소화에 집중 (OLTP에 적합)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2876&quot; data-start=&quot;2809&quot; data-ke-size=&quot;size16&quot;&gt;  auto 모드에서 가장 유연하게 Category / Consumer Group / CDB Plan이 작동합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2881&quot; data-start=&quot;2878&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2896&quot; data-start=&quot;2883&quot; data-ke-size=&quot;size26&quot;&gt;✅ 9. 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3186&quot; data-start=&quot;2898&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3186&quot; data-start=&quot;2926&quot;&gt;
&lt;tr data-end=&quot;2964&quot; data-start=&quot;2926&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2936&quot; data-start=&quot;2926&quot;&gt;IORM 목적&lt;/td&gt;
&lt;td data-end=&quot;2964&quot; data-start=&quot;2936&quot; data-col-size=&quot;md&quot;&gt;여러 워크로드가 공존할 때 자원 경쟁을 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3001&quot; data-start=&quot;2965&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2982&quot; data-start=&quot;2965&quot;&gt;Consumer Group&lt;/td&gt;
&lt;td data-end=&quot;3001&quot; data-start=&quot;2982&quot; data-col-size=&quot;md&quot;&gt;DB 내부에서 워크로드 구분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3035&quot; data-start=&quot;3002&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3013&quot; data-start=&quot;3002&quot;&gt;Category&lt;/td&gt;
&lt;td data-end=&quot;3035&quot; data-start=&quot;3013&quot; data-col-size=&quot;md&quot;&gt;여러 DB에 걸친 워크로드 그룹화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3113&quot; data-start=&quot;3036&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3052&quot; data-start=&quot;3036&quot;&gt;Resource Plan&lt;/td&gt;
&lt;td data-end=&quot;3113&quot; data-start=&quot;3052&quot; data-col-size=&quot;md&quot;&gt;자원 할당 정책 정의 (Intradatabase, Interdatabase, Category, CDB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3150&quot; data-start=&quot;3114&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3126&quot; data-start=&quot;3114&quot;&gt;Objective&lt;/td&gt;
&lt;td data-end=&quot;3150&quot; data-start=&quot;3126&quot; data-col-size=&quot;md&quot;&gt;관리 목표 설정 (auto 권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3186&quot; data-start=&quot;3151&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3156&quot; data-start=&quot;3151&quot;&gt;결과&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;3186&quot; data-start=&quot;3156&quot;&gt;예측 가능한 성능, 중요한 워크로드 우선 보장  &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3191&quot; data-start=&quot;3188&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;3349&quot; data-start=&quot;3193&quot; data-ke-size=&quot;size16&quot;&gt;  한 줄 요약:&lt;br /&gt;&lt;b&gt;IORM = Exadata에서 I/O 자원을 워크로드별로 공정하고 전략적으로 분배하는 엔진&lt;/b&gt;입니다.&lt;br /&gt;Consumer Group + Category + Resource Plan을 조합하면 복잡한 환경에서도 성능을 안정적으로 유지할 수 있습니다  ⚡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;I/O&amp;nbsp;Resource&amp;nbsp;Management&amp;nbsp;Plans&lt;/span&gt;&lt;/blockquote&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;780&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/er2t0z/dJMb9OAIcN8/0z9ZE2kGUCpsc3ZTpSA5N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/er2t0z/dJMb9OAIcN8/0z9ZE2kGUCpsc3ZTpSA5N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/er2t0z/dJMb9OAIcN8/0z9ZE2kGUCpsc3ZTpSA5N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fer2t0z%2FdJMb9OAIcN8%2F0z9ZE2kGUCpsc3ZTpSA5N1%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;780&quot; height=&quot;459&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;154&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;154&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle Exadata&lt;/span&gt;의 &lt;b&gt;I/O Resource Manager (IORM)&lt;/b&gt; 가&lt;br /&gt;어떻게 &lt;b&gt;여러 가지 방식으로 I/O 자원 할당을 관리할 수 있는지&lt;/b&gt; 설명하는 핵심 개념입니다.&lt;/p&gt;
&lt;p data-end=&quot;248&quot; data-start=&quot;156&quot; data-ke-size=&quot;size16&quot;&gt;IORM에는 &lt;b&gt;3가지 주요 접근 방식&lt;/b&gt;이 있으며,&lt;br /&gt;  각각 단독으로도 사용 가능하고,&lt;br /&gt;  상황에 따라 &lt;b&gt;조합해서 동시에 운영&lt;/b&gt;할 수도 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;273&quot; data-start=&quot;250&quot; data-ke-size=&quot;size16&quot;&gt;아래에 개념을 체계적으로 정리해드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;278&quot; data-start=&quot;275&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;302&quot; data-start=&quot;280&quot; data-ke-size=&quot;size26&quot;&gt;  1. IORM 접근 방식 개요&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;접근 방식적용 대상설정 위치목적
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;659&quot; data-start=&quot;304&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;659&quot; data-start=&quot;381&quot;&gt;
&lt;tr data-end=&quot;477&quot; data-start=&quot;381&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;403&quot; data-start=&quot;381&quot;&gt;&lt;b&gt;① Intradatabase&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;424&quot; data-start=&quot;403&quot; data-col-size=&quot;sm&quot;&gt;단일 데이터베이스 내부의 워크로드&lt;/td&gt;
&lt;td data-end=&quot;446&quot; data-start=&quot;424&quot; data-col-size=&quot;sm&quot;&gt;DB Resource Manager&lt;/td&gt;
&lt;td data-end=&quot;477&quot; data-start=&quot;446&quot; data-col-size=&quot;sm&quot;&gt;워크로드(OLTP, Batch 등) 간 자원 배분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;552&quot; data-start=&quot;478&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;500&quot; data-start=&quot;478&quot;&gt;&lt;b&gt;② Interdatabase&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;514&quot; data-start=&quot;500&quot; data-col-size=&quot;sm&quot;&gt;여러 데이터베이스 간&lt;/td&gt;
&lt;td data-end=&quot;539&quot; data-start=&quot;514&quot; data-col-size=&quot;sm&quot;&gt;IORM Plan (cell level)&lt;/td&gt;
&lt;td data-end=&quot;552&quot; data-start=&quot;539&quot; data-col-size=&quot;sm&quot;&gt;DB별 자원 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;659&quot; data-start=&quot;553&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;570&quot; data-start=&quot;553&quot;&gt;&lt;b&gt;③ Category&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;597&quot; data-start=&quot;570&quot; data-col-size=&quot;sm&quot;&gt;여러 DB에 걸친 공통 workload 유형&lt;/td&gt;
&lt;td data-end=&quot;622&quot; data-start=&quot;597&quot; data-col-size=&quot;sm&quot;&gt;IORM Plan (cell level)&lt;/td&gt;
&lt;td data-end=&quot;659&quot; data-start=&quot;622&quot; data-col-size=&quot;sm&quot;&gt;업무 카테고리(OLTP/Report/ETL 등)별 자원 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;664&quot; data-start=&quot;661&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;710&quot; data-start=&quot;666&quot; data-ke-size=&quot;size26&quot;&gt;  2. ① Intradatabase Resource Management&lt;/h2&gt;
&lt;blockquote data-end=&quot;757&quot; data-start=&quot;712&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;714&quot; data-ke-size=&quot;size16&quot;&gt;  하나의 데이터베이스 안에서 &lt;b&gt;여러 workload&lt;/b&gt;를 제어할 때 사용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;761&quot; data-start=&quot;759&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;847&quot; data-start=&quot;762&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;803&quot; data-start=&quot;762&quot;&gt;한 DB 안에 OLTP, Reporting, ETL 작업이 동시에 실행&lt;/li&gt;
&lt;li data-end=&quot;847&quot; data-start=&quot;804&quot;&gt;OLTP가 우선이므로 더 많은 I/O 비중을 부여하고, 나머지 작업은 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;852&quot; data-start=&quot;849&quot; data-ke-size=&quot;size16&quot;&gt;구성:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;947&quot; data-start=&quot;853&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;907&quot; data-start=&quot;853&quot;&gt;Consumer Group 생성 (ex. OLTP_GROUP, REPORT_GROUP)&lt;/li&gt;
&lt;li data-end=&quot;936&quot; data-start=&quot;908&quot;&gt;DB Resource Manager로 비중 설정&lt;/li&gt;
&lt;li data-end=&quot;947&quot; data-start=&quot;937&quot;&gt;Plan 활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;949&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DBMS_RESOURCE_MANAGER.CREATE_PLAN(&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP_PLAN'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'Plan for OLTP vs Reporting'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP_GROUP'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP Workload'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(&lt;/span&gt;&lt;span&gt;&lt;span&gt;'REPORT_GROUP'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'Reporting Workload'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP_PLAN'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP_GROUP'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,cpu_p1&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP_PLAN'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;'REPORT_GROUP'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,cpu_p1&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SYSTEM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; RESOURCE_MANAGER_PLAN&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;'OLTP_PLAN'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1494&quot; data-start=&quot;1442&quot; data-ke-size=&quot;size16&quot;&gt;  Intradatabase는 &lt;b&gt;단일 DB 환경&lt;/b&gt;에서 가장 기본적으로 쓰이는 방식입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1499&quot; data-start=&quot;1496&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1545&quot; data-start=&quot;1501&quot; data-ke-size=&quot;size26&quot;&gt;  3. ② Interdatabase Resource Management&lt;/h2&gt;
&lt;blockquote data-end=&quot;1608&quot; data-start=&quot;1547&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1608&quot; data-start=&quot;1549&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;여러 개의 데이터베이스&lt;/b&gt;가 하나의 Exadata 스토리지를 공유할 때, DB별 자원 할당을 제어&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1612&quot; data-start=&quot;1610&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1697&quot; data-start=&quot;1613&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1661&quot; data-start=&quot;1613&quot;&gt;Exadata 한 대에 DB1(OLTP)와 DB2(DW)가 함께 올라가 있음&lt;/li&gt;
&lt;li data-end=&quot;1697&quot; data-start=&quot;1662&quot;&gt;OLTP가 우선이므로 DB1에 70%, DB2에 30% 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1702&quot; data-start=&quot;1699&quot; data-ke-size=&quot;size16&quot;&gt;구성:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1758&quot; data-start=&quot;1703&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1734&quot; data-start=&quot;1703&quot;&gt;IORMPLAN에서 DB별 directive 정의&lt;/li&gt;
&lt;li data-end=&quot;1758&quot; data-start=&quot;1735&quot;&gt;Interdatabase Plan 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1773&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;예시 (CellCLI):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; ALTER IORMPLAN OBJECTIVE=auto cellcli&amp;gt; ADD IORMDBPLAN DBNAME=DB1, ALLOCATION=70 cellcli&amp;gt; ADD IORMDBPLAN DBNAME=DB2, ALLOCATION=30 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1967&quot; data-start=&quot;1926&quot; data-ke-size=&quot;size16&quot;&gt;  이 방식은 데이터베이스 단위로 자원을 공정하게 나누는 역할을 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1972&quot; data-start=&quot;1969&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2013&quot; data-start=&quot;1974&quot; data-ke-size=&quot;size26&quot;&gt;  4. ③ Category Resource Management&lt;/h2&gt;
&lt;blockquote data-end=&quot;2056&quot; data-start=&quot;2015&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2056&quot; data-start=&quot;2017&quot; data-ke-size=&quot;size16&quot;&gt;  **워크로드의 성격(카테고리)**에 따라 자원을 나누는 고급 기능&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2060&quot; data-start=&quot;2058&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2152&quot; data-start=&quot;2061&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2116&quot; data-start=&quot;2061&quot;&gt;모든 DB에서 OLTP / REPORT / MAINTENANCE 세 가지 workload가 있음&lt;/li&gt;
&lt;li data-end=&quot;2152&quot; data-start=&quot;2117&quot;&gt;OLTP가 가장 중요 &amp;rarr; Category별로 자원 비중 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2154&quot; data-ke-size=&quot;size16&quot;&gt;구성:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2224&quot; data-start=&quot;2158&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2190&quot; data-start=&quot;2158&quot;&gt;각 Consumer Group을 Category에 매핑&lt;/li&gt;
&lt;li data-end=&quot;2224&quot; data-start=&quot;2191&quot;&gt;Category Plan에서 Category별 비중 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2239&quot; data-start=&quot;2226&quot; data-ke-size=&quot;size16&quot;&gt;예시 (CellCLI):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; ALTER IORMPLAN OBJECTIVE=auto cellcli&amp;gt; ADD IORMCATEGORY NAME=OLTP, LEVEL=1, ALLOCATION=60 cellcli&amp;gt; ADD IORMCATEGORY NAME=REPORT, LEVEL=2, ALLOCATION=30 cellcli&amp;gt; ADD IORMCATEGORY NAME=MAINTENANCE, LEVEL=3, ALLOCATION=10 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2558&quot; data-start=&quot;2481&quot; data-ke-size=&quot;size16&quot;&gt;  Category Plan은 DB 간이 아니라 &lt;b&gt;업무 성격 기준&lt;/b&gt;으로 자원을 분배할 수 있어 &lt;b&gt;대규모 공유 환경&lt;/b&gt;에 유리합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2563&quot; data-start=&quot;2560&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2583&quot; data-start=&quot;2565&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 5. 3가지 방식의 조합&lt;/h2&gt;
&lt;p data-end=&quot;2629&quot; data-start=&quot;2585&quot; data-ke-size=&quot;size16&quot;&gt;IORM은 이 세 가지 방식을 &lt;b&gt;계층적으로 조합해서 작동&lt;/b&gt;시킬 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;Category Plan&lt;/span&gt;&lt;/span&gt;&lt;span&gt;] &amp;rarr; 카테고리별 우선순위 &amp;darr; [&lt;/span&gt;&lt;span&gt;&lt;span&gt;Interdatabase Plan&lt;/span&gt;&lt;/span&gt;&lt;span&gt;] &amp;rarr; DB 간 자원 분배 &amp;darr; [&lt;/span&gt;&lt;span&gt;&lt;span&gt;Intradatabase Plan&lt;/span&gt;&lt;/span&gt;&lt;span&gt;] &amp;rarr; 한 DB 내부 워크로드 분배 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2764&quot; data-start=&quot;2762&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2885&quot; data-start=&quot;2765&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2795&quot; data-start=&quot;2765&quot;&gt;Category Plan: OLTP &amp;gt; REPORT&lt;/li&gt;
&lt;li data-end=&quot;2835&quot; data-start=&quot;2796&quot;&gt;Interdatabase Plan: DB1 70% / DB2 30%&lt;/li&gt;
&lt;li data-end=&quot;2885&quot; data-start=&quot;2836&quot;&gt;Intradatabase Plan (DB1 내부): OLTP 80% / ETL 20%&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2938&quot; data-start=&quot;2887&quot; data-ke-size=&quot;size16&quot;&gt;  이렇게 하면 복잡한 멀티워크로드 환경에서도 &lt;b&gt;정교하게 자원을 통제&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2943&quot; data-start=&quot;2940&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2974&quot; data-start=&quot;2945&quot; data-ke-size=&quot;size26&quot;&gt;  6. IORM Plan 확인 및 관리 명령&lt;/h2&gt;
&lt;p data-end=&quot;2992&quot; data-start=&quot;2976&quot; data-ke-size=&quot;size16&quot;&gt;IORM Plan 상태 확인:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; list iormplan &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3055&quot; data-start=&quot;3029&quot; data-ke-size=&quot;size16&quot;&gt;현재 설정된 Category/DB별 할당 확인:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;cellcli&amp;gt; list iormplan detail &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3123&quot; data-start=&quot;3099&quot; data-ke-size=&quot;size16&quot;&gt;DB 내부 Consumer Group 확인:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$rsrc_plan; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$rsrc_consumer_group; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3203&quot; data-start=&quot;3200&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3218&quot; data-start=&quot;3205&quot; data-ke-size=&quot;size26&quot;&gt;✅ 7. 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;방식대상설정 위치장점적용 시점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3535&quot; data-start=&quot;3220&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3535&quot; data-start=&quot;3302&quot;&gt;
&lt;tr data-end=&quot;3379&quot; data-start=&quot;3302&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3318&quot; data-start=&quot;3302&quot;&gt;Intradatabase&lt;/td&gt;
&lt;td data-end=&quot;3338&quot; data-start=&quot;3318&quot; data-col-size=&quot;sm&quot;&gt;단일 DB 내부 workload&lt;/td&gt;
&lt;td data-end=&quot;3360&quot; data-start=&quot;3338&quot; data-col-size=&quot;sm&quot;&gt;DB Resource Manager&lt;/td&gt;
&lt;td data-end=&quot;3369&quot; data-start=&quot;3360&quot; data-col-size=&quot;sm&quot;&gt;간단, 유연&lt;/td&gt;
&lt;td data-end=&quot;3379&quot; data-start=&quot;3369&quot; data-col-size=&quot;sm&quot;&gt;소규모 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3448&quot; data-start=&quot;3380&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3396&quot; data-start=&quot;3380&quot;&gt;Interdatabase&lt;/td&gt;
&lt;td data-end=&quot;3406&quot; data-start=&quot;3396&quot; data-col-size=&quot;sm&quot;&gt;여러 DB 간&lt;/td&gt;
&lt;td data-end=&quot;3423&quot; data-start=&quot;3406&quot; data-col-size=&quot;sm&quot;&gt;Cell IORM Plan&lt;/td&gt;
&lt;td data-end=&quot;3436&quot; data-start=&quot;3423&quot; data-col-size=&quot;sm&quot;&gt;DB 간 공정 배분&lt;/td&gt;
&lt;td data-end=&quot;3448&quot; data-start=&quot;3436&quot; data-col-size=&quot;sm&quot;&gt;멀티 DB 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3535&quot; data-start=&quot;3449&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3460&quot; data-start=&quot;3449&quot;&gt;Category&lt;/td&gt;
&lt;td data-end=&quot;3481&quot; data-start=&quot;3460&quot; data-col-size=&quot;sm&quot;&gt;여러 DB의 공통 workload&lt;/td&gt;
&lt;td data-end=&quot;3498&quot; data-start=&quot;3481&quot; data-col-size=&quot;sm&quot;&gt;Cell IORM Plan&lt;/td&gt;
&lt;td data-end=&quot;3512&quot; data-start=&quot;3498&quot; data-col-size=&quot;sm&quot;&gt;업무 성격 기반 관리&lt;/td&gt;
&lt;td data-end=&quot;3535&quot; data-start=&quot;3512&quot; data-col-size=&quot;sm&quot;&gt;대규모, 복합 workload 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3676&quot; data-start=&quot;3537&quot; data-ke-size=&quot;size16&quot;&gt;  1개만 써도 되지만, 실무에서는 &lt;b&gt;Interdatabase + Category + Intradatabase&lt;/b&gt; 조합이 많습니다.&lt;br /&gt;  특히 금융/통신/공공기관 같이 OLTP + Batch + 분석이 동시에 도는 환경에서 빛을 발합니다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ledDj/dJMb81msEj3/TGHIIupeCgP1ckQknDuow1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ledDj/dJMb81msEj3/TGHIIupeCgP1ckQknDuow1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ledDj/dJMb81msEj3/TGHIIupeCgP1ckQknDuow1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FledDj%2FdJMb81msEj3%2FTGHIIupeCgP1ckQknDuow1%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;861&quot; height=&quot;536&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDnows/dJMb85bkfWg/XX48MNzCo0YoVsGF3665VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDnows/dJMb85bkfWg/XX48MNzCo0YoVsGF3665VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDnows/dJMb85bkfWg/XX48MNzCo0YoVsGF3665VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDnows%2FdJMb85bkfWg%2FXX48MNzCo0YoVsGF3665VK%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;833&quot; height=&quot;513&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;513&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;826&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvEVpi/dJMb9PM92CR/MpfkbsxDRq7aLVxHhaoskK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvEVpi/dJMb9PM92CR/MpfkbsxDRq7aLVxHhaoskK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvEVpi/dJMb9PM92CR/MpfkbsxDRq7aLVxHhaoskK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvEVpi%2FdJMb9PM92CR%2FMpfkbsxDRq7aLVxHhaoskK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;516&quot; data-origin-width=&quot;826&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;&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;974&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nk7re/dJMb8Y4le65/T3iAN6i05z949Rz3o6xDOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nk7re/dJMb8Y4le65/T3iAN6i05z949Rz3o6xDOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nk7re/dJMb8Y4le65/T3iAN6i05z949Rz3o6xDOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnk7re%2FdJMb8Y4le65%2FT3iAN6i05z949Rz3o6xDOK%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;974&quot; height=&quot;502&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;502&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;643&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/camhqW/dJMb9bWUMbY/AKLGBhZNpLKiXu3h0Oy1ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/camhqW/dJMb9bWUMbY/AKLGBhZNpLKiXu3h0Oy1ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/camhqW/dJMb9bWUMbY/AKLGBhZNpLKiXu3h0Oy1ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcamhqW%2FdJMb9bWUMbY%2FAKLGBhZNpLKiXu3h0Oy1ok%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;527&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3UQ3o/dJMb9j1ImYx/JPDCMuIYvFA8FhZkXLAN8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3UQ3o/dJMb9j1ImYx/JPDCMuIYvFA8FhZkXLAN8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3UQ3o/dJMb9j1ImYx/JPDCMuIYvFA8FhZkXLAN8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UQ3o%2FdJMb9j1ImYx%2FJPDCMuIYvFA8FhZkXLAN8K%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;849&quot; height=&quot;526&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;526&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;984&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyyLp/dJMb9P7sx27/S7TJb9xPoBxqosfdpHO8T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyyLp/dJMb9P7sx27/S7TJb9xPoBxqosfdpHO8T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyyLp/dJMb9P7sx27/S7TJb9xPoBxqosfdpHO8T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyyyLp%2FdJMb9P7sx27%2FS7TJb9xPoBxqosfdpHO8T1%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;984&quot; height=&quot;550&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blo7Z7/dJMb9PzC53V/jXHl8aLF7HiUUi56qnDQz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blo7Z7/dJMb9PzC53V/jXHl8aLF7HiUUi56qnDQz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blo7Z7/dJMb9PzC53V/jXHl8aLF7HiUUi56qnDQz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblo7Z7%2FdJMb9PzC53V%2FjXHl8aLF7HiUUi56qnDQz0%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;836&quot; height=&quot;476&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGqqdF/dJMb9gjCnHl/gVSanRcD20z244K9UgUgIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGqqdF/dJMb9gjCnHl/gVSanRcD20z244K9UgUgIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGqqdF/dJMb9gjCnHl/gVSanRcD20z244K9UgUgIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGqqdF%2FdJMb9gjCnHl%2FgVSanRcD20z244K9UgUgIK%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;843&quot; height=&quot;485&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kznv6/dJMb9kzyo48/wKDJ0koX3tbktmvfSx6Mq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kznv6/dJMb9kzyo48/wKDJ0koX3tbktmvfSx6Mq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kznv6/dJMb9kzyo48/wKDJ0koX3tbktmvfSx6Mq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkznv6%2FdJMb9kzyo48%2FwKDJ0koX3tbktmvfSx6Mq1%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;966&quot; height=&quot;501&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;501&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;989&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNIS4K/dJMb9VNig88/2PO4b4mYnOkiSZgE17kLOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNIS4K/dJMb9VNig88/2PO4b4mYnOkiSZgE17kLOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNIS4K/dJMb9VNig88/2PO4b4mYnOkiSZgE17kLOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNIS4K%2FdJMb9VNig88%2F2PO4b4mYnOkiSZgE17kLOK%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;989&quot; height=&quot;486&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;486&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;957&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U3hFu/dJMb9XElnr0/vDkl7XbrTXtk11171FVEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U3hFu/dJMb9XElnr0/vDkl7XbrTXtk11171FVEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U3hFu/dJMb9XElnr0/vDkl7XbrTXtk11171FVEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU3hFu%2FdJMb9XElnr0%2FvDkl7XbrTXtk11171FVEK1%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;957&quot; height=&quot;326&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qu5cm/dJMb9fLMq9g/XKqsw2eFHGlKRPQvTQpfK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qu5cm/dJMb9fLMq9g/XKqsw2eFHGlKRPQvTQpfK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qu5cm/dJMb9fLMq9g/XKqsw2eFHGlKRPQvTQpfK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQu5cm%2FdJMb9fLMq9g%2FXKqsw2eFHGlKRPQvTQpfK1%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;964&quot; height=&quot;389&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;389&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;952&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc4LfA/dJMb9fLMq9m/Yzmi01CqvUj41N7dqCH4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc4LfA/dJMb9fLMq9m/Yzmi01CqvUj41N7dqCH4Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc4LfA/dJMb9fLMq9m/Yzmi01CqvUj41N7dqCH4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc4LfA%2FdJMb9fLMq9m%2FYzmi01CqvUj41N7dqCH4Kk%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;952&quot; height=&quot;320&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;320&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;952&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l32Ag/dJMb9LxdX3a/wE4BaGhcY62YM0PTSUzA90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l32Ag/dJMb9LxdX3a/wE4BaGhcY62YM0PTSUzA90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l32Ag/dJMb9LxdX3a/wE4BaGhcY62YM0PTSUzA90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl32Ag%2FdJMb9LxdX3a%2FwE4BaGhcY62YM0PTSUzA90%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;952&quot; height=&quot;338&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;338&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;953&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deyHRr/dJMb9XElnsB/9F3GnRVJpdGZwG7dfmPNI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deyHRr/dJMb9XElnsB/9F3GnRVJpdGZwG7dfmPNI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deyHRr/dJMb9XElnsB/9F3GnRVJpdGZwG7dfmPNI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeyHRr%2FdJMb9XElnsB%2F9F3GnRVJpdGZwG7dfmPNI1%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;953&quot; height=&quot;504&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;504&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;1209&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s9Bxf/dJMb9kzyo9L/l3lg4a0NIBJKw6ednqTvz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s9Bxf/dJMb9kzyo9L/l3lg4a0NIBJKw6ednqTvz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s9Bxf/dJMb9kzyo9L/l3lg4a0NIBJKw6ednqTvz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs9Bxf%2FdJMb9kzyo9L%2Fl3lg4a0NIBJKw6ednqTvz0%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;1209&quot; height=&quot;686&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;686&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;637&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dh8p38/dJMb9cuKHjC/JU5DdfmMHG5Cwi2bznkjWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dh8p38/dJMb9cuKHjC/JU5DdfmMHG5Cwi2bznkjWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dh8p38/dJMb9cuKHjC/JU5DdfmMHG5Cwi2bznkjWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdh8p38%2FdJMb9cuKHjC%2FJU5DdfmMHG5Cwi2bznkjWK%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;637&quot; height=&quot;175&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;175&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;637&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTrLoE/dJMb9VNiheU/sEkcSKD189FdeOyonYKjrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTrLoE/dJMb9VNiheU/sEkcSKD189FdeOyonYKjrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTrLoE/dJMb9VNiheU/sEkcSKD189FdeOyonYKjrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTrLoE%2FdJMb9VNiheU%2FsEkcSKD189FdeOyonYKjrK%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;637&quot; height=&quot;195&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLNoaV/dJMb9NogY9D/K0JteAClkmC2hiYnPRoCM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLNoaV/dJMb9NogY9D/K0JteAClkmC2hiYnPRoCM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLNoaV/dJMb9NogY9D/K0JteAClkmC2hiYnPRoCM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLNoaV%2FdJMb9NogY9D%2FK0JteAClkmC2hiYnPRoCM0%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;701&quot; height=&quot;394&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;8장&lt;br /&gt;Recommendations&amp;nbsp;for&amp;nbsp;Optimizing &lt;br /&gt;Database&amp;nbsp;Performance&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Z4Hh/dJMb9bWUMfB/2HtytQKFKJmu9uMU4XcLUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Z4Hh/dJMb9bWUMfB/2HtytQKFKJmu9uMU4XcLUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Z4Hh/dJMb9bWUMfB/2HtytQKFKJmu9uMU4XcLUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Z4Hh%2FdJMb9bWUMfB%2F2HtytQKFKJmu9uMU4XcLUK%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;327&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;224&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle Exadata&lt;/span&gt; 환경에서 &lt;b&gt;성능 최적화(Performance Optimization)&lt;/b&gt; 시 고려해야 할 &lt;b&gt;핵심 영역&lt;/b&gt;을 정리한 것입니다.&lt;br /&gt;단순히 DB 튜닝만으로는 Exadata의 진가를 다 끌어내기 어렵기 때문에, &lt;b&gt;Exadata 전용 기능과 스토리지 계층&lt;/b&gt;까지 함께 최적화하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;249&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;아래에 항목별로 구체적으로 설명드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;254&quot; data-start=&quot;251&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;305&quot; data-start=&quot;256&quot; data-ke-size=&quot;size26&quot;&gt;  1. 기본: ASM &amp;amp; Oracle Database Best Practices&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;509&quot; data-start=&quot;307&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;384&quot; data-start=&quot;307&quot;&gt;**ASM(&lt;span&gt;Oracle Automatic Storage Management&lt;/span&gt;)**는 Exadata의 핵심 스토리지 가상화 계층입니다.&lt;/li&gt;
&lt;li data-end=&quot;433&quot; data-start=&quot;385&quot;&gt;DB 자체의 SQL 튜닝, 인덱스 설계, 통계 수집 등도 반드시 병행되어야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;434&quot;&gt;Exadata만의 성능 기능(PMEM, Flash, Smart Scan 등)은 &amp;ldquo;DB가 잘 설계되어 있을 때&amp;rdquo; 최대 효과를 냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;567&quot; data-start=&quot;511&quot; data-ke-size=&quot;size16&quot;&gt;  Exadata 성능 최적화는 &amp;ldquo;&lt;b&gt;DB 튜닝 + 스토리지 계층 최적화&lt;/b&gt;&amp;rdquo;가 함께 가야 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;572&quot; data-start=&quot;569&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;613&quot; data-start=&quot;574&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 2. Persistent Memory (PMEM) 활용 최적화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;832&quot; data-start=&quot;615&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;615&quot;&gt;PMEM(지속성 메모리)은 DRAM보다 약간 느리지만 &lt;b&gt;Flash보다 훨씬 빠름&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;744&quot; data-start=&quot;666&quot;&gt;RDMA(Remote Direct Memory Access) 기반으로 DB 서버에서 스토리지 셀의 PMEM에 &lt;b&gt;초저지연 접근&lt;/b&gt; 가능.&lt;/li&gt;
&lt;li data-end=&quot;793&quot; data-start=&quot;745&quot;&gt;자주 읽는 &lt;b&gt;핵심 핫 데이터&lt;/b&gt;를 PMEM 캐시에 위치시켜 I/O 레이턴시 감소.&lt;/li&gt;
&lt;li data-end=&quot;832&quot; data-start=&quot;794&quot;&gt;&lt;b&gt;목표&lt;/b&gt;: Random I/O와 OLTP 트랜잭션 성능 향상.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;888&quot; data-start=&quot;834&quot; data-ke-size=&quot;size16&quot;&gt;  PMEM Cache를 잘 활용하면 OLTP 처리속도가 10배 이상 향상되는 경우도 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;893&quot; data-start=&quot;890&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;939&quot; data-start=&quot;895&quot; data-ke-size=&quot;size26&quot;&gt;  3. Flash Memory (Smart Flash Cache) 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1126&quot; data-start=&quot;941&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;941&quot;&gt;Flash Cache는 HDD보다 훨씬 빠른 중간 계층 캐시입니다.&lt;/li&gt;
&lt;li data-end=&quot;1022&quot; data-start=&quot;981&quot;&gt;Smart Flash Cache는 자주 접근되는 블록을 자동으로 캐싱.&lt;/li&gt;
&lt;li data-end=&quot;1064&quot; data-start=&quot;1023&quot;&gt;자주 조회되는 읽기 쿼리를 Flash에 위치시키면 디스크 I/O 감소.&lt;/li&gt;
&lt;li data-end=&quot;1126&quot; data-start=&quot;1065&quot;&gt;Flash Cache 크기와 정책(Write-back vs Write-through)을 환경에 맞게 조정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1186&quot; data-start=&quot;1128&quot; data-ke-size=&quot;size16&quot;&gt;  Flash Cache는 Exadata Smart Scan과도 연계되어 성능 최적화의 핵심 축입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1191&quot; data-start=&quot;1188&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1229&quot; data-start=&quot;1193&quot; data-ke-size=&quot;size26&quot;&gt;  4. In-Memory Columnar Cache 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1420&quot; data-start=&quot;1231&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1309&quot; data-start=&quot;1231&quot;&gt;&lt;b&gt;&lt;span&gt;Oracle Database In-Memory&lt;/span&gt;&lt;/b&gt; 기능을 사용하면 메모리에 Column Store를 유지 가능.&lt;/li&gt;
&lt;li data-end=&quot;1354&quot; data-start=&quot;1310&quot;&gt;Smart Scan과 결합하면 대규모 분석 쿼리의 응답 속도가 급격히 개선.&lt;/li&gt;
&lt;li data-end=&quot;1383&quot; data-start=&quot;1355&quot;&gt;자주 분석되는 테이블(팩트 테이블 등)에 적합.&lt;/li&gt;
&lt;li data-end=&quot;1420&quot; data-start=&quot;1384&quot;&gt;Columnar 포맷은 압축 효율도 높아 I/O 절감에 유리.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1488&quot; data-start=&quot;1422&quot; data-ke-size=&quot;size16&quot;&gt;  PMEM/Flash + In-memory Column Cache 조합이 대용량 DW 환경의 핵심 성능 전략입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1493&quot; data-start=&quot;1490&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1518&quot; data-start=&quot;1495&quot; data-ke-size=&quot;size26&quot;&gt;  5. Compression 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1767&quot; data-start=&quot;1520&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1660&quot; data-start=&quot;1520&quot;&gt;Exadata는 Hybrid Columnar Compression(HCC) 기능을 통해 압축 효율을 크게 높일 수 있음.
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1660&quot; data-start=&quot;1592&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1625&quot; data-start=&quot;1592&quot;&gt;Warehouse Compression: 쿼리 성능 중심&lt;/li&gt;
&lt;li data-end=&quot;1660&quot; data-start=&quot;1628&quot;&gt;Archive Compression: 최대 압축률 중심&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1719&quot; data-start=&quot;1661&quot;&gt;압축은 단순히 저장공간 절감뿐 아니라, &lt;b&gt;I/O 전송량 감소&lt;/b&gt;로 이어져 성능 향상 효과가 큽니다.&lt;/li&gt;
&lt;li data-end=&quot;1767&quot; data-start=&quot;1720&quot;&gt;잘못 적용하면 CPU 부담이 증가할 수 있으므로 워크로드 특성에 맞게 선택 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1772&quot; data-start=&quot;1769&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1794&quot; data-start=&quot;1774&quot; data-ke-size=&quot;size26&quot;&gt;  6. Index 사용 전략&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1953&quot; data-start=&quot;1796&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1858&quot; data-start=&quot;1796&quot;&gt;Exadata Smart Scan은 인덱스 없이도 대량의 Table Scan을 매우 빠르게 수행할 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;1897&quot; data-start=&quot;1859&quot;&gt;과도한 인덱스는 불필요한 관리 비용과 오버헤드만 유발할 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;1953&quot; data-start=&quot;1898&quot;&gt;&lt;b&gt;OLTP 워크로드에는 인덱스 필수&lt;/b&gt;, &lt;b&gt;대규모 분석 워크로드는 인덱스 최소화&lt;/b&gt;가 원칙.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2021&quot; data-start=&quot;1955&quot; data-ke-size=&quot;size16&quot;&gt;  인덱스 설계는 Exadata에서 재검토가 필요합니다. 기존 DB 환경 그대로 가져오면 성능을 저해할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2026&quot; data-start=&quot;2023&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2079&quot; data-start=&quot;2028&quot; data-ke-size=&quot;size26&quot;&gt;  7. ASM Allocation Unit Size / Extent Size 최적화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2257&quot; data-start=&quot;2081&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2150&quot; data-start=&quot;2081&quot;&gt;ASM Allocation Unit(AU) 크기와 Extent Size는 &lt;b&gt;I/O 효율성에 직접적인 영향&lt;/b&gt;을 줍니다.&lt;/li&gt;
&lt;li data-end=&quot;2198&quot; data-start=&quot;2151&quot;&gt;기본값은 보통 4MB인데, 대규모 DW 환경에서는 더 큰 AU가 유리할 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;2257&quot; data-start=&quot;2199&quot;&gt;Extent size도 테이블 액세스 패턴에 따라 조정하여 Smart Scan 효율을 높일 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2324&quot; data-start=&quot;2259&quot; data-ke-size=&quot;size16&quot;&gt;  큰 I/O는 fewer calls, 더 빠른 처리. 작은 I/O는 OLTP에 유리. 워크로드에 맞춰 설계 필요.&lt;/p&gt;
&lt;hr data-end=&quot;2329&quot; data-start=&quot;2326&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2374&quot; data-start=&quot;2331&quot; data-ke-size=&quot;size26&quot;&gt;  8. Exadata Specific System Statistics&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2646&quot; data-start=&quot;2376&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2470&quot; data-start=&quot;2376&quot;&gt;Exadata 전용 시스템 통계(v$cell, v$sysstat, v$cell_iorm_statistics 등)를 모니터링해야 진짜 병목을 찾을 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;2646&quot; data-start=&quot;2471&quot;&gt;주요 지표 예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2646&quot; data-start=&quot;2484&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2533&quot; data-start=&quot;2484&quot;&gt;cell physical IO bytes saved by storage index&lt;/li&gt;
&lt;li data-end=&quot;2598&quot; data-start=&quot;2536&quot;&gt;cell physical IO interconnect bytes returned by smart scan&lt;/li&gt;
&lt;li data-end=&quot;2626&quot; data-start=&quot;2601&quot;&gt;cell flash cache hits&lt;/li&gt;
&lt;li data-end=&quot;2646&quot; data-start=&quot;2629&quot;&gt;IORM statistics&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2698&quot; data-start=&quot;2648&quot; data-ke-size=&quot;size16&quot;&gt;  일반 DB 통계만 보면 Exadata의 스토리지 오프로딩 효과를 간과할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2703&quot; data-start=&quot;2700&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2737&quot; data-start=&quot;2705&quot; data-ke-size=&quot;size26&quot;&gt;⏳ 9. I/O Timeout Threshold 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2865&quot; data-start=&quot;2739&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2787&quot; data-start=&quot;2739&quot;&gt;기본 I/O 타임아웃이 너무 짧으면 Flash/HDD 딜레이 시 불필요한 에러 발생&lt;/li&gt;
&lt;li data-end=&quot;2810&quot; data-start=&quot;2788&quot;&gt;반대로 너무 길면 장애 감지가 느려짐&lt;/li&gt;
&lt;li data-end=&quot;2865&quot; data-start=&quot;2811&quot;&gt;워크로드에 따라 적절한 I/O timeout 설정 필요 (특히 OLTP vs DW 환경 차이)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2870&quot; data-start=&quot;2867&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2882&quot; data-start=&quot;2872&quot; data-ke-size=&quot;size26&quot;&gt;✅ 정리 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;영역최적화 포인트효과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3285&quot; data-start=&quot;2884&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3285&quot; data-start=&quot;2940&quot;&gt;
&lt;tr data-end=&quot;2976&quot; data-start=&quot;2940&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2947&quot; data-start=&quot;2940&quot;&gt;PMEM&lt;/td&gt;
&lt;td data-end=&quot;2963&quot; data-start=&quot;2947&quot; data-col-size=&quot;sm&quot;&gt;초저지연 읽기 성능 향상&lt;/td&gt;
&lt;td data-end=&quot;2976&quot; data-start=&quot;2963&quot; data-col-size=&quot;sm&quot;&gt;OLTP 속도 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3015&quot; data-start=&quot;2977&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2991&quot; data-start=&quot;2977&quot;&gt;Flash Cache&lt;/td&gt;
&lt;td data-end=&quot;3001&quot; data-start=&quot;2991&quot; data-col-size=&quot;sm&quot;&gt;핫데이터 캐싱&lt;/td&gt;
&lt;td data-end=&quot;3015&quot; data-start=&quot;3001&quot; data-col-size=&quot;sm&quot;&gt;디스크 I/O 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3063&quot; data-start=&quot;3016&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3034&quot; data-start=&quot;3016&quot;&gt;In-memory Cache&lt;/td&gt;
&lt;td data-end=&quot;3049&quot; data-start=&quot;3034&quot; data-col-size=&quot;sm&quot;&gt;Column Store&lt;/td&gt;
&lt;td data-end=&quot;3063&quot; data-start=&quot;3049&quot; data-col-size=&quot;sm&quot;&gt;DW 분석 속도 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3126&quot; data-start=&quot;3064&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3078&quot; data-start=&quot;3064&quot;&gt;Compression&lt;/td&gt;
&lt;td data-end=&quot;3108&quot; data-start=&quot;3078&quot; data-col-size=&quot;sm&quot;&gt;Hybrid Columnar Compression&lt;/td&gt;
&lt;td data-end=&quot;3126&quot; data-start=&quot;3108&quot; data-col-size=&quot;sm&quot;&gt;공간 절감 + I/O 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3161&quot; data-start=&quot;3127&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3135&quot; data-start=&quot;3127&quot;&gt;Index&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3145&quot; data-start=&quot;3135&quot;&gt;전략적 최소화&lt;/td&gt;
&lt;td data-end=&quot;3161&quot; data-start=&quot;3145&quot; data-col-size=&quot;sm&quot;&gt;불필요한 오버헤드 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3200&quot; data-start=&quot;3162&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3171&quot; data-start=&quot;3162&quot;&gt;ASM 설정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3186&quot; data-start=&quot;3171&quot;&gt;AU/Extent 조정&lt;/td&gt;
&lt;td data-end=&quot;3200&quot; data-start=&quot;3186&quot; data-col-size=&quot;sm&quot;&gt;I/O 효율 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3244&quot; data-start=&quot;3201&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3210&quot; data-start=&quot;3201&quot;&gt;시스템 통계&lt;/td&gt;
&lt;td data-end=&quot;3231&quot; data-start=&quot;3210&quot; data-col-size=&quot;sm&quot;&gt;Exadata 전용 지표 모니터링&lt;/td&gt;
&lt;td data-end=&quot;3244&quot; data-start=&quot;3231&quot; data-col-size=&quot;sm&quot;&gt;병목 정확히 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3285&quot; data-start=&quot;3245&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3258&quot; data-start=&quot;3245&quot;&gt;Timeout 설정&lt;/td&gt;
&lt;td data-end=&quot;3267&quot; data-start=&quot;3258&quot; data-col-size=&quot;sm&quot;&gt;환경별 튜닝&lt;/td&gt;
&lt;td data-end=&quot;3285&quot; data-start=&quot;3267&quot; data-col-size=&quot;sm&quot;&gt;장애 감지 및 안정성 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3290&quot; data-start=&quot;3287&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;3417&quot; data-start=&quot;3292&quot; data-ke-size=&quot;size16&quot;&gt;  한 줄로 요약하면,&lt;br /&gt;&lt;b&gt;Exadata 성능 최적화는 &amp;ldquo;스토리지 계층까지 포함한 전체 아키텍처 튜닝&amp;rdquo;이 핵심&lt;/b&gt;입니다.&lt;br /&gt;단순 SQL 튜닝만으로는 Exadata의 Smart 기능을 100% 활용할 수 없습니다  ⚡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PMEM&lt;br /&gt;&lt;/span&gt;Persistent Memory&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;200&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Persistent Memory(PMEM)&lt;/b&gt; 는 최신 세대 Exadata에서 &lt;b&gt;가장 큰 성능 혁신 포인트&lt;/b&gt; 중 하나입니다.&lt;br /&gt;특히 초저지연 I/O가 필요한 OLTP 워크로드(예: 주식거래, IoT, 실시간 처리)에 강력한 효과를 줍니다 ⚡&lt;/p&gt;
&lt;p data-end=&quot;249&quot; data-start=&quot;202&quot; data-ke-size=&quot;size16&quot;&gt;아래에 PMEM의 개념, 구성 요소, 동작 방식, 운영 팁까지 쉽게 정리해드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;254&quot; data-start=&quot;251&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;284&quot; data-start=&quot;256&quot; data-ke-size=&quot;size26&quot;&gt;  1. Persistent Memory란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;513&quot; data-start=&quot;286&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;286&quot;&gt;&lt;b&gt;PMEM&lt;/b&gt;은 DRAM(메모리)과 Flash Storage의 &lt;b&gt;중간 영역&lt;/b&gt;에 위치한 새로운 형태의 메모리입니다.&lt;/li&gt;
&lt;li data-end=&quot;395&quot; data-start=&quot;357&quot;&gt;속도는 Flash보다 훨씬 빠르고, DRAM보다는 약간 느립니다.&lt;/li&gt;
&lt;li data-end=&quot;445&quot; data-start=&quot;396&quot;&gt;&lt;b&gt;전원이 꺼져도 데이터가 유지되는 특성&lt;/b&gt;이 있어 고속 캐시로 사용하기 적합합니다.&lt;/li&gt;
&lt;li data-end=&quot;513&quot; data-start=&quot;446&quot;&gt;Exadata에서는 PMEM을 &lt;b&gt;Smart PMEM Cache&lt;/b&gt;와 &lt;b&gt;Smart PMEM Log&lt;/b&gt;로 활용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;항목PMEMFlashDRAM
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;665&quot; data-start=&quot;515&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;665&quot; data-start=&quot;576&quot;&gt;
&lt;tr data-end=&quot;601&quot; data-start=&quot;576&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;581&quot; data-start=&quot;576&quot;&gt;속도&lt;/td&gt;
&lt;td data-end=&quot;590&quot; data-start=&quot;581&quot; data-col-size=&quot;sm&quot;&gt;  초고속&lt;/td&gt;
&lt;td data-end=&quot;595&quot; data-start=&quot;590&quot; data-col-size=&quot;sm&quot;&gt;중간&lt;/td&gt;
&lt;td data-end=&quot;601&quot; data-start=&quot;595&quot; data-col-size=&quot;sm&quot;&gt;최고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;629&quot; data-start=&quot;602&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;608&quot; data-start=&quot;602&quot;&gt;휘발성&lt;/td&gt;
&lt;td data-end=&quot;615&quot; data-start=&quot;608&quot; data-col-size=&quot;sm&quot;&gt;비휘발성&lt;/td&gt;
&lt;td data-end=&quot;622&quot; data-start=&quot;615&quot; data-col-size=&quot;sm&quot;&gt;비휘발성&lt;/td&gt;
&lt;td data-end=&quot;629&quot; data-start=&quot;622&quot; data-col-size=&quot;sm&quot;&gt;휘발성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;665&quot; data-start=&quot;630&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;635&quot; data-start=&quot;630&quot;&gt;용도&lt;/td&gt;
&lt;td data-end=&quot;648&quot; data-start=&quot;635&quot; data-col-size=&quot;sm&quot;&gt;캐시 + 로그 가속&lt;/td&gt;
&lt;td data-end=&quot;656&quot; data-start=&quot;648&quot; data-col-size=&quot;sm&quot;&gt;일반 캐시&lt;/td&gt;
&lt;td data-end=&quot;665&quot; data-start=&quot;656&quot; data-col-size=&quot;sm&quot;&gt;DB 버퍼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;670&quot; data-start=&quot;667&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;733&quot; data-start=&quot;672&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 2. Smart PMEM Cache (Persistent Memory Data Accelerator)&lt;/h2&gt;
&lt;blockquote data-end=&quot;785&quot; data-start=&quot;735&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;785&quot; data-start=&quot;737&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;자주 읽히는 데이터를 PMEM에 캐싱&lt;/b&gt;해서 초저지연으로 제공하는 기능입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;986&quot; data-start=&quot;787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;828&quot; data-start=&quot;787&quot;&gt;디스크나 Flash보다 빠른 PMEM에 데이터를 저장해 읽기 속도 향상&lt;/li&gt;
&lt;li data-end=&quot;892&quot; data-start=&quot;829&quot;&gt;RDMA(Remote Direct Memory Access)를 이용해 DB 서버가 &lt;b&gt;PMEM을 직접 접근&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;919&quot; data-start=&quot;893&quot;&gt;OLTP 워크로드나 랜덤 읽기 부하에 효과적&lt;/li&gt;
&lt;li data-end=&quot;986&quot; data-start=&quot;920&quot;&gt;Smart Flash Cache와 유사하지만, PMEM이 더 빠름 (Flash 대비 수 &amp;mu;s 수준의 응답속도 개선)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1007&quot; data-start=&quot;988&quot; data-ke-size=&quot;size23&quot;&gt;✅ PMEM Cache 모드&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;모드설명특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1183&quot; data-start=&quot;1008&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1183&quot; data-start=&quot;1048&quot;&gt;
&lt;tr data-end=&quot;1118&quot; data-start=&quot;1048&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1068&quot; data-start=&quot;1048&quot;&gt;&lt;b&gt;Write-Through&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1104&quot; data-start=&quot;1068&quot; data-col-size=&quot;sm&quot;&gt;데이터는 PMEM에 쓰고, 동시에 Flash/HDD에도 반영&lt;/td&gt;
&lt;td data-end=&quot;1118&quot; data-start=&quot;1104&quot; data-col-size=&quot;sm&quot;&gt;안정성 높음, 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1183&quot; data-start=&quot;1119&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1132&quot; data-start=&quot;1119&quot;&gt;Write-Back&lt;/td&gt;
&lt;td data-end=&quot;1166&quot; data-start=&quot;1132&quot; data-col-size=&quot;sm&quot;&gt;데이터는 PMEM에 먼저 쓰고 나중에 Flash로 내려감&lt;/td&gt;
&lt;td data-end=&quot;1183&quot; data-start=&quot;1166&quot; data-col-size=&quot;sm&quot;&gt;성능은 높지만 관리 복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1231&quot; data-start=&quot;1185&quot; data-ke-size=&quot;size16&quot;&gt;  일반적으로 운영 환경에서는 &lt;b&gt;Write-Through 모드&lt;/b&gt;를 권장합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1236&quot; data-start=&quot;1233&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1300&quot; data-start=&quot;1238&quot; data-ke-size=&quot;size26&quot;&gt;  3. Smart PMEM Log (Persistent Memory Commit Accelerator)&lt;/h2&gt;
&lt;blockquote data-end=&quot;1344&quot; data-start=&quot;1302&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1344&quot; data-start=&quot;1304&quot; data-ke-size=&quot;size16&quot;&gt;  PMEM을 &lt;b&gt;Redo Log 쓰기&lt;/b&gt; 가속에 활용하는 기능입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1538&quot; data-start=&quot;1346&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1393&quot; data-start=&quot;1346&quot;&gt;기존에는 redo log 기록 시 &lt;b&gt;Flash Log&lt;/b&gt;를 사용해 지연을 줄였음&lt;/li&gt;
&lt;li data-end=&quot;1450&quot; data-start=&quot;1394&quot;&gt;PMEM Log는 Flash Log보다 더 빠른 속도로 redo 기록 지연(latency)을 줄임&lt;/li&gt;
&lt;li data-end=&quot;1497&quot; data-start=&quot;1451&quot;&gt;트랜잭션 커밋(commit) 속도에 직접적으로 영향을 줌 &amp;rarr; OLTP 성능 향상&lt;/li&gt;
&lt;li data-end=&quot;1538&quot; data-start=&quot;1498&quot;&gt;PMEM Log는 데이터베이스별로 &lt;b&gt;활성화 또는 비활성화&lt;/b&gt; 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1593&quot; data-start=&quot;1540&quot; data-ke-size=&quot;size16&quot;&gt;  초저지연 커밋이 중요한 워크로드(금융 거래, IoT 센서 데이터 등)에 특히 효과적입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1598&quot; data-start=&quot;1595&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1627&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size26&quot;&gt;  4. PMEM 사용 대상 워크로드 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;워크로드 유형적합 이유
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1828&quot; data-start=&quot;1629&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1828&quot; data-start=&quot;1679&quot;&gt;
&lt;tr data-end=&quot;1726&quot; data-start=&quot;1679&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1692&quot; data-start=&quot;1679&quot;&gt;  금융 트랜잭션&lt;/td&gt;
&lt;td data-end=&quot;1726&quot; data-start=&quot;1692&quot; data-col-size=&quot;sm&quot;&gt;커밋 지연 최소화 필요 (PMEM Log 효과 극대화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1763&quot; data-start=&quot;1727&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1739&quot; data-start=&quot;1727&quot;&gt;  실시간 분석&lt;/td&gt;
&lt;td data-end=&quot;1763&quot; data-start=&quot;1739&quot; data-col-size=&quot;sm&quot;&gt;자주 조회되는 데이터 빠른 응답 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1797&quot; data-start=&quot;1764&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1780&quot; data-start=&quot;1764&quot;&gt;  IoT 센서 데이터&lt;/td&gt;
&lt;td data-end=&quot;1797&quot; data-start=&quot;1780&quot; data-col-size=&quot;sm&quot;&gt;초저지연 쓰기 처리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1828&quot; data-start=&quot;1798&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1812&quot; data-start=&quot;1798&quot;&gt;  대규모 OLTP&lt;/td&gt;
&lt;td data-end=&quot;1828&quot; data-start=&quot;1812&quot; data-col-size=&quot;sm&quot;&gt;랜덤 읽기 부하 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;9장 스마트스캔&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-end=&quot;266&quot; data-start=&quot;126&quot; data-ke-size=&quot;size16&quot;&gt;Smart Scan은 Exadata의 &lt;b&gt;스토리지 오프로딩(Storage Offload)&lt;/b&gt; 기능으로,&lt;br /&gt;  스캔 작업을 DB 서버가 아니라 스토리지 셀에서 처리하여&lt;br /&gt;  네트워크 트래픽을 줄이고, 쿼리 성능을 획기적으로 높이는 기능입니다. ⚡&lt;/p&gt;
&lt;p data-end=&quot;402&quot; data-start=&quot;268&quot; data-ke-size=&quot;size16&quot;&gt;그런데 아래와 같은 상황에서는 Smart Scan이 &lt;b&gt;비활성화&lt;/b&gt;되어 &lt;b&gt;전통적인 블록 기반 I/O&lt;/b&gt;로 처리되기 때문에 성능 향상을 기대할 수 없습니다.&lt;br /&gt;아래에 항목별로 &lt;b&gt;왜 Smart Scan이 안 되는지&lt;/b&gt;까지 해설해드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;407&quot; data-start=&quot;404&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;439&quot; data-start=&quot;409&quot; data-ke-size=&quot;size26&quot;&gt;  1. Smart Scan이란? (간단 복습)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목Smart Scan전통적 I/O
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;628&quot; data-start=&quot;441&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;628&quot; data-start=&quot;507&quot;&gt;
&lt;tr data-end=&quot;533&quot; data-start=&quot;507&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;515&quot; data-start=&quot;507&quot;&gt;처리 위치&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;524&quot; data-start=&quot;515&quot;&gt;스토리지 셀&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;533&quot; data-start=&quot;524&quot;&gt;DB 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;568&quot; data-start=&quot;534&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;540&quot; data-start=&quot;534&quot;&gt;전송량&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;556&quot; data-start=&quot;540&quot;&gt;필요한 컬럼/로우만 전송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;568&quot; data-start=&quot;556&quot;&gt;전체 블록 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;592&quot; data-start=&quot;569&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;574&quot; data-start=&quot;569&quot;&gt;성능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;586&quot; data-start=&quot;574&quot;&gt;빠름 (오프로딩)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;592&quot; data-start=&quot;586&quot;&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;628&quot; data-start=&quot;593&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;598&quot; data-start=&quot;593&quot;&gt;효과&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;619&quot; data-start=&quot;598&quot;&gt;네트워크 부하 감소, CPU 절감&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;628&quot; data-start=&quot;619&quot;&gt;부하 집중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;698&quot; data-start=&quot;630&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan은 Table Full Scan, Direct Path Read를 사용하는 경우에 주로 발생합니다.&lt;/p&gt;
&lt;hr data-end=&quot;703&quot; data-start=&quot;700&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;736&quot; data-start=&quot;705&quot; data-ke-size=&quot;size26&quot;&gt;⚠️ 2. Smart Scan이 동작하지 않는 상황&lt;/h2&gt;
&lt;div&gt;상황Smart Scan 비활성화 이유
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1716&quot; data-start=&quot;738&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1716&quot; data-start=&quot;802&quot;&gt;
&lt;tr data-end=&quot;883&quot; data-start=&quot;802&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;830&quot; data-start=&quot;802&quot;&gt;1. &lt;b&gt;Clustered Table 스캔&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;883&quot; data-start=&quot;830&quot;&gt;클러스터 테이블은 저장 구조가 일반 테이블과 달라서 스토리지 셀에서 효율적 오프로딩 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;963&quot; data-start=&quot;884&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;920&quot; data-start=&quot;884&quot;&gt;2. &lt;b&gt;Index-Organized Table(IOT)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;963&quot; data-start=&quot;920&quot;&gt;데이터가 인덱스에 직접 저장되는 구조라 Smart Scan 대상이 아님&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1033&quot; data-start=&quot;964&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;996&quot; data-start=&quot;964&quot;&gt;3. &lt;b&gt;압축 인덱스의 Fast Full Scan&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1033&quot; data-start=&quot;996&quot;&gt;스토리지 셀에서 압축 인덱스를 해제하며 스캔하는 기능 미지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1123&quot; data-start=&quot;1034&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1076&quot; data-start=&quot;1034&quot;&gt;4. &lt;b&gt;Reverse Key Index Fast Full Scan&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1123&quot; data-start=&quot;1076&quot;&gt;Reverse Key는 정렬 순서가 뒤섞여 있어 스토리지에서 순차 스캔 불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1202&quot; data-start=&quot;1124&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1172&quot; data-start=&quot;1124&quot;&gt;5. &lt;b&gt;Row-level dependency tracking&lt;/b&gt; 활성화된 테이블&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1202&quot; data-start=&quot;1172&quot;&gt;내부적인 추가 메타데이터 관리로 오프로딩 불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1258&quot; data-start=&quot;1203&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1228&quot; data-start=&quot;1203&quot;&gt;6. &lt;b&gt;ROWID 순서로 결과 반환&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1258&quot; data-start=&quot;1228&quot;&gt;정렬 순서를 보장하기 위해 블록 단위 전송 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1339&quot; data-start=&quot;1259&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1292&quot; data-start=&quot;1259&quot;&gt;7. &lt;b&gt;CREATE INDEX ... NOSORT&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1339&quot; data-start=&quot;1292&quot;&gt;인덱스 생성 시 기존 데이터 정렬 유지로 Direct Path Read 미발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1422&quot; data-start=&quot;1340&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1371&quot; data-start=&quot;1340&quot;&gt;8. &lt;b&gt;LOB / LONG 컬럼이 포함된 쿼리&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1422&quot; data-start=&quot;1371&quot;&gt;LOB/LONG은 Smart Scan 대상에서 제외됨 (길이가 크고 처리 방식 다름)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1494&quot; data-start=&quot;1423&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1462&quot; data-start=&quot;1423&quot;&gt;9. &lt;b&gt;Flashback Versions Query 사용 시&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1494&quot; data-start=&quot;1462&quot;&gt;Undo 데이터 접근 필요로 스토리지 오프로딩 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1549&quot; data-start=&quot;1495&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1519&quot; data-start=&quot;1495&quot;&gt;10. &lt;b&gt;255개 초과 컬럼 참조&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1549&quot; data-start=&quot;1519&quot;&gt;Smart Scan의 최대 컬럼 처리 제한 초과&lt;br /&gt;oracle 1개 테이블 최대 가능 컬럼 1000개.&lt;br /&gt;컬럼 255개 초과하면 스마트스캔 X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1638&quot; data-start=&quot;1550&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1601&quot; data-start=&quot;1550&quot;&gt;11. &lt;b&gt;Tablespace가 암호화되어 있고, 셀 기반 복호화가 비활성화된 경우&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1638&quot; data-start=&quot;1601&quot;&gt;DB 서버에서 복호화를 해야 하므로 Smart Scan 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1716&quot; data-start=&quot;1639&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1680&quot; data-start=&quot;1639&quot;&gt;12. &lt;b&gt;Virtual Column 기반 Predicate 사용&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1716&quot; data-start=&quot;1680&quot;&gt;가상 컬럼은 스토리지 셀에서 계산 불가(논리식 평가 필요)&lt;br /&gt;virtual column ?&amp;nbsp; C as substr(a,1,4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1721&quot; data-start=&quot;1718&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1754&quot; data-start=&quot;1723&quot; data-ke-size=&quot;size26&quot;&gt;  3. Smart Scan 동작 여부 확인 방법&lt;/h2&gt;
&lt;h3 data-end=&quot;1777&quot; data-start=&quot;1756&quot; data-ke-size=&quot;size23&quot;&gt;  SQL 실행 후 통계 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name, &lt;/span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$sysstat &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'%cell%'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1857&quot; data-start=&quot;1851&quot; data-ke-size=&quot;size16&quot;&gt;중요 지표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2025&quot; data-start=&quot;1858&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1942&quot; data-start=&quot;1858&quot;&gt;cell physical IO interconnect bytes returned by smart scan   Smart Scan 발생 시 증가&lt;/li&gt;
&lt;li data-end=&quot;2025&quot; data-start=&quot;1943&quot;&gt;physical read total bytes   전체 읽기량&lt;br /&gt;  이 두 값을 비교하면 Smart Scan이 얼마나 적용됐는지 파악 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2030&quot; data-start=&quot;2027&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2049&quot; data-start=&quot;2032&quot; data-ke-size=&quot;size23&quot;&gt;  실행 계획에서 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;EXPLAIN PLAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;FOR&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ...; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(DBMS_XPLAN.DISPLAY); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2232&quot; data-start=&quot;2132&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2191&quot; data-start=&quot;2132&quot;&gt;TABLE ACCESS STORAGE FULL 이 나타나면 Smart Scan 발생 가능성 있음 ✅&lt;/li&gt;
&lt;li data-end=&quot;2232&quot; data-start=&quot;2192&quot;&gt;TABLE ACCESS FULL 만 있다면 일반 블록 I/O  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2237&quot; data-start=&quot;2234&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2269&quot; data-start=&quot;2239&quot; data-ke-size=&quot;size26&quot;&gt;  4. Smart Scan이 안 될 때의 대안&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;제한 원인우회 / 개선 방법
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2567&quot; data-start=&quot;2271&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2567&quot; data-start=&quot;2329&quot;&gt;
&lt;tr data-end=&quot;2381&quot; data-start=&quot;2329&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2343&quot; data-start=&quot;2329&quot;&gt;LOB/LONG 컬럼&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2381&quot; data-start=&quot;2343&quot;&gt;필요한 컬럼만 선택하거나 SecureFiles LOB으로 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2430&quot; data-start=&quot;2382&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2390&quot; data-start=&quot;2382&quot;&gt;가상 컬럼&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2430&quot; data-start=&quot;2390&quot;&gt;실제 컬럼으로 materialize 하거나 함수 기반 인덱스 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2492&quot; data-start=&quot;2431&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2440&quot; data-start=&quot;2431&quot;&gt;암호화 TS&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2492&quot; data-start=&quot;2440&quot;&gt;&lt;b&gt;Cell-based Decryption&lt;/b&gt; 활성화 (TDE + Exadata 기능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2531&quot; data-start=&quot;2493&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2507&quot; data-start=&quot;2493&quot;&gt;ROWID 정렬 요구&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2531&quot; data-start=&quot;2507&quot;&gt;정렬 제거 또는 옵티마이저 힌트 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2567&quot; data-start=&quot;2532&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2545&quot; data-start=&quot;2532&quot;&gt;255개 초과 컬럼&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2567&quot; data-start=&quot;2545&quot;&gt;필요한 컬럼만 Projection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2620&quot; data-start=&quot;2569&quot; data-ke-size=&quot;size16&quot;&gt;  단순히 Smart Scan이 안 되는 상황을 피하는 것만으로도 성능 향상이 가능합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2625&quot; data-start=&quot;2622&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2660&quot; data-start=&quot;2627&quot; data-ke-size=&quot;size26&quot;&gt;  5. Smart Scan 성능 영향 비교 (예시)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;방식전송량네트워크 부하응답 속도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2836&quot; data-start=&quot;2662&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2836&quot; data-start=&quot;2740&quot;&gt;
&lt;tr data-end=&quot;2796&quot; data-start=&quot;2740&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2760&quot; data-start=&quot;2740&quot;&gt;Smart Scan (오프로딩)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2783&quot; data-start=&quot;2760&quot;&gt;500MB 테이블 중 50MB만 전송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2788&quot; data-start=&quot;2783&quot;&gt;낮음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2796&quot; data-start=&quot;2788&quot;&gt;⚡ 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2836&quot; data-start=&quot;2797&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2809&quot; data-start=&quot;2797&quot;&gt;전통 블록 I/O&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2823&quot; data-start=&quot;2809&quot;&gt;500MB 전체 전송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2828&quot; data-start=&quot;2823&quot;&gt;높음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2836&quot; data-start=&quot;2828&quot;&gt;⏳ 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2894&quot; data-start=&quot;2838&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan을 쓰는 것만으로도 &lt;b&gt;쿼리 응답 시간이 수 배~수십 배 빨라질 수 있음&lt;/b&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;2899&quot; data-start=&quot;2896&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2914&quot; data-start=&quot;2901&quot; data-ke-size=&quot;size26&quot;&gt;✅ 6. 정리 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분Smart Scan 가능Smart Scan 불가
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3267&quot; data-start=&quot;2916&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3267&quot; data-start=&quot;3002&quot;&gt;
&lt;tr data-end=&quot;3053&quot; data-start=&quot;3002&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3028&quot; data-start=&quot;3002&quot;&gt;일반 Heap Table Full Scan&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3032&quot; data-start=&quot;3028&quot;&gt;✅&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3053&quot; data-start=&quot;3032&quot;&gt;❌ Clustered Table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3094&quot; data-start=&quot;3054&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3073&quot; data-start=&quot;3054&quot;&gt;Direct Path Read&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3077&quot; data-start=&quot;3073&quot;&gt;✅&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3094&quot; data-start=&quot;3077&quot;&gt;❌ ROWID 순서 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3149&quot; data-start=&quot;3095&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3107&quot; data-start=&quot;3095&quot;&gt;지원 데이터 타입&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3134&quot; data-start=&quot;3107&quot;&gt;NUMBER, DATE, VARCHAR2 등&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3149&quot; data-start=&quot;3134&quot;&gt;❌ LOB, LONG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3201&quot; data-start=&quot;3150&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3156&quot; data-start=&quot;3150&quot;&gt;조건절&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3171&quot; data-start=&quot;3156&quot;&gt;일반 Predicate&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3201&quot; data-start=&quot;3171&quot;&gt;❌ Virtual Column Predicate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3267&quot; data-start=&quot;3202&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3208&quot; data-start=&quot;3202&quot;&gt;인덱스&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3227&quot; data-start=&quot;3208&quot;&gt;테이블 Full Scan 기반&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3267&quot; data-start=&quot;3227&quot;&gt;❌ Reverse Key, 압축 인덱스 Fast Full Scan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3335&quot; data-start=&quot;3269&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan을 막는 요소를 제거하거나 회피하면, &lt;b&gt;Exadata의 진짜 성능을 끌어낼 수 있습니다&lt;/b&gt; ⚡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;166&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;Smart Scan을 사용하는지 확인하려면 &lt;b&gt;SQL 실행 계획과 관련 파라미터 설정&lt;/b&gt;을 잘 이해해야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;200&quot; data-start=&quot;168&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 사용되는 대표적인 초기화 파라미터가 바로 &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;262&quot; data-start=&quot;201&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;230&quot; data-start=&quot;201&quot;&gt;CELL_OFFLOAD_PROCESSING&lt;/li&gt;
&lt;li data-end=&quot;262&quot; data-start=&quot;231&quot;&gt;CELL_OFFLOAD_PLAN_DISPLAY&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;284&quot; data-start=&quot;264&quot; data-ke-size=&quot;size16&quot;&gt;아래에 실무 기준으로 정리해드릴게요.&lt;/p&gt;
&lt;hr data-end=&quot;289&quot; data-start=&quot;286&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;330&quot; data-start=&quot;291&quot; data-ke-size=&quot;size26&quot;&gt;  1. CELL_OFFLOAD_PROCESSING 파라미터&lt;/h2&gt;
&lt;h3 data-end=&quot;341&quot; data-start=&quot;332&quot; data-ke-size=&quot;size23&quot;&gt;  역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;513&quot; data-start=&quot;342&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;401&quot; data-start=&quot;342&quot;&gt;Exadata Smart Scan(스토리지 오프로딩)을 &lt;b&gt;활성화 또는 비활성화&lt;/b&gt;하는 파라미터입니다.&lt;/li&gt;
&lt;li data-end=&quot;466&quot; data-start=&quot;402&quot;&gt;FALSE로 설정하면 Smart Scan 기능이 꺼지고, &lt;b&gt;전통적인 블록 I/O 방식&lt;/b&gt;으로만 동작합니다.&lt;/li&gt;
&lt;li data-end=&quot;513&quot; data-start=&quot;467&quot;&gt;세션 단위로도 제어할 수 있어 &lt;b&gt;튜닝이나 테스트 환경에서 자주 사용&lt;/b&gt;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;값설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;639&quot; data-start=&quot;515&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;639&quot; data-start=&quot;541&quot;&gt;
&lt;tr data-end=&quot;586&quot; data-start=&quot;541&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;552&quot; data-start=&quot;541&quot;&gt;TRUE ✅&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;586&quot; data-start=&quot;552&quot;&gt;Smart Scan 및 오프로딩 기능 활성화 (기본값)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;639&quot; data-start=&quot;587&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;599&quot; data-start=&quot;587&quot;&gt;FALSE ❌&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;639&quot; data-start=&quot;599&quot;&gt;Smart Scan 비활성화 &amp;rarr; 모든 스캔이 DB 서버에서 처리됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;644&quot; data-start=&quot;641&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;658&quot; data-start=&quot;646&quot; data-ke-size=&quot;size23&quot;&gt;  설정 방법&lt;/h3&gt;
&lt;h4 data-end=&quot;672&quot; data-start=&quot;660&quot; data-ke-size=&quot;size20&quot;&gt;✅ 세션 단위&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PROCESSING &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;span&gt;TRUE&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PROCESSING &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;span&gt;FALSE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;806&quot; data-start=&quot;792&quot; data-ke-size=&quot;size20&quot;&gt;  시스템 전체&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SYSTEM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PROCESSING &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;span&gt;TRUE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;889&quot; data-start=&quot;868&quot; data-ke-size=&quot;size20&quot;&gt;  쿼리 단위 (힌트 사용)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;/*+ OPT_PARAM('cell_offload_processing' 'false') */&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; sales &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; amount &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1041&quot; data-start=&quot;995&quot; data-ke-size=&quot;size16&quot;&gt;  특정 쿼리에서만 Smart Scan을 끄고 성능 차이를 비교할 때 유용합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1046&quot; data-start=&quot;1043&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1078&quot; data-start=&quot;1048&quot; data-ke-size=&quot;size23&quot;&gt;  Smart Scan 사용 여부 테스트 예시&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PROCESSING &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;span&gt;TRUE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;COUNT&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;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; big_table &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span&gt;&lt;span&gt;BETWEEN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;200&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1307&quot; data-start=&quot;1205&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan 활성화 후 v$sysstat 또는 EXPLAIN PLAN으로 확인&lt;br /&gt;(Offload 발생 시 TABLE ACCESS STORAGE FULL 표시)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PROCESSING &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;span&gt;FALSE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;COUNT&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;span&gt;) &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; big_table &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span&gt;&lt;span&gt;BETWEEN&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;200&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1492&quot; data-start=&quot;1435&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan 비활성화 후 동일 쿼리 실행 시 TABLE ACCESS FULL로 표시됨.&lt;/p&gt;
&lt;hr data-end=&quot;1497&quot; data-start=&quot;1494&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1540&quot; data-start=&quot;1499&quot; data-ke-size=&quot;size26&quot;&gt;  2. CELL_OFFLOAD_PLAN_DISPLAY 파라미터&lt;/h2&gt;
&lt;h3 data-end=&quot;1551&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size23&quot;&gt;  역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1724&quot; data-start=&quot;1552&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1647&quot; data-start=&quot;1552&quot;&gt;실행 계획(EXPLAIN PLAN 또는 DBMS_XPLAN)에 **스토리지 오프로딩 정보(Offloaded Predicate)**를 표시할지 여부를 제어합니다.&lt;/li&gt;
&lt;li data-end=&quot;1724&quot; data-start=&quot;1648&quot;&gt;Smart Scan이 실제로 어떤 조건(Predicate)을 스토리지에서 평가했는지를 확인할 수 있음 &amp;rarr; &lt;b&gt;튜닝 시 매우 중요&lt;/b&gt;⚡&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;값설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1873&quot; data-start=&quot;1726&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1873&quot; data-start=&quot;1752&quot;&gt;
&lt;tr data-end=&quot;1787&quot; data-start=&quot;1752&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1762&quot; data-start=&quot;1752&quot;&gt;NEVER&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1787&quot; data-start=&quot;1762&quot;&gt;실행 계획에 오프로딩 정보 표시 안 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1832&quot; data-start=&quot;1788&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1803&quot; data-start=&quot;1788&quot;&gt;AUTO (기본값)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1832&quot; data-start=&quot;1803&quot;&gt;Smart Scan이 발생한 경우만 자동 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1873&quot; data-start=&quot;1833&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1844&quot; data-start=&quot;1833&quot;&gt;ALWAYS&lt;/td&gt;
&lt;td data-end=&quot;1873&quot; data-start=&quot;1844&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan 여부와 관계없이 항상 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1878&quot; data-start=&quot;1875&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1892&quot; data-start=&quot;1880&quot; data-ke-size=&quot;size23&quot;&gt;  설정 방법&lt;/h3&gt;
&lt;h4 data-end=&quot;1906&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size20&quot;&gt;✅ 세션 단위&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SESSION &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PLAN_DISPLAY &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ALWAYS; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1987&quot; data-start=&quot;1973&quot; data-ke-size=&quot;size20&quot;&gt;  시스템 전체&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SYSTEM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;/span&gt;&lt;span&gt; CELL_OFFLOAD_PLAN_DISPLAY &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; AUTO; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2054&quot; data-start=&quot;2051&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2087&quot; data-start=&quot;2056&quot; data-ke-size=&quot;size23&quot;&gt;  실행 계획에서 Smart Scan 정보 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;EXPLAIN PLAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;FOR&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; big_table &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; amount &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(DBMS_XPLAN.DISPLAY); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2278&quot; data-start=&quot;2205&quot; data-ke-size=&quot;size16&quot;&gt;CELL_OFFLOAD_PLAN_DISPLAY = ALWAYS로 설정되어 있으면, 아래와 같은 내용이 실행 계획에 나타납니다 &lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;---------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | Id | Operation | &lt;/span&gt;&lt;span&gt;&lt;span&gt;Name&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | Offloadable? | &lt;/span&gt;&lt;span&gt;&lt;span&gt;Storage&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;span&gt; | &lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;STATEMENT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | | | | | &lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ACCESS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;STORAGE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FULL&lt;/span&gt;&lt;/span&gt;&lt;span&gt; | BIG_TABLE | YES | SmartScan | &lt;/span&gt;&lt;span&gt;&lt;span&gt;---------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Predicate Information (identified &lt;/span&gt;&lt;span&gt;&lt;span&gt;by&lt;/span&gt;&lt;/span&gt;&lt;span&gt; operation id): &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;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&quot;AMOUNT&quot;&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2975&quot; data-start=&quot;2903&quot; data-ke-size=&quot;size16&quot;&gt;  storage(...) 또는 offloadable predicate가 보이면 Smart Scan이 동작한 것입니다 ✅&lt;/p&gt;
&lt;hr data-end=&quot;2980&quot; data-start=&quot;2977&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3007&quot; data-start=&quot;2982&quot; data-ke-size=&quot;size26&quot;&gt;  3. 실무 튜닝에서의 활용 시나리오&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;작업방법목적
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3324&quot; data-start=&quot;3009&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3324&quot; data-start=&quot;3053&quot;&gt;
&lt;tr data-end=&quot;3129&quot; data-start=&quot;3053&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3073&quot; data-start=&quot;3053&quot;&gt;Smart Scan 활성화 확인&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3114&quot; data-start=&quot;3073&quot;&gt;CELL_OFFLOAD_PROCESSING=TRUE + 실행 계획&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3129&quot; data-start=&quot;3114&quot;&gt;성능 활용 여부 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3201&quot; data-start=&quot;3130&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3153&quot; data-start=&quot;3130&quot;&gt;Smart Scan 비활성화 후 비교&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3187&quot; data-start=&quot;3153&quot;&gt;CELL_OFFLOAD_PROCESSING=FALSE&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3201&quot; data-start=&quot;3187&quot;&gt;오프로딩 효과 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3278&quot; data-start=&quot;3202&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3216&quot; data-start=&quot;3202&quot;&gt;오프로딩된 조건 확인&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3253&quot; data-start=&quot;3216&quot;&gt;CELL_OFFLOAD_PLAN_DISPLAY=ALWAYS&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3278&quot; data-start=&quot;3253&quot;&gt;Predicate Pushdown 튜닝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3324&quot; data-start=&quot;3279&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3296&quot; data-start=&quot;3279&quot;&gt;특정 조건 오프로딩 테스트&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3311&quot; data-start=&quot;3296&quot;&gt;OPT_PARAM 힌트&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3324&quot; data-start=&quot;3311&quot;&gt;쿼리별 영향 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3329&quot; data-start=&quot;3326&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3354&quot; data-start=&quot;3331&quot; data-ke-size=&quot;size26&quot;&gt;  4. 자주 함께 쓰는 진단 쿼리&lt;/h2&gt;
&lt;h3 data-end=&quot;3379&quot; data-start=&quot;3356&quot; data-ke-size=&quot;size23&quot;&gt;  Smart Scan 통계 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name, &lt;/span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$sysstat &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'%cell%'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3458&quot; data-start=&quot;3452&quot; data-ke-size=&quot;size16&quot;&gt;중요 지표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3629&quot; data-start=&quot;3459&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3521&quot; data-start=&quot;3459&quot;&gt;cell physical IO interconnect bytes returned by smart scan&lt;/li&gt;
&lt;li data-end=&quot;3579&quot; data-start=&quot;3522&quot;&gt;cell physical IO bytes eligible for predicate offload&lt;/li&gt;
&lt;li data-end=&quot;3629&quot; data-start=&quot;3580&quot;&gt;cell physical IO bytes saved by storage index&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3713&quot; data-start=&quot;3631&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan이 제대로 동작할수록 interconnect bytes가 작고 saved by storage index가 증가합니다.&lt;/p&gt;
&lt;hr data-end=&quot;3718&quot; data-start=&quot;3715&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3730&quot; data-start=&quot;3720&quot; data-ke-size=&quot;size26&quot;&gt;✅ 정리 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;파라미터역할값설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3983&quot; data-start=&quot;3732&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3983&quot; data-start=&quot;3790&quot;&gt;
&lt;tr data-end=&quot;3880&quot; data-start=&quot;3790&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3818&quot; data-start=&quot;3790&quot;&gt;CELL_OFFLOAD_PROCESSING&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3841&quot; data-start=&quot;3818&quot;&gt;Smart Scan 기능 on/off&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3856&quot; data-start=&quot;3841&quot;&gt;TRUE / FALSE&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3880&quot; data-start=&quot;3856&quot;&gt;Smart Scan 활성화 여부 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3983&quot; data-start=&quot;3881&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3911&quot; data-start=&quot;3881&quot;&gt;CELL_OFFLOAD_PLAN_DISPLAY&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3931&quot; data-start=&quot;3911&quot;&gt;실행 계획에 오프로딩 정보 표시&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3955&quot; data-start=&quot;3931&quot;&gt;NEVER / AUTO / ALWAYS&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3983&quot; data-start=&quot;3955&quot;&gt;Smart Scan 동작 세부정보 확인 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4030&quot; data-start=&quot;3985&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan 튜닝 시에는 다음 3단계를 활용하는 게 실무 팁입니다 &lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4186&quot; data-start=&quot;4031&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;4084&quot; data-start=&quot;4031&quot;&gt;CELL_OFFLOAD_PROCESSING으로 Smart Scan on/off 비교&lt;/li&gt;
&lt;li data-end=&quot;4143&quot; data-start=&quot;4085&quot;&gt;CELL_OFFLOAD_PLAN_DISPLAY로 실제 Predicate Pushdown 확인&lt;/li&gt;
&lt;li data-end=&quot;4186&quot; data-start=&quot;4144&quot;&gt;v$sysstat 및 실행 계획을 통해 I/O 절감 효과 측정  &lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;130&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;**&lt;span&gt;Oracle Exadata&lt;/span&gt;**에서 Smart Scan이 실행 계획에 표시된다고 해서 &lt;b&gt;무조건 스토리지 오프로딩이 완벽히 적용되는 건 아닙니다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;289&quot; data-start=&quot;132&quot; data-ke-size=&quot;size16&quot;&gt;실제 운영 환경에서는 Smart Scan이 &lt;b&gt;부분적으로만 동작&lt;/b&gt;하거나 &lt;b&gt;비활성화되는 상황&lt;/b&gt;도 종종 발생합니다.&lt;br /&gt;이런 경우 원인을 파악하지 않으면 성능이 기대치만큼 나오지 않기 때문에, &lt;b&gt;실행 계획만 보는 것보다 통계와 Wait Event 분석까지 함께&lt;/b&gt; 해야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;309&quot; data-start=&quot;291&quot; data-ke-size=&quot;size16&quot;&gt;아래에 상황별로 정리해드릴게요 &lt;/p&gt;
&lt;hr data-end=&quot;314&quot; data-start=&quot;311&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;362&quot; data-start=&quot;316&quot; data-ke-size=&quot;size26&quot;&gt;  1. &amp;ldquo;STORAGE&amp;rdquo;가 보인다고 무조건 Smart Scan이 아님 ⚠️&lt;/h2&gt;
&lt;p data-end=&quot;373&quot; data-start=&quot;364&quot; data-ke-size=&quot;size16&quot;&gt;실행 계획에서 &lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ACCESS&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;STORAGE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FULL&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;514&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 보이더라도 다음과 같은 이유로 Smart Scan이 완전히 적용되지 않을 수 있습니다.&lt;br /&gt;  즉, 실제로는 &lt;b&gt;Block I/O&lt;/b&gt;가 일부 또는 전부 사용될 수도 있다는 뜻입니다.&lt;/p&gt;
&lt;hr data-end=&quot;519&quot; data-start=&quot;516&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;559&quot; data-start=&quot;521&quot; data-ke-size=&quot;size26&quot;&gt;⚠️ 2. Smart Scan이 부분적으로만 동작하는 주요 상황&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;상황설명영향
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1169&quot; data-start=&quot;561&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1169&quot; data-start=&quot;601&quot;&gt;
&lt;tr data-end=&quot;718&quot; data-start=&quot;601&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;634&quot; data-start=&quot;601&quot;&gt;① 블록의 최신 상태를 스토리지가 확신할 수 없는 경우&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;698&quot; data-start=&quot;634&quot;&gt;변경 가능성이 있는 블록은 Smart Scan으로 처리 불가 &amp;rarr; 블록을 DB 서버로 전송해 버퍼 캐시에서 확인&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;718&quot; data-start=&quot;698&quot;&gt;Smart Scan 부분 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;825&quot; data-start=&quot;719&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;750&quot; data-start=&quot;719&quot;&gt;② Chained / Migrated Rows 발생&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;816&quot; data-start=&quot;750&quot;&gt;한 행이 여러 블록에 걸쳐 있을 경우, Smart Scan으로는 완전한 로우 반환 불가 &amp;rarr; 추가 블록 I/O 발생&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;825&quot; data-start=&quot;816&quot;&gt;성능 저하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;917&quot; data-start=&quot;826&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;850&quot; data-start=&quot;826&quot;&gt;③ Dynamic Sampling 발생&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;899&quot; data-start=&quot;850&quot;&gt;옵티마이저가 실행 전 샘플링을 위해 별도 I/O 수행 &amp;rarr; Smart Scan 미사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;917&quot; data-start=&quot;899&quot;&gt;성능 예측치와 실제치 차이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;995&quot; data-start=&quot;918&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;938&quot; data-start=&quot;918&quot;&gt;④ 스토리지 서버 CPU 과부하&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;986&quot; data-start=&quot;938&quot;&gt;셀 서버의 CPU가 DB 서버보다 많이 사용되고 있으면 일부 처리를 DB로 되돌림&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;995&quot; data-start=&quot;986&quot;&gt;성능 하락&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1080&quot; data-start=&quot;996&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1018&quot; data-start=&quot;996&quot;&gt;⑤ 데이터가 이미 버퍼 캐시에 존재&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1062&quot; data-start=&quot;1018&quot;&gt;Smart Scan이 필요 없어짐 &amp;rarr; Buffer Cache Copy 사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1080&quot; data-start=&quot;1062&quot;&gt;디스크 I/O 자체 미발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1169&quot; data-start=&quot;1081&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1114&quot; data-start=&quot;1081&quot;&gt;⑥ Storage Server Quarantine 발생&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1149&quot; data-start=&quot;1114&quot;&gt;문제가 된 스토리지 셀에서 Smart Scan이 비활성화됨&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1169&quot; data-start=&quot;1149&quot;&gt;Smart Scan 완전 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1174&quot; data-start=&quot;1171&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1205&quot; data-start=&quot;1176&quot; data-ke-size=&quot;size26&quot;&gt;  3. 각 상황에 대한 조금 더 구체적 설명&lt;/h2&gt;
&lt;h3 data-end=&quot;1237&quot; data-start=&quot;1207&quot; data-ke-size=&quot;size23&quot;&gt;  (1) Block Current Check&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1416&quot; data-start=&quot;1238&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1238&quot;&gt;Smart Scan은 기본적으로 **읽기 전용 데이터(consistent read)**에 최적화되어 있음.&lt;/li&gt;
&lt;li data-end=&quot;1416&quot; data-start=&quot;1300&quot;&gt;블록이 변경되었거나 dirty 상태일 가능성이 있을 때, Exadata는 그 블록을 DB 서버로 전송해 &lt;b&gt;버퍼 캐시에서 검증&lt;/b&gt;합니다.&lt;br /&gt;  Smart Scan은 적용되지만, 추가 블록 I/O가 발생함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1421&quot; data-start=&quot;1418&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1457&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size23&quot;&gt;  (2) Chained / Migrated Rows&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1601&quot; data-start=&quot;1458&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1507&quot; data-start=&quot;1458&quot;&gt;한 행이 여러 블록에 걸쳐 있으면, 스토리지 셀에서 완전한 레코드를 구성할 수 없음.&lt;/li&gt;
&lt;li data-end=&quot;1601&quot; data-start=&quot;1508&quot;&gt;Smart Scan으로 일부만 가져오고 나머지는 일반 Block I/O로 처리.&lt;br /&gt;  테이블 설계나 PCTFREE 설정, 행 크기 조정 등을 통해 완화할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1606&quot; data-start=&quot;1603&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1635&quot; data-start=&quot;1608&quot; data-ke-size=&quot;size23&quot;&gt;  (3) Dynamic Sampling&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1768&quot; data-start=&quot;1636&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1700&quot; data-start=&quot;1636&quot;&gt;옵티마이저가 실행 시점에 통계 샘플링을 위해 디스크에서 데이터를 읽는 경우 Smart Scan이 적용되지 않음.&lt;/li&gt;
&lt;li data-end=&quot;1768&quot; data-start=&quot;1701&quot;&gt;OPTIMIZER_DYNAMIC_SAMPLING 수준을 적절히 조정하거나 통계를 미리 수집하는 것으로 회피 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1773&quot; data-start=&quot;1770&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1800&quot; data-start=&quot;1775&quot; data-ke-size=&quot;size23&quot;&gt;  (4) Storage CPU 부하&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1934&quot; data-start=&quot;1801&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1934&quot; data-start=&quot;1801&quot;&gt;스토리지 셀에서 Smart Scan을 수행할 CPU가 충분하지 않으면, 일부 predicate를 DB 서버에서 처리하게 됨.&lt;br /&gt;  스토리지 CPU 모니터링이 필요합니다 (cellcli metric 또는 AWR I/O 보고서 활용).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1939&quot; data-start=&quot;1936&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1968&quot; data-start=&quot;1941&quot; data-ke-size=&quot;size23&quot;&gt;  (5) Buffer Cache Hit&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2080&quot; data-start=&quot;1969&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2009&quot; data-start=&quot;1969&quot;&gt;Smart Scan은 &lt;b&gt;디스크 I/O가 발생할 때만 작동&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;2080&quot; data-start=&quot;2010&quot;&gt;이미 데이터가 버퍼 캐시에 있으면, DB 서버가 캐시에서 데이터를 바로 반환 &amp;rarr; Smart Scan 자체가 동작하지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2085&quot; data-start=&quot;2082&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2123&quot; data-start=&quot;2087&quot; data-ke-size=&quot;size23&quot;&gt;  (6) Storage Server Quarantine&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2254&quot; data-start=&quot;2124&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2181&quot; data-start=&quot;2124&quot;&gt;스토리지 셀에 장애나 오류가 발생하면 Oracle이 자동으로 해당 셀을 격리(quarantine).&lt;/li&gt;
&lt;li data-end=&quot;2254&quot; data-start=&quot;2182&quot;&gt;이 경우 Smart Scan은 비활성화되고, 일반 블록 I/O 경로로만 처리됨.&lt;br /&gt;  셀 상태 복구 후 정상 동작 재개 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2259&quot; data-start=&quot;2256&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2295&quot; data-start=&quot;2261&quot; data-ke-size=&quot;size26&quot;&gt;  4. Smart Scan 실제 동작 여부 확인 방법&lt;/h2&gt;
&lt;p data-end=&quot;2346&quot; data-start=&quot;2297&quot; data-ke-size=&quot;size16&quot;&gt;단순히 실행 계획만으로는 부족하고 &lt;b&gt;통계와 Wait Event&lt;/b&gt;를 같이 봐야 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2362&quot; data-start=&quot;2348&quot; data-ke-size=&quot;size23&quot;&gt;  ① 실행 계획&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;EXPLAIN PLAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;FOR&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ...; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(DBMS_XPLAN.DISPLAY); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2507&quot; data-start=&quot;2444&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2493&quot; data-start=&quot;2444&quot;&gt;TABLE ACCESS STORAGE FULL &amp;rarr; Smart Scan 가능성 존재&lt;/li&gt;
&lt;li data-end=&quot;2507&quot; data-start=&quot;2494&quot;&gt;단, 확정은 아님 ❗&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2512&quot; data-start=&quot;2509&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2540&quot; data-start=&quot;2514&quot; data-ke-size=&quot;size23&quot;&gt;  ② 시스템 통계(v$sysstat)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name, &lt;/span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$sysstat &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'%cell%'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2619&quot; data-start=&quot;2613&quot; data-ke-size=&quot;size16&quot;&gt;중요 지표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2790&quot; data-start=&quot;2620&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2682&quot; data-start=&quot;2620&quot;&gt;cell physical IO interconnect bytes returned by smart scan&lt;/li&gt;
&lt;li data-end=&quot;2740&quot; data-start=&quot;2683&quot;&gt;cell physical IO bytes eligible for predicate offload&lt;/li&gt;
&lt;li data-end=&quot;2790&quot; data-start=&quot;2741&quot;&gt;cell physical IO bytes saved by storage index&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2867&quot; data-start=&quot;2792&quot; data-ke-size=&quot;size16&quot;&gt;  Smart Scan이 제대로 동작하면 interconnect bytes 값이 작고 predicate offload가 커짐.&lt;/p&gt;
&lt;hr data-end=&quot;2872&quot; data-start=&quot;2869&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2894&quot; data-start=&quot;2874&quot; data-ke-size=&quot;size23&quot;&gt;  ③ Wait Events&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span&gt; event, total_waits, time_waited &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; v$system_event &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; event &lt;/span&gt;&lt;span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;'cell%'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3022&quot; data-start=&quot;2992&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 Smart Scan 관련 Wait Event:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3074&quot; data-start=&quot;3023&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3048&quot; data-start=&quot;3023&quot;&gt;cell smart table scan&lt;/li&gt;
&lt;li data-end=&quot;3074&quot; data-start=&quot;3049&quot;&gt;cell smart index scan&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3114&quot; data-start=&quot;3076&quot; data-ke-size=&quot;size16&quot;&gt;  이 이벤트가 보이면 실제 Smart Scan이 발생한 것입니다.&lt;/p&gt;
&lt;hr data-end=&quot;3119&quot; data-start=&quot;3116&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3139&quot; data-start=&quot;3121&quot; data-ke-size=&quot;size26&quot;&gt;  5. 성능 분석 시 팁&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;확인 항목정상 Smart ScanSmart Scan 부분/비활성
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3523&quot; data-start=&quot;3141&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3523&quot; data-start=&quot;3250&quot;&gt;
&lt;tr data-end=&quot;3287&quot; data-start=&quot;3250&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3258&quot; data-start=&quot;3250&quot;&gt;실행 계획&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3272&quot; data-start=&quot;3258&quot;&gt;STORAGE 표시됨&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3287&quot; data-start=&quot;3272&quot;&gt;STORAGE 표시됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3356&quot; data-start=&quot;3288&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3300&quot; data-start=&quot;3288&quot;&gt;cell 통계&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3323&quot; data-start=&quot;3300&quot;&gt;Interconnect bytes &amp;darr;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3356&quot; data-start=&quot;3323&quot;&gt;Interconnect bytes &amp;uarr; 또는 거의 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3438&quot; data-start=&quot;3357&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3370&quot; data-start=&quot;3357&quot;&gt;Wait Event&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3396&quot; data-start=&quot;3370&quot;&gt;cell smart table scan&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3438&quot; data-start=&quot;3396&quot;&gt;db file sequential/scattered read 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3471&quot; data-start=&quot;3439&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3450&quot; data-start=&quot;3439&quot;&gt;스토리지 CPU&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3458&quot; data-start=&quot;3450&quot;&gt;여유 있음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3471&quot; data-start=&quot;3458&quot;&gt;과부하 발생 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3523&quot; data-start=&quot;3472&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3487&quot; data-start=&quot;3472&quot;&gt;Buffer Cache&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3496&quot; data-start=&quot;3487&quot;&gt;적중률 적당&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3523&quot; data-start=&quot;3496&quot;&gt;너무 높을 경우 Smart Scan 비활성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3528&quot; data-start=&quot;3525&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3543&quot; data-start=&quot;3530&quot; data-ke-size=&quot;size26&quot;&gt;✅ 6. 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분Smart Scan 정상 동작Smart Scan 영향 받는 경우
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3869&quot; data-start=&quot;3545&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3869&quot; data-start=&quot;3657&quot;&gt;
&lt;tr data-end=&quot;3695&quot; data-start=&quot;3657&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3665&quot; data-start=&quot;3657&quot;&gt;실행 계획&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3680&quot; data-start=&quot;3665&quot;&gt;STORAGE FULL&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3695&quot; data-start=&quot;3680&quot;&gt;동일 (단서만 제공)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3744&quot; data-start=&quot;3696&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3705&quot; data-start=&quot;3696&quot;&gt;I/O 경로&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3719&quot; data-start=&quot;3705&quot;&gt;대부분 스토리지 처리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3744&quot; data-start=&quot;3719&quot;&gt;일부 또는 전체 Block I/O 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3806&quot; data-start=&quot;3745&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3753&quot; data-start=&quot;3745&quot;&gt;대표 상황&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3770&quot; data-start=&quot;3753&quot;&gt;대용량 Table Scan&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3806&quot; data-start=&quot;3770&quot;&gt;변경 블록, 체인 로우, Dynamic Sampling 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3869&quot; data-start=&quot;3807&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3815&quot; data-start=&quot;3807&quot;&gt;진단 방법&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3845&quot; data-start=&quot;3815&quot;&gt;v$sysstat, Wait Event, 실행계획&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3869&quot; data-start=&quot;3845&quot;&gt;통계/이벤트/스토리지 상태 함께 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4002&quot; data-start=&quot;3871&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 포인트:&lt;/b&gt;&lt;br /&gt;실행 계획에 STORAGE가 보인다고 Smart Scan이 100% 적용되는 게 아닙니다.&lt;br /&gt;실제 동작은 &lt;b&gt;통계 + Wait Event + 스토리지 상태&lt;/b&gt;까지 함께 봐야 정확히 판단할 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhDZCf/dJMb9WFq5lq/KXkA797Kuw81qRE9KbQt81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhDZCf/dJMb9WFq5lq/KXkA797Kuw81qRE9KbQt81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhDZCf/dJMb9WFq5lq/KXkA797Kuw81qRE9KbQt81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhDZCf%2FdJMb9WFq5lq%2FKXkA797Kuw81qRE9KbQt81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;523&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;523&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;service time = cpu time + wait time&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;cpu큰데, wait작다 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 자원대기는 안하는데 cpu time 크다 ? 작업량 많은 상황 =&amp;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;statics : pysical &amp;amp; reads logical reads&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;cpu작은데, wait크다?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 메모리 크게 변경 등, instanent 튜닝으로 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wait event : buffer busy waits =&amp;gt; ASSM&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Monitoring&amp;nbsp;Exadata&amp;nbsp;Smart&amp;nbsp;Scan&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;V$SESSION_EVENT 세션단위로 스마트스캔이 일어났는지 확인 불가&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; v$system_event 시스템 단위로 스마트스캔 일어났는지 확은 가능함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;but, 확인 방법은 처음 실행 후 다시 실행했을 때 스마트 스캔이 일어났는지 확인함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HY0lI/dJMb9OgpFw0/gSfNSQyu2RJ5H7wJH6nqeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HY0lI/dJMb9OgpFw0/gSfNSQyu2RJ5H7wJH6nqeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HY0lI/dJMb9OgpFw0/gSfNSQyu2RJ5H7wJH6nqeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHY0lI%2FdJMb9OgpFw0%2FgSfNSQyu2RJ5H7wJH6nqeK%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;588&quot; height=&quot;309&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjwOBt/dJMb9YJ1sxs/KWqG2XN9KOxR6wn20RRs8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjwOBt/dJMb9YJ1sxs/KWqG2XN9KOxR6wn20RRs8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjwOBt/dJMb9YJ1sxs/KWqG2XN9KOxR6wn20RRs8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjwOBt%2FdJMb9YJ1sxs%2FKWqG2XN9KOxR6wn20RRs8k%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;617&quot; height=&quot;330&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;330&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;6216 -&amp;gt; 6509 아, 스마트스캔 실행됐구나 확인가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 트레이스파일로 마스터프로세스랑 슬래이브프로세스가 실행한 걸 확인하여 알 수도 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV52oo/dJMb9LDZtOU/MkGUGkxWVRK7c20C8jAV21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV52oo/dJMb9LDZtOU/MkGUGkxWVRK7c20C8jAV21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV52oo/dJMb9LDZtOU/MkGUGkxWVRK7c20C8jAV21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV52oo%2FdJMb9LDZtOU%2FMkGUGkxWVRK7c20C8jAV21%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;609&quot; height=&quot;201&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;201&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;610&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciTna2/dJMb9YwudxW/aiXdEUguyxhrwpdemif2g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciTna2/dJMb9YwudxW/aiXdEUguyxhrwpdemif2g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciTna2/dJMb9YwudxW/aiXdEUguyxhrwpdemif2g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciTna2%2FdJMb9YwudxW%2FaiXdEUguyxhrwpdemif2g0%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;610&quot; height=&quot;323&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/172</guid>
      <comments>https://aonee.tistory.com/172#entry172comment</comments>
      <pubDate>Wed, 22 Oct 2025 16:47:35 +0900</pubDate>
    </item>
    <item>
      <title>[Exadata day2] Exadata 핵심기능 및 초기 설정</title>
      <link>https://aonee.tistory.com/171</link>
      <description>&lt;h3 data-end=&quot;419&quot; data-start=&quot;390&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4~6장: 핵심 기능 및 초기 설정&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;599&quot; data-start=&quot;420&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;487&quot; data-start=&quot;420&quot;&gt;&lt;b&gt;4장&lt;/b&gt;: Smart Scan, Smart Flash Cache, PMEM 등 Exadata 성능 최적화 기술&lt;/li&gt;
&lt;li data-end=&quot;531&quot; data-start=&quot;488&quot;&gt;&lt;b&gt;5장&lt;/b&gt;: 설치 전 준비(OEDA 사용), 초기 설치 및 배포 절차&lt;/li&gt;
&lt;li data-end=&quot;599&quot; data-start=&quot;532&quot;&gt;&lt;b&gt;6장&lt;/b&gt;: 스토리지 서버(Cell) 구성 &amp;mdash; CellCLI, Grid Disks, ASM Disk Group 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Classic&amp;nbsp;Database&amp;nbsp;I/O&amp;nbsp;and&amp;nbsp;SQL&amp;nbsp;Processing&amp;nbsp;Model&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baiKTK/dJMb9VNh6mY/2K9U6nmG1S7q2cNUTA1vN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baiKTK/dJMb9VNh6mY/2K9U6nmG1S7q2cNUTA1vN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baiKTK/dJMb9VNh6mY/2K9U6nmG1S7q2cNUTA1vN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaiKTK%2FdJMb9VNh6mY%2F2K9U6nmG1S7q2cNUTA1vN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;283&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;71&quot; data-start=&quot;44&quot; data-ke-size=&quot;size26&quot;&gt;  전통적인 DB(SQL) 처리 방식이란?&lt;/h2&gt;
&lt;p data-end=&quot;189&quot; data-start=&quot;73&quot; data-ke-size=&quot;size16&quot;&gt;예전 방식의 데이터베이스 시스템에서는 &amp;ldquo;&lt;b&gt;모든 똑똑한 처리&lt;/b&gt;&amp;rdquo;가 데이터베이스 서버 안에서만 이뤄집니다.&lt;br /&gt;즉, 저장소(스토리지)는 단순히 데이터를 &lt;b&gt;보관만&lt;/b&gt; 하고, 실제 연산은 모두 서버가 처리하죠.&lt;/p&gt;
&lt;hr data-end=&quot;194&quot; data-start=&quot;191&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;236&quot; data-start=&quot;196&quot; data-ke-size=&quot;size26&quot;&gt;  예시: 테이블에서 데이터 검색(SELECT)할 때의 처리 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;640&quot; data-start=&quot;238&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;295&quot; data-start=&quot;238&quot;&gt;&lt;b&gt;사용자가 SELECT문 실행&lt;/b&gt;&lt;br /&gt;&amp;rarr; 예: &amp;ldquo;이 조건에 맞는 고객 정보만 보여줘!&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;369&quot; data-start=&quot;297&quot;&gt;&lt;b&gt;DB가 해당 데이터 위치 확인&lt;/b&gt;&lt;br /&gt;&amp;rarr; 어떤 파일&amp;middot;영역(Extent)에 이 테이블이 저장돼 있는지 찾아냅니다.&lt;/li&gt;
&lt;li data-end=&quot;439&quot; data-start=&quot;371&quot;&gt;&lt;b&gt;DB가 스토리지에 읽기 요청&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테이블이 저장된 모든 블록(데이터 조각)을 읽어오라고 요청합니다.&lt;/li&gt;
&lt;li data-end=&quot;518&quot; data-start=&quot;441&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;모든 블록을 메모리로 가져옴&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&amp;rarr; 조건에 맞는 데이터만 필요한데도, &lt;b&gt;테이블 전체 블록&lt;/b&gt;이 메모리로 올라옵니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;588&quot; data-start=&quot;520&quot;&gt;&lt;b&gt;DB 서버에서 조건 필터링 작업&lt;/b&gt;&lt;br /&gt;&amp;rarr; 가져온 데이터 중에서 SELECT 조건에 맞는 행만 찾습니다.&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;590&quot;&gt;&lt;b&gt;필요한 행만 사용자에게 반환&lt;/b&gt;&lt;br /&gt;&amp;rarr; 최종적으로 원하는 결과만 보여집니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;645&quot; data-start=&quot;642&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;664&quot; data-start=&quot;647&quot; data-ke-size=&quot;size26&quot;&gt;⚠️ 비효율이 생기는 이유&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;840&quot; data-start=&quot;666&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;703&quot; data-start=&quot;666&quot;&gt;조건에 맞는 데이터만 필요한데도 &amp;rarr; 테이블 전체를 읽어야 함&lt;/li&gt;
&lt;li data-end=&quot;745&quot; data-start=&quot;704&quot;&gt;이 과정에서 네트워크로 데이터가 대량 전송되고 메모리를 많이 차지함&lt;/li&gt;
&lt;li data-end=&quot;786&quot; data-start=&quot;746&quot;&gt;즉, &lt;b&gt;불필요한 데이터 I/O&lt;/b&gt;(읽기 작업)가 엄청나게 발생함&lt;/li&gt;
&lt;li data-end=&quot;840&quot; data-start=&quot;787&quot;&gt;결과적으로 &lt;b&gt;속도 저하&lt;/b&gt;, &lt;b&gt;서버 부하 증가&lt;/b&gt;, &lt;b&gt;처리 효율 저하&lt;/b&gt;로 이어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;845&quot; data-start=&quot;842&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;860&quot; data-start=&quot;847&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;정리하자면&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;971&quot; data-start=&quot;861&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;971&quot; data-start=&quot;863&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;조건에 맞는 데이터만 딱 읽는 게 아니라, 테이블 전체를 읽은 뒤에 걸러내는 방식&amp;rdquo;이라서 &lt;b&gt;비효율적&lt;/b&gt;입니다.&lt;br /&gt;특히 큰 테이블일수록 이런 낭비가 커지고, 시스템 성능에 영향을 줍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Exadata&amp;nbsp;Smart&amp;nbsp;Scan&amp;nbsp;Model&lt;/span&gt;&lt;/blockquote&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;462&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Whn99/dJMb9QkZAbR/VYbB1GhLpo47EZpKtJQbYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Whn99/dJMb9QkZAbR/VYbB1GhLpo47EZpKtJQbYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Whn99/dJMb9QkZAbR/VYbB1GhLpo47EZpKtJQbYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWhn99%2FdJMb9QkZAbR%2FVYbB1GhLpo47EZpKtJQbYK%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;462&quot; height=&quot;284&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;61&quot; data-start=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;⚡ Exadata Smart Scan이란?&lt;/h2&gt;
&lt;p data-end=&quot;245&quot; data-start=&quot;63&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Oracle Exadata&lt;/span&gt;는 &lt;b&gt;기존 방식&lt;/b&gt;과 달리, 단순히 데이터를 저장만 하는 게 아니라 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;스토리지(저장장치)&lt;/b&gt; 자체에서 &lt;b&gt;데이터를 먼저 걸러주는 똑똑한 방식&lt;/b&gt;&lt;/span&gt;을 사용합니다.&lt;br /&gt;즉, &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;필요한 데이터만 서버로&lt;/span&gt; 보내기 때문에&lt;/b&gt; 속도도 빠르고 자원 낭비도 훨씬 줄어듭니다.&lt;/p&gt;
&lt;hr data-end=&quot;250&quot; data-start=&quot;247&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;283&quot; data-start=&quot;252&quot; data-ke-size=&quot;size26&quot;&gt;  Exadata Smart Scan의 처리 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;779&quot; data-start=&quot;285&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;343&quot; data-start=&quot;285&quot;&gt;&lt;b&gt;사용자가 SELECT문 실행&lt;/b&gt;&lt;br /&gt;&amp;rarr; 예: &amp;ldquo;특정 조건에 맞는 고객 정보만 보여줘!&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;446&quot; data-start=&quot;345&quot;&gt;&lt;b&gt;DB가 Exadata 저장소에 명령 전달&lt;/b&gt;&lt;br /&gt;&amp;rarr; 이 데이터가 Exadata 셀에 있으면, 서버가 iDB라는 특수 명령으로 &lt;b&gt;직접 스토리지에게 작업을 시킵니다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;573&quot; data-start=&quot;448&quot;&gt;&lt;b&gt;스&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;토리지에서 먼저 필터링 작업&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;rarr; Exadata가 **필요한 행(Row)**과 **필요한 컬럼(Column)**만 미리 골라냅니다.&lt;br /&gt;&amp;rarr; 즉, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;조건에 안 맞는 데이터는 아예 서버로 올라오지 않음❌ where절 처리함&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;575&quot;&gt;&lt;b&gt;필요한 데이터만 서버로 전송&lt;/b&gt;&lt;br /&gt;&amp;rarr; 기존처럼 블록 단위가 아니라, &lt;b&gt;결과만 요약해서&lt;/b&gt; iDB 메시지로 전달합니다.&lt;br /&gt;&amp;rarr; 버퍼 캐시에 블록을 저장할 필요도 없습니다.&lt;/li&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;684&quot;&gt;&lt;b&gt;DB 서버에서 결과 합치기&lt;/b&gt;&lt;br /&gt;&amp;rarr; 여러 Exadata 셀에서 온 결과를 병렬 처리처럼 합쳐 최종 결과를 만듭니다.&lt;/li&gt;
&lt;li data-end=&quot;779&quot; data-start=&quot;759&quot;&gt;&lt;b&gt;사용자에게 결과 전달&lt;/b&gt; ✅&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;784&quot; data-start=&quot;781&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;803&quot; data-start=&quot;786&quot; data-ke-size=&quot;size26&quot;&gt;  이렇게 하면 좋은 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;958&quot; data-start=&quot;805&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;847&quot; data-start=&quot;805&quot;&gt;  &lt;b&gt;불필요한 I/O가 거의 없음&lt;/b&gt; &amp;rarr; 테이블 전체를 읽지 않음&lt;/li&gt;
&lt;li data-end=&quot;892&quot; data-start=&quot;848&quot;&gt;  &lt;b&gt;CPU 사용량 절감&lt;/b&gt; &amp;rarr; 서버는 결과만 합치면 되니까 가벼워짐&lt;/li&gt;
&lt;li data-end=&quot;930&quot; data-start=&quot;893&quot;&gt;⚡ &lt;b&gt;쿼리 속도 향상&lt;/b&gt; &amp;rarr; 큰 테이블도 빠르게 조회 가능&lt;/li&gt;
&lt;li data-end=&quot;958&quot; data-start=&quot;931&quot;&gt;  &lt;b&gt;더 많은 요청을 동시에 처리 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;963&quot; data-start=&quot;960&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;998&quot; data-start=&quot;965&quot; data-ke-size=&quot;size26&quot;&gt;전통 방식 vs Exadata Smart Scan&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분전통적인 DB 방식Exadata Smart Scan 방식
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1636&quot; data-start=&quot;1000&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1636&quot; data-start=&quot;1239&quot;&gt;
&lt;tr data-end=&quot;1340&quot; data-start=&quot;1239&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1260&quot; data-start=&quot;1239&quot;&gt;데이터 필터링 위치&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1296&quot; data-start=&quot;1260&quot;&gt;DB 서버에서 처리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1340&quot; data-start=&quot;1296&quot;&gt;스토리지(Exadata)에서 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1443&quot; data-start=&quot;1341&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1366&quot; data-start=&quot;1341&quot;&gt;I/O 발생량&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1400&quot; data-start=&quot;1366&quot;&gt;테이블 전체 블록 전송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1443&quot; data-start=&quot;1400&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;필요한 데이터만 전송&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1538&quot; data-start=&quot;1444&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1469&quot; data-start=&quot;1444&quot;&gt;CPU 사용량&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1501&quot; data-start=&quot;1469&quot;&gt;서버에서 많은 연산 수행&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1538&quot; data-start=&quot;1501&quot;&gt;서버 부담 감소 (스토리지에서 전처리)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1636&quot; data-start=&quot;1539&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1566&quot; data-start=&quot;1539&quot;&gt;속도&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1594&quot; data-start=&quot;1566&quot;&gt;느릴 수 있음 (대량 데이터 전송 때문)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1636&quot; data-start=&quot;1594&quot;&gt;빠름 (필요한 결과만 전송)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1641&quot; data-start=&quot;1638&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1656&quot; data-start=&quot;1643&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;정리하자면&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1759&quot; data-start=&quot;1657&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1759&quot; data-start=&quot;1659&quot; data-ke-size=&quot;size16&quot;&gt;Exadata Smart Scan은 &amp;ldquo;필요한 데이터만 똑똑하게 골라서 보내주는&amp;rdquo; 기술입니다.&lt;br /&gt;덕분에 &lt;b&gt;쿼리 성능이 대폭 향상&lt;/b&gt;되고, 서버 자원도 절약할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Smart Scan vs Index Scan ?&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-end=&quot;186&quot; data-start=&quot;163&quot; data-ke-size=&quot;size26&quot;&gt;  1. Index Scan 이란?&lt;/h2&gt;
&lt;p data-end=&quot;254&quot; data-start=&quot;188&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Index Scan&lt;/b&gt;은 말 그대로 &amp;ldquo;&lt;b&gt;인덱스&lt;/b&gt;&amp;rdquo;를 이용해서 &lt;b&gt;필요한 데이터 위치만 찾아 읽는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;268&quot; data-start=&quot;256&quot; data-ke-size=&quot;size23&quot;&gt;  동작 방식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;390&quot; data-start=&quot;269&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;320&quot; data-start=&quot;269&quot;&gt;DB는 인덱스를 검색해서 조건에 맞는 &lt;b&gt;ROWID&lt;/b&gt;(데이터의 위치)를 찾습니다.&lt;/li&gt;
&lt;li data-end=&quot;357&quot; data-start=&quot;321&quot;&gt;그 위치로 가서 &lt;b&gt;필요한 데이터 블록만&lt;/b&gt; 읽어옵니다.&lt;/li&gt;
&lt;li data-end=&quot;390&quot; data-start=&quot;358&quot;&gt;조건에 맞는 데이터를 추출해서 사용자에게 전달합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;401&quot; data-start=&quot;392&quot; data-ke-size=&quot;size23&quot;&gt;  장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;463&quot; data-start=&quot;402&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;431&quot; data-start=&quot;402&quot;&gt;필요한 데이터가 &lt;b&gt;적을 때&lt;/b&gt; 매우 빠름 ✅&lt;/li&gt;
&lt;li data-end=&quot;463&quot; data-start=&quot;432&quot;&gt;불필요한 블록을 거의 읽지 않음 (정확한 위치 접근)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;474&quot; data-start=&quot;465&quot; data-ke-size=&quot;size23&quot;&gt;⚠️ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;578&quot; data-start=&quot;475&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;534&quot; data-start=&quot;475&quot;&gt;&lt;b&gt;매우 많은 데이터&lt;/b&gt;를 읽을 경우, 인덱스를 통해 건건이 찾아가야 하므로 오히려 느릴 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;578&quot; data-start=&quot;535&quot;&gt;Full Table Scan보다 비효율적일 수도 있음(랜덤 I/O 증가).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;583&quot; data-start=&quot;580&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;607&quot; data-start=&quot;585&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 2. Smart Scan 이란?&lt;/h2&gt;
&lt;p data-end=&quot;690&quot; data-start=&quot;609&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Smart Scan&lt;/b&gt;은 Exadata에서만 가능한 방식으로, &lt;b&gt;스토리지에서 먼저 필터링&lt;/b&gt;해 불필요한 데이터를 아예 안 올리는 방식입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;704&quot; data-start=&quot;692&quot; data-ke-size=&quot;size23&quot;&gt;  동작 방식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;812&quot; data-start=&quot;705&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;745&quot; data-start=&quot;705&quot;&gt;서버는 SELECT 조건을 Exadata 스토리지에 전달합니다.&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;746&quot;&gt;Exadata가 스토리지 단에서 조건에 맞는 행과 컬럼만 추출합니다.&lt;/li&gt;
&lt;li data-end=&quot;812&quot; data-start=&quot;790&quot;&gt;필요한 데이터만 서버로 전달합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;823&quot; data-start=&quot;814&quot; data-ke-size=&quot;size23&quot;&gt;  장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;909&quot; data-start=&quot;824&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;875&quot; data-start=&quot;824&quot;&gt;테이블이 &lt;b&gt;크고, 조건이 있는 Full Table Scan&lt;/b&gt;일 때 매우 효율적 ✅&lt;/li&gt;
&lt;li data-end=&quot;909&quot; data-start=&quot;876&quot;&gt;불필요한 I/O 최소화, 네트워크 부하 적음, 속도 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;920&quot; data-start=&quot;911&quot; data-ke-size=&quot;size23&quot;&gt;⚠️ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1019&quot; data-start=&quot;921&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;976&quot; data-start=&quot;921&quot;&gt;&lt;b&gt;인덱스를 쓰는 상황&lt;/b&gt;(소량의 특정 행 검색)에는 Smart Scan이 굳이 필요 없음.&lt;/li&gt;
&lt;li data-end=&quot;1019&quot; data-start=&quot;977&quot;&gt;Smart Scan은 주로 &lt;b&gt;대량 데이터 조회&lt;/b&gt;에서 성능이 극대화됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1024&quot; data-start=&quot;1021&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1056&quot; data-start=&quot;1026&quot; data-ke-size=&quot;size26&quot;&gt;  Index Scan vs Smart Scan&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목Index ScanSmart Scan (Exadata)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1946&quot; data-start=&quot;1058&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1946&quot; data-start=&quot;1322&quot;&gt;
&lt;tr data-end=&quot;1441&quot; data-start=&quot;1322&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1348&quot; data-start=&quot;1322&quot;&gt;처리 위치&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1390&quot; data-start=&quot;1348&quot;&gt;DB 서버&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1441&quot; data-start=&quot;1390&quot;&gt;스토리지(Exadata 셀)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1541&quot; data-start=&quot;1442&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1466&quot; data-start=&quot;1442&quot;&gt;대상 데이터 양&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1498&quot; data-start=&quot;1466&quot;&gt;소량의 특정 데이터에 적합&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1541&quot; data-start=&quot;1498&quot;&gt;대량 데이터 + 조건 검색 시 유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1632&quot; data-start=&quot;1542&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1569&quot; data-start=&quot;1542&quot;&gt;I/O 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1597&quot; data-start=&quot;1569&quot;&gt;인덱스를 통해 필요한 블록만 랜덤 접근&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1632&quot; data-start=&quot;1597&quot;&gt;스토리지에서 먼저 필터링 후 최소 데이터만 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1741&quot; data-start=&quot;1633&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1661&quot; data-start=&quot;1633&quot;&gt;CPU 부하&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1702&quot; data-start=&quot;1661&quot;&gt;서버 CPU 사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1741&quot; data-start=&quot;1702&quot;&gt;스토리지에서 분산 처리 &amp;rarr; 서버 부담 적음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1843&quot; data-start=&quot;1742&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1768&quot; data-start=&quot;1742&quot;&gt;사용 시점&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1801&quot; data-start=&quot;1768&quot;&gt;WHERE 절로 특정한 데이터만 찾을 때&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1843&quot; data-start=&quot;1801&quot;&gt;Full Table Scan 시 성능 극대화 (조건 필터링 있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1946&quot; data-start=&quot;1844&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1870&quot; data-start=&quot;1844&quot;&gt;대표 예&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1911&quot; data-start=&quot;1870&quot;&gt;&amp;ldquo;ID = 12345&amp;rdquo; 한 건 찾기&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1946&quot; data-start=&quot;1911&quot;&gt;&amp;ldquo;매출 100만원 이상 고객 전체 조회&amp;rdquo; 같이 대량 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1951&quot; data-start=&quot;1948&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1964&quot; data-start=&quot;1953&quot; data-ke-size=&quot;size26&quot;&gt;  정리하자면&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2081&quot; data-start=&quot;1965&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2021&quot; data-start=&quot;1965&quot;&gt;  &lt;b&gt;Index Scan&lt;/b&gt; &amp;rarr; &lt;b&gt;소량&lt;/b&gt;의 특정 데이터를 찾을 때 유리 (인덱스 활용)&lt;/li&gt;
&lt;li data-end=&quot;2081&quot; data-start=&quot;2022&quot;&gt;⚡ &lt;b&gt;Smart Scan&lt;/b&gt; &amp;rarr; &lt;b&gt;대량 데이터&lt;/b&gt;를 조건으로 걸러낼 때 유리 (스토리지에서 필터링)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2086&quot; data-start=&quot;2083&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2098&quot; data-start=&quot;2088&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;2211&quot; data-start=&quot;2099&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2161&quot; data-start=&quot;2099&quot;&gt;Exadata 환경에서도 소량 데이터라면 Index Scan이 Smart Scan보다 빠를 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;2211&quot; data-start=&quot;2162&quot;&gt;반대로 수십~수백만 건 이상을 조회할 때는 Smart Scan이 압도적으로 빠릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;Exadata Storage Index&lt;/blockquote&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;797&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1p3Gw/dJMb9XRSpZG/JVQZXMwwDdIAsgdFtE6dY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1p3Gw/dJMb9XRSpZG/JVQZXMwwDdIAsgdFtE6dY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1p3Gw/dJMb9XRSpZG/JVQZXMwwDdIAsgdFtE6dY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1p3Gw%2FdJMb9XRSpZG%2FJVQZXMwwDdIAsgdFtE6dY1%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;797&quot; height=&quot;456&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;202&quot; data-start=&quot;178&quot; data-ke-size=&quot;size26&quot;&gt;  1. Storage Index란?&lt;/h2&gt;
&lt;blockquote data-end=&quot;286&quot; data-start=&quot;204&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;286&quot; data-start=&quot;206&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;**스토리지(저장소)**에 있는 데이터의 &lt;b&gt;최솟값/최댓값 정보를 기억해두고&lt;/b&gt;,&lt;br /&gt;조건에 안 맞는 영역은 아예 읽지 않게 해주는 기능&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;383&quot; data-start=&quot;288&quot; data-ke-size=&quot;size16&quot;&gt;기존에는 &lt;b&gt;모든 블록을 읽은 후에&lt;/b&gt; 조건에 맞는 데이터를 걸러냈지만,&lt;br /&gt;Storage Index는 &lt;b&gt;읽기 전에&lt;/b&gt; &amp;ldquo;이 영역은 볼 필요 없어&amp;rdquo;라고 미리 판단합니다.&lt;/p&gt;
&lt;hr data-end=&quot;717&quot; data-start=&quot;714&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;741&quot; data-start=&quot;719&quot; data-ke-size=&quot;size26&quot;&gt;  2. 내부 구조 (간단 버전)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;943&quot; data-start=&quot;743&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;814&quot; data-start=&quot;743&quot;&gt;Exadata의 디스크는 &lt;b&gt;1MB 단위&lt;/b&gt;로 잘게 나뉘어 있는데, 이를 &lt;b&gt;Storage Region&lt;/b&gt;이라고 합니다.&lt;/li&gt;
&lt;li data-end=&quot;894&quot; data-start=&quot;815&quot;&gt;각 Region마다 **최솟값(MIN)**과 &lt;b&gt;최댓값(MAX)&lt;/b&gt; 정보를 메모리에 저장해둔 것이 &lt;b&gt;Region Index&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;943&quot; data-start=&quot;895&quot;&gt;여러 Region Index를 모은 것이 바로 &lt;b&gt;Storage Index&lt;/b&gt;예요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;945&quot; data-ke-size=&quot;size16&quot;&gt;  예:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;RegionB 컬럼 MINB 컬럼 MAX
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1090&quot; data-start=&quot;953&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1090&quot; data-start=&quot;1021&quot;&gt;
&lt;tr data-end=&quot;1055&quot; data-start=&quot;1021&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1030&quot; data-start=&quot;1021&quot;&gt;1MB 1&lt;/td&gt;
&lt;td data-end=&quot;1042&quot; data-start=&quot;1030&quot; data-col-size=&quot;sm&quot;&gt;1&lt;/td&gt;
&lt;td data-end=&quot;1055&quot; data-start=&quot;1042&quot; data-col-size=&quot;sm&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1090&quot; data-start=&quot;1056&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1065&quot; data-start=&quot;1056&quot;&gt;1MB 2&lt;/td&gt;
&lt;td data-end=&quot;1077&quot; data-start=&quot;1065&quot; data-col-size=&quot;sm&quot;&gt;3&lt;/td&gt;
&lt;td data-end=&quot;1090&quot; data-start=&quot;1077&quot; data-col-size=&quot;sm&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1127&quot; data-start=&quot;1092&quot; data-ke-size=&quot;size16&quot;&gt;쿼리 시 이 정보를 기준으로 &lt;b&gt;읽을지/건너뛸지 판단&lt;/b&gt;합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1132&quot; data-start=&quot;1129&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1160&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size26&quot;&gt;  3. Storage Index의 장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1285&quot; data-start=&quot;1162&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1201&quot; data-start=&quot;1162&quot;&gt;  &lt;b&gt;불필요한 I/O 제거&lt;/b&gt; &amp;rarr; 디스크에서 덜 읽으니 빠름&lt;/li&gt;
&lt;li data-end=&quot;1244&quot; data-start=&quot;1202&quot;&gt;  &lt;b&gt;서버 부하 감소&lt;/b&gt; &amp;rarr; 읽을 게 줄어드니 CPU/메모리 절약&lt;/li&gt;
&lt;li data-end=&quot;1285&quot; data-start=&quot;1245&quot;&gt;⚡ &lt;b&gt;자동으로 관리됨&lt;/b&gt; &amp;rarr; DBA가 따로 인덱스를 만들 필요 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1290&quot; data-start=&quot;1287&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1310&quot; data-start=&quot;1292&quot; data-ke-size=&quot;size26&quot;&gt;  4. 특징 &amp;amp; 제약사항&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1756&quot; data-start=&quot;1312&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1756&quot; data-start=&quot;1386&quot;&gt;
&lt;tr data-end=&quot;1431&quot; data-start=&quot;1386&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1410&quot; data-start=&quot;1386&quot;&gt;관리 필요 여부&lt;/td&gt;
&lt;td data-end=&quot;1431&quot; data-start=&quot;1410&quot; data-col-size=&quot;md&quot;&gt;❌ 없음 &amp;mdash; 자동으로 생성/삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1480&quot; data-start=&quot;1432&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1458&quot; data-start=&quot;1432&quot;&gt;작동 시점&lt;/td&gt;
&lt;td data-end=&quot;1480&quot; data-start=&quot;1458&quot; data-col-size=&quot;md&quot;&gt;Smart Scan 시 자동 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1568&quot; data-start=&quot;1481&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1504&quot; data-start=&quot;1481&quot;&gt;데이터 유형 제한&lt;/td&gt;
&lt;td data-end=&quot;1568&quot; data-start=&quot;1504&quot; data-col-size=&quot;md&quot;&gt;숫자(NUMBER), 날짜(DATE), 문자열(VARCHAR2) 등은 가능&lt;br /&gt;단 NLS 의존 타입은 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1620&quot; data-start=&quot;1569&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1593&quot; data-start=&quot;1569&quot;&gt;사라지는 시점&lt;/td&gt;
&lt;td data-end=&quot;1620&quot; data-start=&quot;1593&quot; data-col-size=&quot;md&quot;&gt;메모리에만 존재 &amp;rarr; 셀이 재부팅되면 사라짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1670&quot; data-start=&quot;1621&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1647&quot; data-start=&quot;1621&quot;&gt;복구 방식&lt;/td&gt;
&lt;td data-end=&quot;1670&quot; data-start=&quot;1647&quot; data-col-size=&quot;md&quot;&gt;재부팅 후 첫 쿼리 시 자동 재생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1756&quot; data-start=&quot;1671&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1693&quot; data-start=&quot;1671&quot;&gt;가장 효과적인 상황&lt;/td&gt;
&lt;td data-end=&quot;1756&quot; data-start=&quot;1693&quot; data-col-size=&quot;md&quot;&gt;- 데이터가 정렬되어 있거나 잘 클러스터링된 경우&lt;br /&gt;- WHERE 절에 =, &amp;lt;, &amp;gt; 조건이 있는 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1761&quot; data-start=&quot;1758&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1800&quot; data-start=&quot;1763&quot; data-ke-size=&quot;size26&quot;&gt;  5. Cold vs Hot, Smart Scan과의 관계&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1989&quot; data-start=&quot;1802&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1846&quot; data-start=&quot;1802&quot;&gt;Storage Index는 Smart Scan과 &lt;b&gt;함께&lt;/b&gt; 작동합니다.&lt;/li&gt;
&lt;li data-end=&quot;1935&quot; data-start=&quot;1847&quot;&gt;Smart Scan이 실제로 데이터를 읽는 동안 Storage Index는&lt;br /&gt;&amp;ldquo;이 구간은 읽지 말자&amp;rdquo; 하고 &lt;b&gt;범위를 건너뛰는 역할&lt;/b&gt;을 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1989&quot; data-start=&quot;1936&quot;&gt;따라서 &lt;b&gt;대량의 Full Table Scan + 조건 검색&lt;/b&gt;에서 효과가 극대화됩니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1994&quot; data-start=&quot;1991&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2007&quot; data-start=&quot;1996&quot; data-ke-size=&quot;size26&quot;&gt;✅ 한 줄 정리&lt;/h2&gt;
&lt;blockquote data-end=&quot;2108&quot; data-start=&quot;2009&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2108&quot; data-start=&quot;2011&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Storage Index = 읽기 전 필터링 장치&lt;/b&gt;&lt;br /&gt;블록을 읽기 전에 조건에 맞는지 미리 확인 &amp;rarr; 불필요한 I/O를 스킵 &amp;rarr; &lt;b&gt;쿼리 속도 &amp;uarr;, 자원 &amp;darr;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;B-Tree Index vs Storage Index&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h2 data-end=&quot;214&quot; data-start=&quot;184&quot; data-ke-size=&quot;size26&quot;&gt;  1. B-Tree Index (일반 인덱스)&lt;/h2&gt;
&lt;blockquote data-end=&quot;252&quot; data-start=&quot;216&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;252&quot; data-start=&quot;218&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;필요한 데이터의 위치를 직접 찾아가는 방식&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;266&quot; data-start=&quot;254&quot; data-ke-size=&quot;size23&quot;&gt;⚙️ 동작 방식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;488&quot; data-start=&quot;267&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;267&quot;&gt;사용자가 WHERE 조건이 있는 쿼리를 실행&lt;br /&gt;예:&lt;/li&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;310&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; T1 &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; B &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;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li data-end=&quot;387&quot; data-start=&quot;357&quot;&gt;옵티마이저가 해당 컬럼에 인덱스가 있는지 확인&lt;/li&gt;
&lt;li data-end=&quot;436&quot; data-start=&quot;388&quot;&gt;B-Tree 인덱스를 탐색하여 조건에 맞는 ROWID(실제 데이터 위치) 검색&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;437&quot;&gt;찾은 ROWID로 테이블 블록에서 해당 데이터만 읽어옴&lt;/li&gt;
&lt;li data-end=&quot;488&quot; data-start=&quot;473&quot;&gt;결과를 사용자에게 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;537&quot; data-start=&quot;490&quot; data-ke-size=&quot;size16&quot;&gt;  즉, 인덱스를 이용해 &lt;b&gt;원하는 데이터를 &amp;ldquo;정확히 찾아가는&amp;rdquo; 방식&lt;/b&gt;이에요.&lt;/p&gt;
&lt;h3 data-end=&quot;548&quot; data-start=&quot;539&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;631&quot; data-start=&quot;549&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;579&quot; data-start=&quot;549&quot;&gt;데이터 소량 조회에 매우 효율적 (랜덤 I/O)&lt;/li&gt;
&lt;li data-end=&quot;607&quot; data-start=&quot;580&quot;&gt;WHERE 조건이 인덱스 컬럼에 있어야 함&lt;/li&gt;
&lt;li data-end=&quot;631&quot; data-start=&quot;608&quot;&gt;인덱스 생성&amp;middot;관리 필요 (DBA 개입)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;636&quot; data-start=&quot;633&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;672&quot; data-start=&quot;638&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 2. Storage Index (Exadata 전용)&lt;/h2&gt;
&lt;blockquote data-end=&quot;712&quot; data-start=&quot;674&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;712&quot; data-start=&quot;676&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;읽기 전에 불필요한 범위를 미리 건너뛰는 방식&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;726&quot; data-start=&quot;714&quot; data-ke-size=&quot;size23&quot;&gt;⚙️ 동작 방식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;942&quot; data-start=&quot;727&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;808&quot; data-start=&quot;727&quot;&gt;쿼리가 들어오면, Exadata의 Storage Index에서&lt;br /&gt;각 Region(1MB 단위)의 컬럼 &lt;b&gt;MIN/MAX 값&lt;/b&gt;을 확인&lt;/li&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;809&quot;&gt;조건에 &lt;b&gt;절대 부합하지 않는 구간&lt;/b&gt;은 아예 읽지 않음&lt;br /&gt;예: MIN=3, MAX=8 인 영역에 B&amp;lt;2 조건이 있으면 스킵&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;886&quot;&gt;조건에 맞을 가능성이 있는 영역만 Smart Scan으로 읽음&lt;/li&gt;
&lt;li data-end=&quot;942&quot; data-start=&quot;924&quot;&gt;필터링된 결과만 서버로 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;989&quot; data-start=&quot;944&quot; data-ke-size=&quot;size16&quot;&gt;  즉, &lt;b&gt;&amp;ldquo;읽고 찾는&amp;rdquo; 게 아니라 &amp;ldquo;읽기 전에 걸러내는&amp;rdquo; 방식&lt;/b&gt;이에요.&lt;/p&gt;
&lt;h3 data-end=&quot;1000&quot; data-start=&quot;991&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1100&quot; data-start=&quot;1001&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1025&quot; data-start=&quot;1001&quot;&gt;대량 데이터 + 조건 검색 시 효과적&lt;/li&gt;
&lt;li data-end=&quot;1047&quot; data-start=&quot;1026&quot;&gt;인덱스 생성 필요 없음 (자동)&lt;/li&gt;
&lt;li data-end=&quot;1080&quot; data-start=&quot;1048&quot;&gt;정렬(클러스터링)이 잘 된 데이터일수록 효과 극대화&lt;/li&gt;
&lt;li data-end=&quot;1100&quot; data-start=&quot;1081&quot;&gt;Smart Scan 시에만 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1105&quot; data-start=&quot;1102&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1127&quot; data-start=&quot;1107&quot; data-ke-size=&quot;size26&quot;&gt;  3. 동작 방식 비교 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목B-Tree IndexStorage Index (Exadata)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2081&quot; data-start=&quot;1129&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2081&quot; data-start=&quot;1383&quot;&gt;
&lt;tr data-end=&quot;1482&quot; data-start=&quot;1383&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1410&quot; data-start=&quot;1383&quot;&gt;목적&lt;/td&gt;
&lt;td data-end=&quot;1444&quot; data-start=&quot;1410&quot; data-col-size=&quot;sm&quot;&gt;원하는 데이터 &lt;b&gt;정확히 찾아감&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1482&quot; data-start=&quot;1444&quot; data-col-size=&quot;sm&quot;&gt;불필요한 범위를 &lt;b&gt;미리 걸러냄&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1578&quot; data-start=&quot;1483&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1508&quot; data-start=&quot;1483&quot;&gt;접근 방식&lt;/td&gt;
&lt;td data-end=&quot;1541&quot; data-start=&quot;1508&quot; data-col-size=&quot;sm&quot;&gt;인덱스를 탐색해 ROWID로 직접 접근&lt;/td&gt;
&lt;td data-end=&quot;1578&quot; data-start=&quot;1541&quot; data-col-size=&quot;sm&quot;&gt;MIN/MAX 정보로 조건에 안 맞는 블록을 Skip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1684&quot; data-start=&quot;1579&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1604&quot; data-start=&quot;1579&quot;&gt;처리 위치&lt;/td&gt;
&lt;td data-end=&quot;1643&quot; data-start=&quot;1604&quot; data-col-size=&quot;sm&quot;&gt;DB 서버에서 처리&lt;/td&gt;
&lt;td data-end=&quot;1684&quot; data-start=&quot;1643&quot; data-col-size=&quot;sm&quot;&gt;Exadata 스토리지에서 필터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1781&quot; data-start=&quot;1685&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1710&quot; data-start=&quot;1685&quot;&gt;데이터 양&lt;/td&gt;
&lt;td data-end=&quot;1744&quot; data-start=&quot;1710&quot; data-col-size=&quot;sm&quot;&gt;소량 데이터 조회에 유리&lt;/td&gt;
&lt;td data-end=&quot;1781&quot; data-start=&quot;1744&quot; data-col-size=&quot;sm&quot;&gt;대량 데이터 + 조건 검색 시 유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1877&quot; data-start=&quot;1782&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1804&quot; data-start=&quot;1782&quot;&gt;관리 필요 여부&lt;/td&gt;
&lt;td data-end=&quot;1838&quot; data-start=&quot;1804&quot; data-col-size=&quot;sm&quot;&gt;인덱스 생성&amp;middot;관리 필요&lt;/td&gt;
&lt;td data-end=&quot;1877&quot; data-start=&quot;1838&quot; data-col-size=&quot;sm&quot;&gt;자동 (사용자 개입 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1985&quot; data-start=&quot;1878&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1903&quot; data-start=&quot;1878&quot;&gt;작동 시점&lt;/td&gt;
&lt;td data-end=&quot;1936&quot; data-start=&quot;1903&quot; data-col-size=&quot;sm&quot;&gt;옵티마이저가 인덱스 선택 시&lt;/td&gt;
&lt;td data-end=&quot;1985&quot; data-start=&quot;1936&quot; data-col-size=&quot;sm&quot;&gt;Smart Scan 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2081&quot; data-start=&quot;1986&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2013&quot; data-start=&quot;1986&quot;&gt;결과&lt;/td&gt;
&lt;td data-end=&quot;2048&quot; data-start=&quot;2013&quot; data-col-size=&quot;sm&quot;&gt;필요한 데이터만 읽음&lt;/td&gt;
&lt;td data-end=&quot;2081&quot; data-start=&quot;2048&quot; data-col-size=&quot;sm&quot;&gt;필요 없는 영역을 스킵하고 나머지 읽음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2086&quot; data-start=&quot;2083&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2099&quot; data-start=&quot;2088&quot; data-ke-size=&quot;size26&quot;&gt;  핵심 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2255&quot; data-start=&quot;2101&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2171&quot; data-start=&quot;2101&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;  &lt;b&gt;B-Tree Index&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;rarr; &amp;ldquo;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;목표 지점만 정확히 찾아간다&amp;rdquo;&lt;/span&gt;&lt;br /&gt;&amp;rarr; 소량 조회에 강함 (랜덤 I/O)&lt;/li&gt;
&lt;li data-end=&quot;2255&quot; data-start=&quot;2173&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;  &lt;b&gt;Storage Index&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;rarr; &amp;ldquo;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;볼 필요 없는 구간은 애초에 안 본다&amp;rdquo;&lt;/span&gt;&lt;br /&gt;&amp;rarr; 대량 스캔 시 빠름 (불필요한 I/O 감소)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2272&quot; data-start=&quot;2257&quot; data-ke-size=&quot;size16&quot;&gt;  둘 다 인덱스지만,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2338&quot; data-start=&quot;2273&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2294&quot; data-start=&quot;2273&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;B-Tree는 &lt;b&gt;찾는 도구&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2338&quot; data-start=&quot;2295&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Storage Index는 &lt;b&gt;걸러내는 필터&lt;/b&gt;라고 이해하면 정확합니다 ✅&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Hybrid&amp;nbsp;Columnar&amp;nbsp;Compression&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEqPeX/dJMb8XqPezj/QXXeeJKDNSVx8QFSo94xK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEqPeX/dJMb8XqPezj/QXXeeJKDNSVx8QFSo94xK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEqPeX/dJMb8XqPezj/QXXeeJKDNSVx8QFSo94xK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEqPeX%2FdJMb8XqPezj%2FQXXeeJKDNSVx8QFSo94xK0%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;895&quot; height=&quot;512&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;277&quot; data-start=&quot;238&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;277&quot; data-start=&quot;238&quot; data-ke-size=&quot;size26&quot;&gt;1. Hybrid Columnar Compression이란?&lt;/h2&gt;
&lt;blockquote data-end=&quot;329&quot; data-start=&quot;279&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;329&quot; data-start=&quot;281&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;행(Row)&lt;/b&gt; 단위가 아닌 &lt;b&gt;컬럼(Column)&lt;/b&gt; 단위로 압축하는 방식.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;481&quot; data-start=&quot;331&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;370&quot; data-start=&quot;331&quot;&gt;기존 압축은 **행 기반(row-based)**으로 압축합니다.&lt;/li&gt;
&lt;li data-end=&quot;431&quot; data-start=&quot;371&quot;&gt;HCC는 &lt;b&gt;같은 컬럼의 값들을 모아&lt;/b&gt; 압축하기 때문에 &lt;b&gt;패턴이 잘 맞아&lt;/b&gt; 압축률이 훨씬 높습니다.&lt;/li&gt;
&lt;li data-end=&quot;481&quot; data-start=&quot;432&quot;&gt;특히 &lt;b&gt;대량 데이터&lt;/b&gt;를 저장하는 데이터 웨어하우스(DW) 환경에서 효과가 큽니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;486&quot; data-start=&quot;483&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;502&quot; data-start=&quot;488&quot; data-ke-size=&quot;size26&quot;&gt;  2. 적용 위치&lt;/h2&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;504&quot; data-ke-size=&quot;size16&quot;&gt;HCC는 아래 위치에서 설정할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;578&quot; data-start=&quot;530&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;544&quot; data-start=&quot;530&quot;&gt;✅ &lt;b&gt;테이블 단위&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;559&quot; data-start=&quot;545&quot;&gt;✅ &lt;b&gt;파티션 단위&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;578&quot; data-start=&quot;560&quot;&gt;✅ &lt;b&gt;테이블스페이스 단위&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;610&quot; data-start=&quot;580&quot; data-ke-size=&quot;size16&quot;&gt;  즉, 필요한 범위에만 적용할 수 있어 유연합니다.&lt;/p&gt;
&lt;hr data-end=&quot;615&quot; data-start=&quot;612&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;635&quot; data-start=&quot;617&quot; data-ke-size=&quot;size26&quot;&gt;⚙️ 3. 압축 모드 2가지&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;모드특징목적압축률CPU 부하
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;868&quot; data-start=&quot;637&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;868&quot; data-start=&quot;711&quot;&gt;
&lt;tr data-end=&quot;781&quot; data-start=&quot;711&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;742&quot; data-start=&quot;711&quot;&gt;  &lt;b&gt;Warehouse Compression&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;755&quot; data-start=&quot;742&quot; data-col-size=&quot;sm&quot;&gt;쿼리 성능에 최적화&lt;/td&gt;
&lt;td data-end=&quot;767&quot; data-start=&quot;755&quot; data-col-size=&quot;sm&quot;&gt;DW(분석) 환경&lt;/td&gt;
&lt;td data-end=&quot;775&quot; data-start=&quot;767&quot; data-col-size=&quot;sm&quot;&gt;중간~높음&lt;/td&gt;
&lt;td data-end=&quot;781&quot; data-start=&quot;775&quot; data-col-size=&quot;sm&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;868&quot; data-start=&quot;782&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;819&quot; data-start=&quot;782&quot;&gt;  &lt;b&gt;Online Archival Compression&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;829&quot; data-start=&quot;819&quot; data-col-size=&quot;sm&quot;&gt;압축률 극대화&lt;/td&gt;
&lt;td data-end=&quot;845&quot; data-start=&quot;829&quot; data-col-size=&quot;sm&quot;&gt;거의 변하지 않는 데이터&lt;/td&gt;
&lt;td data-end=&quot;853&quot; data-start=&quot;845&quot; data-col-size=&quot;sm&quot;&gt;매우 높음&lt;/td&gt;
&lt;td data-end=&quot;868&quot; data-start=&quot;853&quot; data-col-size=&quot;sm&quot;&gt;높음(압축/해제 시)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;967&quot; data-start=&quot;870&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;914&quot; data-start=&quot;870&quot;&gt;&lt;b&gt;Warehouse 모드&lt;/b&gt; &amp;rarr; 분석용 쿼리 속도도 빠르고 압축도 잘됨&lt;/li&gt;
&lt;li data-end=&quot;967&quot; data-start=&quot;915&quot;&gt;&lt;b&gt;Online Archival 모드&lt;/b&gt; &amp;rarr; 자주 쓰이지 않는 &amp;lsquo;콜드 데이터&amp;rsquo; 보관에 최적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;972&quot; data-start=&quot;969&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;996&quot; data-start=&quot;974&quot; data-ke-size=&quot;size26&quot;&gt;  4. 작동 방식 (간단 예시)&lt;/h2&gt;
&lt;p data-end=&quot;1004&quot; data-start=&quot;998&quot; data-ke-size=&quot;size16&quot;&gt;기존 방식:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;행1: A=100, B=200, C=300&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;행2: A=101, B=201, C=301&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;행3: A=102, B=202, C=302&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1093&quot; data-start=&quot;1086&quot; data-ke-size=&quot;size16&quot;&gt;HCC 방식:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;컬럼&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;A:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;100&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;span&gt;&lt;span&gt;101&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;span&gt;&lt;span&gt;102&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;B:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;200&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;span&gt;&lt;span&gt;201&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;span&gt;&lt;span&gt;202&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;C:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;300&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;span&gt;&lt;span&gt;301&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;span&gt;&lt;span&gt;302&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1256&quot; data-start=&quot;1163&quot; data-ke-size=&quot;size16&quot;&gt;  컬럼 단위로 묶어서 압축하면 &lt;b&gt;반복되는 값&lt;/b&gt;을 효과적으로 줄일 수 있어&lt;br /&gt;  &lt;b&gt;저장 공간 절약&lt;/b&gt;, 읽기 시 &lt;b&gt;더 적은 블록으로 많은 데이터 처리 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1261&quot; data-start=&quot;1258&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1281&quot; data-start=&quot;1263&quot; data-ke-size=&quot;size26&quot;&gt;  5. 실무 활용 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1503&quot; data-start=&quot;1283&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1344&quot; data-start=&quot;1283&quot;&gt;  &lt;b&gt;파티셔닝과 병행&lt;/b&gt;해서 운영 가능 &amp;rarr; 예: 최신 데이터는 OLTP 압축, 과거 데이터는 HCC&lt;/li&gt;
&lt;li data-end=&quot;1413&quot; data-start=&quot;1345&quot;&gt;  DBMS_COMPRESSION 패키지의 &lt;b&gt;Compression Advisor&lt;/b&gt;로 예상 압축률 확인 가능&lt;/li&gt;
&lt;li data-end=&quot;1459&quot; data-start=&quot;1414&quot;&gt;  압축된 데이터는 Smart Scan과 함께 작동 &amp;rarr; 성능 이점 극대화&lt;/li&gt;
&lt;li data-end=&quot;1503&quot; data-start=&quot;1460&quot;&gt;  자주 수정되는 데이터엔 적합하지 않음 (압축 해제&amp;middot;재압축 비용 발생)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1508&quot; data-start=&quot;1505&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1534&quot; data-start=&quot;1510&quot; data-ke-size=&quot;size26&quot;&gt;  6. HCC vs 기존 압축 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목Basic/OLTP 압축Hybrid Columnar Compression
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1797&quot; data-start=&quot;1536&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1797&quot; data-start=&quot;1646&quot;&gt;
&lt;tr data-end=&quot;1670&quot; data-start=&quot;1646&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1654&quot; data-start=&quot;1646&quot;&gt;압축 단위&lt;/td&gt;
&lt;td data-end=&quot;1661&quot; data-start=&quot;1654&quot; data-col-size=&quot;sm&quot;&gt;행 기반&lt;/td&gt;
&lt;td data-end=&quot;1670&quot; data-start=&quot;1661&quot; data-col-size=&quot;sm&quot;&gt;컬럼 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1691&quot; data-start=&quot;1671&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1677&quot; data-start=&quot;1671&quot;&gt;압축률&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1682&quot; data-start=&quot;1677&quot;&gt;보통&lt;/td&gt;
&lt;td data-end=&quot;1691&quot; data-start=&quot;1682&quot; data-col-size=&quot;sm&quot;&gt;매우 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1725&quot; data-start=&quot;1692&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1701&quot; data-start=&quot;1692&quot;&gt;성능 최적화&lt;/td&gt;
&lt;td data-end=&quot;1711&quot; data-start=&quot;1701&quot; data-col-size=&quot;sm&quot;&gt;DML(수정)&lt;/td&gt;
&lt;td data-end=&quot;1725&quot; data-start=&quot;1711&quot; data-col-size=&quot;sm&quot;&gt;SELECT(조회)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1764&quot; data-start=&quot;1726&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1736&quot; data-start=&quot;1726&quot;&gt;사용 시나리오&lt;/td&gt;
&lt;td data-end=&quot;1746&quot; data-start=&quot;1736&quot; data-col-size=&quot;sm&quot;&gt;트랜잭션 처리&lt;/td&gt;
&lt;td data-end=&quot;1764&quot; data-start=&quot;1746&quot; data-col-size=&quot;sm&quot;&gt;DW&amp;middot;아카이브&amp;middot;콜드 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1797&quot; data-start=&quot;1765&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1781&quot; data-start=&quot;1765&quot;&gt;Smart Scan 호환&lt;/td&gt;
&lt;td data-end=&quot;1786&quot; data-start=&quot;1781&quot; data-col-size=&quot;sm&quot;&gt;일부&lt;/td&gt;
&lt;td data-end=&quot;1797&quot; data-start=&quot;1786&quot; data-col-size=&quot;sm&quot;&gt;✅ 완벽 호환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1802&quot; data-start=&quot;1799&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1815&quot; data-start=&quot;1804&quot; data-ke-size=&quot;size26&quot;&gt;  정리하자면&lt;/h2&gt;
&lt;blockquote data-end=&quot;1927&quot; data-start=&quot;1817&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1927&quot; data-start=&quot;1819&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Hybrid Columnar Compression = &amp;ldquo;컬럼 단위로 묶어 고압축 + 빠른 읽기&amp;rdquo; 기술&lt;/b&gt;&lt;br /&gt;  저장공간 절약 + 쿼리 성능 향상 + 아카이브 데이터 관리에 최적.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2034&quot; data-start=&quot;1929&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1965&quot; data-start=&quot;1929&quot;&gt;자주 조회하지만 자주 &lt;b&gt;수정되지 않는&lt;/b&gt; 데이터에 적합.&lt;/li&gt;
&lt;li data-end=&quot;2034&quot; data-start=&quot;1966&quot;&gt;Exadata 환경에서 Smart Scan과 Storage Index와 함께 쓰면 성능 효과가 &lt;b&gt;폭발적&lt;/b&gt;입니다  &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/171</guid>
      <comments>https://aonee.tistory.com/171#entry171comment</comments>
      <pubDate>Wed, 22 Oct 2025 09:49:20 +0900</pubDate>
    </item>
    <item>
      <title>[Exadata day1] Exadata 기초</title>
      <link>https://aonee.tistory.com/170</link>
      <description>&lt;h3 data-end=&quot;251&quot; data-start=&quot;224&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1~3장: Exadata 기초&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;383&quot; data-start=&quot;252&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;294&quot; data-start=&quot;252&quot;&gt;&lt;b&gt;1장&lt;/b&gt;: Exadata 개요 및 배경, 배포 모델, 리소스 안내&lt;/li&gt;
&lt;li data-end=&quot;332&quot; data-start=&quot;295&quot;&gt;&lt;b&gt;2장&lt;/b&gt;: 하드웨어 구성요소(X8M, 랙 구성, 확장성)&lt;/li&gt;
&lt;li data-end=&quot;383&quot; data-start=&quot;333&quot;&gt;&lt;b&gt;3장&lt;/b&gt;: 네트워크 아키텍처(RDMA/RoCE), 스토리지 아키텍처 및 멀티랙 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle Exadata&lt;br /&gt;  &lt;b&gt;오라클 데이터베이스 전용 초고성능 통합 시스템&lt;/b&gt;으로, 단순 서버가 아니라 &lt;b&gt;DB 성능을 극대화하기 위한 HW+SW 일체형 어플라이언스&lt;/b&gt;입니다.&lt;br /&gt;특히 대기업, 금융권, 공공기관 등 &lt;b&gt;대용량 트랜잭션&amp;middot;분석 시스템&lt;/b&gt;에서 널리 쓰입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1. 엑사(Exadata)가 제공하는 핵심 기능&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ ① &lt;b&gt;Smart Scan (스마트 스캔)&lt;/b&gt; &amp;mdash; 불필요한 I/O 제거&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 서버는 모든 데이터를 읽어서 DB에서 필터링하지만,&lt;br /&gt;Exadata는 &lt;b&gt;스토리지 레벨에서 WHERE 조건 등을 미리 처리&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;필요한 데이터만 네트워크로 올리기 때문에 속도가 수십 배 빨라짐&lt;/b&gt;.&lt;br /&gt;  대규모 테이블 조회나 DW(데이터 웨어하우스) 쿼리에서 효과가 큽니다.&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;Storage Offload (스토리지 오프로딩)&lt;/b&gt; &amp;mdash; CPU 부담 감소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 서버 대신 스토리지 서버가 일부 쿼리 연산(필터링, 집계)을 처리합니다.&lt;/li&gt;
&lt;li&gt;DB 서버는 결과만 받아서 빠르게 응답.&lt;br /&gt;  동일한 하드웨어로도 &lt;b&gt;처리량(Throughput)&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;Hybrid Columnar Compression (HCC)&lt;/b&gt; &amp;mdash; 압축 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 &lt;b&gt;행+열 혼합 방식&lt;/b&gt;으로 압축해 저장 공간 절감 (최대 10~50배).&lt;/li&gt;
&lt;li&gt;압축된 상태로 바로 읽을 수 있어 I/O 속도도 빠름.&lt;br /&gt;  DW&amp;middot;백업 영역에서 특히 효과적.&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;Automatic Storage Management (ASM)&lt;/b&gt; &amp;mdash; 자동 스토리지 관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스토리지를 수동으로 설정하지 않고, 자동 스트라이핑&amp;middot;&lt;b&gt;미러링&lt;/b&gt;&amp;middot;리밸런싱.&lt;/li&gt;
&lt;li&gt;장애 발생 시 자동으로 복구.&lt;br /&gt;  스토리지 운영 부담이 크게 줄어듦.&lt;br /&gt;  참고: 이때 쓰이는 게 Oracle Automatic Storage Management입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASM의 핵심 역할&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;414&quot; data-start=&quot;257&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;322&quot; data-start=&quot;257&quot;&gt;물리 디스크를 ASM이 &lt;b&gt;자동으로 묶어서 하나의 논리적 스토리지 그룹&lt;/b&gt;(Disk Group)으로 만듭니다.&lt;/li&gt;
&lt;li data-end=&quot;377&quot; data-start=&quot;323&quot;&gt;데이터베이스는 개별 디스크가 아니라 이 Disk Group을 바라보며 I/O를 수행합니다.&lt;/li&gt;
&lt;li data-end=&quot;414&quot; data-start=&quot;378&quot;&gt;덕분에 &lt;b&gt;성능, 가용성, 관리 편의성&lt;/b&gt;이 모두 향상됩니다.&lt;/li&gt;
&lt;li data-end=&quot;414&quot; data-start=&quot;378&quot;&gt;[Oracle&amp;nbsp;Database] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼ &lt;br /&gt;[ASM&amp;nbsp;Instance] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼ &lt;br /&gt;[Disk&amp;nbsp;Group&amp;nbsp;(ex:&amp;nbsp;DATA,&amp;nbsp;FRA)] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼ &lt;br /&gt;[Physical&amp;nbsp;Disks]&lt;/li&gt;
&lt;li data-end=&quot;933&quot; data-start=&quot;889&quot;&gt;&lt;b&gt;Database Instance&lt;/b&gt;: 실제 애플리케이션 데이터를 처리&lt;/li&gt;
&lt;li data-end=&quot;990&quot; data-start=&quot;934&quot;&gt;&lt;b&gt;ASM Instance&lt;/b&gt;: 디스크 그룹을 관리하는 전용 인스턴스 (DB 인스턴스와 별도)&lt;/li&gt;
&lt;li data-end=&quot;1030&quot; data-start=&quot;991&quot;&gt;&lt;b&gt;Disk Group&lt;/b&gt;: 여러 물리 디스크를 묶은 논리 그룹&lt;/li&gt;
&lt;li data-end=&quot;1061&quot; data-start=&quot;1031&quot;&gt;&lt;b&gt;Physical Disks&lt;/b&gt;: 실제 저장 매체&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;미러링 (Data Mirroring &amp;mdash; ASM 기능)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1023&quot; data-start=&quot;912&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;982&quot; data-start=&quot;912&quot;&gt;Exadata의 스토리지는 &lt;span&gt;Oracle Automatic Storage Management&lt;/span&gt;(ASM)으로 관리됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;983&quot;&gt;모든 데이터는 디스크에 &lt;b&gt;2~3중 복제(미러링)&lt;/b&gt; 되어 저장돼요.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;상황결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1116&quot; data-start=&quot;1025&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1116&quot; data-start=&quot;1053&quot;&gt;
&lt;tr data-end=&quot;1085&quot; data-start=&quot;1053&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1066&quot; data-start=&quot;1053&quot;&gt;디스크 하나 망가짐&lt;/td&gt;
&lt;td data-end=&quot;1085&quot; data-start=&quot;1066&quot; data-col-size=&quot;sm&quot;&gt;미러본으로 서비스 정상 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1116&quot; data-start=&quot;1086&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1095&quot; data-start=&quot;1086&quot;&gt;디스크 교체&lt;/td&gt;
&lt;td data-end=&quot;1116&quot; data-start=&quot;1095&quot; data-col-size=&quot;sm&quot;&gt;ASM이 자동으로 데이터 재복제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1176&quot; data-start=&quot;1118&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1176&quot; data-start=&quot;1118&quot;&gt;이 기능 덕분에 디스크나 스토리지 장애가 나도 데이터가 안전하게 유지되고 서비스는 중단되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
  쉽게 말하면&amp;hellip;&lt;br /&gt;  &amp;ldquo;중요한 파일을 자동으로 복사해두는 보험 같은 기능&amp;rdquo;&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;고가용성(HA) &amp;amp; 자동 복구&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;노드 장애 시 자동 Failover&lt;/li&gt;
&lt;li&gt;데이터 미러링 및 RAC(Real Application Cluster) 구조로 무중단 서비스 가능.&lt;/li&gt;
&lt;li&gt;장애 복구 시간 최소화 &amp;rarr; 금융&amp;middot;거래 시스템에 필수적 기능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RAC (Real Application Clusters)&lt;/b&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;378&quot; data-start=&quot;292&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;일반 DB&amp;nbsp;&lt;/td&gt;
&lt;td&gt;RAC 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;378&quot; data-start=&quot;334&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;354&quot; data-start=&quot;334&quot;&gt;서버 1대 다운 = 서비스 중단&lt;/td&gt;
&lt;td data-end=&quot;378&quot; data-start=&quot;354&quot; data-col-size=&quot;sm&quot;&gt;다른 서버가 즉시 이어받음 (무중단)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;520&quot; data-start=&quot;380&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;462&quot; data-start=&quot;380&quot;&gt;예: Exadata에 DB 서버 4대가 있다고 가정하면&lt;br /&gt;&amp;rarr; 하나가 죽어도 나머지 3대가 &lt;b&gt;자동으로 트래픽을 이어받아 서비스 지속&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;486&quot; data-start=&quot;463&quot;&gt;부하가 분산되므로 성능도 안정적임.&lt;/li&gt;
&lt;li data-end=&quot;520&quot; data-start=&quot;487&quot;&gt;은행이나 카드사 같은 24시간 서비스에 매우 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
  쉽게 말하면&amp;hellip;&lt;br /&gt;  &lt;b&gt;&amp;ldquo;한 서버가 죽어도 서비스가 멈추지 않는 안전장치&amp;rdquo;&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;196&quot;&gt;  &lt;span&gt;Oracle Real Application Clusters&lt;/span&gt;는&lt;br /&gt;&lt;b&gt;여러 대의 서버(DB 인스턴스)가 하나의 데이터베이스를 동시에 운영하는 기능&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;196&quot;&gt;&amp;nbsp;&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;초고속 네트워크 (InfiniBand / RoCE)&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;서버&amp;ndash;스토리지 간 40~100Gbps급 초고속 네트워크를 사용.&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;자동화된 운영 및 패치&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;펌웨어, OS, DB, 스토리지까지 통합 관리 및 자동 패치 제공.&lt;/li&gt;
&lt;li&gt;수동 튜닝이나 복잡한 설정을 최소화.&lt;br /&gt;  DBA가 성능 조정에 시간을 덜 쓰고, 비즈니스에 집중 가능.&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;OLTP + OLAP 통합 처리&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;기존에는 실시간 거래(OLTP)와 분석(OLAP)을 분리해 운영했지만,&lt;br /&gt;Exadata는 &lt;b&gt;한 시스템에서 둘 다 고성능으로 동시 처리&lt;/b&gt;가 가능.&lt;br /&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;  2. 주요 활용 분야&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산업 활용 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;금융&lt;/td&gt;
&lt;td&gt;실시간 거래 처리, 리스크 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공공기관&lt;/td&gt;
&lt;td&gt;빅데이터 분석, 민원/통계 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제조&lt;/td&gt;
&lt;td&gt;ERP, MES, 재고 및 공급망 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;통신&lt;/td&gt;
&lt;td&gt;실시간 과금, 고객 데이터 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;리테일&lt;/td&gt;
&lt;td&gt;마케팅 분석, POS 거래 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  3. Exadata 아키텍처 구성 요약&lt;/h2&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[DB Server]      &amp;larr; RAC 구성
      │
[InfiniBand Network]
      │
[Storage Server] &amp;larr; Smart Scan, Offload, Compression
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 서버: SQL 처리, 트랜잭션 관리&lt;/li&gt;
&lt;li&gt;스토리지 서버: 데이터 저장 + 일부 연산 처리&lt;/li&gt;
&lt;li&gt;네트워크: 초고속 InfiniBand (혹은 RoCE)&lt;/li&gt;
&lt;li&gt;ASM + Grid Infra로 스토리지 및 클러스터 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  4. 정리 &amp;mdash; Exadata의 핵심 장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  &lt;b&gt;압도적인 성능&lt;/b&gt;: Smart Scan, Offload, HCC로 속도 향상&lt;/li&gt;
&lt;li&gt; ️ &lt;b&gt;높은 안정성&lt;/b&gt;: RAC + 자동 복구 + 미러링&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;OLTP &amp;amp; OLAP 통합 처리&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;br /&gt;엑사(Exadata)는 단순히 오라클 DB를 올리는 서버가 아니라,&lt;br /&gt;**&amp;ldquo;DB 성능을 극대화하고 장애 없이 안정적으로 운영하기 위한 통합 플랫폼&amp;rdquo;**입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하신다면   Exadata의 실제 운영 환경(노드 수, 데이터 흐름 구조도)을 시각적으로 설명해드릴 수도 있어요.&lt;br /&gt;그림으로도 볼까요?  ️✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Exadata vs Non-Exadata ?&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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 style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yqwem/dJMb9LjGwrU/IywZSfuNRwrV21su0oFHFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yqwem/dJMb9LjGwrU/IywZSfuNRwrV21su0oFHFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yqwem/dJMb9LjGwrU/IywZSfuNRwrV21su0oFHFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyqwem%2FdJMb9LjGwrU%2FIywZSfuNRwrV21su0oFHFk%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;502&quot; height=&quot;625&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rusyy/dJMb9VGwvmy/lYGLKxrHQoFm6sumQJwjRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rusyy/dJMb9VGwvmy/lYGLKxrHQoFm6sumQJwjRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rusyy/dJMb9VGwvmy/lYGLKxrHQoFm6sumQJwjRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frusyy%2FdJMb9VGwvmy%2FlYGLKxrHQoFm6sumQJwjRk%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;418&quot; height=&quot;501&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1589&quot; data-start=&quot;1565&quot; data-ke-size=&quot;size26&quot;&gt;  Exadata 환경과 비교해 보기&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목ExadataNon-Exadata
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1984&quot; data-start=&quot;1591&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1984&quot; data-start=&quot;1655&quot;&gt;
&lt;tr data-end=&quot;1715&quot; data-start=&quot;1655&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1662&quot; data-start=&quot;1655&quot;&gt;하드웨어&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1685&quot; data-start=&quot;1662&quot;&gt;Oracle 전용 HW + SW 통합&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1715&quot; data-start=&quot;1685&quot;&gt;HP, Dell 등 일반 서버 + 외부 스토리지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1772&quot; data-start=&quot;1716&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1723&quot; data-start=&quot;1716&quot;&gt;스토리지&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1746&quot; data-start=&quot;1723&quot;&gt;Smart Scan + ASM 자동화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1772&quot; data-start=&quot;1746&quot;&gt;일반 파일 시스템 or ASM 수동 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1814&quot; data-start=&quot;1773&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1780&quot; data-start=&quot;1773&quot;&gt;네트워크&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1797&quot; data-start=&quot;1780&quot;&gt;InfiniBand 초고속&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1814&quot; data-start=&quot;1797&quot;&gt;Ethernet (일반)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1859&quot; data-start=&quot;1815&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1824&quot; data-start=&quot;1815&quot;&gt;성능 최적화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1845&quot; data-start=&quot;1824&quot;&gt;Oracle이 HW/DB에 최적화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1859&quot; data-start=&quot;1845&quot;&gt;관리자가 튜닝 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1903&quot; data-start=&quot;1860&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1868&quot; data-start=&quot;1860&quot;&gt;장애 복구&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1886&quot; data-start=&quot;1868&quot;&gt;RAC + ASM 자동 복구&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1903&quot; data-start=&quot;1886&quot;&gt;수동 장애 조치 비중 큼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1944&quot; data-start=&quot;1904&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1912&quot; data-start=&quot;1904&quot;&gt;패치/운영&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1926&quot; data-start=&quot;1912&quot;&gt;일괄 관리 도구 제공&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1944&quot; data-start=&quot;1926&quot;&gt;개별 컴포넌트별 관리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1984&quot; data-start=&quot;1945&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1950&quot; data-start=&quot;1945&quot;&gt;비용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1961&quot; data-start=&quot;1950&quot;&gt;고가 (올인원)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1984&quot; data-start=&quot;1961&quot;&gt;상대적으로 저렴, 하지만 관리 복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1989&quot; data-start=&quot;1986&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2005&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size26&quot;&gt;  쉽게 비유하면&amp;hellip;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2117&quot; data-start=&quot;2007&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2056&quot; data-start=&quot;2007&quot;&gt; ️ &lt;b&gt;엑사데이터&lt;/b&gt; = 오라클이 설계부터 시공까지 한 &amp;ldquo;초고속 스마트 빌딩&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;2117&quot; data-start=&quot;2057&quot;&gt;  &lt;b&gt;일반 환경&lt;/b&gt; = 철근, 콘크리트, 배관, 전기 모두 &lt;b&gt;따로 사서 조립&lt;/b&gt;하는 &amp;ldquo;수작업 빌딩&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2176&quot; data-start=&quot;2119&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실습 패스워드&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vi7hY/dJMb9QedVSO/DTWn0Kei2zSJ4sfay89FV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vi7hY/dJMb9QedVSO/DTWn0Kei2zSJ4sfay89FV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vi7hY/dJMb9QedVSO/DTWn0Kei2zSJ4sfay89FV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVi7hY%2FdJMb9QedVSO%2FDTWn0Kei2zSJ4sfay89FV1%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;731&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Exadata&amp;nbsp;Network&amp;nbsp;Architecture&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8nENt/dJMb80OCpvU/VB2UC30yUeCgJ5qWGGDsgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8nENt/dJMb80OCpvU/VB2UC30yUeCgJ5qWGGDsgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8nENt/dJMb80OCpvU/VB2UC30yUeCgJ5qWGGDsgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8nENt%2FdJMb80OCpvU%2FVB2UC30yUeCgJ5qWGGDsgK%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;796&quot; height=&quot;496&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHzLYp/dJMb89dIHXD/2rsZXz204pwHlzpfxAHfYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHzLYp/dJMb89dIHXD/2rsZXz204pwHlzpfxAHfYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHzLYp/dJMb89dIHXD/2rsZXz204pwHlzpfxAHfYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHzLYp%2FdJMb89dIHXD%2F2rsZXz204pwHlzpfxAHfYK%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;595&quot; height=&quot;355&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;338&quot; data-start=&quot;268&quot; data-ke-size=&quot;size16&quot;&gt;Exadata의 전체 구조는 크게 &lt;b&gt;DB 서버 측 구성요소&lt;/b&gt;와 &lt;b&gt;스토리지(Cell) 측 구성요소&lt;/b&gt;로 나눌 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;343&quot; data-start=&quot;340&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;378&quot; data-start=&quot;345&quot; data-ke-size=&quot;size26&quot;&gt; ️ 2. Database Server 측 구성 요소&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구성 요소설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1017&quot; data-start=&quot;380&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1017&quot; data-start=&quot;416&quot;&gt;
&lt;tr data-end=&quot;563&quot; data-start=&quot;416&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;425&quot; data-start=&quot;416&quot;&gt;&lt;b&gt;OS&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;563&quot; data-start=&quot;425&quot; data-col-size=&quot;lg&quot;&gt;Exadata X8M-2부터 RoCE Fabric 환경에서는 **&lt;span&gt;Oracle Linux KVM&lt;/span&gt;**이 기본 가상화 기술로 도입됨.&lt;br /&gt;8소켓 DB 서버에서는 전통적인 Oracle Linux만 사용 가능.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;746&quot; data-start=&quot;564&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;580&quot; data-start=&quot;564&quot;&gt;&lt;b&gt;DB Engine&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;746&quot; data-start=&quot;580&quot; data-col-size=&quot;lg&quot;&gt;Oracle Database 11gR2, 12c, 18c, 19c 지원.&lt;br /&gt;Exadata Storage Software와의 호환성에 맞는 정확한 patch level 필요.&lt;br /&gt;DB 19c를 사용하려면 &lt;span&gt;Oracle Grid Infrastructure&lt;/span&gt; 19c가 필수.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;818&quot; data-start=&quot;747&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;773&quot; data-start=&quot;747&quot;&gt;&lt;b&gt;Grid Infrastructure&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;818&quot; data-start=&quot;773&quot; data-col-size=&quot;lg&quot;&gt;클러스터링 및 ASM 관리 기능 제공. RAC 및 HA(고가용성)의 핵심.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;937&quot; data-start=&quot;819&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;860&quot; data-start=&quot;819&quot;&gt;&lt;b&gt;ASM (Automatic Storage Management)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;937&quot; data-start=&quot;860&quot; data-col-size=&quot;lg&quot;&gt;오라클 DB 최적화 볼륨 매니저 + 파일 시스템 역할.&lt;br /&gt;스토리지 계층을 추상화해 DB가 효율적으로 I/O 수행 가능하도록 함.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1017&quot; data-start=&quot;938&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;976&quot; data-start=&quot;938&quot;&gt;&lt;b&gt;RAC (Real Application Clusters)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1017&quot; data-start=&quot;976&quot; data-col-size=&quot;lg&quot;&gt;여러 DB 인스턴스를 하나의 DB에 연결해 고가용성과 확장성 보장.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1022&quot; data-start=&quot;1019&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1061&quot; data-start=&quot;1024&quot; data-ke-size=&quot;size26&quot;&gt;  3. Exadata Storage Cell 측 구성 요소&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구성 요소설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1347&quot; data-start=&quot;1063&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1347&quot; data-start=&quot;1099&quot;&gt;
&lt;tr data-end=&quot;1168&quot; data-start=&quot;1099&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1127&quot; data-start=&quot;1099&quot;&gt;&lt;b&gt;Cell Server (CELLSRV)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1168&quot; data-start=&quot;1127&quot; data-col-size=&quot;md&quot;&gt;Smart Scan, Offload 처리, 데이터 읽기 최적화 담당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1225&quot; data-start=&quot;1169&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1198&quot; data-start=&quot;1169&quot;&gt;&lt;b&gt;Management Server (MS)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1225&quot; data-start=&quot;1198&quot; data-col-size=&quot;md&quot;&gt;상태 모니터링, 알람, 스토리지 관리 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1279&quot; data-start=&quot;1226&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1252&quot; data-start=&quot;1226&quot;&gt;&lt;b&gt;Restart Server (RS)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1279&quot; data-start=&quot;1252&quot; data-col-size=&quot;md&quot;&gt;장애 시 Cell Server 재시작 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1347&quot; data-start=&quot;1280&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1302&quot; data-start=&quot;1280&quot;&gt;&lt;b&gt;Storage Tiering&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1347&quot; data-start=&quot;1302&quot; data-col-size=&quot;md&quot;&gt;PMEM &amp;rarr; Flash &amp;rarr; HDD 계층적 스토리지 구조로 고속 I/O 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1352&quot; data-start=&quot;1349&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1370&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size26&quot;&gt;⚡ 4. 주요 동작 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1589&quot; data-start=&quot;1372&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1432&quot; data-start=&quot;1372&quot;&gt;&lt;b&gt;클라이언트 쿼리 실행&lt;/b&gt; &amp;rarr; DB 서버의 Oracle Database가 파싱 및 실행 계획 수립&lt;/li&gt;
&lt;li data-end=&quot;1458&quot; data-start=&quot;1433&quot;&gt;&lt;b&gt;ASM&lt;/b&gt;이 스토리지 접근을 중개&lt;/li&gt;
&lt;li data-end=&quot;1516&quot; data-start=&quot;1459&quot;&gt;&lt;b&gt;Exadata Cell Server&lt;/b&gt;가 Smart Scan 수행 &amp;mdash; 필요한 데이터만 반환&lt;/li&gt;
&lt;li data-end=&quot;1553&quot; data-start=&quot;1517&quot;&gt;PMEM/Flash 계층을 우선 활용해 지연 시간 최소화&lt;/li&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1554&quot;&gt;결과를 DB 서버로 전송, RAC 인스턴스가 집계 후 응답&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1594&quot; data-start=&quot;1591&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1616&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size26&quot;&gt;  5. 소프트웨어 버전 관리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1797&quot; data-start=&quot;1618&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1694&quot; data-start=&quot;1618&quot;&gt;Exadata는 &lt;b&gt;DB, Grid Infra, Storage Server Software 버전 간 호환성이 매우 중요&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;1750&quot; data-start=&quot;1695&quot;&gt;공식 호환 버전은 My Oracle Support 문서 888828.1 에서 확인 가능.&lt;/li&gt;
&lt;li data-end=&quot;1797&quot; data-start=&quot;1751&quot;&gt;업그레이드 시 반드시 GI와 Storage Software의 조합을 맞춰야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1802&quot; data-start=&quot;1799&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1812&quot; data-start=&quot;1804&quot; data-ke-size=&quot;size26&quot;&gt;  정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구성 영역주요 구성 요소역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2152&quot; data-start=&quot;1814&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2152&quot; data-start=&quot;1879&quot;&gt;
&lt;tr data-end=&quot;1969&quot; data-start=&quot;1879&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1897&quot; data-start=&quot;1879&quot;&gt;Database Server&lt;/td&gt;
&lt;td data-end=&quot;1943&quot; data-start=&quot;1897&quot; data-col-size=&quot;md&quot;&gt;Oracle Linux / KVM, DB Engine, GI, ASM, RAC&lt;/td&gt;
&lt;td data-end=&quot;1969&quot; data-start=&quot;1943&quot; data-col-size=&quot;sm&quot;&gt;SQL 처리, 클러스터, 스토리지 가상화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2052&quot; data-start=&quot;1970&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1985&quot; data-start=&quot;1970&quot;&gt;Storage Cell&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2019&quot; data-start=&quot;1985&quot;&gt;CELLSRV, MS, RS, PMEM/Flash/HDD&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2052&quot; data-start=&quot;2019&quot;&gt;Smart Scan, Offload, 스토리지 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2096&quot; data-start=&quot;2053&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2060&quot; data-start=&quot;2053&quot;&gt;네트워크&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2081&quot; data-start=&quot;2060&quot;&gt;RoCE or InfiniBand&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2096&quot; data-start=&quot;2081&quot;&gt;초고속 전송, 저지연&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2152&quot; data-start=&quot;2097&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2102&quot; data-start=&quot;2097&quot;&gt;관리&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2134&quot; data-start=&quot;2102&quot;&gt;MOS, Patch, Fleet Maintenance&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2152&quot; data-start=&quot;2134&quot;&gt;버전 호환성 유지 및 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2157&quot; data-start=&quot;2154&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2170&quot; data-start=&quot;2159&quot; data-ke-size=&quot;size16&quot;&gt;  한 줄 요약&lt;/p&gt;
&lt;blockquote data-end=&quot;2289&quot; data-start=&quot;2171&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2289&quot; data-start=&quot;2173&quot; data-ke-size=&quot;size16&quot;&gt;Exadata는 &lt;b&gt;DB 서버의 ASM + RAC + GI&lt;/b&gt;와 &lt;b&gt;Storage Cell의 Smart Scan + 계층형 스토리지&lt;/b&gt;가 결합된 아키텍처로, 초고속&amp;middot;고가용성&amp;middot;자동화된 데이터베이스 플랫폼입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;b&gt;디스크 계층 구조 &lt;br /&gt;(Physical Disk &amp;rarr; LUN &amp;rarr; Cell Disk &amp;rarr; Grid Disk &amp;rarr; ASM Disk Group)&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Exadata는 물리 디스크를 바로 ASM에 연결하지 않고,&lt;br /&gt;여러 단계의 논리적 계층으로 감싸서 &lt;b&gt;성능&amp;middot;가용성&amp;middot;관리 편의성&lt;/b&gt;을 극대화합니다. &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zx5gU/dJMb9YJ06Da/cBT3YgA9GinJsFk40tDXd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zx5gU/dJMb9YJ06Da/cBT3YgA9GinJsFk40tDXd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zx5gU/dJMb9YJ06Da/cBT3YgA9GinJsFk40tDXd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZx5gU%2FdJMb9YJ06Da%2FcBT3YgA9GinJsFk40tDXd0%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;639&quot; height=&quot;397&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1. Exadata 디스크 계층 구조 개요&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[ Physical Disk (12ea per cell) ]
           │
           ▼
[ LUN (Logical Unit Number) ]
           │
           ▼
[ Cell Disk ]
           │
           ▼
[ Grid Disk (1~N) ]
           │
           ▼
[ ASM Disk Group ]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  2. Physical Disk (물리 디스크)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 &lt;b&gt;Exadata High Capacity Storage Server&lt;/b&gt;에는 &lt;b&gt;12개의 HDD&lt;/b&gt;가 장착됨.&lt;/li&gt;
&lt;li&gt;Exadata Cell Software가 자동으로 디스크를 감지하므로, 관리자가 수동으로 추가/삭제할 필요 없음.&lt;/li&gt;
&lt;li&gt;이 단계에서는 용량과 모델, 시리얼 번호 등의 제한된 속성만 확인 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Physical Disk 1 ... 12
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  3. LUN (Logical Unit Number)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 물리 디스크는 하나의 LUN으로 매핑됨.&lt;/li&gt;
&lt;li&gt;LUN은 Cell 관리자에게 디스크 관련 &lt;b&gt;추가 메타데이터 속성&lt;/b&gt;을 제공합니다.&lt;/li&gt;
&lt;li&gt;LUN은 수동으로 만들거나 삭제할 수 없으며, 시스템이 자동 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;LUN0 &amp;rarr; Physical Disk 0
LUN1 &amp;rarr; Physical Disk 1
...
LUN11 &amp;rarr; Physical Disk 11
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  4. Cell Disk&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LUN 위에 생성되는 &lt;b&gt;데이터 저장의 기본 논리 단위&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;각 LUN마다 1개의 Cell Disk가 만들어짐.&lt;/li&gt;
&lt;li&gt;이 단계에서 디스크 전체를 ASM에 바로 연결하지 않고, 한 번 더 추상화해서 스토리지 자원을 논리적으로 관리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;CellDisk_CD_01 &amp;rarr; LUN0
CellDisk_CD_02 &amp;rarr; LUN1
...
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  5. Grid Disk&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cell Disk 위에 생성되는 논리적 단위로, &lt;b&gt;ASM이 직접 접근하는 단위&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;하나의 Cell Disk 위에 &lt;b&gt;1개 이상 Grid Disk&lt;/b&gt;를 만들 수 있음. (1~N 개 가능)&lt;/li&gt;
&lt;li&gt;Hot / Cold 데이터 구분을 위해 Cell Disk를 분할해 서로 다른 Grid Disk로 구성 가능.&lt;/li&gt;
&lt;/ul&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;GridDisk_hot : 디스크 외곽 트랙 (성능 우수)&lt;/li&gt;
&lt;li&gt;GridDisk_cold : 디스크 안쪽 트랙 (성능 낮음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이렇게 구분하면 고성능이 필요한 테이블스페이스는 hot 영역, 백업이나 저활성 데이터는 cold 영역에 배치할 수 있음.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 6. ASM Disk Group&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Grid Disk들이 &lt;b&gt;ASM Disk&lt;/b&gt;로 인식되고,&lt;/li&gt;
&lt;li&gt;이들을 모아 &lt;b&gt;ASM Disk Group&lt;/b&gt;(ex. +DATA, +RECO)을 구성합니다.&lt;/li&gt;
&lt;li&gt;Oracle DB는 이 ASM Disk Group만 바라보기 때문에 하위 디스크 구조를 신경 쓸 필요가 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;+DATA : 고성능용 ASM Disk Group (hot)
+RECO : 백업 및 로그용 ASM Disk Group (cold)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  7. 초기 구성 시 예시&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 Exadata 설치 시 대부분의 Cell Disk에는 &lt;b&gt;3개의 Grid Disk&lt;/b&gt;가 자동으로 생성됩니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DBFS_DG&lt;/li&gt;
&lt;li&gt;DATA_DG&lt;/li&gt;
&lt;li&gt;RECO_DG&lt;br /&gt;&amp;rarr; 각각 데이터, 복구 영역, 내부 파일 시스템용으로 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 운영 환경에 따라 Grid Disk를 1개 또는 여러 개로 나눌 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Hot / Cold 분리 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 위치 목적 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hot Grid Disk&lt;/td&gt;
&lt;td&gt;디스크 외곽 (Outer Track)&lt;/td&gt;
&lt;td&gt;고성능 영역&lt;/td&gt;
&lt;td&gt;자주 접근되는 데이터 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold Grid Disk&lt;/td&gt;
&lt;td&gt;디스크 내측 (Inner Track)&lt;/td&gt;
&lt;td&gt;저성능 영역&lt;/td&gt;
&lt;td&gt;덜 접근되는 데이터 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 디스크의 물리적 구조 특성상 외곽 트랙이 I/O 속도가 더 빠릅니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층 역할 생성 방법 ASM과의 관계&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;Physical Disk&lt;/td&gt;
&lt;td&gt;실제 디스크 (12개/셀)&lt;/td&gt;
&lt;td&gt;하드웨어 고정&lt;/td&gt;
&lt;td&gt;기본 리소스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LUN&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&gt;
&lt;td&gt;Cell Disk&lt;/td&gt;
&lt;td&gt;LUN 상위 추상화&lt;/td&gt;
&lt;td&gt;자동 생성 가능&lt;/td&gt;
&lt;td&gt;Grid Disk의 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grid Disk&lt;/td&gt;
&lt;td&gt;ASM이 보는 단위&lt;/td&gt;
&lt;td&gt;수동 or 자동 구성&lt;/td&gt;
&lt;td&gt;ASM Disk로 인식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASM Disk Group&lt;/td&gt;
&lt;td&gt;DB가 보는 단위&lt;/td&gt;
&lt;td&gt;ASM에서 구성&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;p data-ke-size=&quot;size16&quot;&gt;  한 줄 요약&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exadata에서는 &lt;b&gt;Physical Disk &amp;rarr; LUN &amp;rarr; Cell Disk &amp;rarr; Grid Disk &amp;rarr; ASM Disk Group&lt;/b&gt; 의 계층을 거쳐 Oracle Database가 스토리지에 접근합니다.&lt;br /&gt;이를 통해 &lt;b&gt;성능 계층화, 자동화, 관리 용이성&lt;/b&gt;을 모두 확보합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dF35Bk/dJMb9MplV5A/Rghrhh2wmBTjfQxxLtK9f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dF35Bk/dJMb9MplV5A/Rghrhh2wmBTjfQxxLtK9f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dF35Bk/dJMb9MplV5A/Rghrhh2wmBTjfQxxLtK9f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdF35Bk%2FdJMb9MplV5A%2FRghrhh2wmBTjfQxxLtK9f1%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;587&quot; height=&quot;330&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 질문이에요  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 말씀하신 내용은 **Oracle Exadata Database Machine**의 스토리지 아키텍처 중&lt;br /&gt;  Grid Disk &amp;rarr; ASM Disk Group &amp;rarr; Redundancy / Failure Group 이라는 &lt;b&gt;실제 운영에서 가장 중요한 핵심 개념&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 이해하면 Exadata의 &lt;b&gt;고가용성(HA)&lt;/b&gt; 및 &lt;b&gt;무중단 유지보수&lt;/b&gt;가 어떻게 가능한지 명확하게 이해할 수 있어요 &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1. Grid Disk &amp;rarr; ASM Disk Group 매핑&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exadata에서 스토리지는 다음 흐름으로 구성됩니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Physical Disk
  &amp;rarr; LUN
    &amp;rarr; Cell Disk
      &amp;rarr; Grid Disk (ex. 빨간색, 파란색)
        &amp;rarr; ASM Disk Group (ex. DATA_1, FRA_1)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Grid Disk는 &lt;b&gt;ASM Disk의 기본 단위&lt;/b&gt;로 쓰입니다.&lt;/li&gt;
&lt;li&gt;여러 개의 Grid Disk를 묶어서 하나의 ASM Disk Group을 구성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;예를 들어:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빨간 Grid Disk 전부 &amp;rarr; DATA_1 Disk Group&lt;/li&gt;
&lt;li&gt;파란 Grid Disk 전부 &amp;rarr; FRA_1 Disk Group&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;ASM의 역할:&lt;/b&gt; 데이터를 Disk Group에 넣으면 ASM이 알아서 모든 Grid Disk에 균등하게 데이터를 분산 저장합니다 (striping).&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  2. ASM Redundancy (중복성 옵션)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exadata에서는 &lt;b&gt;ASM Disk Group 생성 시 중복성 수준을 지정&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 설명 복제본 수 Exadata 지원 여부&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;EXTERNAL&lt;/td&gt;
&lt;td&gt;복제 없음&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;❌ 지원 안 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NORMAL&lt;/td&gt;
&lt;td&gt;2-way Mirroring&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;✅ 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;3-way Mirroring&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;✅ 고가용성 환경 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;EXTERNAL redundancy는 Exadata에서 지원되지 않습니다.&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;  실무에서는 &lt;b&gt;NORMAL&lt;/b&gt; 또는 &lt;b&gt;HIGH&lt;/b&gt; redundancy를 사용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  3. Failure Group 개념 (Exadata의 핵심 포인트)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Failure Group = ASM이 데이터를 복제할 때 서로 다른 물리적 영역(셀)&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;Exadata에서는 각 &lt;b&gt;Storage Cell이 자동으로 하나의 Failure Group&lt;/b&gt;으로 설정됩니다.&lt;/li&gt;
&lt;li&gt;예: 3개의 셀이 있다면 &amp;rarr; CELL1, CELL2, CELL3 3개의 Failure Group이 자동 생성됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;+-------------------------------+
| DATA_1 ASM Disk Group         |
|  ├─ FG: CELL1 (Grid Disk들)   |
|  ├─ FG: CELL2 (Grid Disk들)   |
|  └─ FG: CELL3 (Grid Disk들)   |
+-------------------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이렇게 되면 한 셀이 죽더라도 나머지 셀에 복제본이 남아 있으므로 데이터 손실 없이 운영 가능.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  4. 데이터 저장 방식 (Mirroring)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 NORMAL redundancy를 사용하는 경우:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 1블록을 CELL1에 저장하면&lt;/li&gt;
&lt;li&gt;ASM이 자동으로 복제본을 CELL2 또는 CELL3에 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;원본 &amp;rarr; CELL1
미러 &amp;rarr; CELL2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HIGH redundancy라면 3개의 Failure Group에 모두 복제됩니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;원본 &amp;rarr; CELL1
미러1 &amp;rarr; CELL2
미러2 &amp;rarr; CELL3
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  5. Failure Group 네이밍&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Failure Group 이름은 기본적으로 &lt;b&gt;Cell 이름&lt;/b&gt;을 따릅니다.&lt;/li&gt;
&lt;li&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DATA_1 Disk Group &amp;rarr; CELL1, CELL2, CELL3&lt;/li&gt;
&lt;li&gt;FRA_1 Disk Group &amp;rarr; CELL1, CELL2, CELL3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  서로 다른 Disk Group이라도 &lt;b&gt;Failure Group 이름이 동일할 수 있음&lt;/b&gt; (단, 서로 다른 그룹에 소속됨).&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 6. 초기 설정 시 Exadata 기본 Disk Group&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exadata 초기 구성 시 자동으로 &lt;b&gt;3개의 ASM Disk Group&lt;/b&gt;이 만들어집니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Disk Group 용도&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;DATA&lt;/td&gt;
&lt;td&gt;데이터 저장 (핫 데이터)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RECO&lt;/td&gt;
&lt;td&gt;Recovery 영역 (로그, 아카이브)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DBFS_DG&lt;/td&gt;
&lt;td&gt;내부 관리용 (DBFS 파일시스템)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 NORMAL 또는 HIGH redundancy로 설정됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 요소 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grid Disk&lt;/td&gt;
&lt;td&gt;ASM Disk의 최소 단위. Cell Disk 위에 생성됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASM Disk Group&lt;/td&gt;
&lt;td&gt;Grid Disk를 묶어 구성. 예: DATA_1, FRA_1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASM Redundancy&lt;/td&gt;
&lt;td&gt;NORMAL(2-way), HIGH(3-way). External은 Exadata에서 ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure Group&lt;/td&gt;
&lt;td&gt;Storage Cell 단위로 자동 생성. 셀 장애 시 복제본으로 보호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Striping&lt;/td&gt;
&lt;td&gt;ASM이 데이터를 모든 Grid Disk에 균등하게 분산 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한 줄 요약&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exadata에서 ASM Disk Group은 여러 Grid Disk 위에 구성되고, &lt;b&gt;Failure Group(셀 단위)&lt;/b&gt; 을 활용해 &lt;b&gt;자동으로 데이터 복제&lt;/b&gt;와 &lt;b&gt;장애 보호&lt;/b&gt;를 제공합니다.&lt;br /&gt;NORMAL 또는 HIGH redundancy가 필수이며, EXTERNAL은 지원되지 않습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하신다면 이걸 Physical Disk &amp;rarr; Grid Disk &amp;rarr; ASM Disk Group &amp;rarr; Failure Group 관계로 도식화한 PDF나 이미지로 만들어드릴 수도 있어요. 그렇게 할까요?  ️ ✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UoFeu/dJMb9MCS7c0/63aghfZXr04v8imVJ5k5v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UoFeu/dJMb9MCS7c0/63aghfZXr04v8imVJ5k5v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UoFeu/dJMb9MCS7c0/63aghfZXr04v8imVJ5k5v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUoFeu%2FdJMb9MCS7c0%2F63aghfZXr04v8imVJ5k5v0%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;240&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 정답:&lt;br /&gt;&lt;b&gt;b. MS&lt;/b&gt;&lt;br /&gt;&lt;b&gt;d. CELLSRV&lt;/b&gt;&lt;br /&gt;&lt;b&gt;e. RS&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  설명 &amp;mdash; Exadata Storage Server의 3대 핵심 서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 이름 전체 명칭 역할&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CELLSRV&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cell Server&lt;/td&gt;
&lt;td&gt;Smart Scan, I/O 오프로딩, 데이터 압축/복제 등 핵심 데이터 I/O 처리 담당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;MS&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Management Server&lt;/td&gt;
&lt;td&gt;Exadata 셀의 상태 모니터링, 알람, 구성 정보 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;RS&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Restart Server&lt;/td&gt;
&lt;td&gt;장애 발생 시 CELLSRV와 MS를 자동으로 재시작하는 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GMON&lt;/b&gt;은 ASM 인스턴스의 백그라운드 프로세스이며 Storage Server 서비스가 아님 ❌&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OMS&lt;/b&gt;(Oracle Management Server)는 Exadata Storage Server 서비스가 아님 ❌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  따라서 정답은 &lt;b&gt;MS&lt;/b&gt;, &lt;b&gt;CELLSRV&lt;/b&gt;, &lt;b&gt;RS&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/170</guid>
      <comments>https://aonee.tistory.com/170#entry170comment</comments>
      <pubDate>Mon, 20 Oct 2025 16:41:45 +0900</pubDate>
    </item>
    <item>
      <title>java 교육 5일</title>
      <link>https://aonee.tistory.com/168</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;[교육 1일차]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;java 기본 개념 교육 c언어와 비교하며 수업해주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;c언어 실행방법 : gcc test01.c -o a.exe 후 a.exe&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;주의사항 ) gcc있어야함. gcc 경로를 못 찾아서 path설정을 해줬다. 환경변수 path에 gcc bin 폴더경로 추가 후 cmd창 닫고 다시 cmd 열면 해결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;java 실행방법 :&amp;nbsp; javac test02.java 후 java test02&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test01 .c&lt;/p&gt;
&lt;pre id=&quot;code_1748242015278&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;studio.h&amp;gt;

int main() {
	int a ; 
	a = 100;
	printf(&quot;%d\n&quot;, a) ; 
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test04.java&lt;/p&gt;
&lt;pre id=&quot;code_1748242040024&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class test04 {
	public static void main (String[] args){
		int a;
		a = 10;
		System.out.println(a);
		
		double b = 3.143;
		System.out.println(b);
	}


}&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;test05 .c&lt;/p&gt;
&lt;pre id=&quot;code_1748242101815&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(){
int a ;
int *b, *c; 
a=100;
b= &amp;amp;a;
c= b;
printf(&quot;%d %d %d&quot;, a, *b, *c);

return 0;
}

/*
포인터는 기억공간을 가리킬 수 있는 변수이다 (이름 아님)- 삼각형 기억공간으로 표현
c=b 포인터의 대입은 오른쪽이 가리키는 대상을 왼쪽이 가리키게 된다
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test06 .c&lt;/p&gt;
&lt;pre id=&quot;code_1748242125447&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

struct ab {
	int a;
	float b;
	
};


int main(){
	struct ab apple;
	struct ab *t;
	
	apple.a = 100;
	apple.b = 3.14;
	
	t= &amp;amp;apple;
	t-&amp;gt;b = 0.066;
	
	printf(&quot;%d %f\n&quot;, apple.a, apple.b);


	return 0;
}

/*
apple이름으로 변수 선언 - struct ab 형태의 공간을 확보한다
a라는int형 변수와 b라는 float형 변수가 함께 있는 복합공간

구조체는 자료형처럼 이해하고 사용하면 됨.
java 클래스는 알고보면 구조체다. 따라서 클래스는 자료형처럼 이해하면 된다.


*/&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;test07.c&lt;/p&gt;
&lt;pre id=&quot;code_1748242143120&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;


/*
구조체는 자료형처럼 쓸 수 있기에 typedef 를 적용할 수 있다
이러면 마치 AB라는 새로운 자료형을 만든 것처럼 사용이 가능하다

메모리 확보 방법
1. 변수선언 - 자료형 or 구조체, 이름(심볼) 필수
int a ; b=&amp;amp;a; 기억공간에 대한 포인터는 존재한다

2. malloc - 자료형 or 구조체, 이름(심볼) 없음. 이름이 없이 포인터로만 접근 가능하다.

*/
typedef struct ab {
	int a;
	float b;
	
}AB;


int main(){
	AB apple;
	AB *t;
	
	apple.a = 100;
	apple.b = 3.14;
	
	t= &amp;amp;apple;
	t-&amp;gt;b = 0.066;
	
	printf(&quot;%d %f\n&quot;, apple.a, apple.b);


	return 0;
}

/*
apple이름으로 변수 선언 - struct ab 형태의 공간을 확보한다
a라는int형 변수와 b라는 float형 변수가 함께 있는 복합공간

구조체는 자료형처럼 이해하고 사용하면 됨.
java 클래스는 알고보면 구조체다. 따라서 클래스는 자료형처럼 이해하면 된다.


*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test08.c&lt;/p&gt;
&lt;pre id=&quot;code_1748242179039&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct ab {
	int a;
	float b;
	
}AB;


int main(){
	AB *t;
	t = (AB*)malloc(sizeof(AB)); // AB형태의 메모리를 확보하여 포인터를 리턴한다
	t-&amp;gt;a = 9999;
	t-&amp;gt;b = 193.23412345;
	printf(&quot;%d %f \n&quot;, t-&amp;gt;a, t-&amp;gt;b);
	free(t); //malloc으로 확보된 기억공간은 free로 소거한다
	// t(삼각형)을 날리는 게 아니라 t가 가리키는 대상(박스)가 날아간다
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test09.java&lt;/p&gt;
&lt;pre id=&quot;code_1748242207991&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AB{
	int a;
	double b;
	
}
public class test09{
	public static void main(String[] args){
		AB t = new AB();
		t.a=100;
		t.b = 3.14;
		System.out.println(t.a + &quot;, &quot;+ t.b);
	}
}&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;test10.c&lt;/p&gt;
&lt;pre id=&quot;code_1748242231231&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typedef struct node {
	int data;
	struct node *next; // 가능
	
}Node;


int main(){
	Node* head;
	head= (Node*)malloc(sizeof(Node));

	head-&amp;gt;data = 0;
	head-&amp;gt;next = (Node*)malloc(sizeof(Node));
	head-&amp;gt;next-&amp;gt;data = 100;
	
	printf(&quot;%d, %d&quot;, head-&amp;gt;data, head-&amp;gt;next-&amp;gt;data);
	
	free(head-&amp;gt;next); // head포인터가 가리키는 malloc된 대상 안의 next 포인터가 가리키는 대상을 날려라
	free(head);
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test11.java&lt;/p&gt;
&lt;pre id=&quot;code_1748242248824&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node{
	int data;
	Node next;
}

public class test11{
	public static void main(String[] args){
		Node head = new Node();
		head.data = 100;
		head.next = new Node();
		head.next.data = 200;
		
		System.out.println(head.data + &quot;, &quot;+ head.next.data);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test15.java&lt;/p&gt;
&lt;pre id=&quot;code_1748242261567&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node{
	int data;
	Node next;
}


// 클래스(구조체), 인스턴스(malloc), 멤버변수, 참조형변수(포인터) 개념
클래스 안에서 생선한 변수 멤버변수.
멤버변수는 인스턴스를 생성할 때 할당받는다
클래스 이름으로 생성된 변수를 참조형변수라고 한다
인스턴스를 가리키기 위한 용도이다.....................
public class test15{
	public static void main(String[] args){
		Node head ; // 클래스 이름으로 선언한 변수는 참조형변수, new로 할당받은 메모리 공간을 가리키는 용도
		head = new Node(); // new는 malloc과 유사
		// 클래스 안에는 변수를 선언할 수 있다. 이 변수는 new할 때 메모리를 할당받는다.
		// new Node(); 형태로 만들어진 할당받은 메모리 공간을 인스턴스 라고 한다.
	
		// 클래스는 구조체다. 여러번 선언 가능하다. 즉, 여러번 인스턴스 생성 가능하다. 
		// 여러번 인스턴스 만들어질 때마다 새로 변수가 생긴다.
		// 클래스 안에서 선언된 변수를 멤버변수라고 한다.
		// 멤버변수는 인스턴스 생성할 때마다 메모리를 할당받는다
		
		System.out.println(head.data + &quot;, &quot;+ head.next.data);
	}
}

/*
java의 class는 알고보면 구조체다 : 변수 선언이 가능 (대입연산금지)
class이름으로 변수를 선언할 수 있다. 
자료형으로 뭘 할 수 있었지? 변수 선언. 포인터 선언. malloc선언. 가능
구조체로 뭘 할 수 있었지? 변수, 포인터, malloc선언
java는 이 중 변수 선언만 안된다. 이 점이 c와 차이점 !

구조체는 마치 자료형처럼 쓰는구나... typedef
클래스는 변수 선언이 빠진 구조체더라..
*/&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;test16.java&lt;/p&gt;
&lt;pre id=&quot;code_1748242284144&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node{
	int data;
	Node next;
}

public class test16{
	public static void main(String[] args){
		Node head = new Node();
		Node tail = head;
		
		Node t = new Node();
		t.data = 10;
		t.next = null;
		tail.next = t;
		
		tail = tail.next;
		
		t = new Node();
		t.data = 20;
		t.next = null;
		tail.next = t;
		
		for(t= head.next; t != null ; t = t.next){
			System.out.println(t.data);
		}
			
		
		
	}
}&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;test16.java -&amp;gt; c로 작성&lt;/p&gt;
&lt;pre id=&quot;code_1748246263311&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct node {
	int data;
	struct node *next ;
}Node;

int main(){

	// Node* head, tail, t;
	Node* head = (Node*)malloc(sizeof(Node));
	Node* tail = head;
	
	Node* t = (Node*)malloc(sizeof(Node));
	t-&amp;gt;data = 10;
	t-&amp;gt;next = Null;
	tail-&amp;gt;next = t;
	
	tail = t-&amp;gt;next;
	
	Node* t = (Node*)malloc(sizeof(Node));
	t-&amp;gt;data = 20;
	t-&amp;gt;next = Null;
	tail-&amp;gt;next = t;
	
	for(t= head-&amp;gt;next; t != Null ; t = t-&amp;gt;next){
			printf(&quot;%d\n&quot;, t-&amp;gt;data);
		}
	
	free(head);
	free(tail);
	free(t);
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test17.c&lt;/p&gt;
&lt;pre id=&quot;code_1748244618640&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int add(int i, int j){
	printf(&quot;-&amp;gt;%d\n&quot;, i);
	printf(&quot;-&amp;gt;%d\n&quot;, j);
	return i+j;
}
int main() {
	int r ; 
	r = add(10,20);
	printf(&quot;%d &quot;, r);
	return 0;

}

/*
	add(10,20) 이 호출되면??
	1. int i, int j; 선언 - 메모리할당
	2. i = 10; j = 20 ; 대입
	3. 활용
	4. return 값; 값이 함수를 호출한 add(10,20) 부분을 대신한다고 보면 실수가 없다.

*/&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;b&gt;함수포인터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test20.c&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 안에 함수 선언 불가능하다&lt;/p&gt;
&lt;pre id=&quot;code_1748246529561&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct apple {
	int data;
    //int add(int, int); // error 함수선언 불가능
}Apple;

int add(int i, int j){
	return 100;
}

int add_v2(int i, int j){
	return 200;
}


int main() {
	int (*fp)(int, int);
	fp = add;
	printf(&quot;%d &quot;, fp(10,20));
	
	fp = add_v2;
	printf(&quot;%d &quot;, fp(10,20));
	
	return 0;

}

/*
	int (*fp)(int, int); 함수포인터
	fp는 포인터 변수다. 기억공간이 아닌 함수를 가리킨다. 매개변수가 int int 이고 리턴타입이 int인
	fp = add; 이 코드는 fp포인터가 add라는 함수를 가리키도록 대입한 코드

	결과값 100 return
	fp(10,20) fp포인터가 가리키는 함수를 호출한다 ..라는 이야기다.
	
	add_v2추가하면?
	결과값 100 200 return
	
	유지보수가 유독 많은 함수에 함수포인터를 이용하면 유지보수성이 좋아진다.
    
    *** 구조체 안에 함수 선언 안된다 !!!!!!!!!!!!!
*/&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;b&gt;함수포인터는 구조체 안에 선언 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test21.c&lt;/p&gt;
&lt;pre id=&quot;code_1748247317078&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct apple {
	int data;
	int (*add)(int, int); // 가능! 함수포인터는 구조체 안에 선언이 가능하다
}Apple;

int Apple_add(int i, int j){
	return 100;
}

int main() {
	Apple* t;
	t = (Apple*)malloc(sizeof(Apple));
	t-&amp;gt;data = 0;
	t-&amp;gt;add=  Apple_add;
	
	printf(&quot;%d %d  \n&quot;, t-&amp;gt;data, t-&amp;gt;add(10,20));
	
	return 0;
}

/*
	t-&amp;gt;add(10,20)
	함수 포인터를 이용하면 마치 t가 가리키는 대상 안에 add라는 이름의 함수를 호출하는 것 같은
	모양을 만들 수 있다
	
	java는 class안에 함수 선언이 가능하다. 위와 같은 방법으로 호출할 수 있다.
	t.add(10,20);
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번&amp;nbsp;만들어진&amp;nbsp;메모리&amp;nbsp;재사용할&amp;nbsp;때 &lt;br /&gt;단순&amp;nbsp;데이터&amp;nbsp;재사용하는&amp;nbsp;것과 &lt;br /&gt;이&amp;nbsp;데이터를&amp;nbsp;operation할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것과 &lt;br /&gt;함수&amp;nbsp;재사용하는&amp;nbsp;것과&amp;nbsp;뭐가&amp;nbsp;더&amp;nbsp;효율적일까?&amp;nbsp;2일차&amp;nbsp;수업에서&amp;nbsp;계속..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;[교육 2일차]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 &lt;br /&gt;인스턴스 &lt;br /&gt;참조형변수 &lt;br /&gt;멤버변수 &lt;br /&gt;멤버함수 &lt;br /&gt;new &lt;br /&gt;this &lt;br /&gt;&lt;br /&gt;클래스&amp;nbsp;안에&amp;nbsp;올&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;코드?&amp;nbsp;변수선언가능(멤버변수&amp;nbsp;/&amp;nbsp;대입은&amp;nbsp;불가),&amp;nbsp;함수선언가능(멤버함수&amp;nbsp;/&amp;nbsp;호출은&amp;nbsp;불가) &lt;br /&gt;=&amp;gt;&amp;nbsp;클래스는&amp;nbsp;알고보면&amp;nbsp;구조체,&amp;nbsp;함수포인터&amp;nbsp;이용해서&amp;nbsp;구조체&amp;nbsp;안에&amp;nbsp;함수를&amp;nbsp;밀어&amp;nbsp;넣음 &lt;br /&gt;&lt;br /&gt;클래스로&amp;nbsp;뭐&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있나?&amp;nbsp;(변수선언&amp;nbsp;포인터선언&amp;nbsp;malloc&amp;nbsp;=&amp;nbsp;java에선&amp;nbsp;변수선언&amp;nbsp;빠짐) &lt;br /&gt;-&amp;nbsp;포인터&amp;nbsp;선언&amp;nbsp;(&amp;nbsp;클래스&amp;nbsp;이름으로&amp;nbsp;선언된&amp;nbsp;변수&amp;nbsp;-&amp;nbsp;클래스로&amp;nbsp;선언된&amp;nbsp;변수는&amp;nbsp;100%포인터다.&amp;nbsp;이를,&amp;nbsp;참조형변수라&amp;nbsp;한다.) &lt;br /&gt;-&amp;nbsp;클래스&amp;nbsp;이름으로&amp;nbsp;선언된&amp;nbsp;변수는&amp;nbsp;인스턴스를&amp;nbsp;가리키게&amp;nbsp;된다 &lt;br /&gt;&lt;br /&gt;new와&amp;nbsp;malloc은&amp;nbsp;유사하다.&amp;nbsp;선언된&amp;nbsp;클래스&amp;nbsp;대로&amp;nbsp;메모리를&amp;nbsp;할당받은&amp;nbsp;실체가&amp;nbsp;인스턴스 &lt;br /&gt;&lt;br /&gt;멤버변수는&amp;nbsp;언제&amp;nbsp;메모리&amp;nbsp;할당받나?&amp;nbsp;인스턴스를&amp;nbsp;생성할때마다. &lt;br /&gt;멤버변수는&amp;nbsp;어떻게&amp;nbsp;호출&amp;nbsp;?&amp;nbsp;인스턴스&amp;nbsp;생성&amp;nbsp;+&amp;nbsp;참조형&amp;nbsp;변수를&amp;nbsp;이용&amp;nbsp;+&amp;nbsp;이름과&amp;nbsp;매개변수로&amp;nbsp;호출,&amp;nbsp;this&amp;nbsp;사용가능 &lt;br /&gt;&lt;br /&gt;this는&amp;nbsp;알고보면&amp;nbsp;로컬변수이고,&amp;nbsp;호출&amp;nbsp;때마다&amp;nbsp;가리키는&amp;nbsp;대상이&amp;nbsp;달라지고,&amp;nbsp;호출된&amp;nbsp;함수를&amp;nbsp;포함하는&amp;nbsp;인스턴스를&amp;nbsp;가리키게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test22.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326691660&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct ab {
	int a;
	float b;
}AB;


int main(){
	int a;
	int *b;
	
	AB ab;
	AB *p;
	p = (AB*)malloc(sizeof(AB));
	ab.a = 100;
	p-&amp;gt;b = 3.14;
	
	b= (int*)malloc(sizeof(int));
	*b = 100; // 변수는 이름 있지만 malloc으로 만든 공간은 이름이 없기에 포인터로 접근해야한다
	a=200;
	a = a + 100;
	
	return 0;
}

/*
변수는 이름 있지만 malloc으로 만든 공간은 이름이 없기에 포인터로 접근해야한다
구조체 : 변수, 포인터, malloc

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test23.java&lt;/p&gt;
&lt;pre id=&quot;code_1748326700662&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AB{
	int a;
	double b;
}


public class test23{
	public static void main(String[] args){
		AB p = null
		p = new AB();
	}
}

/*
	클래스: 변수
	모든 포인터에는 null값 대입 가능하다.
	포인터는 인스턴스를 가리킨다
	참조형변수는 클래스 이름으로 선언됐고
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test24.java&lt;/p&gt;
&lt;pre id=&quot;code_1748326732263&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Apple{
	int data=  0;
	int add(int i){		
		return 100;
	}
	
}


public class test24{
	public static void main(String[] args){
		Apple t = null;
		t = new Apple();
		
		t.data = 100;
		System.out.println(t.add(10));
	}

}

/*
	클래스 안에 선언된 함수를 호출하려면??
	1. 인스턴스 생성
	2. 참조형 변수로 가리키고
	3. 참조형변수. 함수명(매개변수값); 형태로 호출한다
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test25.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326743009&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct apple{
	int data;
	//int add (int i) {return 10101;} // c언어는 구조체 안에 함수 return 못함 -&amp;gt; 별도 함수로 외부에 작성하고 포인터로 선언해줘야함.
	int (*add)(int);
}Apple;

int Apple_add(int i){
	return 10101;
}

int main(){
	Apple* t; // 포인터 선언
	t = (Apple*)malloc(sizeof(Apple)); // 메모리할당
	
	t-&amp;gt;data = 100; //데이터
	t-&amp;gt;add = Apple_add;
	
	printf(&quot;%d&quot;, t-&amp;gt;add(100));
	
	
	free(t);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test26.java&lt;/p&gt;
&lt;pre id=&quot;code_1748326758855&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Apple{
	int data=  23;
	int add(int i){		
		return (this.data + 10101 );
	}
	
}


public class test26{
	public static void main(String[] args){
		Apple t = null;
		t = new Apple();
		
		t.data = 100;
		System.out.println(t.add(10));
	}

}

/*
	this.data
	this는 변수 아님
	t.data = 100; 과 비교해보면 여기서 this는 Apple형 포인터이어야 한다!!
	
	this.data는 100이면 이 결과가 말이 된다(10201)
	this 포인터는 호출된 함수 포인터를 소유하고 있는 인스턴스를 가리키는 포인터 이어야 한다 !!
	(쉽게 얘기하면 자기 자신에 대한 포인터가 된다)
	
	
	print값이 10124일까 10201일까?
	10201
	t포인터에 data 100으로 값 다시 초기화한 후, add함수 호출한 것이기 때문. this.data는 자기자신의 함수포인터가 되어 Apple클래스를 가리키고 data는 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;test27.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326792728&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct apple{
	int a;
	int b;
	int c;
	int (*sum)(int, int, int);
}Apple;

int apple_sum(int a, int b, int c){
	return a+b+c;
}

int main(){
	Apple* t; // 포인터 선언
	t = (Apple*)malloc(sizeof(Apple)); // 메모리할당
	
	t-&amp;gt;a = 10;
	t-&amp;gt;b = 20;
	t-&amp;gt;c = 30;
	t-&amp;gt;sum = apple_sum;
	
	printf(&quot;%d&quot;, t-&amp;gt;sum(t-&amp;gt;a, t-&amp;gt;b, t-&amp;gt;c));
	
	free(t);
	return 0;
}

/*
	이렇게 함수를 만들면 굳이 구조체로 묶을 필요도 없고, 변수가 추가되면 다시 짜야한다
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test28.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326800784&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct apple{
	int a;
	int b;
	int c;
	int x;
	int (*sum)(struct apple*);
}Apple;

int apple_sum(Apple* this){
	return this-&amp;gt;a + this-&amp;gt;b + this-&amp;gt;c + this-&amp;gt;x;
}

int main(){
	Apple* t; // 포인터 선언
	t = (Apple*)malloc(sizeof(Apple)); // 메모리할당
	
	t-&amp;gt;a = 10;
	t-&amp;gt;b = 20;
	t-&amp;gt;c = 30;
	t-&amp;gt;x = 55;
	t-&amp;gt;sum = apple_sum;
	
	printf(&quot;%d&quot;, t-&amp;gt;sum(t));
	
	free(t);
	return 0;
}

/*
	c언어로 객체지향 프로그래밍 할 때,
	구조체 안에서 선언된 모든 함수 포인터의 첫번째 매개변수는 같은 타입의 포인터로 선언한다
	
	t-&amp;gt;sum(t) 호출할 때, 사용한 포인터를 같이 넘긴다.
	
	Apple* this = t ; 
	this는 t가 가리키는 대상을 가리킨다.
	
	this 포인터는 sum 함수 포인터가 소속된 인스턴스 안의 모든 함수와 변수에 접근이 가능하다
	
	x변수를 추가한다고 생각하면 유지보수성이 좋아지더라
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test29.java&lt;/p&gt;
&lt;pre id=&quot;code_1748326808889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Apple{
	int data=  23;
	void print(){		
		System.out.println(this.data);
	}
	
}
public class test29{
	public static void main(String[] args){
		Apple a= new Apple();
		a.data = 100;
		a.print();
		
		Apple b= new Apple();
		b.data =200 ;
		b.print();
		
	}

}

/*
	
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test30.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326816825&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(){
	int a[4];
	int i;
	int temp, max;
	
	// 3 1 4 2
	a[0] = 3;
	a[1] = 1;
	a[2] = 4;
	a[3] = 2;
	
	max = 0;
	if (a[max] &amp;lt; a[1]) { // 3&amp;lt;1
		max = 1; //x
	}
	if (a[max] &amp;lt; a[2]) { // 3&amp;lt;4
		max = 2; // max= 2
	}
	if (a[max] &amp;lt; a[3]) { // 4&amp;lt;2
		max = 3;
	}
	// max = 2
	//printf(&quot;1) max a[max] : %d %d&quot;, max, a[max]); // 2 4
	
	if(max != 0){
		temp = a[0]; // 3
		a[0] = a[max]; // a[0] = 4
		a[max] = temp; // a[2] = 3
	}

	
	for(i = 0; i &amp;lt; 4; i++){
		printf(&quot;%d\n&quot;, a[i]);
	} // 4 1 3 2
	return 0;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test31.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326825938&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
void print(int* t){
	int i;
	for (i = 0; i &amp;lt; 3; i++){
		printf(&quot;print() :  %d\n&quot;, *(t+i));
	}
	//printf(&quot;print() :  %d\n&quot;, *t);
}


int main(){
	int a[2];
	int i;
	int *p;
	
	p = a ; // 배열형 변수는 사실은 포인터다
	
	a[0] = 10;
	a[1] = 20;
	a[2] = 30;
	
	printf(&quot;%d\n&quot;, *p); // 배열형 변수가 대입된 포인터는 배열의 첫번째 요소를 가리킨다
	printf(&quot;%d\n&quot;, *(p)); //
	printf(&quot;%d\n&quot;, *(p+0)); // a[0]
	printf(&quot;%d\n&quot;, *(p+1)); // a[1]
	
	for(i = 0; i &amp;lt; 3; i++){
		printf(&quot;%d\n&quot;, a[i]);
	} //
	
	print(a);
	return 0;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test32.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326835433&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;


void add(int* t){ // ???
	
	
}
void print(int* t){
	printf(&quot;print() :  %d\n&quot;, *(t+0));
	printf(&quot;print() :  %d\n&quot;, *(t+1));
	//int i;
	//for (i = 0; i &amp;lt; 3; i++){
	//	printf(&quot;print() :  %d\n&quot;, *(t+i));
	//}
	//printf(&quot;print() :  %d\n&quot;, *t);
}
void sort(int* t){
	int t;
	if (*(t+0) &amp;lt; *(t+1)){ // 동일 코드 : data[0] &amp;lt; data[1]
		t = *(t+0);
		*(t+0) = *(t+1);
		*(t+1) = t
	}
}

int main(){
	int a[2];
	
	add(a, 0, 100);
	add(a, 1, 200);
	
	sort(a);
	
	print(a);
	
	return 0;

}

/*
	이 코드에서
	add 없는 print함수는 의미가 없다
	add 없는 sort도 의미가 없다
	배열 없는 add도 의미 없다
	
	배열 + add + sort + print가 한 덩어리로 묶여서 재사용되는 빈도가 훨씬 많더라
	-&amp;gt; 객체지향적으로 이 부분을 해결해보자
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test33.java&lt;/p&gt;
&lt;pre id=&quot;code_1748326859951&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class test33{
	public static void main(String[] args){
		int[] data = new int[2];
		int[] t = data;
		
		data[0] = 100;
		t[1] = 200;
		
		System.out.println(data[1]);
		System.out.println(t[0]);
		
		
	}
}
/*
	int[] data = new int[2];
	
	배열은 인스턴스이다 (new)
	data는 배열을 가리키는 참조형 변수가 된다 (포인터)
	

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test34.java&lt;/p&gt;
&lt;pre id=&quot;code_1748326868632&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
java는 변수와 함수가 독립적으로 존재할 수 없다. 클래스 안에서 선언되어야 한다.
멤버함수 안에서는 this를 쓸 수 있고
t.add(0,100) 형태로 호출됐을 때, add함수 안의 this는 t와 같은 대상을 가리키게 된다.

add, sort, print는 data배열과 뗄레야 뗄 수 없는 관계가 성립된다.
자연스럽게 한 묶음이 되고, 재사용성이 늘어나게 된다.
*/
class Banana{
	int[] data = null;
	
	void add(int idx, int val){
		this.data[idx] = val;
		
	}
	void print(){
		System.out.println(this.data[0] + &quot;,&quot; + this.data[1]);
	}
	void sort(){
		if (this.data[0] &amp;lt; this.data[1]){
			int temp = this.data[0];
			this.data[0] = this.data[1];
			this.data[1]= temp;
		}
	}
}

public class test34{
	public static void main(String[] args){
		Banana t = new Banana();
		t.data = new int[2];
		t.add(0,100);
		t.add(1,200);
		t.sort();
		t.print();
		
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test35.c&lt;/p&gt;
&lt;pre id=&quot;code_1748326892735&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct banana{
	int *data;
	void (*add)(struct banana*, int, int);
	void (*print)(struct banana*);
}Banana;

int banana_add(Banana* this, int idx, int val){
	//this-&amp;gt;data[idx] = val;
	*(this-&amp;gt;data+idx)= val;
}

/*
void print(Banana* this){
	pirntf(this.data[0] + &quot;,&quot; + this.data[1]);
	
}
*/

Banana* new_Banana(){
	Banana* t;
	t= (Banana*)malloc(sizeof(Banana));
	
	t-&amp;gt;add = Banana_add;
	t-&amp;gt;data = (int*)malloc(sizeof(int)*2);
	
	return t;
	
}

int main(){
	Banana* b; // 포인터 선언
	t = (Banana*)malloc(sizeof(Banana)); // 메모리할당

	t-&amp;gt;add(t, 0, 100);

	free(t);
	return 0;
}

/*
	이렇게 함수를 만들면 굳이 구조체로 묶을 필요도 없고, 변수가 추가되면 다시 짜야한다
	
	c언어로 객체지향스럽게 코드를 짠 예
	
	c언오로 구조체와 함수포인터를 사용하여 객체지향 적으로 개발할 수도 있다
	하지만 애초에 객체지향 프로그래밍을 목적으로 만든 언어를 사용하는 것이 더 적합하다
	
	이코드는 객체지향 언어의 주요개념들(클래스 인스턴스 멤버변수 멤버함수 this new 등)을
	이해하기 위한 목적으로 사용하자
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test36.java&lt;/p&gt;
&lt;pre id=&quot;code_1748411847624&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Apple{
	int data; // 멤버변수
	Apple(int i ){ // 생성자함수 : 인스턴스 생성시 호출됨
		System.out.println(&quot;Apple &quot; + i);
		this.data = i;
	}
}

public class test36{
	public static void main(String[] args){
		Apple t = null;
		Apple x = new Apple(100);
		Apple y = new Apple(200);
		
		System.out.println(x.data + &quot;, &quot; + y.data);
		
		//x.Apple(0); // 에러. 생성자함수는 멤버함수가 아니어서 포인터로 호출될 수 없다.
	}
}

/*
	클래스 이름과 같고, 리턴타입이 없다 -&amp;gt; 생성자함수 (Constructor)이라고 한다.
	호출될 수 있지만 멤버함수가 아니다. -&amp;gt; 인스턴스 생성시에 호출된다(매번)
	
	생성자 함수에는 매개변수를 선언할 수 있고, 생성자 함수에 값을 전달할 수 있고
	-&amp;gt; &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;test38.java&lt;/p&gt;
&lt;pre id=&quot;code_1748411882507&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node{
	int data = 0;
	Node next = null;
	
	/*
	Node(int a){
		this.data=a;
	}*/
	
	Node(int a, Node b){
		this.data=a;
		this.next=b;
	}
}

class LinkedList{
	Node head = null;
	Node tail = null;

	Linkedlist(){
		this.head = new Node(0,null);
		this.tail = this.head;
		
	}
	
	void add(int i){
		this.tail.next = new Node(i, null);
	}
	
	
 

public class test38{
	public static void main(String[] args){
		//Node head = new Node(99);
		//System.out.println(head.data);
		
		//Node head2 = new Node(42, null);
		//System.out.println(head2.data);
		
		LinkedList l = new LinkedList();
		l.add(10);
		l.add(20);
		l.add(30);
		
		
	}
}

/*

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test39.c&lt;/p&gt;
&lt;pre id=&quot;code_1748411898659&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(){
	int a, *p;
	float b;
	void *vp;
	
	a=10;
	p = &amp;amp;a; // 당연 int* 변수가 int형 공간을 가리킨다
	vp = &amp;amp;a; // void* 형 변수가 int공간을 가리킨다
	
	printf(&quot; %d\n&quot;, *p);
	// printf(&quot;%d\n&quot;, *vp); // 에러. void*형은 반드시 타입 형변환 시킨 후 사용해야함.
	printf(&quot; %d\n&quot;, *((int*)vp));
	
	b = 3.14;
	vp = &amp;amp;b; // void*형 변수는 모든 형태의 기억공간을 가리킬 수 있다.
	
	printf(&quot;%d\n&quot;, *((float*)vp));
	
	printf(&quot;%d\n&quot;, *((int*)vp));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;[교육 3일차]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test41.java&lt;/p&gt;
&lt;pre id=&quot;code_1748411940386&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Dog{
	int weight=500;
}

public class test41{
	public static void main(String[] args){
		Dog mary = new Dog();
		mary.weight = mary.weight + 12;
		
		System.out.println(mary.weight);
		
		Dog happy = mary;
		happy.weight = happy.weight + 59;
		System.out.println(happy.weight);
	}
}
/*
	인스턴스가 가진 메모리는
	인스턴스를 가리키는 참조형 변수의 개수가 0이 되는 순간에 회수한다
	(가비지콜렉터 라는 메커니즘이 있고 이것은 자바 실행머신에서 활동한다)
	
	실제로 소거하는 시점은? CPU가 놀 때(할일없음), 메모리가 부족(배고파 죽겠다)
	
	main이 끝나서 mary happy 두 포인터가 자동으로 없어진다 (로컬변수)
	따라서 new Dog()로 생성한 메모리가 밥줄이 끊기고 -&amp;gt; 포획되고 -&amp;gt; 소거된다
	
	없앨 수는 없지만 잡혀가게 할 수는 있다 -&amp;gt; 가리키는 포인터의 개수를 0으로 만들면 된다. 
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test42.java&lt;/p&gt;
&lt;pre id=&quot;code_1748411949858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node{
	int data = 0;
	Node next = null;
	
	Node(int a, Node b){
		this.data=a;
		this.next=b;
	}
}


public class test42{
	public static void main(String[] args){
		Node head = new Node(0,null);
		Node tail = head;
		
		tail.next = new Node(10,null); 
		tail = tail.next;
		
		tail.next = new Node(20,null); 
		tail = tail.next;
		
		tail.next = new Node(30,null); 
		tail = tail.next;
		
		for(Node t = head.next; t != null ; t = t.next){
			System.out.println(t.data);
		}
		
		Node a = head ; 
		Node b = head.next;
		
		while(a != null){
			a.next = null;
			
			a=b;
			b=b.next;
			
		}
		tail = head;
	}
}
/*
	
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test43.c&lt;/p&gt;
&lt;pre id=&quot;code_1748411961275&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct node {
	int data;
	struct node *next;
}Node;

Node* new_Node(int i, Node* b){
	Node* t;
	t= (Node*)malloc(sizeof(Node));
	
	t-&amp;gt;data = i;
	t-&amp;gt;next = b;
	
	return t;
	
}

int main(){
	Node *head, *tail, *t;
	Node *a, *b;
	
	head = new_Node(0,Null);
	tail = head;
	
	tail-&amp;gt;next = new_Node(10, Null);
	tail = tail-&amp;gt;next;
	
	tail-&amp;gt;next = new_Node(20, Null);
	tail = tail-&amp;gt;next;
	
	tail-&amp;gt;next = new_Node(30, Null);
	tail = tail-&amp;gt;next;
	
	// 어디에 어떻게 코드를 한 줄 짜면 싹 다 지울 수 있을까?
	a= head;
	b = head-&amp;gt;next;
	while (a!=Null){
		a=b;
		b=b-&amp;gt;next;
	}
	
	for(t= head-&amp;gt;next ; t != Null ; t-&amp;gt;next){
		printf(&quot;%d\n&quot;, t-&amp;gt;data);
		
	}
	
	free(head);
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test44.java&lt;/p&gt;
&lt;pre id=&quot;code_1748411978059&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A{
	int data = 100;
	
}
/*
	상속 : 클래스가 가진 멤버변수와 멤버함수를 물려받는 것
*/
class B extends A{
	void print(){
		System.out.println(&quot;print&quot;);
	}
}

public class test44{
	public static void main(String[] args){
		A a = new A();
		//a.print(); // error
		
		B b = new B();
		System.out.println(b.data);
		b.print();
		
		/*
			조상 클래스형 포인터로 자손 클래스의 인스턴스를 가리킬 수 있다.
			(상속 받은 클래스가 자손, 상속을 준 클래스가 조상)
			
			이때 조상에서 선언된 함수와 변수가 접근 가능하다.
		*/
		A ab = new B();
		// ab.print(); 분명 print 함수 포인터가 있는데도 접근이 안된다
		System.out.println(ab.data);
		
		// B ac = new A(); // error 자손은 조상에게 상속만 받을 수 있음.
		
		
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test46.c&lt;/p&gt;
&lt;pre id=&quot;code_1748412003011&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct a {
	int data;
}A;

typedef struct b {
	int data; // 상속되어서 물려받은 멤버변수
	void (*print)(void); // 자손에서 추가된 멤버함수
}B;

int main(){
	void* vp;
	A* a;
	B* b;
	
	vp = malloc(sizeof(B));
	a = (A*)vp;
	
	printf(&quot;%d\n&quot;, a-&amp;gt;data);
	//a-&amp;gt;print(); // error 조상은 조상까지만 접근가능
	
	b=(B*)vp;
	b-&amp;gt;print(); // 자손은 조상+자손 접근가능
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test47.c&lt;/p&gt;
&lt;pre id=&quot;code_1748412020522&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct a {
	int data;
}A;

typedef struct b {
	int data; // 상속되어서 물려받은 멤버변수
	void (*print)(void); // 자손에서 추가된 멤버함수
}B;

void a_print(){
	printf(&quot;apple\n&quot;);
	
}

void* new_a{
	A* t;
	t = malloc(sizeof(A));
	t-&amp;gt;data=100;
	t-&amp;gt;print = a.print;
	
	return t;
	
}
int main(){
	A* a;
	a=(A*)new_a();
	printf(&quot;%d\n&quot;, a-&amp;gt;data);
	a-&amp;gt;print();
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test48.c&lt;/p&gt;
&lt;pre id=&quot;code_1748412031259&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct a {
	int data;
}A;

// 상속은 골라받을 수 없다. 그대로 순서대로 온 다음 자손에서 추가된 것을 넣어준다.
typedef struct b {
	int data; // 상속되어서 물려받은 멤버변수
	void (*print)(void); // 자손에서 추가된 멤버함수
	void (*print2)(void);
}B;

void a_print(){
	printf(&quot;apple\n&quot;);
	
}
void b_print(){
	printf(&quot;banana\n&quot;);
	
}

void* new_a(){
	A* t;
	t = malloc(sizeof(A));
	t-&amp;gt;data=100;
	t-&amp;gt;print = a.print;
	
	return t;
	
}

void* new_b(){
	B* t;
	t = malloc(sizeof(t));
	t-&amp;gt;data=444;
	t-&amp;gt;print = a_print;
	t-&amp;gt;print = b_print;
	return t;
	
}

int main(){
	A* a;
	B* b;
	
	
	
	a=(A*)new_a();
	printf(&quot;\n%d\n&quot;, a-&amp;gt;data);
	a-&amp;gt;print();
	
	printf(&quot;\n%d\n&quot;, b-&amp;gt;data);
	b-&amp;gt;print();
	
	b=(B*)new_b();
	printf(&quot;\n%d\n&quot;, b-&amp;gt;data);
	a-&amp;gt;print();
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test49.java&lt;/p&gt;
&lt;pre id=&quot;code_1748412041402&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A{
	void print(){
		System.out.println(&quot;apple&quot;);
	}
	
}

class B extends A{
	void print(){
		System.out.println(&quot;banana&quot;);
	}
}

public class test49{
	public static void main(String[] args){
		B b = new B();
		b.print(); // banana
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test50.c&lt;/p&gt;
&lt;pre id=&quot;code_1748412057603&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct a {
	void (*print)(void);
}A;

void a_print(){
	printf(&quot;apple\n&quot;);
	
}
void b_print(){
	printf(&quot;banana\n&quot;);
	
}

void* new_a(){
	A* t;
	t= (A*)malloc(sizeof(A));
	t-&amp;gt;print = a_print;
	return t;
	
}

typedef struct b {
	void (*print)(void);
}B; // 오버라이딩이 일어난 경우에는 함수포인터를 선언하지 않는다

void* new_b(){
	B* t;
	t= (B*)malloc(sizeof(B));
	t-&amp;gt;print = a_print; // 물려받는다
	t-&amp;gt;print = b_print; // 오버라이딩의 실체
	// 포인터는 물려받은 거, 가리키는 실체는 자손에서 추가된 것
	return t;
	
}

int main(){
	A* a;
	B* b;

	a=(A*)new_a();
	a-&amp;gt;print();
	

	b=(B*)new_b();
	a-&amp;gt;print();
	b-&amp;gt;print();
	
	return 0;
}

/*
결과
apple
apple
banana
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test51.java&lt;/p&gt;
&lt;pre id=&quot;code_1748412070259&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A{
	void print(){
		System.out.println(&quot;apple&quot;);
	}
	
}

class B extends A{
	void print(){
		System.out.println(&quot;banana&quot;);
	}
	void print2(){
		System.out.println(&quot;orange&quot;);
	}
}

public class test51{
	public static void main(String[] args){
	
		A a = new A();
		a.print();
		
		B b = new B();
		b.print(); // banana
		b.print2();
		
		A ab = new B();
		ab.print();
		//ab.print2();//error
	}
}
/*
apple
banana
orange
banana

조상의 포인터로 자손의 인스턴스를 가리킬 수 있다.
조상에서 선언된 멤버변수 멤버함수만 접근 가능하다.
만일 오버라이딩 된 경우에는 오버라이딩 된 함수가 호출된다.
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tset52.java&lt;/p&gt;
&lt;pre id=&quot;code_1748412079066&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node{
	int data = 0;
	Node next = null;
	
	Node(int a, Node b){
		this.data=a;
		this.next=b;
	}
}

class LinkedList{
	Node head = null;
	Node tail = null;
	
	LinkedList(){
		head = new Node(0,null);
		tail=head;
	}
	void add(int a){
		tail.next = new Node(a, null);
		tail = tail.next;
	}
	void print(){
		for (Node t = head.next; t != null; t=t.next){
			System.out.println(t.data);
		}
	}
}

class LinkedList2 extends LinkedList{
	void add(int a){
		head.next = new Node(a, head.next);
	}
}


public class test52{
	public static void main(String[] args){
	
		LinkedList l = new LinkedList();
		l.add(10);
		l.add(20);
		l.add(30);
		l.print();
		
		/*
		10
		20
		30
		*/
		
		LinkedList l2 = new LinkedList2();
		l2.add(10);
		l2.add(20);
		l2.add(30);
		l2.print();
		/*
		30
		20
		10
		*/
	}
}
/*

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test53.java&lt;/p&gt;
&lt;pre id=&quot;code_1748412948113&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A{
	A(){
		System.out.println(&quot;a&quot;);
	}
}

class B extends A{
	B(){
		System.out.println(&quot;b&quot;);
	}
}

public class test53{
	public static void main(String[] args){
		new B();
	}
}

/*
결과
a
b

생성자함수는 인스턴스를 생성했을 때 (new) 호출된다.
자손의 인스턴스를 생성했다 -&amp;gt; 조상의 생성자 호출되고, 자손의 생성자가 호출된다.

생성자함수: 멤버변수 초기화 용도
-&amp;gt; 조상의 멤버변수는 조상의 생성자에서, 자손의 멤버변수는 자손의 생성자에서 각각 초기화 한다.
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test54.java&lt;/p&gt;
&lt;pre id=&quot;code_1748412962017&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A{
	int apple = 1;
	A(int i){
		this.apple = i;
	}
	
}

class B extends A{
	
	int banana = 4;
	B(int i, int j){
		//this.apple = j; // error
		super(j); // 
		this.banana = i;
	}
}

public class test54{
	public static void main(String[] args){
		B b = new B(100,200);
		System.out.println(b.apple);
		System.out.println(b.banana);
	}
}

/*
200
100

조상의 멤버변수는 조상의 생성자에서, 자손의 멤버변수는 자손의 생성자에서 각각 초기화한다.
B는 apple, banana 두개의 멤버변수를 가지고 있다.

자손의 인스턴스를 생성하면 조상의 '디폴트로 매개변수 없는 생성자'가 호출된다
A(){...} 생성자가 선언딘 적이 없다. &amp;lt;- 에러가 났다
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조상의&amp;nbsp;멤버변수는&amp;nbsp;조상의&amp;nbsp;생성자에서,&amp;nbsp;자손의&amp;nbsp;멤버변수는&amp;nbsp;자손의&amp;nbsp;생성자에서&amp;nbsp;각각&amp;nbsp;초기화한다. &lt;br /&gt;B는&amp;nbsp;apple,&amp;nbsp;banana&amp;nbsp;두개의&amp;nbsp;멤버변수를&amp;nbsp;가지고&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;자손의&amp;nbsp;인스턴스를&amp;nbsp;생성하면&amp;nbsp;조상의&amp;nbsp;'디폴트로&amp;nbsp;매개변수&amp;nbsp;없는&amp;nbsp;생성자'가&amp;nbsp;호출된다 &lt;br /&gt;A(){...}&amp;nbsp;생성자가&amp;nbsp;선언딘&amp;nbsp;적이&amp;nbsp;없다.&amp;nbsp;&amp;lt;-&amp;nbsp;에러가&amp;nbsp;났다 &lt;br /&gt;&lt;br /&gt;조상의&amp;nbsp;생성자가&amp;nbsp;먼저&amp;nbsp;생성됨 &lt;br /&gt;즉&amp;nbsp;자손쪽에서는&amp;nbsp;먼저&amp;nbsp;호출되는&amp;nbsp;조상의&amp;nbsp;생성자를&amp;nbsp;선택할&amp;nbsp;수&amp;nbsp;있다 &lt;br /&gt;선택하게&amp;nbsp;만드는&amp;nbsp;것에&amp;nbsp;super()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test56.c&lt;/p&gt;
&lt;pre id=&quot;code_1748506107277&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef struct a {
	int apple;
	void (*print)(struct a*);
}A;



void a_print(A* this){
	printf(&quot; a_print(A* this-&amp;gt;apple :  %d\n&quot;,this-&amp;gt;apple);
	
}

void a_constructor(A* this, int val){
	this-&amp;gt;apple = val;
}

void* new_a(int val){ 
	A* t;
	t= (A*)malloc(sizeof(A));
	t-&amp;gt;print = a_print;
	
	a_constructor(t, val);
	
	return t;
}

typedef struct b {
	int apple;	
	void (*print)(void *);
	
	int banana;
}B; 


void b_print(void* self){
	B *this;
	this = (B*)self;
	
	printf(&quot; b_print(B* this-&amp;gt;banana :  %d\n&quot;,this-&amp;gt;banana);
	
}
void b_constructor(void* self, int val){
	B* this;
	this = (B*)self;
	
	this-&amp;gt;banana = val;
}

void* new_b(int i, int j){ 
	B* t;
	t= (B*)malloc(sizeof(B));
	
	t-&amp;gt;print = a_print;
	t-&amp;gt;print = b_print; 
	
	a_constructor(t,j);
	b_constructor(t,i);
	return t;	
}

int main(){
	
	A *a;
	a=(A*)new_a(200);
	a-&amp;gt;print(a);

	
	B *b;
	b=(B*)new_b(100,200);
	b-&amp;gt;print(b);
	
	
		
	free(a);
	free(b);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test59.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506148874&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class A{
	abstract void print();
	void print2(){} //abstarct 하지 않은 함수를 같이 쓰는 건 상관없다
	
}

class B extends A{
	void print(){
		System.out.println(&quot;print&quot;);
	}
	void sound(){
		
		System.out.println(&quot;sound&quot;);
	}
}

public class test59{
	public static void main(String[] args){
		B banana = new B();
		banana.print();
		banana.sound();
	}
}
/*
print
sound

void print(); 로 함수 선언을 하려면 반드시 abstract가 앞에 붙어주어야한다
abstract 멤버함수를 하나라도 가지고 있는 클래스는 abstract 해야한다.
abstract class는 인스턴스를 못 만든다

abstarct클래스 :: 추상클래스
인스턴스를 생성할 수 없는 클래스
하나이상의 추상메서드(구현되지 않은 메서드)를 가질 수 있음
자식클래스가 이 클래스를 상속받아 구현을 완성해야함


*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test60.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506171107&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class shoppingmall{
	abstract int db();
	void list(){
		int result = db();
		System.out.println(result);
	}
}

class shoppingmall_mysql extends shoppingmall{
	int db(){
		System.out.println(&quot;mysql 연동&quot;);
		return 100;
	}
}

class shoppingmall_mariadb extends shoppingmall{
	int db(){
		System.out.println(&quot;mariadb 연동&quot;);
		return 200;
	}
}

public class test60{
	public static void main(String[] args){
		shoppingmall D1 = new shoppingmall_mysql();
		D1.list();
		shoppingmall D2 = new shoppingmall_mariadb();
		D2.list();
	}
}
/*

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재&amp;nbsp;상황에서&amp;nbsp;결정할&amp;nbsp;수&amp;nbsp;없거나,&amp;nbsp;앞으로&amp;nbsp;변경이&amp;nbsp;만이&amp;nbsp;일어날&amp;nbsp;부분을&amp;nbsp;abstract로&amp;nbsp;비워놓고 &lt;br /&gt;변경이&amp;nbsp;적은&amp;nbsp;부분을&amp;nbsp;미리&amp;nbsp;클래스로&amp;nbsp;만들어놓을&amp;nbsp;수&amp;nbsp;있다 &lt;br /&gt;쇼핑몰&amp;nbsp;클래스의&amp;nbsp;재홀용&amp;nbsp;빈도가&amp;nbsp;늘어나게되고&amp;nbsp;-&amp;gt;&amp;nbsp;생산성이&amp;nbsp;향상된다 &lt;br /&gt;&lt;br /&gt;abstract&amp;nbsp;method의&amp;nbsp;실체는&amp;nbsp;구조체&amp;nbsp;안의&amp;nbsp;함수포인터에&amp;nbsp;NULL값이&amp;nbsp;들어가&amp;nbsp;있는&amp;nbsp;꼴이다. &lt;br /&gt;이러한&amp;nbsp;구조체는&amp;nbsp;MALLOC하게되면&amp;nbsp;폭탄이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;-&amp;gt;&amp;nbsp;NULL&amp;nbsp;값이&amp;nbsp;들어간 &lt;br /&gt;함수포인터는&amp;nbsp;호출하면&amp;nbsp;터진다.&amp;nbsp;-&amp;gt;&amp;nbsp;따라서&amp;nbsp;이런&amp;nbsp;구조체는&amp;nbsp;malloc못하게&amp;nbsp;해야&amp;nbsp;한다. &lt;br /&gt;-&amp;gt;&amp;nbsp;인스턴스를&amp;nbsp;못&amp;nbsp;만다는&amp;nbsp;클래스 &lt;br /&gt;mysql&amp;nbsp;연동 &lt;br /&gt;100 &lt;br /&gt;mariadb&amp;nbsp;연동 &lt;br /&gt;200&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;[교육 4일차]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test65.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506206429&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class Apple{
	abstract int add(int i, int j);
}

class Apple2 extends Apple{
	int add(int i, int j){
		return i+j;
	}
}


public class test65{
	public static void main(String[] args){
		Apple a = new Apple2();
		System.out.println(a.add(1,2));
	}
}
/*

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언되었지만&amp;nbsp;정의되지&amp;nbsp;않은&amp;nbsp;함수&amp;nbsp;:&amp;nbsp;abstract&amp;nbsp;method &lt;br /&gt;(함수&amp;nbsp;포인터에&amp;nbsp;null&amp;nbsp;값이&amp;nbsp;대입된&amp;nbsp;형태와&amp;nbsp;유사) &lt;br /&gt;&lt;br /&gt;함수&amp;nbsp;포인터에&amp;nbsp;null값이&amp;nbsp;대입된&amp;nbsp;구조체는&amp;nbsp;존재해서는&amp;nbsp;안된다.&amp;nbsp;::&amp;nbsp;언제&amp;nbsp;뻗을지&amp;nbsp;모른다 &lt;br /&gt;-&amp;nbsp;해서&amp;nbsp;java에서는&amp;nbsp;인스턴스를&amp;nbsp;못&amp;nbsp;만들게&amp;nbsp;문법으로&amp;nbsp;박았다&amp;nbsp;-&amp;gt;&amp;nbsp;abstract&amp;nbsp;class &lt;br /&gt;&lt;br /&gt;abstract&amp;nbsp;method&amp;nbsp;를&amp;nbsp;상속받으면서&amp;nbsp;오버라이딩을&amp;nbsp;하면&amp;nbsp;abstract&amp;nbsp;성격이&amp;nbsp;빠져나간다 &lt;br /&gt;&lt;br /&gt;t-&amp;gt;add&amp;nbsp;=&amp;nbsp;NULL; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test67.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506227442&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class Clac {
	abstract int multicas(int i, int j);
	//Addclc(int a) {seed = a;}
	int execute (int i ) {return i + this.seed;}
}

class Mulcalc extends Clac{
	int banana = 0;
	Mulcalc (int a ) {this.banana=  a;}
	int execute (int i ) {return (banana+10)* i;}
}


public class test67{
	public static void main(String[] args){
		
		/*Clac a = new AddCalc(100);
		System.out.println(a.execute(20));*/
		
		Clac b = new MulCalc(100);
		System.out.println(b.execute(20));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test68.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506247530&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface IA {
	//void print(){}; // 에러
	void print();
}

class A implements IA {
	void print(){ // 오버라이딩abstract class Clac {
}

public class test68{
	public static void main(String[] args){
		//new IA(); // 에러
		IA t = null;
		System.out.println();
	}
}

/*
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;interface &lt;br /&gt;-&amp;nbsp;abstract&amp;nbsp;method만&amp;nbsp;선언이&amp;nbsp;가능하다 &lt;br /&gt;-&amp;nbsp;앞에&amp;nbsp;abstract&amp;nbsp;안&amp;nbsp;붙여도&amp;nbsp;자동으로&amp;nbsp;붙는다. &lt;br /&gt;-&amp;nbsp;당연히&amp;nbsp;인스턴스&amp;nbsp;못만든다&amp;nbsp;(&amp;nbsp;좀&amp;nbsp;이상한&amp;nbsp;클래스다) &lt;br /&gt;-&amp;nbsp;인터페이스를&amp;nbsp;상속받아&amp;nbsp;클래스를&amp;nbsp;만들때는&amp;nbsp;implements를&amp;nbsp;이용한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;(인터페이스를&amp;nbsp;상속받아&amp;nbsp;인터페이스를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;extends를&amp;nbsp;사용한다) &lt;br /&gt;-&amp;nbsp;인터페이스를&amp;nbsp;상속받아&amp;nbsp;클래스&amp;nbsp;선언할&amp;nbsp;때는&amp;nbsp;인터페이스의&amp;nbsp;모든&amp;nbsp;함수를&amp;nbsp;오버라이딩&amp;nbsp;해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test73.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506429740&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Adam{
	private int redBook = 100;
	public int subHouse = 200;
	protected int map = 300; // 상속자는 접근 가능한데, 포인터로는 접근 불가
	
	void picnic(){
		System.out.println(redBook);
		System.out.println(subHouse);
		}
}

class Brown extends Adam{
	void give(){
		//System.out.println(redBook);//error
		System.out.println(subHouse);
		System.out.println(map);
	}
}

class Jen extends Brown{
	void give2(){
		//System.out.println(redBook);//error
		System.out.println(subHouse);
		System.out.println(map);
	}
}

public class test73{
	public static void main(String[] args){
		Adam a = new Brown();
		//System.out.println(a.redBook); // error // redBook has private access in Adam
		System.out.println(a.subHouse); 
		System.out.println(a.map); 
		//System.out.println(a.give2()); 
		
	}
}
/*


*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버변수와&amp;nbsp;멤버함수&amp;nbsp;앞에서&amp;nbsp; &lt;br /&gt;private&amp;nbsp;:&amp;nbsp;포인터를&amp;nbsp;통해&amp;nbsp;접근이&amp;nbsp;불가능 &lt;br /&gt;protected&amp;nbsp;:&amp;nbsp;다른&amp;nbsp;패키지에&amp;nbsp;속한&amp;nbsp;클래스는&amp;nbsp;포인터로&amp;nbsp;접근&amp;nbsp;불가능. &lt;br /&gt;public &lt;br /&gt;이&amp;nbsp;붙어서&amp;nbsp;접근을&amp;nbsp;제한할&amp;nbsp;수&amp;nbsp;있다 &lt;br /&gt;&lt;br /&gt;아무것도&amp;nbsp;없는&amp;nbsp;경우는&amp;nbsp;friendly라고&amp;nbsp;하는데 &lt;br /&gt;같은&amp;nbsp;패키지는&amp;nbsp;public,&amp;nbsp;다른&amp;nbsp;패키지에게는&amp;nbsp;private로&amp;nbsp;동작한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test74.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506465899&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A{
	public String toString(){
		return &quot;Hello world&quot;;
	}
}

public class test74{
	public static void main(String[] args){
		Object t = new A();
		System.out.println(t.toString());
		
		System.out.println((int)(10/3.0));
	}
}

/*
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무&amp;nbsp;클래스로부터&amp;nbsp;상속받지&amp;nbsp;않으면&amp;nbsp;extends&amp;nbsp;Object가&amp;nbsp;생략된다 &lt;br /&gt;&lt;br /&gt;Object는&amp;nbsp;내장되어&amp;nbsp;있는&amp;nbsp;클래스,&amp;nbsp;'모든클래스의&amp;nbsp;조상이&amp;nbsp;된다' &lt;br /&gt;&lt;br /&gt;toString()은&amp;nbsp;Object에서&amp;nbsp;선언되었고,&amp;nbsp;또한&amp;nbsp;물려받았다. &lt;br /&gt;java클래스의&amp;nbsp;모든&amp;nbsp;인스턴스는&amp;nbsp;toString()함수를&amp;nbsp;가지고&amp;nbsp;잇다&amp;nbsp;-&amp;gt;&amp;nbsp;Object는&amp;nbsp;모든&amp;nbsp;클래스의&amp;nbsp;조상 &lt;br /&gt;&lt;br /&gt;toString함수를&amp;nbsp;오버라이딩&amp;nbsp;하면&amp;nbsp;t.toString()호출&amp;nbsp;시&amp;nbsp;오버라이딩&amp;nbsp;된&amp;nbsp;함수가&amp;nbsp;호출된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[JAVA 자료형]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형&amp;nbsp;이름&amp;nbsp;=&amp;nbsp;초기값; &lt;br /&gt;&lt;br /&gt;정수형&amp;nbsp;변수&amp;nbsp;선언에&amp;nbsp;쓰는&amp;nbsp;자료형&amp;nbsp;4가지&amp;nbsp;:&amp;nbsp;byte(8bit)&amp;nbsp;short(16bit)&amp;nbsp;int(32bit)&amp;nbsp;long(64bit) &lt;br /&gt;일반적으로&amp;nbsp;40...&amp;nbsp;이렇게&amp;nbsp;값을&amp;nbsp;쓰면&amp;nbsp;32bit값인데&amp;nbsp;40L은&amp;nbsp;64bit&amp;nbsp;값이&amp;nbsp;된다 &lt;br /&gt;&lt;br /&gt;실수형&amp;nbsp;변수&amp;nbsp;선언에&amp;nbsp;쓰는&amp;nbsp;건&amp;nbsp;두가지&amp;nbsp;:&amp;nbsp;float&amp;nbsp;(32bit)&amp;nbsp;double(64bit) &lt;br /&gt;3.14F&amp;nbsp;32bit가지는&amp;nbsp;실수&amp;nbsp;3.14는&amp;nbsp;64bit값 &lt;br /&gt;&lt;br /&gt;boolean으로&amp;nbsp;선언된&amp;nbsp;변수 &lt;br /&gt;&lt;br /&gt;char&amp;nbsp; &lt;br /&gt;&lt;br /&gt;UTF-8은&amp;nbsp;1~4바이트&amp;nbsp;크기를&amp;nbsp;가지는&amp;nbsp;가변&amp;nbsp;길이&amp;nbsp;문자&amp;nbsp;체계이고 &lt;br /&gt;이것이&amp;nbsp;인터넷의&amp;nbsp;표준&amp;nbsp;인코딩&amp;nbsp;방법이&amp;nbsp;되고&amp;nbsp;있다 &lt;br /&gt;&lt;br /&gt;필요한&amp;nbsp;경우,&amp;nbsp;8859_1(아스키코드),&amp;nbsp;Unicode,&amp;nbsp;UTF-8을&amp;nbsp;전환하는&amp;nbsp;것이&amp;nbsp;필요할&amp;nbsp;수&amp;nbsp;있다 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;약-&amp;gt;강한타입 &lt;br /&gt;byte&amp;nbsp;&amp;lt;&amp;nbsp;short&amp;nbsp;&amp;lt;&amp;nbsp;int&amp;nbsp;&amp;lt;&amp;nbsp;long(64bit)&amp;nbsp;&amp;lt;&amp;nbsp;float(32bit)&amp;nbsp;&amp;lt;&amp;nbsp;double(64bit) &lt;br /&gt;long(64bit)&amp;nbsp;&amp;lt;&amp;nbsp;float(32bit)&amp;nbsp;:&amp;nbsp;long이&amp;nbsp;64인데도&amp;nbsp;float가&amp;nbsp;더&amp;nbsp;쎄다(?)&amp;nbsp;왜? &lt;br /&gt;약한&amp;nbsp;타입에서&amp;nbsp;강한&amp;nbsp;타입으로는&amp;nbsp;자동&amp;nbsp;형변환이&amp;nbsp;가능하지만 &lt;br /&gt;강한&amp;nbsp;타입에서&amp;nbsp;약한&amp;nbsp;타입으로는&amp;nbsp;강제로만&amp;nbsp;형&amp;nbsp;변환이&amp;nbsp;가능하다&amp;nbsp;(c언어에서는&amp;nbsp;없다) &lt;br /&gt;&lt;br /&gt;100이&amp;nbsp;그대로&amp;nbsp;들어갈까?&amp;nbsp;아니면&amp;nbsp;변환시켜&amp;nbsp;들어갈까?&amp;nbsp;변환시켜&amp;nbsp;들어감.&amp;nbsp;double이&amp;nbsp;강타입으로&amp;nbsp;자동형변환 &lt;br /&gt;변수가&amp;nbsp;double이고&amp;nbsp;값이&amp;nbsp;int면?&amp;nbsp;변수가&amp;nbsp;원하는&amp;nbsp;형태에&amp;nbsp;맞게&amp;nbsp;형&amp;nbsp;변환을&amp;nbsp;하고&amp;nbsp;(100.0)으로&amp;nbsp;바꾸고&amp;nbsp;대입한다 &lt;br /&gt;&lt;br /&gt;3.14는&amp;nbsp;double형이다.&amp;nbsp;double에&amp;nbsp;int&amp;nbsp; &lt;br /&gt;약-&amp;gt;강타입&amp;nbsp;:&amp;nbsp;자동변환&amp;nbsp;o&amp;nbsp;ex)&amp;nbsp;double&amp;nbsp;b&amp;nbsp;=&amp;nbsp;100&amp;nbsp;;&amp;nbsp;//&amp;nbsp;100.0 &lt;br /&gt;강-&amp;gt;약타입&amp;nbsp;:&amp;nbsp;자동변환&amp;nbsp;x&amp;nbsp;ex)&amp;nbsp;int&amp;nbsp;a=&amp;nbsp;3.14;&amp;nbsp;error&amp;nbsp;//&amp;nbsp;int에&amp;nbsp;double&amp;nbsp;못&amp;nbsp;넣어.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test80.java&lt;/p&gt;
&lt;pre id=&quot;code_1748506519826&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class test80{
	public static void main(String[] args){
		String t = &quot;helloworld&quot;;
		System.out.println(t);
		System.out.println(t.length());
		System.out.println(t.substring(2,5));
		
	}
}

/*
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t는&amp;nbsp;포인터일까요?&amp;nbsp;String은&amp;nbsp;자료형&amp;nbsp;아니라&amp;nbsp;클래스이고,&amp;nbsp;t는&amp;nbsp;포인터 &lt;br /&gt;&lt;br /&gt;&quot;Helloworld&quot;는&amp;nbsp;랎?&amp;nbsp;인스턴스?&amp;nbsp;-&amp;gt;&amp;nbsp;인스턴스여야한다 &lt;br /&gt;&lt;br /&gt;String은&amp;nbsp;new를&amp;nbsp;이용하지&amp;nbsp;않고&amp;nbsp;인스턴스를&amp;nbsp;생성하는&amp;nbsp;유일한&amp;nbsp;클래스이다. &lt;br /&gt;&lt;br /&gt;length()는&amp;nbsp;문자열&amp;nbsp;길이를&amp;nbsp;리턴하는&amp;nbsp;String의&amp;nbsp;멤버함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;&lt;br /&gt;[교육 5일차]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/168</guid>
      <comments>https://aonee.tistory.com/168#entry168comment</comments>
      <pubDate>Mon, 26 May 2025 15:50:56 +0900</pubDate>
    </item>
    <item>
      <title>업무에 바로 쓰는 SQL 튜닝 : 데이터베이스 구조 및 옵티마이저 이해</title>
      <link>https://aonee.tistory.com/159</link>
      <description>&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 데이터베이스 처리 단계: Parse와 Bind&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ Parse 단계 (구문 분석 단계)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parse는 SQL 문을 처음 데이터베이스에 제출했을 때 실행 전에 반드시 거치는 &lt;b&gt;해석 및 검증&lt;/b&gt; 단계입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  주요 작업&lt;/h4&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;: 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;li&gt;&lt;b&gt;파싱 트리 생성&lt;/b&gt;: SQL 문장을 트리 형태로 분석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Shared Pool 검색&lt;/b&gt;: SGA의 Shared Pool에 같은 SQL이 이미 파싱되어 있는지 검사 (Soft Parse를 위해)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ Hard Parse vs Soft Parse&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Hard Parse&lt;/b&gt;: 처음 제출되는 SQL &amp;rarr; 모든 파싱 과정, 권한 검사, 실행 계획 생성 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Soft Parse&lt;/b&gt;: 이전에 파싱된 SQL이 Shared Pool에 존재 &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;✅ Bind 단계 (값 바인딩 단계)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bind는 SQL 문에 포함된 &lt;b&gt;변수나 리터럴 값들을 실제 값으로 바꾸는 과정&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM employees WHERE employee_id = :1;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;:1이 바인드 변수입니다.&lt;/li&gt;
&lt;li&gt;사용자는 :1에 100 같은 값을 전달하면, 이 시점에 SQL 문이 변수와 함께 실행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&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; Soft Parse 유도)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 최적화&lt;/b&gt;: Hard Parse 줄여 Shared Pool 효율성 증가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 강화&lt;/b&gt;: SQL Injection 위험 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. SGA와 Instance&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ SGA (System Global Area)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle DB에서 &lt;b&gt;인스턴스 메모리 영역&lt;/b&gt;을 의미&lt;/li&gt;
&lt;li&gt;서버 프로세스와 백그라운드 프로세스들이 공유&lt;/li&gt;
&lt;li&gt;데이터베이스 작동 시 반드시 메모리에 올라오는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 구성 요소&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 요소 설명&lt;/p&gt;
&lt;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;Shared Pool&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SQL 파싱 결과, 커서, 라이브러리 캐시 등 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Database Buffer Cache&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;디스크에서 읽어온 블록 저장 (읽기/쓰기 캐시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Redo Log Buffer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;변경 사항 기록 (장애 발생 시 복구용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Large Pool&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;백업, 복구, 병렬 처리 등에서 사용되는 대용량 메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Java Pool&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Java 기반 객체 저장&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;✅ Instance (인스턴스)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SGA + 백그라운드 프로세스&lt;/b&gt;의 조합&lt;/li&gt;
&lt;li&gt;하나의 DB 인스턴스는 한 번에 하나의 DB만 관리 가능 (단, RAC는 예외)&lt;/li&gt;
&lt;li&gt;인스턴스는 DB를 오픈하고 관리하는 역할을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 백그라운드 프로세스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 설명&lt;/p&gt;
&lt;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;DBWR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Dirty Buffer를 디스크에 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LGWR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Redo Log Buffer를 Redo Log File로 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SMON&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템 모니터링, 복구 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PMON&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프로세스 모니터링, 세션 정리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CKPT&lt;/b&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;h2 data-ke-size=&quot;size26&quot;&gt;3. 전체 흐름 요약: SQL 실행과정&lt;/h2&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SQL 문장 &amp;rarr; Parse &amp;rarr; Bind &amp;rarr; Execute &amp;rarr; Fetch
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Parse&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;실행계획 생성 (Hard Parse)&lt;/li&gt;
&lt;li&gt;Shared Pool 검색 (Soft Parse)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bind&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL 문에 변수값 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Execute&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 SQL 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fetch&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과 데이터 가져오기 (SELECT 문의 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  결론 및 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Parse&lt;/b&gt;는 SQL 문장을 해석하고 실행 계획을 생성하는 단계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bind&lt;/b&gt;는 변수에 실제 값을 넣어 SQL을 완성하는 단계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SGA&lt;/b&gt;는 인스턴스가 사용하는 공유 메모리 공간으로 SQL 처리에 필요한 캐시와 버퍼를 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Instance&lt;/b&gt;는 SGA와 백그라운드 프로세스의 집합으로 데이터베이스를 운영하는 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;262&quot; data-start=&quot;247&quot; data-ke-size=&quot;size26&quot;&gt;✅ 1. 옵티마이저란?&lt;/h2&gt;
&lt;p data-end=&quot;353&quot; data-start=&quot;264&quot; data-ke-size=&quot;size16&quot;&gt;옵티마이저(Optimizer)는 SQL 문을 &lt;b&gt;어떻게 실행할지 결정&lt;/b&gt;하는 데이터베이스 내부 엔진입니다. Oracle에는 크게 두 가지 옵티마이저가 있습니다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;옵티마이저 유형설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;563&quot; data-start=&quot;355&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;563&quot; data-start=&quot;401&quot;&gt;
&lt;tr data-end=&quot;490&quot; data-start=&quot;401&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;434&quot; data-start=&quot;401&quot;&gt;&lt;b&gt;Rule-Based Optimizer (RBO)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;490&quot; data-start=&quot;434&quot; data-col-size=&quot;md&quot;&gt;오래된 방식. 정해진 규칙에 따라 실행 계획 결정 (Oracle 10g부터 공식적으로 제거됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;563&quot; data-start=&quot;491&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;524&quot; data-start=&quot;491&quot;&gt;&lt;b&gt;Cost-Based Optimizer (CBO)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;563&quot; data-start=&quot;524&quot; data-col-size=&quot;md&quot;&gt;&lt;b&gt;현재 표준 방식&lt;/b&gt;. 실행 비용을 계산해서 최적의 계획 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;568&quot; data-start=&quot;565&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;610&quot; data-start=&quot;570&quot; data-ke-size=&quot;size26&quot;&gt;✅ 2. Cost-Based Optimizer(CBO)의 핵심 개념&lt;/h2&gt;
&lt;p data-end=&quot;676&quot; data-start=&quot;612&quot; data-ke-size=&quot;size16&quot;&gt;CBO는 다음 요소들을 종합해 &lt;b&gt;각 실행 계획의 비용을 추정&lt;/b&gt;하고, 가장 적은 비용을 가지는 계획을 선택합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;693&quot; data-start=&quot;678&quot; data-ke-size=&quot;size23&quot;&gt;  주요 입력 요소&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;요소설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;909&quot; data-start=&quot;695&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;909&quot; data-start=&quot;723&quot;&gt;
&lt;tr data-end=&quot;781&quot; data-start=&quot;723&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;748&quot; data-start=&quot;723&quot;&gt;&lt;b&gt;통계 정보 (Statistics)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;781&quot; data-start=&quot;748&quot;&gt;테이블, 인덱스, 컬럼, 데이터 분포, 카디널리티 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;823&quot; data-start=&quot;782&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;799&quot; data-start=&quot;782&quot;&gt;&lt;b&gt;시스템 리소스 정보&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;823&quot; data-start=&quot;799&quot; data-col-size=&quot;sm&quot;&gt;CPU 속도, 디스크 I/O 속도 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;862&quot; data-start=&quot;824&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;836&quot; data-start=&quot;824&quot;&gt;&lt;b&gt;쿼리 구조&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;862&quot; data-start=&quot;836&quot; data-col-size=&quot;sm&quot;&gt;조인 조건, WHERE 절, 서브쿼리 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;909&quot; data-start=&quot;863&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;880&quot; data-start=&quot;863&quot;&gt;&lt;b&gt;옵티마이저 파라미터&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;909&quot; data-start=&quot;880&quot; data-col-size=&quot;sm&quot;&gt;OPTIMIZER_MODE 등 초기화 파라미터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;914&quot; data-start=&quot;911&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;935&quot; data-start=&quot;916&quot; data-ke-size=&quot;size26&quot;&gt;✅ 3. 실행 계획 선택 과정&lt;/h2&gt;
&lt;p data-end=&quot;968&quot; data-start=&quot;937&quot; data-ke-size=&quot;size16&quot;&gt;CBO는 다음과 같은 절차를 통해 SQL을 최적화합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1180&quot; data-start=&quot;970&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1001&quot; data-start=&quot;970&quot;&gt;&lt;b&gt;SQL 문 분석 (Parse 단계에서 수행)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1102&quot; data-start=&quot;1002&quot;&gt;&lt;b&gt;가능한 실행 계획들 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1102&quot; data-start=&quot;1026&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1041&quot; data-start=&quot;1026&quot;&gt;테이블 Full Scan&lt;/li&gt;
&lt;li data-end=&quot;1057&quot; data-start=&quot;1045&quot;&gt;Index Scan&lt;/li&gt;
&lt;li data-end=&quot;1102&quot; data-start=&quot;1061&quot;&gt;Nested Loop Join, Hash Join 등 다양한 조인 전략&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1152&quot; data-start=&quot;1103&quot;&gt;&lt;b&gt;각 계획의 Cost 계산&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1152&quot; data-start=&quot;1127&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1152&quot; data-start=&quot;1127&quot;&gt;CPU, I/O, 메모리 자원 사용량 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1180&quot; data-start=&quot;1153&quot;&gt;&lt;b&gt;가장 낮은 Cost를 가진 계획 선택&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1185&quot; data-start=&quot;1182&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1209&quot; data-start=&quot;1187&quot; data-ke-size=&quot;size26&quot;&gt;✅ 4. 비용(Cost) 계산 방식&lt;/h2&gt;
&lt;p data-end=&quot;1269&quot; data-start=&quot;1211&quot; data-ke-size=&quot;size16&quot;&gt;Oracle의 비용은 실제 &quot;시간&quot;이 아니라 &lt;b&gt;상대적인 리소스 소비량을 나타내는 추상적 수치&lt;/b&gt;입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;text&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Cost = CPU Cost + I/O Cost + Network Cost (예: 병렬 처리 시) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1425&quot; data-start=&quot;1339&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 인덱스 스캔이 50, 테이블 Full Scan이 80이라면, CBO는 인덱스 스캔을 선택합니다. 단, 통계 정보가 정확해야 제대로 판단합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1430&quot; data-start=&quot;1427&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1450&quot; data-start=&quot;1432&quot; data-ke-size=&quot;size26&quot;&gt;✅ 5. 통계 정보의 중요성&lt;/h2&gt;
&lt;p data-end=&quot;1513&quot; data-start=&quot;1452&quot; data-ke-size=&quot;size16&quot;&gt;CBO는 정확한 결정을 위해 &lt;b&gt;DB 객체의 통계 정보&lt;/b&gt;를 사용합니다. 이 정보는 다음 명령어로 수집합니다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DBMS_STATS.GATHER_TABLE_STATS(&lt;/span&gt;&lt;span&gt;&lt;span&gt;'SCOTT'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;'EMP'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1592&quot; data-start=&quot;1579&quot; data-ke-size=&quot;size23&quot;&gt;통계 정보 예시:&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1675&quot; data-start=&quot;1593&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1603&quot; data-start=&quot;1593&quot;&gt;테이블의 행 수&lt;/li&gt;
&lt;li data-end=&quot;1617&quot; data-start=&quot;1604&quot;&gt;컬럼의 최대/최소 값&lt;/li&gt;
&lt;li data-end=&quot;1627&quot; data-start=&quot;1618&quot;&gt;NULL 비율&lt;/li&gt;
&lt;li data-end=&quot;1644&quot; data-start=&quot;1628&quot;&gt;데이터 분포 (히스토그램)&lt;/li&gt;
&lt;li data-end=&quot;1675&quot; data-start=&quot;1645&quot;&gt;인덱스 정보 (Clustering Factor 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1680&quot; data-start=&quot;1677&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1706&quot; data-start=&quot;1682&quot; data-ke-size=&quot;size26&quot;&gt;✅ 6. CBO의 실행 계획 확인 방법&lt;/h2&gt;
&lt;p data-end=&quot;1749&quot; data-start=&quot;1708&quot; data-ke-size=&quot;size16&quot;&gt;실제 Oracle에서 SQL 문장이 어떤 계획으로 실행될지를 보고 싶다면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;EXPLAIN PLAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;FOR&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; employees &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; department_id &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;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(DBMS_XPLAN.DISPLAY); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1874&quot; data-start=&quot;1872&quot; data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; V$SQL_PLAN &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; SQL_ID &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;span&gt;'xyz...'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1941&quot; data-start=&quot;1938&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1964&quot; data-start=&quot;1943&quot; data-ke-size=&quot;size26&quot;&gt;✅ 7. 옵티마이저 관련 파라미터&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;파라미터설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2166&quot; data-start=&quot;1966&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2166&quot; data-start=&quot;2000&quot;&gt;
&lt;tr data-end=&quot;2055&quot; data-start=&quot;2000&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2021&quot; data-start=&quot;2000&quot;&gt;&lt;b&gt;OPTIMIZER_MODE&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2055&quot; data-start=&quot;2021&quot;&gt;FIRST_ROWS, ALL_ROWS, CHOOSE 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2115&quot; data-start=&quot;2056&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2088&quot; data-start=&quot;2056&quot;&gt;&lt;b&gt;OPTIMIZER_FEATURES_ENABLE&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2115&quot; data-start=&quot;2088&quot; data-col-size=&quot;sm&quot;&gt;Oracle 버전에 따른 최적화 동작 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2166&quot; data-start=&quot;2116&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2147&quot; data-start=&quot;2116&quot;&gt;&lt;b&gt;OPTIMIZER_INDEX_COST_ADJ&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2166&quot; data-start=&quot;2147&quot; data-col-size=&quot;sm&quot;&gt;인덱스 사용 유도 정도 조절&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2171&quot; data-start=&quot;2168&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2186&quot; data-start=&quot;2173&quot; data-ke-size=&quot;size26&quot;&gt;✅ 8. 실전 예시&lt;/h2&gt;
&lt;h3 data-end=&quot;2194&quot; data-start=&quot;2188&quot; data-ke-size=&quot;size23&quot;&gt;예:&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;복사&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SELECT&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;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;span&gt; employees &lt;/span&gt;&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;span&gt; last_name &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;span&gt;'Smith'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2359&quot; data-start=&quot;2258&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2279&quot; data-start=&quot;2258&quot;&gt;테이블에 수백만 건의 데이터가 있고&lt;/li&gt;
&lt;li data-end=&quot;2308&quot; data-start=&quot;2280&quot;&gt;last_name 컬럼에 인덱스가 있을 경우&lt;/li&gt;
&lt;li data-end=&quot;2359&quot; data-start=&quot;2309&quot;&gt;&lt;b&gt;CBO는 인덱스를 사용할지, Full Scan을 할지&lt;/b&gt; 비용을 계산해서 결정합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2400&quot; data-start=&quot;2361&quot; data-ke-size=&quot;size16&quot;&gt;만약 통계 정보가 없다면, CBO는 부정확한 판단을 내릴 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2405&quot; data-start=&quot;2402&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2417&quot; data-start=&quot;2407&quot; data-ke-size=&quot;size26&quot;&gt;✅ 요약 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2663&quot; data-start=&quot;2419&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2663&quot; data-start=&quot;2447&quot;&gt;
&lt;tr data-end=&quot;2480&quot; data-start=&quot;2447&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2457&quot; data-start=&quot;2447&quot;&gt;&lt;b&gt;CBO&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2480&quot; data-start=&quot;2457&quot;&gt;비용 기반의 실행 계획 선택 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2524&quot; data-start=&quot;2481&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2493&quot; data-start=&quot;2481&quot;&gt;&lt;b&gt;기반 정보&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2524&quot; data-start=&quot;2493&quot; data-col-size=&quot;sm&quot;&gt;테이블/인덱스 통계, 시스템 리소스, SQL 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2570&quot; data-start=&quot;2525&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2534&quot; data-start=&quot;2525&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2570&quot; data-start=&quot;2534&quot;&gt;최소 비용(Max Performance)의 실행 계획 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2609&quot; data-start=&quot;2571&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2583&quot; data-start=&quot;2571&quot;&gt;&lt;b&gt;필수 조건&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;2609&quot; data-start=&quot;2583&quot; data-col-size=&quot;sm&quot;&gt;정확한 통계 수집 (DBMS_STATS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2663&quot; data-start=&quot;2610&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2622&quot; data-start=&quot;2610&quot;&gt;&lt;b&gt;확인 방법&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2663&quot; data-start=&quot;2622&quot;&gt;EXPLAIN PLAN, V$SQL_PLAN, AUTOTRACE 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/159</guid>
      <comments>https://aonee.tistory.com/159#entry159comment</comments>
      <pubDate>Mon, 12 May 2025 14:31:22 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] sqlloader 대량의 데이터 DB에 로드 유틸리티</title>
      <link>https://aonee.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; SQLLoader ?&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량의 데이터를 Oracle 데이터베이스 테이블에 효율적으로 로드하는 데 사용되는 유틸리티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 외부 데이터 파일 (예: CSV, 텍스트 파일 등)에 저장된 데이터를 Oracle 데이터베이스 테이블에 삽입할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sqlldr username/password@dbname control=control_file.log&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;username/password@dbname: Oracle 데이터베이스에 접속할 사용자 이름과 비밀번호 및 데이터베이스의 접속 정보.&lt;/li&gt;
&lt;li&gt;control: 로딩 작업을 정의하는 제어 파일의 경로 (Control file).&lt;/li&gt;
&lt;li&gt;log: SQL*Loader가 작업 중 생성한 로그 파일.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Control File (제어 파일)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL*Loader의 핵심 파일로, 외부 파일에서 데이터를 어떻게 로드할지에 대한 규칙을 정의합니다. 제어 파일에는 다음과 같은 정보를 포함합니다:&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;/li&gt;
&lt;li&gt;로드할 데이터의 조건.&lt;/li&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734674229933&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LOAD DATA
INFILE 'data.csv'
INTO TABLE employees
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '&quot;'
(
    employee_id, 
    first_name, 
    last_name, 
    email,
    hire_date DATE &quot;YYYY-MM-DD&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LOAD DATA: SQL*Loader가 데이터를 로드하도록 지시하는 구문.&lt;/li&gt;
&lt;li&gt;INFILE 'data.csv': 로드할 데이터가 저장된 외부 파일 경로.&lt;/li&gt;
&lt;li&gt;INTO TABLE employees: 로드할 데이터를 삽입할 대상 테이블.&lt;/li&gt;
&lt;li&gt;FIELDS TERMINATED BY ',': 각 필드가 쉼표로 구분된다는 것을 나타냅니다 (CSV 형식).&lt;/li&gt;
&lt;li&gt;OPTIONALLY ENCLOSED BY '&quot;': 필드 값이 따옴표로 둘러싸일 수 있음을 지정합니다.&lt;/li&gt;
&lt;li&gt;DATE &quot;YYYY-MM-DD&quot;: 날짜 형식을 정의하는 예시.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;control file 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;INFILE: 로드할 데이터 파일의 경로를 지정합니다.&lt;/li&gt;
&lt;li&gt;INTO TABLE: 데이터를 삽입할 대상 테이블을 지정합니다.&lt;/li&gt;
&lt;li&gt;FIELDS TERMINATED BY: 데이터 필드를 구분하는 구분자를 지정합니다. 예를 들어, 쉼표 , 또는 탭 \t.&lt;/li&gt;
&lt;li&gt;OPTIONALLY ENCLOSED BY: 값이 따옴표나 다른 문자로 둘러싸여 있는 경우 해당 문자를 지정합니다.&lt;/li&gt;
&lt;li&gt;DATE: 날짜 형식을 지정할 때 사용합니다.&lt;/li&gt;
&lt;li&gt;TRAILING NULLCOLS: 데이터 파일에 누락된 컬럼에 대해 NULL 값을 삽입하도록 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQLLoader 실행 예시&lt;/p&gt;
&lt;pre id=&quot;code_1734674417908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sqlldr username/password@dbname control=control_file.ctl 
log=load_log.log 
bad=bad_file.bad 
discard=discard_file.dsc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bad=bad_file.bad: 잘못된 데이터가 있으면 해당 레코드를 기록할 파일을 지정합니다.&lt;br /&gt;ex) insert 수행 시, 데이터 타입 안맞아서 error난 경우&lt;/li&gt;
&lt;li&gt;discard=discard_file.dsc: 조건에 맞지 않는 레코드를 기록할 파일을 지정합니다.&lt;br /&gt;ex) when id &amp;lt; 100 , 해당 조건에 맞지 않는 레코드 기록&lt;/li&gt;
&lt;li&gt;direct=true: 데이터를 직접 로드하여 성능을 최적화합니다 (배치 처리 모드).&lt;/li&gt;
&lt;li&gt;rows=1000: 한 번에 로드할 데이터의 최대 행 수를 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Bad</category>
      <category>controlfile</category>
      <category>Discard</category>
      <category>log</category>
      <category>Oracle</category>
      <category>sqlloader</category>
      <category>사용법</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/158</guid>
      <comments>https://aonee.tistory.com/158#entry158comment</comments>
      <pubDate>Fri, 20 Dec 2024 15:01:54 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] manage undo data</title>
      <link>https://aonee.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;undo data 란?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜잭션 처리의 일관성 유지&lt;br /&gt;트랜잭션이 수행된 변경 내용을 저장하고, 트랜잭션이 롤백될 때 해당 변경 사항을 되돌리는 데 사용됨&lt;/li&gt;
&lt;li&gt;롤백 및 복구 작업&lt;br /&gt;시스템 크래시나 장애 발생 시, Oracle은 Undo 데이터를 사용하여 트랜잭션을 복구함&lt;br /&gt;장애 발생 후 시스템을 재시작하면 Oracle은 Undo 데이터를 이용하여 일관성을 회복함&lt;/li&gt;
&lt;li&gt;읽기 일관성을 보장&lt;br /&gt;다중 트랜잭션이 동시에 실행될 때, 각 트랜잭션에 대해 일관성 있는 데이터를 제공하기 위해 Undo 데이터를 사용함 이를 통해, 하나의 트랜잭션이 데이터를 수정하는 동안 다른 트랜잭션은 수정 전 데이터를 조회할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Undo Tablespace&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Undo 데이터는 Undo Tablespace라는 특별한 테이블스페이스에 저장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 테이블스페이스는 데이터베이스의 물리적 공간으로, Oracle이 트랜잭션의 변경을 추적하고 롤백을 수행하는 데 필요한 공간을 제함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Undo Tablespace 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt;SPACE undotbs DATAFILE &lt;span&gt;'/path_to_file/undotbs01.dbf'&lt;/span&gt; SIZE &lt;span&gt;1&lt;/span&gt;G;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Undo Tablespace 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ALTER&lt;/span&gt; DATABASE DATAFILE &lt;span&gt;'/path_to_file/undotbs01.dbf'&lt;/span&gt; RESIZE &lt;span&gt;2&lt;/span&gt;G;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Undo Tablespace 상태 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SELECT&lt;/span&gt; tablespace_name, file_id, file_name, bytes, blocks&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;FROM&lt;/span&gt; dba_data_files&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WHERE&lt;/span&gt; tablespace_name &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'UNDOTBS'&lt;/span&gt;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Undo 데이터 크기 설정&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UNDO_RETENTION 값은 최소한의 Undo 데이터를 보유하는 시간 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ALTER&lt;/span&gt; &lt;span&gt;SYSTEM&lt;/span&gt; &lt;span&gt;SET&lt;/span&gt; undo_retention &lt;span&gt;=&lt;/span&gt; &lt;span&gt;3600&lt;/span&gt;; &lt;span&gt;-- 1시간 동안 Undo 데이터 유지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;undo_retention = 30sec&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;600/600sec&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1/sec&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;required_undo_size(900)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;등등 설정 가능&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Undo 사용과 최적화 &lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동커밋&lt;br /&gt;자동 커밋(autocommit) 모드에서 트랜잭션이 빠르게 종료되므로 Undo 데이터가 빠르게 회수됨&lt;br /&gt;하지만, 큰 트랜잭션을 처리할 때는 Undo 테이블스페이스가 빠르게 가득 찰 수 있음&lt;br /&gt;큰 트랜잭션이 많이 발생하는 환경에서는 Undo 테이블스페이스의 크기를 적절히 늘려야 함&lt;/li&gt;
&lt;li&gt;대용량 데이터 처리&lt;br /&gt;대량의 데이터를 처리할 때 Undo 공간이 부족하면 성능 저하나 트랜잭션 롤백 실패가 발생할 수 있음&lt;br /&gt;이럴 때는 UNDO_RETENTION 값을 늘리거나, 대량 데이터 삽입 작업 중에는 적절한 커밋 주기를 설정하여 Undo 공간을 효율적으로 사용해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>manage undo data</category>
      <category>Oracle</category>
      <category>undo data</category>
      <category>undo tablespace</category>
      <category>undo 데이터 크기 설정</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/157</guid>
      <comments>https://aonee.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 19 Dec 2024 16:47:12 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] Table Compression</title>
      <link>https://aonee.tistory.com/156</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt; Table Compression&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFIMbG/btsLpPYKc7M/SyV6OSwuvvMrKqL2CMa4g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFIMbG/btsLpPYKc7M/SyV6OSwuvvMrKqL2CMa4g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFIMbG/btsLpPYKc7M/SyV6OSwuvvMrKqL2CMa4g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFIMbG%2FbtsLpPYKc7M%2FSyV6OSwuvvMrKqL2CMa4g0%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;876&quot; height=&quot;440&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;header 블럭 여러번 반복되는 문제 해결&lt;br /&gt;compressed block header로 symbol table 두고 사용하면&lt;br /&gt;공간낭비 줄이고 사용가능&lt;/p&gt;
&lt;/blockquote&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;579&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sKfHP/btsLpimPJs7/erqEdOi5UMmuAxXKbsxwvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sKfHP/btsLpimPJs7/erqEdOi5UMmuAxXKbsxwvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sKfHP/btsLpimPJs7/erqEdOi5UMmuAxXKbsxwvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsKfHP%2FbtsLpimPJs7%2FerqEdOi5UMmuAxXKbsxwvk%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;579&quot; height=&quot;198&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;basic : pctfree = 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 할 때 압축 풀고 다시 selecting하냐? no 압축해제 안일어남&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;read only 목적으로 사용.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;255 columns 넘어가면 압축테이블 사용하지마 제약 있음 (11g기준)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734585053731&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DBMS_COMPRESSION.GET_COMPRESSION_RATIO 
( 
scratchtbsname =&amp;gt; 'USERS', 
ownname =&amp;gt; 'HR', 
objname =&amp;gt; 'I_TEST', 
subobjname =&amp;gt; NULL, 
comptype =&amp;gt; dbms_compression.COMP_INDEX_ADVANCED_LOW, 
blkcnt_cmp =&amp;gt; blkcnt_cmp, 
blkcnt_uncmp =&amp;gt; blkcnt_uncmp, 
row_cmp =&amp;gt; row_cmp, 
row_uncmp =&amp;gt; row_uncmp, 
cmp_ratio =&amp;gt; cmp_ratio, 
   For Instructor Use Only.
  This document should not be distributed.
Copyright &amp;copy; 2022, Oracle and/or its affiliates. 
176 Practices for Lesson 15: Improving Space Usage 
comptype_str =&amp;gt; comptype_str, 
subset_numrows =&amp;gt; dbms_compression.COMP_RATIO_MINROWS, 
objtype =&amp;gt; dbms_compression.OBJTYPE_INDEX 
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;index 압축 종류 2종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;low&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYqc98/btsLpgP8zOS/hxdNeaqAws4qWpejQRori1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYqc98/btsLpgP8zOS/hxdNeaqAws4qWpejQRori1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYqc98/btsLpgP8zOS/hxdNeaqAws4qWpejQRori1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYqc98%2FbtsLpgP8zOS%2FhxdNeaqAws4qWpejQRori1%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;351&quot; height=&quot;74&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;high&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M6lV5/btsLplw97z3/hPiALyuMgKeunWfOY7les1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M6lV5/btsLplw97z3/hPiALyuMgKeunWfOY7les1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M6lV5/btsLplw97z3/hPiALyuMgKeunWfOY7les1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM6lV5%2FbtsLplw97z3%2FhPiALyuMgKeunWfOY7les1%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;370&quot; height=&quot;78&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;78&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;이럴경우, index압축률이 더 좋은 high 압축 사용하는 것이 더 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Resolving Space Usage Issues&lt;/span&gt;&lt;/blockquote&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;665&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSI00/btsLnIUHaMU/xpXwliQKxElm2yWNjWxnXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSI00/btsLnIUHaMU/xpXwliQKxElm2yWNjWxnXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSI00/btsLnIUHaMU/xpXwliQKxElm2yWNjWxnXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSI00%2FbtsLnIUHaMU%2FxpXwliQKxElm2yWNjWxnXk%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;665&quot; height=&quot;196&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dba_outstanding_alerts 로 tablespace 확인 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Shrinking Segments&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle 데이터베이스에서 &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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트 축소를 통해 세그먼트 내의 &lt;b&gt;불필요한 공간을 재사용 가능하게 만들고, 스토리지 효율성을 높이며, 성능을 개선&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;* 세그먼트 축소 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 테이블 축소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ALTER&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt;테이블명&lt;span&gt;&amp;gt;&lt;/span&gt; SHRINK SPACE;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 인덱스 축소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ALTER&lt;/span&gt; INDEX &lt;span&gt;&amp;lt;&lt;/span&gt;인덱스명&lt;span&gt;&amp;gt;&lt;/span&gt; SHRINK SPACE;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 장점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;: 축소된 세그먼트는 더 적은 디스크 공간을 차지하며, 데이터 액세스 성능을 향상시킬 수 있습니다. 데이터베이스가 더 적은 공간을 검색하므로 I/O 효율성이 높아질 수 있다 .&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 단점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;: 축소 작업은 CPU와 I/O 자원을 많이 소모할 수 있습니다. 특히 큰 테이블이나 인덱스를 축소할 때 시간이 많이 걸릴 수 있다&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 고려사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&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;자동화된 공간 관리 (ASSM)&lt;/b&gt;: Oracle에서는 &lt;b&gt;ASSM (Automatic Segment Space Management)&lt;/b&gt; 방식이 활성화된 경우, 세그먼트 공간 관리를 자동으로 처리하지만, 여전히 세그먼트 축소는 DBA가 수동으로 수행할 수 있는 작업이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle</category>
      <category>shrinking segments</category>
      <category>table advisor</category>
      <category>table compression</category>
      <category>세그먼트축소</category>
      <category>장단점</category>
      <category>테이블앏축</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/156</guid>
      <comments>https://aonee.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 19 Dec 2024 15:55:56 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] Database Storage, logical DB (Tablespace, Segment, Extent, Data Block )</title>
      <link>https://aonee.tistory.com/155</link>
      <description>&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style1&quot;&gt;logical DB VS pysical DB&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; 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;442&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uKvmG/btsLn8YFmLQ/NvKK41IereHx5ye5N414RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uKvmG/btsLn8YFmLQ/NvKK41IereHx5ye5N414RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uKvmG/btsLn8YFmLQ/NvKK41IereHx5ye5N414RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuKvmG%2FbtsLn8YFmLQ%2FNvKK41IereHx5ye5N414RK%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;442&quot; height=&quot;365&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리적 데이터베이스에 대해 자세히 살펴보려함&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Tablespace&lt;/b&gt;는 데이터베이스의 논리적 저장 공간을 관리하며, 여러 테이블이나 인덱스가 저장.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Segment&lt;/b&gt;는 데이터를 저장하는 집합적인 단위로, 테이블, 인덱스 등의 객체는 세그먼트 형태로 저장됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Extent&lt;/b&gt;는 세그먼트 내에서 데이터를 &lt;b&gt;연속적인 블록 단위&lt;/b&gt;로 할당하는 단위이며, 물리적 저장을 효율적으로 관리함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Data Block&lt;/b&gt;은 실제 데이터가 저장되는 &lt;b&gt;가장 작은 물리적 저장 단위&lt;/b&gt;로, Oracle 데이터베이스가 데이터를 읽고 쓸 때의 기본 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Tablespace, Segment, Extent, Data Block 관계&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;Tablespace&lt;/b&gt;는 데이터베이스에서 데이터를 논리적으로 관리하는 &lt;b&gt;가장 큰 단위임&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Segment&lt;/b&gt;는 테이블, 인덱스 등의 데이터를 저장하는 &lt;b&gt;논리적 데이터 집합&lt;/b&gt;이며, 각 세그먼트는 하나 이상의 &lt;b&gt;Extent&lt;/b&gt;로 구성됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Extent&lt;/b&gt;는 여러 개의 &lt;b&gt;Data Block&lt;/b&gt;이 연속적으로 배치된 집합이며, &lt;b&gt;Data Block&lt;/b&gt;은 Oracle에서 데이터를 실제로 저장하는 &lt;b&gt;가장 작은 단위임&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 흐름&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;테이블을 생성&lt;/b&gt;하면 &lt;b&gt;Segment&lt;/b&gt;가 생성됨&lt;/li&gt;
&lt;li&gt;테이블에 데이터가 추가되면, 필요한 만큼 &lt;b&gt;Extent&lt;/b&gt;가 할당됨&lt;/li&gt;
&lt;li&gt;각 Extent는 &lt;b&gt;연속된 Data Block&lt;/b&gt;으로 이루어져 있음&lt;/li&gt;
&lt;li&gt;데이터가 &lt;b&gt;Data Block&lt;/b&gt;에 저장되며, &lt;b&gt;Data Block&lt;/b&gt;은 물리적 디스크에 실제로 존재함&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 구성요소에 대해 더 자세히 살펴보면 다음과 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;Tablespace&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tablespace&lt;/b&gt;는 Oracle 데이터베이스에서 데이터를 논리적으로 관리하기 위한 가장 큰 저장 단위입니다. 데이터베이스 객체(예: 테이블, 인덱스, 클러스터 등)는 특정 테이블스페이스에 저장됩니다. 테이블스페이스는 &lt;b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;논리적 저장 단위&lt;/b&gt;: 테이블스페이스는 데이터베이스의 논리적인 저장 영역을 정의하며, 여러 개의 테이블스페이스가 데이터베이스 내에서 서로 독립적으로 존재할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;물리적 파일에 맵핑&lt;/b&gt;: 각 테이블스페이스는 하나 이상의 &lt;b&gt;물리적 파일&lt;/b&gt;(데이터 파일)과 연결됩니다. 이 데이터 파일은 실제 데이터가 저장되는 디스크 공간을 나타냅니다.&lt;/li&gt;
&lt;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;SYSTEM 테이블스페이스&lt;/b&gt;: 시스템과 관련된 중요한 데이터(예: 데이터 딕셔너리, 시스템 테이블 등)가 저장됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;USERS 테이블스페이스&lt;/b&gt;: 일반적인 사용자 데이터가 저장됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TEMP 테이블스페이스&lt;/b&gt;: 정렬 작업이나 임시 데이터를 저장하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UNDO 테이블스페이스&lt;/b&gt;: 트랜잭션 롤백 및 복구에 필요한 정보를 저장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예비 테이블스페이스 (Undo, Temp)&lt;/b&gt;: 임시 저장 공간으로 사용되며, 주로 시스템 성능을 최적화하기 위해 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;코드 복사&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;-- 새로운 테이블스페이스 생성&lt;/span&gt; &lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt;SPACE my_tablespace DATAFILE &lt;span&gt;'/u01/app/oracle/oradata/mydb/myfile.dbf'&lt;/span&gt; SIZE &lt;span&gt;100&lt;/span&gt;M;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 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-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;2. &lt;b&gt;Segment&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Segment&lt;/b&gt;는 테이블스페이스 내에 저장된 &lt;b&gt;데이터의 집합&lt;/b&gt;을 의미합니다. Oracle 데이터베이스에서 모든 데이터 객체(테이블, 인덱스, 클러스터 등)는 &lt;b&gt;세그먼트&lt;/b&gt; 형태로 저장됩니다. 예를 들어, 하나의 테이블은 &lt;b&gt;하나의 세그먼트&lt;/b&gt;를 차지하며, 하나의 세그먼트는 여러 개의 &lt;b&gt;extent&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 저장 단위&lt;/b&gt;: 세그먼트는 데이터베이스에서 &lt;b&gt;테이블, 인덱스, 롤백 세그먼트&lt;/b&gt;와 같은 저장 구조의 데이터를 포함하는 논리적 저장 단위입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세그먼트 유형&lt;/b&gt;: 세그먼트의 종류에 따라 저장되는 데이터 유형이 달라집니다.
&lt;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;/li&gt;
&lt;li&gt;세그먼트는 물리적으로 &lt;b&gt;extent&lt;/b&gt;를 여러 개 가질 수 있으며, 데이터가 추가될 때 세그먼트의 크기는 &lt;b&gt;Extent&lt;/b&gt; 단위로 증가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MY_TABLE이라는 테이블은 &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;3. &lt;b&gt;Extent&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Extent&lt;/b&gt;는 &lt;b&gt;세그먼트&lt;/b&gt; 내에서 데이터를 저장하는 &lt;b&gt;연속된 블록 집합&lt;/b&gt;입니다. 즉, Extent는 하나의 세그먼트에서 할당된 여러 개의 &lt;b&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;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;: 하나의 extent는 여러 개의 연속적인 데이터 블록으로 구성됩니다. 이 블록들은 물리적 메모리 공간에서 연속적으로 배치됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;크기&lt;/b&gt;: Extent의 크기는 테이블스페이스에서 데이터를 관리하는 방식에 따라 다를 수 있습니다. 일반적으로 기본적으로 5MB나 10MB 정도로 설정될 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 확장&lt;/b&gt;: 데이터가 세그먼트에 추가되면, 해당 세그먼트에 새로운 Extent가 할당됩니다. 이는 자동으로 이루어지며, 세그먼트가 확장될 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 한 테이블에 데이터가 추가되어 &lt;b&gt;세그먼트&lt;/b&gt;가 부족하게 되면, 새로운 &lt;b&gt;Extent&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;4. &lt;b&gt;Data Block&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data Block&lt;/b&gt;(또는 &lt;b&gt;데이터 블록&lt;/b&gt;)은 Oracle 데이터베이스에서 &lt;b&gt;가장 작은 저장 단위&lt;/b&gt;입니다. 데이터 블록은 실제로 &lt;b&gt;디스크에 저장되는 데이터&lt;/b&gt;를 포함하는 최소 단위이며, Oracle이 데이터를 읽고 쓰는 기본적인 단위입니다. 데이터베이스는 데이터를 읽고 쓸 때 항상 데이터 블록 단위로 작업합니다.&lt;/p&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;물리적 저장 단위&lt;/b&gt;: 데이터 블록은 데이터베이스의 물리적 저장소에서 실제 데이터를 저장하는 기본 단위입니다. 즉, 테이블에 저장된 데이터, 인덱스, 기타 데이터는 모두 데이터 블록에 저장됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;블록 크기&lt;/b&gt;: 데이터 블록의 크기는 데이터베이스의 &lt;b&gt;블록 크기&lt;/b&gt;(예: 8KB, 16KB 등)에 의해 결정됩니다. 이 크기는 데이터베이스 생성 시 설정되며, 변경할 수 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;논리적 및 물리적 연관&lt;/b&gt;: 데이터 블록은 논리적으로 데이터를 &lt;b&gt;저장&lt;/b&gt;하는 단위일 뿐만 아니라, 물리적으로 데이터를 디스크에 &lt;b&gt;배치&lt;/b&gt;하는 단위이기도 합니다.&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;헤더(Header)&lt;/b&gt;: 블록의 메타데이터(예: 블록이 사용 중인지, 비어 있는지 여부 등).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행 데이터(Row Data)&lt;/b&gt;: 실제 저장된 테이블의 행 데이터.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프리 데이터(Free Space)&lt;/b&gt;: 현재 사용되지 않는 공간으로, 데이터가 삽입될 때 새로운 데이터가 추가됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;체인(Chain)&lt;/b&gt;: 여러 블록이 연결되어 있을 수 있으며, 한 블록이 꽉 찼을 때 다음 블록으로 체인처럼 연결될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스가 데이터를 &lt;b&gt;8KB&lt;/b&gt; 블록 크기로 구성하고 있다면, 각 데이터는 &lt;b&gt;8KB&lt;/b&gt; 단위로 디스크에 저장됩니다. 예를 들어, users 테이블에 데이터가 저장될 때, 각 레코드는 &lt;b&gt;8KB&lt;/b&gt;의 데이터 블록에 기록됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;효율적인 데이터 읽기/쓰기&lt;/b&gt;: 데이터베이스는 데이터를 블록 단위로 읽고 쓰기 때문에, 물리적인 &lt;b&gt;디스크 I/O&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;smallfile TS : 여러 datafile 가질 수 있음 - 4백만개 block&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;bigfile TS : 매우 큰 datafile 딱 1개만 가질 수 있음 - 1 datafile 40억개 block&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;32K * 40억개 = 32T&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;db_block_size = 2 4 8 16 32K&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;extent allocate&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;1. create table X&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;669&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNKGUF/btsLn6NlX5i/gxa2o1FRAukL8VHXYlSNS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNKGUF/btsLn6NlX5i/gxa2o1FRAukL8VHXYlSNS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNKGUF/btsLn6NlX5i/gxa2o1FRAukL8VHXYlSNS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNKGUF%2FbtsLn6NlX5i%2Fgxa2o1FRAukL8VHXYlSNS0%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;669&quot; height=&quot;183&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;테이블 생성은 extent 생성 안됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;공간이 아직 없어서 segment가 아직 아님&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;그러면 언제 할당되냐? 첫 row insert시 자동 extent 생성됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;DEFERRED_SEGMENT_CREATION=TRUE 설정해두면 됨.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. dynamic allocation&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3. 직접 할당&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;alter table test allocate extent;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;수행시마다 extent 할당&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;extent deallocate&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. drop table test 반납함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;delete X 반납안함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;truncate table test; 반납함. 테이블에 있는 영역 다 지워라&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. alter table test deallocate unused;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;high water mark&lt;span&gt; 위쪽 반납&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;첫번재 extent는 header부분&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;high water mark 물자국&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Creating and Managing Tablespaces &lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 테이블스페이스는 특정 용도에 맞게 설계되며, 이에 따라 Permanent, Undo, Temporary 등 세 가지 주요 테이블스페이스 유형이 있음&lt;/li&gt;
&lt;li&gt;&amp;nbsp;각각의 테이블스페이스는 Oracle 데이터베이스의 성능과 유지보수에 중요한 역할을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;Permanent Tablespace&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Permanent 테이블스페이스&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;/p&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;영구적인 데이터 저장&lt;/b&gt;: Permanent 테이블스페이스는 사용자가 생성한 테이블, 인덱스, 뷰 등 &lt;b&gt;영구적인 데이터&lt;/b&gt;를 저장하는 데 사용됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 파일&lt;/b&gt;: Permanent 테이블스페이스는 하나 이상의 &lt;b&gt;데이터 파일&lt;/b&gt;로 구성되며, 이 데이터 파일은 디스크에 실제 데이터를 저장함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본 테이블스페이스&lt;/b&gt;: USERS 테이블스페이스가 이 범주에 속합니다. Oracle 설치 시 기본적으로 제공되는 테이블스페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;생성 예시&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;-- Permanent 테이블스페이스 생성&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1734508232005&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLESPACE my_permanent_tablespace DATAFILE '/u01/app/oracle/oradata/mydb/my_permanent.dbf' 
SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DATAFILE&lt;/b&gt;: 테이블스페이스의 물리적 저장 위치를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SIZE&lt;/b&gt;: 테이블스페이스의 초기 크기를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AUTOEXTEND&lt;/b&gt;: 테이블스페이스의 크기가 자동으로 확장되도록 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MAXSIZE&lt;/b&gt;: 데이터 파일의 최대 크기를 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;Undo Tablespace&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Undo 테이블스페이스&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-ke-size=&quot;size16&quot;&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;&lt;b&gt;특징&lt;/b&gt;&lt;/h4&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;: Undo 테이블스페이스는 트랜잭션이 실행되는 동안 발생하는 데이터 변경을 취소(롤백)하거나, 롤백된 데이터 상태를 복원할 때 사용됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rollback&lt;/b&gt;: 트랜잭션이 완료되기 전에 변경된 데이터를 &lt;b&gt;되돌리기 위해 사용 됨 &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 관리&lt;/b&gt;: 데이터베이스는 &lt;b&gt;자동으로&lt;/b&gt; Undo 테이블스페이스를 관리하며, 이를 통해 &lt;b&gt;데이터 무결성&lt;/b&gt;을 보장 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본 Undo 테이블스페이스&lt;/b&gt;: Oracle에서 기본적으로 **UNDO**라는 이름의 테이블스페이스가 제공되며, 이를 통해 트랜잭션 복구 작업을 수행 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;생성 예시&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;-- Undo 테이블스페이스 생성&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1734508199037&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLESPACE undotbs1 DATAFILE '/u01/app/oracle/oradata/mydb/undotbs01.dbf' 
SIZE 200M AUTOEXTEND ON NEXT 20M MAXSIZE 2G;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DATAFILE&lt;/b&gt;: Undo 테이블스페이스의 물리적 위치를 지정 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SIZE&lt;/b&gt;: 초기 크기를 지정 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AUTOEXTEND&lt;/b&gt;: 데이터 파일 크기가 자동으로 확장될 수 있도록 설정 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MAXSIZE&lt;/b&gt;: Undo 파일의 최대 크기를 제한함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Undo 테이블스페이스는 롤백을 위해 필요하므로 &lt;b&gt;트랜잭션 처리 중&lt;/b&gt;에 Undo 정보를 저장하고, 트랜잭션이 완료되면 해당 데이터는 삭제됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;Temporary Tablespace&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Temporary 테이블스페이스&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;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;임시 데이터 저장&lt;/b&gt;: Temporary 테이블스페이스는 데이터베이스가 &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;/li&gt;
&lt;li&gt;&lt;b&gt;자동 관리&lt;/b&gt;: Temporary 테이블스페이스는 데이터가 &lt;b&gt;한 번 사용되면 삭제&lt;/b&gt;되기 때문에 &lt;b&gt;자동으로 관리 됨 &lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복구 불필요&lt;/b&gt;: Temporary 테이블스페이스는 임시 데이터만 저장하기 때문에 시스템이 &lt;b&gt;크래시&lt;/b&gt;나 &lt;b&gt;오류&lt;/b&gt;가 발생하더라도 복구할 필요가 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;생성 예시&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;-- Temporary 테이블스페이스 생성&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1734508181429&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TEMPORARY TABLESPACE temp_ts TEMPFILE '/u01/app/oracle/oradata/mydb/temp01.dbf' 
SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 1G;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TEMPFILE&lt;/b&gt;: Temporary 테이블스페이스는 &lt;b&gt;TEMPFILE&lt;/b&gt;을 사용하여 데이터를 저장합니다. TEMPFILE은 데이터 파일과 달리 복구 대상이 아니므로 &lt;b&gt;로그를 기록하지 않음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SIZE&lt;/b&gt;: 초기 크기를 지정 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AUTOEXTEND&lt;/b&gt;: 필요할 때 &lt;b&gt;자동 확장&lt;/b&gt;을 설정하여 공간이 부족할 경우 자동으로 확장 됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MAXSIZE&lt;/b&gt;: 확장 가능한 최대 크기를 설정 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡한 쿼리에서 &lt;b&gt;정렬 작업&lt;/b&gt;, &lt;b&gt;조인 작업&lt;/b&gt; 등을 할 때 임시 테이블스페이스에 임시 데이터가 저장 됨&lt;/li&gt;
&lt;li&gt;예를 들어, ORDER BY, DISTINCT 등의 작업이 수행될 때 해당 데이터는 Temporary 테이블스페이스에 저장됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;세 가지 테이블스페이스의 차이점&lt;/b&gt;&lt;/h3&gt;
&lt;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;Permanent Tablespace&lt;/td&gt;
&lt;td&gt;Undo Tablespace&lt;/td&gt;
&lt;td&gt;Temporary Tablespace&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;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;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;b&gt;DATAFILE&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;DATAFILE&lt;/b&gt; (Undo 정보 저장)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;TEMPFILE&lt;/b&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;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;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;CREATE TABLESPACE permanent_ts DATAFILE '/path/to/file' SIZE 100M;&lt;/td&gt;
&lt;td&gt;CREATE TABLESPACE undotbs1 DATAFILE '/path/to/undo.dbf' SIZE 200M;&lt;/td&gt;
&lt;td&gt;CREATE TEMPORARY TABLESPACE temp_ts TEMPFILE '/path/to/temp01.dbf' SIZE 100M;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정리리&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Permanent Tablespace&lt;/b&gt;는 데이터베이스의 주요 데이터를 영구적으로 저장하는 데 사용됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Undo Tablespace&lt;/b&gt;는 트랜잭션 롤백 및 복구에 필요한 중간 데이터를 저장하며, 데이터베이스의 무결성을 유지함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Temporary Tablespace&lt;/b&gt;는 임시 데이터 작업을 지원하는 데 사용되며, 일반적으로 쿼리 실행 중 발생하는 임시 작업에 대한 데이터를 저장함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 테이블스페이스는 특정 작업이나 기능을 지원하는데 필수적인 역할을 하며, 성능과 효율적인 데이터 관리를 위해 적절하게 구성하고 관리해야함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Segment Space Management &lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Manual Segment Space Management&lt;/b&gt; (수동 세그먼트 공간 관리)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Oracle 데이터베이스에서 세그먼트(예: 테이블, 인덱스, 클러스터 등)에 대한 공간을 수동으로 관리하는 방법&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동 세그먼트 공간 관리&lt;/b&gt;(Automatic Segment Space Management, ASSM)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Oracle은 기본적으로 &lt;/span&gt;지원함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 직접 세그먼트의 공간을 관리할 수 있도록 하는 옵션이 &lt;b&gt;Manual Segment Space Management&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Manual Segment Space Management&lt;/b&gt;는 테이블이나 인덱스 세그먼트의 공간을 수동으로 관리하는 방식임&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;Freelist&lt;/b&gt;를 사용하여 빈 공간을 추적하고 관리하며, 데이터를 삽입할 때 빈 공간을 수동으로 찾아서 할당함&lt;/li&gt;
&lt;li&gt;이 방식은 &lt;b&gt;관리 복잡도&lt;/b&gt;가 높고, &lt;b&gt;공간 효율성&lt;/b&gt;이 떨어질 수 있어, 현대적인 Oracle 시스템에서는 대부분Automatic Segment Space Management (ASSM)가 선호됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASSM&lt;/b&gt;은 자동으로 공간을 효율적으로 관리해주므로, 대부분의 경우 &lt;b&gt;수동 방식보다는 자동 방식&lt;/b&gt;이 더 유리함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Manual Segment Space Management와 ASSM의 차이점&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;특징Manual Segment Space ManagementAutomatic Segment Space Management (ASSM)&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;b&gt;Freelist&lt;/b&gt; 사용, 수동으로 관리&lt;/td&gt;
&lt;td&gt;Oracle이 자동으로 공간을 관리&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;주요 사용 환경&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ASSM</category>
      <category>Data Block</category>
      <category>database storage</category>
      <category>extent</category>
      <category>logical db</category>
      <category>manual segment space management</category>
      <category>oracale</category>
      <category>pysical db</category>
      <category>Segment</category>
      <category>tablespace</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/155</guid>
      <comments>https://aonee.tistory.com/155#entry155comment</comments>
      <pubDate>Wed, 18 Dec 2024 17:00:02 +0900</pubDate>
    </item>
    <item>
      <title>[oralce] Default Listener와 Shared Server</title>
      <link>https://aonee.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Default Listener &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스너가 알아야하는 4가지 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;host&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;port&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;protocol&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LREG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lreg&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 서버를 통해 다이나믹하게 알려주고 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamic Reg&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;service_names&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;Dynamic Service Registration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;local_listener = A ( service_name 지정 ex)testorcl )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tnsnames.ora파일에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 리스너를 띄우는 거니 클라이언트 아닌, 서버쪽tnsnames.ora파일에 추가해야한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. tsnnames.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A = 1(host) 2(1561) 3(tcp)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SQL &amp;gt; alter system set local_listener=A;&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;LREG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1521은 무조건 dynamic하게 알린다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1561도 추가하려면 서버측 tnsnames.ora파일 확인&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;서버쪽 listener.ora파일이 반드시 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TNS_ADMIN = $ORACLE_HOME/network/admin/listener.ora&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;(ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;listener.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LISTENER_SALESPDBS =&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(DESCRIPTION_LIST =&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(DESCRIPTION =&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ADDRESS = (PROTOCOL = TCP)(HOST = host1.example.com)(PORT = 1561))&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;SID_LIST_LISTENER_SALESPDBS =&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(SID_LIST = (SID_DESC = (GLOBAL_DB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAME = PDB1.example.com) (SID_NAME = ORCL) (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(SID_DESC =&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(GLOBAL_DBNAME = PDB2.example.com) (SID_NAME = ORCL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;) )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Shared Server &lt;/span&gt;&lt;/blockquote&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;646&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhTb04/btsLnl4LguS/nMpUtZJZRkGk2iKl3ZKWgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhTb04/btsLnl4LguS/nMpUtZJZRkGk2iKl3ZKWgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhTb04/btsLnl4LguS/nMpUtZJZRkGk2iKl3ZKWgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhTb04%2FbtsLnl4LguS%2FnMpUtZJZRkGk2iKl3ZKWgK%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;646&quot; height=&quot;281&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 관련 파라메터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; ALTER SYSTEM SET shared_servers = 3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; ALTER SYSTEM SET max_shared_servers = 10; -- user많아지면 server 최대 10개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; ALTER SYSTEM SET dispatchers=&amp;rsquo;(pro=tcp)(dis=5)&amp;rsquo;; -- listener 에 dispatcher 가 등록됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; ALTER SYSTEM SET max_dispatchers = 10;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. DB 에 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 share할건지 dedicate할건지 client tnsnames.ora에 설정필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@sales&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스패처&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SERVER=shared : 공유 서버 프로세스 연결 ex) 중요하지 않은 반복 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SERVER=dedicated&amp;nbsp;&lt;span&gt; : &lt;/span&gt;&lt;/span&gt;listener 전용 서버 프로세스 연결 ex) 백업, 배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734489914901&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cat $ORACLE_HOME/network/admin/tnsnames.ora 
&amp;hellip; 
sales= 
(DESCRIPTION= 
(ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521)) 
(CONNECT_DATA= 
(SERVICE_NAME=sales.us.example.com) 
(SERVER=shared))) 
&amp;hellip; 
$ sqlplus hr/oracle_4U@sales&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>Listener</category>
      <category>Oracle</category>
      <category>shared server</category>
      <category>리스너</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/154</guid>
      <comments>https://aonee.tistory.com/154#entry154comment</comments>
      <pubDate>Wed, 18 Dec 2024 15:57:46 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] 멀티테넌트, CDB, PDB, SEED 개념 및 PDB 생성방법 5가지</title>
      <link>https://aonee.tistory.com/153</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Multitenant 관리 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Oracle Multitenant Architecture (멀티테넌트 아키텍처)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DB 안에 여러 DB들이 들어가 있는 구조&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czTUS0/btsLmVFkMTl/PCYuZKCIk6VNuCHHyLxUrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czTUS0/btsLmVFkMTl/PCYuZKCIk6VNuCHHyLxUrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czTUS0/btsLmVFkMTl/PCYuZKCIk6VNuCHHyLxUrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczTUS0%2FbtsLmVFkMTl%2FPCYuZKCIk6VNuCHHyLxUrK%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;884&quot; height=&quot;331&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle 12c에서 도입된 멀티테넌트 아키텍처(Multitenant Architecture)는 데이터베이스 관리의 효율성을 높이고, 여러 데이터베이스를 하나의 물리적 시스템에서 독립적으로 운영할 수 있는 방법을 제공합니다. 이 아키텍처의 핵심은 CDB (Container Database)와 PDB (Pluggable Database)의 개념&lt;/li&gt;
&lt;li&gt;DB안의 DB&lt;/li&gt;
&lt;li&gt;컨테이너 역할을 수행하는 DB기능을 제공한다.&amp;nbsp;&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 style=&quot;list-style-type: none;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;PDB 생성 및 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PDB는 &lt;b&gt;CDB&lt;/b&gt; 내에서 &lt;b&gt;Create, Drop, Rename&lt;/b&gt; 등의 관리 작업을 통해 생성, 삭제, 이름 변경 등이 가능합니다.&lt;/li&gt;
&lt;li&gt;CREATE PLUGGABLE DATABASE 명령어로 새로운 PDB를 생성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PDB 이동 및 복사&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;PDB Cloning&lt;/b&gt;: 기존 PDB를 복사하여 새로운 PDB를 만들 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PDB Relocation&lt;/b&gt;: PDB를 다른 CDB로 이동할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PDB의 연결 및 분리&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;Plug-in&lt;/b&gt;: 기존의 PDB를 CDB에 연결하는 작업.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Unplugging&lt;/b&gt;: CDB에서 PDB를 분리하여 다른 CDB로 옮길 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공유 및 독립적인 데이터베이스 운영&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 PDB는 독립적인 &lt;b&gt;데이터베이스 환경&lt;/b&gt;을 제공하면서도 &lt;b&gt;공유된 리소스&lt;/b&gt;를 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PDB $SEED&lt;/b&gt;를 기반으로 새로운 PDB를 빠르게 생성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공통 리소스와 독립적 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통 리소스 (CDB$ROOT)는 여러 PDB 간에 공유되지만, 각 PDB는 &lt;b&gt;독립적으로&lt;/b&gt; 데이터를 관리하고 보안을 유지합니다.주요 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ 멀티테넌트 아키텍처의 예시 ]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 한 기업에서 여러 부서가 독립적인 데이터베이스를 운영할 때&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o-mini&quot; data-message-id=&quot;26da6198-6444-4f61-a681-7db257002ebe&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 부서는 자신의 PDB를 통해 독립적인 애플리케이션과 데이터를 처리합니다.&lt;/li&gt;
&lt;li&gt;관리자는 CDB를 통해 여러 PDB를 관리하고, 공통 자원(예: 인프라, 라이선스 등)을 활용하여 비용을 절감할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 클라우드 서비스 제공 업체&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;클라우드 환경에서 여러 고객이 하나의 CDB를 공유하면서도 각 고객은 자신의 독립적인 PDB에서 데이터를 처리합니다.&lt;/li&gt;
&lt;li&gt;이 방식은 멀티 테넌트 아키텍처의 장점을 살려 클라우드 리소스를 효율적으로 활용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&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;b&gt;멀티테넌트 아키텍처&lt;/b&gt;는 하나의 &lt;b&gt;CDB&lt;/b&gt;에서 여러 개의 &lt;b&gt;PDB&lt;/b&gt;를 실행하여 &lt;b&gt;데이터베이스 관리의 효율성&lt;/b&gt;과 &lt;b&gt;자원 관리 최적화&lt;/b&gt;를 가능하게 합니다&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&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&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&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&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;CDB&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[CDB] &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Container DataBase&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 CDB는 여러개의 PDB라고 불리는 독립된 DB를 담을수 있는 기능 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDB는 &lt;b&gt;컨테이너 데이터베이스&lt;/b&gt;로, 멀티테넌트 아키텍처의 핵심입니다. 하나의 CDB는 여러 개의 PDB를 포함할 수 있으며, 모든 PDB는 이 CDB 내에서 운영됨&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;CDB$ROOT&lt;/b&gt;: CDB 내에서 &lt;b&gt;루트 컨테이너&lt;/b&gt;라고도 불리며, 시스템 전반에 영향을 미치는 공통 데이터와 설정을 포함합니다. 예를 들어, &lt;b&gt;시스템 테이블&lt;/b&gt;과 &lt;b&gt;사용자 계정&lt;/b&gt; 등이 이곳에 저장됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CDB 내의 파일들&lt;/b&gt;: CDB에는 기본적으로 컨테이너에 필요한 시스템 파일이 저장됩니다. 데이터베이스 구조의 일부로서 CDB는 모든 PDB를 관리하고 연결할 수 있는 기능을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PDB&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[PDB]&amp;nbsp;&lt;/b&gt;Pluggable Database&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;독자적인 스키마, 스키마 오브젝트, 유저와 같은 집합을 가진다. (실제 물리적 정보 저장)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PDB는 &lt;b&gt;플러그 가능한 데이터베이스&lt;/b&gt;로, 독립적인 데이터베이스 인스턴스를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 PDB는 독립적인 데이터베이스 환경을 제공하며, 개별적으로 사용자의 데이터와 애플리케이션을 저장함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PDB는 &lt;b&gt;데이터베이스의 논리적 단위&lt;/b&gt;로, 물리적으로는 CDB 내에서 운영됨.&lt;/li&gt;
&lt;li&gt;각 PDB는 &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;/li&gt;
&lt;li&gt;PDB는 &lt;b&gt;CDB 내에 포함된 여러 개의 PDB들&lt;/b&gt; 중 하나일 뿐이며, 동일한 CDB에 여러 개의 PDB를 포함할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Seed PDB (PDB$SEED)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Seed PDB&lt;/b&gt;는 새로운 PDB를 생성할 때 &lt;b&gt;기본 템플릿&lt;/b&gt; 역할을 하는 PDB이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PDB$SEED는 &lt;b&gt;읽기 전용(Read-only)&lt;/b&gt; PDB로, 새로운 PDB를 생성할 때 이를 복사하여 사용하는 방식임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 템플릿을 사용하면 새로운 PDB를 빠르고 일관되게 생성할 수 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; CDB와 PDB의 관계&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CDB&lt;/b&gt;는 여러 &lt;b&gt;PDB&lt;/b&gt;를 포함할 수 있으며, &lt;b&gt;CDB$ROOT&lt;/b&gt;와 &lt;b&gt;여러 PDB&lt;/b&gt;가 포함됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PDB&lt;/b&gt;는 독립적인 데이터베이스로 동작하지만, &lt;b&gt;CDB&lt;/b&gt;의 리소스를 공유함&lt;/li&gt;
&lt;li&gt;예를 들어, 각 PDB는 공통의 &lt;b&gt;컨테이너 데이터&lt;/b&gt;를 사용할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CDB$ROOT&lt;/b&gt;에는 시스템 레벨의 정보와 설정이 포함되고, &lt;b&gt;PDB&lt;/b&gt;는 애플리케이션 및 데이터와 관련된 독립적인 정보를 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 외&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[SYS] -&amp;gt; ROOT&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Oracle DB관리자로 Super user.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Oracle 시스템의 기반이 되는 Data dictionary 소유자이며 DB생성과 삭제도 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Oracle 시스템의 총 관리자이며, SYSDBA 권한을 갖는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Oracle 시스템을 유지, 관리, 생성하기 위한 모든 권한을 갖는 계정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[SYSTEM]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- SYS와 유사한 건한을 가지고 있지만 DB생성과 삭제는 불가능.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 운영을 위한 권한을 갖는다. SYSOPER의 권한을 갖는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 생성된 DB를 운영, 관리하기 위한 관리자 계정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[SYSDBA]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- SYSOPER의 권한 뿐 아니라 데이터베이스 생성과 삭제, Oracle 시스템에서 모든 권한을 갖는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- SYS계정이 갖는 권한.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[SYSOPER]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 데이터베이스를 운영 관리하기 위한 권한으로 SYSTEM계정이 가짐.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 아래 권한 외에 데이터베이스 자체를 생성 삭제하거나, 다른 유저 소유의 데이터에는 접근할 수 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 인스턴스와 데이터베이스에 대한 startup, mount, open, shutdown, dismount, close권한&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 백업, 로그파일을 이용한 복구 등에 대한 database backup, archive log, recover 권한&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Creating a New PDB from PDB$SEED&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wsq4j/btsLmboDdqj/F6iIFxvlIQQ47TBnqaZgtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wsq4j/btsLmboDdqj/F6iIFxvlIQQ47TBnqaZgtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wsq4j/btsLmboDdqj/F6iIFxvlIQQ47TBnqaZgtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWsq4j%2FbtsLmboDdqj%2FF6iIFxvlIQQ47TBnqaZgtK%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;355&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  Using the FILE_NAME_CONVERT&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CREATE PLUGGABLE DATABASE pdb1&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ADMIN USER admin1 IDENTIFIED BY p1 ROLES=(CONNECT)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FILE_NAME_CONVERT = ('PDB$SEEDdir','PDB1dir');&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 반드시 local user 하나 만들어야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;create pluggable&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;admin1은 local user이다. 기본적으로 pdb_dba+connect role 지정함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;seed로 local관리자를 만들면 pdb_dba로 role인데 비어있는 role임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원래 role에 권한 다 넣어두면 쓸 수 있는데&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 쓸 수 있는 role은 없는 상태임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재는 오직 connection role 뿐임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/u01/app/PDB$SEEDdir/system.dbf&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/u01/app/PDB$1dir/system.dbf&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  pdb 생성연습&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Creating a New PDB from the PDB Seed&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sqlplus / as sysdba&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;tnsnames.ora에&amp;nbsp; 등록&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Creating PDBs from Seed (5가지방법)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGEorB/btsLn6M5QTf/ul6ZImDNBBq3kJeOlmABP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGEorB/btsLn6M5QTf/ul6ZImDNBBq3kJeOlmABP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGEorB/btsLn6M5QTf/ul6ZImDNBBq3kJeOlmABP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGEorB%2FbtsLn6M5QTf%2Ful6ZImDNBBq3kJeOlmABP0%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;705&quot; height=&quot;303&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법1. Create from Scratch &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: pdb seed의 file을 copy&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, Seed PDB에서 새로운 PDB를 복사하여 생성하는 방식&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OGBLc/btsLmOUguEw/MNBpoqEuHSNbGTrNBqtbT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OGBLc/btsLmOUguEw/MNBpoqEuHSNbGTrNBqtbT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OGBLc/btsLmOUguEw/MNBpoqEuHSNbGTrNBqtbT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOGBLc%2FbtsLmOUguEw%2FMNBpoqEuHSNbGTrNBqtbT0%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;505&quot; height=&quot;281&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;: PDB$SEED는 기본 템플릿 역할을 하며, 이 파일을 바탕으로 새 PDB가 생성됩니다. Seed PDB를 기반으로 새로운 데이터베이스를 복제하는 것입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용처&lt;/b&gt;: 기본적인 PDB가 필요하고, 기본 구조와 설정이 동일해야 할 때 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;과정&lt;/b&gt;: 새로운 PDB를 만들기 위해 CREATE PLUGGABLE DATABASE 명령어를 사용합니다. PDB는 Seed PDB를 기반으로 복사되고, 사용자 데이터를 추가하거나 수정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시 SQL&lt;/b&gt;:
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CREATE&lt;/span&gt; PLUGGABLE DATABASE new_pdb &lt;span&gt;FROM&lt;/span&gt; &lt;b&gt;PDB$SEED&lt;/b&gt;;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 빠르고 효율적인 PDB 생성 방법.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: PDB 생성 후 초기 데이터베이스 구조가 기본값으로 설정되어 있어 추가 구성이 필요할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n5aoR/btsLmImreK0/zxkppKtc3UEAFodl6u5eI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n5aoR/btsLmImreK0/zxkppKtc3UEAFodl6u5eI1/img.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;615&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.7469%; margin-right: 10px;&quot; data-widthpercent=&quot;48.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n5aoR/btsLmImreK0/zxkppKtc3UEAFodl6u5eI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn5aoR%2FbtsLmImreK0%2FzxkppKtc3UEAFodl6u5eI1%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;733&quot; height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d63DJY/btsLmrypjif/TsJx0cOKW4x2zY6iRccSf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d63DJY/btsLmrypjif/TsJx0cOKW4x2zY6iRccSf1/img.png&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;454&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.0903%;&quot; data-widthpercent=&quot;51.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d63DJY/btsLmrypjif/TsJx0cOKW4x2zY6iRccSf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd63DJY%2FbtsLmrypjif%2FTsJx0cOKW4x2zY6iRccSf1%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;579&quot; height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 방법 2. Cloning &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: source pdb 또는 non-cdb를 복사해서 생성 &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;Cloning&lt;/b&gt;은 기존의 PDB나 Non-CDB를 복제하여 새로운 PDB를 만드는 방식&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;: 이미 존재하는 PDB 또는 Non-CDB 데이터베이스를 복사하여 새로운 PDB를 생성합니다. Non-CDB를 &lt;b&gt;CDB&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;: CREATE PLUGGABLE DATABASE 명령을 사용하여 소스 PDB의 전체 데이터를 복사하여 새 PDB를 만듭니다. 소스 PDB의 메타데이터와 데이터가 그대로 복사되며, 클러스터 환경에서 유용하게 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시 SQL&lt;/b&gt;:
&lt;div&gt;
&lt;div&gt;sql&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CREATE&lt;/span&gt; PLUGGABLE DATABASE new_pdb &lt;span&gt;FROM&lt;/span&gt; &lt;b&gt;source_pdb&lt;/b&gt;;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 기존 데이터베이스의 설정과 데이터를 그대로 복제하여 새로운 PDB를 빠르게 생성.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJN4ci/btsLlQrWxnw/iF0IqpIFLkzPkHegm8TuD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJN4ci/btsLlQrWxnw/iF0IqpIFLkzPkHegm8TuD1/img.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;737&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.2932%; margin-right: 10px;&quot; data-widthpercent=&quot;52.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJN4ci/btsLlQrWxnw/iF0IqpIFLkzPkHegm8TuD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJN4ci%2FbtsLlQrWxnw%2FiF0IqpIFLkzPkHegm8TuD1%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;558&quot; height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO7gsE/btsLlOVjR0g/p8wXTLe7HUAP1ul3NptV2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO7gsE/btsLlOVjR0g/p8wXTLe7HUAP1ul3NptV2K/img.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;739&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.544%;&quot; data-widthpercent=&quot;47.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO7gsE/btsLlOVjR0g/p8wXTLe7HUAP1ul3NptV2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO7gsE%2FbtsLlOVjR0g%2Fp8wXTLe7HUAP1ul3NptV2K%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;498&quot; height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfxtwk/btsLob8R6Xo/JUk4Dkl8un1PtKXckydn0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfxtwk/btsLob8R6Xo/JUk4Dkl8un1PtKXckydn0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfxtwk/btsLob8R6Xo/JUk4Dkl8un1PtKXckydn0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdfxtwk%2FbtsLob8R6Xo%2FJUk4Dkl8un1PtKXckydn0K%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;462&quot; height=&quot;116&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;129&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;480&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvfjEd/btsLnI0o4a4/m8XtJkcGgeQiVmHyYsQHVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvfjEd/btsLnI0o4a4/m8XtJkcGgeQiVmHyYsQHVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvfjEd/btsLnI0o4a4/m8XtJkcGgeQiVmHyYsQHVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvfjEd%2FbtsLnI0o4a4%2Fm8XtJkcGgeQiVmHyYsQHVk%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;480&quot; height=&quot;624&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;624&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;547&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxGmJ/btsLmMoWGyc/rNksskIvY2rVkxAUDKm5s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxGmJ/btsLmMoWGyc/rNksskIvY2rVkxAUDKm5s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxGmJ/btsLmMoWGyc/rNksskIvY2rVkxAUDKm5s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxGmJ%2FbtsLmMoWGyc%2FrNksskIvY2rVkxAUDKm5s1%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;473&quot; height=&quot;160&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYFSlq/btsLmRKlMnZ/nmbHvK6l5MMzRdDr6jaqRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYFSlq/btsLmRKlMnZ/nmbHvK6l5MMzRdDr6jaqRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYFSlq/btsLmRKlMnZ/nmbHvK6l5MMzRdDr6jaqRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYFSlq%2FbtsLmRKlMnZ%2FnmbHvK6l5MMzRdDr6jaqRk%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;491&quot; height=&quot;717&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;방법 3. Plugging In&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: xml metadata file을 이용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAxwLQ/btsLnFoT6Ey/TMjGZF7hdh6c2L0QnFL8q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAxwLQ/btsLnFoT6Ey/TMjGZF7hdh6c2L0QnFL8q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAxwLQ/btsLnFoT6Ey/TMjGZF7hdh6c2L0QnFL8q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAxwLQ%2FbtsLnFoT6Ey%2FTMjGZF7hdh6c2L0QnFL8q0%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;440&quot; height=&quot;223&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;방법 4. Relocation&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: pdb를 다른 cdb로 이동 : 관련 file들을 move&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BS9Zy/btsLmqM3vPc/Lnq7GyAlGUMvKVftztcTAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BS9Zy/btsLmqM3vPc/Lnq7GyAlGUMvKVftztcTAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BS9Zy/btsLmqM3vPc/Lnq7GyAlGUMvKVftztcTAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBS9Zy%2FbtsLmqM3vPc%2FLnq7GyAlGUMvKVftztcTAK%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;389&quot; height=&quot;187&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/naceh/btsLm2d0BBX/Vnz0Jw9LHNF0lmoIDWNkdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/naceh/btsLm2d0BBX/Vnz0Jw9LHNF0lmoIDWNkdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/naceh/btsLm2d0BBX/Vnz0Jw9LHNF0lmoIDWNkdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnaceh%2FbtsLm2d0BBX%2FVnz0Jw9LHNF0lmoIDWNkdk%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;486&quot; height=&quot;342&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;342&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;447&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxjNDG/btsLoofPs0C/jOsQ5kdKhklqnn1AWcmhWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxjNDG/btsLoofPs0C/jOsQ5kdKhklqnn1AWcmhWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxjNDG/btsLoofPs0C/jOsQ5kdKhklqnn1AWcmhWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxjNDG%2FbtsLoofPs0C%2FjOsQ5kdKhklqnn1AWcmhWk%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;447&quot; height=&quot;204&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;204&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;483&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPMbLV/btsLmWx5urL/R1VanKr0yfFDFuKg5mR5y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPMbLV/btsLmWx5urL/R1VanKr0yfFDFuKg5mR5y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPMbLV/btsLmWx5urL/R1VanKr0yfFDFuKg5mR5y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPMbLV%2FbtsLmWx5urL%2FR1VanKr0yfFDFuKg5mR5y1%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;451&quot; height=&quot;587&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;방법 5. Referencing as a Proxy PDB&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;: db link를 이용하여 다른 pdb의 proxy pdb로 생성&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zTU61/btsLmptNpRf/nHXQ3kfLxzVNV05vfgIVEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zTU61/btsLmptNpRf/nHXQ3kfLxzVNV05vfgIVEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zTU61/btsLmptNpRf/nHXQ3kfLxzVNV05vfgIVEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzTU61%2FbtsLmptNpRf%2FnHXQ3kfLxzVNV05vfgIVEk%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;439&quot; height=&quot;201&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wf8jG/btsLmRKlYFl/qqGMrRHHKLmnhqqfatwcRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wf8jG/btsLmRKlYFl/qqGMrRHHKLmnhqqfatwcRk/img.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;523&quot; data-is-animation=&quot;false&quot; style=&quot;width: 64.168%; margin-right: 10px;&quot; data-widthpercent=&quot;64.92&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wf8jG/btsLmRKlYFl/qqGMrRHHKLmnhqqfatwcRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwf8jG%2FbtsLmRKlYFl%2FqqGMrRHHKLmnhqqfatwcRk%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;440&quot; height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/usW8A/btsLmiWemla/DOq96ueVkj4Rh9p4kdx731/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/usW8A/btsLmiWemla/DOq96ueVkj4Rh9p4kdx731/img.png&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;550&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.6693%;&quot; data-widthpercent=&quot;35.08&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/usW8A/btsLmiWemla/DOq96ueVkj4Rh9p4kdx731/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FusW8A%2FbtsLmiWemla%2FDOq96ueVkj4Rh9p4kdx731%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;550&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/153</guid>
      <comments>https://aonee.tistory.com/153#entry153comment</comments>
      <pubDate>Wed, 18 Dec 2024 15:20:24 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] Oracle Net Services 오라클 네트워크 설정 (tnsnames.ora )</title>
      <link>https://aonee.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;connection VS session&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JpJHX/btsLkW6x790/bcMKAU1zFakVWFr3bxLf50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JpJHX/btsLkW6x790/bcMKAU1zFakVWFr3bxLf50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JpJHX/btsLkW6x790/bcMKAU1zFakVWFr3bxLf50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJpJHX%2FbtsLkW6x790%2FbcMKAU1zFakVWFr3bxLf50%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;551&quot; height=&quot;192&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;192&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; Connection&lt;/b&gt;:Communication between a user process and an instance&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Session&lt;/b&gt;:Represents the state of a current user login to the database instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Oracle Net Services &lt;/span&gt;&lt;/blockquote&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;491&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Emrt/btsLmkkTJET/veKYKQM0baNQjtZEfgCKi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Emrt/btsLmkkTJET/veKYKQM0baNQjtZEfgCKi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Emrt/btsLmkkTJET/veKYKQM0baNQjtZEfgCKi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Emrt%2FbtsLmkkTJET%2FveKYKQM0baNQjtZEfgCKi1%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;491&quot; height=&quot;348&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 네트워크 사용하렴련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle Net 설치해서 사용하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Listener 1 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;client&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스너 확인 목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. host&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. port&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. protocol&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. service name / SID / $ORACLE_HOME&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;name Resolution&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 user name 인증부터 확인해 (패스워드 맞는지 등등1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스너는 명령어 수행 시 뭐 해주는 거 없어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 request확인하고 user랑 연결해주는 것까지만 해줘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; List the components of Oracle Net Services &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Listeners&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;listener.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Naming methods&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Naming (net service name)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tnsnames.ora (local configuration)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Profiles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sqlnet.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Configuring Naming Methods &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKVJSX/btsLlMvtMpF/ShKKMGVxgkYvAe7YKXu5i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKVJSX/btsLlMvtMpF/ShKKMGVxgkYvAe7YKXu5i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKVJSX/btsLlMvtMpF/ShKKMGVxgkYvAe7YKXu5i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKVJSX%2FbtsLlMvtMpF%2FShKKMGVxgkYvAe7YKXu5i1%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;524&quot; height=&quot;120&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Name Resolution &lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/59dC9/btsLmNfXpuN/Lgz9xKznU3nTN1sNgKsN61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/59dC9/btsLmNfXpuN/Lgz9xKznU3nTN1sNgKsN61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/59dC9/btsLmNfXpuN/Lgz9xKznU3nTN1sNgKsN61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F59dC9%2FbtsLmNfXpuN%2FLgz9xKznU3nTN1sNgKsN61%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;594&quot; height=&quot;370&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;370&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;CONNECT jsmith/jspass@finflowers&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;finflowers =(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=flowers-server)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=finance.us.flowers.com)))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 쉽게 연결하는 방법은? Easy Connect&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lKUUp/btsLmVZcy6d/KxhvjC6S5rph7xYEA38Uz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lKUUp/btsLmVZcy6d/KxhvjC6S5rph7xYEA38Uz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lKUUp/btsLmVZcy6d/KxhvjC6S5rph7xYEA38Uz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlKUUp%2FbtsLmVZcy6d%2FKxhvjC6S5rph7xYEA38Uz0%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;504&quot; height=&quot;203&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;203&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;SQL&amp;gt; connect hr/hr@db.us.oracle.com &lt;br /&gt;db랑 dba11g가 같을 경우,&amp;nbsp; 이렇게 간추릴 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Local Naming &lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cadQGp/btsLmnhCHne/D99K129ESKPxIJeLdsVFz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cadQGp/btsLmnhCHne/D99K129ESKPxIJeLdsVFz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cadQGp/btsLmnhCHne/D99K129ESKPxIJeLdsVFz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcadQGp%2FbtsLmnhCHne%2FD99K129ESKPxIJeLdsVFz1%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;490&quot; height=&quot;159&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;159&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;$ORACLE_HOME/network/admin/tnsnames.ora에 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqmiV/btsLlJS9269/CUeWBOk1ww1fwwXiFrASm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqmiV/btsLlJS9269/CUeWBOk1ww1fwwXiFrASm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqmiV/btsLlJS9269/CUeWBOk1ww1fwwXiFrASm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqmiV%2FbtsLlJS9269%2FCUeWBOk1ww1fwwXiFrASm0%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;853&quot; height=&quot;443&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Connection Options &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Connect-time failover : 적힌 순서대로 될 때까지 listener에 접속 시도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(FAILOVER=on)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Load balancing : 랜덤하게 한 listener에만 접속 시도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(LOAD_BALANCE=on)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Source routing : client에서 server까지의 경로 나열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(SOURCE_ROUTE=on)&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;$ORACLE_HOME/network/admin/tnsnames.ora에 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FAILOVER , LOAD_BALANCE 둘다 작성하면 랜덤하게 될 때까지 시도해라&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;617&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNxQNT/btsLmRJhBty/WDKTxnWlR9VKKV4WKaVnh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNxQNT/btsLmRJhBty/WDKTxnWlR9VKKV4WKaVnh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNxQNT/btsLmRJhBty/WDKTxnWlR9VKKV4WKaVnh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNxQNT%2FbtsLmRJhBty%2FWDKTxnWlR9VKKV4WKaVnh0%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;617&quot; height=&quot;647&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 서비스 예시 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db_name=orclcdb&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service_names=edu, sales&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정리&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;tnsnames.ora&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 측에 두는 파일.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 네이밍 구성의 네트워크에서 사용됨&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;oracle&amp;nbsp; finflowers&amp;nbsp; 접속시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CONNECT jsmith/jspass@finflowers&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;tnsname.ora&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734421655767&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;finflowers =(DESCRIPTION= 
(ADDRESS=(PROTOCOL=tcp)(HOST=flowers-server)(PORT=1521))
 (CONNECT_DATA=
 (SERVICE_NAME=finance.us.flowers.com)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;listener.ora&lt;/blockquote&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;리스너는 클라이언트에서 DB 연결 요청을 받는 프로세스이다.&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;클라이언트에서의 연결은 모두 리스너가 받고 리스너가 어느 DB로 연결하면 좋을지 판단함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결할 DB를 리스터파일에 기술한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스너는 listener.ora 파일 내에서 유일해야하며, 기본 리스너를 사용하면 해당 파일 없어도 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>listener.ora</category>
      <category>local naming</category>
      <category>name resolution</category>
      <category>Oracle</category>
      <category>tnsnames.ora</category>
      <category>오라클네트워크</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/152</guid>
      <comments>https://aonee.tistory.com/152#entry152comment</comments>
      <pubDate>Tue, 17 Dec 2024 16:58:05 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] ASMM : 자동  공유 메모리 관리</title>
      <link>https://aonee.tistory.com/151</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;ASMM&lt;/span&gt;&amp;nbsp; : 자동 공유 메모리 관리&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;421&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOHyMa/btsLmqkRrNQ/VDIr25FW7m4px8HRE81JF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOHyMa/btsLmqkRrNQ/VDIr25FW7m4px8HRE81JF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOHyMa/btsLmqkRrNQ/VDIr25FW7m4px8HRE81JF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOHyMa%2FbtsLmqkRrNQ%2FVDIr25FW7m4px8HRE81JF1%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;421&quot; height=&quot;236&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AMM란?&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;751&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edpIiv/btsLmLI5cvr/UytKrCao5ySQ3kqxhVEPk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edpIiv/btsLmLI5cvr/UytKrCao5ySQ3kqxhVEPk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edpIiv/btsLmLI5cvr/UytKrCao5ySQ3kqxhVEPk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedpIiv%2FbtsLmLI5cvr%2FUytKrCao5ySQ3kqxhVEPk0%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;335&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Automatic Memory Management의 약자로 자동메모리관리이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 서버가 작업 로드에 따라 SGA 및 PGA의 크기를 자동으로 조정할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 작업 로드 변경에 맞게 자동 조정&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 메모리 활용률 최대화&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 메모리 부족 오류 제거에 유용&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;SGA_TARGET = 1G (&amp;lt;= SGA_MAX_SIZE)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;DB_CACHE_SIZE = 0&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;LARGE_POOL_SIZE = 0&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;SHARED_POOL_SIZE = 0&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;JAVA_POOL_SIZE = 0&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;STREAMS_POOL_SIZE = 0&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AMM</category>
      <category>amms</category>
      <category>Oracle</category>
      <category>자동메모리관리</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/151</guid>
      <comments>https://aonee.tistory.com/151#entry151comment</comments>
      <pubDate>Tue, 17 Dec 2024 15:51:35 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] ADR : Automatic Diagnostic Repository</title>
      <link>https://aonee.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;739&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNV2s/btsLmNfEmQO/FXeB5oPngHok4Lm24h9jak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNV2s/btsLmNfEmQO/FXeB5oPngHok4Lm24h9jak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNV2s/btsLmNfEmQO/FXeB5oPngHok4Lm24h9jak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNV2s%2FbtsLmNfEmQO%2FFXeB5oPngHok4Lm24h9jak%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;739&quot; height=&quot;420&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pwd 현재경로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/u01/app/oracle/diag/rdbms/orclcdb/orclcdb&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sqlplus / as sysdba&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Use ADRCI to View the Alert Log&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ cd&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ adrci&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciqFaA/btsLlrY5TvW/DmJTUt08ku5tStIa8RtwKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciqFaA/btsLlrY5TvW/DmJTUt08ku5tStIa8RtwKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciqFaA/btsLlrY5TvW/DmJTUt08ku5tStIa8RtwKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciqFaA%2FbtsLlrY5TvW%2FDmJTUt08ku5tStIa8RtwKk%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;578&quot; height=&quot;337&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show alert&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTpdZb/btsLl8EI2k3/i0RSSmnf0iRKYF6ABEtN31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTpdZb/btsLl8EI2k3/i0RSSmnf0iRKYF6ABEtN31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTpdZb/btsLl8EI2k3/i0RSSmnf0iRKYF6ABEtN31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTpdZb%2FbtsLl8EI2k3%2Fi0RSSmnf0iRKYF6ABEtN31%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;496&quot; height=&quot;450&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;729&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;:q! 로 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) alert log&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- text file : trace/alert_orclcdb.log, xml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 사건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STARTUP(non-default parameter), SHUTDOWN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;recovery&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;log switch, TS create, alter, drop&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중대한 에러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) trace file 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류1) bp 백그라운드 프로세서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trace /*dbwr*.trc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류2) server 서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trace / *.trc&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;SQL, Plan, 통계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용방법 : SQL &amp;gt; alter session set sql_trace=true;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;false or session out까지 튜닝에 필요한 정보 기록하도록 함&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;3) DDL LOG FILE (12c)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alter log &amp;lt;- user ddl X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text file : log/ddl_orclcdb.log&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xml file : log/ddl/log.xml&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;adr 쪽에 계속 정보가 쌓이고 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 디바이스 full나는거 아니냐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기적으로 정리해줘야하는거 안이냐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 oracle이 purge작업해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. fixed table&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fixed table은 shared pool 안에 메모리로 기록됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;physical read라는 테이블에 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shutdown하면 drop됨.&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;5. Data Dictionary Table&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle's Tables&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ADR</category>
      <category>automatic diagnostic repository</category>
      <category>Oracle</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/150</guid>
      <comments>https://aonee.tistory.com/150#entry150comment</comments>
      <pubDate>Tue, 17 Dec 2024 15:42:04 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] Database instance 관리 및 startup &amp;amp; shut down</title>
      <link>https://aonee.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1 .parameter file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. sys인증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Instance Startup / Shupdown&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. PDB open / close&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. files&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;tables - view&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Managing Database Instances &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Initialization Parameters&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDwk7/btsLlKcF3rw/dKnkHxYmNfabVlWvRnf1ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDwk7/btsLlKcF3rw/dKnkHxYmNfabVlWvRnf1ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDwk7/btsLlKcF3rw/dKnkHxYmNfabVlWvRnf1ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDwk7%2FbtsLlKcF3rw%2FdKnkHxYmNfabVlWvRnf1ik%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;339&quot; height=&quot;353&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 파라미터 초기화 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, spfile 또는 pfile로 설정가능&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;  Server parameter file (SPFILE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- binary file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL &amp;gt; alter system set open_cursors=500&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scope = sfile;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memory&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;both (default option)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- $ORACLE_HOME/dbs/spfileorclcdb.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- spfile과 pfile 둘다 있으면 oracle은 spfile을 올림.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Read and Wirte&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;spfile &amp;lt;-&amp;gt; pfile 변경 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; create pfile from spfile;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;create spfile from pfile;&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; Text initialization parameter file (PFILE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- text file &amp;lt;- editor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- initorclcdb.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- $ORACLE_HOME/dbs/initorclcdb.ora&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- startup 명령어 내리는 쪽에 위치함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Read only&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;open_cursors=300'&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;SQL &amp;gt; alter system set open_cursors=500;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sql로 변경해도 set 파라미터파일은 변경안됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재부팅시에도 반영하고 싶으면 set파라미터파일에 설정 필요&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;SQL &amp;gt; startup pfile = /u01/app/initorclcdb.ora&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정해두면 pfile찾아갈 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 오라클은 파라미터파일 어떻게 찾아가나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. SPFILE.ora, where SID is the system ID and identifies the instance name (for example, ORCL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SPFILE.ora&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. init.ora (PFILE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-&amp;gt;2-&amp;gt;3 수행했는데 없으면 에러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파라미터 설정&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; Initialization parameters (parameters):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ndash;Set database limits&amp;ndash;Set database-wide defaults&amp;ndash;Specify files and directories&amp;ndash;Affect performance&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;  Parameters can be of two types: basic or advanced.&amp;ndash;Tune around 30 basic parameters to get reasonable database performance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&amp;ndash;Example of a basic parameter: SGA_TARGET&amp;ndash;Example of an advanced parameter: DB_CACHE_SIZE&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;  Derived parameters calculate their values from the values of other parameters.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ndash;Example: SESSIONSis derived from PROCESSES.&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; Some parameter values or value ranges depend on the host operating system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ndash;Example: DB_BLOCK_SIZE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파라미터 확인&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v$parameter : session parameter (로그인세션)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; select name, value from v$parameter where name like '%control%';&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;v$spparameter :&lt;span&gt; spfile parameter &lt;/span&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;v$system_parameter : system parameter (시스템전체)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;DB 인증&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SYS는 DB인증으로 접근 불가&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. OS인증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OSDBA로 지정된 OS user group에 속한 OS user로 로그인 해서 다음과 같이 로그인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; show con_name&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CDB&amp;amp;ROOT&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ sqlplus / as sysdba&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ORACLE_HOME/rdbms/lib/config.c 에서 DB 생성시 지정한 OS user group 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; OS로 먼저 로그인이 가능한 환경에서 사용 OS 인증 방지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; $ORACLE_HOME/network/admin/sqlnet.ora 파일에 sqlnet.authentication_services=(none) 을 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Root Container만 os인증 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법2. Password file 에 의한 인증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- $ORACLE_HOME/dbs/orapw 에 등록된 sys의 password를 이용해 다음과 같이 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ sqlplus sys/oracle_4U@orcl as sysdba&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- orapwd 유틸리티를 이용해서 password file을 생성한다. $ orapwd file=$ORACLE_HOME/dbs/orapw password=oracle_4U&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Starting&amp;nbsp;Up&amp;nbsp;and&amp;nbsp;Shutting&amp;nbsp;Down&amp;nbsp;a&amp;nbsp;Database&amp;nbsp;Instance&lt;/span&gt;&lt;/blockquote&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;758&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN59Q6/btsLktJJYbS/0MgXqAntwOK8MyX4knISTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN59Q6/btsLktJJYbS/0MgXqAntwOK8MyX4knISTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN59Q6/btsLktJJYbS/0MgXqAntwOK8MyX4knISTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN59Q6%2FbtsLktJJYbS%2F0MgXqAntwOK8MyX4knISTk%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;758&quot; height=&quot;407&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;407&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;  &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;Starting&amp;nbsp;Up&amp;nbsp;&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database instance 옵션 미지정시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;startup : shutdown &amp;gt; nomount &amp;gt; mount &amp;gt; open&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, nomount skip 하려면 옵션 지정해줘야함&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;SQL &amp;gt; startup&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instance Started : open parameter file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Database Mounted : open control file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Database Opened : open datafiles, logfiles&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;- nomount&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;instance started : open parameter file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 확보. 백그라운드 프로세스 띄우는 단계&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; startup nomount&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; alter database mount;&amp;nbsp; alter database open ;&amp;nbsp; /* 단계별 startup해야함. 한번에 open까지 못감*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pdb X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- mount&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;control file opened for the instance&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; startup mount&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; alter database open ;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pdb &amp;lt;- mounted&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;- open&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;all files opened as described by the control file for the instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;open되어야지 user들이 접근 가능함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root(open RW), seed(open RO), pdb(mounted)&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;✅ open했다해서 user 각 pdb까지 설정된 것은 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Root &amp;gt; alter pluggable database orclpdb1 open;&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;ROOT &amp;gt; alter pluggable database all open (read only); -- 전CDB 작업가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;ORCLPDB1 &amp;gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alter pluggable database open&lt;span&gt; ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ORCLPDB1 &amp;gt;&lt;span&gt; startup&lt;/span&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;startup은 shutdown상태에서만 가능한데, 강제로 시작시키려면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; startup force&amp;nbsp; /* shutdown abort + startup */&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;close도 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROOT &amp;gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;shutdown immediate&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 pdb만 close해야하는경우?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ROOT &amp;gt; alter pluggable database all close (read only); -- 전CDB 작업가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;ORCLPDB1 &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alter pluggable database close&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ORCLPDB1 &amp;gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;shutdown&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt; 매번 open close 직접 설정하기 싫으면?&amp;nbsp; Automatically 설정&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;666&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXyUbI/btsLjInkyG4/mjfn9lu2cyKhNELZxqxwH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXyUbI/btsLjInkyG4/mjfn9lu2cyKhNELZxqxwH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXyUbI/btsLjInkyG4/mjfn9lu2cyKhNELZxqxwH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXyUbI%2FbtsLjInkyG4%2Fmjfn9lu2cyKhNELZxqxwH0%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;569&quot; height=&quot;366&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;SQL &amp;gt; ALTER PLUGGABLE DATABASE pdb1 SAVE STATE; &lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;Shutting&amp;nbsp;Down&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상 shutdown 방법 3가지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;checkpoint가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법1.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; shutdown normal&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) wait : exit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) new session X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) checkpoint&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) close datafiles, logfiles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; close control file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; stop instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법2.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SQL &amp;gt; shutdown&lt;span&gt; transactional&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) wait : commit, rollback&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) new session X&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) checkpoint&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) close datafiles, logfiles&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; close control file&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; stop instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법3.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; shutdown immediate&amp;nbsp; /* wait없음 /*&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) rollback&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) new session X&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) checkpoint&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) close datafiles, logfiles&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; close control file&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; stop instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비정상 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;shutdown&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;flat &amp;amp; checkpoint없음. 이때 복구작업 필요함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; shutdown abort&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) falt&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) new session X&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3)&amp;nbsp; stop instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>database instance</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/149</guid>
      <comments>https://aonee.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 17 Dec 2024 12:25:36 +0900</pubDate>
    </item>
    <item>
      <title>[oracle] create database</title>
      <link>https://aonee.tistory.com/148</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Creating a Container Database (CDB) &lt;/span&gt;&lt;/blockquote&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;754&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JXqQs/btsLkscWNCg/hZOsWRlHvSMWSVVTzuH8Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JXqQs/btsLkscWNCg/hZOsWRlHvSMWSVVTzuH8Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JXqQs/btsLkscWNCg/hZOsWRlHvSMWSVVTzuH8Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJXqQs%2FbtsLkscWNCg%2FhZOsWRlHvSMWSVVTzuH8Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;416&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. startup instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. create database&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL &amp;gt; create database ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번에 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ORACLE_HOME/rdbms/admin/ catcdb.sql&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ORACLE_HOME/rdbms/admin/catalog.sql&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ORACLE_HOME/rdbms/admin/ catproc.sql : 오라클 제공 패키지 생성스크립트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Creating a CDB by Using a SQL Command: Example&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIdZ28/btsLkEYA0JF/LkiczGaaIetn6UrAhOXZtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIdZ28/btsLkEYA0JF/LkiczGaaIetn6UrAhOXZtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIdZ28/btsLkEYA0JF/LkiczGaaIetn6UrAhOXZtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIdZ28%2FbtsLkEYA0JF%2FLkiczGaaIetn6UrAhOXZtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;386&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 인스턴스 시작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-a) 인스턴스이름 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set ORACLE_SID=CDB1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-b) 파라미터 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;ndash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; CONTROL_FILES to CDB control file names&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ndash; DB_NAME to a CDB name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ndash; ENABLE_PLUGGABLE_DATABASE to TR&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. DB 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734396627654&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; SQL&amp;gt; 
 CREATE DATABASE cdb1  
 
USER SYS IDENTIFIED BY p1 USER SYSTEM IDENTIFIED BY p2 /*패스워드 설정 */

 LOGFILE GROUP 1 ('/u01/app/oradata/CDB1/redo1a.log', /* 로그파일 2개 생성 */
 '/u02/app/oradata/CDB1/redo1b.log') SIZE 100M,
 GROUP 2 ('/u01/app/oradata/CDB1/redo2a.log',
 '/u02/app/oradata/CDB1/redo2b.log') SIZE 100M 
 
CHARACTER SET AL32UTF8 NATIONAL CHARACTER SET AL16UTF16  

EXTENT MANAGEMENT LOCAL DATAFILE    /* ORACLE DATAFILE 만들 때 만드시 필요 */
'/u01/app/oradata/CDB1/system01.dbf' SIZE 325M 
SYSAUX DATAFILE  '/u01/app/oradata/CDB1/sysaux01.dbf' SIZE 325M 
DEFAULT TEMPORARY TABLESPACE tempts1 
TEMPFILE '/u01/app/oradata/CDB1/temp01.dbf' SIZE 20M 
UNDO TABLESPACE undotbs 
DATAFILE '/u01/app/oradata/CDB1/undotbs01.dbf' SIZE 200M

 ENABLE PLUGGABLE DATABASE /* CDB아키텍처 만들기 위해 꼭 필요 */
SEED FILE_NAME_CONVERT =('/u01/app/oradata/CDB1','/u01/app/oradata/CDB1/seed');
/* SEED는 SEED경로(/u01/app/oradata/CDB1/seed) 위치 지정
해당 옵션은 선택임. 옵션지정 말고 파라미터 OMF에 지정하면 ORACLE이 알아서 SEED생성 및 삭제 자동 관리해줌*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Execute the $ORACLE_HOME/rdbms/admin/catcdb.sqlSQL script &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ORACLE_HOME/rdbms/admin/ catcdb.sql&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Create Database</category>
      <category>Oracle</category>
      <category>오라클디비생성</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/148</guid>
      <comments>https://aonee.tistory.com/148#entry148comment</comments>
      <pubDate>Tue, 17 Dec 2024 10:43:46 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle DB] Multitenant Container Database</title>
      <link>https://aonee.tistory.com/147</link>
      <description>&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Multitenant Container Database &lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Non-CDB Architecture&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 Instance로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;CDB Architecture&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZbUIx/btsLkV6oVMD/W5Ho0k4xrIal71mnQaieaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZbUIx/btsLkV6oVMD/W5Ho0k4xrIal71mnQaieaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZbUIx/btsLkV6oVMD/W5Ho0k4xrIal71mnQaieaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZbUIx%2FbtsLkV6oVMD%2FW5Ho0k4xrIal71mnQaieaK%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;314&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;314&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;Control files, Redo log Files는 공동사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataFile은 각각 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 비용절감 : S/W, Storage, 관리인원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 쉽고 간단한 데이터 이동 : PDB plug in/out&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 자원관리 : PDB별로 resource 제한 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) PDB 는 논리적으로 독립성을 지님 물리적으로는 모든 PDB들이 하나의 DB임(CDB)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 관리자 독립 : CDB, PDB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) 성능 튜닝이 쉬움 : instance가 하나이므로 통합 모니터링이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7) 쉬운 patch &amp;amp; upgrade : 한번에 CDB 레벨로 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Container(= datafiles 그룹)종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Root Container&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; CDB$ROOT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; con_id=1 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; Oracle 전용의 metadata + Common User 정보 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 모든 PDB들이 공유 : DB 생성시 자동으로 만들어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Template - Seed Container&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &amp;nbsp;PDB$SEED &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; con_id=2 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; READ ONLY 모드로 PDB 생성에 사용되는 template &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; DB 생성시 자동으로 만들어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) User data - Pluggable DB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PDB 논리적 독립성.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Sharding &lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQilHD/btsLlekqppz/TeADKdzTWAvQxOk8NPoNBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQilHD/btsLlekqppz/TeADKdzTWAvQxOk8NPoNBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQilHD/btsLlekqppz/TeADKdzTWAvQxOk8NPoNBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQilHD%2FbtsLlekqppz%2FTeADKdzTWAvQxOk8NPoNBK%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;435&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB 어느것도 공유하지 않음. 독립적 서버.&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;- 최대 1000개까지도 묶어서 사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- shard catalog : sharded Databse, shard관리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;EM&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3OYz/btsLkbWszwI/ZGVt7FxpuOKygvrKalCNj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3OYz/btsLkbWszwI/ZGVt7FxpuOKygvrKalCNj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3OYz/btsLkbWszwI/ZGVt7FxpuOKygvrKalCNj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3OYz%2FbtsLkbWszwI%2FZGVt7FxpuOKygvrKalCNj1%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;851&quot; height=&quot;442&quot; data-origin-width=&quot;851&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DB Express&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1개 DB&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;port 5500 통해서, omr에 저장해두고 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OMR : Oracle Management Repository&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Cloud Control&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OMS, OMR설치.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OMR에는 target파일이 쫙 준비됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orcl DB에 OMA는 dbsnmp계정으로 접근&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;OMS : Oracle Management service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OMR : Oracle Management Repository&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OMA : Oracle Management Agent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;oralce에서 사용하는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;roc환경에서 db구축해야한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유할 수 있는 storage준비해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 결정된 storage얼마나 확보하느냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Database Configuration Assistant &lt;br /&gt;(DBCA)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Database Template&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. character Set&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;character Set&amp;nbsp; &amp;amp; national char set (해외타입에 맞춰 결정해야하는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unicode체계 권장&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;NLS_LANG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 내 클라이언트에서 사용하는 코드체계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) NLS_LANG=AL32UTF8&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;Server는 Client가 설정한&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NLS_LANG=AL32UTF8를 보고 그 코드값에 맞출 수 있도록 준비함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. super set권장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. NLS_LANG에 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB삭제 시, DBCA 통해 삭제하는 것이 가장 깔끔함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 시,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DB이름 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db_name=orclcdb&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db_domain=us.oracle.com&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Instance이름 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORACLE_SID=orclcdb&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;global DB name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orcl.&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;Create as Container Database&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;auto container ... 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DW&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OLTP&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;create a new listener&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 복잡하면 silent mode로 한번에 설정 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cdb</category>
      <category>DBCA</category>
      <category>em</category>
      <category>Multitenant</category>
      <category>nls_lang</category>
      <category>non-cdb</category>
      <category>Oracle</category>
      <category>sharding</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/147</guid>
      <comments>https://aonee.tistory.com/147#entry147comment</comments>
      <pubDate>Mon, 16 Dec 2024 16:59:42 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle DB] Oracle Database 기본구조</title>
      <link>https://aonee.tistory.com/146</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock style1&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRXBxe/btsLiJT0Y8O/GMRUOclSX2KAnwv5mCoBo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRXBxe/btsLiJT0Y8O/GMRUOclSX2KAnwv5mCoBo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRXBxe/btsLiJT0Y8O/GMRUOclSX2KAnwv5mCoBo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRXBxe%2FbtsLiJT0Y8O%2FGMRUOclSX2KAnwv5mCoBo0%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;368&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Oracle DB Server는 Instance와 Database로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Instance는 하나의 DB와 연관이 되는데, memory, background processes로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Instance start를 해야 SGA영역이 생성된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Database는 3개의 파일로 구성된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Datafiles : user data(table, index) 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Logfiles : 복구에 사용되는 Log 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Controlfiles: dbid, datafiles list, logfiles list, 동기화 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SGA (System Global Area)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/45DTe/btsLjTuAgpE/JwOqmlvc4x6ci7gQhZ9muk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/45DTe/btsLjTuAgpE/JwOqmlvc4x6ci7gQhZ9muk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/45DTe/btsLjTuAgpE/JwOqmlvc4x6ci7gQhZ9muk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F45DTe%2FbtsLjTuAgpE%2FJwOqmlvc4x6ci7gQhZ9muk%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;738&quot; height=&quot;217&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 필수 구성요소는 3가지 이다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Shared Pool&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Database Buffer Cache&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Redo Log Buffer&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;Instance Start할 때, SGA가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instance Shut down 시, SGA가 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버프로세스는 로그인, 로그아웃시 시작 종료된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 시작종료와 무관함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얘가 명령어 다 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 모든 서버가 SGA를 공유하여 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서버가 사용하는 영역은 PGA임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Shared Pool&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CsDfN/btsLkctVJPz/PcFK0KIlsS2kcVObkwTCAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CsDfN/btsLkctVJPz/PcFK0KIlsS2kcVObkwTCAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CsDfN/btsLkctVJPz/PcFK0KIlsS2kcVObkwTCAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCsDfN%2FbtsLkctVJPz%2FPcFK0KIlsS2kcVObkwTCAk%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;427&quot; height=&quot;228&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;228&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;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt; Shared Pool 이란?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shared SQL Area를 사용해서 소프트 파싱이 가능하도록 함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 수행 빠르게 처리 가능.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 바로 shared pool의 목적임&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 15.1163%; height: 93px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;p-code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;Exec Plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 공유 SQL 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 라이브러리캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데이터 딕셔너리 캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 데이터 딕셔너리 캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Dictionary : 전db의 정보 다 기록한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user_tables&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;all_tables&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dba_tables&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;oracle table은 DB buffer cache가 아닌, shared pool의 Dictionary cache영역에 저장된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;row 단위로 cache를 저장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 서버 결과 캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;result cache는 결과를 저장해두고 그 결과 그대로 user에게 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하려면 hint를 주면됨. ex) /* + result-cache */&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Database Buffer Cache (DB_CACHE_SIZE)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDkjA/btsLiXSbDcb/KxeISn9w4DeXpEG32jYNE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDkjA/btsLiXSbDcb/KxeISn9w4DeXpEG32jYNE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDkjA/btsLiXSbDcb/KxeISn9w4DeXpEG32jYNE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDkjA%2FbtsLiXSbDcb%2FKxeISn9w4DeXpEG32jYNE0%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;502&quot; height=&quot;186&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;  &lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;Database Buffer Cache&lt;/span&gt; 란?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Physical Read 감소시키고 여러 서버가 Logical Read로 바로 사용가능하도록. 버퍼 공유하도록 하는 것이 버퍼캐시의 목적임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 쿼리를 수행하면, Data File에서 Physical Read하여 결과를 Database Buffer Cache로 불러옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 서버프로세스(=유저)에게 Logical Read하여 결과값을 보여줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Physical Read한 결과를 버퍼캐시에 저장해두었으니, 해당 조회결과를 다시 조회해야할 때, Physical Read를 다시 하지 않고 Logical Read로 바로 읽을 수 있음.&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;* Buffer 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Free : Empty&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Pinned : 수행중인 명령어가 이용하는 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Clean : Buffer와 File의 내용이 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Dirty : 명령이 수행된 결과 buffer의 내용과 File의 내용이 다름&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;* LRU List : Buffer Header List 양끝이 MRU, LRU로 관리됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, fifo가 아닌, 최근 안쓴 것 제거 방식.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Checkpoint Queue : 변경된 순서대로 dirty buffer의 list가 관리됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Redo Log Buffer (LOG_BUFFER)&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PUa8y/btsLkHtwHYi/KCxHZBTi42kDJ2Nq9S2dm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PUa8y/btsLkHtwHYi/KCxHZBTi42kDJ2Nq9S2dm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PUa8y/btsLkHtwHYi/KCxHZBTi42kDJ2Nq9S2dm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPUa8y%2FbtsLkHtwHYi%2FKCxHZBTi42kDJ2Nq9S2dm1%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;217&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경(DML, DDL)시 바뀌게 될 값을 기록 - 순환적, 순차적으로 Server Process가 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Large Pool (LARGE_POOL_SIZE)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wVmSp/btsLjR4FGRw/fkI8cMPJmpok6Yb3tJY6o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wVmSp/btsLjR4FGRw/fkI8cMPJmpok6Yb3tJY6o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wVmSp/btsLjR4FGRw/fkI8cMPJmpok6Yb3tJY6o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwVmSp%2FbtsLjR4FGRw%2FfkI8cMPJmpok6Yb3tJY6o0%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;626&quot; height=&quot;204&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Shared Server UGA I/O 서버 프로세스 데이터베이스 백업 및 복원 작업시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; In-Memory Area &lt;/span&gt;&lt;/blockquote&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;835&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wkJJk/btsLk8YKHmS/CVAlRjT44h1aKnHtFfBxf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wkJJk/btsLk8YKHmS/CVAlRjT44h1aKnHtFfBxf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wkJJk/btsLk8YKHmS/CVAlRjT44h1aKnHtFfBxf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwkJJk%2FbtsLk8YKHmS%2FCVAlRjT44h1aKnHtFfBxf0%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;835&quot; height=&quot;295&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Memoptimize Pool &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvLl6I/btsLkit0DKW/jfBfdqrrrmFKsnf4fAvn11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvLl6I/btsLkit0DKW/jfBfdqrrrmFKsnf4fAvn11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvLl6I/btsLkit0DKW/jfBfdqrrrmFKsnf4fAvn11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvLl6I%2FbtsLkit0DKW%2FjfBfdqrrrmFKsnf4fAvn11%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;327&quot; height=&quot;303&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;303&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;  Memoptimize Pool이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hash Index + Buffers로 구성됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼캐시와 동일하지만, aging out이 없음. 메모리에 계속 keeping해둠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, In-memory hash index 를 이용하여 빠른 key lookup을 제공&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;MEMOPTIMIZE_POOL_SIZE&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;단, 반드시 PK가 반드시 있어야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; PGA(Program Global Area) &lt;/span&gt;&lt;/blockquote&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;528&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oonJu/btsLklqPuvo/iM1PKDIDFeSUSY82ZL3GN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oonJu/btsLklqPuvo/iM1PKDIDFeSUSY82ZL3GN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oonJu/btsLklqPuvo/iM1PKDIDFeSUSY82ZL3GN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoonJu%2FbtsLklqPuvo%2FiM1PKDIDFeSUSY82ZL3GN1%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;528&quot; height=&quot;430&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; PGA란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 각각 각자 사용하는 영역.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user가 session 생성하면서 PGA가 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 받자마자 cursor stack영역에 private SQL area 생성함. 이를, 해당 영역을 포인트로 잡고 있어서 이를, cursor 라고함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, SGA의 shared SQL area에 해당 정보가 있으면 가져다 써.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aging되지 않도록 shared SQL area에 포인터로 잡아둬. 이를, shared cursor 라고 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Stack Space : 서버 프로세스 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Session Memory : 세션정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Cursor Stack : 서버가 활동 안하면, 비어있다가, user명령어 받자마자 parse단계 이전에, private SQL area 생성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. SQL Work Area : 해당 영역에서 sorting 작업 이루어짐. 줄세우기!! sorting하려는데 영역 부족하면? 쪼개서 tempfile에 임시중간결과 저장해두며 sorting함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* UGA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Session + Cursor + SQL work Area로 구성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Background Processes &lt;/span&gt;&lt;/blockquote&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;509&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s9hDx/btsLlqdEVpF/ksvwtQ8kSK4cG3JnjneuE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s9hDx/btsLlqdEVpF/ksvwtQ8kSK4cG3JnjneuE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s9hDx/btsLlqdEVpF/ksvwtQ8kSK4cG3JnjneuE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs9hDx%2FbtsLlqdEVpF%2FksvwtQ8kSK4cG3JnjneuE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;280&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. Database Writer Process(DBWn)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY0zfL/btsLkb9O3uA/F4XkmQBVEmZE6nG36u0Pl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY0zfL/btsLkb9O3uA/F4XkmQBVEmZE6nG36u0Pl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY0zfL/btsLkb9O3uA/F4XkmQBVEmZE6nG36u0Pl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY0zfL%2FbtsLkb9O3uA%2FF4XkmQBVEmZE6nG36u0Pl0%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;496&quot; height=&quot;173&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- server 가 변경한 dirty buffer 를 datafile 에 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- db_writer_processes : 100 까지 지정가능(CPU 숫자에 따라)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Checkpoint : DBWn가 dirty buffer를 datafile에 기록하는 작업&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;  Checkpoint 누가한다고요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBWR : 메인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LGWR : 조연&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CKPT : 스텝정도..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Checkpoint&amp;nbsp; 발생시기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) DB정상종료시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shutdown시, DB Buffer Cache에서 dirty버퍼 빨리 DataFile로 내려ㅡㅡ!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내리기 전에, DBWR가 Log먼저 확인함. LGWR이 Redo Log File에 내린 거 확인 후, DBWR이 Datafile로 내린다.&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;이후 접속시, 모든 데이터 파일의 SCN을 확인해서 CKPT, DBWR, LGWR 모두 정상적으로 동기화됐구나 확인함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Log Swtich시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redo Log File은 1개로 사용하면 안됨. 꼭 2개 두고 사용해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 로그파일 꽉 차서 두번째 로그파일로 넘어갈때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Checkpoint가 발생됨.&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;Drity Buffer가 미처 못 내려갔는데, 복구해야하면?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redo Log File이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, Buffer에서 Data File에 안전하게 내려가있는 상태면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redo Log File 필요 없어. Dirty버퍼 내리면 됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 90% of the size of the smallest redo log file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Incremental CheckPoint&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;900초 분량의 recovery 공간만 남ㄴ겨두고 분량 조절함.&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;fast_start_io_target&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Log Writer Process(LGWR) &lt;/span&gt;&lt;/blockquote&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;520&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOo3H/btsLj0m0u7v/GC70owpeKtBzzlCZBXnhEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOo3H/btsLj0m0u7v/GC70owpeKtBzzlCZBXnhEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOo3H/btsLj0m0u7v/GC70owpeKtBzzlCZBXnhEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOo3H%2FbtsLj0m0u7v%2FGC70owpeKtBzzlCZBXnhEK%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;520&quot; height=&quot;157&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 일할 때, 병목현상 잦아짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그파일 꽉 찼는데, DBWR이 너무 느려서 DataFile로 아직 못 내렸어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 계속 작업을 수행하면 log 쌓여야하는데&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;1) commit 명령수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) log buffer가 1/3이상 or 1M 채워졌을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) DBWR의 시그널에 의해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 3초간격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Checkpoint Process(CKPT) &lt;/span&gt;&lt;/blockquote&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;446&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUKxzO/btsLkkS57lw/7eP6fSKveozHiu7ClcEsUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUKxzO/btsLkkS57lw/7eP6fSKveozHiu7ClcEsUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUKxzO/btsLkkS57lw/7eP6fSKveozHiu7ClcEsUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUKxzO%2FbtsLkkS57lw%2F7eP6fSKveozHiu7ClcEsUK%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;446&quot; height=&quot;266&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;System Monitor Process(SMON) startup &amp;gt; Instance Stated &amp;gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCrTF/btsLiXrfXra/EhNqOSxwuDu94VHzk9DqR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCrTF/btsLiXrfXra/EhNqOSxwuDu94VHzk9DqR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCrTF/btsLiXrfXra/EhNqOSxwuDu94VHzk9DqR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCrTF%2FbtsLiXrfXra%2FEhNqOSxwuDu94VHzk9DqR0%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;449&quot; height=&quot;290&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Instance Recovery수행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, RedoLogFile이 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rolling Forward&amp;nbsp; : 가장 오래된 거 부터 순서대로 로그정보 재연.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Temporary segment 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Process Monitor(PMON) &lt;/span&gt;&lt;/blockquote&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;477&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqLh2e/btsLkb9TiLU/kjNbiy1uMFdztBmllxuP4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqLh2e/btsLkb9TiLU/kjNbiy1uMFdztBmllxuP4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqLh2e/btsLkb9TiLU/kjNbiy1uMFdztBmllxuP4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqLh2e%2FbtsLkb9TiLU%2FkjNbiy1uMFdztBmllxuP4k%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;477&quot; height=&quot;191&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;191&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;갑자기 user process 정상 logout 못하고 사라진 상황이 발생하면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Lock 걸림. 배타Lock&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 리소스문제 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령 내리는 user는 사라졌는데, process와 SGA는 잡고있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요하게 리소스 잡고 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; PMON이 해당 문제를 해결함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transaction rollback해서 Lock 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PGA deallocate 뺏고 좀비상태로 만듦. kill해서 죽이면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Listener Registration Process(LREG) &lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIybZZ/btsLlgvHihr/aIIFPgzD1qG5cOxtLm1FtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIybZZ/btsLlgvHihr/aIIFPgzD1qG5cOxtLm1FtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIybZZ/btsLlgvHihr/aIIFPgzD1qG5cOxtLm1FtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIybZZ%2FbtsLlgvHihr%2FaIIFPgzD1qG5cOxtLm1FtK%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;191&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;191&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;LREG ?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Listener 에게 DB instance, dispatcher 의 정보를 정기적으로 알려줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Recover Process(RECO) &lt;/span&gt;&lt;/blockquote&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;451&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eklGhM/btsLlgCrwJ6/QWc4d2xswIN63aAivu4zDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eklGhM/btsLlgCrwJ6/QWc4d2xswIN63aAivu4zDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eklGhM/btsLlgCrwJ6/QWc4d2xswIN63aAivu4zDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeklGhM%2FbtsLlgCrwJ6%2FQWc4d2xswIN63aAivu4zDK%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;451&quot; height=&quot;170&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;170&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;- 분산 DB 환경에서 원격DB쪽의 중단된 transaction 작업을 cleanup&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 분산 Trasaction의 중단된 작업 Rollback&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A DB에서 B DB로 접근하기 위한 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>buffer cache</category>
      <category>Large pool</category>
      <category>PGA</category>
      <category>redo log buffer</category>
      <category>sga</category>
      <category>SharedPool</category>
      <category>오라클</category>
      <category>오라클디비</category>
      <category>오라클서버아키텍처</category>
      <category>오라클아키텍처</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/146</guid>
      <comments>https://aonee.tistory.com/146#entry146comment</comments>
      <pubDate>Mon, 16 Dec 2024 15:27:32 +0900</pubDate>
    </item>
    <item>
      <title>인프런 AWS 입문자를 위한 강의-Lambda, CloudFront, DynamoDB, API Gateway, Code Commit, Code Deploy, Code pipeline (22.06.01)</title>
      <link>https://aonee.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# Lambda&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Serverless의 주축을 담당 (sever+less, 클라우드가 직접 자동으로 서버를 생성하고 자원 관리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Events를 통하여 Lambda를 실행시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- nodejs, python, java, go등 다양한 언어 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Lambda Function (람다에서 짠 코드)&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;#Lambda비용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Lambda Function이 실행될 때만 지불&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매달 1,000,000 함수 호출시 무료 (그 이후는 유료)&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;#Lambda특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최대 300초(5분) 런타임 시간 허용(대용량데이터 처리시 종종 타임아웃. 람다함수 5분이상 돌라갈 경우임.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최대 512MB의 일시적인 디스크 공간 제공(/tmp)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최대 5MB Deployment Package허용. AWS콘솔에서 직접 코딩을 짤 수 있지만, Local에서 다수의 파일을 하나의 압축파일을 업로드하여 Deployment를 통하여 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 50MB초과시 S3버킷에 저장 후 Lambda에서 파일에 대한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#사용사례&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사례1.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;S3 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Lambda -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;DB&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) S3에 파일 upload하려하면 PutObject 이벤트가 발생됨. 이 이벤트는 람다함수 실행시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Lambda : 데이터를 읽어보고 데이터 변환. 불필요한 데이터 삭제. 깨끗한 데이터 올림. 다리 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;DB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사례2. IOT -&amp;gt; Lambda -&amp;gt; SNS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) &lt;span&gt;IOT&lt;span&gt;&amp;nbsp; :&amp;nbsp; ex) 자동차 주행 데이터가 들어오는 경우. 갑자기 과속을 하여 예상치 못한 속도 측정되면 Topic으로 데이터를 보냄. 동시에 Lambda 호출함.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Lambda : km를&amp;nbsp; ㅡ&amp;gt; 미국 주행단위인&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;mileage로 변경해줄 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;SNS&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;# Lambda실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS Lambda 대시보드 : 함수개수, 코드 스토리지, 전체 계정 동시성, 예약되지 않은 계정 동시성(Concurrency)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS Lambda 대시보드&amp;gt;함수생성&amp;gt;테스트 : 실행결과에 대한 상세 Log정보를 알 수 있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#Lambda 실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황1. S3버킷에 PutObject 발생시, Lambda함수 실행시켜라&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxrcYm/btrDGI8cBlw/3qRQfblrMpyK9A2H28kEqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxrcYm/btrDGI8cBlw/3qRQfblrMpyK9A2H28kEqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxrcYm/btrDGI8cBlw/3qRQfblrMpyK9A2H28kEqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxrcYm%2FbtrDGI8cBlw%2F3qRQfblrMpyK9A2H28kEqk%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;417&quot; height=&quot;188&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Temperature.json 데이터 'S3'로 실시간 업로드된다.(&lt;span&gt;PutObject&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Lambda함수 실행: 특정 온도 넘으면 그 온도가 언제 측정됐는지 주의하라는 메시지를 출력 반대의 경우 출력X.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#CloudFront&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정사용자가 요청하였을 때, Edge Location을 사용하여 정적, 동적, 실시간 웹사이트 컨텐츠를 유저들에게 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컨텐츠 딜리버리 네트워크 CDN(Content Delivery Network)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분산 네트워크 (Distributed Network)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹페이지가 현재 어디에서 불려지는지, 해당 웹 페이지에 접속한 사용자가 어느 지역에 위치하는지 근거하여 Content에 Delivery 해줌.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 우리가 특정 홈페이지를 방문하면 홈페이지 내용이 불려짐. CDN을 통해 html, js, 이미지파일 등 가져오는 속도 비약적으로 상승시킬 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상세예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Origin : 한국에서 현재 웹사이트를 호스팅하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 나라에서 홈페이지 컨텐츠 열리는 속도 latency발생. 웹사이트 호스팅 주소와 멀어질수록 더 느려짐.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중국보다 미국이 훨씬 느림. 지연시간 각각 다름.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전세계 유저들이 접근하려함. 콘텐츠를 한국에서 직접 전달하는 것이&amp;nbsp; 아니라 Edge Location을 통해 콘텐츠를 제공한다. ex) 은행(Origin) 직접 가지 않고 ATM(Edge Location)방문.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Edge Location은 콘텐츠 정보를 캐시에 저장함. 처음 웹사이트 접속시 캐시에 정보가 없다면,&amp;nbsp; Edge Location과 Origin(웹사이트 호스팅) 대화를 주고 받은 후, 그 정보를 Edge Location 캐시에 넣고 유저들에게 콘텐츠를 뿌림.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 콘텐츠들은 EdgeLocation의 캐시에 들어있기 때문에 Latency 현저히 줄읆. 단, 캐시는 영구적이지 않다.&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;# CloudFront 용어정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Edge Location : 콘텐츠들이 캐시(Cache)에 보관되어지는 장소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Origin : 원본 콘텐츠들이 들어있는 곳. 웹서버 호스팅이 되어지는 곳. S3, EC2인스턴스가 오리진이 될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Distribution(분산) : CDN에서 사용되어지며 전세계에 있는 Edge Location들을 하나로 묶어 통칭하는 것.&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;#CloudFront 실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. S3버킷 만들기 (모든 퍼블릭 액세스 차단 체크풀기:전세계에서 access가능한 public access를 만들것이기 때문)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. S3버킷에서 파일 올리기. (퍼블릭 권한관리 : 퍼블릭 읽기 액세스 권한 부여함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. CloudFront&amp;gt;create Distribute&amp;gt;web get started&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- origin domain name&amp;nbsp; : 생성한s3버킷 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Restrict Bucket Acess : yes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Origin Access Identity: create a new Identity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Grant Read Permisions on Bucket : yes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Default Cache Behavior Settings : Redirect HTTP to HTTPS / Get, Head/ use a cache policy / Restrict Viewer Access(승인받은 유저만 사용 가능.) : no, Distribution Settings price class (얼마나 많은 Edge Location사용할래?) / Alternate Domain Name(DNS) / SSL Certificate : Default / HTTP versions : HTTP/2, HTTP/1.1, HTTP/1.0 &amp;gt; create&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#DynamoDB&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NOSQL (Not Only 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;- Auto-Scaling 기능 탑재.(처음 DB만들면 크기가 정해지는데, 어느정도 데이터 추가되면 알아서 크기 늘리고 사용안하면 줄여줌)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- key-value 데이터 모델 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블 생성시 스키마 생성 필요 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모바일, 웹, IOT데이터 사용시 추천됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SSD 스토리지 사용(읽고 쓰는 속도 매우 빠름)&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;#DynamoDB구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블(Table)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아이템 (Items) : 행과 개념이 비슷함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특징(Attributes)-열(column)과 개념이 비슷함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- key-value (key: age, value:78) ex) json, xml&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;#DynamoDB PK(Primary Keys)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PK를 사용하여 데이터 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2가지 PK 유형이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 유형1) 파티션키 (Partition Key)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파티션키:cust_id -&amp;gt; 해시함수(cust_id의 value) -&amp;gt; 94C -&amp;gt; 94C에 저장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 고유 특징 (Unique Attribute)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; 실제 데이터가 들어가는 위치를 결정해줌&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; 파티션키 사용시 동일한 두개의 데이터가 같은 위치에 저장될 수 없음!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 유형2) 복합키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&lt;span&gt; 파티션키 + 정렬키&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&lt;span&gt; 예시) 똑같은 고객이 다른 날짜에 다른 물건을 구매.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&lt;span&gt; 파티션키 : 고객아이디, 정렬키: 날짜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&lt;span&gt; 같은 파티션키의 데이터들은 같은 장소에 보간, 그 다음 정렬키에 의해 데이터가 정렬됨.&lt;/span&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;#DynamoDB데이터 접근관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS IAM으로 관리할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 테이블 생성과 접근권한 부여가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 특정 테이블만, 특정 데이터만 접근 가능케해주는 특별한 IAM역할 존재&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;# DynamoDB Index&amp;nbsp;&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;- 테이블 전체가 아닌 기준점(pivot)을 사용해 쿼리가 이루어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매우 큰 쿼리 성능 효과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2가지 Index 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Local Secondary Index&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Global Secondary Index&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;# Local Secondary Index(LSI)&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;- 똑같은 파티션키 사용, 그러나 다른 정렬키 사용.&amp;nbsp; ex) 테이블 -&amp;gt; 파티션키 동일 뷰(x) 정렬키:2019, 뷰(x) 정렬키: 2020&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# Global Secondary Index(GSI)&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;- ex) 테이블 파티션키:고객아이디 -&amp;gt;&amp;nbsp; &lt;span&gt;뷰(x) 파티션키:카테고리 정렬키:구매날짜 ,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;뷰(x) 파티션키:브랜드 정렬키:구매날짜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# &lt;span&gt;DynamoDB&lt;span&gt; Query vs Scan&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;b&gt;Query&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; - Primary Key를 사용하여 데이터 검색&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; - Query 사용시 모든 데이터(컬럼) 반환&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; - ProjectionExpression&amp;nbsp; 파라미터 : 원하는 컬럼만 가져올 수 있음&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Scan&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 모든 데이터를 불러옴 (primary key&amp;nbsp; 사용x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - ProjectionExpression 파라미터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Query가 Scan보다 훨씬 효율적.&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;# DynamoDB&lt;span&gt;&lt;span&gt; DAX&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- DAX? DynamoDB&lt;span&gt;&lt;span&gt; Accelerator&lt;/span&gt;&lt;/span&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;span&gt;&lt;span&gt;- 클러스터 In-memory 캐시 (인메모리? SSD, 하드디스크가 아닌 캐시로 속도 향상)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 10배 이상의 속도 향상 &amp;gt; 읽기 요청만!&amp;nbsp; (쓰기요청X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ex) Black Friday날 쇼핑 웹사이트 운영(수많은 읽기 요청 예상)&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; - DAX 캐싱 시스템 : 테이블에 데이터 삽입 &amp;amp; 업데이트시 DAX에도 반영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 읽기 요청에 맞는 데이터가 DAX에 들어있을 시, DAX에서 데이터 즉시 반환 (Cache Hit) &amp;lt;-&amp;gt; (Cache Miss)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 쓰기 요청이 많은 애플리케이션에는 부절절함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 읽기 요청이 많지 않은 애플리케이션에는 부절절함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 아직 모든 지역에서 제공되는 서비스는 아님.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;DynamoDB Stream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; &lt;span&gt;DynamoDB&lt;span&gt; 테이블에서 일어나는 일들 (삽입, 수정, 삭제 등)이 일어날 시, 시간적 순서에 맞게 Streams 에 기록&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- Log는 즉각 암호화가 일어나며 24시간 동안 보관됨&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- 주로 이벤트를 기록하고 이벤트 발생을 외부로 알리는 용도(ex) Lambda Function)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- 이벤트 전&amp;amp;후에 대한 상황 보관&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- ex) &lt;span&gt;DynamoDB&lt;span&gt; Streams &amp;lt;- Lambda Function -&amp;gt; SNS(Simple Notification Service) -&amp;gt; SQS (Simple Queue Service) &amp;lt;-&amp;gt; application&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;/span&gt;&lt;/span&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#API&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정물건 장바구니에 담는 것을 요청. 중간에서 복잡한 일 처리해줌. 요청받고 요청 해결해줌.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;#Restful API?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - API 종류들 중 하나&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; -&lt;span&gt; REpresentational State Transfer : 상태에 변화를 주기 위해 그 정보를 server와 client간에 공유하고 주고 받기 위해 사용하는 것.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- CREATE(post), READ(get), UPDATE(put), DELETE(delete)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- JSON형태로 요청을 받고 해결함.&amp;nbsp;&lt;/span&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&gt;#관리가 힘든 RESTful API&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Authentication &amp;amp; Authorization : 회원/비회원/등급별 혜택 달리, 보이는 페이지 달리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- API요청을 모니터링 해야함 : 재고가 5개인데 10개를 주문하려는 경우 경고창 제공 등. 모니터링&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 더 나은 성능을 위해 API요청 캐시 시스템 필요. : 사람이 일일이 처리하기 어려움.&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;#API Gateway&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 뛰어난 확장성 제공 및 API를 만들고 운영하는 모니터링 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모니터링은 CloudWatch를 통해 확인가능&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;- Back-end 서비스 (웹 애플리케이션, EC2)에 들어있는 데이터 접근 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pay As You Go. API를 호출할 때. 얼마나 오래 걸리는지. 얼마나 많은 데이터를 처리하는지에 따라 금액 달라짐.&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;#API Gateway실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;customers -&amp;gt; api gateway -&amp;gt; lambda function -&amp;gt; DynamoDB&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;# CI/CD&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CI : Continuous Integration 지속적인 통합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 개발코드 중앙레파지토리에 올리고 테스트하여 다른 개발자와의 코드 충돌을 막아줌. 나는 내 것에만 최선을 다하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CD : Continuous Deployment 지속적인 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 지속적으로 서비스 수정 및 배포. 사용자가 사용시 전혀 불편함 못 느끼도록 서버다운, 프로그램 일시 중지 막아줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# CI/CD의 장점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자동화 시스템 (Automation) - 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Incremental Change&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ex) 가격에 대한 정보가 안보일 경우, 이를 수정하기 위해 관련 기능들 먼저 수정하고 최종적으로 가격 보이도록 수정.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 작성한 프로그램이 오류날 경우 다시 돌아가고 싶은데 매번 백업 귀찮고, 매번 테스트도 귀찮음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# CI/CD - 중앙 리포지토리 (Repository)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Github&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;#Code Comit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 파일들(코드, 사진, 라이브러리, 등등)을 보관하는 저장소 (Repository) - Github와 매우 유사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동시에 많은 사람들이 저장 장소 접근 및 업데이트 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버전 컨트롤 기능 제공 ex) 언제 어떻게 누가 저장 내용을 변경하였는지&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;# Code Deploy&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Automated Deployment. 자동 배포&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; 1) 새로운 기능들의 빠른 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 소프트웨어 &amp;amp; 서버 다운타임 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) Maual 에러 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2가지 배포방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) Rolling 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 현재 production에서 돌아가는 서버. 새기능25% 새로운 서버로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) Blue/Green 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Blue완전히 shut down, Green을 100% 활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# Code Pipeline&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;&amp;nbsp; 1) 빌드, 테스트, 배포 과정을 관리 : 코드 변경시 Code Pipeline은 이를 감지할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 소프트웨어 및 애플리케이션 출시 자동화 가능 : 빠르고 쉬운 디버깅을 가능케 해줌. 배포(Deployment) VS 출시(Release)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작동방법?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp; Workflow 정의 (Code pipeline) -&amp;gt; 코드 저장소에서 코드 변경 (Code Commit) -&amp;gt; 컴파일, 테스트, 패키지 생성(Code Build) -&amp;gt; staging or prodcution 배포 (Code Deploy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud/AWS</category>
      <category>api gateway</category>
      <category>AWS</category>
      <category>AWS 입문자를 위한 강의</category>
      <category>cloudfront</category>
      <category>Code Commit</category>
      <category>Code Deploy</category>
      <category>Code Pipeline</category>
      <category>dynamodb</category>
      <category>Lambda</category>
      <category>인프런</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/133</guid>
      <comments>https://aonee.tistory.com/133#entry133comment</comments>
      <pubDate>Wed, 1 Jun 2022 16:59:50 +0900</pubDate>
    </item>
    <item>
      <title>인프런 AWS 입문자를 위한 강의-IAM, EC2, EBS, ELB, Route53, RDS, S3, CloudWatch (22.05.31)</title>
      <link>https://aonee.tistory.com/132</link>
      <description>&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;Amazon Web Service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 컴퓨팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버리스(원격에서 서버를 작동시키고 관리하며 메모리활동 지원 스스로 관리) 기능 지원.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#IAM&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Identity and Access Management&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저를 관리하고 접근 레벨 및 권한에 대한 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 회원가입시 root 권한을 얻는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그 외 다른 사용자가 접근할 수 있도록 접근키, 비밀키를 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매우 세밀한 접근 권한 부여 기능. ex) 직원의 권한에 맞는 수준으로만 권한 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비밀번호를 수시로 변경 가능케 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- multi-Factor Authentication(다중인증)기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-정책은 그룹, 역할에 추가시킬 수 있다. 하나의 그룹 안에 다수의 유저가 존재 가능하다. 1)그룹 2)유저 3)역할 4)정책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Universal함 (지역 설정 필요 없음)&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;#IAM정책시뮬레이터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 개발환경(Staging or Develop)에서 실제환경(Production)으로 빌드하기 전 IAM정책이 잘 작동되는지 테스트하기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. IAM과 관련된 문제들을 디버깅하기에 최적화된 툴 (이미 실제로 유저에 부여된 다양한 정책들도 테스트 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 정책시뮬레이터 대시보드&amp;gt; 정책시뮬레이터 dynamodb select action permission&amp;nbsp; run simulation&amp;nbsp; 사용자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dynamodb read only access 사용자 권한 추가 permission&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#IAM&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;p data-ke-size=&quot;size16&quot;&gt;AWS Management Console 액세스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액세스키ID, 비밀 엑세스키&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;#EC2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Elastic Compute Cloud. 유연하게 컴퓨팅클라우드 크기를 조절할 수 있다&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;#EC2지불방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. on-demand&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 시간 단위로 가격이 고정되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 오랜시간동안 선불로 내지 않고 최소한의 비용을 지불하여 EC2인스턴스를 사용하고 싶을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 특히, 앱/프로그램 개발시 최초로 EC2인스턴스에 Deploy할 때 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Reseved&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 한정된 EC2 용량 사용 가능, 1-3년 동안 시간별로 할인 적용 받을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 안정된, 예상 가능한 workload시 권장&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;3. Spot&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 입찰 가격 적용. 가장 큰 할인율을 적용받으며 특히 인스턴스의 시작과 끝기간이 전혀 중요하지 않을 때 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 단순히 비용 절감 시 유용함. 인스턴스의 시작/끝시점에 구애받지 않을 경우 권장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#EBS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Elastic Block Storage&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EC2를 사용하기 위해 EBS라는 디스크 볼륨을 요구한다.&amp;nbsp; 일종의 하드디스크.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저장공간이 생성되어지며 EC2 인스턴스에 부착된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스크 볼륨 위에 File System이 생성된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EBS는 특정 Availability Zone에 생성된다.&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;#Availability Zone(AZ)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 Regoin안에 여러개의 AZ가 존재할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중심으로부터 복사본이 AZ로 뿌려지며, 한쪽 서버가 망가지면 AZ백업을 통해 서비스 제공을 가능케해준다. 일종의 Disaster Recovery.&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;#EBS볼륨타입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;&amp;lt;SSD군&amp;gt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) General Purpose SSD (GP2)&lt;/b&gt; : 최대 10K IOPS를 지원하며 1GB당 3IOPS속도가 나옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Provisioned IOPS SSD (IO1)&lt;/b&gt; : 극도의 I/O률을 요구하는 (ex 매우 큰 DB관리) 환경에서 주로 사용됨. 10K이상의 IOPS를 지원함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;&amp;lt;Magnetic/HDD군&amp;gt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Throughput Optimized HDD (ST1)&amp;nbsp;&lt;/b&gt; : 빅데이터 Datawarehouse, Log프로세싱시 주로 사용 (boot volume으로 사용x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) CDD HDD (SC1)&amp;nbsp;&lt;/b&gt; : 파일서버와 같이 드문 volume접슨시 주로 사용, 역시 boot volume으로 사용 불가능하나 비용은 매우 저렴함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) Magnetic (Standard)&lt;/b&gt; : 디스크 1GB당 가장 싼 비용을 자랑함. Boot volume으로 유일하게 가능함&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;#ELB&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Elastic load Balancers&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;- 하나의 서버로 traffic이 몰리는 병목현상(bottleneck) 방지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Traffic의 흐름을 Unhealthy instance -&amp;gt; healthy instance로 바꿔줌&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;#어떤 ELB타입이 적절하게 사용되어져야하나?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Application Load Balancer&lt;/b&gt; : OSI Layer7에서 작동됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- HTTP, HTTPS와 같은 traffic의 load balancing에 가장 적합함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 고급 request 라우팅 설정을 통하여 특정 서버((루트변경 가능))로 request를 보낼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. network&lt;/b&gt; : OSI layer4에서 작동됨. 매우 빠른 속도를 자랑하며 production환경에서 종종 쓰임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 극도의 performance가 요구되는 TCP traffic에서 적합함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 초당 수백만개의 request를 아주 미세한 delay로 처리 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Classic Laod Balanacer&lt;/b&gt; : 현재 Legacy로 간주됨. 따라서 거의 쓰이지 않음. 시험에 가장 많이 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Layer7의 Http/Https 라우팅 기능 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Layer4의 TCP traffic 라우팅 기능 지원&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;#LoadBalancerError&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 504erorr : 어플리케이션이나 서버가 응답을 받지 못하는 경우 나타는 현상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 웹서버layer, 데이터베이스layer에서 문제해결 가능&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;#x-forwarded-for헤더&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;152.12.3.225(public IP address) -DNS-&amp;gt; ELB 10.0.0.23(private IP address) -&amp;gt; EC2 10.0.0.23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EC2는 private IP address 밖에 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- public IP address를 알려면 x-forwarded-for 헤더를 이용해서 알아낼 수 있다.&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;#Route53&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS에서 제공하는 DNS서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일상에서 종종 사용하는 서버에 이름 부여. 즉, 도메인 주소 구매하여 3가지(EC2 instance, S3 Bucket, Load Balancer) 백엔드로 연결시켜주는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 호스팅 영역 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#EC2실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-putty : ssh를 사용하여 원격 서버에 접속할 수 있도록 해줌&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) putty다운로드. putty.exe&amp;nbsp; puttygen.exe(pem파일을ppk파일로 변환해줌) 두개파일 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) EC2인스턴스시작. &amp;gt; AMI선택 &amp;gt; 인스턴스유형선택(t2micro) &amp;gt;인스턴스 구성&amp;gt;스토리지추가&amp;gt;태그추가&amp;gt;보안그룹구성(ssh, https)&amp;gt; 검토, 새 키페어 생성하면 pem파일이 다운됨. &amp;gt; 인스턴스 시작을 누르면 pending에서 start상태가 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) puttygen에서 pem파일&amp;gt;ppk로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) hostname(ec2-user@awsIpv4퍼블릭IP), port22 + ssh&amp;gt;auth에서 ppk등록&amp;gt; session 저장&lt;/p&gt;
&lt;pre id=&quot;code_1653981379126&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudu su #슈퍼유저
yum update -y #운영체제 업데이트. 관련 패키지 모두 설치해줌.
yum install httpd -y # 아파치 설치. 아파치를 사용하여 인스턴스를 실제 웹서비스처럼 사용할 수 있게 해줌
service httpd start
chkconfig httpd on
cd /var/www/html
ls
vi index.html
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;웹페이지&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;b&gt;#RDS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Relational DB Service&amp;nbsp; 관계형 데이터베이스 (데이터베이스, 테이블, 데이터, 필드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#DataWarehousing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Business Intellignece&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리포트 작성, 데이터분석시 사용 (Production Database -&amp;gt; Data warehousing)&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;#OLTP vs OLAP ★&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OLTP : Transaction. INSERT와 같이 종종 사용되어지는, 혹은 규모가 작은 데이터를 불러올때 사용되는 SQL 쿼리가 필요할때 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Order # 210에만 해당되는 Customer 이름, 주소, 시간 정보 insert&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OLAP : Analytical. 매우 큰 데이터를 불러올때 사용. 주로 덩치가 큰 select 쿼리가 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 특정 회사 부서의 Net profit, Products&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;#RDS-Backup&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Automated Backups(AB) 자동백업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Retention Period(1-35일) 안의 어떤 시간으로 돌아가게 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AB는 그날 생성된 스냅샷과 Transaction logs(TL)을 참고함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디폴트로 AB기능이 설정되어 있으며 백업정보는 S3에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AB동안 약간의 I/O suspension(정지)이 존재할 수 있음 -&amp;gt; Latency 지연시간&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;#DB Snapshots (데이터베이스 스냅샷)&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;- 원본 RDS Instance를 삭제해도 스냅샷은 존재함 (vs AB, AB는 인스턴스 삭제시 스냅샷 모두 삭제됨)&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;#RDS데이터베이스 백업시 원본 일어나는 현상?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 RDS Instance, RDS Endpoint 가 생성됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 원본과 백업본은 완전히 다른 객체가 됨.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#RDS-Multi AZ, Read Rplicas&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Multi AZ&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원래 존재하는 RDS DB에 무언가 변화(e.x: write)가 생길 때 다른 Availability Zone에 똑같은 복제본이 만들어짐 = Synchronize&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS에 의해서 자동으로 관리가 이루어짐 (No admin intervention)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원본 RDS DB에 문제가 생길 시 자동으로 다른 AZ의 복제본이 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Disater Recovery Only! 성능개선을 위해 사용되진 않음. (성능개선은 Read Replica) ★&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 3ec2 -&amp;gt; 1개 RDS ap-northeast-2A &amp;lt;-&amp;gt; ap-northeast-2B: ap-northeast-2A에서 재해발생시, 자동으로 ap-northeast-2B으로&amp;nbsp; fail over함.&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;Read Replica&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- production DB의 읽기 전용 복제본이 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주로 Read-Heavy DB 작업시 효율성의 극대화를 위해 사용됨(Scaling)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Disaster Recovery용도가 아님★&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최대 5개 Read Replica DB 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Read Replica의 Read Replica 생성 가능 (단, Latency 발생)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각각의 Read Replica는 자기만의 고유 Endpoint존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 3ec2 -&amp;gt; RDS연결. ec2인스턴스로부터 쓰기 작업 실행될 시, Read Replica에 의해 똑같은 RDS 복제본이 생성됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;ex) read traffic? main으로 모두 보는 것이 아니라 하나의 인스턴스를 각각의 Read Replica로 연결시킴. 즉, mainDB의 워크로드를 현저히 낮출 수 있으며 성능 높일 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;#ElastiCache&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 클라우드 내에서 In-memory캐시를 만들어줌&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;- Read-Heavy 애플리케이션(SNS, 실시간 top 10)에서 상당한 Latency감소 효과 누림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;★Read-Heavy데이터 사용시 어떤 서비스를 사용해야 최고의 효율을 낼 수 있을까요? ElastiCache&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&gt;ElastiCache &lt;/span&gt;종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Memcached&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Object캐시 시스템으로 잘 알려져 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- ElastiCache는 Memcached의 프로토콜을 디폴트로 따름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- EC2 Auto Scaling 처럼 크리가 커졌다 작아졌다 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 오픈소스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 사용목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;i) 가장 단순한 캐싱 모델이 필요한가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;ii) Object caching이 주된 목적인가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;iii) 캐시 크기를 마음대로 scaling하기를 원하나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Redis&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Key-value, Set, List와 같은 형태의 데이터를 In-Memory에 저장 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오픈소스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- multi-AZ(재해복구) 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 사용목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;i) List, Set과 같은 데이터셋을 사용하나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;ii) 리더보드처럼 데이터셋의 랭킹을 정렬하는 용도가 필요한가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;iii) Multi AZ기능이 사용되어져야 하나요?&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;#RDS실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터베이스 생성&amp;gt;엔진옵션(mysql etc)&amp;gt;템플릿(프리티어)&amp;gt;설정&amp;gt;DB인스턴스크기&amp;gt;스토리지&amp;gt;가용성 및 내구성&amp;gt;연결-추가연결구성 퍼블릭엑세스기능 아니요/vpc보안그룹 새로 생성 가용영역 기본설정없음&amp;gt;데이터베이스 인증&amp;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;&amp;gt;고급세부정보&lt;/p&gt;
&lt;pre id=&quot;code_1653988516451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
yum install httpd php php-mysql -y
yum update -y
chkconfig httpd on # 아파치서버 켬
service httpd start # 아파치 실행
echo &quot;&amp;lt;?php phpinfo();?&amp;gt;&quot; &amp;gt; /var/www/html/index.php #phpvkdlf todtjd gn wjwkd
cd /var/www/html # todtjdgkf vhfejfh dlehd 
wget https://aws-learner-storage.s3.ap-northeast-2.amazonaws.com/connect.php #파일 다운&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; connect.php 파일&lt;/p&gt;
&lt;pre id=&quot;code_1653989359510&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php 
//username password hostname dbname 등록
$username = &quot;awslearner&quot;; 
$password = &quot;awslearner&quot;; 
$hostname = &quot;yourhostnameaddress&quot;;  //RDS endpoint
$dbname = &quot;awslearner&quot;;

//connection to the database
$dbhandle = mysql_connect($hostname, $username, $password) or die(&quot;MySQL에 연결할 수 없습니다&quot;); 
echo &quot;MySQL 접속 성공! username - $username, password - $password, host - $hostname&amp;lt;br&amp;gt;&quot;; 
$selected = mysql_select_db(&quot;$dbname&quot;,$dbhandle) or die(&quot;MySQL DB 연결 실패... - 다시 시도해보세요!&quot;); 
?&amp;gt;&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;b&gt;#S3&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- simple storage servicve&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 안전하고 가변적인 Object 저장공간을 사용 (ex: Google Cloud)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 편리한 UI인터페이스를 통해 어디서나 쉽게 데이터를 저장하고 불러올 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 크기는 0kb~5tb까지 지원&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; Bucket이라는 이름을 사용함 (디렉토리와 유사함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Bucket은 보편적인 namespace를 사용함&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;#S3 Object구성요소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- key: 파일명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- value : 파일내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- version ID : 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- metadata : 어떤 팀의 owner인지 등 데이터의 상세정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CORS (Cross Origin Resource Sharing) : 한버킷의 파일을 다른 버킷에서 접근가능하도록 해줌(지역상관 x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#S3 Data Consistency Model&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Read after Write Consistency (PUT)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Eventual Consistency (UPDATE, DELETE)&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;# S3스토리지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 일반 S3&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 가장 보편적으로 사용되는 스토리지 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 높은 내구성(Durability, 얼마나 손실없이 잘 복원되는지), 가용성(Avaliability, 얼마나 데이터 접근 용이한지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. S3-IA (Infrequent Access)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 자주 접근되지는 않으나 접근시 빠른 접근이 요구되는 파일이 많을 시 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 일반 S3에 비해 비용이 저렴하나 접근시 추가 비용 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 멀티 AZ를 통한 데이터 저장 =&amp;gt; 가용성 상당히 높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. S3-One Zone IA&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 단일 AZ를 통한 데이터 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 단일&amp;nbsp; AZ에 의한 데이터 접근 제한 (조금 낮은 가용성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 데이터 접근시 S3-IA보다 20% 비용 저렴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Glacier&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 거의 접근하지 않을 데이터 저장 시 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 매우 저렴한 비용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 데이터 접근시 대략 4-5시간 소요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Intelligent Tiering&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 데이터 접근 주기가 불규칙할 때 매우 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 2가지 티어 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Frequent Tier&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Infrequent Tier&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 데이터 접근주기에 따라 두가지 티어중 하나로 선택됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Frequent Tier가 비용이 약간 더 비쌈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 최고의 비용 절감 효율을 누릴 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#S3요금&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GB당 (0.023 per GB 정도)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PUT, GET, COPY 요청 횟수당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 다운로드시 / 다른 리소스로 전송시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- METADATA (object tag)&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;#S3사용 사례&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사례1. 파일 저장소&lt;/b&gt;(로그, 다양한 파일들(이미지, 비디오, 압축파일 등))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사례2. 웹사이트 호스팅&lt;/b&gt; : html, css, javascript등 웹사이트 구성에 필요한 파일 S3에 올려두고 Route53으로 DNS를 생성하여 사용가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사례3. CORS&lt;/b&gt; : Cross Origin Resource sharing. 한 버킷이 다른 버킷의 파일로 접근 가능하게 해줌.&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;#최초S3버킷 생성시 -&amp;gt; 비공개(private)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 public or 공유가능하도록 변경하려면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법1. 버킷 정책 변경 (Bucket policy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법2. 접근 제어 리스트 변경 (Access Control List) : 각 파일마다 접근제어 설정 가능&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;#S3암호화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황1. 파일 업로드/다운로드시&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SSL(Secure Socket Layer) / TLS (Transport Layer Security)&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 data-ke-size=&quot;size16&quot;&gt;i) SSE-S3 : 자동으로 주기적으로 암호 변경 (AES-256 사용됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ii) SSE-KMS : 언제, 누가 암호를 변경했는지 기록해주기 때문에 보안관리에 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iii) SSE-C : 직접 암호 변경 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*SSE : Server Side Encrypt&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;#S3암호화 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PUT 요청이 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- host: bucket이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt; x-amz-server-side-encryption-parameter: AES-256&lt;/b&gt; =&amp;gt; 우리가 파일을 s3에 업로드할 때 헤더에 이것이 있다면 암호화(AES-256)하라는 의미.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화가 걸리지 않은 파일을 버켓에 올리지 못하게 하는 방법 있다. 버켓정챙설정. 저 값이 헤더에 없으면 reject.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#S3실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷만들기:일반구성&amp;gt;퍼블릭액세스차단설정&amp;gt;고급설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷에서 폴더만들어 직접 upload도 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고급설정:다른 AWS계정에 대한 엑세스: ACL(액세스 제어리스트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷레벨에 해당하는 접근 권한이 없기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 버킷정책 정책생성기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#CloudWatch&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;- AWS 리소스 사용의 &lt;b&gt;실시간 모니터링&lt;/b&gt; 기능 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 이벤트(s3버킷 파일 업로드&amp;amp;삭제, S3 버킷 접근시 접근거부 발생, RDS 데이터베이스에 접속 시도)들을 수집하여 로그파일로 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이벤트&amp;amp;알람 설정을 통해&amp;nbsp; SNS, AWS Lambda로 전송 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudWatch 사용 가능 서비스들 : EC2, RDS, S3, ELB 등!&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;#CloudWatch모니터링 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;종류1. Basic Monitoring&lt;/b&gt; : 무료, 5분간격으로 최소의 Metrics&amp;nbsp; 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;종류2. Detailed Monitoring&lt;/b&gt; : 유료, 1분 간격으로 자세한 Metrics 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(자세한? cpu사용량, 디스크사용량, 네트워크 I/O 등)&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;#CloudWatch 사용 사례&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CASE1.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use Case: &lt;b&gt;매일 얼마나 많은 사람들&lt;/b&gt;이 모바일 앱을 사용하는지 알고 싶음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Potential Issue: 특정날에 수많은 traffic이 몰릴 수 있어 병목현상이 생길 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Solution : 매일 traffic rate과 특정 버튼의 유저 클릭 횟수를 분석하여 더 효율적인 앱개발을 할 수 있는 통찰력을 얻을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CASE2.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use Case: &lt;b&gt;특정 시간대&lt;/b&gt;에 웹서버 상태를 점검하여 비용 절감 목표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Potential Issue: 똑같은 비용을 내며 AWS리소스들을 사용하지만 낮시간대와 밤시간대에 필요한 서버의 성능은 달라질 수 있기 때문에 금전적 손실이 생길 수 있음 (주로 밤시간대가 낮시간대보다 서버가 오랫동안 idle)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Solution : 알람 설정을 통하여 특정 threshold에 도달했을 때 개발자에게 상황을 보고해줌으로서 서버관리 가능&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;#CloudWatch-Alarm&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 임의로 정해놓은 값에 도달할 시 Alarm이 울림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Alarm이울릴 시 특정 이벤트들을 작동시킬 수 있음&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;#Alarm State&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Alarm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Insufficient불충분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OK&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;#Billing Alarm&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 우리가 정해놓은 지출 임계값을 초과할 경우 SNS를 통하여 경고를 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud/AWS</category>
      <category>AWS</category>
      <category>AWS 입문자를 위한 강의</category>
      <category>CloudWatch</category>
      <category>EC2</category>
      <category>ELB</category>
      <category>IAM</category>
      <category>RDS</category>
      <category>Route53</category>
      <category>S3</category>
      <category>인프런</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/132</guid>
      <comments>https://aonee.tistory.com/132#entry132comment</comments>
      <pubDate>Tue, 31 May 2022 18:46:41 +0900</pubDate>
    </item>
    <item>
      <title>AWS Cloud Practitioner Essentials -  AWS의 핵심 서비스</title>
      <link>https://aonee.tistory.com/127</link>
      <description>&lt;h3&gt;EC2 (Amazon Elastic Cloud Compute)&lt;/h3&gt;
&lt;h4&gt;EC2란?&lt;/h4&gt;
&lt;p&gt;Amazon Elastic Cloud Compute의 약자이다.&lt;/p&gt;
&lt;p&gt;Compute : 컴퓨팅 또는 서버 리소스를 나타낸다.&lt;/p&gt;
&lt;p&gt;Elastic : 필요에 따라 해당 애플리케이션에 필요한 서버의 양을 자동으로 늘리거나 줄일 수 있다.&lt;/p&gt;
&lt;p&gt;서버라는 말 대신, EC2 인스턴스 라고 부른다.&lt;/p&gt;
&lt;h3&gt;EBS (Amazon Elastic Block Store)&lt;/h3&gt;
&lt;h4&gt;EBS란?&lt;/h4&gt;
&lt;p&gt;EC2 인스턴스의 스토리지 단위로 사용될 수 있다. 따라서 AWS에서 실행 중인 인스턴스에 디스크 공간이 필요할 때마다 EBS 볼륨을 생각하면 된다. 이러한 볼륨은 하드 디스크 또는 SSD 디바이스가 될 수 있다. 사용한 만큼만 지불하면 되고 볼륨이 더 이상 필요하지 않으면 언제라도 삭제하여 요금을 지불하지 않을 수 있다.&lt;/p&gt;
&lt;h4&gt;EBS 특징&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;1) 가용성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;EBS 볼륨은 안정성과 가용성을 목표로 설계된다. 따라서 볼륨에 있는 데이터는 가용 영역에서 실행 중인 여러 서버에 자동으로 복제된다. EBS 볼륨과 하드 디스크 또는 SSD 등과 같은 물리적 미디어 디바이스르 비교했지만, EBS볼륨이 블록 수준 복제 덕분에 더욱 안정적이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 드라이브 유형 선택할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ex) db인스턴스 실행중, db 보조 볼륨으로 db구성. 이는 운영체제에 할당된 볼륨보다 빠른 성능을 발휘할 수 있다. 또는 로그용으로 마그네틱 볼륨을 할당할 수도 있다. 마그네틱이 더 저렴하기 때문.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 스냅샷&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;보다 높은 수준의 데이터 내구성을 제공하기 위해 볼륨의 특정 시점 스냅샷을 생성하는 기능을 제공하며 AWS를 사용하면 언제든지 스냅샷에서 새 볼륨을 다시 생성할 수 있습니다. 개선된 재해 복구 보호를 위해 스냅샷을 공유하거나 다른 AWS 리전으로 스냅샷을 복사한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4) 암호화&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;암호화는 EC2측에서 이루어진다. 따라서 EC2 인스턴스와 AWS 데이터 센터 내부의 EBS 볼륨 간에 이동하는 데이터는 전송 중에 암호화된다. 회사가 성장함에 따라 EBS볼륨에 저장되는 데이터의 양도 늘어날 것이다.&lt;/p&gt;
&lt;p&gt;4) 탄력성&lt;/p&gt;
&lt;p&gt;EBS 볼륨은 용량을 늘리고 다른 유형으로 변경할 수 있으므로 하드디스크에서 SSD로 변경(ex 50GB -&amp;gt; 16TB)할 수 있다. 인스턴스를 중단할 필요도 없다.&lt;/p&gt;
&lt;p&gt;=&amp;gt; EBS가 무엇인지, EBS 볼륨을 생성하여 Linux EC2 인스턴스에 연결하는 방법 데모&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;S3 (Amazon Simple Storage Service)&lt;/h3&gt;
&lt;h4&gt;S3란?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;관리형 클라우드 스토리지 서비스&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;객체를 사실상 무제한으로 저장&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;언제든 어디서나 액세스&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;풍부한 보안 제어 기능 -&amp;gt; IAM를 통해 데이터 엑세스 가능한 사용자 지정 가능&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;S3 특징&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;1) 리전에 중복으로 데이터 저장&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;버킷에 데이터를 저장할 때마다 해당 데이터는 선택한 리전의 여러 AWS 시설에 중복 저장된다. 즉, 어느 한 곳의 데이터가 손실되도 복구할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 원활한 확장을 고려한 설계&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;사용한 양에 대해서만 비용이 청구된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 어디서나 데이터에 액세스 가능&lt;/b&gt;&lt;/p&gt;
&lt;h4&gt;사용 사례&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;1) 애플리케이션 자산 저장&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 정적 웹 호스팅&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 백업 및 재해 복구&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;-&amp;gt; 교차 리전 복제를 지원하도록 구성할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4) 빅데이터를 위한 스테이징 영역&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;-&amp;gt; S3의 확장 가능한 스토리지 및 성능 덕분에 다양한 빅데이터 도구를 사용하여 분석하려는 데이터를 준비하거나 장기간 보관할 수 있다.&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;Amazon S3의 DataStage: Amazon Redshift로 로드되어 Amazon EMR에서 처리되거나, Amazon Athena와 같은 도구를 사용하여 쿼리될 수 있다.&lt;/p&gt;
&lt;p&gt;또한, Snowblall과 같은 AWS Import/Export 디바이스를 사용하여 대량의 볼륨을 Amazon S3로 가져오거나 내보낼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5) 그 외 다수&lt;/b&gt;&lt;/p&gt;
&lt;h2&gt;AWS 글로벌 인프라&lt;/h2&gt;
&lt;p&gt;3가지 주제로 나눌 수 있다.&lt;/p&gt;
&lt;h3&gt;1. AWS 리전&lt;/h3&gt;
&lt;p&gt;2개 이상의 가용 영역을 호스팅하는 지리적 영역이고, AWS 서비스에 대한 구성 수준이다. 리소스를 배포할 때, 리소스가 위치하는 리전을 선택한다.&lt;/p&gt;
&lt;p&gt;이때, 어느 리전이 비용을 최소화하고 규제 요구 사항을 준수하면서도 지연시간을 최적화하는데 도움이 되는지 고려하는 것이 중요하다.&lt;/p&gt;
&lt;p&gt;또한, 비즈니스 요구 사항을 더 잘 충족하기 위해 여러 리전으로 리소스를 배포할 수도 있다.&lt;/p&gt;
&lt;p&gt;ex) 개발자 리소를 한 리전에 배포해야 하지만 기본 고객 기반이 다른 리전에 있는 경우, 개발 자산을 한 리전에 배포하고 고객용 솔루션은 다른 리전에 배포할 수 있다.&lt;/p&gt;
&lt;p&gt;또는 동일한 리소스를 여러 리전에 배포하여 고객의 위치와 상관 없이 전 세계적으로 일관된 경험을 제공할 수 있다.&lt;/p&gt;
&lt;p&gt;최소의 비용으로 짧은 시간 내에 지연 시간을 최소화하고 조직의 민첩성을 향상시킬 수 있다.&lt;/p&gt;
&lt;p&gt;리전은 서로 완전히 분리된 개체이다. 한 리소스는 달느 리전으로 자동 복제되지 않는다.&lt;/p&gt;
&lt;h3&gt;2. 가용 영역&lt;/h3&gt;
&lt;p&gt;특정 리전에 존재하는 데이터 센터들의 모음을 의미. 각 가용 영역은 물리적으로 서로 격리되어 있지만 빠르고 지연 시간이 짧은 네트워크로 서로 연결되어 있다. 각 가용 영역은 물리적으로 구분된 독립적인 인프라이다. 물리적은 물론 논리적으로도 분리되어 있다. 또한, 자체적으로 개별 무정전 전원 공급 장치, 현장 예비 발전기, 냉각 장비 미치 네트워크 및 연결 장치를 보유하고 있다.&lt;/p&gt;
&lt;p&gt;독립적인 전력 회사의 망을 통해 전력이 공급되며, 여러 개의 티어 1 전송 서비스 공급업체를 통해 네트워크로 연결된다.&lt;/p&gt;
&lt;p&gt;가용영역을 격리시켜 다른 영역의 장애로부터 보호하고 특정 리전에서 고가용성 데이터 중복성이 보장된다. 즉, 하나의 영역이 중단되도 다른 영역에서 요청을 처리할 수 있다.&lt;/p&gt;
&lt;p&gt;AWS가 여러 가용 영역에 데이터를 프로비저닝하는 것을 모범사례로 추천하는 이유이다.&lt;/p&gt;
&lt;h3&gt;3. Edge Location&lt;/h3&gt;
&lt;p&gt;Amazon CloudFront라고 하는 콘텐츠 전송 네트워크(CDN)를 호스팅한다.&lt;/p&gt;
&lt;p&gt;Amazon CloudFront는 고객에게 콘텐츠를 전송하는데 사용된다. 콘텐츠에 대한 요청이 자동으로 가장 가까운 Edge Location으로 라우팅되므로 콘텐츠가 더욱 빨리 최종 사용자에게 전송된다. Edge Location의 글로벌 네트워크를 사용하면 최종 고객이 더욱 빠르게 콘텐츠에 엑세스할 수 있다. 일반적으로 Edge Location은 가용영역의 리전과 마찬가지로 인구 밀도가 높은 지역에 위치하기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;VPC (Amazon Virtual Private Cloud)&lt;/h3&gt;
&lt;h4&gt;VPC&lt;/h4&gt;
&lt;p&gt;AWS 클라우드 종량제 온디맨드 컴퓨팅뿐 아니라 관리형 서비스도 제공하며 모두 웹에서 액세스할 수 있다. 이러한 컴퓨팅 리소스 및 서비스는 익숙한 네트워크 구조로 구현된 정상 IP 프로토콜을 통해 액세스할 수 있어야 한다. 고객은 네트워킹 모범 사례를 준수하면서 규제 및 조직의 요구 사항도 충족해야 한다. VPC는 네트워킹 요구 사항을 충족하는 AWS 네트워킹 서비스이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) AWS 클라우드의 프라이빗 가상 네트워크&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;온프레미스 네트워킹과 동일한 개념 사용&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 네트워크 구성을 완벽하게 제어할 수 있도록 허용&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;VPC 내부의 리소스를 격리 및 노출할 수 있는 기능&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 여러 계층의 보안 제어 기능을 제공&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;특정 인터넷 및 내부 트래픽을 허용 및 거부할 수 있는 기능&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4) 다른 AWS 서비스를 VPC에 배포&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;네트워크에 내장된 서비스 고유의 보안&lt;/p&gt;</description>
      <category>Cloud/AWS</category>
      <category>AWS</category>
      <category>EBS</category>
      <category>EC2</category>
      <category>Essential</category>
      <category>S3</category>
      <category>VPC</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/127</guid>
      <comments>https://aonee.tistory.com/127#entry127comment</comments>
      <pubDate>Wed, 10 Feb 2021 04:00:55 +0900</pubDate>
    </item>
    <item>
      <title>TypeORM 개념 및 설치 및 사용방법</title>
      <link>https://aonee.tistory.com/77</link>
      <description>&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/83972360-ade60c00-a91a-11ea-89fb-a7aca14133b2.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;br&gt;

&lt;h3&gt;  &lt;a href=&quot;https://typeorm.io/#/&quot;&gt;Typeorm 공식문서&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;ORM 개요&lt;/h2&gt;
&lt;p&gt;Object-relational mapping, 객체-관계 매핑&lt;/p&gt;
&lt;p&gt;객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해준다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.&lt;/li&gt;
&lt;li&gt;객체 모델과 관계형 모델 간에 불일치가 존재한다.&lt;/li&gt;
&lt;li&gt;ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;br&gt;


&lt;h2&gt;TypeORM 개요&lt;/h2&gt;
&lt;p&gt;express와 관계형 데이터베이스를 조합할 때 자주 사용되는 ORM으로 Sequelize가 있다.&lt;/p&gt;
&lt;p&gt;그리고 요즘 Typescript의 인기와 함께 떠오르는 ORM으로 TypeORM 이 있다.&lt;/p&gt;
&lt;p&gt;Sequelize와 TypeORM 중 어떤 ORM을 사용할지 고민을 많이 했다.&lt;/p&gt;
&lt;p&gt;결국은 TypeORM 을 선택했다. 그 이유는 모델의 정의를 제대로 하면 타입을 정하는 메리트를 최대한으로 얻을 수 있고, 복잡한 모델간의 관계를 형성할 수 있다는 장점이 있기 때문이다. 그리고 TypeORM 을 선호하는 글이 더 많길래 사용해봤다. &lt;/p&gt;
&lt;p&gt;TypeORM 이라는 이름으로 인해 타입스크립트 전용의 ORM같이 느껴지지만, 자바스크립트(ES5, ES6, ES7)도 지원한다.&lt;/p&gt;
&lt;p&gt;TypeORM을 사용하여 개발을 하면 Python의 SQLAlchemy와 같은 Data Mapper 패턴과 Rails와 같은 Active Record 패턴으로 개발할 수 있다.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;


&lt;h4&gt; &lt;a href=&quot;https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md&quot;&gt;Active Record vs Data Mapper&lt;/a&gt;&lt;/h4&gt;
&lt;h2&gt;Active Record 패턴&lt;/h2&gt;
&lt;p&gt;TypeORM에서는 Active Record 패턴과 Data Mapper 패턴 두 종류의 패턴을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;Active Record 패턴은 모델 그 자체에 쿼리 메소드를 정의하고, 모델의 메소드를 사용하여 객체를 저장, 제거, 불러오는 방식이다.&lt;/p&gt;
&lt;p&gt;아래는 공식문서의 예제 코드이며 BaseEntity라는 클래스를 사용하여 새로운 클래스에 상속하게 한 후 사용할 수 있다. 이를 통해 BaseEntity가 갖고 있는 메소드와 static으로 만들어 내는 커스텀 메소드를 이용할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import {BaseEntity, Entity, PrimaryGeneratedColumn, Column} from &amp;quot;typeorm&amp;quot;;

@Entity()
export class User extends BaseEntity {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    isActive: boolean;

    static findByName(firstName: string, lastName: string) {
        return this.createQueryBuilder(&amp;quot;user&amp;quot;)
            .where(&amp;quot;user.firstName = :firstName&amp;quot;, { firstName })
            .andWhere(&amp;quot;user.lastName = :lastName&amp;quot;, { lastName })
            .getMany();
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;아래는 공식문서에 있는 Active Record 예제코드이다.&lt;br&gt;아래와 같이 Acitve Record 패턴은 DB 엔티티에 직접 다룰 수 있도록 new 키워드를 이용하여 새로운 인스턴스를 만들어 사용하는 것이 가능하다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// example how to save AR entity
const user = new User();
user.firstName = &amp;quot;Timber&amp;quot;;
user.lastName = &amp;quot;Saw&amp;quot;;
user.isActive = true;
await user.save();

// example how to remove AR entity
await user.remove();

// example how to load AR entities
const users = await User.find({ skip: 2, take: 5 });
const newUsers = await User.find({ isActive: true });
const timber = await User.findOne({ firstName: &amp;quot;Timber&amp;quot;, lastName: &amp;quot;Saw&amp;quot; });
const timber = await User.findByName(&amp;quot;Timber&amp;quot;, &amp;quot;Saw&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;
&lt;br&gt;


&lt;h2&gt;Data Mapper 패턴&lt;/h2&gt;
&lt;p&gt;Data Mapper 패턴은 분리된 클래스에 쿼리 메소드를 정의하는 방식이며, Repository를 이용하여 객체를 저장, 제거, 불러온다.&lt;br&gt;Active Record 패턴과의 차이점은 모델에 접근하는 방식이 아닌 Repository에서 데이터에 접근한다는 것이다.&lt;/p&gt;
&lt;p&gt;아래는 공식문서의 예제 코드이다. 먼저 클래스를 정의한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import {Entity, PrimaryGeneratedColumn, Column} from &amp;quot;typeorm&amp;quot;;

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    isActive: boolean;

}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;정의한 클래스를 Generic 타입을 이용하여 상속하게 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import {EntityRepository, Repository} from &amp;quot;typeorm&amp;quot;;
import {User} from &amp;quot;../entity/User&amp;quot;;

@EntityRepository()
export class UserRepository extends Repository&amp;lt;User&amp;gt; {

    findByName(firstName: string, lastName: string) {
        return this.createQueryBuilder(&amp;quot;user&amp;quot;)
            .where(&amp;quot;user.firstName = :firstName&amp;quot;, { firstName })
            .andWhere(&amp;quot;user.lastName = :lastName&amp;quot;, { lastName })
            .getMany();
    }

}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;그리고 getRepository()를 사용하여 만들어진 모델을 사용한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const userRepository = connection.getRepository(User);

// example how to save DM entity
const user = new User();
user.firstName = &amp;quot;Timber&amp;quot;;
user.lastName = &amp;quot;Saw&amp;quot;;
user.isActive = true;
await userRepository.save(user);

// example how to remove DM entity
await userRepository.remove(user);

// example how to load DM entities
const users = await userRepository.find({ skip: 2, take: 5 });
const newUsers = await userRepository.find({ isActive: true });
const timber = await userRepository.findOne({ firstName: &amp;quot;Timber&amp;quot;, lastName: &amp;quot;Saw&amp;quot; });&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;
&lt;br&gt;


&lt;h2&gt;Active Record vs Data Mapper&lt;/h2&gt;
&lt;p&gt;공식문서에 의하면 두 패턴은 각각의 장점이 있다고 한다. 아래 패턴별 특징을 고민하여 개발에 적용하면 좋을 듯하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active Record: 규모가 작은 애플리케이션에서 적합하고 간단히 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;Data Mapper: 규모가 큰 애플리케이션에 적합하고 유지보수하는데 효과적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;br&gt;


&lt;h2&gt;TypeORM 설치&lt;/h2&gt;
&lt;h4&gt;Installation&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;npm install typeorm --save

npm install reflect-metadata --save

// global place 의 app.ts에 import 추가하기
import &amp;quot;reflect-metadata&amp;quot;;

npm install @types/node --save

// Install a database driver:
npm install mysql --save &lt;/code&gt;&lt;/pre&gt;&lt;br&gt;
&lt;br&gt;


&lt;h4&gt;Quick start&lt;/h4&gt;
&lt;h5&gt;i. typeorm 설치 및 프로젝트 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;npm install typeorm -g
typeorm init --name 프로젝트이름 --database mysql&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;  프로젝트 디렉토리 구성&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;프로젝트이름
├── src              // place of your TypeScript code
│   ├── entity       // place where your entities (database models) are stored
│   │   └── User.ts  // sample entity
│   ├── migration    // place where your migrations are stored
│   └── index.ts     // start point of your application
├── .gitignore       // standard gitignore file
├── ormconfig.json   // ORM and database connection configuration
├── package.json     // node module dependencies
├── README.md        // simple readme file
└── tsconfig.json    // TypeScript compiler options&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;


&lt;h5&gt;ii. install new project dependencies&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;cd 프로젝트이름
npm install&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;  ormconfig.json&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
   &amp;quot;type&amp;quot;: &amp;quot;mysql&amp;quot;,
   &amp;quot;host&amp;quot;: &amp;quot;localhost&amp;quot;,
   &amp;quot;port&amp;quot;: 3306,
   &amp;quot;username&amp;quot;: &amp;quot;test&amp;quot;,
   &amp;quot;password&amp;quot;: &amp;quot;test&amp;quot;,
   &amp;quot;database&amp;quot;: &amp;quot;test&amp;quot;,
   &amp;quot;synchronize&amp;quot;: true,
   &amp;quot;logging&amp;quot;: false,
   &amp;quot;entities&amp;quot;: [
      &amp;quot;src/entity/**/*.ts&amp;quot;
   ],
   &amp;quot;migrations&amp;quot;: [
      &amp;quot;src/migration/**/*.ts&amp;quot;
   ],
   &amp;quot;subscribers&amp;quot;: [
      &amp;quot;src/subscriber/**/*.ts&amp;quot;
   ]
}&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;host&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;database&lt;/code&gt; and maybe &lt;code&gt;port&lt;/code&gt; options.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;


&lt;h5&gt;iii. 프로젝트 시작&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;


&lt;p&gt;  참고&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md&quot;&gt;https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://typeorm.io/#/&quot;&gt;https://typeorm.io/#/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://velog.io/@josworks27/typeORM-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0&quot;&gt;https://velog.io/@josworks27/typeORM-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>Server</category>
      <category>Active Record</category>
      <category>Data Mapper</category>
      <category>typeorm</category>
      <category>typeorm 사용법</category>
      <category>typeorm 설치</category>
      <category>typeorm이란</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/77</guid>
      <comments>https://aonee.tistory.com/77#entry77comment</comments>
      <pubDate>Sun, 7 Jun 2020 23:58:59 +0900</pubDate>
    </item>
    <item>
      <title>[Babel/Webpack] 바벨과 웹팩을 이용한 ES6 환경 구축</title>
      <link>https://aonee.tistory.com/75</link>
      <description>&lt;h2&gt;Webpack (웹팩)&lt;/h2&gt;
&lt;h3&gt;1. 개념&lt;/h3&gt;
&lt;p&gt;자바스크립트 코드가 많아지면 하나의 파일로 관리하는데 한계가 있다. 그렇다고 여러개의 파일을 로딩할 때의 단점도 존재한다.&lt;/p&gt;
&lt;p&gt;단점 1) 여러개의 파일을 브라우저에 로딩하는 만큼 네트워크 비용을 치뤄야 한다.&lt;/p&gt;
&lt;p&gt;단점 2) 각 파일은 서로의 범위를 침범하면 안되지만, 잘못 작성할 경우 변수 충돌의 위험성이 있다.&lt;/p&gt;
&lt;p&gt;웹팩은 이러한 배경에서 이해할 수 있다.&lt;/p&gt;
&lt;p&gt;기본구조에서 &lt;code&gt;Module, Bundle, Entry, Output, Mode, Plugin&lt;/code&gt; 에 대해 개념을 자세히 정리하려 한다.&lt;/p&gt;
&lt;h3&gt;2. 기본구조&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82874537-0d363a80-9f71-11ea-942b-fa2b41e61a8b.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82874476-f98ad400-9f70-11ea-9394-92b1820cf1a0.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Module&lt;/h4&gt;
&lt;h4&gt;Bundle&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;참조관계에 있는 모듈을 모아 하나의 파일로 묶어준다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;중요한 이유&lt;ul&gt;
&lt;li&gt;모든 모듈을 로드하기 위해 검색하는 시간이 단축된다&lt;/li&gt;
&lt;li&gt;사용하지 않는 코드를 제거해준다&lt;/li&gt;
&lt;li&gt;파일의 크기를 줄여준다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Entry&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;application이 많은 모듈들로 구성이 되어있고 복잡한 참조를 이룬다.&lt;/p&gt;
&lt;p&gt;참조관계를 해석해 의존성 그래프를 만든다.&lt;/p&gt;
&lt;p&gt;의존성 그래프를 만들기 위해 어떤 모듈을 시작점으로 해석할지 결정한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82876369-9fd7d900-9f73-11ea-9ce8-42412f9f7e0d.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Entry에서 의존성 그래프 만들고 번들과정을 거치면 Output에 설정된 정보를 기반으로 번들된 파일이 생성된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82876053-25a75480-9f73-11ea-903d-d0d312b91c4e.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Mode&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;모드키를 통해 빌드환경을 구분지을 수 있다.&lt;/p&gt;
&lt;p&gt;번들과정에서 개발과정인지 프로덕션과정인지에 따라 작업환경이 달라지게 설정할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82876194-5f785b00-9f73-11ea-8fb8-e61dd3706960.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Loader&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;웹팩은 모든 파일을 모듈로 관리한다.&lt;/p&gt;
&lt;p&gt;즉, javascript 파일 뿐 아니라 이미지, 폰트 등 전부 모듈로 관리한다.&lt;/p&gt;
&lt;p&gt;그러나, javascript 밖에 모른다.&lt;/p&gt;
&lt;p&gt;따라서, javascript 가 아닌 파일을 웹팩이 이해할 수 있도록 변경해야한다. 이와 같은 역할을 하는 것이 로더이다.&lt;/p&gt;
&lt;p&gt;로더는 test와 use키로 구성된 객체로 설정할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;test :  로딩할 파일을 지정&lt;/li&gt;
&lt;li&gt;use : 적용할 로더를 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82876222-6901c300-9f73-11ea-9270-d45435819be8.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Plugin&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;번들링의 전체적인 고자어에 여러가지 일들을 할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82876298-8040b080-9f73-11ea-879f-445c8bf3fb11.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h3&gt;3. 설정&lt;/h3&gt;
&lt;h4&gt;i. Webpack 설치&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;npm install webpack webpack-cli --save-dev &lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;ii. babel-loader&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Webpack이 모듈을 번들링할 때 Babel을 사용하여 ES6+ 코드를 ES5 코드로 트랜스파일링하도록 babel-loader를 설치한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;pm install --save-dev babel-loader&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;iii. babel-loader&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;npm script를 변경하여 Babel 대신 Webpack을 실행하도록 수정하자. 아래와 같이 package.json 파일의 scripts를 변경한다. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;scripts&amp;quot;: {
    &amp;quot;build&amp;quot;: &amp;quot;webpack -w&amp;quot;
  },&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;iv. webpack.config.js&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;webpack.config.js은 Webpack이 실행될 때 참조하는 설정 파일이다. 프로젝트 루트에 webpack.config.js 파일을 생성하고 아래와 같이 작성한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;const path = require(&amp;#39;path&amp;#39;);

module.exports = {
  // enntry file
  entry: &amp;#39;./src/js/main.js&amp;#39;,
  // 컴파일 + 번들링된 js 파일이 저장될 경로와 이름 지정
  output: {
    path: path.resolve(__dirname, &amp;#39;dist/js&amp;#39;),
    filename: &amp;#39;bundle.js&amp;#39;
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        include: [
          path.resolve(__dirname, &amp;#39;src/js&amp;#39;)
        ],
        exclude: /node_modules/,
        use: {
          loader: &amp;#39;babel-loader&amp;#39;,
          options: {
            presets: [&amp;#39;@babel/preset-env&amp;#39;],
            plugins: [&amp;#39;@babel/plugin-proposal-class-properties&amp;#39;]
          }
        }
      }
    ]
  },
  devtool: &amp;#39;source-map&amp;#39;,
  // https://webpack.js.org/concepts/mode/#mode-development
  mode: &amp;#39;development&amp;#39;
};&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;v. webpack 실행&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Webpack을 실행하여 트랜스파일링 및 번들링을 실행한다. 트랜스파일링은 Babel이 실행하고 번들링은 Webpack이 실행한다. 만약 이전에 실행시킨 빌드 명령이 실행 중인 상태라면 중지시키고 다시 아래 명령을 실행한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;실행 결과 dist/js 폴더에 bundle.js이 생성되었다. 이 파일은 main.js, lib.js 모듈이 하나로 번들링된 결과물이다.&lt;/p&gt;
&lt;h4&gt;vi. index.html 수정&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;index.html을 아래와 같이 수정하고 브라우저에서 실행해 보자.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;script src=&amp;quot;./dist/js/bundle.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4. zero configuration?&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;특별한 설정서버를 사용하지 않고, 이용가능한 인터넷프로토콜 네트워크를 자동적으로 작성 하는 일종의 기법&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;웹팩 명령어만 실행해도 자주사용되는 웹팩설정 기본적으로 적용시켜준다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;사용방법 ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;src     &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;엔트리의 경로를 src안에 index.js 파일 이름으로 준비해야 동작&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dist&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;번들파일이 위치한 장소도 dist 폴더 안에 있어야 한다.&lt;br&gt;또한, main.js 파일 이름으로 준비해야한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  엔트리와 아웃풋 설정 따로 하지 않아도 번들링된다. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx webpack --target-node&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;번들 파일이 잘 만들어졌는지 실행&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node ./dist/main.js&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Babel&lt;/h3&gt;
&lt;p&gt;IE와 다른 구형 브라우저 ES6의 화살표 함수와 ES7의 지수 연산자를 지원하지 않을 수 있다.&lt;/p&gt;
&lt;p&gt; Babel을 사용하면 위 코드를 아래와 같이 ES5 이하의 버전으로 변환할 수 있다.&lt;/p&gt;
&lt;h4&gt;i. Babel CLI 설치&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;npm i @babel/cli @babel/core&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;ii. babelrc 설정 파일 작성&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Babel을 사용하려면 &lt;code&gt;@babel/preset-env&lt;/code&gt;을 설치해야 한다. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;npm install --save-dev @babel/preset-env&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;iii. 트랜스파일링&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Babel을 사용하여 ES6+ 코드를 ES5 이하의 코드로 트랜스파일링하기위해 package.json 파일에 scripts를 추가한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;scripts&amp;quot;: {
    &amp;quot;build&amp;quot;: &amp;quot;babel src/js -w -d dist/js&amp;quot;
  },&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-w&lt;/p&gt;
&lt;p&gt;타깃 폴더에 있는 모든 파일들의 변경을 감지하여 자동으로 트랜스파일한다. (--watch 옵션의 축약형)&lt;/p&gt;
&lt;p&gt;-d&lt;/p&gt;
&lt;p&gt;트랜스파일링된 결과물이 저장될 폴더를 지정한다. (--out-dir 옵션의 축약형)&lt;/p&gt;
&lt;h4&gt;iv. Babel 플러그인&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Babel을 사용하려면 &lt;code&gt;@babel/preset-env&lt;/code&gt;을 설치해야 한다. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;npm install --save-dev @babel/plugin-proposal-class-properties&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;package.json 파일의 devDependencies에 설치된 것 확인 가능하다.&lt;/p&gt;
&lt;p&gt;설치한 플러그인은 .babelrc 파일에 추가해 주어야 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &amp;quot;presets&amp;quot;: [&amp;quot;@babel/preset-env&amp;quot;],
  &amp;quot;plugins&amp;quot;: [&amp;quot;@babel/plugin-proposal-class-properties&amp;quot;]
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;터미널에서 아래 명령으로 트랜스파일링을 실행&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;트랜스파일링에 성공하면 프로젝트 루트에 dist/js 폴더가 자동 생성되고 트랜스파일링된 main.js와 lib.js가 저장된다.&lt;/p&gt;
&lt;p&gt;트랜스파일링된 main.js를 실행&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node dist/js/main&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;참고&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jeonghwan-kim.github.io/js/2017/05/15/webpack.html&quot;&gt;http://jeonghwan-kim.github.io/js/2017/05/15/webpack.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://poiemaweb.com/es6-babel-webpack-1&quot;&gt;https://poiemaweb.com/es6-babel-webpack-1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://poiemaweb.com/es6-babel-webpack-2&quot;&gt;https://poiemaweb.com/es6-babel-webpack-2&lt;/a&gt;&lt;/p&gt;</description>
      <category>Babel</category>
      <category>Bundle</category>
      <category>Entry</category>
      <category>loader</category>
      <category>module</category>
      <category>webpack</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/75</guid>
      <comments>https://aonee.tistory.com/75#entry75comment</comments>
      <pubDate>Tue, 26 May 2020 19:42:07 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Security] JWT(JSON Web Token) 의 코드 구현</title>
      <link>https://aonee.tistory.com/72</link>
      <description>&lt;p&gt;  깃허브 : 전체 코드 &lt;a href=&quot;https://github.com/devAon/SpringSecurity-JWT&quot;&gt;Spring Boot에 Spring Security와 JWT를 사용해 로그인 구현&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;1. 동작과정&lt;/h1&gt;
&lt;h3&gt;Generating JWT&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82150947-de470700-9894-11ea-8ae1-473762d61e80.jpg&quot; alt=&quot;generate jwt&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client : 로그인 요청 POST (id, pw)&lt;/li&gt;
&lt;li&gt;Server : id, pw가 맞는지 확인 후 맞다면 JWT를 SecretKey로 생성&lt;/li&gt;
&lt;li&gt;Client : Server에게 받은 JWT를 로컬 or 세션에 저장&lt;/li&gt;
&lt;li&gt;Client : 서버에 요청할 때 항상 헤더에 Token을 포함시킴&lt;/li&gt;
&lt;li&gt;Server : 요청을 받을 때마다 SecretKey를 이용해 Token이 유효한지 검증
&lt;ul&gt;
&lt;li&gt;서버만이 SecretKey를 가지고 있기 때문에 검증 가능&lt;/li&gt;
&lt;li&gt;Token이 검증되면 따로 username, pw를 검사하지 않아도 사용자 인증 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Server : response&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82150976-0b93b500-9895-11ea-9ee8-ae2ea3196e8b.jpg&quot; alt=&quot;AuthenticationManager&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;2. Token 유효 검증&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;클라이언트의 요청 (Header : Token)&lt;/li&gt;
&lt;li&gt;Spring의 Interceptor에 의해 요청이 Intercept됨&lt;/li&gt;
&lt;li&gt;클라이언트에게 제공되었던 Token과 클라이언트의 Header에 담긴 Token 일치 확인&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth0 JWT&lt;/code&gt;를 이용해 &lt;code&gt;issuer, expire&lt;/code&gt; 검증&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Validating JWT&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/82150987-12bac300-9895-11ea-8430-a89e4d20a72d.jpg&quot; alt=&quot;validating jwt&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;3. Spring Boot Security + JWT 코드&lt;/h1&gt;
&lt;h2&gt;3-1. dependency 추가&lt;/h2&gt;
&lt;h3&gt;pom.xml&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;0.9.1&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;spring-boot-starter-security&lt;/code&gt;와 &lt;code&gt;jjwt&lt;/code&gt; 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;3-2. Secret Key 설정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hashing algorithm과 함께 사용할 Secret Key를 설정&lt;/li&gt;
&lt;li&gt;Secret Key는 Header, Payload와 결합되어 Hash 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;application.properties&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;jwt.secret=aoneeJjangjwt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;3. JwtUtil&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JWT를 생성하고 검증하는 역할 수행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;io.jsonwebtoken.Jwts&lt;/code&gt; 라이브러리 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;@Component
public class JwtUtil {
    @Value(&quot;${jwt.secret}&quot;)
    private String SECRET_KEY;

    public String extractUsername(String token) {
        return extractClaim(token, Claims::getSubject);
    }

    public Date extractExpiration(String token) {
        return extractClaim(token, Claims::getExpiration);
    }

    public &amp;lt;T&amp;gt; T extractClaim(String token, Function&amp;lt;Claims, T&amp;gt; claimsResolver) {
        final Claims claims = extractAllClaims(token);
        return claimsResolver.apply(claims);
    }
    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }

    private Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    public String generateToken(UserDetails userDetails) {
        Map&amp;lt;String, Object&amp;gt; claims = new HashMap&amp;lt;&amp;gt;();
        return createToken(claims, userDetails.getUsername());
    }

    private String createToken(Map&amp;lt;String, Object&amp;gt; claims, String subject) {

        return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();
    }

    public Boolean validateToken(String token, UserDetails userDetails) {
        final String username = extractUsername(token);
        return (username.equals(userDetails.getUsername()) &amp;amp;&amp;amp; !isTokenExpired(token));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;createToken&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Token 생성
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;claim&lt;/b&gt; : Token에 담을 정보&lt;/li&gt;
&lt;li&gt;&lt;b&gt;issuer&lt;/b&gt; : Token 발급자&lt;/li&gt;
&lt;li&gt;&lt;b&gt;subject&lt;/b&gt; : Token 제목&lt;/li&gt;
&lt;li&gt;&lt;b&gt;issuedate&lt;/b&gt; : Token 발급 시간&lt;/li&gt;
&lt;li&gt;&lt;b&gt;expiration&lt;/b&gt; : Token 만료 시간
&lt;ul&gt;
&lt;li&gt;milliseconds 기준!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;signWith&lt;/code&gt; (알고리즘, 비밀키)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;4. MyUserDetailsService&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DB에서 UserDetail를 얻어와 AuthenticationManager에게 제공하는 역할&lt;/li&gt;
&lt;li&gt;이번에는 DB 없이 하드코딩된 User List에서 get userDetail&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;@Service
public class MyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    	if (&quot;user_id&quot;.equals(username)) {
            return new User(&quot;aonee&quot;,&quot;$2a$10$VKu6eW.2pHLJn3yeW0eMxuEUBxXCq/b2Vo3HwSqROGI2mmYRnXqpm&quot;,new ArrayList&amp;lt;&amp;gt;());
        } else {
            throw new UsernameNotFoundException(&quot;User not found with username: &quot; + username);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Spring Security 5.0에서는 Password를 BryptEncoder를 통해 Brypt화한다.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.javainuse.com/onlineBcrypt&quot;&gt;https://www.javainuse.com/onlineBcrypt&lt;/a&gt; 에서 user_pw를 Bcrypt화
&lt;ul&gt;
&lt;li&gt;$2a$10$VKu6eW.2pHLJn3yeW0eMxuEUBxXCq/b2Vo3HwSqROGI2mmYRnXqpm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;id : user_id, pw: user_pw로 고정해 사용자 확인&lt;/li&gt;
&lt;li&gt;사용자 확인 실패시 throw Exception&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;5. LoginController&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;사용자가 입력한 id, pw를 body에 넣어서 &lt;b&gt;POST&lt;/b&gt; API mapping &lt;b&gt;/authenticate&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;사용자의 id, pw를 검증&lt;/li&gt;
&lt;li&gt;&lt;b&gt;jwtUtil&lt;/b&gt;을 호출해 Token을 생성하고 &lt;b&gt;JwtResponse&lt;/b&gt;에 Token을 담아 return ResponseEntity&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@RestController
@CrossOrigin
public class LoginController {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtUtil jwtTokenUtil;

    @Autowired
    private MyUserDetailsService userDetailsService;


    @GetMapping(&quot;/main&quot;)
    public String main(){
        return &quot;Welcome!! This is main page&quot;;
    }

    @GetMapping(&quot;/hello&quot;)
    public String hello(){
        return &quot;hello&quot;;
    }

    @PostMapping(&quot;/authenticate&quot;)
    public ResponseEntity&amp;lt;?&amp;gt; createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {
        try {
            authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            authenticationRequest.getUsername(),
                            authenticationRequest.getPassword())
            );

        } catch (BadCredentialsException e) {
            throw new Exception(&quot;Incorrect username or password&quot;, e);
        }

        final UserDetails userDetails = userDetailsService
                .loadUserByUsername(authenticationRequest.getUsername());
        final String jwt = jwtTokenUtil.generateToken(userDetails);
        return ResponseEntity.ok(new AuthenticationResponse(jwt));
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;6. AuthenticationRequest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;사용자에게서 받은 id, pw를 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;@Getter
@Setter
public class AuthenticationRequest {
    private String username;
    private String password;

    public AuthenticationRequest() {
    }

    public AuthenticationRequest(String username, String password) {
        this.username = username;
        this.password = password;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;7. AuthenticationResponse&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;사용자에게 반환될 JWT를 담은 Response&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;@Getter
public class AuthenticationResponse {
    private final String jwt;

    public AuthenticationResponse(String jwt) {
        this.jwt = jwt;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;8. JwtRequestFilter&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Client의 Request를 Intercept해서 Header의 Token가 유효한지 검증&lt;/li&gt;
&lt;li&gt;if 유효한 Token
&lt;ul&gt;
&lt;li&gt;Spring Security의 Authentication을 Setting, to specify that the current user is authenticated&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private MyUserDetailsService userDetailsService;

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        final String authorizationHeader = request.getHeader(&quot;Authorization&quot;);

        String username= null;
        String jwt = null;

        if(authorizationHeader != null &amp;amp;&amp;amp; authorizationHeader.startsWith(&quot;Bearer &quot;)){
            jwt = authorizationHeader.substring(7);
            username = jwtUtil.extractUsername(jwt);
        }

        if(username != null &amp;amp;&amp;amp; SecurityContextHolder.getContext().getAuthentication() == null){
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);

            if(jwtUtil.validateToken(jwt, userDetails)){
                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
                        new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        chain.doFilter(request,response);
    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Server/Spring</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/72</guid>
      <comments>https://aonee.tistory.com/72#entry72comment</comments>
      <pubDate>Sun, 17 May 2020 23:58:35 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Security] JWT(JSON Web Token) 의 모든 것</title>
      <link>https://aonee.tistory.com/70</link>
      <description>&lt;h2&gt;1. 정의&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;#JSON #Claim_based_Token #Self_contained&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;JSON Web Token의 약자로 클레임 토큰 기반의 방식.&lt;/p&gt;
&lt;p&gt;클라이언트의 세션 상태를 저장하는 것이 아닌&lt;br /&gt;필요한 정보를 토큰 body에 저장해 클라이언트에 저장해두고 이를 증명서 처럼 사용한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claim based?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Claim : 사용자에 대한 프로퍼티 / 속성&lt;/li&gt;
&lt;li&gt;토큰 자체가 정보&lt;/li&gt;
&lt;li&gt;Self-contained : 자체 포함, 즉 토큰 자체가 정보&lt;/li&gt;
&lt;li&gt;key / value 로 이루어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 구성&lt;/h2&gt;
&lt;p&gt;{Header}.{Payload}.{Verify Signature}&lt;br /&gt;3가지 정보를 '.'로 연결하여 사용한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://jwt.io/&quot;&gt;JWT 공식사이트&lt;/a&gt; 를 통해 JWT를 생성 및 검증할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/81495668-f2b35e80-92ec-11ea-82ec-d886f275c0da.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Header&lt;/b&gt; : JWT 토큰의 유형이나 사용된 해시 알고리즘의 정보가 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Payload&lt;/b&gt; : 클레임(Claims)을 포함한다. 즉, 클라이언트에 대한 정보가 담겨있다.&lt;br /&gt;또한 여기에는 iss, sub, aud, exp, nbf, iat, jti 와 같은 기본 정보가 들어간다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;1. 등록된 클레임&lt;/b&gt; ( &lt;a href=&quot;https://tools.ietf.org/html/rfc7519#section-4.1&quot;&gt;&lt;b&gt;Registered claims&lt;/b&gt;&lt;/a&gt; &lt;b&gt;)&lt;/b&gt;&lt;br /&gt;이미 정의된 클레임들로 무조건 따라야 하는 것은 아니지만 권장한다.&lt;br /&gt;&lt;b&gt;iss&lt;/b&gt; (issuer, 토큰 발행자), &lt;b&gt;exp&lt;/b&gt; (expiration time, 토큰 만료시간), &lt;b&gt;sub&lt;/b&gt; (subject, 토큰 제목), &lt;b&gt;aud&lt;/b&gt;(audience, 토큰 대상자) 와 같은 클레임들이 있습니다.&lt;br /&gt;클레임의 이름은 compact를 위해 3글자로 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 공개된 클레임&lt;/b&gt; ( &lt;a href=&quot;https://tools.ietf.org/html/rfc7519#section-4.2&quot;&gt;&lt;b&gt;Public claims&lt;/b&gt;&lt;/a&gt; )&lt;br /&gt;JWT를 사용하는 사람들에 의해 정의되는 클레임이다.&lt;br /&gt;클레임 충돌을 피하기 위해서 &lt;a href=&quot;https://www.iana.org/assignments/jwt/jwt.xhtml&quot;&gt;IANA JSON Web Token Registry&lt;/a&gt; 에 정의하거나 URI 형식으로 정의해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. 비공개 클레임&lt;/b&gt; ( &lt;a href=&quot;https://tools.ietf.org/html/rfc7519#section-4.3&quot;&gt;&lt;b&gt;Private claims&lt;/b&gt;&lt;/a&gt; )&lt;br /&gt;GUI, 서버, 그 외 모듈간에 협의한 클레임이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;iss&lt;/b&gt;: 토큰 발급자 (issuer)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;sub&lt;/b&gt;: 토큰 제목 (subject)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;aud&lt;/b&gt;: 토큰 대상자 (audience)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;exp&lt;/b&gt;: 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 (예:&amp;nbsp;1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nbf&lt;/b&gt;: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iat&lt;/b&gt;: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의&lt;span&gt;&amp;nbsp;&lt;/span&gt;age&lt;span&gt;&amp;nbsp;&lt;/span&gt;가 얼마나 되었는지 판단 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;jti&lt;/b&gt;:&amp;nbsp;JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Signature&lt;/b&gt; : header에서 지정한 알고리즘과 secret key로 Header와 Payload를 담는다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;서명을 통해 메시지가 중간에 변경되지 않았다는 것을 검증하며,&lt;br /&gt;JWT를 보낸 사람이 신뢰할 수 있는 대상이라는 것도 알 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3. 특징&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;1. 표준 RFC 7519&lt;/b&gt;&lt;br /&gt;JSON Web Token은 정보를 안전하게 전송하기 위해 정의된 공개된 표준 (RFC 7519) 이다&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;2. Self-contained ( 자가 수용적 )&lt;/b&gt;&lt;br /&gt;JWT 자체적으로 필요한 모든 정보를 포함한다.&lt;br /&gt;헤더 정보와, 실제 전달할 데이터, 검증할 수 있는 서명 데이터를 모두 포함하고 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;3. 신뢰 가능&lt;/b&gt;&lt;br /&gt;JWT는 디지털 서명에 의해 검증할 수 있으며 신뢰할 수 있다.&lt;br /&gt;비밀 값을 사용하는 HMAC 알고리즘이나 RDS or ECDSA와 같은 공개키, 개인키 쌍으로 서명될 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;4. Payload는 공개 데이터&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;JWT에 정보는 누구나 &lt;a href=&quot;https://jwt.io/&quot;&gt;https://jwt.io/&lt;/a&gt; 페이지에 접속해서 정보를 확인할 수 있다.&lt;br /&gt;따라서 비밀번호와 같은 보안이 필요한 정보는 payload에 저장하면 안된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;5. JWT의 Secret Key&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;JWT에서는 정보는 공개가 되어있지만 해시 값을 통해서 정보가 유효한지 확인을 하게 됩니다.&lt;br /&gt;따라서 시크릿 키가 유출이 된다면 JWT에서 보안상에 큰 위협이 된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 과정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;4.1 로그인&lt;/b&gt;&lt;/p&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/81495542-e8449500-92eb-11ea-9cc5-316568379779.png&quot; alt=&quot;image&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;client는 Auth Server에 로그인을 합니다. 이때 Auth Server는 application server 내에 위치할 수도 있으며, facebook, goole과 같은 제 3자가 될 수도 있다.&lt;/p&gt;
&lt;p&gt;&amp;bull; Auth Server에서 인증을 완료한 사용자는 JWT Token을 전달받는다.&lt;/p&gt;
&lt;p&gt;&amp;bull; client는 application server에 resource를 요청할때 앞서 전달받은 JWT Token을 Authorization Header에 전달한다.&lt;/p&gt;
&lt;p&gt;&amp;bull; application server는 전달받은 JWT Token이 유효하면 200 ok와 함께 data를 response 한다.&lt;/p&gt;
&lt;p&gt;이때 중요한점은 application server가 더이상 로그인한 사용자의 session을 관리하지 않는다는 것 입니다. 단지 전달받은 JWT가 유효한 Token인지만 확인하면 된다.&lt;/p&gt;
&lt;p&gt;cors를 enable 하지 않으면 기본적으로 application server는 외부 domain에 resource 접근을 허용하지 않는다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;또한, outside domain인 client가 application server에 resource를 요청하기위해 application server는 cors를 enable 해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;4.2 사용 환경&lt;/b&gt;&lt;/p&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/81495622-8c2e4080-92ec-11ea-971a-f9e1ec2689bf.png&quot; alt=&quot;image&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;하나의 End Point가 아닌 Mobile/Web 등의 multiple endpoint 환경이라면 통합적인 인증/인가 환경을 제공하기위해선 반드시 JWT를 사용한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;보편적인 예로, React로 client를 구성하고 REST API 서버를 따로 두는 경우에는 JWT를 사용한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3rd party에게 public 하게 open 한 REST Endpoint가 존재할 경우 해당 3rd party의 인증/인가를 관리하기 위해 JWT를 사용한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. 장점 / 단점 &amp;amp; 도입시 고려사항&lt;/h2&gt;
&lt;h3&gt;장점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;다양한 클라이언트(web,ios,android) 커버 가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;보안 이슈&lt;br /&gt;사용자가 자신의 비밀 값으로 서버에 로그인 하게 되면, 서버는 JWT를 리턴합니다. &lt;b&gt;token을 인증 값으로 사용하게 되면 기존 쿠키/세션을 사용하는 방식보다 많은 보안 이슈를 막을 수 있습니다&lt;/b&gt;. 서버는 GUI로부터 받은 JWT가 유효할 경우, resouce를 사용하도록 허용합니다. 또한 JWT는 쿠키를 사용하지 않기 때문에, Cross-Origin Resource Sharing (CORS) 이슈가 발생하지 않습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데이터 용량: JWT는 기존의 XML보다 덜 복잡하고 인코딩 된 사이즈가 작습니다. 따라서 HTTP와 HTML 환경에서 사용하기 좋습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;사용성: JSON parser는 대부분의 프로그래밍이 지원하기 때문에 XML을 사용하는 SAML 보다 만들기 쉽습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CORS(Cross-origin resource sharing) 문제때문에 주로 쓴다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;session의 한계 극복 가능&lt;/p&gt;
&lt;p&gt;&lt;b&gt;세션의 한계&lt;/b&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;서버 확장시 세션 정보의 동기화 문제&lt;/p&gt;
&lt;p&gt;서버가 스케일아웃 돼서 여러 개가 생기면 각 서버마다 세션 정보가 저장로그인시(서버1), 새로고침(서버2) 로 접근하면 서버는 인증이 안됐다고 판단&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;서버 / 세션 저장소의 부하&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;웹 / 앱 간의 상이한 쿠키-세션 처리 로직&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;단점 &amp;amp; 도입시 고려사항&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Self-contained&lt;/b&gt;&lt;br /&gt;토큰 자체에 정보가 있다는 사실은 양날의 검&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;토큰 길이&lt;/b&gt;&lt;br /&gt;토큰 자체 payload 에 Claim set을 저장하기 때문에 정보가 많아질 수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있음&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;payload 암호화&lt;/b&gt;&lt;br /&gt;payload 자체는 그냥 인코딩된 데이터&lt;br /&gt;중간에 payload를 탈취하면 디코딩을 통해 테이터를 볼 수 있음&lt;br /&gt;payload에 중요 데이터를 넣지 않아야 함&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Stateless&lt;/b&gt;&lt;br /&gt;토큰은 한번 만들면 서버에서 제어가 불가능&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  참고&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://velopert.com/2389&quot;&gt;https://velopert.com/2389&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=x6bzYyMY0GA&amp;amp;list=PLVApX3evDwJ1d0lKKHssPQvzv2Ao3e__Q&amp;amp;index=4&quot;&gt;https://www.youtube.com/watch?v=x6bzYyMY0GA&amp;amp;list=PLVApX3evDwJ1d0lKKHssPQvzv2Ao3e__Q&amp;amp;index=4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/sjk5766/jwt-json-web-token-%EC%86%8C%EA%B0%9C-49e211c65b45&quot;&gt;https://medium.com/sjk5766/jwt-json-web-token-%EC%86%8C%EA%B0%9C-49e211c65b45&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sanghaklee.tistory.com/47&quot;&gt;https://sanghaklee.tistory.com/47&lt;/a&gt;&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <category>jwt</category>
      <category>security</category>
      <category>spring</category>
      <category>springboot</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/70</guid>
      <comments>https://aonee.tistory.com/70#entry70comment</comments>
      <pubDate>Sun, 10 May 2020 19:04:37 +0900</pubDate>
    </item>
    <item>
      <title>[spring boot] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스-1</title>
      <link>https://aonee.tistory.com/65</link>
      <description>&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/proxy/lAqclcORH4mAvROIYCwEHOHVN2DKjlGQarHTc6qkFwIREo-_T7jBrG5CCfmRBrxn2UTt3LviaNc9oxNQX8dc8r67S3wtVcZaWt4KLEkFIO5Vwg9Wk2L03A&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;✔ 프로젝트 개발환경**&lt;/h2&gt;
&lt;p&gt;프로젝트 개발 환경은 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IDE : IntelliJ IDEA Ultimate&lt;/li&gt;
&lt;li&gt;Git Tools : Git Bash&lt;/li&gt;
&lt;li&gt;OS : Window&lt;/li&gt;
&lt;li&gt;SpringBoot 2.2.6&lt;/li&gt;
&lt;li&gt;Java8&lt;/li&gt;
&lt;li&gt;Gradle&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;✔프로젝트 코드 ( 깃허브 )&lt;/h2&gt;
&lt;p&gt;  &lt;a href=&quot;https://github.com/devAon/SpringBoot-WebService&quot;&gt;https://github.com/devAon/SpringBoot-WebService&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;✔ 프로젝트 코드 및 구현 내용 설명**&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;build.gradle&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;plugins {
    id &amp;#39;org.springframework.boot&amp;#39; version &amp;#39;2.2.6.RELEASE&amp;#39;
    id &amp;#39;io.spring.dependency-management&amp;#39; version &amp;#39;1.0.9.RELEASE&amp;#39;
    id &amp;#39;java&amp;#39;
}

group = &amp;#39;com.devAon&amp;#39;
version = &amp;#39;0.0.1-SNAPSHOT&amp;#39;
sourceCompatibility = &amp;#39;1.8&amp;#39;

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

//Spring Boot Overriding
ext[&amp;#39;hibernate.version&amp;#39;] = &amp;#39;5.2.11.Final&amp;#39;

dependencies {
    implementation &amp;#39;pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.0&amp;#39;
    implementation &amp;#39;org.springframework.boot:spring-boot-starter-actuator&amp;#39;
    implementation &amp;#39;org.springframework.boot:spring-boot-starter-data-jpa&amp;#39;
    implementation &amp;#39;org.springframework.boot:spring-boot-starter-web&amp;#39;
    compileOnly &amp;#39;org.projectlombok:lombok&amp;#39;
    runtimeOnly &amp;#39;com.h2database:h2&amp;#39;
    annotationProcessor &amp;#39;org.projectlombok:lombok&amp;#39;
    testImplementation(&amp;#39;org.springframework.boot:spring-boot-starter-test&amp;#39;) {
        exclude group: &amp;#39;org.junit.vintage&amp;#39;, module: &amp;#39;junit-vintage-engine&amp;#39;
    }

}

test {
    useJUnitPlatform()
}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;  중요한 개념 정리  &lt;/h3&gt;
&lt;h2&gt;✔ SpringBoot &amp;amp; JPA로 간단 API 만들기&lt;/h2&gt;
&lt;h3&gt;SpringBoot &amp;amp; JPA 사용하면 좋은점?&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;진짜 집중해야할 비즈니스 로직에만 집중할 수 있다.&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Entity의 PK는 Long 타입의 Auto_increment 사용이 좋다.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;이렇게 하면 MySQL 기준으로 bigint 타입이다.  
주민등록번호와 같은 비지니스상 유니크키나, 여러키를 조합한 복합키로 PK를 잡을 경우 난감한 상황이 발생할 수 있는데 이를 예방할 수 있다.&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Spring Boot 2.0 에선 PK의 Auto_increment 를 위해 strategy = GenerationType.IDENTITY 옵션을 추가해야한다.&lt;/h3&gt;
&lt;p&gt;@GeneratedValue(strategy = GenerationType.IDENTITY)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Hibernate 5.0부터 MySQL의 AUTO는 IDENTITY가 아닌 **TABLE을 기본 시퀀스 전략**으로 선택된다.

우리의 의도대로 Auto\_increment 동작하도록 하기 위해 `@GeneratedValue`의 전략을 `GenerationType.IDENTITY`로 지정&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Entity 클래스를 생성시, 무분별한 setter 메소드 생성하지 말자&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;무분별하게 getter/setter를 생성할 경우,

해당 클래스의 인스턴스 값들이 언제 어디서 변해야하는지 코드상으로 명확히 구분할수가 없어서

차후 기능변경시 복잡해질 수 있다.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;​ 대신, 기본생성자를 @NoArgsConstructor(access = AccessLevel.PROTECTED)로 막아두고&lt;/p&gt;
&lt;p&gt;​ setter 메소드 없이 DB에 insert를 하기 위해&lt;/p&gt;
&lt;p&gt;​ 생성자 대신 @Builder를 통해 채워야할 필드가 무엇인지 명확하게 지정해주고&lt;/p&gt;
&lt;p&gt;​ 생성시점에 값을 채워주면 된다.&lt;/p&gt;
&lt;h3&gt;테스트 코드 작성하는 방법&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@SpringBootTest
public class PostsRepositoryTest {
    ...

@Test
    public void 게시글저장_불러오기() {
        //given
        postsRepository.save(Posts.builder()
                .title(&amp;quot;테스트 게시글&amp;quot;)
                .content(&amp;quot;테스트 본문&amp;quot;)
                .author(&amp;quot;jojoldu@gmail.com&amp;quot;)
                .build());

        //when
        List&amp;lt;Posts&amp;gt; postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle(), is(&amp;quot;테스트 게시글&amp;quot;));
        assertThat(posts.getContent(), is(&amp;quot;테스트 본문&amp;quot;));
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;JUnit을 통해 어떤 값을 입력할 경우 어떤 결과가 반환되는지 검증할수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BDD(Behaviour-Driven Development)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;given&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;테스트 기반 환경을 구축하는 단계&lt;/li&gt;
&lt;li&gt;여기선&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@builder&lt;/code&gt;의 사용법도 같이 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;when&lt;ul&gt;
&lt;li&gt;테스트 하고자 하는 행위 선언&lt;/li&gt;
&lt;li&gt;여기선 Posts가 DB에 insert 되는것을 확인하기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;then&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;테스트 결과 검증&lt;/li&gt;
&lt;li&gt;실제로 DB에 insert 되었는지 확인하기 위해 조회후, 입력된 값 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;@Autowired&lt;/code&gt; 대신 &lt;code&gt;@AllArgsConstructor&lt;/code&gt; 사용하기&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;스프링프레임워크에선 Bean 을 주입받는 방식들이 아래와 같이 있다.

-   `@Autowired`
-   setter
-   생성자&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이중 가장 권장하는 방식이 &lt;strong&gt;생성자로 주입받는 방식&lt;/strong&gt;이다.&lt;br&gt;(&lt;code&gt;@Autowired&lt;/code&gt;는 &lt;strong&gt;비권장방식&lt;/strong&gt;이다.)&lt;br&gt;즉, 생성자로 Bean 객체를 받도록 하면 &lt;code&gt;@Autowired&lt;/code&gt;와 동일한 효과를 볼 수 있다.&lt;/p&gt;
&lt;p&gt;생성자는 &lt;code&gt;@AllArgsConstructor&lt;/code&gt; 에서 해결해준다.&lt;br&gt;모든 필드를 인자값으로 하는 생성자를 Lombok의 &lt;code&gt;@AllArgsConstructor&lt;/code&gt;이 대신 생성해 준 것입니다.&lt;/p&gt;
&lt;p&gt;또한, 생성자를 직접 안쓰고 Lombok 어노테이션을 사용한 이유가 있다.&lt;br&gt;해당 클래스의 의존성 관계가 변경될때마다 생성자 코드를 계속해서 수정하는 번거로움을 해결하기 위해서다.&lt;/p&gt;
&lt;h3&gt;Entity 클래스와 거의 유사한 형태여도 꼭 DTO 클래스 생성해야한다.&lt;/h3&gt;
&lt;p&gt;절대로 테이블과 매핑되는 Entity 클래스를 Request/ Response 클래스로 사용해서는 안된다.&lt;br&gt;Entity 클래스는 가장 Core한 클래스이다.&lt;br&gt;수많은 서비스 클래스나 비지니스 로직들이 Entity 클래스를 기준으로 동작한다.&lt;br&gt;Entity 클래스가 변경되면 여러 클래스에 영향을 끼치게 되는 반면 Request와 Response용 DTO는 View를 위한 클래스라 정말 자주 변경이 필요하다.&lt;br&gt;따라서, View Layer와 DB Layer를 철저하게 역할 분리를 하는게 좋다.&lt;br&gt;실제로 Controller에서 결과값으로 여러 테이블을 조인해서 줘야할 경우가 빈번하기 때문에 Entity 클래스만으로 표현하기가 어려운 경우가 많다.&lt;br&gt;그러니 꼭 Entity 클래스와 Controller에서 쓸 DTO는 분리해서 사용해야한다.&lt;/p&gt;
&lt;h3&gt;Postman + 웹 콘솔로 검증을 위해 H2를 활성화&lt;/h3&gt;
&lt;p&gt;Local환경에서는 DB로 H2를 사용한다.&lt;br&gt;그러기 위해 H2를 활성화시켜야한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(  STEP 1 )&lt;/strong&gt; application.properties를 application.yml로 변경 후 아래 코드 작성&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spring:
  h2:
    console:
      enabled: true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt; 참고 &lt;/p&gt;
&lt;p&gt;yml로 변경한 이유는 상대적으로 유연한 구조를 가졌기 때문이다.&lt;/p&gt;
&lt;p&gt;yml은 상위 계층에 대한 표현, List 등을 완전하게 표현할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(  STEP 2 )&lt;/strong&gt; Application.java 를 재실행 후 브라우저에&lt;strong&gt;&lt;a href=&quot;http://localhost:8080/h2-console&quot;&gt;http://localhost:8080/h2-console&lt;/a&gt;&lt;/strong&gt; 입력&lt;/p&gt;
&lt;p&gt;여기서 꼭❗❗❗❗ JDBC URL 을 jdbc:h2:mem:testdt 로 바꿔준 후 connect버튼을 눌러 접속&lt;/p&gt;
&lt;p&gt;postman를 통해 데이터를 전송 후, h2-console에서 쿼리 실행 후 Run을 눌러 확인해볼 수 있다.&lt;/p&gt;
&lt;h3&gt;생성시간/수정시간 자동화 - JPA Auditing&lt;/h3&gt;
&lt;p&gt;보통 Entity에는 해당 데이터의 생성시간과 수정시간을 포함시킨다.&lt;br&gt;언제 만들어졌는지, 언제 수정되었는지 등은 차후 유지보수에 있어 굉장히 중요한 정보이기 때문이다.&lt;/p&gt;
&lt;p&gt;그렇다보니 매번 DB에 insert하기전, update 하기전에 날짜 데이터를 등록/수정 하는 코드가 여기저기 들어가게 된다.&lt;/p&gt;
&lt;p&gt;그런데 이런 단순하고 반복적인 코드가 모든 테이블과 서비스 메소드에 포함된다면 어마어마하게 귀찮고 코드가 더러워지겠죠?&lt;br&gt;그래서 이 문제를 해결하기 위해 JPA Auditing를 사용한다.&lt;/p&gt;
&lt;h4&gt;LocalDate 사용&lt;/h4&gt;
&lt;p&gt;여기서부터는 날짜 타입을 사용한다.&lt;br&gt;Java8 부터 LocalDate와 LocalDateTime이 등장한다.&lt;br&gt;Java의 기본 날짜 타입인 Date의 문제점을 제대로 고친 타입이기 때문에&lt;br&gt;Java8일 경우 무조건 사용하는 것을 권장한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(  STEP 1 )&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;build.gradle&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//Spring Boot Overriding
ext[&amp;#39;hibernate.version&amp;#39;] = &amp;#39;5.2.11.Final&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;(  STEP 2 )&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;BaseTimeEntity 생성&lt;/h4&gt;
&lt;p&gt;BaseTimeEntity클래스는 모든 Entity들의 상위 클래스가 되어 &lt;strong&gt;Entity들의 createdDate, modifiedDate를 자동으로 관리&lt;/strong&gt;하는 역할이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;pre&gt;&lt;code&gt;@MappedSuperclass&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(&lt;code&gt;createdDate&lt;/code&gt;, &lt;code&gt;modifiedDate&lt;/code&gt;)도 컬럼으로 인식하도록 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;pre&gt;&lt;code&gt;@EntityListeners(AuditingEntityListener.class)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;BaseTimeEntity클래스에 Auditing 기능을 포함시킨다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;pre&gt;&lt;code&gt;@CreatedDate&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Entity가 생성되어 저장될 때 시간이 자동 저장된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;pre&gt;&lt;code&gt;@LastModifiedDate&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;조회한 Entity의 값을 변경할 때 시간이 자동 저장된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;(  STEP 3 )&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;그리고 Posts클래스가 BaseTimeEntity를 상속받도록 변경한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
public class Posts extends BaseTimeEntity {
    ...
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;(  STEP 4 )&lt;/strong&gt; (꼭‼)&lt;/p&gt;
&lt;p&gt;마지막으로 JPA Auditing 어노테이션들을 모두 활성화 시킬수 있도록&lt;br&gt;Application 클래스에 활성화 어노테이션 하나를 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;(  STEP 5 )&lt;/strong&gt; (test)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;assertTrue(posts.getCreatedDate().isAfter(LocalDateTime.now()));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Server/Spring</category>
      <category>AWS</category>
      <category>jpa</category>
      <category>spring</category>
      <category>springboot</category>
      <category>스프링부트와 aws</category>
      <category>웹서비스</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/65</guid>
      <comments>https://aonee.tistory.com/65#entry65comment</comments>
      <pubDate>Sun, 3 May 2020 23:54:42 +0900</pubDate>
    </item>
    <item>
      <title>[spring boot] 연락처 관리 프로젝트 (+TDD)</title>
      <link>https://aonee.tistory.com/64</link>
      <description>&lt;h3&gt;&lt;strong&gt;✔ 프로젝트 구조&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diuJAB/btqDH2z0BKB/zxYSMbm1J1oinRHaUahq3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diuJAB/btqDH2z0BKB/zxYSMbm1J1oinRHaUahq3k/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 35.1467%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diuJAB/btqDH2z0BKB/zxYSMbm1J1oinRHaUahq3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiuJAB%2FbtqDH2z0BKB%2FzxYSMbm1J1oinRHaUahq3k%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9cozK/btqDKqsX5xI/JgwNrxZk2skKkiAEPgYnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9cozK/btqDKqsX5xI/JgwNrxZk2skKkiAEPgYnlK/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 37.6738%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9cozK/btqDKqsX5xI/JgwNrxZk2skKkiAEPgYnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9cozK%2FbtqDKqsX5xI%2FJgwNrxZk2skKkiAEPgYnlK%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldw5a/btqDImLRogs/fiPesl3sQnstVKUEkhy8Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldw5a/btqDImLRogs/fiPesl3sQnstVKUEkhy8Wk/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 24.8539%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldw5a/btqDImLRogs/fiPesl3sQnstVKUEkhy8Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fldw5a%2FbtqDImLRogs%2FfiPesl3sQnstVKUEkhy8Wk%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;**✔&lt;/strong&gt;MVC 패턴 (Model–View–Controller)**&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QTAyI/btqDKUABgXa/l0Rrqc5bqeq6I4QKkHskEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QTAyI/btqDKUABgXa/l0Rrqc5bqeq6I4QKkHskEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QTAyI/btqDKUABgXa/l0Rrqc5bqeq6I4QKkHskEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQTAyI%2FbtqDKUABgXa%2Fl0Rrqc5bqeq6I4QKkHskEk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;**✔&lt;/strong&gt;프로젝트 전체 코드 ( 깃허브 )**&lt;/h3&gt;
&lt;p&gt;  &lt;a href=&quot;https://github.com/devAon/SpringBoot-Manage-Contact&quot;&gt;https://github.com/devAon/SpringBoot-Manage-Contact&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;✔ 프로젝트 코드 및 구현 내용 설명&lt;/strong&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;build.gradle&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dependencies {
    implementation &amp;#39;org.springframework.boot:spring-boot-starter-web&amp;#39;
    compileOnly &amp;#39;org.projectlombok:lombok&amp;#39;
    annotationProcessor &amp;#39;org.projectlombok:lombok&amp;#39;
    implementation &amp;#39;org.springframework.boot:spring-boot-starter-data-jpa&amp;#39;
    implementation &amp;#39;com.h2database:h2&amp;#39;
    testImplementation &amp;#39;org.springframework.boot:spring-boot-starter-test&amp;#39;
    testImplementation &amp;#39;org.junit.platform:junit-platform-launcher:1.5.0&amp;#39;
    testImplementation &amp;#39;org.junit.jupiter:junit-jupiter-api:5.5.0&amp;#39;
    testImplementation &amp;#39;org.junit.jupiter:junit-jupiter-engine:5.5.0&amp;#39;
    testImplementation &amp;#39;org.mockito:mockito-junit-jupiter&amp;#39;
}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;** Domain  **&lt;/h3&gt;
&lt;p&gt;- 실제 DB의 테이블과 매칭될 클래스&lt;/p&gt;
&lt;h3&gt;Person&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@Entity
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Where(clause = &amp;quot;deleted = false&amp;quot;)
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NonNull
    @NotEmpty
    @Column(nullable = false)
    private String name;

    private String hobby;

    private String address;

    @Valid
    @Embedded
    private Birthday birthday;

    private String job;

    private String phoneNumber;

    @ColumnDefault(&amp;quot;0&amp;quot;)
    private boolean deleted;

    public void set(PersonDto personDto) {
        if (!StringUtils.isEmpty(personDto.getHobby())) {
            this.setHobby(personDto.getHobby());
        }

        if (!StringUtils.isEmpty(personDto.getAddress())) {
            this.setAddress(personDto.getAddress());
        }

        if (!StringUtils.isEmpty(personDto.getJob())) {
            this.setJob(personDto.getJob());
        }

        if (!StringUtils.isEmpty(personDto.getPhoneNumber())) {
            this.setPhoneNumber(personDto.getPhoneNumber());
        }

        if (personDto.getBirthday() != null) {
            this.setBirthday(Birthday.of(personDto.getBirthday()));
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Entity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DB에 저장하기 위해 유저가 정의한 클래스. Domain&lt;/p&gt;
&lt;p&gt;RDBMS에서 Table을 객체화 시킨 것&lt;/p&gt;
&lt;p&gt;테이블과 연결될 클래스임을 나타냄&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Id&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;primary key를 가지는 변수 선언&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@GeneratedValue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PK의 생성 규칙을 나타낸다.&lt;/p&gt;
&lt;p&gt;기본값은 AUTO로 MySql의 auto_increment와 같이 자동증가하는 정수형 값&lt;/p&gt;
&lt;p&gt;스프링부트 2.0 이전에는 자동으로 auto_increment가 됐지만&lt;/p&gt;
&lt;p&gt;스프링부트 2.0 이후부터는 @GeneratedValue(strategy = GenerationType.Identity) 옵션을 줘야 auto_increment가 된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Column&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;@Column에서 지정한 변수명과 DB컬럼명 다르게 주고 싶은 경우&lt;/p&gt;
&lt;p&gt;(@Column(name=&amp;quot; &amp;quot;) 사용)&lt;/p&gt;
&lt;p&gt;해당 어노테이션을 사용하지 않으면 기본적으로 멤버 변수명과 일치하는 DB컬럼을 매핑한다.&lt;/p&gt;
&lt;p&gt;기본값 외 추가로 변경이 필요한 옵션 변경 가능. 예를들어 VARCHAR(255) -&amp;gt; VARCHAR(500) 수정&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@NotNull&lt;/strong&gt; : CharSequence, Collection, Map orArray의 객체가 null일 수 없다. 그러나 empty는 가능하다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@NotEmpty :&lt;/strong&gt;CharSequence, Collection, Map orArray의 객체가 null과 empty 값(size &amp;gt; 0)이 될 수 없다&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@NotBlank&lt;/strong&gt;: &amp;#39;String&amp;#39;이 null일 수 없으며, legnth가 0보다 커야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@NoArgsConstructor&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;기본 생성자 자동 추가&lt;/p&gt;
&lt;p&gt;옵션으로 access - AccessLevel.PROTECTED를 주면 기본생성자의 접근 권한을 protected로 제한할 수 있다.&lt;/p&gt;
&lt;p&gt;Entitiy 클래스를 프로젝트 코드상에서 기본생성자로 생성하는 것은 막되,&lt;br&gt;JPA에서 Entity 클래스를 생성하는 것은 허용하기 위해 사용&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Getter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;클래스 내 모든 필드의 Getter 메소드를 자동생성 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Builder&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;해당 클래스의 빌더패턴 클래스를 생성&lt;/p&gt;
&lt;p&gt;생성자 상단에 선언시 생성자에 포함된 필드만 빌더에 포함&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;** DTO **&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;PersonDto&lt;/strong&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;DTO(Data Transfer Object) 란?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;dto package&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 계층간 데이터 교환을 위한 객체(Java Beans)이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;즉, DB에서 데이터를 얻어 Service나 Controller 등으터 보낼 때 사용하는 객체이다.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;- Request와 Response용 DTO는 View를 위한 클래스이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;** &lt;/strong&gt;참고 : VO (Valaue Object ) vs DTO**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;      VO : 특정한 비즈니스 값을 담는 객체

    DTO : 계층간 통신 용도로 오고가는 객체&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;@Data
@NoArgsConstructor
@AllArgsConstructor(staticName = &amp;quot;of&amp;quot;)
public class PersonDto {
    @NotBlank(message = &amp;quot;이름은 필수값입니다&amp;quot;)
    private String name;
    private String hobby;
    private String address;
    private LocalDate birthday;
    private String job;
    private String phoneNumber;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;*&lt;em&gt; 참고 : Entity 클리스와 DTO 클래스를 분리하는 이유 *&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;- View Layer와 DB Layer의 역할을 철저하게 분리하기 위해&lt;/p&gt;
&lt;p&gt;- Entity 클래스 : 테이블과 매핑되기 때문에 변경시, 여러 클래스에 영향을 끼치게 된다.&lt;/p&gt;
&lt;p&gt;- DTO 클래스 : View와 통신하는 클래스로 Request, Response 는 자주 변경된다.&lt;/p&gt;
&lt;p&gt;  따라서 분리해야한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;** Repository (=DAO) **&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;DAO(Data Access Object) 란?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Repository package&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 실제 DB에 접근하는 객체로 DB에 data를 CRUD하는 계층인 Persistence Layer이다.&lt;/p&gt;
&lt;p&gt;- Service와 DB 연결고리&lt;/p&gt;
&lt;p&gt;ORM인 JPA를 사용하여 ( extends JpaRepository&amp;lt;Person, Long&amp;gt; ) 개발했다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;PersonRepository&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public interface PersonRepository extends JpaRepository&amp;lt;Person, Long&amp;gt; {
    List&amp;lt;Person&amp;gt; findByName(String name);

    @Query(value = &amp;quot;select person from Person person 
                where person.birthday.monthOfBirthday = :monthOfBirthday&amp;quot;)
    List&amp;lt;Person&amp;gt; findByMonthOfBirthday(@Param(&amp;quot;monthOfBirthday&amp;quot;) int monthOfBirthday);

    @Query(value = &amp;quot;select * from Person person 
                where person.deleted = true&amp;quot;, nativeQuery = true)
    List&amp;lt;Person&amp;gt; findPeopleDeleted();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;PersonRepositoryTest&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@Transactional
@SpringBootTest
class PersonRepositoryTest {
    @Autowired
    private PersonRepository personRepository;

    @Test
    void findByName() {
        List&amp;lt;Person&amp;gt; people = personRepository.findByName(&amp;quot;tony&amp;quot;);
        assertThat(people.size()).isEqualTo(1);

        Person person = people.get(0);
        assertAll(
            () -&amp;gt; assertThat(person.getName()).isEqualTo(&amp;quot;tony&amp;quot;),
            () -&amp;gt; assertThat(person.getHobby()).isEqualTo(&amp;quot;reading&amp;quot;),
            () -&amp;gt; assertThat(person.getAddress()).isEqualTo(&amp;quot;seoul&amp;quot;),
            () -&amp;gt; assertThat(person.getBirthday()).isEqualTo(Birthday.of(LocalDate.of(1991, 7, 10))),
            () -&amp;gt; assertThat(person.getJob()).isEqualTo(&amp;quot;officer&amp;quot;),
            () -&amp;gt; assertThat(person.getPhoneNumber()).isEqualTo(&amp;quot;010-2222-5555&amp;quot;),
            () -&amp;gt; assertThat(person.isDeleted()).isEqualTo(false)
        );
    }

    @Test
    void findByNameIfDeleted() {
        List&amp;lt;Person&amp;gt; people = personRepository.findByName(&amp;quot;andrew&amp;quot;);

        assertThat(people.size()).isEqualTo(0);
    }

    @Test
    void findByMonthOfBirthday() {
        List&amp;lt;Person&amp;gt; people = personRepository.findByMonthOfBirthday(7);

        assertThat(people.size()).isEqualTo(2);
        assertAll(
            () -&amp;gt; assertThat(people.get(0).getName()).isEqualTo(&amp;quot;david&amp;quot;),
            () -&amp;gt; assertThat(people.get(1).getName()).isEqualTo(&amp;quot;tony&amp;quot;)
        );
    }

    @Test
    void findPeopleDeleted() {
        List&amp;lt;Person&amp;gt; people = personRepository.findPeopleDeleted();

        assertThat(people.size()).isEqualTo(1);
        assertThat(people.get(0).getName()).isEqualTo(&amp;quot;andrew&amp;quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;*&lt;em&gt;Controller *&lt;/em&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;PersonController&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;- 사용자의 요청이 진입하는 지점이다.&lt;/p&gt;
&lt;p&gt;- 요청에 따른 처리를 결정한다. &lt;/p&gt;
&lt;p&gt;- 사용자에게 view를 응답으로 보내준다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@RequestMapping(value = &amp;quot;/api/person&amp;quot;)
@RestController
public class PersonController {
    @Autowired
    private PersonService personService;

    @GetMapping(&amp;quot;/{id}&amp;quot;)
    public Person getPerson(@PathVariable Long id) {
        return personService.getPerson(id);
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void postPerson(@RequestBody @Valid PersonDto personDto) {
        personService.postPerson(personDto);
    }

    @PutMapping(&amp;quot;/{id}&amp;quot;)
    public void modifyPerson(@PathVariable Long id, @RequestBody PersonDto personDto) {
        personService.modify(id, personDto);
    }

    @PatchMapping(&amp;quot;/{id}&amp;quot;)
    public void modifyPerson(@PathVariable Long id, String name) {
        personService.modify(id, name);
    }

    @DeleteMapping(&amp;quot;/{id}&amp;quot;)
    public void deletePerson(@PathVariable Long id){
        personService.delete(id);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;PersonControllerTest&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@SpringBootTest
@Transactional
class PersonControllerTest {
    @Autowired
    private PersonRepository personRepository;
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @BeforeEach
    void beforeEach() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(wac)
                .alwaysDo(print())
                .build();
    }

    @Test
    void getPerson() throws Exception {
        mockMvc.perform(
                MockMvcRequestBuilders.get(&amp;quot;/api/person/1&amp;quot;))
                .andExpect(status().isOk())
                .andExpect(jsonPath(&amp;quot;$.name&amp;quot;).value(&amp;quot;aonee&amp;quot;))
                .andExpect(jsonPath(&amp;quot;$.hobby&amp;quot;).isEmpty())
                .andExpect(jsonPath(&amp;quot;$.address&amp;quot;).isEmpty())
                .andExpect(jsonPath(&amp;quot;$.job&amp;quot;).isEmpty())
                .andExpect(jsonPath(&amp;quot;$.phoneNumber&amp;quot;).isEmpty())
                .andExpect(jsonPath(&amp;quot;$.deleted&amp;quot;).value(false));
    }

    @Test
    void postPerson() throws Exception {
        PersonDto dto = PersonDto.of(&amp;quot;aonee&amp;quot;, &amp;quot;programming&amp;quot;, &amp;quot;seoul&amp;quot;, LocalDate.now(), &amp;quot;programmer&amp;quot;, &amp;quot;010-1111-2222&amp;quot;);

        mockMvc.perform(
                MockMvcRequestBuilders.post(&amp;quot;/api/person&amp;quot;)
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .content(toJsonString(dto)))
                .andExpect(status().isCreated());

        Person result = personRepository.findAll(Sort.by(Sort.Direction.DESC, &amp;quot;id&amp;quot;)).get(0);

        assertAll(
                () -&amp;gt; assertThat(result.getName()).isEqualTo(&amp;quot;aonee&amp;quot;),
                () -&amp;gt; assertThat(result.getHobby()).isEqualTo(&amp;quot;programming&amp;quot;),
                () -&amp;gt; assertThat(result.getAddress()).isEqualTo(&amp;quot;seoul&amp;quot;),
                () -&amp;gt; assertThat(result.getBirthday()).isEqualTo(Birthday.of(LocalDate.now())),
                () -&amp;gt; assertThat(result.getJob()).isEqualTo(&amp;quot;programmer&amp;quot;),
                () -&amp;gt; assertThat(result.getPhoneNumber()).isEqualTo(&amp;quot;010-1111-2222&amp;quot;)
        );
    }

    @Test
    void modifyPerson() throws Exception {
        PersonDto dto = PersonDto.of(&amp;quot;aonee&amp;quot;, &amp;quot;programming&amp;quot;, &amp;quot;seoul&amp;quot;, LocalDate.now(), &amp;quot;programmer&amp;quot;, &amp;quot;010-1111-2222&amp;quot;);

        mockMvc.perform(
                MockMvcRequestBuilders.put(&amp;quot;/api/person/1&amp;quot;)
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .content(toJsonString(dto)))
                .andExpect(status().isOk());

        Person result = personRepository.findById(1L).get();

        assertAll(
                () -&amp;gt; assertThat(result.getName()).isEqualTo(&amp;quot;aonee&amp;quot;),
                () -&amp;gt; assertThat(result.getHobby()).isEqualTo(&amp;quot;programming&amp;quot;),
                () -&amp;gt; assertThat(result.getAddress()).isEqualTo(&amp;quot;seoul&amp;quot;),
                () -&amp;gt; assertThat(result.getBirthday()).isEqualTo(Birthday.of(LocalDate.now())),
                () -&amp;gt; assertThat(result.getJob()).isEqualTo(&amp;quot;programmer&amp;quot;),
                () -&amp;gt;assertThat(result.getPhoneNumber()).isEqualTo(&amp;quot;010-1111-2222&amp;quot;)
        );
    }


    @Test
    void deletePerson() throws Exception {
        mockMvc.perform(
                MockMvcRequestBuilders.delete(&amp;quot;/api/person/1&amp;quot;))
                .andExpect(status().isOk());

        assertTrue(personRepository.findPeopleDeleted().stream().anyMatch(
                person -&amp;gt; person.getId().equals(1L)));
    }

    private String toJsonString(PersonDto personDto) throws JsonProcessingException {
        return objectMapper.writeValueAsString(personDto);
    }

}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;Controller에서&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;-&lt;strong&gt;return 값이 void인 경우&lt;/strong&gt;(post, modify, delete)에는&lt;strong&gt;assertThat, assertAll을 통해 검증&lt;/strong&gt;을 한다.&lt;/p&gt;
&lt;p&gt;뿐만 아니라, Repository값을 가져와&lt;strong&gt;DB값을 통해 검증&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;-&lt;strong&gt;return 값이 있는 경우&lt;/strong&gt;(get) 에는&lt;strong&gt;andExpect를 통해 검증&lt;/strong&gt;한다. &lt;/p&gt;
&lt;p&gt;뿐만 아니라, DB값이 아닌,&lt;strong&gt;return되는 값을 통해 검증&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;get에서 return되는 값은json 형식을 가지고 있기 때문에&lt;strong&gt;jsonPath를 통해 key, value를 검증&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;ex ) .andExpect(jsonPath(&amp;quot;$.name&amp;quot;).value(&amp;quot;martin&amp;quot;))&lt;/strong&gt;은&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   **key 인(&amp;quot;$.name&amp;quot;) : **return된 객체의 name속성

   **value인****.value(&amp;quot;martin&amp;quot;)) :**  name 속성의 값으로 예측되는 테스트 값   &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;**  ex 2) .andExpect(jsonPath(&amp;quot;$.hobby&amp;quot;).isEmpty())**은&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   **.isEmpty() :**value가 비어있다.&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;@SpringBootTest&lt;/strong&gt; 란?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;@ExtendWith(SpringExtension.class)스프링&lt;/strong&gt;관련 기능을 사용해서 테스트를 진행한다는 의미이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;@AutoWired&lt;/strong&gt; 을 사용해 각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;** Service **&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;PersonService&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;- @Autowired Repository를 통해 repository의 method를 이용&lt;/p&gt;
&lt;p&gt;- DAO클래스를 통해 DB연동을 처리한다.&lt;/p&gt;
&lt;p&gt;- DAO로 DB에 접근하고 DTO로 데이터를 전달받은 다음, 비지니스 로직을 처리해 적절한 데이터를 반환한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Slf4j
@Service
public class PersonService {

    @Autowired
    private PersonRepository personRepository;


    @Transactional(readOnly = true)
    public Person getPerson(Long id) {
        return personRepository.findById(id).orElse(null);
    }


    @Transactional
    public void postPerson(PersonDto personDto) {
        Person person = new Person();
        person.set(personDto);
        person.setName(personDto.getName());

        personRepository.save(person);
    }

    @Transactional
    public void modify(Long id, PersonDto personDto) {
        Person person = personRepository.findById(id).orElseThrow(PersonNotFoundException::new);

        if (!person.getName().equals(personDto.getName())) {
            throw new RenameIsNotPermittedException();
        }

        person.set(personDto);

        personRepository.save(person);
    }

    @Transactional
    public void modify(Long id, String name) {
        Person person = personRepository.findById(id).orElseThrow(PersonNotFoundException::new);

        person.setName(name);

        personRepository.save(person);
    }

    @Transactional
    public void delete(Long id) {
        Person person = personRepository.findById(id).orElseThrow(PersonNotFoundException::new);

        person.setDeleted(true);

        personRepository.save(person);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;PersonServiceTest&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@ExtendWith(MockitoExtension.class)
class PersonServiceTest {
    @InjectMocks
    private PersonService personService;

    @Mock
    private PersonRepository personRepository;


    @Test
    void getPerson(){
        when(personRepository.findById(1L))
                .thenReturn(Optional.of(new Person(&amp;quot;martin&amp;quot;)));

        Person person = personService.getPerson(1L);

        assertThat(person.getName()).isEqualTo(&amp;quot;martin&amp;quot;);
    }

    @Test
    void postPerson(){
        personService.postPerson(mockPersonDto());

        verify(personRepository, times(1)).save(argThat(new IsPersonWillBeInserted()));
    }

    @Test
    void modify() {
        when(personRepository.findById(1L))
                .thenReturn(Optional.of(new Person(&amp;quot;aonee&amp;quot;)));

        personService.modify(1L, mockPersonDto());

        verify(personRepository, times(1)).save(argThat(new IsPersonWillBeUpdated()));
    }


    @Test
    void modifyByNameIfPersonNotFound() {
        when(personRepository.findById(1L))
                .thenReturn(Optional.empty());

        assertThrows(PersonNotFoundException.class, () -&amp;gt; personService.modify(1L, &amp;quot;daniel&amp;quot;));
    }

    @Test
    void modifyByName(){
        when(personRepository.findById(1L))
                .thenReturn(Optional.of(new Person(&amp;quot;martin&amp;quot;)));

        personService.modify(1L, &amp;quot;daniel&amp;quot;);

        verify(personRepository, times(1)).save(argThat(new IsNameWillBeUpdated()));
    }

    @Test
    void delete(){
        when(personRepository.findById(1L))
                .thenReturn(Optional.of(new Person(&amp;quot;martin&amp;quot;)));

        personService.delete(1L);

        verify(personRepository, times(1)).save(argThat(new IsPersonWillBeDeleted()));
    }

    private PersonDto mockPersonDto() {
        return PersonDto.of(&amp;quot;aonee&amp;quot;, &amp;quot;programming&amp;quot;, &amp;quot;seoul&amp;quot;, LocalDate.now(), &amp;quot;programmer&amp;quot;, &amp;quot;010-1111-2222&amp;quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;build.gradle 에 해당 코드 추가&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;testImplementation &amp;#39;org.mockito:mockito-junit-jupiter&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;- Mock 테스트 개념 정리&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;@ExtendWith(&lt;a href=&quot;MockitoExtension.class&quot;&gt;MockitoExtension.class)&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring이 아닌 Mockito관련 기능을 사용해서 테스트를 진행한다는 의미이다.&lt;/p&gt;
&lt;p&gt;그리고 이제는&lt;a href=&quot;MockitoExtension.class&quot;&gt;MockitoExtension&lt;/a&gt;)을 사용하고 더이상 스프링 컨텍스트는 사용하지 않기 때문에 &lt;/p&gt;
&lt;p&gt;@AutoWired는 아무런 동작을 하지 않는다.&lt;/p&gt;
&lt;p&gt;대신,&lt;strong&gt;@InjectMocks&lt;/strong&gt;는 테스트의 대상이 되는 클래스에 붙여주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;@Mock&lt;/strong&gt;는 테스트의 대상이 되는 클래스에서@AutoWired 하고 있는 클래스에 붙여주면 된다.&lt;/p&gt;
&lt;p&gt;그러면@Mock 이 붙은 클래스를 Mock으로 만들어서@InjectMocks 클래스에 주입해준다.&lt;/p&gt;
&lt;p&gt;기존에 Spring context를 사용할 때는 data.sql을 통해 DB에 들어있는 값을 조회했던 것과 달리&lt;/p&gt;
&lt;p&gt;@Mock 에는 빈껍데기로 아무런 동작을 하지 않는다. 따라서, 테스트를 위해서는 직접 지정해줘야 한다.&lt;/p&gt;
&lt;p&gt;(EX)&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;when&lt;/strong&gt;(personRepository.findByName(&amp;quot;martin&amp;quot;))&lt;br&gt;            .&lt;strong&gt;thenReturn&lt;/strong&gt;(Lists.newArrayList(new Person(&amp;quot;martin&amp;quot;)));&lt;/p&gt;
&lt;p&gt;when ? &lt;/p&gt;
&lt;p&gt;if와 같은 의미. 만약(personRepository.findByName(&amp;quot;martin&amp;quot;))호출되면 (실제 호출이 아닌 가정이다.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;thenReturn ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lists.newArrayList(new Person(&amp;quot;martin&amp;quot;) 리턴한다&lt;/p&gt;
&lt;p&gt;@SpringBootTest로 만들었다면 각 테스트케이스에 맞는 DB 데이터로 만들었어야한다.&lt;/p&gt;
&lt;p&gt;그러나 Mock Test를 통해 보다 간단하게 구현할 수 있었다.&lt;/p&gt;
&lt;p&gt;분기문이 많이 나오는 로직일 수록@SpringBootTest 적용하기 더 힘들다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;- Mock 테스트에서 정확하게 검증하는 방법&lt;/strong&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;1.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;verify&lt;/strong&gt;는 post와 같이 return값이 void인 경우에 사용한다. &lt;/p&gt;
&lt;p&gt;verify를 사용하지 않을 경우, 올바르게 테스트되었는지 검증할 수 없다.&lt;/p&gt;
&lt;p&gt;verify(personRepository, times(1)).save(argThat(new IsPersonWillBeInserted()));&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;PersonService&lt;/strong&gt;에서&lt;/h3&gt;
&lt;p&gt;@Transactional&lt;br&gt;public void&lt;strong&gt;modify&lt;/strong&gt;(Long id,String name) {&lt;br&gt;Person person =personRepository.findById(id).orElseThrow(PersonNotFoundException::new);  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;person.setName(name)**&lt;/strong&gt;;**  &lt;/p&gt;
&lt;p&gt;personRepository.save(person);&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;person.setName(name)**&lt;/strong&gt;;**해당 코드는 없어서는 안될 핵심 역할을 하는 코드이다.&lt;/p&gt;
&lt;p&gt;그런데, 주석처리를 해도 test가 통과한다. 이러한 문제를 해결하기 위해&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;PersonServiceTest&lt;/strong&gt;에&lt;strong&gt;IsPersonWillBeUpdated&lt;/strong&gt;  생성&lt;/h3&gt;
&lt;p&gt;private static class &lt;strong&gt;IsPersonWillBeUpdated&lt;/strong&gt; implements &lt;strong&gt;ArgumentMatcher&lt;/strong&gt; {&lt;br&gt;        @Override&lt;br&gt;        public boolean &lt;strong&gt;matches&lt;/strong&gt;(Person person) {&lt;br&gt;            return &lt;strong&gt;equals&lt;/strong&gt;(person.getName(), &amp;quot;martin&amp;quot;)&lt;br&gt;                &amp;amp;&amp;amp; equals(person.getHobby(), &amp;quot;programming&amp;quot;)&lt;br&gt;                &amp;amp;&amp;amp; equals(person.getAddress(), &amp;quot;판교&amp;quot;)&lt;br&gt;                &amp;amp;&amp;amp; equals(person.getBirthday(), &lt;a href=&quot;Birthday.of(LocalDate.now())&quot;&gt;Birthday.of(LocalDate.now()))&lt;/a&gt;)&lt;br&gt;                &amp;amp;&amp;amp; equals(&lt;a href=&quot;person.getJob(),&quot;&gt;person.getJob(),&lt;/a&gt; &amp;quot;programmer&amp;quot;)&lt;br&gt;                &amp;amp;&amp;amp; equals(person.getPhoneNumber(), &amp;quot;010-1111-2222&amp;quot;);&lt;br&gt;        }  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    private boolean **equals**(Object actual, Object expected) {  
        return [expected.equals(actual);](expected.equals(actual);)  
    }  
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;PersonServiceTest&lt;/strong&gt;의 modify 테스트에&lt;/h3&gt;
&lt;p&gt;verify(personRepository,times(1)).save(&lt;strong&gt;argThat(newIsPersonWillBeUpdated()&lt;/strong&gt;));&lt;/p&gt;
&lt;p&gt;이처럼 검증을 해주면 된다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;service - argumentmatcher&lt;/strong&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;IsNameWillBeUpdated&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class IsNameWillBeUpdated implements ArgumentMatcher&amp;lt;Person&amp;gt; {
    @Override
    public boolean matches(Person person) {
        return person.getName().equals(&amp;quot;daniel&amp;quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;IsPersonWillBeDeleted&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class IsPersonWillBeDeleted implements ArgumentMatcher&amp;lt;Person&amp;gt; {
    @Override
    public boolean matches(Person person) {
        return person.isDeleted();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;IsPersonWillBeInserted&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class IsPersonWillBeInserted implements ArgumentMatcher&amp;lt;Person&amp;gt; {
    @Override
    public boolean matches(Person person) {
        return equals(person.getName(), &amp;quot;aonee&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getHobby(), &amp;quot;programming&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getAddress(), &amp;quot;seoul&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getBirthday(), Birthday.of(LocalDate.now()))
                &amp;amp;&amp;amp; equals(person.getJob(), &amp;quot;programmer&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getPhoneNumber(), &amp;quot;010-1111-2222&amp;quot;);
    }

    private boolean equals(Object actual, Object expected) {
        return expected.equals(actual);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;strong&gt;IsPersonWillBeUpdated&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class IsPersonWillBeUpdated implements ArgumentMatcher&amp;lt;Person&amp;gt; {
    @Override
    public boolean matches(Person person) {
        return equals(person.getName(), &amp;quot;aonee&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getHobby(), &amp;quot;programming&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getAddress(), &amp;quot;seoul&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getBirthday(), Birthday.of(LocalDate.now()))
                &amp;amp;&amp;amp; equals(person.getJob(), &amp;quot;programmer&amp;quot;)
                &amp;amp;&amp;amp; equals(person.getPhoneNumber(), &amp;quot;010-1111-2222&amp;quot;);
    }

    private boolean equals(Object actual, Object expected) {
        return expected.equals(actual);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;*&lt;em&gt;application.yml *&lt;/em&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;spring:
jpa:
show-sql: true

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;application.properties를 application.yml로 변경&lt;br&gt;why?  상대적으로 유연한 구조를 가졌기 때문&lt;br&gt;      yml은 상위 계층에 대한 표현, List 등을 완전하게 표현할수가 있다. 또한, 최근의 많은 도구들이 yml 설정을 지원한다&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;test - resources - data.sql&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;@SpringBootTest 를 위해 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;insert into person(`id`, `name`, `year_of_birthday`, `month_of_birthday`, `day_of_birthday`) values (1, &amp;#39;aonee&amp;#39;, 1991, 8, 15);
insert into person(`id`, `name`, `year_of_birthday`, `month_of_birthday`, `day_of_birthday`) values (2, &amp;#39;david&amp;#39;, 1992, 7, 21);
insert into person(`id`, `name`, `year_of_birthday`, `month_of_birthday`, `day_of_birthday`) values (3, &amp;#39;dennis&amp;#39;, 1993, 10, 15);
insert into person(`id`, `name`, `year_of_birthday`, `month_of_birthday`, `day_of_birthday`) values (4, &amp;#39;sophia&amp;#39;, 1994, 8, 31);
insert into person(`id`, `name`, `year_of_birthday`, `month_of_birthday`, `day_of_birthday`) values (5, &amp;#39;benny&amp;#39;, 1995, 12, 23);
insert into person(`id`, `name`, `year_of_birthday`, `month_of_birthday`, `day_of_birthday`, `job`, `hobby`, `phone_number`, `address`)
    values (6, &amp;#39;tony&amp;#39;, 1991, 7, 10, &amp;#39;officer&amp;#39;, &amp;#39;reading&amp;#39;, &amp;#39;010-2222-5555&amp;#39;, &amp;#39;seoul&amp;#39;);
insert into person(`id`, `name`, `deleted`) values (7, &amp;#39;andrew&amp;#39;, true);&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;Exception&lt;/h3&gt;
&lt;h3&gt;- dto&lt;/h3&gt;
&lt;h3&gt;ErrorResponse&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@Data
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ErrorResponse {
    private int code;
    private String message;

    public static ErrorResponse of(HttpStatus httpStatus, String message) {
        return new ErrorResponse(httpStatus.value(), message);
    }

    public static ErrorResponse of(HttpStatus httpStatus, FieldError fieldError) {
        if (fieldError == null) {
            return new ErrorResponse(httpStatus.value(), &amp;quot;invalid params&amp;quot;);
        } else {
            return new ErrorResponse(httpStatus.value(), fieldError.getDefaultMessage());
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;PersonNotFoundException&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@Slf4j
public class PersonNotFoundException extends RuntimeException {
    private static final String MESSAGE = &amp;quot;Person Entity가 존재하지 않습니다&amp;quot;;

    public PersonNotFoundException() {
        super(MESSAGE);
        log.error(MESSAGE);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;RenameIsNotPermittedException&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@Slf4j
public class RenameIsNotPermittedException extends RuntimeException {
    private static final String MESSAGE = &amp;quot;이름 변경이 허용되지 않습니다&amp;quot;;

    public RenameIsNotPermittedException() {
        super(MESSAGE);
        log.error(MESSAGE);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;**✔&lt;/strong&gt;TEST 결과 확인 ( 모두 통과 ! 예 ! 에--!  ‍♀️ )**&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AVoUk/btqDIopkOVK/GOGuyHL9LpfNUhPWyNhuk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AVoUk/btqDIopkOVK/GOGuyHL9LpfNUhPWyNhuk1/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 53.7365%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AVoUk/btqDIopkOVK/GOGuyHL9LpfNUhPWyNhuk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAVoUk%2FbtqDIopkOVK%2FGOGuyHL9LpfNUhPWyNhuk1%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn5fm2/btqDH2mxe8Y/6KmiNvkkNK943tZttfYtkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn5fm2/btqDH2mxe8Y/6KmiNvkkNK943tZttfYtkK/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 45.1007%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn5fm2/btqDH2mxe8Y/6KmiNvkkNK943tZttfYtkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn5fm2%2FbtqDH2mxe8Y%2F6KmiNvkkNK943tZttfYtkK%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;TDD (Test Driven Development 테스트 주도 개발 : 테스트가 개발을 이끌어 나간다 )&lt;/p&gt;
&lt;p&gt;테스트 주도 개발을 함께 하려다 보니 신경 쓸 부분이 많아져 개발하는데 시간이 배로 걸렸다.&lt;br&gt;무엇보다 JPA 와 TDD를 처음 공부하다 보니 더욱 그랬던 것 같다.&lt;br&gt;직접 TDD를 해보니 개발을 하다 중요한 로직에서 취약한 실수가 있었다.&lt;/p&gt;
&lt;p&gt;자칫 모르고 넘어갈 수 있었던 문제였는데 테스트를 통해 바로잡을 수 있었다.&lt;/p&gt;
&lt;p&gt;이를 통해, TDD의 중요성을 크게 느꼈다.&lt;br&gt;사실 처음에는 그저 내가 작성한 테스트가 통과되면 좋겠다는 생각으로 간략하게 작성했다.&lt;br&gt;그러나 나중에 보니 핵심로직에 제대로 된 검증을 하지 않고 있었다.&lt;br&gt;무용지물 한 테스트 코드를 작성하고 있었던 것이었다.  (&lt;del&gt;이럴거면 테스트 왜 해  ‍♀️&lt;/del&gt;)&lt;br&gt;이후로는 올바른 검증을 하는 테스트 코드를 작성하기 위해 노력했다.&lt;br&gt;올바르게 작동하는 깔끔한 코드를 만들기 위해 ! ! ! !&lt;br&gt;자연스럽게 TEST 코드를 작성하는 날이 올 때까지 꾸준히 공부해야겠다.&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/64</guid>
      <comments>https://aonee.tistory.com/64#entry64comment</comments>
      <pubDate>Sun, 26 Apr 2020 21:23:12 +0900</pubDate>
    </item>
    <item>
      <title>[spring] TDD (테스트 주도 개발) 방법</title>
      <link>https://aonee.tistory.com/57</link>
      <description>&lt;h1&gt;&lt;b&gt;TDD ? ( Test Driven Development )&lt;/b&gt;&lt;/h1&gt;
&lt;h2&gt;선 테스트코드 작성 후 실제 코드 개발&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구현 -&amp;gt; 테스트 -&amp;gt; 리펙토링&lt;/p&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;p&gt;-목표주도개발&lt;br /&gt;-사용자 중심 개발&lt;br /&gt;-인터페이스 중심 개발&lt;/p&gt;
&lt;h2&gt;목표?&lt;/h2&gt;
&lt;p&gt;-올바르게 작동 -test&lt;br /&gt;-깔끔한 코드 - 이때 refactoring&lt;/p&gt;
&lt;h2&gt;TDD 3가지 cycle&lt;/h2&gt;
&lt;p&gt;Red - 실패&lt;br /&gt;Green - 성공&lt;br /&gt;Refactoring test 코드 리팩터링.&lt;/p&gt;
&lt;h2&gt;TDD 만드는 방법&lt;/h2&gt;
&lt;p&gt;test파일 만들고싶은 파일에서-goto-test&lt;/p&gt;
&lt;h2&gt;예시&lt;/h2&gt;
&lt;h3&gt;Controller TDD&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;HelloWorldController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@RestController
public class HelloWorldController {
    @GetMapping(&quot;/api/helloworld&quot;)
    public String helloWord(){
        return &quot;HelloWorld&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ctrl+shitft + R 로 테스트 클래스 생성&lt;/p&gt;
&lt;p&gt;&lt;b&gt;HelloWorldControllerTest.java&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;package com.devaon.managecontact.controller;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;


@SpringBootTest
class HelloWorldControllerTest {

    @Autowired
    private HelloWorldController helloWorldController;

    //모의 http request, response 만들어 테스트 진행하도록 해줌
    private MockMvc mockMvc;

    //단지 메소드 호출 테스트
    @Test
    public void helloWorld() {
        System.out.println(helloWorldController.helloWord());

        assertThat(helloWorldController.helloWord()).isEqualTo(&quot;HelloWorld&quot;);
    }

    //실제 http 테스트
    @Test
    public void mockMvcHelloWorld() throws Exception {

        //MockMvc setting
        mockMvc = MockMvcBuilders.standaloneSetup(helloWorldController).build();

        //실제 동작하도록 요청
        mockMvc.perform(
                //get 메소드로 요청
                MockMvcRequestBuilders.get(&quot;/api/helloworld&quot;)
        ).andDo(MockMvcResultHandlers.print())
         .andExpect(MockMvcResultMatchers.status().isOk())
         .andExpect(MockMvcResultMatchers.content().string(&quot;HelloWorld&quot;));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*&lt;i&gt;MockMvc *&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;http request, response 만들어 테스트 진행하도록 해준다&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MockMvc 세팅&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;mockMvc = MockMvcBuilders.standaloneSetup(helloWorldController).build();&lt;/p&gt;
&lt;p&gt;&lt;b&gt;실제 동작하도록 요청&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;mockMvc.perform&lt;/p&gt;
&lt;p&gt;&lt;b&gt;get/post/put/patch/delete 메소드로 요청&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;MockMvcRequestBuilders.get(&quot;api/helloworld&quot;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Request와 Response에 대해 구체적인 정보를 노출&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;.andDo(MockMvcResultHandler.print)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4rwQi/btqDyD0uozm/hhnNt56QJv30ATwTzVIXNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4rwQi/btqDyD0uozm/hhnNt56QJv30ATwTzVIXNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4rwQi/btqDyD0uozm/hhnNt56QJv30ATwTzVIXNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4rwQi%2FbtqDyD0uozm%2FhhnNt56QJv30ATwTzVIXNk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k0YFs/btqDx6Pm4dQ/qUTGMX62zfNtWBm4wA3vA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k0YFs/btqDx6Pm4dQ/qUTGMX62zfNtWBm4wA3vA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k0YFs/btqDx6Pm4dQ/qUTGMX62zfNtWBm4wA3vA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk0YFs%2FbtqDx6Pm4dQ%2FqUTGMX62zfNtWBm4wA3vA1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;자동화된 결과 체크&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;andExpect(MockMvcResultMatchers )&lt;/p&gt;
&lt;p&gt;&lt;b&gt;status가 200 성공했는지 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;.andExpect(MockMvcResultMatchers.status().isOk())&lt;/p&gt;
&lt;p&gt;&lt;b&gt;response의 body 값이 HelloWorld인지 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;.andExpect(MockMvcResultMatchers.content().string(&quot;HelloWorld&quot;))&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TDD 예시 프로젝트&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[spring boot] 연락처 관리 프로젝트 (+TDD)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://aonee.tistory.com/64?category=369754&quot;&gt;https://aonee.tistory.com/64?category=369754&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587907249020&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[spring boot] 연락처 관리 프로젝트 (+TDD)&quot; data-og-description=&quot;✔ 프로젝트 구조 ✔ MVC 패턴 (Model&amp;ndash;View&amp;ndash;Controller) ✔ 프로젝트 전체 코드 ( 깃허브 )   https://github.com/devAon/SpringBoot-Manage-Contact ✔ 프로젝트 코드 및 구현 내용 설명 buil..&quot; data-og-host=&quot;aonee.tistory.com&quot; data-og-source-url=&quot;https://aonee.tistory.com/64?category=369754&quot; data-og-url=&quot;https://aonee.tistory.com/64&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hVkFe/hyFPIDCb0S/HuYfjmiNjSGQNCNldTyDjK/img.png?width=299&amp;amp;height=303&amp;amp;face=0_0_299_303,https://scrap.kakaocdn.net/dn/kdQQG/hyFNSgMkqU/SDnO0qIwJvV3xKGm8IDdiK/img.png?width=299&amp;amp;height=303&amp;amp;face=0_0_299_303,https://scrap.kakaocdn.net/dn/kdVbd/hyFPyud8O3/Pi9gQfyTdMACdQ7Jjfsbg1/img.png?width=351&amp;amp;height=503&amp;amp;face=0_0_351_503&quot;&gt;&lt;a href=&quot;https://aonee.tistory.com/64?category=369754&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aonee.tistory.com/64?category=369754&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hVkFe/hyFPIDCb0S/HuYfjmiNjSGQNCNldTyDjK/img.png?width=299&amp;amp;height=303&amp;amp;face=0_0_299_303,https://scrap.kakaocdn.net/dn/kdQQG/hyFNSgMkqU/SDnO0qIwJvV3xKGm8IDdiK/img.png?width=299&amp;amp;height=303&amp;amp;face=0_0_299_303,https://scrap.kakaocdn.net/dn/kdVbd/hyFPyud8O3/Pi9gQfyTdMACdQ7Jjfsbg1/img.png?width=351&amp;amp;height=503&amp;amp;face=0_0_351_503');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[spring boot] 연락처 관리 프로젝트 (+TDD)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;✔ 프로젝트 구조 ✔ MVC 패턴 (Model&amp;ndash;View&amp;ndash;Controller) ✔ 프로젝트 전체 코드 ( 깃허브 )   https://github.com/devAon/SpringBoot-Manage-Contact ✔ 프로젝트 코드 및 구현 내용 설명 buil..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;aonee.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3&gt;&lt;b&gt;&lt;b&gt;✔&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;프로젝트 전체 코드 ( 깃허브 )&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/devAon/SpringBoot-Manage-Contact&quot;&gt;https://github.com/devAon/SpringBoot-Manage-Contact&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <category>spring</category>
      <category>springboot</category>
      <category>tdd</category>
      <category>테스트주도개발</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/57</guid>
      <comments>https://aonee.tistory.com/57#entry57comment</comments>
      <pubDate>Sun, 19 Apr 2020 18:14:32 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] jpa, Hibernate, mybatis 란? 그리고 SQL Mapper와 ORM</title>
      <link>https://aonee.tistory.com/59</link>
      <description>&lt;h3&gt;목차&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;  1. 계층&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;  2. SQL Mapper와 ORM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;  3. JDBC(Java Database Connectivity)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;  4. JPA (Java Persistence API)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;  5. Hibernate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;  6. Mybatis&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;1. 계층 - 영속성(Persistence)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79441913-cf113700-8012-11ea-9bf0-a951a4a7d3d8.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;계층 참고&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;프레젠테이션 계층 (Presentation layer)&lt;/strong&gt; - UI 계층 (UI layer) 이라고도 함&lt;br&gt;&lt;strong&gt;애플리케이션 계층 (Application layer)&lt;/strong&gt; - 서비스 계층 (Service layer) 이라고도 함&lt;br&gt;&lt;strong&gt;비즈니스 논리 계층 (Business logic layer)&lt;/strong&gt; - 도메인 계층 (Domain layer) 이라고도 함&lt;br&gt;&lt;strong&gt;데이터 접근 계층 (Data access layer)&lt;/strong&gt; - 영속 계층 (Persistence layer) 이라고도 함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Persistence Framework&lt;br&gt;JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장한다.&lt;br&gt;Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.&lt;br&gt;아래 참고&lt;br&gt;Ex) JPA, Hibernate, Mybatis 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;2. SQL Mapper와 ORM&lt;/h3&gt;
&lt;p&gt;Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.&lt;/p&gt;
&lt;p&gt;ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해주지만 SQL Mapper는 SQL을 명시해줘야 한다.&lt;br&gt;ORM은 관계형 데이터베이스의 ‘관계’를 Object에 반영하자는 것이 목적이라면, SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL Mapper&lt;br&gt;SQL &amp;lt;—매핑—&amp;gt; Object 필드&lt;br&gt;SQL Mapper는 SQL 문장으로 직접 데이터베이스 데이터를 다룬다.&lt;br&gt;즉, SQL Mapper는 SQL을 명시해줘야 한다.&lt;br&gt;Ex) Mybatis, JdbcTempletes 등&lt;/li&gt;
&lt;li&gt;ORM(Object-Relational Mapping), 객체-관계 매핑&lt;br&gt;데이터베이스 데이터 &amp;lt;—매핑—&amp;gt; Object 필드&lt;br&gt;객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.&lt;br&gt;객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.&lt;br&gt;ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있다.&lt;br&gt;객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.&lt;br&gt;Persistant API라고도 할 수 있다.&lt;br&gt;Ex) JPA, Hibernate 등&lt;br&gt;ORM의 장단점 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;3. JDBC(Java Database Connectivity)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79442214-329b6480-8013-11ea-8933-10038de7aa77.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API이다.&lt;br&gt;모든 Java의 Data Access 기술의 근간&lt;br&gt;즉, 모든 Persistence Framework는 내부적으로 JDBC API를 이용한다.&lt;br&gt;JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.&lt;br&gt;Plain JDBC vs Spring JDBC 참고&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;4. JPA (Java Persistence API)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79441003-a5a3db80-8011-11ea-830d-8ec75a349719.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;자바 ORM 기술에 대한 API 표준 명세로, Java에서 제공하는 API이다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.&lt;/li&gt;
&lt;li&gt;즉, JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것이다.&lt;/li&gt;
&lt;li&gt;기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;자바 어플리케이션에서 관계형 DB를 사용하는 방식을 정의한 인터페이스. 라이브러리가 아니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JPA 구성 요소 (세 가지)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1) javax.persistance 패키지로 정의된 API 그 자체&lt;/li&gt;
&lt;li&gt;2) JPQL(Java Persistence Query Language)&lt;/li&gt;
&lt;li&gt;3) 객체/관계 메타데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPA의 대표적인 구현체로는 Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.&lt;/li&gt;
&lt;li&gt;이 구현체들을 ORM Framework라고 부른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JPA 처리를 담당하는 Repository는 기본적으로 4가지가 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(T : @Entity의 타입클래스/ ID : P.K 값의 Type )&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Repository&amp;lt;T, ID&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CrudRepository&amp;lt;T, ID&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PagingAndSortingRepository&amp;lt;T, ID&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JpaRepository&amp;lt;T, ID&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79438662-c9b1ed80-800e-11ea-9e2e-2e8619ba145f.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JPA 사용법&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Entity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DB에 저장하기 위해 유저가 정의한 클래스. Domain&lt;/p&gt;
&lt;p&gt;RDBMS에서 Table을 객체화 시킨 것&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Id&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;primary key를 가지는 변수 선언&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;@GeneratedValue&lt;/strong&gt; 는 해당 ID값을 어떻게 자동으로 생성할지 전략을 선택할 수 있는데 기본값은 &amp;#39;AUTO&amp;#39; 이다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Column&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;@Column에서 지정한 변수명과 DB컬럼명 다르게 주고 싶은 경우&lt;/p&gt;
&lt;p&gt;(@Column(name=&amp;quot; &amp;quot;) 사용)&lt;/p&gt;
&lt;p&gt;해당 어노테이션을 사용하지 않으면 기본적으로 멤버 변수명과 일치하는 DB컬럼을 매핑한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;*&lt;em&gt;@NotNull *&lt;/em&gt;: CharSequence, Collection, Map orArray의 객체가 null일 수 없다. 그러나 empty는 가능하다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@NotEmpty :&lt;/strong&gt;CharSequence, Collection, Map orArray의 객체가 null과 empty 값(size &amp;gt; 0)이 될 수 없다&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;@NotBlank&lt;/strong&gt;: &amp;#39;String&amp;#39;이 null일 수 없으며, legnth가 0보다 커야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JPA는 &lt;code&gt;메소드의 이름&lt;/code&gt;만으로 &lt;code&gt;원하는 쿼리(Select)를 실행하는 방법을 제공&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Query 메소드를 추가하여 스프링에게 알릴 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;그러기위해서는 규칙에 맞는 메서드를 작성해야 하는데, 그 규칙은 다음과 같다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;find...By...&lt;/li&gt;
&lt;li&gt;read...By...&lt;/li&gt;
&lt;li&gt;query...By...&lt;/li&gt;
&lt;li&gt;get...By...&lt;/li&gt;
&lt;li&gt;count...By...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79439765-31b50380-8010-11ea-8337-d7b513ea8345.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;Query 메소드에 &lt;code&gt;포함할 수 있는 키워드&lt;/code&gt;는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79439875-501aff00-8010-11ea-9b9a-1a1589a6ff2d.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pageable 변수를 추가하면 Page타입을 반환형으로 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;Pageable 객체를 통해 &lt;code&gt;페이징과 정렬을 위한 파라미터&lt;/code&gt;를 전달한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Page&amp;lt;Member&amp;gt; getMembers(Pageable pageable){&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;위와 같이 작성된 Pageable에서는 다음과 같은 &lt;code&gt;파라미터를 자동 수집&lt;/code&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79440233-b6078680-8010-11ea-8360-0a6e22090b5b.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;의존성 추가&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-data-jpa&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;
&amp;lt;dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;5. Hibernate&lt;/h3&gt;
&lt;p&gt;JPA의 구현체&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79441470-3a0e3e00-8012-11ea-8534-387d1253c7ef.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hibernate는 JPA의 구현체 중 하나이다.&lt;/li&gt;
&lt;li&gt;Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.&lt;ul&gt;
&lt;li&gt;Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.&lt;ul&gt;
&lt;li&gt;HQL은 SQL과 매우 비슷하며 추가적인 컨벤션을 정의할 수도 있다.&lt;/li&gt;
&lt;li&gt;HQL은 완전히 객체 지향적이며 이로써 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있다.&lt;/li&gt;
&lt;li&gt;HQL쿼리는 자바 클래스와 프로퍼티의 이름을 제외하고는 대소문자를 구분한다.&lt;/li&gt;
&lt;li&gt;HQL은 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적으로 접근할 수 있다.&lt;/li&gt;
&lt;li&gt;HQL은 SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장점&lt;ul&gt;
&lt;li&gt;객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능하다.&lt;/li&gt;
&lt;li&gt;테이블 생성, 변경, 관리가 쉽다. (JPA를 잘 이해하고 있는 경우)&lt;/li&gt;
&lt;li&gt;로직을 쿼리에 집중하기 보다는 객체자체에 집중 할 수 있다.&lt;/li&gt;
&lt;li&gt;빠른 개발이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점&lt;ul&gt;
&lt;li&gt;어렵다. (많은 내용이 감싸져 있기 때문에 알아야 할 것이 많다.)&lt;/li&gt;
&lt;li&gt;잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다. (persistence context)&lt;/li&gt;
&lt;li&gt;성능상 문제가 있을 수 있다. (이 문제 또한 잘 이해해야 해결이 가능하다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;6. Mybatis&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/49062985/79441556-5ca05700-8012-11ea-8cd3-7b3a6ee715b9.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개발자가 지정한 SQL, 저장 프로시저 그리고 몇 가지 고급 매핑을 지원하는 SQL Mapper이다.&lt;/li&gt;
&lt;li&gt;JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.&lt;br&gt;기존에 JDBC를 사용할 때는 DB와 관련된 여러 복잡한 설정(Connection)들을 다루어야 했지만 SQL Mapper는 자바 객체를 실제 SQL문에 연결함으로써, 빠른 개발과 편리한 테스트 환경을 제공한다.&lt;/li&gt;
&lt;li&gt;데이터베이스 record에 원시 타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 xml과 Annotation을 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;MyBatis는 원래 Apache Foundation의 iBatis였으나, 생산성, 개발 프로세스, 커뮤니티 등의 이유로 Google Code로 이전되면서 이름이 바뀌었다.&lt;br&gt;iBatis와 바뀐 차이점은 아래와 같다.&lt;br&gt;JDK 1.5, Annotation&lt;br&gt;Dynatic SQL, XML Element&lt;/li&gt;
&lt;li&gt;장점&lt;br&gt;SQL에 대한 모든 컨트롤을 하고자 할때 매우 적합하다.&lt;br&gt;SQL쿼리들이 매우 잘 최적화되어 있을 때에 유용하다.&lt;/li&gt;
&lt;li&gt;단점&lt;br&gt;애플리케이션과 데이터베이스 간의 설계에 대한 모든 조작을 하고자 할 때는 적합하지 않다.&lt;br&gt;애플리케이션과 데이터베이스 간에 서로 잘 구조화되도록 많은 설정이 바뀌어야 하기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;참고&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html&quot;&gt;https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html&lt;/a&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html&quot;&gt;https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html&lt;/a&gt;)&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <category>hibernate</category>
      <category>jdbc</category>
      <category>jpa</category>
      <category>Layer</category>
      <category>mybatis</category>
      <category>ORM</category>
      <category>sqlmapper</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/59</guid>
      <comments>https://aonee.tistory.com/59#entry59comment</comments>
      <pubDate>Sun, 19 Apr 2020 18:12:40 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 설정 및 구현 - 생명주기, MVC</title>
      <link>https://aonee.tistory.com/45</link>
      <description>&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt; 1. 빈(Bean) 객체의 생명주기(Life Cycle)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt; 2. 어노테이션을 이용한 스프링 설정&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt; 3&lt;/span&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;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&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;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt; 4&lt;/span&gt;&lt;/span&gt;. 스프링 MVC 웹서비스&amp;nbsp;&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;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&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;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;/span&gt;. STS를 이용하지 않은 웹 프로젝트&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;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&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;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt; 6&lt;/span&gt;&lt;/span&gt;. Service &amp;amp; Dao 객체 구현&amp;nbsp;&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;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&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;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt; 7&lt;/span&gt;&lt;/span&gt;. Controller 객체 구현&amp;nbsp;&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;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1. 빈(Bean) 객체의 생명주기(Life Cycle)&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;스프링 컨테이너 생성시점과 빈객체의 생성시점은 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;815&quot; height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cithSK/btqC9xsMxDM/uKMxj45aj3K1v4UwjqL371/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cithSK/btqC9xsMxDM/uKMxj45aj3K1v4UwjqL371/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cithSK/btqC9xsMxDM/uKMxj45aj3K1v4UwjqL371/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcithSK%2FbtqC9xsMxDM%2FuKMxj45aj3K1v4UwjqL371%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;815&quot; height=&quot;453&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;759&quot; height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg1A2Y/btqC8HCD1Is/xktjEXVlRwnhozMipGAkf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg1A2Y/btqC8HCD1Is/xktjEXVlRwnhozMipGAkf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg1A2Y/btqC8HCD1Is/xktjEXVlRwnhozMipGAkf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg1A2Y%2FbtqC8HCD1Is%2FxktjEXVlRwnhozMipGAkf1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;759&quot; height=&quot;294&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;703&quot; height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWrXV6/btqC9yLWZzk/MMBQ94lASW4vGK7XTqPMz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWrXV6/btqC9yLWZzk/MMBQ94lASW4vGK7XTqPMz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWrXV6/btqC9yLWZzk/MMBQ94lASW4vGK7XTqPMz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWrXV6%2FbtqC9yLWZzk%2FMMBQ94lASW4vGK7XTqPMz0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;703&quot; height=&quot;352&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt; 2&lt;/span&gt;. 어노테이션을 이용한 스프링 설정&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;595&quot; height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NaNKj/btqC9ySIm2X/I5FImACJlOo5gEMrDBDlNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NaNKj/btqC9ySIm2X/I5FImACJlOo5gEMrDBDlNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NaNKj/btqC9ySIm2X/I5FImACJlOo5gEMrDBDlNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNaNKj%2FbtqC9ySIm2X%2FI5FImACJlOo5gEMrDBDlNK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;595&quot; height=&quot;291&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QvKFe/btqC7q9esl2/arFKIY8g3uPgkDdqyysvkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QvKFe/btqC7q9esl2/arFKIY8g3uPgkDdqyysvkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QvKFe/btqC7q9esl2/arFKIY8g3uPgkDdqyysvkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQvKFe%2FbtqC7q9esl2%2FarFKIY8g3uPgkDdqyysvkK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4FFU/btqC86a4gQ0/0MMMFy7N0gN7MQaSm8EWi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4FFU/btqC86a4gQ0/0MMMFy7N0gN7MQaSm8EWi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4FFU/btqC86a4gQ0/0MMMFy7N0gN7MQaSm8EWi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4FFU%2FbtqC86a4gQ0%2F0MMMFy7N0gN7MQaSm8EWi1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&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;span&gt;3&lt;/span&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;/h3&gt;
&lt;p&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;13-1&amp;nbsp;웹프로그래밍을&amp;nbsp;구축하기&amp;nbsp;위한설계모델&amp;nbsp;&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&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;13-2&amp;nbsp;스프링MVC플레임워크&amp;nbsp;설계&amp;nbsp;구조&amp;nbsp;&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&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;13-3&amp;nbsp;DispatcherServlet&amp;nbsp;설정&amp;nbsp;&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&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;13-4&amp;nbsp;Controller&amp;nbsp;객체&amp;nbsp;-@Controller&amp;nbsp;&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&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;13-5&amp;nbsp;Controller&amp;nbsp;객체&amp;nbsp;-@RequestMapping&amp;nbsp;&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&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;13-6&amp;nbsp;Controller&amp;nbsp;객체&amp;nbsp;&amp;ndash;Model&amp;nbsp;타입의&amp;nbsp;파라미터&amp;nbsp;&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&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;13-7&amp;nbsp;View&amp;nbsp;객체&amp;nbsp;&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&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;13-8&amp;nbsp;전체적인&amp;nbsp;웹프로그래밍&amp;nbsp;구조&amp;nbsp;&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&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rbhfT/btqC8Ho8pop/7rjQLhMJ6zKKMW1hyCKNk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rbhfT/btqC8Ho8pop/7rjQLhMJ6zKKMW1hyCKNk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rbhfT/btqC8Ho8pop/7rjQLhMJ6zKKMW1hyCKNk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrbhfT%2FbtqC8Ho8pop%2F7rjQLhMJ6zKKMW1hyCKNk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFeZF/btqC6ReS6wj/VgBZ22XZ5l7DqxoIjoyYk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFeZF/btqC6ReS6wj/VgBZ22XZ5l7DqxoIjoyYk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFeZF/btqC6ReS6wj/VgBZ22XZ5l7DqxoIjoyYk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFeZF%2FbtqC6ReS6wj%2FVgBZ22XZ5l7DqxoIjoyYk0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc4fLl/btqC7qBmhCr/fxlltfKSTXae61QXhbA7Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc4fLl/btqC7qBmhCr/fxlltfKSTXae61QXhbA7Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc4fLl/btqC7qBmhCr/fxlltfKSTXae61QXhbA7Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc4fLl%2FbtqC7qBmhCr%2FfxlltfKSTXae61QXhbA7Wk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;동작&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;1. &lt;b&gt;Client -&amp;gt; DispatcherServlet&lt;/b&gt; 으로 요청 (&lt;span style=&quot;color: #333333;&quot;&gt;Request&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;2. &lt;b&gt;DispatcherServlet -&amp;gt; HandlerMapping&lt;/b&gt; 가장 적합한 Controller를 찾음&lt;/p&gt;
&lt;p&gt;3. &lt;b&gt;HandlerAdapter -&amp;gt; Controller 요청처리 -&amp;gt; DispatcherServlet&lt;/b&gt; 찾아준 Controller 안에 가장 적합한 메소드 찾음&lt;/p&gt;
&lt;p&gt;4. &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;DispatcherServlet -&amp;gt; ViewResolver&lt;/b&gt; 처리결과에 해당하는 View(JSP)가 어떤 것인지 찾아줌&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;5. &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;DispatcherServlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; -&amp;gt; View&lt;/b&gt; 응답 생성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;6. &lt;b&gt;View -&amp;gt; Client&lt;/b&gt; 화면에 응답&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWUEu/btqDeciUCkO/pqGyz3dMIeLnjDdBUkPHa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWUEu/btqDeciUCkO/pqGyz3dMIeLnjDdBUkPHa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWUEu/btqDeciUCkO/pqGyz3dMIeLnjDdBUkPHa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWUEu%2FbtqDeciUCkO%2FpqGyz3dMIeLnjDdBUkPHa0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mVuNl/btqDc3UigVL/DArWbeWP8bK4RWkhFvVI30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mVuNl/btqDc3UigVL/DArWbeWP8bK4RWkhFvVI30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mVuNl/btqDc3UigVL/DArWbeWP8bK4RWkhFvVI30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmVuNl%2FbtqDc3UigVL%2FDArWbeWP8bK4RWkhFvVI30%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qRfiv/btqDebEpdVr/7oD7nfvespllO1kKDzt7Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qRfiv/btqDebEpdVr/7oD7nfvespllO1kKDzt7Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qRfiv/btqDebEpdVr/7oD7nfvespllO1kKDzt7Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqRfiv%2FbtqDebEpdVr%2F7oD7nfvespllO1kKDzt7Nk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7kOG/btqDc5xSW7g/xgiDMD5bhKm8YOeIsYi2MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7kOG/btqDc5xSW7g/xgiDMD5bhKm8YOeIsYi2MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7kOG/btqDc5xSW7g/xgiDMD5bhKm8YOeIsYi2MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7kOG%2FbtqDc5xSW7g%2FxgiDMD5bhKm8YOeIsYi2MK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7Anp/btqDeda5pbV/jmxTB13GK1W8BuT1t9hLMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7Anp/btqDeda5pbV/jmxTB13GK1W8BuT1t9hLMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7Anp/btqDeda5pbV/jmxTB13GK1W8BuT1t9hLMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7Anp%2FbtqDeda5pbV%2FjmxTB13GK1W8BuT1t9hLMk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7GN4/btqDgzD4Y31/rK8THOy5E8R0kDUzkYHyh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7GN4/btqDgzD4Y31/rK8THOy5E8R0kDUzkYHyh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7GN4/btqDgzD4Y31/rK8THOy5E8R0kDUzkYHyh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7GN4%2FbtqDgzD4Y31%2FrK8THOy5E8R0kDUzkYHyh0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2g5Fl/btqDdHcuIYS/wnJKjMNxA9iWcD4t8x6KAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2g5Fl/btqDdHcuIYS/wnJKjMNxA9iWcD4t8x6KAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2g5Fl/btqDdHcuIYS/wnJKjMNxA9iWcD4t8x6KAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2g5Fl%2FbtqDdHcuIYS%2FwnJKjMNxA9iWcD4t8x6KAK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&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;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;. 스프링 MVC 웹서비스&amp;nbsp;&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;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;STS를이용한&amp;nbsp;웹프로젝트&amp;nbsp;생성&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15-1&amp;nbsp;프로젝트&amp;nbsp;전체구조&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15-2&amp;nbsp;web.xml&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15-3&amp;nbsp;DispatcherServlet&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15-4&amp;nbsp;servlet-context.xml&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15-5&amp;nbsp;Controller(컨트롤러)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15-6&amp;nbsp;View(뷰)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwXAPO/btqDhuJal0s/T40CkKaS1Gt6XCKJidBAg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwXAPO/btqDhuJal0s/T40CkKaS1Gt6XCKJidBAg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwXAPO/btqDhuJal0s/T40CkKaS1Gt6XCKJidBAg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwXAPO%2FbtqDhuJal0s%2FT40CkKaS1Gt6XCKJidBAg0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;web.xml&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DispatcherServlet 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1586242698536&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Processes application requests --&amp;gt;
	&amp;lt;servlet&amp;gt;
		&amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
		&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;/WEB-INF/spring/appServlet/servlet-context.xml&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
		&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
	&amp;lt;/servlet&amp;gt;
		
	&amp;lt;servlet-mapping&amp;gt;
		&amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt;
	&amp;lt;/servlet-mapping&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에 한글깨지지 않도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1586242759088&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;filter&amp;gt;
		&amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
		&amp;lt;filter-class&amp;gt;
			org.springframework.web.filter.CharacterEncodingFilter     
		&amp;lt;/filter-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;   
			&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;  
			&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
	&amp;lt;/filter&amp;gt;    

	&amp;lt;filter-mapping&amp;gt;
		&amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;                 
	&amp;lt;/filter-mapping&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;web.xml&lt;/p&gt;
&lt;p&gt;서블릿으로&amp;nbsp;등록&amp;nbsp;될&amp;nbsp;때contextConfigLocation이름으로초기화&amp;nbsp;파라미&amp;nbsp;터를&amp;nbsp;&lt;a href=&quot;servlet-context.xml로&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;servlet-context.xml로&lt;/a&gt;&amp;nbsp;지정하고&amp;nbsp;있는데&amp;nbsp;이때&amp;nbsp;지정된&amp;nbsp;&lt;a href=&quot;servlet-context.xml파일이&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;servlet-context.xml파일이&lt;/a&gt;&amp;nbsp;스프링&amp;nbsp;설정의&amp;nbsp;역할을&amp;nbsp;하는&amp;nbsp;파일이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1586242911794&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;/WEB-INF/spring/appServlet/servlet-context.xml&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;servlet-context.xml&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로젝트에 필요한 객체(빈:bean) 를생성하고 조립한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1586242966795&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
		&amp;lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&amp;gt;
		&amp;lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&amp;gt;
	&amp;lt;/beans:bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;&lt;span&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;b&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;. Controller 객체 구현&amp;nbsp;&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;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;18-1&amp;nbsp;웹어플리케이션&amp;nbsp;준비&amp;nbsp;&lt;/p&gt;
&lt;p&gt;18-2&amp;nbsp;@RequestMapping을이용한&amp;nbsp;URL맵핑&amp;nbsp;&lt;/p&gt;
&lt;p&gt;18-3&amp;nbsp;요청파라미터&lt;/p&gt;
&lt;p&gt;19-1&amp;nbsp;@ModelAttribute&amp;nbsp;&lt;/p&gt;
&lt;p&gt;19-2&amp;nbsp;커맨드객체&amp;nbsp;프로퍼티&amp;nbsp;데이터타입&amp;nbsp;&lt;/p&gt;
&lt;p&gt;19-3&amp;nbsp;Model&amp;nbsp;&amp;amp;&amp;nbsp;ModelAndViewspring&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UShgK/btqDfCg6kW8/xMfZhh9Tk9VsXvROSzS7j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UShgK/btqDfCg6kW8/xMfZhh9Tk9VsXvROSzS7j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UShgK/btqDfCg6kW8/xMfZhh9Tk9VsXvROSzS7j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUShgK%2FbtqDfCg6kW8%2FxMfZhh9Tk9VsXvROSzS7j1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Controller -&amp;gt; Service -&amp;gt; Dao&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MemberController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1586243310180&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/member&quot;)
public class MemberController {

	@Autowired
	MemberService service;
    
    @RequestMapping(value = &quot;/memJoin&quot;, method = RequestMethod.POST)
	public String memJoin(Member member) {
		
		service.memberRegister(member);
		
		return &quot;memJoinOk&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MemberService.java&lt;/p&gt;
&lt;pre id=&quot;code_1586243613192&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MemberService{
	void memberRegister( Member member );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MemberServiceImpl.java&lt;/p&gt;
&lt;pre id=&quot;code_1586243724582&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class MemberServiceImpl implements MemberService{
	@AutoWired
    MemberDao dao;
    
    @Override
    public void memberRegister (Member member)
    {
    	printMembers(dao.memberInsert(member));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MemberDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1586243771981&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MemberDao{
	Map&amp;lt;String, Member&amp;gt; memberInsert (Member member);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MemberDaoImpl.java&lt;/p&gt;
&lt;pre id=&quot;code_1586243912199&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
public class MemberDaoImpl implements MemberDao{
	private HashMap&amp;lt;String, Member&amp;gt; dbMap;
    
    public MemberDaoImpl(){
    	dbMap = new HashMap&amp;lt;String, Member&amp;gt;
    }
    
    @Override
    public Map&amp;lt;String, Member&amp;gt; memberInsert (Member member){
    	dbMap.put(member.getMemId(), member);
        return dbMap;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/45</guid>
      <comments>https://aonee.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 12 Apr 2020 23:47:59 +0900</pubDate>
    </item>
    <item>
      <title>[Android] MVVM 패턴 적용해보며 배우기(2) - RxJava2</title>
      <link>https://aonee.tistory.com/49</link>
      <description>&lt;h3&gt; 목차 &lt;/h3&gt;
&lt;h4&gt;  RxJava 란?&lt;/h4&gt;
&lt;h4&gt;  RxJava 장점&lt;/h4&gt;
&lt;h4&gt;  &lt;strong&gt;Observable과 Observer&lt;/strong&gt;&lt;/h4&gt;
&lt;h4&gt;  &lt;strong&gt;Scheduler&lt;/strong&gt;&lt;/h4&gt;
&lt;h4&gt;  Disposable&lt;/h4&gt;
&lt;h4&gt;  실습 - RxJava2 적용&lt;/h4&gt;
&lt;p&gt;  &lt;a href=&quot;https://aonee.tistory.com/entry/Android-ACC-MVVM%ED%8C%A8%ED%84%B4-Repository-LiveData-DataBinding-%EA%B3%B5%EB%B6%80-%ED%9B%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0,&quot; title=&quot;[Android] MVVM 패턴 적용해보며 배우기(1) - ACC, MVC와 MVVM비교, MVVM 장점&quot;&gt;[Android] MVVM 패턴 적용해보며 배우기(1) - ACC, MVC와 MVVM비교, MVVM 장점&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RxJava개념 정리 및 실습에 많은 도움이 됐던 시연이 포스팅 !!&lt;/p&gt;
&lt;p&gt;시연이 덕분에 쉽게 RxJava에 대해 공부할 수 있었다.&lt;/p&gt;
&lt;p&gt;시연이 포스팅을 참고해 RxJava에 대해 재정리 해봤다.&lt;/p&gt;
&lt;p&gt;  시스토리 - &lt;a href=&quot;https://ssionii.tistory.com/7&quot;&gt;안드로이드 프로젝트에 RxJava 적용하기&lt;/a&gt; GOOD   여기에 더 자세히 정리되어있다 !&lt;/p&gt;
&lt;h2&gt;RxJava 란?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reactive Extensions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;비동기 이벤트 기반 프로그래밍 라이브러리&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;매 이벤트마다 그에 대응하는 동작을 정의하는 기존의 이벤트 처리 방식인 콜백 방식과 달리&lt;/p&gt;
&lt;p&gt;*&lt;em&gt;발생하는 이벤트를 이벤트 스트림에 전달하고, *&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;이벤트 스트림을 관찰하다가 원하는 이벤트를 감지하면 이에 따른 동작을 수행&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;RxJava 장점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;비동기 이벤트를 매우 쉽게 처리 가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이벤트나 데이터를 쉽게 가공 및 분배 가능&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Observable과 Observer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;옵서버블(Observable) ?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;_이벤트를 만들어내는(emit) 주체_로, 이벤트 스트림을 통해 만든 이벤트를 내보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;옵서버(Observer) ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;옵서버블에서 만들어진 _이벤트에 반응(react)_하며, 이벤트를 받았을 때 수행할 작업을 정의한다.&lt;/p&gt;
&lt;p&gt;이때, 옵서버가 옵서버블에서 만들어진 이벤트에 반응하려면&lt;/p&gt;
&lt;p&gt;옵서버블에서 발생하는 이벤트를 옵서버가 관찰해야하는데,&lt;/p&gt;
&lt;p&gt;이를 &amp;#39;옵서버가 옵서버블을 구독(subscribe)한다&amp;#39;라고 표현한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Scheduler&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;작업을 수행할 스레드(thread)를 지정한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;스케쥴러는 observerOn() 메소드를 사용하여 지정하며,&lt;/p&gt;
&lt;p&gt;이 메소드를 호출한 직후에 오는 연산자나 옵서버에서 수행되는 작업이&lt;/p&gt;
&lt;p&gt;앞의 observerOn() 메소드에서 지정한 스레드에서 실행된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Disposable&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;옵서버가 옵서버블을 구독할 때 생성되는 객체로,&lt;/p&gt;
&lt;p&gt;옵서버블에서 만드는 이벤트 스트림과 이에 필요한 리소스를 관리한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;옵서버블로부터 더 이상 이벤트를 받지 않으려면 디스포저블을 통해 구독 해제(unsubscribe)를 할 수 있다.&lt;/p&gt;
&lt;p&gt;옵서버블은 이를 감지해 자신을 구독하고 있는 옵서버가 더 이상 없는 경우 이벤트를 만들기 위해 유지하고 있던 리소스(ex: 뷰에 대한 참조 등)을 해제한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;  실습 - RxJava2 적용&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Retrofit을 통해 받는 HTTP 응답을 Observable 형태로 받도록 수정&lt;/p&gt;
&lt;h4&gt;1) &lt;strong&gt;build.gradle (Module.app)&lt;/strong&gt; 에 아래 코드를 추가&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;implementation &amp;quot;com.squareup.retrofit2:adapter-rxjava2:2.5.0&amp;quot;
    // RxAndroid와 RxJava 라이브러리를 추가
    implementation &amp;#39;io.reactivex.rxjava2:rxandroid:2.0.1&amp;#39;
    implementation &amp;#39;io.reactivex.rxjava2:rxjava:2.1.3&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;strong&gt;2) 데이터 처리부 수정&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;AndBuddyService.kt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Call -&amp;gt; Observable 로 수정&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface AndBuddyService {
    @POST(&amp;quot;/users/signup&amp;quot;)
    fun postSignupUser(
        @Body() body: JsonObject
    ): Observable&amp;lt;PostSignupData&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;AndBuddyServiceImpl.kt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;.addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync()) 추가&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;object AndBuddyServiceImpl {
    private const val BASE_URL = &amp;quot;http://15.164.70.24:3456/&amp;quot;

    private val okHttpClient: OkHttpClient =
        OkHttpClient.Builder().addInterceptor(CookiesIntercepter())
            .addNetworkInterceptor(CookiesIntercepter()).build()

    private val retrofit: Retrofit =
        Retrofit.Builder().baseUrl(BASE_URL).client(
            okHttpClient
        )
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    val service: AndBuddyService = retrofit.create(
        AndBuddyService::class.java)
}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;3) 통신하는 부분 수정&lt;/h4&gt;
&lt;p&gt;옵서버블을 사용하여 API 호출 결과를 받을 것이기 때문에 Call 객체를 디스포저블 객체로 수정해야한다.&lt;/p&gt;
&lt;h5&gt;&lt;strong&gt;data 부분&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;RemoteDataSource.kt&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;interface RemoteDataSource { 
    fun signUp(jsonObject: JsonObject) : Observable&amp;lt;PostSignupData&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;RetmoteDataSourceImpl.kt&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;class RemoteDataSourceImpl : RemoteDataSource { 
   val api = AndBuddyServiceImpl.service

   override fun signUp(body: JsonObject) = api.postSignupUser(body).map{it}
}&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;SignupRepository.kt&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;class SignupRepository{
    val signupRemoteDataSource: RemoteDataSource = RemoteDataSourceImpl() //인스턴스 생성

    fun signUp( body: JsonObject ) : Observable&amp;lt;PostSignupData&amp;gt; =
        signupRemoteDataSource.signUp(body)
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;UI 부분&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SignupViewModel.kt&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;class SignupViewModel : ViewModel() {
    val signupRepository = SignupRepository()

    internal val disposables = CompositeDisposable()

    val isSuccessNetwork = MutableLiveData&amp;lt;Boolean&amp;gt;()
    val wifiDisconnect = MutableLiveData&amp;lt;Unit&amp;gt;()

    fun viewCommunicate(body: JsonObject) {
        disposables.add(signupRepository.signUp(body)
            .observeOn(AndroidSchedulers.mainThread())
            // 구독할 때 수행할 작업을 구현
            .doOnSubscribe {}
            // 스트림이 종료될 때 수행할 작업을 구현
            .doOnTerminate {}
            // 옵서버블을 구독
            .subscribe({
                // API를 통해 액세스 토큰을 정상적으로 받았을 때 처리할 작업을 구현
                // 작업 중 오류가 발생하면 이 블록은 호출되지 x

                // onResponse

                //if (it.isSuccessful){
                    isSuccessNetwork.value = true

                /*}else{ //아이디 중복
                    isSuccessNetwork.value = false

                    Log.d(&amp;quot;test&amp;quot;,  &amp;quot;아이디중복: &amp;quot; + it.message())
                }*/

            }) {
                // 에러 블록
                // 네트워크 오류나 데이터 처리 오류 등
                // 작업이 정상적으로 완료되지 않았을 때 호출


                // onFailure
                Log.d(&amp;quot;test&amp;quot;,  &amp;quot;통신 실패 error : &amp;quot; + it.toString())
                wifiDisconnect.value = Unit
            })
    }

    override fun onCleared() {
        disposables.clear()
        super.onCleared()
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Client/Android</category>
      <category>Android</category>
      <category>disposable</category>
      <category>Observable</category>
      <category>Observer</category>
      <category>RxJava</category>
      <category>rxjava장점</category>
      <category>scheduler</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/49</guid>
      <comments>https://aonee.tistory.com/49#entry49comment</comments>
      <pubDate>Wed, 8 Apr 2020 19:10:50 +0900</pubDate>
    </item>
    <item>
      <title>[Android] MVVM 패턴 적용해보며 배우기(1) - ACC, MVC와 MVVM비교, MVVM 장점</title>
      <link>https://aonee.tistory.com/48</link>
      <description>&lt;h3&gt; 목차 &lt;/h3&gt;
&lt;h4&gt;  안드로이드 아키텍처 컴포넌트 (AAC)&lt;/h4&gt;
&lt;h4&gt;  MVC 와 MVVM 차이점&lt;/h4&gt;
&lt;h4&gt;  MVVM 패턴&lt;/h4&gt;
&lt;h4&gt;  MVVM 장점&lt;/h4&gt;
&lt;h4&gt;  실습 - MVVM 패턴, Repository, BataBinding 적용&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이어지는 시리즈&lt;/b&gt;&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;https://aonee.tistory.com/49?category=369757&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt; [Android]&amp;nbsp;MVVM&amp;nbsp;패턴&amp;nbsp;적용해보며&amp;nbsp;배우기(2)&amp;nbsp;-&amp;nbsp;RxJava2&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;안드로이드 아키텍쳐 컴포넌트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;안드로이드 아키텍쳐 컴포넌트(Android Architecture Components, AAC)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;라이브러리 모음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;앱 구조를 더 튼튼하도록&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;테스트에 용이하도록&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;유지 보수성이 뛰어나도록&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;모듈화된 코딩을 돕기 위해 &lt;code&gt;Databinding&lt;/code&gt;, &lt;code&gt;LiveData&lt;/code&gt;, &lt;code&gt;ViewModel&lt;/code&gt; 등의 유용한 라이브러리를 제공&lt;/p&gt;
&lt;p&gt;이러한 라이브러리의 모음은 MVVM 패턴의 구조의 설계에 최적화되어 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3rGPS/btqDdIvdFVu/LUxxbjFJwGtylYd04OruS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3rGPS/btqDdIvdFVu/LUxxbjFJwGtylYd04OruS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3rGPS/btqDdIvdFVu/LUxxbjFJwGtylYd04OruS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3rGPS%2FbtqDdIvdFVu%2FLUxxbjFJwGtylYd04OruS0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;View - 뷰&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;UI Controller를 담당하는 Activity, Fragment이다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;화면에 무엇을 그릴지 결정하고, 사용자와 상호작용한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데이터의 변화를 감지하기 위한 옵저버를 가지고 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ViewModel - 뷰모델&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;뷰모델은 UI를 위한 데이터를 가지고 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;구성(configuration)이 변경되어도 살아남는다. (예를 들어 화면 회전이라던가, 언어 변경 등)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;AsyncTask&lt;/code&gt;는 액티비티나 프래그먼트의 생명 주기에서 자유로울 수 없지만,&lt;/p&gt;
&lt;p&gt;뷰모델은 뷰와 분리되어 있기 때문에 액티비티가 Destroy 되었다가 다시 Create 되어도 종료되지 않고 데이터를 여전히 가지고 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;LiveData - 라이브데이터&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;관찰이 가능한(Observable) 데이터 홀더 클래스이다.&lt;/li&gt;
&lt;li&gt;뷰에서 뷰모델의 라이브데이터를 관찰하게 되면 데이터가 변경될 때 내부적으로 자동으로 알려주게 된다.&lt;/li&gt;
&lt;li&gt;액티비티나 프래그먼트의 생명 주기를 인지한다. 즉, 액티비티가 화면 위에 활성화되어 있을 때에만 UI변경 등의 기능을 동작하게 되고, Destroy 된 상태에서는 동작하기 않기 때문에 메모리 릭의 발생을 줄여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Repository - 리포지토리&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;뷰모델과 상호작용하기 위해 잘 정리된(Clean) 데이터 API를 들고 있는 클래스이다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;앱에 필요한 데이터 (내장DB or 외부DB) 를 가져온다.&lt;/p&gt;
&lt;p&gt;뷰모델은 DB나 서버에 직접 접근하지 않고, 리포지토리에 접근하는 것으로 앱의 데이터를 관리한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Room - 룸&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SQLite 데이터베이스를 편하게 사용하게 해주는 라이브러리이다.&lt;/li&gt;
&lt;li&gt;SQLite의 코드를 직접 작성하는 경우, 직접 테이블을 Create 하거나 쿼리문을 일일이 변수를 통해 작성해주어야 했지만, Room을 쓰면 조금 더 직관적이고 편리하게 DB를 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;아키텍처 적용 전의 문제점&lt;/h2&gt;
&lt;p&gt;액티비티에 기능을 붙이다보면 액티비티가 무거워지거나 혹은 종속성이 너무 강해&lt;/p&gt;
&lt;p&gt;테스트가 힘들고 유지보수가 어려워진다.&lt;/p&gt;
&lt;h2&gt;MVVM 패턴&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;View - ViewModel - Model&lt;/code&gt; 을 이용해 각각의 역할을 분리하여&lt;/p&gt;
&lt;p&gt;가독성과 재사용성을 높인 디자인 패턴으로 종속성 및 유지보수의 어려움을 해소해준다.&lt;/p&gt;
&lt;h2&gt;MVC와 MVVM 차이점&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/brppPZ/btqDbEtBEp8/oPJJkr4n9wfGz8NZalCb40/img.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;MVC&lt;/b&gt; &lt;code&gt;(Model - View - Controller)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Activity 부분에서 View에게는 화면 업데이트, Model에게는 데이터 갱신을 알리며&lt;/p&gt;
&lt;p&gt;View와 Mdel을 연결해주며 비즈니스 로직을 처리하기 위해 많은 일을 해야한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;activity_main.xml 화면 부분으로 UI 역할 담당한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Model&lt;/b&gt;&lt;br /&gt;Model class로 비즈니스 로직에서의 알고리즘, 데이터 드의 기능 처리한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;MVVM&lt;/b&gt; &lt;code&gt;(View - ViewModel - Model)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Activity 역할을 담당하고 UI를 갱신하는 역할에만 충실히 한다.&lt;br /&gt;​ 뷰모델을 관찰(Observe) 한다.&lt;br /&gt;​ 따라서, 데이터의 변화를 알아차리고 자동으로 화면을 갱신할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;ViewModel&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Model에게 데이터 갱신 처리를 요청하고 잘 정리된 데이터를 참조한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Repository, DataBase 부분으로 데이터 처리 역할을 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;MVVM 장점&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;1. 뷰가 데이터를 실시간으로 관찰한다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;LiveData (=Observable 패턴) 을 이용해 DB를 관찰하고 자동으로 UI를 갱신한다.&lt;/p&gt;
&lt;p&gt;직접 뷰를 바꾸어주는 번거로움을 없애고 데이터와 불일치할 확률이 줄인다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 생명주기로부터 안전하여 메모리 릭을 방지할 수 있다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;뷰모델을 통해 데이터를 참조하기 때문에 액티비티/프래그먼트의 생명주기를 따르지 않는다.&lt;/p&gt;
&lt;p&gt;​ =&amp;gt; 화면전환과 같이 액티비티가 파괴된 후 재구성 되어도 뷰모델이 데이터를 홀드하고 있기 때문에&lt;/p&gt;
&lt;p&gt;​ 영향을 받지 않는다.&lt;/p&gt;
&lt;p&gt;뷰가 활성화되어있을 경우에만 작동하기 때문에 불필요한 메모리 사용을 줄일 수 있다.&lt;/p&gt;
&lt;p&gt;*&lt;i&gt;3. 기능별로 모듈화되어 있어 역할 분리를 할 수 있고 유닛 테스트에 한결 용이해진다. *&lt;/i&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;내장 DB를 통째로 바꾸고 싶다고 할 때, 뷰나 다른 코드에 깊게 종속돼있지 않아 DB 교체가 쉽다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;뷰모델과 뷰가 1:n 연결이 가능하다.&lt;/p&gt;
&lt;p&gt;따라서, 뷰모델에 하나의 메소드를 구현해 놓으면&lt;/p&gt;
&lt;p&gt;A 액티비티든 B 액티비티든 여러 뷰에서 호출해 재사용하기 편리하다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;실습 - MVVM 패턴, Repository, DataBinding 적용&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;얼리버디&lt;/code&gt; 프로젝트에 MVVM 아키텍처를 적용해 공부한 내용을 익혀보려 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CAspO/btqDcd3K0fO/MZT8zuNnxkkh0G7vGvRKp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CAspO/btqDcd3K0fO/MZT8zuNnxkkh0G7vGvRKp0/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;482&quot; height=&quot;443&quot; style=&quot;width: 65.2891%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CAspO/btqDcd3K0fO/MZT8zuNnxkkh0G7vGvRKp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCAspO%2FbtqDcd3K0fO%2FMZT8zuNnxkkh0G7vGvRKp0%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFkW2/btqDcdvUPZ2/rYWkqu1Wt1A4K8GEB0dFWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFkW2/btqDcdvUPZ2/rYWkqu1Wt1A4K8GEB0dFWk/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;200&quot; height=&quot;357&quot; style=&quot;width: 33.5481%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFkW2/btqDcdvUPZ2/rYWkqu1Wt1A4K8GEB0dFWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFkW2%2FbtqDcdvUPZ2%2FrYWkqu1Wt1A4K8GEB0dFWk%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;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;SignupActivity.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;var vm: SignupViewModel = SignupViewModel()

lateinit var binding : ActivitySignupBinding

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_signup)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_signup)
        makeController()

        binding.signupActivity = this

        addObserverableData()
    }

...

fun communication(id: String, pw: String) {
        var jsonObject = JSONObject()
        jsonObject.put(&quot;userId&quot;, id)
        jsonObject.put(&quot;userPw&quot;, pw)


        val body = JsonParser().parse(jsonObject.toString()) as JsonObject
        vm.viewCommunicate(body)
    }

     fun click() {
         communication(id, pw)
    }

    private fun View.showOrInvisible(show: Boolean) {
        visibility = if (show) {
            View.VISIBLE
        } else {
            View.INVISIBLE
        }
    }



    private fun idDuplicate(){
        act_signup_tv_id_ment.showOrInvisible(true)

    }

    private fun addObserverableData(){
        vm.isSuccessNetwork.observe(
            this, Observer {
                if(it){
                    val intent = Intent(this@SignupActivity, SignupSuccessActivity::class.java)
                    startActivity(intent)
                }else{
                    idDuplicate()
                }
                }
        )

        vm.wifiDisconnect.observe(
            this, Observer {
                val intent = Intent(this@SignupActivity, SignupFailActivity::class.java)
                startActivity(intent)
            }
        )
    }

}


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;SignupViewModel.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class SignupViewModel : ViewModel() {
    val signupRepository = SignupRepository()

    internal val disposables = CompositeDisposable()

    val isSuccessNetwork = MutableLiveData&amp;lt;Boolean&amp;gt;()
    val wifiDisconnect = MutableLiveData&amp;lt;Unit&amp;gt;()

    fun viewCommunicate(jsonObject: JsonObject) {

        val body = JsonParser().parse(jsonObject.toString()) as JsonObject
        Log.d(&quot;test&quot;, &quot;postUserData body : &quot; + body)

        signupRepository.signUp(body = body,
            onResponse = {
                //고차함수로 구현, it으로 response에 바로 접근 가능
                if (it.isSuccessful) {
                    val intent = Intent(this, SignupSuccessActivity::class.java)
                    startActivity(intent)
                    isSuccessNetwork.value = true

                } else { //아이디 중복
                    isSuccessNetwork.value = false

                    Log.d(&quot;test&quot;, &quot;아이디중복: &quot; + it.message())
                }

            }, onFailure = {
                //고차함수로 구현, it으로 t에 바로 접근 가능
                Log.d(&quot;test&quot;, &quot;통신 실패 error : &quot; + it.toString())
                wifiDisconnect.value = Unit
                val intent = Intent(this@SignupActivity, SignupFailActivity::class.java)
                startActivity(intent)
            }
        )
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;SignupRepository.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class SignupRepository{
    val retrofitRemoteDataSource: RemoteDataSource = RemoteDataSourceImpl() //인스턴스 생성
    fun signUp(
        jsonObject: JsonObject,
        onResponse: (Response&amp;lt;PostSignupData&amp;gt;) -&amp;gt; Unit,
        onFailure: (Throwable) -&amp;gt; Unit
    ){
        //생성한 인스턴스로 RempteDataSourceImpl에 구현해놓은 함수 실행
        retrofitRemoteDataSource.signUp(jsonObject, onResponse, onFailure)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;PostSignupData.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;data class PostSignupData (
    @SerializedName(&quot;status&quot;)
    val status: Int,
    @SerializedName(&quot;data&quot;)
    val idx: Int,
    @SerializedName(&quot;message&quot;)
    val message: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;AndBuddyService.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;interface AndBuddyService {
    @POST(&quot;/users/signup&quot;)
    fun postSignupUser(
        @Body() body: JsonObject
    ): Call&amp;lt;PostSignupData&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;AndBuddyServiceImpl.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;object AndBuddyServiceImpl {
    private const val BASE_URL = &quot;http://서버주소:3456/&quot;

    private val okHttpClient: OkHttpClient =
        OkHttpClient.Builder().addInterceptor(CookiesIntercepter())
            .addNetworkInterceptor(CookiesIntercepter()).build()

    private val retrofit: Retrofit =
        Retrofit.Builder().baseUrl(BASE_URL).client(
            okHttpClient
        )
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    val service: AndBuddyService = retrofit.create(
        AndBuddyService::class.java)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;RemoteDataSource.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;interface RemoteDataSource { //필요한 함수들을 모아서 정의하는 인터페이스
    fun signUp(jsonObject: JsonObject, //post에 필요한 값을 보낼 body
               onResponse: (Response&amp;lt;PostSignupData&amp;gt;) -&amp;gt; Unit, //통신 성공시 수행할 함수
               onFailure: (Throwable) -&amp;gt; Unit) //통신 실패시 수행할 함수
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;RetmoteDataSourceImpl.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class RemoteDataSourceImpl : RemoteDataSource { //RemoteDataSource를 상속받는 클래스
    override fun signUp(
        jsonObject: JsonObject,
        onResponse: (Response&amp;lt;PostSignupData&amp;gt;) -&amp;gt; Unit,
        onFailure: (Throwable) -&amp;gt; Unit
    ) {
        AndBuddyServiceImpl.service.postSignupUser(jsonObject).enqueue(object : //enqueue 함수 실행
            Callback&amp;lt;PostSignupData&amp;gt; {
            override fun onFailure(call: Call&amp;lt;PostSignupData&amp;gt;, t: Throwable) { //통신 실패시 실행되는 함수 구현
                onFailure(t)
            }

            override fun onResponse( //통신 성공시 실행되는 함수 구현
                call: Call&amp;lt;PostSignupData&amp;gt;,
                response: Response&amp;lt;PostSignupData&amp;gt;
            ) {
                onResponse(response)
            }
        })
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;build.gradle (Module: app)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;android {

    ...

    dataBinding {
        enabled = true
    }

}

dependencies {

    ...

    //Retrofit 라이브러리 : https://github.com/square/retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.6.2'
    //Retrofit 라이브러리 응답으로 가짜 객체를 만들기 위해
    implementation 'com.squareup.retrofit2:retrofit-mock:2.6.2'

    //객체 시리얼라이즈를 위한 Gson 라이브러리 : https://github.com/google/gson
    implementation 'com.google.code.gson:gson:2.8.6'
    //Retrofit 에서 Gson 을 사용하기 위한 라이브러리
    implementation 'com.squareup.retrofit2:converter-gson:2.6.2'

    //okHttp
    implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'
    implementation 'com.squareup.okhttp3:okhttp:3.8.1'

    //리사이클러뷰 라이브러리
    implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha06'
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;통신을 위한 퍼미션을 주기 위해 2가지를 추가해줘야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) AndroidManifest.xml&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;해당 코드를 추가해줘야 한다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt; &amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&amp;gt;
 &amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;2) CookiesIntercepter.kt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class CookiesIntercepter : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request =
            chain.request().newBuilder().header(&quot;Content-Type&quot;, &quot;application/json&quot;)
                .build()
        return chain.proceed(request)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;참고 &lt;a href=&quot;https://woovictory.github.io/2019/06/10/Android-MVVM/&quot;&gt;[Android] MVVM Part.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;해당 블로그에 설명이 매우 잘 되어있어서 공부 후 정리하는데 많은 도움이 되었다.&lt;/p&gt;</description>
      <category>Client/Android</category>
      <category>ACC</category>
      <category>Android</category>
      <category>databinding</category>
      <category>liveData</category>
      <category>MVC</category>
      <category>mvvm</category>
      <category>repository</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/48</guid>
      <comments>https://aonee.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 7 Apr 2020 01:25:31 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 스프링 프레임워크란? DI 의존주입이란? 의존주입방법</title>
      <link>https://aonee.tistory.com/32</link>
      <description>&lt;h3&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 목차&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;1. 스프링 프레임워크 란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;2. DI (Dependency Injection)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-1) DI 를 이용한 프로그래밍 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-2) 의존객체를 주입하는 다양한 방법&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-3) 스프링설정파일분리&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-4) 의존객체를 자동으로 주입하는 방법&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-5) 다수의 빈(Bean)객체 중 의존 객체의 대상이 되는 객체를 선택하는 방법&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;  &lt;b&gt;1. 스프링 프레임워크란?&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;스프링 프레임워크&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;주요기능&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;DI, AOP, MVC, JDBC 등을 제공&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- DI&lt;/b&gt; : 주입기능,&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- AOP&lt;/b&gt; : 관점지향 프로그래밍&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- IOC&lt;/b&gt; : Inversion of Control&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;스프링에서 객체를 생성하고 조립하는 컨테이너로, 컨테이너를 통해 생성된 객체를 빈이라고 부른다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;- 컨테이너 &lt;/b&gt;: 스프링에서 객체를 생성 및 조립&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;- 빈&lt;/b&gt; : 컨테이너를 통해 생성된 객체&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1) 객체생성 및 속성 데이터 작성 (xml&amp;nbsp; 문서)&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2) 스프링 컨테이너에서 객체 생성 및 조립 (스프링 컨테이너, 빈 생성 및 조립)&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3) 애플리케이션 구현 (java 문서)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;- maven&lt;/b&gt; : build tool&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;스프링 프레임워크 :&lt;/b&gt; 개발자들이 개발을 하기 위한 업무를 추상적으로 정의해놓은 틀&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;틀이 있어 본연의 업무에 집중할 수 있어 작업의 효율을 높일 수 있다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;제공하는 모듈 (=틀, 라이브러리)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 75.5572%; height: 100px;&quot; border=&quot;1&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.8067%; height: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;제공하는 모듈&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 76.1933%; height: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;기능&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.8067%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spring-core&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 76.1933%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스프링의 핵심인 DI &amp;amp; Ioc 제공&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.8067%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spring-aop&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 76.1933%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AOP 구현 기능 제공&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.8067%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spring-jdbc&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 76.1933%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DB 쉽게(=적은 양의 코드) 다룰 수 있는 기능 제공&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.8067%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spring-tx&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 76.1933%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스프링에서 제공하는 트랜젝션 관련 기능 제공&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 23.8067%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spring-webmvc&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 76.1933%; height: 18px;&quot;&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스프링에서 제공하는 컨트롤러와 뷰를 이용한 스프링 MVC 구현 기능 제공&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이용방법&lt;/b&gt; :&amp;nbsp; 모듈에 대한 의존설정을 개발 프로젝트에 XML 파일 등을 이용해 개발자가 직접&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;전체 프로젝트 구조&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qho7f/btqCFxBJnW5/fnLVtrKq4o9IVoUmFf5rlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qho7f/btqCFxBJnW5/fnLVtrKq4o9IVoUmFf5rlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qho7f/btqCFxBJnW5/fnLVtrKq4o9IVoUmFf5rlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQho7f%2FbtqCFxBJnW5%2FfnLVtrKq4o9IVoUmFf5rlk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;  2. &lt;b&gt;DI (Dependency Injection)&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;- &lt;b&gt;1) &lt;/b&gt;DI 를 이용한 프로그래밍 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;의존주입&lt;span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;방법론이다. (&lt;span style=&quot;color: #333333;&quot;&gt;spirng만의 방법은 아님&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;구현방법은 @Autowired와@Resource 어노테이션을 이용해서 쉽게구현할수있다. &lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;ex)&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;배터리 일체형&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;배터리 분리형&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;공통점 : 둘다 배터리에 의존한다. 배터리 의존을 주입.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;차이점 : 분리형이 일체형보다 유연하다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;2. 스프링 DI 설정 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AR5NF/btqCF7bI8bH/7HfGKubz7i10nstssg6sz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AR5NF/btqCF7bI8bH/7HfGKubz7i10nstssg6sz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AR5NF/btqCF7bI8bH/7HfGKubz7i10nstssg6sz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAR5NF%2FbtqCF7bI8bH%2F7HfGKubz7i10nstssg6sz0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;생성할 때 주입&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;모든 service에 dao를 넣어주고 있음&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;StudentDao.java&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;StudentDao &lt;span style=&quot;color: #333333;&quot;&gt;studentDao &lt;/span&gt;= new &lt;span style=&quot;color: #333333;&quot;&gt;StudentDao( );&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Service service= new Service(&lt;span style=&quot;color: #333333;&quot;&gt;StudentDao&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;=같다&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;applicationContext.xml&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;bean id=&quot;&lt;span style=&quot;color: #333333;&quot;&gt;studentDao&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&quot; class=&quot;ems.member.dao.StudentDao&quot; /&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;bean id=&quot;service&quot; class=&quot;ems.member.service.Service&quot;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;construct-arg ref=&quot;&lt;span style=&quot;color: #333333;&quot;&gt;studentDao&lt;/span&gt;&quot; /&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;construct-arg태그를 통해 생성자 생성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;- 2) 의존객체를 주입하는 다양한 방법&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;①&amp;nbsp;생성자를 이용한 의존 객체 주입&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y8K2N/btqCGR0PWJH/Brx2IZWnqtFMN3U6lYediK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y8K2N/btqCGR0PWJH/Brx2IZWnqtFMN3U6lYediK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y8K2N/btqCGR0PWJH/Brx2IZWnqtFMN3U6lYediK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy8K2N%2FbtqCGR0PWJH%2FBrx2IZWnqtFMN3U6lYediK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;②&amp;nbsp;setter를 이용한 의존 객체 주입&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;755&quot; height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rwNXv/btqCF7iC7hq/y3PtLqKKeeJ3lnIylk11pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rwNXv/btqCF7iC7hq/y3PtLqKKeeJ3lnIylk11pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rwNXv/btqCF7iC7hq/y3PtLqKKeeJ3lnIylk11pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrwNXv%2FbtqCF7iC7hq%2Fy3PtLqKKeeJ3lnIylk11pK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;755&quot; height=&quot;199&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;③&amp;nbsp;List 타입 의존 객체 주입&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;768&quot; height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R1Bz4/btqCKBoYzQL/k3BU8dXH2kvaNCbbGgYp2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R1Bz4/btqCKBoYzQL/k3BU8dXH2kvaNCbbGgYp2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R1Bz4/btqCKBoYzQL/k3BU8dXH2kvaNCbbGgYp2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR1Bz4%2FbtqCKBoYzQL%2Fk3BU8dXH2kvaNCbbGgYp2K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;768&quot; height=&quot;243&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;④&amp;nbsp;Map 타입 의존 객체 주입&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;570&quot; height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K5jT9/btqCKAwOki1/UEjQf7qAXh49zGDO6tY9HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K5jT9/btqCKAwOki1/UEjQf7qAXh49zGDO6tY9HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K5jT9/btqCKAwOki1/UEjQf7qAXh49zGDO6tY9HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK5jT9%2FbtqCKAwOki1%2FUEjQf7qAXh49zGDO6tY9HK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;570&quot; height=&quot;232&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;- 3) 스프링설정파일분리&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;원인&lt;/b&gt; : &lt;span style=&quot;color: #333333;&quot;&gt;하나의 xml 파일에 너무 많은 파일이 담기면 가독성 및 관리 떨어짐&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목적&lt;/b&gt; : 가독성 up, 유지 보수 up&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;1. 스프링 설정 파일 분리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;669&quot; height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baUKU2/btqCJmFPYyi/M99kSwOE7LpYgSC2PUckIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baUKU2/btqCJmFPYyi/M99kSwOE7LpYgSC2PUckIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baUKU2/btqCJmFPYyi/M99kSwOE7LpYgSC2PUckIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaUKU2%2FbtqCJmFPYyi%2FM99kSwOE7LpYgSC2PUckIk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;669&quot; height=&quot;299&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 빈(Bean)의 범위&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;782&quot; height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nkSi3/btqCLeAjFjJ/olPLEMrXg1wbbFikWfCLM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nkSi3/btqCLeAjFjJ/olPLEMrXg1wbbFikWfCLM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nkSi3/btqCLeAjFjJ/olPLEMrXg1wbbFikWfCLM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnkSi3%2FbtqCLeAjFjJ%2FolPLEMrXg1wbbFikWfCLM0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;782&quot; height=&quot;393&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;- 4) 의존객체를 자동으로 주입하는 방법&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;① 의존객체 자동 주입이란?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;스프링 설정 파일에서 의존 객체를 주입할 때&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;constructor-org&amp;gt; 또는 &amp;lt;property&amp;gt; 태그로 의존 대상 객체를 명시하지 않아도&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;의존 대상 객체가 필요한 객체에 주입해 주는 기능이다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;구현 방법은&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;@Autowired 와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;656&quot; height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LOTds/btqCKzTdsx6/NfW7b7OCTn8teLNfLq7zVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LOTds/btqCKzTdsx6/NfW7b7OCTn8teLNfLq7zVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LOTds/btqCKzTdsx6/NfW7b7OCTn8teLNfLq7zVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLOTds%2FbtqCKzTdsx6%2FNfW7b7OCTn8teLNfLq7zVK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;656&quot; height=&quot;258&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;② @Autowired&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;643&quot; height=&quot;320&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kzews/btqCKf8yODC/xxRxPPr3k9pIcTxdDX6HyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kzews/btqCKf8yODC/xxRxPPr3k9pIcTxdDX6HyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kzews/btqCKf8yODC/xxRxPPr3k9pIcTxdDX6HyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKzews%2FbtqCKf8yODC%2FxxRxPPr3k9pIcTxdDX6HyK%2Fimg.png&quot; width=&quot;643&quot; height=&quot;320&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;appCtxUseAutoWired.xml에&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;constructor-org&amp;gt; 또는 &amp;lt;property&amp;gt;&lt;span&gt; 태그 없이&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;lt;context:annotation-config /&amp;gt; 와&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;xsi:schemaLocation=&quot;&quot;에 spring-beans.xsd, context, context/spring-context.xsd 추가&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1584423515612&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;

&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans 
 		http://www.springframework.org/schema/beans/spring-beans.xsd 
 		http://www.springframework.org/schema/context 
 		http://www.springframework.org/schema/context/spring-context.xsd&quot;&amp;gt;

	&amp;lt;context:annotation-config /&amp;gt;

	&amp;lt;bean id=&quot;wordDao&quot; class=&quot;com.word.dao.WordDao&quot; /&amp;gt;
    
	&amp;lt;bean id=&quot;registerService&quot; class=&quot;com.word.service.WordRegisterServiceUseAutowired&quot; /&amp;gt;
	
	&amp;lt;bean id=&quot;searchService&quot; class=&quot;com.word.service.WordSearchServiceUseAutowired&quot; /&amp;gt;
	
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;생성자 생성에 사용시&lt;/p&gt;
&lt;pre id=&quot;code_1584423564754&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AutoWired
public WordSearchService (WordDao wordDao){
  this.wordDao = wordDao;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;프로퍼티 또는 메서드에도 넣어줄 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584423599323&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AutoWired
private WordDao wordDao;

public WordRegisterServiceUseAutowired() {
		// TODO Auto-generated constructor stub
	}

@AutoWired
public void setWordDao( WordDao wordDao){

    this.wordDao = wordDao;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단, &lt;span style=&quot;color: #333333;&quot;&gt;프로퍼티 또는 메서드에서 사용시에는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;반드시 default 생성자를 명시해줘야한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;why?&amp;nbsp; 객체가 생성돼야지 프로퍼티에서 &lt;span style=&quot;color: #333333;&quot;&gt;WordDao를 끌어올 수 있고&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;this.wordDao = wordDao; 에 &lt;span style=&quot;color: #333333;&quot;&gt;WordDao를 넣어줄 수 있기 때문이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;③ @Resource&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;591&quot; height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4TjUI/btqCKBwJEc1/STkdJ4vcH6dupkPWYv808K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4TjUI/btqCKBwJEc1/STkdJ4vcH6dupkPWYv808K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4TjUI/btqCKBwJEc1/STkdJ4vcH6dupkPWYv808K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4TjUI%2FbtqCKBwJEc1%2FSTkdJ4vcH6dupkPWYv808K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;591&quot; height=&quot;286&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;-&lt;span&gt; 5) &lt;/span&gt;다수의 빈(Bean)객체 중 의존 객체의 대상이 되는 객체를 선택하는 방법&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;① 의존객체 선택&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-3), 4) , 5) 비교&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;3) 에서는 개발자가 직접 주입했음.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;bean id=&quot;service&quot; class=&quot;ems.member.service.Service&quot;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;construct-arg ref=&quot;&lt;span style=&quot;color: #333333;&quot;&gt;studentDao&lt;/span&gt;&quot; /&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;4) 에서는&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;context:annotation-config /&amp;gt;&lt;br /&gt;com.word.dao.WordDao&quot; /&amp;gt; &amp;nbsp; &amp;nbsp;&lt;br /&gt;com.word.service.WordRegisterServiceUseAutowired&quot;&amp;nbsp;/&amp;gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;@AutoWired &lt;br /&gt;public&amp;nbsp;WordSearchService&amp;nbsp;(WordDao&amp;nbsp;wordDao){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;this.wordDao&amp;nbsp;=&amp;nbsp;wordDao; &lt;br /&gt;}&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;빈객체의 이름을 이용해서 주입했음&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;5) 여기에서는&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다수의 빈을 사용할 경우&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@AutoWired&lt;span&gt; 가 많을 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;어떤 빈을 사용할지 선택해줌&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtYQqm/btqCMnYRT3I/okn2DQrqcd2WMqfgwEHMMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtYQqm/btqCMnYRT3I/okn2DQrqcd2WMqfgwEHMMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtYQqm/btqCMnYRT3I/okn2DQrqcd2WMqfgwEHMMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtYQqm%2FbtqCMnYRT3I%2Fokn2DQrqcd2WMqfgwEHMMK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;633&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Exception 왜?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;자동 주입 대상 객체를 판단하지 못해&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;해결방법?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;qualifier value = &quot;&quot; /&amp;gt; 태그를 사용해서 명시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwBwWI/btqCM88blHb/GQAT7SoDYVc5HsEo8sU2E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwBwWI/btqCM88blHb/GQAT7SoDYVc5HsEo8sU2E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwBwWI/btqCM88blHb/GQAT7SoDYVc5HsEo8sU2E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwBwWI%2FbtqCM88blHb%2FGQAT7SoDYVc5HsEo8sU2E0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;490&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;②의존객체 자동 주입 체크&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;자동 의존 객체가 존재하지 않으면 Exception발생한다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;그러나, &lt;span style=&quot;color: #333333;&quot;&gt;Exception 발생하기 않도록 하고 싶다면? &lt;span style=&quot;color: #333333;&quot;&gt;@Autowird (required = false)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;=&amp;gt; 해당 방법은 잘 쓰이지 않는다. 사용하지 마세요.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;③ @Inject&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Autowird와 유사. &lt;span style=&quot;color: #333333;&quot;&gt;(required = false)는 사용 불가.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Autowird VS &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;@Inject&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Autowird가 더 많이 쓰인다.&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Autowird&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Qualifier(&quot;qualifier value 명&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Inject&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Named(value=&quot;사용하려는 빈객체의 id명&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <category>dependencyInjection</category>
      <category>DI</category>
      <category>spring</category>
      <category>springframework</category>
      <category>의존주입방법</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/32</guid>
      <comments>https://aonee.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 1 Apr 2020 19:31:12 +0900</pubDate>
    </item>
    <item>
      <title>Bouncy Castle의 ECDSA를 이용한 신원 인증 시스템 개발</title>
      <link>https://aonee.tistory.com/43</link>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;개인키와 공개키가 파일 형태로 컴퓨터에 남아있어서 저장하거나 불러오는 작업 수행 가능하도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;Bouncy Castle&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: Java에서 타원 곡선 암호화 기술을 쉽게 이용 가능하도록 해주는 라이브러리&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;타원 곡선 암호화 기술에 필요한 라이브러리 : bcprov-jdk15on-159.jar와 bcpkix-jdkon-159.jar&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://www.bouncycastle.org/latest_releases.html&quot;&gt;https://www.bouncycastle.org/latest_releases.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;두 파일을 다운로드 후 프로젝트에 Drag and Drop&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;두 파일 우클릭 후 'Add to Build Path'&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;인증서&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 컴퓨터에 저장된 개인키/공개키 파일&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;일반적으로 인증서 정보는 byte 형태로 저장되어있어 읽거나 처리가 어려우므로 키 데이터를 Base64 알고리즘을 이용해 사용하기 쉬운 형태로 인코딩 해서 관리함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;PEM(Privacy Enhanced Mail) : 인코딩된 파일 .pem 확장자&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;코드 설명&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;임의의 타원 곡선 암호 키 생성&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;.pem 확장자로 내보내서 개인키/공개키를 컴퓨터 내에 저장&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;Pem.java : 특정한 개인키 혹은 공개키 정보를 읽어서 저장한 뒤에 파일로 내보내는 역할&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;EC.java : 타원 곡선 암호화 기술을 이용해 개인키 및 공개키를 생성해 저장 (sect163k1 알고리즘 사용)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;BlockchainStarter.java : 실행&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;Pem.java&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585501222985&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 특정한 개인키, 공개키 정보를 읽어 저장한 뒤에 파일로 내보내는 역할을 수행
package util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.security.*;

import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;

public class Pem {
	
	private PemObject pemObject;
	
	// Key data, description PEM 객체에 저장
	public Pem (Key key, String description) {
		this.pemObject = new PemObject(description, key.getEncoded());
	}
	
	// 특정한 파일 이름으로 PEM 파일 저장
	public void write(String filename) throws FileNotFoundException, IOException {
		PemWriter pemWriter = new PemWriter(new OutputStreamWriter(new FileOutputStream(filename)));
		try {
			pemWriter.writeObject(this.pemObject);
		} finally {
			pemWriter.close();
		}
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 contenteditable=&quot;true&quot;&gt;&lt;span&gt;EC.java&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1585501243460&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;

public class EC {
	// 세부 알고리즘 sect163k1
	private final String ALGORITHM = &quot;sect163k1&quot;;
	
	public void generate(String privateKeyName, String publicKeyName) throws Exception {
		// ECDSA(bouncy castle의 타원 곡선 표준 알고리즘) 사용
		KeyPairGenerator generator = KeyPairGenerator.getInstance(&quot;ECDSA&quot;, &quot;BC&quot;);
		
		// 세부 알고리즘 sect163k1
		ECGenParameterSpec ecsp;
		ecsp = new ECGenParameterSpec(ALGORITHM);
		generator.initialize(ecsp, new SecureRandom());
		
		// 해당 알고리즘으로 랜덤의 키 한 쌍 생성
		KeyPair keyPair = generator.generateKeyPair();
		System.out.println(&quot;타원곡선 암호키 한 쌍을 생성했습니다.&quot;);
		
		// 생성한 키 한쌍에서 개인키와 공개키를 추출
		PrivateKey priv = keyPair.getPrivate();
		PublicKey pub = keyPair.getPublic();
		
		// 개인키와 공개키를 특정한 파일 이름으로 저장
		writePemFile(priv, &quot;EC PRIVATE KEY&quot;, privateKeyName);
		writePemFile(priv, &quot;EC PUBLIC KEY&quot;, publicKeyName);
		
	}

	// PEM 클래스로 생성된 암호키를 파일로 저장하는 함수
	private void writePemFile(Key key, String description, String filename) 
				throws FileNotFoundException, IOException {
		Pem pemFile = new Pem(key, description);
		pemFile.write(filename);
		
		System.out.println(String.format(&quot;EC 암호키 %s를 %s 파일로 내보냈습니다.&quot;, 
				description, filename));
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 contenteditable=&quot;true&quot;&gt;&lt;span&gt;BlockchainStarter.java&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1585501262647&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package core;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import util.EC;

public class BlockChainStarter {
	public static void main(String[] args) throws Exception {
		
		// 바운시 캐슬의 암호화 라이브러리 사용
		Security.addProvider(new BouncyCastleProvider());
		
		// 타원 곡선 객체 생성 개인키과 공개키를 각각 private.pem public.pem으로 저장
		EC ec = new EC();
		ec.generate(&quot;private.pem&quot;, &quot;public.pem&quot;);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span&gt;실행 하면 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;private.pem&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;public.pem&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 두 파일 생성된 것을 확인 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;작성된 파일은 랜덤으로 생성해서 저장하기에 매번 키 값이 변경된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 contenteditable=&quot;true&quot;&gt;&lt;span&gt;private.pem&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1585501548743&quot; class=&quot;html xml&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-----BEGIN RSA PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKb7IQ+niN9SbTp6
0XAmCapWJ0qoZM8D/yLft7tmx0loXjWwO4yjP78qO9Z0VsEFoC94NvjtWjhpFmMZ
pg9n0mYY4Wm4MzUaOW/LfQ+PlrBzDFmBJHgYnD6UBDuOnQWP7LUYHpPDI8zb2CIw
vTMgqTznmia7dpEb6aFlTebGOeDFAgMBAAECgYAVoN4bqbrmGEZbJojlwpuKY23j
8vNZyB3+PaWOAcZK6RiY0iqocQXDBFyrTrbk+g5RT7wpGo9O0rfKXspeYPeEud33
nHqs8l2vioOTIuSWU3SBWy6bpWcrYIH2gJnefQqNyKNE5vMOVHgaT5ssSrfjp0PC
VYPL3aScHjBOhV5E2QJBANNOZ6apDdpBdbETlCAeLbhQMi0YSawHiSs12mFmI+jn
JuWL2ZHAI6vSUKZo0N7J2bi5jmiI/RwnoaRmyGJCc40CQQDKTKTDPARuhTkDa8MX
PPFgUfWffOC3HvFETiY7Uw+dgXaMWcIrqR7S7alRpiLx3d5L9Zq0plHEcElrYNQL
/PgZAkEAmelqJkLNDETR7QFNy3cv5ijD44TlZKC4kPjQ8FDtpx93fYu4FinV0bmH
dS6ztRNhuuOtjwb5FiDn5E/ZdXjhoQJAaOYLPY1eguyj3qk/VUpto1N8eQHpCCuM
Ua3wVyy/2R1rmmVksP0WFavU85ihYCd7AIpPeUMQ/Tp4Z6yi58B56QJBAKsOofIR
05Cfg7QsyFQigapHw5+R9CuedmiYMiETcdOcCy4smLThBRghcyHh4uvDICRC89bf
o2ywjTZjPCKPWM0=
-----END RSA PRIVATE KEY-----
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 contenteditable=&quot;true&quot;&gt;&lt;span&gt;public.pem&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1585501551147&quot; class=&quot;html xml&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-----BEGIN RSA PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm+yEPp4jfUm06etFwJgmqVidK
qGTPA/8i37e7ZsdJaF41sDuMoz+/KjvWdFbBBaAveDb47Vo4aRZjGaYPZ9JmGOFp
uDM1Gjlvy30Pj5awcwxZgSR4GJw+lAQ7jp0Fj+y1GB6TwyPM29giML0zIKk855om
u3aRG+mhZU3mxjngxQIDAQAB
-----END RSA PUBLIC KEY-----
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;http://www.bitweb.co.kr/m/view.php?idx=886&quot;&gt;http://www.bitweb.co.kr/m/view.php?idx=886&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Security</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/43</guid>
      <comments>https://aonee.tistory.com/43#entry43comment</comments>
      <pubDate>Mon, 30 Mar 2020 02:09:01 +0900</pubDate>
    </item>
    <item>
      <title>[crawling] Selenium, BeautifulSoup을 이용한 크롤링 - 인터파크 여행지 크롤링</title>
      <link>https://aonee.tistory.com/40</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;757&quot; height=&quot;425&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFxe6/btqCShdDqvk/SOSM863aFFcKbrLIra1fz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFxe6/btqCShdDqvk/SOSM863aFFcKbrLIra1fz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFxe6/btqCShdDqvk/SOSM863aFFcKbrLIra1fz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFxe6%2FbtqCShdDqvk%2FSOSM863aFFcKbrLIra1fz0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;757&quot; height=&quot;425&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;전체 코드는 깃허브에 있습니다!   &lt;a href=&quot;https://github.com/devAon/Web-Scraping&quot;&gt;https://github.com/devAon/Web-Scraping&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 목차&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;1. 크롤링&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;2. 개발 환경 구축&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;3, 웹드라이버란?&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;4. Selenium 이란?&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;5. 웹 드라이버를 이용한 Selenium의 주요 API 습득&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;6. 크롤링 타겟 사이트 분석및 데이터 접근 실습&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;7.&amp;nbsp;Beautiful&amp;nbsp;Soup의&amp;nbsp;이해&amp;nbsp;및&amp;nbsp;API&amp;nbsp;습득&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;8.&amp;nbsp;수집&amp;nbsp;데이터의&amp;nbsp;전처리&amp;nbsp;및&amp;nbsp;DB&amp;nbsp;처리&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;  예제 - 인터파크 해외여행지 정보 크롤링&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 크롤링&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;크롤링이란?&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;웹&amp;nbsp;페이지를&amp;nbsp;그대로&amp;nbsp;가져와서&amp;nbsp;거기서&amp;nbsp;데이터를&amp;nbsp;추출해&amp;nbsp;내는&amp;nbsp;행위&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;머신러닝 영역 안에 빅데이터 처리 분석의 데이터 수집&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;selenium 과 Beautifulsoup을 이용해서 데이터 수집&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;-&amp;nbsp;크롤러&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;크롤링&amp;nbsp;소프트웨어&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;파이참 Pycharm&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;파이썬 라이브러리 설치방법&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;Settings - Project Interpreter - +버튼 클릭 - 원하는 라이브러리 검색 후 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 개발 환경 구축&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;언어&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;&lt;a href=&quot;python.exe.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;python.exe.&lt;/a&gt;&amp;nbsp;설치&amp;nbsp;(3.x)&amp;nbsp;&lt;/p&gt;
&lt;p&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 style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;selenium&amp;nbsp;설치&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;$ pip install selenium&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;bs4&amp;nbsp;설치&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Selenium VS BeautifulSoup&amp;nbsp; 차이&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Selenium&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BeautifulSoup은 사용자 행동을 특정해서 데이터를 가져올 수 없다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사용자의 행동을 동적으로 추가하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Selenium이 필요하다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;공식문서 :&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://selenium-python.readthedocs.io/&quot;&gt;https://selenium-python.readthedocs.io/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584935642707&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://selenium-python.readthedocs.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;position: relative; border-right: 1px solid #d9d9d9; width: 200px; height: 200px; background-size: cover; background-position: center center; background-image: url('&amp;quot;&amp;quot;');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot; style=&quot;position: relative; flex-grow: 1; height: 130px; padding-left: 40px;&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;line-height: 1.6; color: #000000; font-size: 22px; padding-bottom: 10px; max-width: 467px; text-overflow: ellipsis; white-space: nowrap; margin: 0px; overflow: hidden; font-family: 'Noto Sans', 'Noto Sans KR';&quot;&gt;Selenium with Python &amp;mdash; Selenium Python Bindings 2 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;line-height: normal; margin: 0px; max-width: 467px; text-overflow: ellipsis; overflow: hidden; font-family: 'Noto Sans DemiLight', sans-serif; font-size: 14px; font-weight: 300; font-style: normal; font-stretch: normal; letter-spacing: normal; color: #909090; max-height: 42px; -webkit-line-clamp: 2; -webkit-box-orient: vertical; display: -webkit-box;&quot;&gt;Note This is not an official documentation. If you would like to contribute to this documentation, you can fork this project in Github and send pull requests. You can also send your feedback to my email: baiju.m.mail AT gmail DOT com. So far 40+ community&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;line-height: 1.6; margin: 0px; position: absolute; bottom: -8px; font-family: AvenirNext; font-size: 14px; color: #909090;&quot;&gt;selenium-python.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BeautifulSoup&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;HTML과 XML을 파싱하는데 사용되는 파이썬 라이브러리이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;공식문서 :&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://www.crummy.com/software/BeautifulSoup/bs4/doc/&quot;&gt;https://www.crummy.com/software/BeautifulSoup/bs4/doc/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584935642711&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.crummy.com/software/BeautifulSoup/bs4/doc/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;position: relative; border-right: 1px solid #d9d9d9; width: 200px; height: 200px; background-size: cover; background-position: center center; background-image: url('https://scrap.kakaocdn.net/dn/bMa0nj/hyFn4AQziT/QHactM4BVr5TzUxauyKZ30/img.jpg?width=209&amp;amp;height=250&amp;amp;face=0_0_209_250');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot; style=&quot;position: relative; flex-grow: 1; height: 130px; padding-left: 40px;&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;line-height: 1.6; color: #000000; font-size: 22px; padding-bottom: 10px; max-width: 467px; text-overflow: ellipsis; white-space: nowrap; margin: 0px; overflow: hidden; font-family: 'Noto Sans', 'Noto Sans KR';&quot;&gt;Beautiful Soup Documentation &amp;mdash; Beautiful Soup 4.4.0 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;line-height: normal; margin: 0px; max-width: 467px; text-overflow: ellipsis; overflow: hidden; font-family: 'Noto Sans DemiLight', sans-serif; font-size: 14px; font-weight: 300; font-style: normal; font-stretch: normal; letter-spacing: normal; color: #909090; max-height: 42px; -webkit-line-clamp: 2; -webkit-box-orient: vertical; display: -webkit-box;&quot;&gt;Non-pretty printing If you just want a string, with no fancy formatting, you can call unicode() or str() on a BeautifulSoup object, or a Tag within it: str(soup) # ' I linked to example.com ' unicode(soup.a) # u' I linked to example.com ' The str() functio&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;line-height: 1.6; margin: 0px; position: absolute; bottom: -8px; font-family: AvenirNext; font-size: 14px; color: #909090;&quot;&gt;www.crummy.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;웹 드라이버&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Chrome 드라이버 설치&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://chromedriver.chromium.org/downloads&quot;&gt;https://chromedriver.chromium.org/downloads&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584879821963&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Downloads - ChromeDriver - WebDriver for Chrome&quot; data-og-description=&quot;WebDriver for Chrome&quot; data-og-host=&quot;chromedriver.chromium.org&quot; data-og-source-url=&quot;https://chromedriver.chromium.org/downloads&quot; data-og-url=&quot;https://chromedriver.chromium.org/downloads&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://chromedriver.chromium.org/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chromedriver.chromium.org/downloads&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;&gt;Downloads - ChromeDriver - WebDriver for Chrome&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;WebDriver for Chrome&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;chromedriver.chromium.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Phantom 드라이버 설치&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/detro/ghostdriver&quot;&gt;https://github.com/detro/ghostdriver&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584879796342&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;detro/ghostdriver&quot; data-og-description=&quot;Ghost Driver is an implementation of the Remote WebDriver Wire protocol, using PhantomJS as back-end - detro/ghostdriver&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/detro/ghostdriver&quot; data-og-url=&quot;https://github.com/detro/ghostdriver&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b95HYQ/hyFn2P8hi6/F10KK55KXuoCGKBaXccVGk/img.png?width=400&amp;amp;height=400&amp;amp;face=80_120_300_360&quot;&gt;&lt;a href=&quot;https://github.com/detro/ghostdriver&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/detro/ghostdriver&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b95HYQ/hyFn2P8hi6/F10KK55KXuoCGKBaXccVGk/img.png?width=400&amp;amp;height=400&amp;amp;face=80_120_300_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;detro/ghostdriver&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Ghost Driver is an implementation of the Remote WebDriver Wire protocol, using PhantomJS as back-end - detro/ghostdriver&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&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 style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;vs&amp;nbsp;code&amp;nbsp;설치&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;plugin&amp;nbsp;설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;vs code에서 ctrl + Shift + X -&amp;nbsp; 아래 4가지 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GjGJz/btqCRzrY6RS/6ixI9RlEUpVl2ZUV2G4PM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GjGJz/btqCRzrY6RS/6ixI9RlEUpVl2ZUV2G4PM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GjGJz/btqCRzrY6RS/6ixI9RlEUpVl2ZUV2G4PM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGjGJz%2FbtqCRzrY6RS%2F6ixI9RlEUpVl2ZUV2G4PM1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGHiMr/btqCQ4yVpm5/rCAEhNlHzr6DrKwotZLSK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGHiMr/btqCQ4yVpm5/rCAEhNlHzr6DrKwotZLSK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGHiMr/btqCQ4yVpm5/rCAEhNlHzr6DrKwotZLSK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGHiMr%2FbtqCQ4yVpm5%2FrCAEhNlHzr6DrKwotZLSK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3, 웹드라이버란?&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;자동화&amp;nbsp;설계&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;시나리오에&amp;nbsp;따른&amp;nbsp;움직임&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Selenium 이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;웹드라이버&amp;nbsp;띠우기&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;에이전트&amp;nbsp;조작&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;프록시&amp;nbsp;조작&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Selenium Getting Started&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584880770028&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get(&quot;http://www.python.org&quot;)
assert &quot;Python&quot; in driver.title
elem = driver.find_element_by_name(&quot;q&quot;)
elem.clear()
elem.send_keys(&quot;pycon&quot;)
elem.send_keys(Keys.RETURN)
assert &quot;No results found.&quot; not in driver.page_source
driver.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;(참고)&lt;/b&gt; &lt;a href=&quot;https://selenium-python.readthedocs.io/getting-started.html&quot;&gt;https://selenium-python.readthedocs.io/getting-started.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584880795943&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2. Getting Started &amp;mdash; Selenium Python Bindings 2 documentation&quot; data-og-description=&quot;2.2. Example Explained The selenium.webdriver module provides all the WebDriver implementations. Currently supported WebDriver implementations are Firefox, Chrome, IE and Remote. The Keys class provide keys in the keyboard like RETURN, F1, ALT etc. from se&quot; data-og-host=&quot;selenium-python.readthedocs.io&quot; data-og-source-url=&quot;https://selenium-python.readthedocs.io/getting-started.html&quot; data-og-url=&quot;https://selenium-python.readthedocs.io/getting-started.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://selenium-python.readthedocs.io/getting-started.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://selenium-python.readthedocs.io/getting-started.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;&gt;2. Getting Started &amp;mdash; Selenium Python Bindings 2 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;2.2. Example Explained The selenium.webdriver module provides all the WebDriver implementations. Currently supported WebDriver implementations are Firefox, Chrome, IE and Remote. The Keys class provide keys in the keyboard like RETURN, F1, ALT etc. from se&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;selenium-python.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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 style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;명시적 대기&lt;/b&gt; =&amp;gt; 특정 요소가 발견될 때까지 대기&lt;/p&gt;
&lt;pre id=&quot;code_1584882341773&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, &quot;myDynamicElement&quot;))
    )
finally:
    driver.quit()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;암묵적 대기&lt;/b&gt; -&amp;gt; DOM이 다 로드 될 때까지 대기하고 먼저 로드되면 바로 진행&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;절대적 대기&lt;/b&gt; -&amp;gt; time.sleep(10) -&amp;gt; 클라우드 페어 (디도스 방어 솔루션)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://selenium-python.readthedocs.io/waits.html&quot;&gt;https://selenium-python.readthedocs.io/waits.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584882185180&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;5. Waits &amp;mdash; Selenium Python Bindings 2 documentation&quot; data-og-description=&quot;5. Waits These days most of the web apps are using AJAX techniques. When a page is loaded by the browser, the elements within that page may load at different time intervals. This makes locating elements difficult: if an element is not yet present in the DO&quot; data-og-host=&quot;selenium-python.readthedocs.io&quot; data-og-source-url=&quot;https://selenium-python.readthedocs.io/waits.html&quot; data-og-url=&quot;https://selenium-python.readthedocs.io/waits.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://selenium-python.readthedocs.io/waits.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://selenium-python.readthedocs.io/waits.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;&gt;5. Waits &amp;mdash; Selenium Python Bindings 2 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;5. Waits These days most of the web apps are using AJAX techniques. When a page is loaded by the browser, the elements within that page may load at different time intervals. This makes locating elements difficult: if an element is not yet present in the DO&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;selenium-python.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 웹 드라이버를 이용한 Selenium의 주요 API 습득&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;페이지&amp;nbsp;접속&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;우회&amp;nbsp;접속&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;로그인및&amp;nbsp;검색&amp;nbsp;등&amp;nbsp;폼처리&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;찾기&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;추출하기&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6. 크롤링 타겟 사이트 분석및 데이터 접근 실습&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;-&amp;nbsp;search&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;result&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;rotation&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;selenium의&amp;nbsp;최대치&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7.&amp;nbsp;Beautiful&amp;nbsp;Soup의&amp;nbsp;이해&amp;nbsp;및&amp;nbsp;API&amp;nbsp;습득&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;when?&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;DOM&amp;nbsp;접근&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;콘텐츠&amp;nbsp;획득&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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;8.&amp;nbsp;수집&amp;nbsp;데이터의&amp;nbsp;전처리&amp;nbsp;및&amp;nbsp;DB&amp;nbsp;처리&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;디비&amp;nbsp;접속&amp;nbsp;처리&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;sql&amp;nbsp;&amp;nbsp;처리&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;-&amp;nbsp;크롤링&amp;nbsp;데이터&amp;nbsp;삽입&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;인터파크 해외여행지 정보 크롤링&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Interpark_travel_scraping.py&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;-Selenium&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-BueatifulSoup&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584897292292&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 인터파크 투어 사이트에서 여행지를 입력후 검색 -&amp;gt; 잠시후 -&amp;gt; 결과
# 로그인시 PC 웹 사이트에서 처리가 어려울 경우  -&amp;gt; 모바일 로그인 진입
# 모듈 가져오기
# pip install selenium
# pip install bs4
# pip install pymysql
from selenium import webdriver as wd
from bs4 import BeautifulSoup as bs
from selenium.webdriver.common.by import By
# 명시적 대기를 위해 
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from DbMgr import DBHelper as Db
import time
from Tour import TourInfo

# 사전에 필요한 정보를 로드 =&amp;gt; 디비혹스 쉘, 베치 파일에서 인자로 받아서 세팅
db       = Db()
main_url = 'http://tour.interpark.com/' 
keyword  = '로마'
# 상품 정보를 담는 리스트 (TourInfo 리스트)
tour_list = []

# 드라이버 로드
# 맥용
# driver = wd.Chrome(executable_path='./chromedriver')
# 윈도우용
driver = wd.Chrome(executable_path='chromedriver.exe')
# 고스트용
# driver   = wd.PhantomJS(executable_path='./phantomjs')
# 차후 -&amp;gt; 옵션 부여하여 (프록시, 에이전트 조작, 이미지를 배제)
# 크롤링을 오래돌리면 =&amp;gt; 임시파일들이 쌓인다!! -&amp;gt; 템프 파일 삭제

# 사이트 접속 (get)
driver.get(main_url)
# 검색창을 찾아서 검색어 입력
# id : SearchGNBText
driver.find_element_by_id('SearchGNBText').send_keys(keyword)
# 수정할경우 =&amp;gt; 뒤에 내용이 붙어버림 =&amp;gt; .clear() -&amp;gt; send_keys('내용')
# 검색 버튼 클릭
driver.find_element_by_css_selector('button.search-btn').click()

# 잠시 대기 =&amp;gt; 페이가 로드되고 나서 즉각적으로 데이터를 획득 하는 행위는 
# 명시적 대기 =&amp;gt; 특정 요소가 로케이트(발결된때까지) 대기
try:
    element = WebDriverWait(driver, 10).until(
        # 지정한 한개 요소가 올라면 웨이트 종료
        EC.presence_of_element_located( (By.CLASS_NAME, 'oTravelBox') )
    )
except Exception as e:
    print( '오류 발생', e)
# 암묵적 대기 =&amp;gt; DOM이 다 로드 될때까지 대기 하고 먼저 로드되면 바로 진행
# 요소를 찾을 특정 시간 동안 DOM 풀링을 지시 예를 들어 10 초이내 라로 
# 발견 되면 진행
driver.implicitly_wait( 10 )
# 절대기 대기 =&amp;gt; time.sleep(10) -&amp;gt; 클라우드 페어(디도스 방어  솔류션)
# 더보기 눌러서 =&amp;gt; 게시판 진입 
driver.find_element_by_css_selector('.oTravelBox&amp;gt;.boxList&amp;gt;.moreBtnWrap&amp;gt;.moreBtn').click()

# 게시판에서 데이터를 가져올때 
# 데이터가 많으면 세션(혹시 로그인을 해서 접근되는 사이트일 경우) 관리 
# 특정 단위별로 로그아웃 로그인 계속 시도
# 특정 게시물리 사라질 경우 =&amp;gt; 팝업 발생 (없는 ...) =&amp;gt; 팝업 처리 검토
# 게시판 스캔시 =&amp;gt; 임계점을 모름!!
# 게시판 스캔 =&amp;gt; 메타 정보 획득 =&amp;gt; loop 를 돌려서 일괄적으로 방문 접근 처리

# searchModule.SetCategoryList(1, '') 스크립트 실행
# 16은 임시값, 게시물을 넘어갔을때 현상을 확인차
for page in range(1, 2):#16):
    try:
        # 자바스크립트 구동하기
        driver.execute_script(&quot;searchModule.SetCategoryList(%s, '')&quot; % page)
        time.sleep(2)
        print(&quot;%s 페이지 이동&quot; % page)
        #############################################################
        # 여러 사이트에서 정보를 수집할 경우 공통 정보 정의 단계 필요
        # 상품명, 코멘트, 기간1, 기간2, 가격, 평점, 썸네일, 링크(상품상세정보)
        boxItems = driver.find_elements_by_css_selector('.oTravelBox&amp;gt;.boxList&amp;gt;li')
        # 상품 하나 하나 접근
        for li in boxItems:
            # 이미지를 링크값을 사용할것인가? 
            # 직접 다운로드 해서 우리 서버에 업로드(ftp) 할것인가?
            print( '썸네임', li.find_element_by_css_selector('img').get_attribute('src') )
            print( '링크', li.find_element_by_css_selector('a').get_attribute('onclick') )
            print( '상품명', li.find_element_by_css_selector('h5.proTit').text )
            print( '코멘트', li.find_element_by_css_selector('.proSub').text )
            print( '가격',   li.find_element_by_css_selector('.proPrice').text )
            area = ''
            for info in li.find_elements_by_css_selector('.info-row .proInfo'):
                print(  info.text )
            print('='*100)
            # 데이터 모음
            # li.find_elements_by_css_selector('.info-row .proInfo')[1].text
            # 데이터가 부족하거나 없을수도 있으므로 직접 인덱스로 표현은 위험성이 있음
            obj = TourInfo(  
                li.find_element_by_css_selector('h5.proTit').text,
                li.find_element_by_css_selector('.proPrice').text,
                li.find_elements_by_css_selector('.info-row .proInfo')[1].text,
                li.find_element_by_css_selector('a').get_attribute('onclick'),
                li.find_element_by_css_selector('img').get_attribute('src')
            )
            tour_list.append( obj )
    except Exception as e1:
        print( '오류', e1 )

print( tour_list, len(tour_list) )
# 수집한 정보 개수를 루프 =&amp;gt; 페이지 방문 =&amp;gt; 콘텐츠 획득(상품상세정보) =&amp;gt; 디비
for tour in tour_list:
    # tour =&amp;gt; TourInfo
    print( type(tour) )
    # 링크 데이터에서 실데이터 획득
    # 분해
    arr = tour.link.split(',')
    if arr:
        # 대체
        link = arr[0].replace('searchModule.OnClickDetail(','')
        # 슬라이싱 =&amp;gt; 앞에 ', 뒤에 ' 제거
        detail_url = link[1:-1]
        # 상세 페이지 이동 : URL 값이 완성된 형태인지 확인 (http~)
        driver.get( detail_url )
        time.sleep(2)
        # pip install bs4
        # 혖재 페이지를 beautifulsoup 의 DOM으로 구성
        soup = bs( driver.page_source, 'html.parser')
        # 현제 상세 정보 페이지에서 스케줄 정보 획득
        data = soup.select('.tip-cover')
        #print( type(data), len(data), type(data[0].contents)  )
        # 디비 입력 =&amp;gt; pip install pymysql
        # 데이터 sum
        content_final = ''
        for c in data[0].contents:
            content_final += str(c)
        
        # html 콘첸츠 데이터 전처리 (디비에 입력 가능토록)
        import re
        content_final   = re.sub(&quot;'&quot;, '&quot;', content_final)
        content_final   = re.sub(re.compile(r'\r\n|\r|\n|\n\r+'), '', content_final)

        print( content_final )
        # 콘텐츠 내용에 따라 전처리 =&amp;gt; data[0].contents
        db.db_insertCrawlingData(
            tour.title,
            tour.price[:-1],
            tour.area.replace('출발 가능 기간 : ',''),
            content_final,
            keyword
        )

# 종료
driver.close()
driver.quit()
import sys
sys.exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;TourInfo.py&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584934087013&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class TourInfo:
    title = ''
    price = ''
    area  = ''
    link  = ''
    img   = ''
    contents = ''

    def __init__(self, title, price, area, link, img, contents=None ):
        self.title = title
        self.price = price
        self.area  = area
        self.link  = link
        self.img   = img
        self.contents = contents&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;DBMgr.py&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584937906839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 디비 처리, 연결, 해제, 검색어 가져오기, 데이터 삽입
import pymysql as my

class DBHelper:
    '''
    맴버변수 : 커넥션 
    '''
    conn = None
    '''
    생성자 
    '''
    def __init__(self):
        self.db_init()
    '''
    맴버 함수
    '''
    def db_init(self):
        self.conn = my.connect(
                        host='localhost',
                        user='root',
                        password='1234',
                        db='pythonDB',
                        charset='utf8',
                        cursorclass=my.cursors.DictCursor )
    
    def db_free(self):
        if self.conn:
            self.conn.close()

    # 검색 키워드 가져오기 =&amp;gt; 웹에서 검색
    def db_selectKeyword(self):
        # 커서 오픈
        # with =&amp;gt; 닫기를 처리를 자동으로 처리해준다 =&amp;gt; I/O 많이 사용
        rows = None
        with self.conn.cursor() as cursor:
            sql  = &quot;select * from tbl_keyword;&quot;
            cursor.execute(sql)
            rows = cursor.fetchall()
            print(rows)
        return rows
        
    def db_insertCrawlingData(self, title, price, area, contents, keyword ):
        with self.conn.cursor() as cursor:
            sql = '''
            insert into `tbl_crawlingdata` 
            (title, price, area, contents, keyword) 
            values( %s,%s,%s,%s,%s )
            '''
            cursor.execute(sql, (title, price, area, contents, keyword) )
        self.conn.commit()
        
# 단독으로 수행시에만 작동 =&amp;gt; 테스트코드를 삽입해서 사용        
if __name__=='__main__':
    db = DBHelper()
    print( db.db_selectKeyword() )
    print( db.db_insertCrawlingData('1','2','3','4','5') )
    db.db_free()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;필요한 데이터 수집을 위해 XML 분석&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;960&quot; height=&quot;577&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZHOM/btqCUx0UTTi/9FED9iE9WXkkPJgsLgVd3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZHOM/btqCUx0UTTi/9FED9iE9WXkkPJgsLgVd3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZHOM/btqCUx0UTTi/9FED9iE9WXkkPJgsLgVd3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZHOM%2FbtqCUx0UTTi%2F9FED9iE9WXkkPJgsLgVd3k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;960&quot; height=&quot;577&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejWwMA/btqCQpp3jCt/sFvW88Ah4jMMG04CAad3qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejWwMA/btqCQpp3jCt/sFvW88Ah4jMMG04CAad3qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejWwMA/btqCQpp3jCt/sFvW88Ah4jMMG04CAad3qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejWwMA%2FbtqCQpp3jCt%2FsFvW88Ah4jMMG04CAad3qK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM4qg5/btqCQ5dIxoB/RFcmEKgnAMHPVSSMysr4xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM4qg5/btqCQ5dIxoB/RFcmEKgnAMHPVSSMysr4xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM4qg5/btqCQ5dIxoB/RFcmEKgnAMHPVSSMysr4xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM4qg5%2FbtqCQ5dIxoB%2FRFcmEKgnAMHPVSSMysr4xK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWFtf/btqCQ3mEf5j/JuUEvEFQGsR5Dy4IfPZ06k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWFtf/btqCQ3mEf5j/JuUEvEFQGsR5Dy4IfPZ06k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWFtf/btqCQ3mEf5j/JuUEvEFQGsR5Dy4IfPZ06k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWFtf%2FbtqCQ3mEf5j%2FJuUEvEFQGsR5Dy4IfPZ06k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Crawling</category>
      <category>beautifulsoup</category>
      <category>Crawling</category>
      <category>PYTHON</category>
      <category>selenium</category>
      <category>vsCode</category>
      <category>webdriver</category>
      <category>뷰티플수프</category>
      <category>셀레니움</category>
      <category>크롤링</category>
      <category>파이썬</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/40</guid>
      <comments>https://aonee.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 22 Mar 2020 23:55:43 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Intellij tomcat war 배포 - window에서 filezilla를 이용해 sftp 서버배포</title>
      <link>https://aonee.tistory.com/38</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GMBFv/btqCOymSM0b/nVSDciGb4ATWeqUNy8PicK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GMBFv/btqCOymSM0b/nVSDciGb4ATWeqUNy8PicK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GMBFv/btqCOymSM0b/nVSDciGb4ATWeqUNy8PicK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGMBFv%2FbtqCOymSM0b%2FnVSDciGb4ATWeqUNy8PicK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Tomcat에 WAR 배포하는데 삽질을 정말 많이 했다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;WAR 와르와르와르 하니까 전혀 관련 없지만 콜드의 와르르&amp;hearts; 가 계속 생각났다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;서버 배포에 성공하면 신나는 마음으로 듣기 위해 와르르를 흥얼거리며 해결했다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;결국 행복하게 와르르~~~~~~~~~~~~~~~~~~~~~~듣게 되었다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;와르르 들으면서 하는 포스팅!&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 목차&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  1. WAR 파일 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp; 1)&lt;/b&gt; war 파일 배포하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Main 클래스에 SpringBootServletInitializer 상속 받기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 2)&lt;/b&gt; &lt;span style=&quot;color: #333333;&quot;&gt;pom.xml finalName 태그 추가&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 3)&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;tomcat 서버에 배포할 war파일 만들기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;2. tomcat 서버에 생성한 WAR 파일 배포&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp; 방법 1)&lt;/b&gt; localhost에 배포 -&amp;gt; Local tomcat 서버에 배포&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 방법 2)&lt;/b&gt; 원하는 서버에 배포 -&amp;gt; 윈도우의 경우 fileZilla를 이용해 서버에 배포&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt; &lt;b&gt; Tomcat 한글 깨짐현상 해결방법&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  &lt;/span&gt;&lt;/b&gt;1. WAR 파일 생성&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) war 파일 배포하기 위해 &lt;span style=&quot;color: #666666;&quot;&gt;Main 클래스에 SpringBootServletInitializer 상속 받기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;문제 발생&lt;/span&gt; &lt;span style=&quot;color: #ef5369;&quot;&gt;:&lt;/span&gt;&lt;/b&gt; Tomcat에 war 배포시 404 에러가 발생했다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;발생 원인 :&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;Main 클래스에 SpringBootServletInitializer를 상속받지 않았기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584695958224&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kr.ac.korea.sans.cs;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CsApplication {

    public static void main(String[] args) {
        SpringApplication.run(CsApplication.class, args);
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;해결&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584695938452&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kr.ac.korea.sans.cs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class CsApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(CsApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(CsApplication.class);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;왜 ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일반적인&amp;nbsp;Spring&amp;nbsp;Framework에서는&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://devtzu.tistory.com/Web.xml%EC%97%90&quot;&gt;Web.xml에&lt;/a&gt; DispatcherServlet을 등록하는 작업이 필요하다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Servlet&amp;nbsp;3.0에서는&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://devtzu.tistory.com/web.xml%EC%9D%B4&quot;&gt;web.xml이&lt;/a&gt; 없이도 배포가 가능해졌는데 Apache Tomcat 7부터 지원한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://devtzu.tistory.com/web.xml%EC%9D%98&quot;&gt;web.xml의&lt;/a&gt; 역할을 WebApplicationinitializer 인터페이스를 구현하여 프로그래밍으로 ServletContext를 구현할 수 있도록 바뀐것이다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SpringBootServletInitializer는 WebApplicationinitializer의 구현체이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SpringBootServletInitializer를 이용하여 WebApplicationContext를 생성하여 Servlet Context에 추가한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트에&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://devtzu.tistory.com/web.xml%EB%8F%84&quot;&gt;web.xml도&lt;/a&gt; 없었고, WebApplicationinitializer를 구현한 SpringBootServletInitializer도 없었기 때문에 Tomcat에서 URL의 요청을 받아드릴수가 없었던 것이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SpringBootServletInitializer를 상속 한다는건 결국 Tomcat과 같은 Servlet Container 환경에서 Spring Boot Application을 동작 가능 하도록 Web Application Context를 구성한다는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) pom.xml finalName 태그 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;build 태그에 finalName태그 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1584696188080&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;finalName&amp;gt;cs&amp;lt;/finalName&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;build태그 전체 코드&lt;/p&gt;
&lt;pre id=&quot;code_1584696148369&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;build&amp;gt;
        &amp;lt;finalName&amp;gt;cs&amp;lt;/finalName&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이렇게 하면 war파일 생성시 &lt;span style=&quot;color: #333333;&quot;&gt;finalName 에 지정한 이름으로 war파일이 생성된다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) tomcat 서버에 배포할 war파일 만들기&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB6TlU/btqCOgfyDCV/KJXi03xCUEd5o15KgbjAD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB6TlU/btqCOgfyDCV/KJXi03xCUEd5o15KgbjAD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB6TlU/btqCOgfyDCV/KJXi03xCUEd5o15KgbjAD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB6TlU%2FbtqCOgfyDCV%2FKJXi03xCUEd5o15KgbjAD0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Run - Edit Configurations..&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg7J1m/btqCSW7gtQA/KFfSMEU120HSV60H63TzMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg7J1m/btqCSW7gtQA/KFfSMEU120HSV60H63TzMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg7J1m/btqCSW7gtQA/KFfSMEU120HSV60H63TzMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg7J1m%2FbtqCSW7gtQA%2FKFfSMEU120HSV60H63TzMk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;command line 에 compile war:war 입력 - OK&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;287&quot; height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxBYI/btqDg5RBaBw/nuNBkkbtyh5Bjd36O8xMo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxBYI/btqDg5RBaBw/nuNBkkbtyh5Bjd36O8xMo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxBYI/btqDg5RBaBw/nuNBkkbtyh5Bjd36O8xMo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrxBYI%2FbtqDg5RBaBw%2FnuNBkkbtyh5Bjd36O8xMo0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;287&quot; height=&quot;64&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;Run (Shift+F10) 해주면&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;target 디렉토리에서&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;finalName에 입력한 cs 이름으로 war파일이 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p7iNK/btqCSf0ijB2/gV36YkP91qvWQOJPQcnKZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p7iNK/btqCSf0ijB2/gV36YkP91qvWQOJPQcnKZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p7iNK/btqCSf0ijB2/gV36YkP91qvWQOJPQcnKZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7iNK%2FbtqCSf0ijB2%2FgV36YkP91qvWQOJPQcnKZ0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  &lt;/span&gt;&lt;/b&gt;2. tomcat 서버에 생성한 WAR 파일 배포&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;방법 1)&lt;/b&gt; localhost에 배포 -&amp;gt; Local tomcat 서버에 배포&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;방법 2)&lt;/b&gt; 원하는 서버에 배포 -&amp;gt; 윈도우의 경우 fileZilla를 이용해 서버에 배포&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 1)&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;localhost에 배포&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;①&amp;nbsp;tomcat 설치한 폴더 open&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;(필자의 경우 : C:\Program&amp;nbsp;Files&amp;nbsp;(x86)\Apache&amp;nbsp;Software&amp;nbsp;Foundation\Tomcat&amp;nbsp;9.0&amp;nbsp;-&amp;nbsp;remote&amp;nbsp;8080\webapps 여기에 위치)&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Tomcat 9.0 - remote 8080은 &lt;span style=&quot;color: #333333;&quot;&gt;Tomcat 9.0을 복사해서 생성한 파일&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;② tomcat - webapps 디렉토리에 생성한 war파일 복사&amp;amp;붙여넣기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nIvxd/btqCTxMW9vk/iSyrkP5ipxyTGPrcU0F690/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nIvxd/btqCTxMW9vk/iSyrkP5ipxyTGPrcU0F690/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nIvxd/btqCTxMW9vk/iSyrkP5ipxyTGPrcU0F690/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnIvxd%2FbtqCTxMW9vk%2FiSyrkP5ipxyTGPrcU0F690%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;③ cmd 관리자 권한으로 실행&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;$ cd C:\Program&amp;nbsp;Files&amp;nbsp;(x86)\Apache&amp;nbsp;Software&amp;nbsp;Foundation\Tomcat&amp;nbsp;9.0&amp;nbsp;-&amp;nbsp;remote&amp;nbsp;8080\bin&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;$ startup.bat (윈도우의 경우)&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;맥의 경우 startup.sh&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chHpQy/btqCTv2Ggj8/jQrSGJOnaIPwQzPpSaPy00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chHpQy/btqCTv2Ggj8/jQrSGJOnaIPwQzPpSaPy00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chHpQy/btqCTv2Ggj8/jQrSGJOnaIPwQzPpSaPy00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchHpQy%2FbtqCTv2Ggj8%2FjQrSGJOnaIPwQzPpSaPy00%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;④ startup.bat을 입력하면 tomcat 서버가 구동된다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;spring 문자가 뜨면 서버에 잘 올라간 것이다! 예에~~&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWjeuM/btqCOzFU2Q6/kYelk7kuOoPHuCQrjnvfa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWjeuM/btqCOzFU2Q6/kYelk7kuOoPHuCQrjnvfa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWjeuM/btqCOzFU2Q6/kYelk7kuOoPHuCQrjnvfa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWjeuM%2FbtqCOzFU2Q6%2FkYelk7kuOoPHuCQrjnvfa0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;작성해둔 테스트 코드를 실행하면 다음과 같이 잘 구동된다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzmJKw/btqCSgStwoa/qL9RzI2VkisbSB6PJQJl61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzmJKw/btqCSgStwoa/qL9RzI2VkisbSB6PJQJl61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzmJKw/btqCSgStwoa/qL9RzI2VkisbSB6PJQJl61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzmJKw%2FbtqCSgStwoa%2FqL9RzI2VkisbSB6PJQJl61%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;테스트를 위한 spring /hello 테스트 코드 (Controller 클래스를 만들어 작성하면 된다.)&lt;/p&gt;
&lt;pre id=&quot;code_1584697375636&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class CsAppController {
    @RequestMapping(value=&quot;/hello&quot;, method= RequestMethod.GET)
    public String test (HttpServletRequest request) throws Exception {
        return &quot;Hello&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법2) &lt;span style=&quot;color: #333333;&quot;&gt;원하는 서버에 배포&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;윈도우 사용자의 경우 FileZilla를 이용하면 편하게 SFPT 서버 배포가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDWGM/btqCPAYHkye/xpalPlCFK449Nd2BrpnuM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDWGM/btqCPAYHkye/xpalPlCFK449Nd2BrpnuM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDWGM/btqCPAYHkye/xpalPlCFK449Nd2BrpnuM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDWGM%2FbtqCPAYHkye%2FxpalPlCFK449Nd2BrpnuM1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;내 사이트 - New site&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;프로토콜 : SFTP&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;호스트 : 원하는 서버 주소&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;포트 : 22&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;사용자&amp;nbsp; : 사용자 ID&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;비밀번호 : 사용자 비밀번호&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;꼭!!!!!! 포트를&amp;nbsp; 22 로 지정해야한다!!&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;8080 Nope!&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;21 Nope!&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;22 YEAH! YES!&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;b&gt;Tomcat 한글 깨짐현상 해결방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;HOXY....&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;tomcat 한글깨짐 문제가 발생&lt;/b&gt;&lt;/span&gt;한다 ??!&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;해결하면 되지~~~&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;해결방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bszwQW/btqCQoRdolf/i85zoKN5o9KyYVJs7fSIa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bszwQW/btqCQoRdolf/i85zoKN5o9KyYVJs7fSIa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bszwQW/btqCQoRdolf/i85zoKN5o9KyYVJs7fSIa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbszwQW%2FbtqCQoRdolf%2Fi85zoKN5o9KyYVJs7fSIa1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;실행창(WIN+R)을 누르고 regedit을 입력하여 레지스트리 편집기&lt;/span&gt;&lt;br /&gt;컴퓨터 &amp;gt; HKEY_CURRNET_USER &amp;gt; Console 위치에 새로운 키 값을 생성해준다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;해당 키 값의 이름은 Tomcat으로 입력해주고 해당 키 값 안에 DWORD(32비트) 값을 하나 추가해준다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;해당 값의 이름은 CodePage로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAnXsx/btqCPBwweTj/SFlvlWknKvfLO4js03k3GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAnXsx/btqCPBwweTj/SFlvlWknKvfLO4js03k3GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAnXsx/btqCPBwweTj/SFlvlWknKvfLO4js03k3GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAnXsx%2FbtqCPBwweTj%2FSFlvlWknKvfLO4js03k3GK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;735&quot; height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxrqe6/btqCSf7cXMA/YP239T6nPCliRgYsLE4QG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxrqe6/btqCSf7cXMA/YP239T6nPCliRgYsLE4QG1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxrqe6/btqCSf7cXMA/YP239T6nPCliRgYsLE4QG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxrqe6%2FbtqCSf7cXMA%2FYP239T6nPCliRgYsLE4QG1%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;735&quot; height=&quot;554&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em; text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;편 - 안 -  &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <category>filezilla</category>
      <category>intellij</category>
      <category>sftp</category>
      <category>tomcat</category>
      <category>war</category>
      <category>window</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/38</guid>
      <comments>https://aonee.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 20 Mar 2020 18:30:43 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 이클립스로 스프링 프로젝트 생성하기</title>
      <link>https://aonee.tistory.com/33</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  eclipse&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;java -&amp;gt; project -&amp;gt; Maven project -&amp;gt; 두개 체크 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Group id &amp;amp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Artifactd id작성&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Group id&lt;/b&gt;&amp;nbsp; : spring4 전체 큰 프로젝트&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Artifactd id&lt;/b&gt;&amp;nbsp; : testPjt 현재 만드는&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;gt;src&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;gt;main&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;gt;java&lt;/b&gt; : java 언어 사용해 기능 구현한 project. java파일 관리&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;gt;resource&lt;/b&gt; : 보조적인 역할을 하는 자원파일 관리&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;pom.xml 파일이란?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;모듈 가져오는 파일&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;필용한 라이브러리만 다운로드 해서 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메이븐 설정파일이다. 메이븐은 라이브러리를 연결해주고 빌드를 위한 플랫폼이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;pom.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584245892310&quot; class=&quot;java&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; 
xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;groupId&amp;gt;spring4&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;testPjt&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;
  
  &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
       		&amp;lt;version&amp;gt;4.1.0.RELEASE&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  
  	&amp;lt;build&amp;gt;
  		&amp;lt;plugins&amp;gt;
  			&amp;lt;plugin&amp;gt;
  				&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
  				&amp;lt;version&amp;gt;3.1&amp;lt;/version&amp;gt;
  				&amp;lt;configuration&amp;gt;
  					&amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt;
  					&amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;
  					&amp;lt;encoding&amp;gt;utf-8&amp;lt;/encoding&amp;gt;
  				&amp;lt;/configuration&amp;gt;
  			&amp;lt;/plugin&amp;gt;
  		&amp;lt;/plugins&amp;gt;
  	&amp;lt;/build&amp;gt;
  
&amp;lt;/project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 에러가 뜨면 버전이 맞지 않아서 이기 때문.&amp;nbsp;우클릭 - Maven - update project&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;dependencies, build 추가&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;dependencies ?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 필요한 모듈 명시.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;main repositories로 부터 local로 라이브버리가 자동으로 다운로드 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;build ?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실제 내가 만든 프로젝트가 빌드될 때 필요한 빌드 명령들.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;spring framework ?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;java + 수많은 모듈&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;applicationContext.xml 이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;빈 (=spring 컨테이너의 객체)을 만들어주는 녀석&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;spring framework에서는 &lt;/span&gt;객체를 생성하는데&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; new 키워드를 사용하기 보다는&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;resources / applicationContext.xml&lt;/b&gt;&lt;/span&gt;에 컨테이너 역할을 해주는 파일을 만들어놓고&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;main class&lt;/b&gt; &lt;/span&gt;에서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;STEP 1)&lt;/b&gt;&lt;/span&gt; &lt;b&gt;GenericXmlApplicationContext&lt;/b&gt; 클래스를 이용해 컨테이너 생성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;STEP 2)&lt;/b&gt;&lt;/span&gt; 컨테이너 안에 있는 빈이라는 객체를 가져다 쓰기만 한다. 생성은 컨테이너가 알아서 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;STEP 3)&lt;/b&gt;&lt;/span&gt; 사용을 끝낸 컨테이너 자원은 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;applicationContext.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584245927250&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
	   		http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;


    &amp;lt;bean id=&quot;tWalk&quot; class=&quot;testPjt.TransportationWalk&quot;/&amp;gt;

&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;bean id=&quot;&quot; calss=&quot;패키지명.클래스명&quot; /&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 명시해주면&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;내가 이 클래스루부터 객체를 사용하기 위해 new로 객체생성하지 않아도 된다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;객체가 생성됐다는 것?은 메모리가 로드됐다는 것을 의미&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;객체들을 담고 있다. container&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;main class&lt;/b&gt;&lt;/span&gt;에서 사용하면 된다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;기존&lt;/b&gt;&lt;/span&gt; - new를 이용해서 사용했다.&lt;/p&gt;
&lt;pre id=&quot;code_1584246105025&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
		TransportationWalk transportationWalk = new TransportationWalk();
		transportationWalk.move();
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;수정&lt;/span&gt;&lt;/b&gt; - 이제는 bean에 등록을 했으니 위의 코드를 지우고&lt;/p&gt;
&lt;pre id=&quot;code_1584246663111&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
//	객체생성 및 생성자 호출 &amp;amp; 메서드 호출
//	TransportationWalk transportationWalk = new TransportationWalk();
//	transportationWalk.move();
		
//	spring
	//container생성
	GenericXmlApplicationContext ctx = 
               new GenericXmlApplicationContext(&quot;classpath:applicationContext.xml&quot;);
		
	//tWalk id의 bean을 통해 transportationWalk 객체생성.
	TransportationWalk transportationWalk = ctx.getBean(&quot;tWalk&quot; , TransportationWalk.class);
	transportationWalk.move();
		
	//container 자원 반환
	ctx.close();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Spring</category>
      <category>eclipse</category>
      <category>spring</category>
      <category>스프링</category>
      <category>이클립스</category>
      <category>프로젝트 생성</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/33</guid>
      <comments>https://aonee.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 15 Mar 2020 13:18:27 +0900</pubDate>
    </item>
    <item>
      <title>코틀린 퀴즈 -3 확장함수,제네릭, 고차함수, 람다</title>
      <link>https://aonee.tistory.com/31</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WZ1F5/btqCDlm0Ep9/n6zKSzr05CJsqiQrHiRVAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WZ1F5/btqCDlm0Ep9/n6zKSzr05CJsqiQrHiRVAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WZ1F5/btqCDlm0Ep9/n6zKSzr05CJsqiQrHiRVAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWZ1F5%2FbtqCDlm0Ep9%2Fn6zKSzr05CJsqiQrHiRVAK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 1&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;함수를 만드시오. a가 true이면 success를 실행하고 a가 false일 때 fail을 실행한다. &lt;/b&gt;- 찬영&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;success와 fail 함수의 반환값은 없다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;success 실행시 1을 출력하고 fail&amp;nbsp;실행&amp;nbsp;시&amp;nbsp;&quot;실패입니다&quot;&amp;nbsp;출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLK0o5/btqCF6h761u/AlTS0EgAh7DwrT1YosKGL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLK0o5/btqCF6h761u/AlTS0EgAh7DwrT1YosKGL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLK0o5/btqCF6h761u/AlTS0EgAh7DwrT1YosKGL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLK0o5%2FbtqCF6h761u%2FAlTS0EgAh7DwrT1YosKGL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 2&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;val clientDevelop = Developer()로 시작하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;객체의 생성과 초기화를 한번에 해야 한다.&lt;/b&gt; - 시연&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;단,&amp;nbsp;아무&amp;nbsp;범위&amp;nbsp;지정자나&amp;nbsp;사용하면&amp;nbsp;안됨&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;범위 지정 함수 (ex apply,&amp;nbsp;run,&amp;nbsp;with,&amp;nbsp;also,&amp;nbsp;let)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjbXYf/btqCB7P3ovn/N3BkZpjd5ED1PHYKnfOqr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjbXYf/btqCB7P3ovn/N3BkZpjd5ED1PHYKnfOqr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjbXYf/btqCB7P3ovn/N3BkZpjd5ED1PHYKnfOqr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjbXYf%2FbtqCB7P3ovn%2FN3BkZpjd5ED1PHYKnfOqr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3AWwo/btqCF7nOC7U/81IrtdtTVvRK0HYBXoePlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3AWwo/btqCF7nOC7U/81IrtdtTVvRK0HYBXoePlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3AWwo/btqCF7nOC7U/81IrtdtTVvRK0HYBXoePlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3AWwo%2FbtqCF7nOC7U%2F81IrtdtTVvRK0HYBXoePlK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 3&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;함수를 만드시오.&lt;/b&gt; - 찬영&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;hint : 확장함수 + 제네릭 + 고차함수 + 람다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qzStS/btqCDkPg4Za/I8cftucCFZC5VIkED5oUq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qzStS/btqCDkPg4Za/I8cftucCFZC5VIkED5oUq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qzStS/btqCDkPg4Za/I8cftucCFZC5VIkED5oUq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqzStS%2FbtqCDkPg4Za%2FI8cftucCFZC5VIkED5oUq0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 4&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;AutoCompeleteTextView 확장함수를 작성하시오.&lt;/b&gt; - 시연&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;AutoCompeleteTextView는&amp;nbsp;EditText같은&amp;nbsp;위젯이고,&amp;nbsp;TextWatcher는&amp;nbsp;이미&amp;nbsp;존재하는&amp;nbsp;인터페이스이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;search는&amp;nbsp;따로&amp;nbsp;만들지&amp;nbsp;않아도&amp;nbsp;된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AXLyd/btqCEO3qBXT/xpfJX56sF7jSJGKV0JKNb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AXLyd/btqCEO3qBXT/xpfJX56sF7jSJGKV0JKNb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AXLyd/btqCEO3qBXT/xpfJX56sF7jSJGKV0JKNb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXLyd%2FbtqCEO3qBXT%2FxpfJX56sF7jSJGKV0JKNb0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 5&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;jin, won, chan, sion 을 항목으로 가진 리스트를 만들고, &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;map 함수를 이용하여 다음과 같이 출력하세요&lt;/b&gt; -예진&lt;br /&gt;&lt;br /&gt;친구의&amp;nbsp;이름&amp;nbsp;-&amp;gt;&amp;nbsp;JIN &lt;br /&gt;친구의&amp;nbsp;이름&amp;nbsp;-&amp;gt;&amp;nbsp;WON &lt;br /&gt;친구의&amp;nbsp;이름&amp;nbsp;-&amp;gt;&amp;nbsp;CHAN &lt;br /&gt;친구의&amp;nbsp;이름&amp;nbsp;-&amp;gt;&amp;nbsp;SION&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 1&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzLuD/btqCAPCpYMn/0hsj5VhTwX9c4r7GlsvKlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzLuD/btqCAPCpYMn/0hsj5VhTwX9c4r7GlsvKlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzLuD/btqCAPCpYMn/0hsj5VhTwX9c4r7GlsvKlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzLuD%2FbtqCAPCpYMn%2F0hsj5VhTwX9c4r7GlsvKlK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 2&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583947067801&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val clientDevelop = Developer().run{
            langauge = &quot;Kotlin&quot;
            team = &quot;Early Buddy&quot;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 3&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;616&quot; height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjUQ1c/btqCIEFwUlD/2GzkT4FJ0H6hVcDlQLTTjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjUQ1c/btqCIEFwUlD/2GzkT4FJ0H6hVcDlQLTTjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjUQ1c/btqCIEFwUlD/2GzkT4FJ0H6hVcDlQLTTjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjUQ1c%2FbtqCIEFwUlD%2F2GzkT4FJ0H6hVcDlQLTTjk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;616&quot; height=&quot;444&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 4&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583947087819&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun AutoCompeleteTextView.onChange() {
            this.addTextChangedListener(object : TextWatcher {
                override fun afterTextChanged(s: Editable?) {
                }

                override fun beforeTextChanged(s: CharSequence?) {

                }

                override fun onTextChanged(s: CharSequence?) {
                    //통신
                    search(s)
                }
            })
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 5&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583947122820&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val friends = listOf(&quot;jin, won, chan, sion&quot;)
        friends.map{
                 friend -&amp;gt; friend.toUpperCase()
        }.forEach{ println(it) }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Client/Android</category>
      <category>고차함수</category>
      <category>람다</category>
      <category>안드로이드</category>
      <category>제네릭</category>
      <category>코틀린</category>
      <category>확장함수</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/31</guid>
      <comments>https://aonee.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 12 Mar 2020 03:26:43 +0900</pubDate>
    </item>
    <item>
      <title>코틀린 퀴즈 -2 제네릭, 주생성자, 확장함수, 익명함수, 엘비스 연산자</title>
      <link>https://aonee.tistory.com/30</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYA57O/btqCB8anEhe/muUoP3gVmp36ODxWoGDCJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYA57O/btqCB8anEhe/muUoP3gVmp36ODxWoGDCJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYA57O/btqCB8anEhe/muUoP3gVmp36ODxWoGDCJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYA57O%2FbtqCB8anEhe%2FmuUoP3gVmp36ODxWoGDCJK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 1&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;프로퍼티 1) dest 변수. 타입은 변경가능한 리스트.&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;만 가능하다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;프로퍼티 2) src 변수. 타입은 변경 불가능한 리스트. read만 가능하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;src로 받은 목록을 dest에 추가하는&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;append 제네릭 함수를 작성하라&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583950074281&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;open class Car { ... }
class sedan : Car() { ... }
class truck : Car() { ... }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1583950074281&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val sedans : List&amp;lt;sedan&amp;gt; = ...
val trucks : List&amp;lt;truck&amp;gt; = ...
val cars : MutableList&amp;lt;Car&amp;gt; = ...

append(cars, sedans)
append(cars, trucks)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 2&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;여기서 에러가 나는 코드는? (총 4줄)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583950102335&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val name : String
val address : String  = null

val nullableString : String?
val nonNullableString : String = &quot;Foo&quot;


fun Address (a : String, b : String?, c : String) : String {...}
fun Code (a : String) : PostalCode ? { ... }

Address (null, null, &quot;hello&quot;)
val postal :PostalCode = Code(&quot;adsf adf f f f  f&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 3&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Happy&lt;/span&gt;&amp;nbsp;타입이며 한 번 할당되면 값을 변경하지 못하는&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;smile&lt;/span&gt;&lt;/span&gt;&amp;nbsp;변수가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 변수에 findHappy&lt;span style=&quot;color: #333333;&quot;&gt;(&quot;Let's have a laugh&quot;)&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;findHappy&lt;/span&gt;&lt;/span&gt;함수 결과를 대입하려한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그런데&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;findHappy함수가 널 값을 반환하는 경우&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;Happy.None값을대입하는코드를 작성하라&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 4&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Employee 라는 주생성자를 만든다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 프로퍼티가 두개가 있는데 하나는 String 타입이고 이름은 name, 하나는 널값이 될 수 있는 Employee 타입이고 이름은 manager 이다.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;managerName&amp;nbsp;의&amp;nbsp;함수를&amp;nbsp;만드는데&amp;nbsp;이&amp;nbsp;함수는&amp;nbsp;Employee를&amp;nbsp;파라미터&amp;nbsp;값으로&amp;nbsp;갖고&amp;nbsp;반환값은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 Employee의 manager의 name 이다. ( 확장함수 이용 ) &lt;span style=&quot;color: #333333;&quot;&gt;-찬영&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 5&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시연&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LiixI/btqCB7P3X4q/888zKOPNt0vTAUMmiYaMyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LiixI/btqCB7P3X4q/888zKOPNt0vTAUMmiYaMyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LiixI/btqCB7P3X4q/888zKOPNt0vTAUMmiYaMyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiixI%2FbtqCB7P3X4q%2F888zKOPNt0vTAUMmiYaMyK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 6&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;EditText의 값을 Float 형태로 만들 때는 &lt;a href=&quot;EditText.text.toString().toFloat()이라는&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;EditText.text.toString().toFloat()이라는&lt;/a&gt; 긴 코드를 통해 만들 수 있다.&amp;nbsp;&lt;br /&gt;하지만,&amp;nbsp;여러개의&amp;nbsp;EditText를&amp;nbsp;모두&amp;nbsp;Float&amp;nbsp;형태로&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;쟤네들을&amp;nbsp;일일히&amp;nbsp;다&amp;nbsp;호출해주는&amp;nbsp;것은&amp;nbsp;불편하다.&amp;nbsp; &lt;br /&gt;이를 해결하여라. -시연&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Problem 7&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시연&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ol3W2/btqCByf66Ve/2Y7UfqrpmTnTXA0CCUcIQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ol3W2/btqCByf66Ve/2Y7UfqrpmTnTXA0CCUcIQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ol3W2/btqCByf66Ve/2Y7UfqrpmTnTXA0CCUcIQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fol3W2%2FbtqCByf66Ve%2F2Y7UfqrpmTnTXA0CCUcIQK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;답&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solution 1&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583949757241&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun &amp;lt;T&amp;gt; append (dest : MutableList&amp;lt;in T&amp;gt;, src : List&amp;lt;out T&amp;gt;){
	dest.addAll(src)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;597&quot; height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zvJaF/btqCAO4xPBT/JCLjAeHQlM7ebxtdLsHEk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zvJaF/btqCAO4xPBT/JCLjAeHQlM7ebxtdLsHEk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zvJaF/btqCAO4xPBT/JCLjAeHQlM7ebxtdLsHEk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzvJaF%2FbtqCAO4xPBT%2FJCLjAeHQlM7ebxtdLsHEk0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;597&quot; height=&quot;247&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solution 2&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1, 2 , 7, 8 줄 ERROR Code&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;val name : String&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;=&amp;gt; nonNullable. 즉, 초기화 해줘야 한다. val address : String = null&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;=&amp;gt; nonNullable. null을 대입할 수 없고 값을 대입해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Address (null, null, &quot;hello&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;=&amp;gt; 첫 번째 인자는 null 허용을 안했는데 null을 대입해서 오류 val postal : PostalCode = Code(&quot;adsf adf f f f f&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;=&amp;gt; Code함수의 return 값이 nullable이다. 즉, null일 수 있다. 그렇다면 postal변수의 값도 nullable이여야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그러나 nonNuallable이기 때문에 불가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solut&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ion 3&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583949757248&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val smile : Happy = findHappy(&quot;Let's have a laugh&quot;) ?: Happy.None&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solution 4&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/512uN/btqCAOXPrrx/V2k7ATvS6B7414oaAtimz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/512uN/btqCAOXPrrx/V2k7ATvS6B7414oaAtimz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/512uN/btqCAOXPrrx/V2k7ATvS6B7414oaAtimz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F512uN%2FbtqCAOXPrrx%2FV2k7ATvS6B7414oaAtimz1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solution 5&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;605&quot; height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwi2s2/btqCD73aSmA/NOAvwgqZdx4MIeIEqricpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwi2s2/btqCD73aSmA/NOAvwgqZdx4MIeIEqricpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwi2s2/btqCD73aSmA/NOAvwgqZdx4MIeIEqricpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwi2s2%2FbtqCD73aSmA%2FNOAvwgqZdx4MIeIEqricpk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;605&quot; height=&quot;285&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solution 6&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583950566761&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun EditText.convertFloat() {  
	this.text.toString().toFloat() 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  Solution 7&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;470&quot; height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OlocU/btqCB9tIDbc/88Osp2edl5gX0Ce1X1uHL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OlocU/btqCB9tIDbc/88Osp2edl5gX0Ce1X1uHL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OlocU/btqCB9tIDbc/88Osp2edl5gX0Ce1X1uHL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOlocU%2FbtqCB9tIDbc%2F88Osp2edl5gX0Ce1X1uHL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;470&quot; height=&quot;163&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Client/Android</category>
      <category>안드로이드</category>
      <category>엘비스연산자</category>
      <category>익명함수</category>
      <category>제네릭</category>
      <category>주생성자</category>
      <category>코틀린</category>
      <category>확장함수</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/30</guid>
      <comments>https://aonee.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 12 Mar 2020 03:24:56 +0900</pubDate>
    </item>
    <item>
      <title>코틀린 퀴즈 -1 컬렉션, 생성자, 추상클래스, 인터페이스</title>
      <link>https://aonee.tistory.com/29</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A5qFw/btqCD8gCFPn/D9s9mJUa8KKkXSF5584n91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A5qFw/btqCD8gCFPn/D9s9mJUa8KKkXSF5584n91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A5qFw/btqCD8gCFPn/D9s9mJUa8KKkXSF5584n91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA5qFw%2FbtqCD8gCFPn%2FD9s9mJUa8KKkXSF5584n91%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 1&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코틀린에서는 컬렉션에 자료 수정 가능여부를 제한할 수 있다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1-1. List 자료구조를 사용하여 aList를 생성하라. String 타입이다. 리스트에 값3개를 초기화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1-2. 초기화 후 리스트에 &quot;data&quot; 값을 추가하려한다.&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;aList.add(&quot;data&quot;)  &lt;/span&gt;가능할까?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1-3. 가능하다면 이유가 무엇인가? 불가능하다면 리스트를 어떻게 수정해야할까?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 2&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;생성자의 인자를 통해 바로 클래스 내부의 프로퍼티에 값을 할당하는 코드를 작성하시오.&lt;/b&gt;&amp;nbsp; -시연&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;class의 이름은 Foo이며 두개의 프로퍼티를 갖는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;첫번째&amp;nbsp;프로퍼티의&amp;nbsp;타입은&amp;nbsp;Int,&amp;nbsp;이름은&amp;nbsp;a&amp;nbsp;이고&amp;nbsp;한번&amp;nbsp;할당되면&amp;nbsp;값을&amp;nbsp;바꿀&amp;nbsp;수&amp;nbsp;없다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;두번째&amp;nbsp;프로퍼티의&amp;nbsp;타입은&amp;nbsp;String,&amp;nbsp;이름은&amp;nbsp;b&amp;nbsp;이고&amp;nbsp;할당&amp;nbsp;된&amp;nbsp;후에도&amp;nbsp;값&amp;nbsp;수정이&amp;nbsp;가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 3&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Shape 인터페이스를 작성하는데 한 개의 프로퍼티와 두개의 함수를 가지고 있다.&lt;/b&gt; &lt;span style=&quot;color: #333333;&quot;&gt;-찬영&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프로퍼티의&amp;nbsp;타입은&amp;nbsp;Int이고&amp;nbsp;이름은&amp;nbsp;width&amp;nbsp;이고,&amp;nbsp;수정이&amp;nbsp;가능한&amp;nbsp;값이다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;첫번째&amp;nbsp;함수의&amp;nbsp;타입은&amp;nbsp;Double&amp;nbsp;이고&amp;nbsp;이름은&amp;nbsp;getWidth&amp;nbsp;이다.&amp;nbsp;이&amp;nbsp;함수에는&amp;nbsp;구현부를&amp;nbsp;만들지마라.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;두번째&amp;nbsp;함수의&amp;nbsp;타입은&amp;nbsp;Unit&amp;nbsp;이고&amp;nbsp;이름은&amp;nbsp;islarge&amp;nbsp;이다.&amp;nbsp;이&amp;nbsp;함수에는&amp;nbsp;구현부를&amp;nbsp;만드는데&amp;nbsp;아무것도&amp;nbsp;넣지마라.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Problem 4&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;해당 추상 클래스와 인터페이스의 인스턴스를 생성하시오&lt;/b&gt; -시연&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(단,&amp;nbsp;인스턴스의&amp;nbsp;이름은&amp;nbsp;foo&amp;nbsp;이며&amp;nbsp;한번&amp;nbsp;할당&amp;nbsp;되면&amp;nbsp;수정이&amp;nbsp;불가능하다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4-1)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;추상 클래스는 다음과 같이 선언되어 있다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;abstract&amp;nbsp;class&amp;nbsp;Foo&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;abstract&amp;nbsp;fun&amp;nbsp;bar()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4-2)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인터페이스는&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;선언되어&amp;nbsp;있다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;interface&amp;nbsp;Bar&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun&amp;nbsp;baz()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 1&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;1-1&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583948244532&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aList.add(&quot;dd&quot;);&amp;nbsp; val&amp;nbsp;aList&amp;nbsp;:&amp;nbsp;List&amp;nbsp;=&amp;nbsp;listOf(&quot;aa&quot;,&amp;nbsp;&quot;bb&quot;,&amp;nbsp;&quot;cc&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;1-2&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;불가능하다. 그 이유는 List 인터페이스는 불가변이기 때문이다. 즉, 값을 수정할 수 없다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;1-3&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583948259078&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val&amp;nbsp;bList&amp;nbsp;:&amp;nbsp;MutableList&amp;nbsp;=&amp;nbsp;arrayListOf(&quot;aa&quot;,&amp;nbsp;&quot;vv&quot;,&amp;nbsp;&quot;cc&quot;);&amp;nbsp;
bList.add(&quot;data&quot;);&amp;nbsp; &amp;nbsp;//&amp;nbsp;MutableList이기 때문에&amp;nbsp;추가 가! 능!&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 2&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583948273020&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class&amp;nbsp;Foo&amp;nbsp;(val&amp;nbsp;a&amp;nbsp;:&amp;nbsp;Int,&amp;nbsp;var&amp;nbsp;b&amp;nbsp;:&amp;nbsp;String)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solut&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;ion 3&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1583948283391&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Shape{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	var width : Int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	fun getWidth() : Double&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	fun isLarge() {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  구현부 {}가 존재하지 않으면 반드시 구현해야한다. 즉, width와 getWidth()는 반드시 구현해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;구현부{} 가 존자하는 isLarge()는 구현이 되어있기 때문에 반드시 구현할 필요가 없다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  Solution 4&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;4-1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583948317737&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val foo = object : Foo(){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	override&amp;nbsp;fun&amp;nbsp;bar()&amp;nbsp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 주의 &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;추상클래스는 클래스이기 때문에 반드시 인스턴스 생성 시&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;Foo&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;() 맞음&lt;/b&gt;.&lt;/span&gt;&amp;nbsp;Foo 아님.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;생성자를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4-2&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583948337878&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val&amp;nbsp;foo&amp;nbsp;&amp;nbsp;=&amp;nbsp;object&amp;nbsp;:&amp;nbsp;Bar&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	override&amp;nbsp;fun&amp;nbsp;baz()&amp;nbsp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 주의 &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인터페이스는 인터페이스 이름 형태로 인스턴스 생성.&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;Bar() 아님.&lt;/span&gt;&amp;nbsp;그냥&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Bar&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Client/Android</category>
      <category>mutableList</category>
      <category>생성자</category>
      <category>안드로이드</category>
      <category>인터페이스</category>
      <category>추상클래스</category>
      <category>컬렉션</category>
      <category>코틀린</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/29</guid>
      <comments>https://aonee.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 12 Mar 2020 03:01:39 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 커니의 코틀린-(8) 코틀린 안드로이드 익스텐션</title>
      <link>https://aonee.tistory.com/28</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;차세대 안드로이드 개발자를 위한 커니의 코틀린&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;ch8 코틀린&amp;nbsp;안드로이드&amp;nbsp;익스텐션&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SLl1A/btqCAQgWEA9/VFcRc4LVsEK836ewHarELK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SLl1A/btqCAQgWEA9/VFcRc4LVsEK836ewHarELK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SLl1A/btqCAQgWEA9/VFcRc4LVsEK836ewHarELK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSLl1A%2FbtqCAQgWEA9%2FVFcRc4LVsEK836ewHarELK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 목차&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 코틀린 안드로이드 익스텐션 소개&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 컬렉션 생성 함수&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 스트림 함수&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. 범위 지정 함수&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;5. 리사이클러뷰에서 사용하기&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -208px / 200px 420px repeat-x; height: 2px; padding: 21px 0px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  1. &lt;/span&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;코틀린 안드로이드 익스텐션 소개&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;특정 값의 일치 여부 확인 : check, require&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;[ 사용목적 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&lt;/b&gt;&lt;span&gt; findVIewById() 메서드 없이&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;findVIewById() 메서드는 액티비티나 프래그먼트 등 레이아웃 파일에 선언된 여러개의 뷰로 구성된 화면에서 특정 뷰의 인스턴스를 얻기 위해 사용한다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&amp;gt; 반환한 뷰 객체를 잘못된 타입의 뷰로 캐스팅하거나 다른 레이아웃에 선언된 ID를 잘못 사용하면 널 값을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;값 확인 OR 조건 일치하지 않았을 경우 수행할 작업 지정가능.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;check()&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- IllegalStateException 발생시킴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;require()&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- IllegalArgumentException 발생시킴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;checkNotNull()&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수와 requireNotNull() 함수로 특정 값의 null 여부를 확인하고 nul이 아닌 값을 반환 받을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;명시적으로 실행 중단하기 : error, TODO&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;[ 사용목적 ]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;호출될 가능성이 없는 영역에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;진입하게 되는 경우 임의로 예외를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;발생시켜 프로그램의 실행을 막기 위해&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;정상적으로 프로그램이 실행될 경우 호출될 가능성이 없는 영역 존재.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 경우, 부작용 예측이 어렵다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;따라서,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예외를 발생시켜 프로그램의 실행을 막을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun error(message: String) : Nothing - 인자로 받은 message와 함께 IllegalStateException을 발생시킴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun TODO(): Nothing - NotImplementedError 예외를 발생시켜 이 부분이 완성되지 않았음을 알려줌&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun TODO(reason: String): Nothing - 에러 메시지에 표시될 상세 내용을 reason 매개변수를 통해 전달&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -208px / 200px 420px repeat-x; height: 2px; padding: 21px 0px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  2. 컬렉션 생성 함수&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;배열&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&amp;nbsp;arrayO&lt;/b&gt;f(vararg elements: T): Array&amp;lt;T&amp;gt; - 함수의 인자로 받은 값으로 구성된 배열 반환&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;emptyArray&lt;/b&gt;():&amp;nbsp;Array&amp;lt;T&amp;gt; - 특정 타입을 갖는 빈 배열 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&amp;nbsp;arrayOfNulls&lt;/b&gt;(size: Int): Array&amp;lt;T?&amp;gt; - 배열 내 각 값들이 모두 null 값으로 초기화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리스트&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;listOf&lt;/b&gt;(vararg elements: T): List&amp;lt;T&amp;gt; - 수정할 수 없는 리스트&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T : Any&amp;gt;&amp;nbsp;&lt;b&gt;listOfNotNull&lt;/b&gt;(vararg elements: T?): List&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;mutableListOf&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(vararg elements: T): MutableList&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;arrayListOf&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(vararg elements: T): ArrayList&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;맵&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함하는 요소를 읽을 수만 있고 수정할 수 없는 맵은 다음과 같이 생성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;K, V&amp;gt;&amp;nbsp;&lt;b&gt;mapOf&lt;/b&gt;(vararg pairs: Pair&amp;lt;K, V&amp;gt;):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Map&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함하고 있는 요소를 수정할 수 있는 맵은 mutableMapOf() 함수를 사용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;생성할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;K, V&amp;gt;&amp;nbsp;&lt;b&gt;mutableMapOf&lt;/b&gt;(vararg pairs: Pair&amp;lt;K, V&amp;gt;):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;MutableMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;보다 명시적인 타입의 맵을 생성해야 하는 경우 hashMapOf(), linkedMapOf(), sortedMapOf() 함수를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;hashMapOf&lt;/b&gt;(vararg pairs: Pair&amp;lt;K, V&amp;gt;) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HashMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;linkeMapOf&lt;/b&gt;(vararg pairs : Pair&amp;lt;K, V&amp;gt;) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;LinkedHashMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sortedMapOf&lt;/b&gt;(vararg pairs : Pair&amp;lt;K, V&amp;gt;) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SortedMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합(set)은 중복되지 않는 요소들로 구성된 자료구조&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함하는 요소를 읽을 수만 있고 수정할 수 없는 집합은 다음과 같이 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;setOf&lt;/b&gt;(vararg elements: T): Set&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합에 포함된 요소를 수정할 수 있는 집합은 mutableSetOf() 함수를 사용하여 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&amp;nbsp;mutableSetOf&lt;/b&gt;(vararg elements: T): MutableSet&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;보다 명시적인 타입의 집합을 생성해야 하는 경우 hashSetOf(), linkedSetOf(), sortedSetOf() 함수를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;hashSetOf&lt;/b&gt;(vararg elements: T) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HashSet&lt;/b&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;linked&lt;/b&gt;&lt;b&gt;SetOf&lt;/b&gt;(vararg elements: T) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;LinkedHashSet&lt;/b&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;sortedSetOf&lt;/b&gt;(vararg elements: T) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;TreeSet&lt;/b&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -208px / 200px 420px repeat-x; height: 2px; padding: 21px 0px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  3. 스트림 함수&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;변환&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;map(): 컬렉션 내 인자를 다른 값 혹은 타입으로 변환할 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;mapIndexed(): 사용하면 컬렉션 내 포함된 인자의 인덱스 값을 변환 함수 내에서 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;mapNotNull(): 컬렉션 내 각 인자를 변환함과 동시에, 변환한 결과가 null 값인 경우 이를 무시한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;flayMap(): map()과 달리 변환 함수의 반환형이 Interable. 따라서 하나의 인자에서 여러 개의 인자로 매핑이 필요한 경우 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;groupBy(): 컬렉션 내 인자들을 지정한 기준에 따라 분류하며, 각 인자들의 리스트를 포함하는 맵 형태로 결과를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583921658813&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; @Test
    fun MapTest(){

        // map ()
        val cities = listOf(&quot;Seoul, Tokyo, Moutain View&quot;)
        cities.map{
            city -&amp;gt; city.toUpperCase()
        }.forEach{ println(it) }

        //mapIndexed()
        val numbers = 0..10
        numbers.mapIndexed{
            idx, number -&amp;gt; idx * number
        }.forEach { print(&quot;$it &quot;)}


        //mapNotNull() : 값이 Null이면 무시
        cities.mapNotNull{
                city -&amp;gt; if (city.length &amp;lt;= 5) city else null
        }.forEach{ println(it) }


        //groupBy()
        cities.groupBy { city -&amp;gt; if(city.length &amp;lt;= 5) &quot;A&quot; else &quot;B&quot;}
            .forEach { key, cities -&amp;gt; println(&quot;key = $key cities = $cities&quot;) }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;필터&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;filter() 함수는 컬렉션 내 인자들 중 주어진 조건과 일치하는 인자만 걸러주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;take() 함수는 컬렉션 내 인자들 중 앞에서 take() 함수의 인자로 받은 개수만큼만을 인자로 갖는 리스트를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;drop() 함수는 take()함수의 반대 역할. 조건을 만족하는 항목ㅇ르 컬렉션에서 제외한 결과를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;first() 함수는 컬렉션 내 첫번재 인자를 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;last() 함수는 first() 함수와 반대 역할. 컬렉션 내 마지막 인자를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;distinct() 함수는 컬렉션 내에 포함된 항목 중 중복된 항목을 걸러낸 결과를 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;조합 및 합계&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;zip() 함수는 두 컬렉션 내의 자료들을 조합하여 새로운 자료를 만들 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;count() 함수는 컬렉션 내 포함된 자료의 개수 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;reduce() 함수는 컬렉션 내 자료들을 모두 합쳐 하나의 값으로 만들어주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fold() 함수는 reduce()와 유사하지만 초깃값 지정 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기타&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;any() 함수는 컬렉션 내 단 하나의 자료라도 존재하면 true를, 그렇지 않으면 false를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;none() 함수는 any()함수의 반대.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;max() : 최댓값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;min() : 최솟값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;average() : 평균&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -208px / 200px 420px repeat-x; height: 2px; padding: 21px 0px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  4. 범위 지정 함수&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;특정 객체에 있는 함수를 연속해서 사용 OR 다른 함수의 인자로 전달하기 위해 변수를 선언하고 다른 곳에서 사용하지 않는 등의 경우가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이때 유용하게 사용할 수 있는 함수를 표준 라이브러리를 통해 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;516&quot; height=&quot;639&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3DCcs/btqCB7WR6hC/v1AZTYPmdwLqKgx3Do0rI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3DCcs/btqCB7WR6hC/v1AZTYPmdwLqKgx3Do0rI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3DCcs/btqCB7WR6hC/v1AZTYPmdwLqKgx3Do0rI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3DCcs%2FbtqCB7WR6hC%2Fv1AZTYPmdwLqKgx3Do0rI1%2Fimg.png&quot; width=&quot;516&quot; height=&quot;639&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;let() 함수&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 함수를 호출한 객체를 이어지는 함수 블록의 인자로 전달한다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;불필요한 변수 선언을 방지&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;null 값이 아닌 경우를 체크한 후 특정 작업을 수행하는 코드에 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T, R&amp;gt; T.let ( block : (T) -&amp;gt; R ) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583921658819&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun doSomething(message : String?){
            message?.let{
                println(&quot;message : $message&quot;)
            }
        }
        doSomething(&quot;let함수 예제입니당&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;apply() 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 함수를 호출한 객체를, 이어지는 함수 블록의 리시버(receiver)로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&amp;nbsp;&lt;/b&gt;객체 이름 없이 직접 해당 객체 내부에 속성에 접근 가능&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt; T.apply ( block : T.() -&amp;gt; Unit ) : T&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;with() 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인자로 받은 객체를 이어지는 함수 블록의 리시버로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔&amp;nbsp;함수의 인자로 전달 받은&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체 내부에 속성에 접근 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T, R&amp;gt; with (receiver : T, block : T.() -&amp;gt; R ) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583921658824&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun doSomething(messageView : TextView){
            with(messageView){
                text = &quot;Hello, world&quot; 
                gravity = Gravity.CENTER_HORIZONTAL 
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;run() 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인자가 없는 익명 함수처럼 사용하는 형태와, 객체에서 호출하는 형태를 제공&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&amp;nbsp;&lt;/b&gt;인자가 없는 익명 함수처럼 사용하는 경우, 복잡한 계산을 위해 여러 임시 변수가 필요할 때 유용하게 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;run() 함수 내부에서 선언되는 변수들은 블록 외부에 노출되지 않으므로 변수 선언 영역을 확실히 분리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;객체에서 run() 함수를 호출하는 경우 with() 함수와 유사한 목적으로 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;run() 함수는 안전한 호출을 사용할 수 있으므로 null 값일 수 있는 객체의 속성이나 함수에 연속적으로 접근해야 할 때 유용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;R&amp;gt; run ( block : () -&amp;gt; R) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T, R&amp;gt; run ( block : T.() -&amp;gt; R ) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -208px / 200px 420px repeat-x; height: 2px; padding: 21px 0px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;참고&lt;/span&gt;&lt;/p&gt;</description>
      <category>Client/Android</category>
      <category>범위지정함수</category>
      <category>스트림함수</category>
      <category>안드로이드</category>
      <category>익스텐션</category>
      <category>컬렉션생성함수</category>
      <category>코틀린</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/28</guid>
      <comments>https://aonee.tistory.com/28#entry28comment</comments>
      <pubDate>Wed, 11 Mar 2020 22:04:38 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 커니의 코틀린-(4) 코틀린 표준 라이브러리</title>
      <link>https://aonee.tistory.com/27</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;차세대 안드로이드 개발자를 위한 커니의 코틀린&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;ch4 코틀린 표준 라이브러리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xhUiC/btqCAPPI70q/ASkctwSTCorTKgVeOLm40K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xhUiC/btqCAPPI70q/ASkctwSTCorTKgVeOLm40K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xhUiC/btqCAPPI70q/ASkctwSTCorTKgVeOLm40K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxhUiC%2FbtqCAPPI70q%2FASkctwSTCorTKgVeOLm40K%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 목차&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 조건 확인 함수&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 컬렉션 생성 함수&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 스트림 함수&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. 범위 지정 함수&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  1. 조건 확인 함수&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;특정 값의 일치 여부 확인 : check, require&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;[ 사용목적 ]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&lt;/b&gt; 함수 OR 생성자의 인자로 전달받은 값 사용하기 전, 그 값의 유효성 검사&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&amp;nbsp;&lt;/span&gt;&lt;/b&gt;버그 방지하기 위해 명시적으로 에러 발생 사실 알리고 프로그램 종료&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;값 확인 OR 조건 일치하지 않았을 경우 수행할 작업 지정가능.&lt;/span&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;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;check()&lt;/b&gt; - IllegalStateException 발생시킴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;require()&lt;/b&gt; - IllegalArgumentException 발생시킴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;checkNotNull()&lt;/b&gt; 함수와 requireNotNull() 함수로 특정 값의 null 여부를 확인하고 nul이 아닌 값을 반환 받을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;명시적으로 실행 중단하기 : error, TODO&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;[ 사용목적 ]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔ &lt;span style=&quot;color: #333333;&quot;&gt;호출될 가능성이 없는 영역에 &lt;span style=&quot;color: #333333;&quot;&gt;진입하게 되는 경우 임의로 예외를 &lt;span style=&quot;color: #333333;&quot;&gt;발생시켜 프로그램의 실행을 막기 위해&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;정상적으로 프로그램이 실행될 경우 호출될 가능성이 없는 영역 존재.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 경우, 부작용 예측이 어렵다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;따라서, &lt;span style=&quot;color: #333333;&quot;&gt;예외를 발생시켜 프로그램의 실행을 막을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun error(message: String) : Nothing - 인자로 받은 message와 함께 IllegalStateException을 발생시킴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun TODO(): Nothing - NotImplementedError 예외를 발생시켜 이 부분이 완성되지 않았음을 알려줌&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun TODO(reason: String): Nothing - 에러 메시지에 표시될 상세 내용을 reason 매개변수를 통해 전달&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  2. 컬렉션 생성 함수&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;배열&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&amp;nbsp;arrayO&lt;/b&gt;f(vararg elements: T): Array&amp;lt;T&amp;gt; - 함수의 인자로 받은 값으로 구성된 배열 반환&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;emptyArray&lt;/b&gt;():&amp;nbsp;Array&amp;lt;T&amp;gt; - 특정 타입을 갖는 빈 배열 반환&lt;/span&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&amp;nbsp;arrayOfNulls&lt;/b&gt;(size: Int): Array&amp;lt;T?&amp;gt; - 배열 내 각 값들이 모두 null 값으로 초기화&lt;/span&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리스트&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;listOf&lt;/b&gt;(vararg elements: T): List&amp;lt;T&amp;gt; - 수정할 수 없는 리스트&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T : Any&amp;gt;&amp;nbsp;&lt;b&gt;listOfNotNull&lt;/b&gt;(vararg elements: T?): List&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;fun &amp;lt;T&amp;gt; &lt;/span&gt;&lt;b&gt;mutableListOf&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(vararg elements: T): MutableList&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;fun &amp;lt;T&amp;gt; &lt;/span&gt;&lt;b&gt;arrayListOf&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(vararg elements: T): ArrayList&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;맵&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함하는 요소를 읽을 수만 있고 수정할 수 없는 맵은 다음과 같이 생성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;K, V&amp;gt;&amp;nbsp;&lt;b&gt;mapOf&lt;/b&gt;(vararg pairs: Pair&amp;lt;K, V&amp;gt;): &lt;b&gt;Map&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함하고 있는 요소를 수정할 수 있는 맵은 mutableMapOf() 함수를 사용하여 &lt;span style=&quot;color: #333333;&quot;&gt;생성할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;K, V&amp;gt;&amp;nbsp;&lt;b&gt;mutableMapOf&lt;/b&gt;(vararg pairs: Pair&amp;lt;K, V&amp;gt;): &lt;b&gt;MutableMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;보다 명시적인 타입의 맵을 생성해야 하는 경우 hashMapOf(), linkedMapOf(), sortedMapOf() 함수를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun&lt;b&gt; hashMapOf&lt;/b&gt;(vararg pairs: Pair&amp;lt;K, V&amp;gt;) : &lt;b&gt;HashMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &lt;b&gt;linkeMapOf&lt;/b&gt;(vararg pairs : Pair&amp;lt;K, V&amp;gt;) : &lt;b&gt;LinkedHashMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &lt;b&gt;sortedMapOf&lt;/b&gt;(vararg pairs : Pair&amp;lt;K, V&amp;gt;) : &lt;b&gt;SortedMap&lt;/b&gt;&amp;lt;K, V&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합(set)은 중복되지 않는 요소들로 구성된 자료구조&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함하는 요소를 읽을 수만 있고 수정할 수 없는 집합은 다음과 같이 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;setOf&lt;/b&gt;(vararg elements: T): Set&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합에 포함된 요소를 수정할 수 있는 집합은 mutableSetOf() 함수를 사용하여 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt;&amp;nbsp;mutableSetOf&lt;/b&gt;(vararg elements: T): MutableSet&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;보다 명시적인 타입의 집합을 생성해야 하는 경우 hashSetOf(), linkedSetOf(), sortedSetOf() 함수를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt; hashSetOf&lt;/b&gt;(vararg elements: T) : &lt;b&gt;HashSet&lt;/b&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&amp;nbsp;&lt;b&gt;linked&lt;/b&gt;&lt;b&gt;SetOf&lt;/b&gt;(vararg elements: T) : &lt;b&gt;LinkedHashSet&lt;/b&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt;&lt;b&gt; sortedSetOf&lt;/b&gt;(vararg elements: T) : &lt;b&gt;TreeSet&lt;/b&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  3. 스트림 함수&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;변환&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;map(): 컬렉션 내 인자를 다른 값 혹은 타입으로 변환할 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;mapIndexed(): 사용하면 컬렉션 내 포함된 인자의 인덱스 값을 변환 함수 내에서 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;mapNotNull(): 컬렉션 내 각 인자를 변환함과 동시에, 변환한 결과가 null 값인 경우 이를 무시한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;flayMap(): map()과 달리 변환 함수의 반환형이 Interable. 따라서 하나의 인자에서 여러 개의 인자로 매핑이 필요한 경우 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;groupBy(): 컬렉션 내 인자들을 지정한 기준에 따라 분류하며, 각 인자들의 리스트를 포함하는 맵 형태로 결과를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583918349142&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; @Test
    fun MapTest(){

        // map ()
        val cities = listOf(&quot;Seoul, Tokyo, Moutain View&quot;)
        cities.map{
            city -&amp;gt; city.toUpperCase()
        }.forEach{ println(it) }

        //mapIndexed()
        val numbers = 0..10
        numbers.mapIndexed{
            idx, number -&amp;gt; idx * number
        }.forEach { print(&quot;$it &quot;)}


        //mapNotNull() : 값이 Null이면 무시
        cities.mapNotNull{
                city -&amp;gt; if (city.length &amp;lt;= 5) city else null
        }.forEach{ println(it) }


        //groupBy()
        cities.groupBy { city -&amp;gt; if(city.length &amp;lt;= 5) &quot;A&quot; else &quot;B&quot;}
            .forEach { key, cities -&amp;gt; println(&quot;key = $key cities = $cities&quot;) }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;필터&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;filter() 함수는 컬렉션 내 인자들 중 주어진 조건과 일치하는 인자만 걸러주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;take() 함수는 컬렉션 내 인자들 중 앞에서 take() 함수의 인자로 받은 개수만큼만을 인자로 갖는 리스트를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;drop() 함수는 take()함수의 반대 역할. 조건을 만족하는 항목ㅇ르 컬렉션에서 제외한 결과를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;first() 함수는 컬렉션 내 첫번재 인자를 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;last() 함수는 first() 함수와 반대 역할. 컬렉션 내 마지막 인자를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;distinct() 함수는 컬렉션 내에 포함된 항목 중 중복된 항목을 걸러낸 결과를 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;조합 및 합계&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;zip() 함수는 두 컬렉션 내의 자료들을 조합하여 새로운 자료를 만들 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;count() 함수는 컬렉션 내 포함된 자료의 개수 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;reduce() 함수는 컬렉션 내 자료들을 모두 합쳐 하나의 값으로 만들어주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fold() 함수는 reduce()와 유사하지만 초깃값 지정 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기타&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;any() 함수는 컬렉션 내 단 하나의 자료라도 존재하면 true를, 그렇지 않으면 false를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;none() 함수는 any()함수의 반대.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;max() : 최댓값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;min() : 최솟값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;average() : 평균&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  4. 범위 지정 함수&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;특정 객체에 있는 함수를 연속해서 사용 OR 다른 함수의 인자로 전달하기 위해 변수를 선언하고 다른 곳에서 사용하지 않는 등의 경우가 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이때 유용하게 사용할 수 있는 함수를 표준 라이브러리를 통해 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;516&quot; height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGLAc/btqCGRSnMvO/7OXLsjw0xCHHgTYJWMXyIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGLAc/btqCGRSnMvO/7OXLsjw0xCHHgTYJWMXyIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGLAc/btqCGRSnMvO/7OXLsjw0xCHHgTYJWMXyIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGLAc%2FbtqCGRSnMvO%2F7OXLsjw0xCHHgTYJWMXyIk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;516&quot; height=&quot;639&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;let() 함수&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 함수를 호출한 객체를 이어지는 함수 블록의 인자로 전달한다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&lt;/b&gt; 불필요한 변수 선언을 방지&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;null 값이 아닌 경우를 체크한 후 특정 작업을 수행하는 코드에 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T, R&amp;gt; T.let ( block : (T) -&amp;gt; R ) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583920256364&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun doSomething(message : String?){
            message?.let{
                println(&quot;message : $message&quot;)
            }
        }
        doSomething(&quot;let함수 예제입니당&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;apply() 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 함수를 호출한 객체를, 이어지는 함수 블록의 리시버(receiver)로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&amp;nbsp;&lt;/b&gt;객체 이름 없이 직접 해당 객체 내부에 속성에 접근 가능&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T&amp;gt; T.apply ( block : T.() -&amp;gt; Unit ) : T&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;with() 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인자로 받은 객체를 이어지는 함수 블록의 리시버로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔&amp;nbsp;함수의 인자로 전달 받은&lt;span style=&quot;color: #333333;&quot;&gt; 객체 내부에 속성에 접근 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T, R&amp;gt; with (receiver : T, block : T.() -&amp;gt; R ) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583921323196&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun doSomething(messageView : TextView){
            with(messageView){
                text = &quot;Hello, world&quot; 
                gravity = Gravity.CENTER_HORIZONTAL 
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;run() 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인자가 없는 익명 함수처럼 사용하는 형태와, 객체에서 호출하는 형태를 제공&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 사용목적 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;✔&amp;nbsp;&lt;/b&gt;인자가 없는 익명 함수처럼 사용하는 경우, 복잡한 계산을 위해 여러 임시 변수가 필요할 때 유용하게 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;run() 함수 내부에서 선언되는 변수들은 블록 외부에 노출되지 않으므로 변수 선언 영역을 확실히 분리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;객체에서 run() 함수를 호출하는 경우 with() 함수와 유사한 목적으로 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;run() 함수는 안전한 호출을 사용할 수 있으므로 null 값일 수 있는 객체의 속성이나 함수에 연속적으로 접근해야 할 때 유용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;R&amp;gt; run ( block : () -&amp;gt; R) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;fun &amp;lt;T, R&amp;gt; run ( block : T.() -&amp;gt; R ) : R&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;참고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5&quot;&gt;https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1583916184114&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Kotlin Scoping Functions apply vs. with, let, also, and run&quot; data-og-description=&quot;Functional-style programming is highly advocated and supported by Kotlin&amp;rsquo;s syntax as well as a range of functions in Kotlin&amp;rsquo;s standard&amp;hellip;&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5&quot; data-og-url=&quot;https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5&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;&gt;Kotlin Scoping Functions apply vs. with, let, also, and run&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Functional-style programming is highly advocated and supported by Kotlin&amp;rsquo;s syntax as well as a range of functions in Kotlin&amp;rsquo;s standard&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Client/Android</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/27</guid>
      <comments>https://aonee.tistory.com/27#entry27comment</comments>
      <pubDate>Wed, 11 Mar 2020 18:23:42 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs] express 구조, 라우팅 방법, package-lock.json 사용이유</title>
      <link>https://aonee.tistory.com/26</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dah8T/btqCwXfEXxH/bCWIHm2mu3f8bGVmBYG2L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dah8T/btqCwXfEXxH/bCWIHm2mu3f8bGVmBYG2L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dah8T/btqCwXfEXxH/bCWIHm2mu3f8bGVmBYG2L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDah8T%2FbtqCwXfEXxH%2FbCWIHm2mu3f8bGVmBYG2L1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;Express&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;node를 위한 빠르고 간결한 웹 프레임워크로 &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 메소드 + 편리한 메소드 추가해서 기능 보완했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(프레임워크란 ?&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;설계의&amp;nbsp;기반이 되는&amp;nbsp;부분을 기술한&amp;nbsp;&amp;nbsp;확장 가능한 기반 코드 + 필요한 라이브러리 통합되어 제공하는 형태)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HTTP요청에 대해 라우팅 및 미들웨어 기능 제공&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;라우팅&lt;/b&gt; : 서버경로제어, 통신 데이터를 보낼 경로 선택&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;미들웨어&lt;/b&gt; : 부가적인 기능이나 처리를 제공하는 목적&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;express-generator&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Nodejs + Express 구조의 뼈대를 만들 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설치 :&amp;nbsp; npm install -g express-generator&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 생성 : express 생성할프로젝트이름&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서버 시작 : npm start&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모듈 설치 : npm install&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTbLhT/btqCuZEXFke/7OutyHKD2C6l6SV1Fscjlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTbLhT/btqCuZEXFke/7OutyHKD2C6l6SV1Fscjlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTbLhT/btqCuZEXFke/7OutyHKD2C6l6SV1Fscjlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTbLhT%2FbtqCuZEXFke%2F7OutyHKD2C6l6SV1Fscjlk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ELb8v/btqCAP8fHT9/zqKYTpk1kab1vSeaZKeY8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ELb8v/btqCAP8fHT9/zqKYTpk1kab1vSeaZKeY8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ELb8v/btqCAP8fHT9/zqKYTpk1kab1vSeaZKeY8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FELb8v%2FbtqCAP8fHT9%2FzqKYTpk1kab1vSeaZKeY8K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgNW3Z/btqCy5cU1OX/IekVsotBHHHSy1HY1Gal5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgNW3Z/btqCy5cU1OX/IekVsotBHHHSy1HY1Gal5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgNW3Z/btqCy5cU1OX/IekVsotBHHHSy1HY1Gal5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgNW3Z%2FbtqCy5cU1OX%2FIekVsotBHHHSy1HY1Gal5k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;./package-lock.json 파일이란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;npm을 사용해&amp;nbsp;node_modules&amp;nbsp;트리 OR package.json파일을 수정하면 자동으로 생성되는파일&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 파일은 파일이 생성되는 시점의&lt;b&gt; 의존성 트리에 대한 정확한 정보&lt;/b&gt;를 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;필요한 이유?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 의존성 트리에 대한 정보를 모두 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. github 저장소에 꼭 같이 커밋을 해야한다. 특히, node_modules 없이 배포하는 경우 반드시 필요하다!!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시) &lt;span style=&quot;color: #333333;&quot;&gt;node_modules 폴더를 제외하고 저장된 저장소의 &lt;/span&gt;파일을 pull 받았을 때&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;./package-lock.json 없으면 ?&amp;nbsp; =&amp;gt; &lt;/span&gt;의존성 트리의 일부 버전이 다르게 설치됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 있으면 ?&amp;nbsp; =&amp;gt; 동일한 버전으로 잘 설치됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;/routes 파일 기본 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583586340773&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var express = require('express');

var router = express.Router();



router.get('/', function(req, response, next){



});



module.exports = router;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;request처리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;req.query&amp;nbsp; &amp;nbsp;:&lt;/b&gt; url query문자열&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;url?str=hello&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.log(req.query.str)&amp;nbsp; //결과 : hello&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;req.params :&lt;/b&gt; url에서 변수로 넘어온 것&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;url/idx&amp;nbsp; url/1004&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #333333;&quot;&gt;console.log(req.params.str)&amp;nbsp; //결과 : 1004&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;req.body&amp;nbsp; &amp;nbsp; :&lt;/b&gt; body로 넘어온 값&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;req.file&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:&lt;/b&gt; 파일을 전송받았을 떄&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;response처리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;res.status() :&lt;/b&gt; 정수 값으로 status code 작성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;res. send() :&lt;/b&gt; JSON형식으로 response body작성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;라우팅 - 파일 접근 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583585734784&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;gt;config
		dbconfig.js
	&amp;gt;errors
		DatabaseError.js
		DuplicatedEntryError.js
		index.js
		NoReferenceRowError.js
		NotMatchedError.js
		ParameterError.js
	&amp;gt;models
		Comment.js
		Todo.js
	
	&amp;gt;modules
		&amp;gt;db
		  pool.js
		&amp;gt;utils
		  index.js
		  responseMessage.js
		  statusCode.js
		  util.js
	
	&amp;gt;routes
		&amp;gt;todos
			&amp;gt;todos.js
			&amp;gt;index.js
			router.use('/:todoId/comments', require('./comments'));
			router.use('/', require('./todos'));		
			
			&amp;gt;comments
				&amp;gt;comments.js
				&amp;gt;index.js
				router.use('/', require('./comments'));	
		&amp;gt;index.js
		router.use('/todos', require('./todos'));
	
	&amp;gt;app.js
    	const indexRouter = require('./routes/index');
    	app.use('/', indexRouter);
	&amp;gt;index.js&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. app.js :&lt;/b&gt; 라우팅의 시작점. require('./routes/index')를 통해 routes/index 폴더 호출.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. routes/index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. routes/todo/index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. routes/todo/comments/index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server/Nodejs</category>
      <category>express구조</category>
      <category>nodejs</category>
      <category>package-lock</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/26</guid>
      <comments>https://aonee.tistory.com/26#entry26comment</comments>
      <pubDate>Sat, 7 Mar 2020 22:14:29 +0900</pubDate>
    </item>
    <item>
      <title>[Git ppt 자료 4] 이클립스에서 Git Flow전략을 적용한 협업방법 (master-develop-feature)</title>
      <link>https://aonee.tistory.com/24</link>
      <description>&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;[Git ppt 자료 Link]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://aonee.tistory.com/entry/Git-ppt-%EC%9E%90%EB%A3%8C-Git-%ED%95%84%EC%9A%94%EC%84%B1-Github-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[Git ppt 자료 1] Git 필요성, Github 저장소 생성 방법, git 기초 명령어&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://aonee.tistory.com/manage/newpost/23?type=post&amp;amp;returnURL=https%3A%2F%2Faonee.tistory.com%2Fentry%2FGit-ppt-%25EC%259E%2590%25EB%25A3%258C-2-Branch%25EB%259E%2580-Git-Flow%25EB%259E%2580&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Git&amp;nbsp;ppt&amp;nbsp;자료&amp;nbsp;2]&amp;nbsp;Branch란?&amp;nbsp;Git&amp;nbsp;Flow란?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aonee.tistory.com/entry/Git-ppt-%EC%9E%90%EB%A3%8C-3-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C-Git-%EC%97%B0%EB%8F%99-%EC%82%AC%EC%9A%A9%EB%B2%95-%ED%8C%80%EC%9E%A5%EA%B3%BC-%ED%8C%80%EC%9B%90%EC%9D%98-%ED%98%91%EC%97%85%EB%B0%A9%EB%B2%95%EA%B9%8C%EC%A7%80-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[Git ppt 자료 3] 이클립스에서 Git 연동, 사용법, 팀장과 팀원의 협업방법까지 총정리&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deT2ZE/btqCu0bdvge/PNBLleMb0aG0AvV96qEUwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deT2ZE/btqCu0bdvge/PNBLleMb0aG0AvV96qEUwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deT2ZE/btqCu0bdvge/PNBLleMb0aG0AvV96qEUwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeT2ZE%2FbtqCu0bdvge%2FPNBLleMb0aG0AvV96qEUwk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zfgYR/btqCrkoctn9/gHoUWqZA6yTjJwdkBL20z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zfgYR/btqCrkoctn9/gHoUWqZA6yTjJwdkBL20z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zfgYR/btqCrkoctn9/gHoUWqZA6yTjJwdkBL20z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzfgYR%2FbtqCrkoctn9%2FgHoUWqZA6yTjJwdkBL20z0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.1 협업방식 적용 이유&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HcvO0/btqCsGYzVGm/CJ9KpZnKZ9KXCbu7gbbh10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HcvO0/btqCsGYzVGm/CJ9KpZnKZ9KXCbu7gbbh10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HcvO0/btqCsGYzVGm/CJ9KpZnKZ9KXCbu7gbbh10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHcvO0%2FbtqCsGYzVGm%2FCJ9KpZnKZ9KXCbu7gbbh10%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.2 협업방식 적용 장점&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xMVRN/btqCqMZukq5/m9iaKo9LF0vqJfCN4Xgi71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xMVRN/btqCqMZukq5/m9iaKo9LF0vqJfCN4Xgi71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xMVRN/btqCqMZukq5/m9iaKo9LF0vqJfCN4Xgi71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxMVRN%2FbtqCqMZukq5%2Fm9iaKo9LF0vqJfCN4Xgi71%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNfpgN/btqCrjQmUNL/cjw2rh8MjJTnMvs9YzXIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNfpgN/btqCrjQmUNL/cjw2rh8MjJTnMvs9YzXIkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNfpgN/btqCrjQmUNL/cjw2rh8MjJTnMvs9YzXIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNfpgN%2FbtqCrjQmUNL%2Fcjw2rh8MjJTnMvs9YzXIkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통) 1. Issue&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YJHfA/btqCsIoAg0C/gxkFvcYA5KnZtDAHfBfD8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YJHfA/btqCsIoAg0C/gxkFvcYA5KnZtDAHfBfD8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YJHfA/btqCsIoAg0C/gxkFvcYA5KnZtDAHfBfD8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYJHfA%2FbtqCsIoAg0C%2FgxkFvcYA5KnZtDAHfBfD8K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj26NP/btqCvzdmqod/fvTDpkHg4836wKD0kgJC5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj26NP/btqCvzdmqod/fvTDpkHg4836wKD0kgJC5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj26NP/btqCvzdmqod/fvTDpkHg4836wKD0kgJC5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj26NP%2FbtqCvzdmqod%2FfvTDpkHg4836wKD0kgJC5K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clA6q7/btqCrkIws9n/OBiqmeaZiTFKCAOKTaJja0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clA6q7/btqCrkIws9n/OBiqmeaZiTFKCAOKTaJja0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clA6q7/btqCrkIws9n/OBiqmeaZiTFKCAOKTaJja0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclA6q7%2FbtqCrkIws9n%2FOBiqmeaZiTFKCAOKTaJja0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통)&lt;span&gt; 2. Branch 생성 및 작업&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVcMH/btqCuYYJ1yi/YrTCqkAEmvUUZgV9kGnwr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVcMH/btqCuYYJ1yi/YrTCqkAEmvUUZgV9kGnwr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVcMH/btqCuYYJ1yi/YrTCqkAEmvUUZgV9kGnwr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVcMH%2FbtqCuYYJ1yi%2FYrTCqkAEmvUUZgV9kGnwr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yf3sH/btqCn0jWhmf/sWmK6mNLq47cjQJuhThfuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yf3sH/btqCn0jWhmf/sWmK6mNLq47cjQJuhThfuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yf3sH/btqCn0jWhmf/sWmK6mNLq47cjQJuhThfuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYf3sH%2FbtqCn0jWhmf%2FsWmK6mNLq47cjQJuhThfuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sg3i2/btqCrPBwvU4/KKhMTkTW25OeVSJXQxeizk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sg3i2/btqCrPBwvU4/KKhMTkTW25OeVSJXQxeizk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sg3i2/btqCrPBwvU4/KKhMTkTW25OeVSJXQxeizk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsg3i2%2FbtqCrPBwvU4%2FKKhMTkTW25OeVSJXQxeizk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y6AWa/btqCuZchz5a/Ug2kHvMkQrfYn0U9GiriJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y6AWa/btqCuZchz5a/Ug2kHvMkQrfYn0U9GiriJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y6AWa/btqCuZchz5a/Ug2kHvMkQrfYn0U9GiriJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy6AWa%2FbtqCuZchz5a%2FUg2kHvMkQrfYn0U9GiriJ0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통)&lt;span&gt; 3. Commit &amp;amp; Push&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xoHM7/btqCvxfw1GL/miDvr66ppQHLK92WQpTgwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xoHM7/btqCvxfw1GL/miDvr66ppQHLK92WQpTgwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xoHM7/btqCvxfw1GL/miDvr66ppQHLK92WQpTgwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxoHM7%2FbtqCvxfw1GL%2FmiDvr66ppQHLK92WQpTgwK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD1Fox/btqCrk2OvJu/OWv7HKQt5kqKKZE5kK5lpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD1Fox/btqCrk2OvJu/OWv7HKQt5kqKKZE5kK5lpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD1Fox/btqCrk2OvJu/OWv7HKQt5kqKKZE5kK5lpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD1Fox%2FbtqCrk2OvJu%2FOWv7HKQt5kqKKZE5kK5lpk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciPIVu/btqCsGEj8sE/nUPB9mNVLGWIKjPPcDfm4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciPIVu/btqCsGEj8sE/nUPB9mNVLGWIKjPPcDfm4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciPIVu/btqCsGEj8sE/nUPB9mNVLGWIKjPPcDfm4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciPIVu%2FbtqCsGEj8sE%2FnUPB9mNVLGWIKjPPcDfm4k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTfPzY/btqCn0xsYnc/CaKXxOr1KBavg9bK2jWXd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTfPzY/btqCn0xsYnc/CaKXxOr1KBavg9bK2jWXd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTfPzY/btqCn0xsYnc/CaKXxOr1KBavg9bK2jWXd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTfPzY%2FbtqCn0xsYnc%2FCaKXxOr1KBavg9bK2jWXd0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통) 4.Pull Request (= PR)&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKXCM/btqCoQH8PkW/3PKd8LpflvTBlJ9lQOr8xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKXCM/btqCoQH8PkW/3PKd8LpflvTBlJ9lQOr8xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKXCM/btqCoQH8PkW/3PKd8LpflvTBlJ9lQOr8xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKXCM%2FbtqCoQH8PkW%2F3PKd8LpflvTBlJ9lQOr8xK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6vmdr/btqCsHwpsDa/T9bef8cJEw4Kqkk8iUxt9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6vmdr/btqCsHwpsDa/T9bef8cJEw4Kqkk8iUxt9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6vmdr/btqCsHwpsDa/T9bef8cJEw4Kqkk8iUxt9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6vmdr%2FbtqCsHwpsDa%2FT9bef8cJEw4Kqkk8iUxt9k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2G39S/btqCqOiLg7o/gHDWwtrSVEJ8MXrHTWH7D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2G39S/btqCqOiLg7o/gHDWwtrSVEJ8MXrHTWH7D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2G39S/btqCqOiLg7o/gHDWwtrSVEJ8MXrHTWH7D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2G39S%2FbtqCqOiLg7o%2FgHDWwtrSVEJ8MXrHTWH7D0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통)&lt;span&gt; 5. 코드리뷰 (선택사항)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baWQ4O/btqCqND5odr/WkzKTWFH0o8HxMXUvwYIK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baWQ4O/btqCqND5odr/WkzKTWFH0o8HxMXUvwYIK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baWQ4O/btqCqND5odr/WkzKTWFH0o8HxMXUvwYIK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaWQ4O%2FbtqCqND5odr%2FWkzKTWFH0o8HxMXUvwYIK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통)&lt;span&gt; 6. Merge (코드병합)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWHgAM/btqCrjixHN8/L3vkBLvPbsXENbi9DYMnI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWHgAM/btqCrjixHN8/L3vkBLvPbsXENbi9DYMnI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWHgAM/btqCrjixHN8/L3vkBLvPbsXENbi9DYMnI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWHgAM%2FbtqCrjixHN8%2FL3vkBLvPbsXENbi9DYMnI0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c79ujV/btqCvyerGSU/jux1MPRsn0CaDcOpKkA7vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c79ujV/btqCvyerGSU/jux1MPRsn0CaDcOpKkA7vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c79ujV/btqCvyerGSU/jux1MPRsn0CaDcOpKkA7vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc79ujV%2FbtqCvyerGSU%2Fjux1MPRsn0CaDcOpKkA7vK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bni6Bb/btqCsIa0tdv/JUFuXJPxwwHO51czIvkvY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bni6Bb/btqCsIa0tdv/JUFuXJPxwwHO51czIvkvY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bni6Bb/btqCsIa0tdv/JUFuXJPxwwHO51czIvkvY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbni6Bb%2FbtqCsIa0tdv%2FJUFuXJPxwwHO51czIvkvY1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통)&lt;span&gt; 7. Chekcout branch develop&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span&gt;checkout 이란? branch를 이동할 때 사용하는 명령어이다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1G0zQ/btqCqMSKpnE/c5jiIYtcrZB4RbSRHmOuq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1G0zQ/btqCqMSKpnE/c5jiIYtcrZB4RbSRHmOuq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1G0zQ/btqCqMSKpnE/c5jiIYtcrZB4RbSRHmOuq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1G0zQ%2FbtqCqMSKpnE%2Fc5jiIYtcrZB4RbSRHmOuq0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MlqE4/btqCvyMhXu4/g1BVUzac3Tl33qEcArlNO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MlqE4/btqCvyMhXu4/g1BVUzac3Tl33qEcArlNO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MlqE4/btqCvyMhXu4/g1BVUzac3Tl33qEcArlNO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMlqE4%2FbtqCvyMhXu4%2Fg1BVUzac3Tl33qEcArlNO1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qR1mW/btqCpQ2enqw/Kc6ciCr6b3Wc4to2C3MnN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qR1mW/btqCpQ2enqw/Kc6ciCr6b3Wc4to2C3MnN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qR1mW/btqCpQ2enqw/Kc6ciCr6b3Wc4to2C3MnN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqR1mW%2FbtqCpQ2enqw%2FKc6ciCr6b3Wc4to2C3MnN1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5SejH/btqCoQH81Yh/I3jrko5Wtbpc3PHAlKdrw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5SejH/btqCoQH81Yh/I3jrko5Wtbpc3PHAlKdrw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5SejH/btqCoQH81Yh/I3jrko5Wtbpc3PHAlKdrw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5SejH%2FbtqCoQH81Yh%2FI3jrko5Wtbpc3PHAlKdrw0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnUixd/btqCsGxyuI1/JoDUfIJqt9pX6OpYkhdpc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnUixd/btqCsGxyuI1/JoDUfIJqt9pX6OpYkhdpc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnUixd/btqCsGxyuI1/JoDUfIJqt9pX6OpYkhdpc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnUixd%2FbtqCsGxyuI1%2FJoDUfIJqt9pX6OpYkhdpc0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GakzK/btqCsIa0G6k/lQEsXZk493yUWd9W2iztwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GakzK/btqCsIa0G6k/lQEsXZk493yUWd9W2iztwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GakzK/btqCsIa0G6k/lQEsXZk493yUWd9W2iztwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGakzK%2FbtqCsIa0G6k%2FlQEsXZk493yUWd9W2iztwK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n9fEM/btqCoSeQjVC/cpwVl8WDt0VfrzWUjAqVu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n9fEM/btqCoSeQjVC/cpwVl8WDt0VfrzWUjAqVu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n9fEM/btqCoSeQjVC/cpwVl8WDt0VfrzWUjAqVu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn9fEM%2FbtqCoSeQjVC%2FcpwVl8WDt0VfrzWUjAqVu1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통) 9. delete feature branch&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;feature branch 삭제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwupRW/btqCrlm6ugQ/bnGfKXpzn6wi6e0lOihnEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwupRW/btqCrlm6ugQ/bnGfKXpzn6wi6e0lOihnEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwupRW/btqCrlm6ugQ/bnGfKXpzn6wi6e0lOihnEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwupRW%2FbtqCrlm6ugQ%2FbnGfKXpzn6wi6e0lOihnEK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;6.협업(공통) 10.정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MGL2G/btqCqM6mVYk/8TFXtizMYWw3H0HJO0nnnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MGL2G/btqCqM6mVYk/8TFXtizMYWw3H0HJO0nnnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MGL2G/btqCqM6mVYk/8TFXtizMYWw3H0HJO0nnnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMGL2G%2FbtqCqM6mVYk%2F8TFXtizMYWw3H0HJO0nnnk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;또 다른 기능을 구현하기 위해서는 다시 6-1번~9번을 수행하면 된다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JaWgd/btqCtYYZSxy/bnKpxurU4effXARLBqFGKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JaWgd/btqCtYYZSxy/bnKpxurU4effXARLBqFGKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JaWgd/btqCtYYZSxy/bnKpxurU4effXARLBqFGKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaWgd%2FbtqCtYYZSxy%2FbnKpxurU4effXARLBqFGKK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4mjxQ/btqCpP90BR4/FtrzaDpZX3w44oDkqzpjDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4mjxQ/btqCpP90BR4/FtrzaDpZX3w44oDkqzpjDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4mjxQ/btqCpP90BR4/FtrzaDpZX3w44oDkqzpjDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4mjxQ%2FbtqCpP90BR4%2FFtrzaDpZX3w44oDkqzpjDk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxNOb/btqCrObwadt/YrxqPDuEGfQ9gvgmeOrHk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxNOb/btqCrObwadt/YrxqPDuEGfQ9gvgmeOrHk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxNOb/btqCrObwadt/YrxqPDuEGfQ9gvgmeOrHk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxNOb%2FbtqCrObwadt%2FYrxqPDuEGfQ9gvgmeOrHk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZD4kx/btqCtXltG2R/AV7gOn6KtGy3fKnJ3WRapk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZD4kx/btqCtXltG2R/AV7gOn6KtGy3fKnJ3WRapk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZD4kx/btqCtXltG2R/AV7gOn6KtGy3fKnJ3WRapk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZD4kx%2FbtqCtXltG2R%2FAV7gOn6KtGy3fKnJ3WRapk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AaHdo/btqCqOwiLy0/TcHFqmjrBiZ4PldouX2Wb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AaHdo/btqCqOwiLy0/TcHFqmjrBiZ4PldouX2Wb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AaHdo/btqCqOwiLy0/TcHFqmjrBiZ4PldouX2Wb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAaHdo%2FbtqCqOwiLy0%2FTcHFqmjrBiZ4PldouX2Wb0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>Git</category>
      <category>gitflow</category>
      <category>github</category>
      <category>ppt</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/24</guid>
      <comments>https://aonee.tistory.com/24#entry24comment</comments>
      <pubDate>Wed, 4 Mar 2020 01:31:53 +0900</pubDate>
    </item>
    <item>
      <title>[Git ppt 자료 2] Branch란? Git Flow란?</title>
      <link>https://aonee.tistory.com/23</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;[Git ppt 자료 Link]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://aonee.tistory.com/entry/Git-ppt-%EC%9E%90%EB%A3%8C-Git-%ED%95%84%EC%9A%94%EC%84%B1-Github-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[Git ppt 자료 1] Git 필요성, Github 저장소 생성 방법, git 기초 명령어&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aonee.tistory.com/entry/Git-ppt-%EC%9E%90%EB%A3%8C-3-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C-Git-%EC%97%B0%EB%8F%99-%EC%82%AC%EC%9A%A9%EB%B2%95-%ED%8C%80%EC%9E%A5%EA%B3%BC-%ED%8C%80%EC%9B%90%EC%9D%98-%ED%98%91%EC%97%85%EB%B0%A9%EB%B2%95%EA%B9%8C%EC%A7%80-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[Git ppt 자료 3] 이클립스에서 Git 연동, 사용법, 팀장과 팀원의 협업방법까지 총정리&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://aonee.tistory.com/entry/Git-ppt-%EC%9E%90%EB%A3%8C-4-Git-%ED%95%84%EC%9A%94%EC%84%B1-Github-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95-git-%EA%B8%B0%EC%B4%88-%EB%AA%85%EB%A0%B9%EC%96%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Git&amp;nbsp;ppt&amp;nbsp;자료&amp;nbsp;4]&amp;nbsp;이클립스에서&amp;nbsp;Git&amp;nbsp;Flow전략을&amp;nbsp;적용한&amp;nbsp;협업방법&amp;nbsp;(master-develop-feature)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;04. Git Flow&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx4wJF/btqCpQA5XxV/IAxvW4xv9XYJQiwGXyN9xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx4wJF/btqCpQA5XxV/IAxvW4xv9XYJQiwGXyN9xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx4wJF/btqCpQA5XxV/IAxvW4xv9XYJQiwGXyN9xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx4wJF%2FbtqCpQA5XxV%2FIAxvW4xv9XYJQiwGXyN9xK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bykQPY/btqCvx7GLBt/98Fma6kztMOkznkHtR4uw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bykQPY/btqCvx7GLBt/98Fma6kztMOkznkHtR4uw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bykQPY/btqCvx7GLBt/98Fma6kztMOkznkHtR4uw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbykQPY%2FbtqCvx7GLBt%2F98Fma6kztMOkznkHtR4uw1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;4.1 branch란&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsm88K/btqCtXeIrhw/WP53KPpUD8r3ffQedFPFIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsm88K/btqCtXeIrhw/WP53KPpUD8r3ffQedFPFIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsm88K/btqCtXeIrhw/WP53KPpUD8r3ffQedFPFIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsm88K%2FbtqCtXeIrhw%2FWP53KPpUD8r3ffQedFPFIK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;4.2 gitflow란&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9f4og/btqCn1b8pOA/BtgK1leevkjf1g5zNH5wVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9f4og/btqCn1b8pOA/BtgK1leevkjf1g5zNH5wVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9f4og/btqCn1b8pOA/BtgK1leevkjf1g5zNH5wVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9f4og%2FbtqCn1b8pOA%2FBtgK1leevkjf1g5zNH5wVK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsp4Rp/btqCtY5Ltfx/K5cKIfPAHSyF1XNGLEiO51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsp4Rp/btqCtY5Ltfx/K5cKIfPAHSyF1XNGLEiO51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsp4Rp/btqCtY5Ltfx/K5cKIfPAHSyF1XNGLEiO51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsp4Rp%2FbtqCtY5Ltfx%2FK5cKIfPAHSyF1XNGLEiO51%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blFgXs/btqCrPIgOTY/Z03YkOuYyhYAtnJjSUWRDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blFgXs/btqCrPIgOTY/Z03YkOuYyhYAtnJjSUWRDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blFgXs/btqCrPIgOTY/Z03YkOuYyhYAtnJjSUWRDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblFgXs%2FbtqCrPIgOTY%2FZ03YkOuYyhYAtnJjSUWRDk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>branch</category>
      <category>Git</category>
      <category>gitflow</category>
      <category>github</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/23</guid>
      <comments>https://aonee.tistory.com/23#entry23comment</comments>
      <pubDate>Wed, 4 Mar 2020 00:55:24 +0900</pubDate>
    </item>
    <item>
      <title>Eclipse - NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider</title>
      <link>https://aonee.tistory.com/22</link>
      <description>&lt;p&gt;jar 파일 적용이 안돼서 발생하는 문제&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;NoClassDefFoundError : &lt;span style=&quot;color: #000000;&quot;&gt;컴파일타임때 요구되는 클래스가 존재하지만 &lt;/span&gt;실행환경에서 참조가 안된 경우 발생하는 에러&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해결&lt;/p&gt;
&lt;p&gt;1. widow - preferences - Java - Build Path - User Libraries&lt;/p&gt;
&lt;p&gt;여기서&lt;/p&gt;
&lt;p&gt;New - library명 내가 원하는대로 적고 ok - apply and close&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;project 우클릭 - build path - add libraries - User Library - 내가 만든 라이브러리 선택 - Finish&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/22</guid>
      <comments>https://aonee.tistory.com/22#entry22comment</comments>
      <pubDate>Tue, 3 Mar 2020 19:12:02 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs] 자바스크립트 기초</title>
      <link>https://aonee.tistory.com/20</link>
      <description>&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 기본자료형 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Boolean, Number, String, Null, Undefined, Symbol&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;객체&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Function, Array, Object&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관련된 데이터와 함수(property와 method)의 집합&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;{} 키워드&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;memberName: memberValue형태&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 객체는 JSON으로 표기가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JSON 표기법으로 객체를 만들 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583071819717&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = {};
var person = {
	name : &quot;최예원&quot;,
        address : &quot;seoul&quot;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;배열&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바스크립트에서 배열은 객체다. 즉 다양한 메소드를 지원한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바스크립트에서 배열에는 어떤 값도 들어 갈 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[] 키워드를 이용해서 표현&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1583071974303&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array1 = [];  // var array1 = new Array();
var array2 = [1, 2, 3, 4, 5]; 
var array3 = [&amp;ldquo;최예원&amp;rdquo;, 3, 4.5, false, {name: &amp;ldquo;yewon&amp;rdquo;, address: &amp;rdquo;seoul&amp;rdquo;}];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바스크립트에서 함수는 객체다&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;함수를 생성하는 방법에는 함수 선언식과 함수 표현식이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;호이스팅에 영향을 받는 함수 선언식&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;function add(x, y){ return x + y; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;호이스팅에 영향을 받지 않는 함수 선언식&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;var add = function(x, y) { return x + y; }&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; var add = (x, y) =&amp;gt; { return x + y; }&lt;/span&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 일급 객체&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변수 or 데이터 구조에 담을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 함수의 파라미터로 전달할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반환 값으로 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;런타임 시 생성될 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; var, let, const&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 63px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 선언 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 선언 불가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 선언 불가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 할당 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 할당 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 할당 불가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 선언 가능 : 같은 이름의 변수를 다시 선언할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;var a = 24;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;var a = 25;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p contenteditable=&quot;true&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재 할당 가능 : 변수가 새로운 값을 가질 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;var a = 24;&amp;nbsp;&amp;nbsp;a = 25;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt; JSON&lt;/span&gt;?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JavaScript&amp;nbsp;Object&amp;nbsp;Notation.&amp;nbsp;js에서&amp;nbsp;객체&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;사용하는&amp;nbsp;표현식&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;경량의 데이터 교환 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;특정언어에 종속되지 않음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;클라이언트와 데이터교환시 사용 :&amp;nbsp;&amp;nbsp;aplication/json&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;var&amp;nbsp;jsonEx&amp;nbsp;=&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nickname&quot;&amp;nbsp;:&amp;nbsp;&quot;애오니&quot;,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hobby&quot;&amp;nbsp;:&amp;nbsp;&quot;Programming&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객체요소 접근 2가지 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;방법1)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;console.log(jsonEx[&quot;nickname&quot;]);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;console.log(jsonEx[&quot;hobby&quot;]);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;방법2)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;console.log(jsonEx.nickname);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;console.log(jsonEx.hobby);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;json 객체 값 접근&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;for(key&amp;nbsp;in&amp;nbsp;jsonEx){&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(key&amp;nbsp;+&amp;nbsp;&quot;,&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;jsonEx[key]);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;}&lt;/span&gt;&lt;/p&gt;</description>
      <category>Server/Nodejs</category>
      <category>javascript</category>
      <category>nodejs</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/20</guid>
      <comments>https://aonee.tistory.com/20#entry20comment</comments>
      <pubDate>Sun, 1 Mar 2020 23:41:38 +0900</pubDate>
    </item>
    <item>
      <title>커니의 코틀린-(2) 자바와 비교해보는 코틀린 컬렉션, 클래스, 인터페이스, 싱글톤, 제네릭, 널 안전성</title>
      <link>https://aonee.tistory.com/18</link>
      <description>&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;차세대 안드로이드 개발자를 위한 커니의 코틀린&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;ch2 자바와 비교해보는 코틀린&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9UEbF/btqCgR1MuIF/3zHVKXrMHREtoHy2jswXTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9UEbF/btqCgR1MuIF/3zHVKXrMHREtoHy2jswXTk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9UEbF/btqCgR1MuIF/3zHVKXrMHREtoHy2jswXTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9UEbF%2FbtqCgR1MuIF%2F3zHVKXrMHREtoHy2jswXTk%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  2.2 컬렉션&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;java : 자료 수정 가능여부 제한 &lt;span style=&quot;color: #ee2323;&quot;&gt;불가능&lt;/span&gt;.&amp;nbsp; 가변만 존재&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : &lt;span style=&quot;color: #333333;&quot;&gt;자료 수정 가능여부 제한 &lt;span style=&quot;color: #0593d3;&quot;&gt;가능&lt;/span&gt;. 가변, 불가변 모두 존재&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;2.3 클래스 및 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로퍼티&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java : 클래스 내에 자료를 저장하고 접근하기 위해 필드와 메서드를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 자료에 접근하기 위해서는 Getter/Setter 메서드를 추가해야해서 불필요하게 코드가 길어진다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : 이러한 불편함을 개선하기 위해 프로퍼티를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;생성자&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java : 필드 정의, 생성자 초기화 코드를 직접 작성해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : 한 줄의 코드로 인자로 받은 값을 사용하여 내부의 필드 및 프로퍼티에 값을 할당할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;클래스와 인터페이스의 선언 및 인스턴스 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;추상클래스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java : 클래스의 인스턴스를 생성하기 위해 new 키워드를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : object : [생성자] 형태로 선언&amp;nbsp; ex) object : Foo()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java : 클래스의 인스턴스를 생성하기 위해 new 키워드를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : object : [인터페이스 이름] 형태로 선언 ex) object : Bar&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://aonee.tistory.com/entry/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;추상클래스와 인터페이스의 공통점과 차이점에 대해 알고 싶다면? Click&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  공통점과 목적 및 특징의 차이점에 대해 적어놨습니다 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;싱글톤&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;java와 달리 kotlin은 object를 붙여 코드 한 줄로 쉽게 싱글톤을 생성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582872346443&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object singleton{

	val test1 = &quot;test다!&quot;
    
    fun testValue() {}
}

//object singleton의 test1참조
val refTest1 = singleton.test1

//object singleton의 testValue 함수참조
singleton.testValue()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;2.6 제네릭&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인자로 사용하는 타입에 따라 구체화되는 클래스나 인터페이스&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 클래스 인터페이스 정의&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1582873050793&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car(){ ... }

interface Container&amp;lt;T&amp;gt;{    //타입을 Car 클래스에 한정하고 싶은 경우, Container&amp;lt;T : Car&amp;gt;
	fun put(item : T)
    fun take() : T
}

class Garage : Container&amp;lt;Car&amp;gt;{
	override fun put(item : Car){ ...  }
    override fun take() : Car { ... }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 제네릭을 인자로 받는 함수&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java :&amp;nbsp; ? super T,&amp;nbsp; ? extends T&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : in T, out T&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;T&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 별도의 Wildcard 정의가 없이 read/write 모두 가능&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;in T&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Java의&lt;span&gt;&amp;nbsp;&lt;/span&gt;? super T와 같음.&lt;span&gt;&amp;nbsp;&lt;/span&gt;input의 약자이며&lt;span&gt;&amp;nbsp;&lt;/span&gt;write&lt;span&gt;&amp;nbsp;&lt;/span&gt;만 가능&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;out T&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Java의&lt;span&gt;&amp;nbsp;&lt;/span&gt;? extends T와 같음.&lt;span&gt;&amp;nbsp;&lt;/span&gt;output의 약자이며&lt;span&gt;&amp;nbsp;&lt;/span&gt;read&lt;span&gt;&amp;nbsp;&lt;/span&gt;만 가능&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2.8 널 안전성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로그램을 개발하며 가장 빈번하게 발생하는 오류는 널 포인터 예외이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java : @Nullable @NonNull 어노테이션을 사용하여 객체의 널 허용여부를 표시&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : ?를 붙이면 Nullable&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 널 허용 여부 표기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 엘비스 ( ?: )&amp;nbsp; 연산자. 널 값을 대신하는 방법&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;널 값을 허용하지 &lt;span style=&quot;color: #ee2323;&quot;&gt;않는&lt;/span&gt; 값 or 변수에 널 값을 반환할 수 &lt;span style=&quot;color: #0593d3;&quot;&gt;있는&lt;/span&gt; 함수의 결과를 대입해야하는 경우에 사용한다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조건문과 유사하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582876856403&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//foo가 널이면 bar반환
foo ?: bar

//Code함수가 널이면 Code.NONE 대입
val postal : PostalCode = Code(&quot;1600 pppp cd&quot;) ?: Code.NONE

fun MapImage (address : String){
	//Code함수가 널이면 함수 실행을 종료하고 결과로 null 반환
	val postal = Code(&quot;1600 pppp cd&quot;) ?: return null
    
    //지도 이미지 생성
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 안전한 호출 ( ?. ) 연산자.&amp;nbsp; 널 값 확인과 처리 한번에&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;java : null 값 여부 확인을 위해 주로 if문 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582877936370&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//bar가 null이 아닐 경우만 foo에 값 대입. null인 경우는 null 대입
val foo = bar?.baz

//foo가 null 아닐 경우에 bar() 호출
foo?.bar()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. as? 연산자. 안전한 자료형 변환&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원되지 않는 자료형 변환을 시도하는 경우 예외 발생시키는 대신 널 값 반환해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. !! 비 널값 보증 연산자. 널 값 아님 명시&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보증하려는 항목 뒤에 !!을 붙여 사용.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러나, null인 경우 예외가 발생하니 주의&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. lateinit 키워드. 나중에 초기화 되는 변수를 위해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kotlin : 널 값 허용하지 않는 경우 초기화 or 생성자를 통해 초기화 강제함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러나, 초기화 없이 변수만 선언할 수 있다. 바로 lateinit 키워드를 사용하여!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Client/Android</category>
      <category>커니의 코틀린</category>
      <category>코틀린 널안전성</category>
      <category>코틀린 생성자</category>
      <category>코틀린 인터페이스</category>
      <category>코틀린 추상클래스</category>
      <category>코틀린 컬렉션</category>
      <category>코틀린답게</category>
      <author>aonee</author>
      <guid isPermaLink="true">https://aonee.tistory.com/18</guid>
      <comments>https://aonee.tistory.com/18#entry18comment</comments>
      <pubDate>Fri, 28 Feb 2020 17:08:14 +0900</pubDate>
    </item>
  </channel>
</rss>