<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>녜보로그</title>
    <link>https://nyebo.tistory.com/</link>
    <description>IT, 일상을 기록하는 녜보로그입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 22 May 2026 18:05:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>nyebo</managingEditor>
    <image>
      <title>녜보로그</title>
      <url>https://tistory1.daumcdn.net/tistory/1702269/attach/055131fe17f049a0a832049aa80547c2</url>
      <link>https://nyebo.tistory.com</link>
    </image>
    <item>
      <title>코로나19 - 델타 플러스 변이 국내 확진 발생</title>
      <link>https://nyebo.tistory.com/entry/%EC%BD%94%EB%A1%9C%EB%82%9819-%EB%8D%B8%ED%83%80-%ED%94%8C%EB%9F%AC%EC%8A%A4-%EB%B3%80%EC%9D%B4-%EA%B5%AD%EB%82%B4-%ED%99%95%EC%A7%84-%EB%B0%9C%EC%83%9D</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;코로나19 확진자와 예방접종 현황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 코로나19 4차 대융행이 한 달 가까이 이어지고 있는 가운데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8월 4일 00시 기준&lt;/b&gt;으로 &lt;b&gt;총 1,725명의 확진자&lt;/b&gt;(국내 1,664명 / 해외 61명)가 발생했습니다.&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-origin-width=&quot;660&quot; data-origin-height=&quot;216&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwph6/btra8AxOgHY/BCmccwjasTrYRMMCAOfih0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwph6/btra8AxOgHY/BCmccwjasTrYRMMCAOfih0/img.png&quot; data-alt=&quot;질병관리청 &amp;amp;quot;코로나19 국내 발생 및 예방접종 현황(8.4.)&amp;amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwph6/btra8AxOgHY/BCmccwjasTrYRMMCAOfih0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flwph6%2Fbtra8AxOgHY%2FBCmccwjasTrYRMMCAOfih0%2Fimg.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;216&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;figcaption&gt;질병관리청 &quot;코로나19 국내 발생 및 예방접종 현황(8.4.)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 예방접종은 &lt;b&gt;1차 접종&lt;/b&gt;이 &lt;b&gt;약 2천만 명&lt;/b&gt;, &lt;b&gt;접종 완료&lt;/b&gt;가 &lt;b&gt;약 730만 명&lt;/b&gt;으로, 우리나라 총 인구 대비 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;14.2%&lt;/b&gt;&lt;/span&gt;&lt;b&gt;가 접종을 완료&lt;/b&gt;했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백신은 오늘(8월 4일) 예정대로 &lt;b&gt;화이자 백신 253만 회 분&lt;/b&gt;이 인천공항에 도착했고, &lt;b&gt;아스트라제네카 백신 역시 118.8만 회분&lt;/b&gt;이 안동공장에서 출고되었습니다. 내일(5일)도 &lt;b&gt;아스트라제네카 백신 118.8만 회분&lt;/b&gt;이 안동공장에서 출고 예정으로, &lt;b&gt;8월 1일부터 5일까지 608.5만 회분&lt;/b&gt;이 도입. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;8월 중 총 2,860만 회분&lt;/b&gt;&lt;/span&gt;의 화이자, 아스트라제네카, 모더너 백신이 도입 될 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백신 &lt;b&gt;미접종자의 백신 접종 의향&lt;/b&gt;이 &lt;b&gt;84.1%&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;h2 data-ke-size=&quot;size26&quot;&gt;델타 플러스 변이는?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;델타 플러스 변이 바이러스&lt;/b&gt;는 기존 코로나19 바이러스보다 전파력이 더 강한 &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;먼저 델타형 변이 바이러스의 국내 확인 건수는 지난 6월 2주차에 &lt;b&gt;8건&lt;/b&gt;을 시작으로 7월 1주차에 &lt;b&gt;250건&lt;/b&gt;으로 폭증하는 등 강한 전파력을 보이고 있습니다.&amp;nbsp;&lt;/p&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: #006dd7;&quot;&gt;&lt;b&gt;2명이 확진&lt;/b&gt;&lt;/span&gt;되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더군다나 2명 모두 아스트라제네카(AZ) 백신 접종을 마친 상태에서 감염되어, &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;그러나 아직까지 델타 플러스 변이가 기존 델타형 변이보다 전염성이 더 강해졌다는 근거는 발생되지 않았으며, 백신에 대한 저항력 역시 비변이 바이러스보다 2.7~5.4배 강한 수준으로 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;기존 델타형 변이 바이러스와 큰 차이가 없는 것&lt;/b&gt;&lt;/span&gt;으로 밝혀졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세계보건기구(WHO)와 미국, 영구 정부에서도 델타 플러스 변이를 델타 변이와 함께 묶어서 분류하고 있기에, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;델타 플러스 변이라고 해서 과도하게 우려할 필요는 없을 것 같습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-8988515533527613&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;오히려 변이 바이러스가 유행하는 지금, 그리고 휴가철이 겹친 지금 더욱더 기본방역수칙 준수와 거리두기에 적극 동참이 필요&lt;/b&gt;&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4단계 거리두기가 연장(07.26 ~ 8.8)된 가운데, 많은 사람들이 힘든 생활을 이어가고 있습니다. 무엇보다 당장 매출에 여향을 받는 자영업자들이나 밤낮으로 고생하는 의료진 분들 등 코로나19를 이겨내기 위해 많은 분들이 고생하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 와중에 '나는 괜찮아' 라는 마음으로 방역수칙을 가볍게 생각하고 어기는 모습을 볼 때면, 답답함이 밀려옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히나 이런 와중에 유흥시설이나 단체 모임에서 확진자가 발생했다는 기사를 접하면 답답함은 더 배가되구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'나 하나쯤이야' 란 생각보다 '나 한명이라도' 라는 생각으로 방역수칙과 거리두기를 잘 지키면, 생각보다 더 빨리 코로나19를 극복할 수 있지 않을까 싶습니다.&lt;/b&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;style3&quot;&gt;아직 백신을 맞지 않으셨고, 18~49세 이시라면?&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://nyebo.net/entry/%EC%BD%94%EB%A1%9C%EB%82%9819-1849%EC%84%B8-%EB%8C%80%EC%83%81-%EB%B0%B1%EC%8B%A0-%EC%98%88%EC%95%BD-%EC%8B%9C%EC%9E%91&quot;&gt;코로나19, 18~49세 대상 백신 예약 시작&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/88</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%BD%94%EB%A1%9C%EB%82%9819-%EB%8D%B8%ED%83%80-%ED%94%8C%EB%9F%AC%EC%8A%A4-%EB%B3%80%EC%9D%B4-%EA%B5%AD%EB%82%B4-%ED%99%95%EC%A7%84-%EB%B0%9C%EC%83%9D#entry88comment</comments>
      <pubDate>Wed, 4 Aug 2021 16:18:21 +0900</pubDate>
    </item>
    <item>
      <title>코로나19, 18~49세 대상 백신 예약 시작</title>
      <link>https://nyebo.tistory.com/entry/%EC%BD%94%EB%A1%9C%EB%82%9819-1849%EC%84%B8-%EB%8C%80%EC%83%81-%EB%B0%B1%EC%8B%A0-%EC%98%88%EC%95%BD-%EC%8B%9C%EC%9E%91</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전 50대 백신 접종 예약 시 많은 사람이 한꺼번에 모여, 백신 접종 예약 시 많은 어려움이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 질병관리청은 이번 &lt;b&gt;만 18~49세 대상&lt;/b&gt;(약 1770만 명)의 코로나19 백신 접종은 &lt;b&gt;10부제&lt;/b&gt;로 나누어 예약을 받기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상자이신 분들은 본인이 예약 가능한 날짜를 꼭 확인하여, 코로나 19 백신 예약을 잊지 않도록 합시다!&lt;/p&gt;
&lt;p data-ke-size=&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-ke-size=&quot;size26&quot;&gt;그래서 대상자는?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;만 18~49세&lt;/b&gt;.&lt;/span&gt; 1972년생부터 2003년생까지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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-ke-size=&quot;size26&quot;&gt;언제부터?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전예약: &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;8월 9일(월) ~ 8월 18일(수) 매일 20시부터 다음날 18시까지&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가예약:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;8월 19일(목) : 36~49세&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;8월 20일(금) : 18~35세&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;8월 21일(토) : 18~49세&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 대상자 추가 예약 및 예약변경: &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;8월 22일(일) ~ 9월 17일(금)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;접종실시:&lt;b&gt; 08월 26일(목) ~ 09월 30일(목)&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;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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;생일 끝자리&lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;같은 날짜&lt;/b&gt;&lt;/span&gt;에 예약하면 됩니다(10부제).
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;9일, 19일, 29일&lt;/b&gt;&lt;/span&gt;에 태어난 사람: 8월 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;9일&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;10일, 20일, 30일&lt;/span&gt;&lt;/b&gt;에 태어난 사람: 8월 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;10일&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;5일, 15일, 25일&lt;/span&gt;&lt;/b&gt;에 태어난 사람: 8월&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;15일&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; 백신 예약 신청은 &lt;a href=&quot;https://ncvr.kdca.go.kr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;질병관리청 예약사이트&lt;/a&gt;에서 할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://kdca.go.kr/gallery.es?mid=a20503010000&amp;amp;bid=0002&amp;amp;b_list=9&amp;amp;act=view&amp;amp;list_no=145131&amp;amp;nPage=2&amp;amp;vlist_no_npage=3&amp;amp;keyField=&amp;amp;keyWord=&amp;amp;orderby=&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;자세한 온라인 예약 안내 확인&lt;/a&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;/li&gt;
&lt;li&gt;스마트폰으로도 예약할 수 있습니다!&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;무슨 백신을?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 무슨 백신을 맞게 될 지 궁금하실텐데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.kdca.go.kr/gallery.es?mid=a20503010000&amp;amp;bid=0002&amp;amp;b_list=9&amp;amp;act=view&amp;amp;list_no=145226&amp;amp;nPage=1&amp;amp;vlist_no_npage=1&amp;amp;keyField=&amp;amp;keyWord=&amp;amp;orderby=&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;mRNA &lt;/b&gt;백신&lt;/a&gt; 종류인 &lt;a href=&quot;https://korean.cdc.gov/coronavirus/2019-ncov/vaccines/different-vaccines/Pfizer-BioNTech.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;화이자&lt;/b&gt;&lt;/a&gt;와 &lt;a href=&quot;https://korean.cdc.gov/coronavirus/2019-ncov/vaccines/different-vaccines/Moderna.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;모더나&lt;/b&gt;&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9일 이전에 예약하는 사람들은?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18~49세 연령층 중 &lt;b&gt;우선접종 대상자&lt;/b&gt;인 경우, &lt;b&gt;8월 3일(화) ~ 8월 6일(금)&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대중교통 근로자, 택배근로자, 환경미화원 등 &lt;b&gt;필수업무종사자&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;장애인, 외국인 근로자, 유항색 등 &lt;b&gt;접종소외계층&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;학원∙청소년 관련 종사자, 실내체육시설 종사자 등 &lt;b&gt;아동∙청소년 밀접 접촉자&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;일반∙휴음식점, 노래연습장, PC방 종사자 등 &lt;b&gt;감염위험 높은 시설 종사자&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 우선접종 대사자에 해당된다면, 더 빨리 백신을 맞을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-8988515533527613&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예약 관련 알아두면 좋은 내용들&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://ncvr.kdca.go.kr/popupInfo_20210721.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;대기창에서 접속안될때 조치방법&lt;/a&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PC 브라우저인 경우
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Ctrl+Shift+Delete 키를 누르거나 각 브라우저별 설정메뉴에서 인터넷 접속기록을 모두 삭제합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;접속기록 삭제 후 반드시 웹브라우저를 재시작 하고 접종예약시스템에 접속합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;모바일 브라우저인 경우&lt;/span&gt;&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설정 &amp;gt; 개인 데이터 &amp;gt; 검색데이터 삭제 메뉴를 통해 접속기록을 모두 삭제후 웹브라우저를 재시작 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;예방접종 후 나타날 수 있는 이상반응은?&lt;/span&gt;&lt;/span&gt;&lt;/span&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;통증, 부기, 발적&lt;/b&gt;&lt;/span&gt; 등이 있을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전신반응&lt;/b&gt;으로는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;발열, 피로감, 두통, 근육통, 메스꺼움∙구토&lt;/b&gt;&lt;/span&gt; 등이 나타날 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;드물게,&lt;/b&gt; 얼굴의 부기, 눈 또는 입술∙입안의 부종, 몸 전체의 발진, 빠른 심장 박동, 현기증, 쇼크 등을 동반한 알레르기 반응이 나타날 수 있습니다.&lt;/li&gt;
&lt;li&gt;화이자∙모더나의 경우 &lt;b&gt;매우 드물게,&lt;/b&gt; 심근염∙심낭염이 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 이상반응을 모아놓고 보니 백신을 맞기 걱정되고 무서우시죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이러한 이상반응은 일반적인 독감 주사를 맞아도 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 걱정하지 마시고, &lt;b&gt;접종 후 본인의 몸에서 나타나는 반응을 유심히 관찰&lt;/b&gt;하셨다가 &lt;b&gt;조금이라도 이상&lt;/b&gt;하다 싶으면 &lt;a href=&quot;https://nip.kdca.go.kr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;예방접종도우미 누리집&lt;/a&gt;을 통해 이상반응에 대한 대응방법을 안내받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 접종 후 아래와 같은 이상반응이 나타난다면 지체없이 &lt;b&gt;119로 연락&lt;/b&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;/li&gt;
&lt;li&gt;입술, 얼굴이 붓거나 온몸에 심한 두드러기 증상이 나타나는 경우&lt;/li&gt;
&lt;li&gt;갑자기 의식이 없거나 쓰러진 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백신의 안정성과 이상반응에 대해서 더 자세한 내용은 &lt;a href=&quot;https://ncv.kdca.go.kr/menu.es?mid=a12208000000&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;질병관리청에서 확인&lt;/a&gt;해 주세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기타 알아두면 좋은 내용들&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ncv.kdca.go.kr/menu.es?mid=a12212000000&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코로나19 예방접종 관련 피해보상&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ncv.kdca.go.kr/menu.es?mid=a12215000000&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인과성 불충분한 중증 환자 의료비 지원 사업&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627897988463&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코로나19 백신 및 예방접종&quot; data-og-description=&quot;질병관리청 코로나19 백신 및 예방접종 정보안내&quot; data-og-host=&quot;ncv.kdca.go.kr&quot; data-og-source-url=&quot;https://ncv.kdca.go.kr/menu.es?mid=a12215000000&quot; data-og-url=&quot;http://ncv.kdca.go.kr&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fNw5O/hyK6o1d51G/JmENuqw9n4Yh9N9pllZNc0/img.png?width=420&amp;amp;height=210&amp;amp;face=0_0_420_210,https://scrap.kakaocdn.net/dn/cn1oWv/hyK4IG2VX9/KEmvRkkAiIvEDHkkwST1Nk/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bfvmJv/hyK6i7MGOR/g9cOdo2CUKAM5R9ksk0kj0/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://ncv.kdca.go.kr/menu.es?mid=a12215000000&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ncv.kdca.go.kr/menu.es?mid=a12215000000&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fNw5O/hyK6o1d51G/JmENuqw9n4Yh9N9pllZNc0/img.png?width=420&amp;amp;height=210&amp;amp;face=0_0_420_210,https://scrap.kakaocdn.net/dn/cn1oWv/hyK4IG2VX9/KEmvRkkAiIvEDHkkwST1Nk/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bfvmJv/hyK6i7MGOR/g9cOdo2CUKAM5R9ksk0kj0/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코로나19 백신 및 예방접종&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;질병관리청 코로나19 백신 및 예방접종 정보안내&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ncv.kdca.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://factchecker.or.kr/hot_issues?keyword=%EC%BD%94%EB%A1%9C%EB%82%9819&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코로나19 관련 팩트체크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627897990613&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;전 국민이 함께하는 팩트체크&quot; data-og-description=&quot;코로나19 이슈가 지금 뜨고 있습니다.&quot; data-og-host=&quot;factchecker.or.kr&quot; data-og-source-url=&quot;https://factchecker.or.kr/hot_issues?keyword=%EC%BD%94%EB%A1%9C%EB%82%9819&quot; data-og-url=&quot;https://factchecker.or.kr/hot_issues?keyword=%EC%BD%94%EB%A1%9C%EB%82%9819&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lbrv0/hyK6pTnT7X/XuHWuVMOEBLqT5fmYUjpN1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://factchecker.or.kr/hot_issues?keyword=%EC%BD%94%EB%A1%9C%EB%82%9819&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://factchecker.or.kr/hot_issues?keyword=%EC%BD%94%EB%A1%9C%EB%82%9819&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lbrv0/hyK6pTnT7X/XuHWuVMOEBLqT5fmYUjpN1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;전 국민이 함께하는 팩트체크&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코로나19 이슈가 지금 뜨고 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;factchecker.or.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/87</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%BD%94%EB%A1%9C%EB%82%9819-1849%EC%84%B8-%EB%8C%80%EC%83%81-%EB%B0%B1%EC%8B%A0-%EC%98%88%EC%95%BD-%EC%8B%9C%EC%9E%91#entry87comment</comments>
      <pubDate>Mon, 2 Aug 2021 18:53:30 +0900</pubDate>
    </item>
    <item>
      <title>LEMP + TALL(Tailwind, Alpine, Laravel, Livewire) 초기 설정법</title>
      <link>https://nyebo.tistory.com/entry/Tailwind-Alpine-Laravel-Livewire-TALL-%EC%84%A4%EC%A0%95%ED%8E%B8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ubuntu 20.04 LTS&lt;/li&gt;
&lt;li&gt;Nginx 1.20.1, PHP 8.0.8, Mariadb 10.3.29 (LEMP Stack)&lt;/li&gt;
&lt;li&gt;Laravel 8.5&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용환경 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;편의상 &lt;b&gt;ubuntu&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nginx 1.20.1(stable) 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626435238177&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo wget https://nginx.org/keys/nginx_signing.key
$ sudo apt-key add nginx_signing.key

$ sudo vi /etc/apt/sources.list

# 제일 하단에 아래 내용 추가 후 저장
deb https://nginx.org/packages/ubuntu/ focal nginx
deb-src https://nginx.org/packages/ubuntu/ focal nginx

$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
nginx version: nginx/1.20.1&lt;/code&gt;&lt;/pre&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;PHP 8 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626436318981&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install php8.0-fpm php8.0-pdo php8.0-mysql php8.0-gd php8.0-zip php8.0-mbstring php8.0-curl php8.0-xml php8.0-bcmath php8.0-imagick php8.0-memcached

# php 버전 확인
$ php -v
PHP 8.0.8 (cli) (built: Jul  1 2021 15:26:46) ( NTS )

# php8.0-fpm 실행 확인
$ sudo systemctl status php8.0-fpm
● php8.0-fpm.service - The PHP 8.0 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.0-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-07-16 21:16:43 KST; 26s ago&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;php-fpm 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626438793782&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/php/8.0/fpm/php.ini

cgi.fix_pathinfo=0 # 주석 해제 후 0으로 변경
upload_max_filesize = 32M
post_max_size = 32M
memory_limit = 256M
max_execution_time = 500
date.timezone = 'Asia/Seoul'

# php-fpm 재시작
$ sudo systemctl restart php8.0-fpm&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PHP 8 JIT 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626436471726&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/php/8.0/cli/conf.d/10-opcache.ini&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기존 내용 아래 쪽에 추가&lt;/li&gt;
&lt;li&gt;관련 설정은 &lt;a href=&quot;https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.jit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt; 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626436492006&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=tracing&lt;/code&gt;&lt;/pre&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;Nginx 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;nginx 실행 계정 ubuntu로 변경
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본값은 &lt;b&gt;nginx&lt;/b&gt; 또는 &lt;b&gt;www-data&lt;/b&gt; 임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(옵션) Host 최대 개수 제한 오류를 해결하기 위해 &lt;b&gt;server_names_hash_bucket_size 64;&lt;/b&gt; 주석 해제 또는 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626437078361&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd /etc/nginx
$ sudo vi nginx.conf

-------------------

user  ubuntu; 로 변경

http {
    ...
    
    # 주석 해제 또는 추가
    server_names_hash_bucket_size 64;
    
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;fastcgi-php8.0.conf 파일에 아래 내용 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626448547900&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mkdir /etc/nginx/snippets/
$ sudo vi /etc/nginx/snippets/fastcgi-php8.0.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1626448574786&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi_params;

##
# FastCGI PHP connection
##
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_read_timeout 300;

##
# FastCGI Cache
##
#fastcgi_cache phpcache; 
#fastcgi_cache_valid 200 60m; 
#fastcgi_cache_methods GET HEAD;
#add_header X-Fastcgi-Cache $upstream_cache_status;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;php-fpm 실행 계정 변경
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본값은 &lt;b&gt;www-data&lt;/b&gt; 임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626450997570&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/php/8.0/fpm/pool.d/www.conf 

user = ubuntu
group = ubuntu
listen.owner = ubuntu
listen.group = ubuntu

$ sudo systemctl restart php8.0-fpm

# 변경된 계정 확인
$ ll /var/run/php/php8.0-fpm.sock
srw-rw---- 1 ubuntu ubuntu 0 Jul 17 00:56 /var/run/php/php8.0-fpm.sock=&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;default host 생성
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가상 호스트(Server Block, Apache의 Virtual Host) 생성 시에는 /etc/nginx/sites-available에 Server Block 생성 후 /etc/nginx/sites-enabled 에 심볼릭 링크를 걸어준다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.google.com/search?q=nginx+가상+호스트&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;관련 내용 참고&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626435357825&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd /etc/nginx/conf.d
$ sudo cp default.conf default.conf.bak
$ sudo vi default.conf&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;default.conf 내용을 아래 설정값으로 변경.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;server_name, root 등 환경에 맞추어 변경&lt;/li&gt;
&lt;li&gt;단, 라라벨 사용을 위해서는&lt;b&gt; location / { } 내부&lt;/b&gt;에 &lt;b&gt;try_files $uri $uri/ /index.php?$query_string;&lt;/b&gt; 가 필수적으로 들어가 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626435500633&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server {
    listen 80;
    server_name _;
    ## 라라벨 프로젝트 생성 위치의 public 폴더로 지정
    root /home/ubuntu/tall-stack/public;
    index index.html index.php;

    add_header X-Frame-Options &quot;SAMEORIGIN&quot;;
    add_header X-XSS-Protection &quot;1; mode=block&quot;;
    add_header X-Content-Type-Options &quot;nosniff&quot;;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include snippets/fastcgi-php8.0.conf;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;syntax 검사 후 nginx 재시작&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626437555274&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo systemctl restart nginx
$ sudo systemctl status nginx
● nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-07-16 21:12:14 KST; 4s ago&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TALL Stack이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://tallstack.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TALL Stack&lt;/a&gt;은 라라벨을 중심으로 한 풀 스택 프레임워크(Full-Stack Framework) 를 말한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;ailwind CSS: 일관된 디자인 컨셉과 미리 세팅된 Utility Class를 사용해서, HTML 코드 내에서 바로 CSS 스타일링을 할 수 있는 CSS 프레임워크이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://tailwindcss.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tailwind CSS 사이트 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;lpine.js: jQuery와 비슷한 경량화된 Javascript 프레임워크. 기본적으로 Vue와 문법이 비슷하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://alpinejs.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Alpine.js 사이트 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;L&lt;/b&gt;&lt;/span&gt;aravel: 오픈소스 PHP 웹 프레임워크로, PHP 프레임워크 중에 Codeigniter와 더불어 가장 많이 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://laravel.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;라라벨 사이트 바로가기&lt;/a&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://laravel.kr/docs/8.x&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;라라벨 한국어 매뉴얼 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;L&lt;/b&gt;&lt;/span&gt;ivewire: Javscript 없이 Laravel과 Blade로 동적 페이지 생성이 가능한 Full-Stack Framework이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://laravel-livewire.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Laravel Livewire 사이트 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TALL Stack 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Composer 설치
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;라라벨 사용을 위해서는 Composer가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626938890101&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd
$ php -r &quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&quot;
$ php -r &quot;if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&quot;

Installer verified

# /bin에다가 설치 또는 /usr/local/bin 등 원하는 경로
$ sudo php composer-setup.php --install-dir=/bin --filename=composer
$ php -r &quot;unlink('composer-setup.php');&quot;

# composer 설치 확인
$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.1.3 2021-06-09 16:31:20

# PATH 경로 추가
# .profile 또는 .bashrc 하단에 composer 경로를 추가한다.
$ vi ~/.profile

PATH=&quot;$HOME/.config/composer/vendor/bin:$PATH&quot;

# 설정 다시 불러오기
$ source ~/.profile

# PATH 확인
$ echo $PATH
/home/ubuntu/.config/composer/vendor/bin:...&lt;/code&gt;&lt;/pre&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;Laravel 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626944015384&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ composer global require laravel/installer&lt;/code&gt;&lt;/pre&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;Laravel 프로젝트 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626434614214&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ composer create-project laravel/laravel tall-stack

Creating a &quot;laravel/laravel&quot; project at &quot;./tall-stack&quot;
Installing laravel/laravel (v8.5.22)
  - Installing laravel/laravel (v8.5.22): Extracting archive
Created project in /home/ubuntu/tall-stack
&amp;gt; @php -r &quot;file_exists('.env') || copy('.env.example', '.env');&quot;
Loading composer repositories with package information
Updating dependencies
Lock file operations: 105 installs, 0 updates, 0 removals

...

Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
&amp;gt; @php artisan key:generate --ansi
Application key set successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;pre id=&quot;code_1626434748436&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ laravel new tall-stack&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;본인 IP로 접속 확인
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 처럼 라라벨 화면이 뜨면 성공&lt;/li&gt;
&lt;li&gt;페이지가 열리지 않으면, 방화벽 또는 설정 값을 확인 해 볼 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;649&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0SFYE/btq9NQh8HwC/KAXurtmWoR3dDsbjngF431/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0SFYE/btq9NQh8HwC/KAXurtmWoR3dDsbjngF431/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0SFYE/btq9NQh8HwC/KAXurtmWoR3dDsbjngF431/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0SFYE%2Fbtq9NQh8HwC%2FKAXurtmWoR3dDsbjngF431%2Fimg.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;649&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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 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;Livewire 추가&lt;br /&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;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626434780876&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tall-stack$ composer require livewire/livewire

Using version ^2.5 for livewire/livewire
./composer.json has been updated
Running composer update livewire/livewire
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking livewire/livewire (v2.5.5)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing livewire/livewire (v2.5.5): Extracting archive
Generating optimized autoload files
&amp;gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump
&amp;gt; @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: livewire/livewire
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
75 packages you are using are looking for funding.
Use the `composer fund` command to find out more!&lt;/code&gt;&lt;/pre&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;a href=&quot;https://laravel.com/docs/8.x/starter-kits&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Breeze&lt;/a&gt; 추가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Laravel Breeze 는 로그인, 회원가입, 비밀번호 찾기/재설정, 이메일 확인/비밀번호 확인 등과 같은 인증(Auth) 기능이 구현된 기본 템플릿&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tailwind CSS, Alpinejs&lt;/b&gt;가 같이 설치된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626435003261&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tall-stack$ composer require laravel/breeze

Using version ^1.3 for laravel/breeze
./composer.json has been updated
Running composer update laravel/breeze
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking laravel/breeze (v1.3.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravel/breeze (v1.3.1): Extracting archive
Generating optimized autoload files
&amp;gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump
&amp;gt; @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/breeze
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: livewire/livewire
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
75 packages you are using are looking for funding.
Use the `composer fund` command to find out more!&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로젝트에 breeze 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626679932612&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tall-stack$ php artisan breeze:install

Breeze scaffolding installed successfully.
Please execute the &quot;npm install &amp;amp;&amp;amp; npm run dev&quot; command to build your assets.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;컴파일 및 마이그레이션 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1626681352890&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tall-stack$ npm install &amp;amp;&amp;amp; npm run dev
tall-stack$ php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로젝트를 살펴보면 Controllers 등에 Auth 디렉터리가 생성된 것을 볼 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;package.json&lt;/b&gt; 파일을 살펴보면,&lt;b&gt; tailwindcss&lt;/b&gt;와 &lt;b&gt;alpinejs&lt;/b&gt;가 적용된 것을 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LC5QX/btq91oYkNns/vnSZwuh1w6qzuktR3KysJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LC5QX/btq91oYkNns/vnSZwuh1w6qzuktR3KysJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LC5QX/btq91oYkNns/vnSZwuh1w6qzuktR3KysJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLC5QX%2Fbtq91oYkNns%2FvnSZwuh1w6qzuktR3KysJK%2Fimg.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사이트 접속 후, 우측 &lt;b&gt;Register를&lt;/b&gt; 클릭하면, TALL 스택이 적용된 화면을 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;587&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3GMR/btq9Y5ZftUR/xlHHjRLdAMjKuJKHc6jay0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3GMR/btq9Y5ZftUR/xlHHjRLdAMjKuJKHc6jay0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3GMR/btq9Y5ZftUR/xlHHjRLdAMjKuJKHc6jay0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3GMR%2Fbtq9Y5ZftUR%2FxlHHjRLdAMjKuJKHc6jay0%2Fimg.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;587&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;회원가입을 해보면 대시보드를 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;306&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEdg5m/btq9TGeSHGo/aKCu3qClGYSBEFvOBQ5X6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEdg5m/btq9TGeSHGo/aKCu3qClGYSBEFvOBQ5X6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEdg5m/btq9TGeSHGo/aKCu3qClGYSBEFvOBQ5X6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEdg5m%2Fbtq9TGeSHGo%2FaKCu3qClGYSBEFvOBQ5X6K%2Fimg.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;306&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 LEMP 스택에 TALL 스택 설치가 정상적으로 완료된 것을 볼 수 있다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>Alpine</category>
      <category>LEMP</category>
      <category>LiveWire</category>
      <category>TailwindCSS</category>
      <category>Tall</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/86</guid>
      <comments>https://nyebo.tistory.com/entry/Tailwind-Alpine-Laravel-Livewire-TALL-%EC%84%A4%EC%A0%95%ED%8E%B8#entry86comment</comments>
      <pubDate>Sat, 17 Jul 2021 01:24:16 +0900</pubDate>
    </item>
    <item>
      <title>스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸</title>
      <link>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-6-%EC%83%81%EC%86%8D-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1%EC%86%8C%EB%A9%B8</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/boostcamp_ios&quot;&gt;iOS 프로그래밍을 위한 스위프트 기초(edwith)&lt;/a&gt;&lt;br /&gt;참고 문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide&quot;&gt;The Swift Language Guide (한국어)&lt;/a&gt;&lt;br /&gt;실행 환경: Xcode 12 실행 &amp;rarr; Create a new Xcode project &amp;rarr; macOS &amp;rarr; Command Line Tool 선택 &amp;rarr; Product Name, Organization Identifier 입력 후 프로젝트 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/79&quot;&gt;스위프트(Swift) 5 배워보기 - 1. 다양한 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/80&quot;&gt;&lt;span&gt;스위프트(Swift)&amp;nbsp;5&amp;nbsp;배워보기&amp;nbsp;-&amp;nbsp;2.&amp;nbsp;함수,&amp;nbsp;제어문,&amp;nbsp;옵셔널&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/81&quot;&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/83&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 4. 클로저&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/84&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 5. 프로퍼티&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(계속)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr style=&quot;border: none; font-size: 0px; line-height: 0; height: 19px; margin: 20px auto 0px; background-image: url('https://t1.daumcdn.net/keditor/dist/0.7.8/image/divider-line.svg'); background-size: 200px 420px; cursor: pointer !important; width: 200px; opacity: 0.2; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; z-index: 1; padding: 18px 20px 17px; caret-color: #333333; color: #333333; font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-position: center -362px; background-repeat: no-repeat no-repeat;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&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;Swift에서 클래스가 다른 타입과 구분되는 근본적인 요소는 &lt;b&gt;상속(Inheritance)&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;클래스는 메소드, 프로터피 등을 다른 클래스로부터 상속할 수 있다.&lt;/li&gt;
&lt;li&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;final 키워드를 사용하여 재정의(Override)를 방지할 수 있다.&lt;/li&gt;
&lt;li&gt;static 키워드를 사용하여 타입 메소드를 만들면 재정의가 불가능하다.&lt;/li&gt;
&lt;li&gt;class 키워드를 사용하여 타입 메소드를 만들면 재정의가 가능하다.&lt;/li&gt;
&lt;li&gt;class 앞에 final을 붙이면 static 키워드를 사용한 것과 동일하다.&lt;/li&gt;
&lt;li&gt;override 키워드를 사용하여 부모 클래스의 메소드를 재정의할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623133167702&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기반 클래스 Person 정의
class Person {
    // name 저장 프로피터 선언
    var name: String = &quot;&quot;
    
    // selfIntroduce() 메소드 선언
    func selfIntroduce() {
        print(&quot;저는 \(name)입니다&quot;)
    }
    
    // final 키워드로 재정의 방지
    final func sayHello() {
        print(&quot;hello&quot;)
    }
    
    // 타입 메소드
    // 재정의 불가 타입 메소드 - static
    static func typeMethod() {
        print(&quot;type method - static&quot;)
    }
    
    // 재정의 가능 타입 메소드 - class
    class func classMethod() {
        print(&quot;type method - class&quot;)
    }
    
    // 재정의 가능한 class 메소드라도 
    // final 키워드를 사용하면 재정의 할 수 없다.
    // 메서드 앞의 `static`과 `final class`는 똑같은 역할을 합니다
    final class func finalCalssMethod() {
        print(&quot;type method - final class&quot;)
    }
}

// Person을 상속받는 Student
class Student: Person {
    var major: String = &quot;&quot;
    
    override func selfIntroduce() {
        print(&quot;저는 \(name)이고, 전공은 \(major)입니다&quot;)
    }
    
    override class func classMethod() {
        print(&quot;overriden type method - class&quot;)
    }
    
    // static을 사용한 타입 메소드는 재정의 할 수 없다.
    // override static func typeMethod() {    }
    
    // final 키워드를 사용한 메소드, 프로퍼티는 재정의 할 수 없다.
    // override func sayHello() {    }
    // override class func finalClassMethod() {    }
}


// 객체 생성 후 사용
let nyebo: Person = Person()
let jaehyuk: Student = Student()

nyebo.name = &quot;nyebo&quot;
jaehyuk.name = &quot;jaehyuk&quot;
jaehyuk.major = &quot;Swift&quot;

nyebo.selfIntroduce() // 저는 nyebo입니다

jaehyuk.selfIntroduce() // 저는 jaehyuk이고, 전공은 Swift입니다

Person.classMethod() // type method - class

Person.typeMethod() // type method - static

Person.finalCalssMethod() // type method - final class

Student.classMethod() // overriden type method - class

Student.typeMethod() // type method - static

Student.finalCalssMethod() // type method - final class&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;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;인스턴스 생성&lt;/b&gt;을 &lt;b&gt;초기화(Initialization)&lt;/b&gt;, &lt;b&gt;인스턴스 소멸&lt;/b&gt;을 &lt;b&gt;초기화 해지(Deinitialization)&lt;/b&gt;라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로퍼티 초기화&lt;/h4&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_1623133830628&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PersonA {
    // 모든 저장 프로퍼티에 기본값 할당
    var name: String = &quot;unknown&quot;
    var age: Int = 0
    var nickName: String = &quot;nick&quot;
}

// 인스턴스 생성
let nyebo: PersonA = PersonA()

// 기본값이 인스턴스가 지녀야 할 값과 맞지 않다면
// 생성된 인스턴스의 프로퍼티에 각각 값 할당
nyebo.name = &quot;nyebo&quot;
nyebo.age = 34
nyebo.nickName = &quot;n&quot;

print(nyebo.name)     // nyebo
print(nyebo.age)      // 34
print(nyebo.nickName) // n&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;초기화(init)&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;초기화(init)&lt;/b&gt;를 통해 인스턴스가 생성 시 가져야 할 &lt;b&gt;초기값을 전달&lt;/b&gt;할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;옵셔널 사용 시&lt;/b&gt; 초기값을 &lt;b&gt;생략&lt;/b&gt;할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623134061184&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PersonB {
    // 저장 프로퍼티 선언 시에 값을 미리 할당하지 않고,
    var name: String
    var age: Int
    var nickName: String // 옵셔널
    
    // init으로 인스턴스 생성 시 필요한 초기값을 전달할 수 있다.
    init(name: String, age: Int, nickName: String) {
        self.name = name
        self.age = age
        self.nickName = nickName
    }
}

class PersonC {
    var name: String
    var age: Int
    var nickName: String? // 옵셔널
    
    // 옵셔널 지정한 nickName을 생략할 수 있다.
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

// init으로 전달된 초기값을 사용하여 인스턴스를 생성할 수 있다.
let jaehyuk: PersonB = PersonB(name: &quot;jaehyuk&quot;, age: 34, nickName: &quot;재혁&quot;)
let nyebo: PersonC = PersonC(name: &quot;nyebo2&quot;, age: 34)

// 인스턴스 생성 후 옵셔널 지정한 nickName에 값을 할당할 수 있다.
nyebo.nickName = &quot;녜보&quot;
print(nyebo.nickName!) // 녜보&lt;/code&gt;&lt;/pre&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;init?&lt;/b&gt;을 사용하면, 인스턴스 생성 실패 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;nil을 반환&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623134704039&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PersonD {
  var name: String
  var age: Int
  var nickName: String?
  
  init?(name: String, age: Int) {
    if (0...120).contains(age) == false {
      return nil
    }
    
    if name.count == 0 {
      return nil
    }
    
    self.name = name
    self.age = age
  }
}

let john: PersonD? = PersonD(name: &quot;john&quot;, age: 23)
let joker: PersonD? = PersonD(name: &quot;joker&quot;, age: 123)
let batman: PersonD? = PersonD(name: &quot;&quot;, age: 10)

print(joker) // age 초기값이 기준 범위를 넘어, nil이 반환된다.
print(batman) // name 초기값이 빈 값으로, nil이 반환된다.
&lt;/code&gt;&lt;/pre&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;b&gt;required&lt;/b&gt; 키워드를 붙여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623135253971&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class SomeClass {
    required init() {
    }
}

// 필수초기값을 상속받은 서브클래스에서도 반드시 required 키워드를 붙여
// 다른 서브클래스에게도 이 초기값은 필수초기값이라는 것을 알려야 한다.
class SomeSubclass: SomeClass {
    required init() {
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;초기화 해제(deinit)&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;deinit&lt;/b&gt;은 인스턴스가 메모리에서 해제되는 시점에 호출된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해제 시점은 &lt;a href=&quot;https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ARC(Automatic Reference Counting) 규칙&lt;/a&gt;에 따라 결정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;deinit을 통해&amp;nbsp;인스턴스 해제 시점에 해야할 일을 구현할 수 있다.&lt;/li&gt;
&lt;li&gt;자동으로 호출되므로 직접 호출할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623134869590&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PersonE {
  var name: String
  var pet: String
  var child: String
  
  init(name: String, pet: String, child: String) {
    self.name = name
    self.pet = pet
    self.child = child
  }
  
  // 인스턴스가 메모리에서 해제되는 시점에 자동 호출
  deinit {
     print(&quot;\(name)가 \(child)에게 \(pet)를 인도합니다&quot;)
  }
}

var donald: PersonE? = PersonE(name: &quot;donald&quot;, pet: &quot;happy&quot;, child: &quot;jenny&quot;)
// donald 인스턴스가 더이상 필요없으므로 메모리에서 해제된다.
donald = nil // donald가 jenny에게 happy를 인도합니다
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>SWIFT</category>
      <category>상속</category>
      <category>스위프트</category>
      <category>인스턴스</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/85</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-6-%EC%83%81%EC%86%8D-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1%EC%86%8C%EB%A9%B8#entry85comment</comments>
      <pubDate>Tue, 8 Jun 2021 15:55:28 +0900</pubDate>
    </item>
    <item>
      <title>스위프트(Swift) 5 배워보기 - 5. 프로퍼티</title>
      <link>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-5-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/boostcamp_ios&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;iOS 프로그래밍을 위한 스위프트 기초(edwith)&lt;/a&gt;&lt;br /&gt;참고 문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Swift Language Guide (한국어)&lt;/a&gt;&lt;br /&gt;실행 환경: Xcode 12 실행 &amp;rarr; Create a new Xcode project &amp;rarr; macOS &amp;rarr; Command Line Tool 선택 &amp;rarr; Product Name, Organization Identifier 입력 후 프로젝트 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/79&quot;&gt;스위프트(Swift) 5 배워보기 - 1. 다양한 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/80&quot;&gt;&lt;span&gt;스위프트(Swift)&amp;nbsp;5&amp;nbsp;배워보기&amp;nbsp;-&amp;nbsp;2.&amp;nbsp;함수,&amp;nbsp;제어문,&amp;nbsp;옵셔널&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/81&quot;&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/83&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 4. 클로저&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;스위프트(Swift) 5 배워보기 - 5. 프로퍼티&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/85&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(계속)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&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-image: url('https://t1.daumcdn.net/keditor/dist/0.7.8/image/divider-line.svg'); background-size: 200px 420px; width: 200px; height: 19px; padding: 18px 20px 17px; caret-color: #333333; color: #333333; font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; background-position: center -362px; background-repeat: no-repeat no-repeat;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&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;프로퍼티(Properties)는 구조체, 클래스, 열거형 내부에 구현하는 값이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로퍼티 종류&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장 프로퍼티(Stored Properties)
&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;let 혹은 var로 선언 가능
&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;상수로 선언(let)&lt;/b&gt;하면 그 구조체 인스턴스의 프로퍼티를 변경할 수 없다.&lt;/li&gt;
&lt;li&gt;그러나 &lt;b&gt;클래스&lt;/b&gt;는 &lt;b&gt;상수로 선언(let)&lt;/b&gt;해도 프로퍼티 변경이 가능하다. -&amp;gt; 클래스 인스턴스는 참조 타입이기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인스턴스 저장 프로퍼티&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;타입 저장 프로퍼티&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;지연 저장 프로퍼티&lt;/b&gt;로 구분할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지연 저장 프로퍼티는 값이 처음으로 사용 되지 전에는 계산되지 않는 프로퍼티이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;lazy 키워드 사용&lt;/li&gt;
&lt;li&gt;var로만 선언 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623130930805&quot; class=&quot;swift&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background-color: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Student {

    // 인스턴스 저장 프로퍼티
    var name: String = &quot;&quot;
    var `class`: String = &quot;Swift&quot;
    var koreanAge: Int = 0

    // 타입 저장 프로퍼티
    static var typeDescription: String = &quot;학생&quot;
}

// 인스턴스 생성
var nyebo: Student = Student()
nyebo.koreanAge = 10


// 인스턴스 저장 프로퍼티 사용
nyebo.name = &quot;nyebo1&quot;

// 구조체 내의 프로퍼티가 let이 아닌 var로 선언되었기 때문에
// 값 변경 가능
nyebo.name = &quot;nyebo2&quot;

print(nyebo.name) // nyebo2 출력


// 지연 저장 프로퍼티
// 아래 DataImporter 클래스는 외부에서 data.txt 파일을 가져온다.
// 클래스 초기화를 하는데 많은 시간이 소요된다고 가정
class DataImporter {
	var filename = &quot;data.txt&quot;
    // 이하 데이터 가져오는 코드
}

class DataManager {
    // lazy를 붙여 지연 저장 프로퍼티로 선언
    // DataImporter() 초기화 시 많은 시간이 소요된다.
	lazy var importer = DataImporter()
    var data = [String]()
    // 이하 데이터 관리하는 코드
}

// DataManger 인스턴스 manager를 생성하고
// data늘 append로 추가하여도,
// 아직 DataImporter 인스턴스는 생성되어 있지 않다.
let manager = DataManager()
manager.data.append(&quot;Some data&quot;)
manager.data.append(&quot;Some more data&quot;)

// 실제로 importer 프로퍼티에 처음 접근할 때,
// importer 인스턴스가 생성된다.
print(manager.importer.filename)
// the DataImporter 인스턴스가 생성되었습니다.
// &quot;data.txt&quot; 파일을 출력합니다.

&lt;/code&gt;&lt;/pre&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;연산 프로퍼티(Computed Properties)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;getter&lt;/b&gt;와 &lt;b&gt;optional한 setter&lt;/b&gt;를 제공해 값을 탐색하고, 간적접으로 다른 프로퍼티 값을 설정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;클래스, 구조체, 열거형 모두 사용 가능&lt;/li&gt;
&lt;li&gt;var 로만 선언 가능&lt;/li&gt;
&lt;li&gt;읽기 전용으로 구현 가능하나, 쓰기 전용으로는 구현할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623131585895&quot; class=&quot;swift&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background-color: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Student {
    var name: String = &quot;&quot;
    var `class`: String = &quot;Swift&quot;
    var koreanAge: Int = 0

    // 인스턴스 연산 프로퍼티
    var westernAge: Int {
        get {
            return koreanAge - 1
        }
        
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
    
    // get만 사용하여 읽기 전용 인스턴스 연산 프로퍼티 선언
    var selfIntroduction: String {
        get {
            return &quot;저는 \(self.class)반 \(name)입니다&quot;
        }
    }
    
    // 읽기 전용 타입 연산 프로퍼티
    // 읽기 전용에서는 get을 생략할 수 있다.
    static var selfIntroduction: String {
        return &quot;학생타입입니다&quot;
    }
}

// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction) // 학생타입입니다

// 인스턴스 생성
var nyebo: Student = Student()
nyebo.name = &quot;nyebo&quot;

// 인스턴스 연산 프로퍼티 사용
print(nyebo.selfIntroduction) // 저는 Swift반 nyebo입니다

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로퍼티 옵저버(Property Observers)&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;값이 변경(set)&lt;/b&gt; 될 때마다 이를 감지할 수 있다.&lt;/li&gt;
&lt;li&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;willSet: 값이 저장되기 바로 직전에 호출 됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 newValue를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;didSet: 새 값이 저장되고 난 직후에 호출 됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바뀌기 전의 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 oldValue를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623132228117&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Money {
    // 프로퍼티 옵저버 사용
    var currencyRate: Double = 1100 {
        willSet(newRate) {
            print(&quot;환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다&quot;)
        }
        
        didSet(oldRate) {
            print(&quot;환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다&quot;)
        }
    }

    // 프로퍼티 옵저버 사용 -- 기본 파라미터명 사용 시
    var dollar: Double = 0 {
        // willSet의 암시적 매개변수 이름 newValue
        willSet {
            print(&quot;\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다&quot;)
        }
        
        // didSet의 암시적 매개변수 이름 oldValue
        didSet {
            print(&quot;\(oldValue)달러에서 \(dollar)달러로 변경되었습니다&quot;)
        }
    }  
}

var moneyInMyPocket: Money = Money()

// 환율이 1100.0에서 1150.0으로 변경될 예정입니다
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다

// 0.0달러에서 10.0달러로 변경될 예정입니다
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT</category>
      <category>SWIFT</category>
      <category>스위프트</category>
      <category>프로퍼티</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/84</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-5-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0#entry84comment</comments>
      <pubDate>Tue, 8 Jun 2021 15:12:20 +0900</pubDate>
    </item>
    <item>
      <title>스위프트(Swift) 5 배워보기 - 4. 클로저</title>
      <link>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-4-%ED%81%B4%EB%A1%9C%EC%A0%80</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/boostcamp_ios&quot;&gt;iOS 프로그래밍을 위한 스위프트 기초(edwith)&lt;/a&gt;&lt;br /&gt;참고 문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Swift Language Guide (한국어)&lt;/a&gt;&lt;br /&gt;실행 환경: Xcode 12 실행 &amp;rarr; Create a new Xcode project &amp;rarr; macOS &amp;rarr; Command Line Tool 선택 &amp;rarr; Product Name, Organization Identifier 입력 후 프로젝트 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/79&quot;&gt;스위프트(Swift) 5 배워보기 - 1. 다양한 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/80&quot;&gt;&lt;span&gt;스위프트(Swift)&amp;nbsp;5&amp;nbsp;배워보기&amp;nbsp;-&amp;nbsp;2.&amp;nbsp;함수,&amp;nbsp;제어문,&amp;nbsp;옵셔널&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/81&quot;&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;스위프트(Swift) 5 배워보기 - 4. 클로저&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/84&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 5. 프로퍼티&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/85&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(계속)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&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-image: url('https://t1.daumcdn.net/keditor/dist/0.7.8/image/divider-line.svg'); background-size: 200px 420px; width: 200px; height: 19px; padding: 18px 20px 17px; caret-color: #333333; color: #333333; font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; background-position: center -362px; background-repeat: no-repeat no-repeat;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&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;클로저(Closure)는 코드 블록이다.&lt;/li&gt;
&lt;li&gt;일급 객체로 전달인자, 변수, 상수 등에 값 저장 및 전달이 가능하다.&lt;/li&gt;
&lt;li&gt;어떤 상수나 변수의 참조를 캡처해 저장할 수 있다. -&amp;gt; 값 캡처(Capturing Values)&lt;/li&gt;
&lt;li&gt;주로 함수의 전달 인자로 많이 사용된다.&lt;/li&gt;
&lt;li&gt;함수는 이름이 있는 클로저이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 전역 함수(global functions): 이름이 있고 어떤 값도 캡처하지 않는 클로저&lt;br /&gt;2.&amp;nbsp;중첩 함수(nested function): 이름이 있고 관련한 함수로부터 값을 캡처할 수 있는 클로저&lt;br /&gt;3.&amp;nbsp;클로저 표현: 경량화된 문법으로 쓰이고 관련된 문맥(context)으로부터 값을 캡처할 수 있는 이름이 없는 클로저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클로저 문법&lt;/h3&gt;
&lt;pre id=&quot;code_1623066198169&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{ (인자 값 목록) -&amp;gt; 반환타입 in
	실행코드
}

// 함수와 클로저의 차이
// - 함수를 사용할 경우
func sumFunction(a: Int, b: Int) -&amp;gt; Int {
	return a + b
}

var sumResult: Int = sumFunction(a: 1, b: 2)
print(sumResult) // 3


// - 클로저를 사용할 경우
var sum: (Int, Int) -&amp;gt; Int = { (a: Int, b: Int) in
	return a + b
}

sumResult = sum(1, 2)
print(sumResult) // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클로저 표현(Expressions)&lt;/h3&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;i&gt;&lt;b&gt;sorted(by:)&lt;/b&gt;&lt;/i&gt; 라이브러리를 사용하는 경우이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623067641966&quot; class=&quot;swift&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background-color: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 예를 들어, Swift의 표준 라이브러리에는 sorted(by:) 라는
// 알려진 타입의 배열 값을 정렬하는 메소드를 제공한다.
// 이때 by에 어떤 방법으로 정렬을 수행할지를 기술한 클로저를 넣으면,
// 그 방법대로 정렬된 배열을 얻을 수 있다.

// String 타입의 names 배열을 생성
let names = [&quot;Chris&quot;, &quot;Alex&quot;, &quot;Ewa&quot;, &quot;Barry&quot;, &quot;Daniella&quot;]

// names의 아이템은 String 타입이므로
// String 인자와 Bool 반환 타입을 갖는 클로저를 사용해야 한다.
// (String, String) -&amp;gt; Bool

// 이름을 역순으로 정렬하고 싶을 경우
// 인자로 전달받은 첫 이름이 다음 이름보다 크면 True, 아니면 False를 반환하는
// 함수를 하나 만든다. &amp;lt;-- 클로저를 제공하는 일반적인 방법이 함수이다.
func backward(_ s1: String, _ s2: String) -&amp;gt; Bool {
	return s1 &amp;gt; s2
}

// 이제 생성한 backward 함수(클로저)를 by에 넣는다.
var reversedNames = names.sorted(by: backward)

// [&quot;Ewa&quot;, &quot;Daniella&quot;, &quot;Chris&quot;, &quot;Barry&quot;, &quot;Alex&quot;]
// 역순으로 정렬된 배열을 얻을 수 있다.&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623068168167&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 인라인 클로저
// 함수로 따로 정의된 형태가 아니라 인자로 바로 들어가 있는 형태
reversedNames = names.sorted(by: { (s1: String, s2: String) -&amp;gt; Bool in
  return s1 &amp;gt; s2
})

// 아래처럼 한줄로 적을수도 있다.
reversedNames = names.sorted(by: { (s1: String, s2: String) -&amp;gt; Bool in return s1 &amp;gt; s2 } )


// 2. 타입추론
// names 배열이 String 배열이기 때문에,
// sorted(by:) 메소드에서 이미 (String, String) -&amp;gt; Bool 타입의
// 인자가 들어와야 하는지 컴파일러가 알고 있다. 따라서 생략가능
reversedNames = names.sorted(by: { s1, s2 in return s1 &amp;gt; s2 } )


// 3. 단일 표현 클로저에서의 암시적 반환
// 단일 표현 클로저에서는 return 을 생략할 수 있다.
reversedNames = names.sorted(by: { s1, s2 in s1 &amp;gt; s2 } )


// 4. 인자 이름 축약
// Swift에서는 인라인 클로저에 자동으로 축약 인자 이름(순서에 따라 $0, $1 ... )을 제공한다.
// 3번의 코드를 아래처럼 축약할 수 있다.
reversedNames = names.sorted(by: { $0 &amp;gt; $1 } )


// 5. 연산자 메소드
// Swift에서는 String 타입 연산자에는 String 끼지 비교할 수 있는 비교 연산자(&amp;gt;)를 구현해 두었다.
// 따라서 아래처럼 비교연산자만 적을 수도 있다.
reversedNames = names.sorted(by: &amp;gt;)


// 6. 후위 클로저
// 만약 함수의 마지막 인자로 클로저를 넣는다면 후위 클로저를 사용할 수 있다.
// 함수를 대괄호로 묶어서 그 안에 처리할 내용을 적으면 된다.
reversedNames = names.sorted() { $0 &amp;gt; $1 }

// 여기서 마지막 인자가 클로저고, 후위 클로저를 사용하면 괄호()도 생략할 수 있다.
reversedNames = names.sorted { $0 &amp;gt; $1 }
&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;li&gt;다양한 방식으로 축약하려 클로저를 표현할 수 있지만, 가독성을 고려하여 적당한 선에서 축약하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;값 캡처(Capturing Values)&lt;/h3&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;Swift에서 값을 캡처하는 가장 단순한 형태가 &lt;b&gt;중첩 함수(nested function)&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1623068680474&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// makeIncrementer 함수 선언
// (forIncrement amount: Int)를 인자로 받고
// () -&amp;gt; Int를 반환한다. &amp;lt;- Int형 클로저 반환
func makeIncrementer(forIncrement amount: Int) -&amp;gt; () -&amp;gt; Int {
    var runningTotal = 0
    
    // makeIncrementer 함수 안에 incrementer 함수가 중첩되어 있다.
    func incrementer() -&amp;gt; Int {
    	// incrementer 함수 안에 선언된 runningTotal, amount가 없지만
        // 클로저 내부의 runningTotal과 인자로 받은 amount가 캡쳐링되었기 때문에 사용가능하다.
        runningTotal += amount
        return runningTotal
    }
    
    return incrementer
}

// 값을 10씩 증가하는 중첩함수를 실행해보면 10을 반환한다.
let incrementByTen = makeIncrementer(forIncrement: 10)

print(incrementByTen()) // 10

// 한 번 더 함수를 실행해보면 20을 반환한다.
print(incrementByTen()) // 20

// 여기서 보면 함수는 개별적으로 실행되었지만,
// runningTotal, amount 변수를 캡쳐링되어 공유하기 때문에
// 결과값이 누적되어 나온다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>SWIFT</category>
      <category>스위프트</category>
      <category>클로저</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/83</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-4-%ED%81%B4%EB%A1%9C%EC%A0%80#entry83comment</comments>
      <pubDate>Mon, 7 Jun 2021 21:37:22 +0900</pubDate>
    </item>
    <item>
      <title>[언리얼4] C++ 컴파일이 느린 경우 해결 방법 중 1개</title>
      <link>https://nyebo.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC4-C-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EB%8A%90%EB%A6%B0-%EA%B2%BD%EC%9A%B0-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%EC%A4%91-1%EA%B0%9C</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;엔진버전: Unreal Engine 4.26.2&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C++ 컴파일 시 평소보다 컴파일 속도가 느려졌다고 생각될 경우 아래 방법을 한번 사용해 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;401&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drdUha/btq6nbiuePw/jb50JPhx6KGndeJOj8Uhg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drdUha/btq6nbiuePw/jb50JPhx6KGndeJOj8Uhg1/img.png&quot; data-alt=&quot;일부 코드만 변경 후 컴파일 시 23.4초가 걸렸다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drdUha/btq6nbiuePw/jb50JPhx6KGndeJOj8Uhg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrdUha%2Fbtq6nbiuePw%2Fjb50JPhx6KGndeJOj8Uhg1%2Fimg.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;401&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;figcaption&gt;일부 코드만 변경 후 컴파일 시 23.4초가 걸렸다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. '파일' -&amp;gt; 'Visual Studo Code 열기' 또는 사용중인 IDE로 열기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. UE4/Engine/Binaries 폴더에서 사용중인 빌드환경에 따라 &lt;b&gt;Win64,&lt;/b&gt;&amp;nbsp;&lt;b&gt;Mac 또는 다른 폴더&lt;/b&gt;를&amp;nbsp;선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;220&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzE6k/btq6qR3XNMw/gDmZMAURfLbmpsLXQBozB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzE6k/btq6qR3XNMw/gDmZMAURfLbmpsLXQBozB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzE6k/btq6qR3XNMw/gDmZMAURfLbmpsLXQBozB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzE6k%2Fbtq6qR3XNMw%2FgDmZMAURfLbmpsLXQBozB1%2Fimg.png&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;220&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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 data-ke-size=&quot;size16&quot;&gt;3. 폴더를 선택하면 하위에 수많은 파일이 있는데 그 중에 &lt;b&gt;UnrealHeaderTool.target&lt;/b&gt; 파일을 찾아서 연다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다른 내용은 건들지 않고, 2번째 줄 &quot;UnrealHeaderTool&quot;, 뒤에 스페이스바를 눌러 &lt;b&gt;빈 칸을 추가&lt;/b&gt;한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; (내용 변경 없이 줄 맨 뒤에 빈 칸만 추가)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;223&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdG0uQ/btq6lmEDA3a/XkMQKLkwR6UMrpfuHb4LMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdG0uQ/btq6lmEDA3a/XkMQKLkwR6UMrpfuHb4LMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdG0uQ/btq6lmEDA3a/XkMQKLkwR6UMrpfuHb4LMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdG0uQ%2Fbtq6lmEDA3a%2FXkMQKLkwR6UMrpfuHb4LMk%2Fimg.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;223&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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 data-ke-size=&quot;size16&quot;&gt;5. 저장 후 다시 컴파일 해보면, 속도가 빨라진 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;424&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R5Fhn/btq6llTfSep/sODoEWLd3A1cWdHQCKLdxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R5Fhn/btq6llTfSep/sODoEWLd3A1cWdHQCKLdxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R5Fhn/btq6llTfSep/sODoEWLd3A1cWdHQCKLdxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR5Fhn%2Fbtq6llTfSep%2FsODoEWLd3A1cWdHQCKLdxK%2Fimg.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;424&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>언리얼4</category>
      <category>컴파일</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/82</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC4-C-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EB%8A%90%EB%A6%B0-%EA%B2%BD%EC%9A%B0-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%EC%A4%91-1%EA%B0%9C#entry82comment</comments>
      <pubDate>Wed, 2 Jun 2021 19:48:16 +0900</pubDate>
    </item>
    <item>
      <title>스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형</title>
      <link>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-3-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B5%AC%EC%A1%B0%EC%B2%B4-%EC%97%B4%EA%B1%B0%ED%98%95</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/boostcamp_ios&quot;&gt;iOS 프로그래밍을 위한 스위프트 기초(edwith)&lt;/a&gt;&lt;br /&gt;참고 문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide&quot;&gt;The Swift Language Guide (한국어)&lt;/a&gt;&lt;br /&gt;실행 환경: Xcode 12 실행 &amp;rarr; Create a new Xcode project &amp;rarr; macOS &amp;rarr; Command Line Tool 선택 &amp;rarr; Product Name, Organization Identifier 입력 후 프로젝트 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/79&quot;&gt;스위프트(Swift) 5 배워보기 - 1. 다양한 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/80&quot;&gt;&lt;span&gt;스위프트(Swift)&amp;nbsp;5&amp;nbsp;배워보기&amp;nbsp;-&amp;nbsp;2.&amp;nbsp;함수,&amp;nbsp;제어문,&amp;nbsp;옵셔널&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/83&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 4. 클로저&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/84&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 5. 프로퍼티&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/85&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(계속)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&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;클래스와 구조체는 객체 지향 프로그램(OOP)을 위한 필요한 요소들이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드를 한 묶음&lt;/b&gt;(클래스/구조체)으로 만들어 다양하게 활용할 수 있다.&lt;/li&gt;
&lt;li&gt;여기서는 클래스와 구조체의 기본 문법과 비교점만 다룬다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스와 구조체의 비교&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;아래에 언급되는 다양한 정보는 추후 자세히 다룰 예정&lt;/blockquote&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;하기 위한 &lt;b&gt;프로퍼티(Properties)&lt;/b&gt;를 정의할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능을 제공&lt;/b&gt;하기 위한 &lt;b&gt;메소드(Methods)&lt;/b&gt;를 정의할 수 있음&lt;/li&gt;
&lt;li&gt;초기 상태를 설정할 수 있는 &lt;b&gt;이니셜라이저(Initializer)&lt;/b&gt;를 정의할 수 있음&lt;/li&gt;
&lt;li&gt;기본 구현상태에서 기능 확장할 수 있음&lt;/li&gt;
&lt;li&gt;특정한 종류의 표준 기능을 제공하기 위한 &lt;b&gt;프로토콜(Protocols)&lt;/b&gt;을 따름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클래스에서만 가능한 기능&lt;/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;상속(Inheritance)&lt;/b&gt;: 클래스의 여러 속성을 다른 클래스에서 사용할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타입 캐스팅(Type casting)&lt;/b&gt;: 런타임 시점에 클래스 인스턴스의 타입을 확인함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;소멸자(Deinitializers):&lt;/b&gt; 할당된 자원을 해제시킴&lt;/li&gt;
&lt;li&gt;&lt;b&gt;참조 카운트(Reference counting):&lt;/b&gt; 클래스 인스턴스에 하나 이상의 참조가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 형태&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스는 &lt;b&gt;class&lt;/b&gt; 키워드를 사용&lt;/li&gt;
&lt;li&gt;구조체는 &lt;b&gt;struct&lt;/b&gt; 키워드를 사용&lt;/li&gt;
&lt;li&gt;변수/상수를 선언할 때와는 다르게 클래스/구조체 선언 시에는 &lt;b&gt;대문자로 시작(UpperCamelCase)&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602161656669&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구조체 선언
struct Resolution {
    // 프로퍼티 선언
    var width = 0  // 타입을 지정하지 않았지만 초기 값으로 0을 할당 했기 때문에,
    var height = 0  // 타입추론에 의해 자동으로 Int 타입을 가지게 됨
}

// 클래스 선언
class VideoMode {
    // 프로터피 선언
    var resolution = Resolution() // 구조체를 값으로 사용할 수 있다.
    var interlaced = false
    var frameRate = 0.0
    var name: String? // 옵셔널
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인스턴스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스와 구조체를 선언 후, 이를 사용하기 위해서는 &lt;b&gt;인스턴스&lt;/b&gt;를 생성해야 한다.&lt;/li&gt;
&lt;li&gt;클래스와 구조체 이름 뒤에 빈 괄호()를 붙이면 인스턴스가 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602161990547&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구조체 인스턴스 생성
let someResolution = Resolution()

// 클래스 인스턴스 생성
let someVideoMode = VideoMode()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로퍼티 접근&lt;/h3&gt;
&lt;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;/ul&gt;
&lt;pre id=&quot;code_1602162298729&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 클랙스/구조체 인스턴스에 점(.)을 붙여 안에 있는 프로퍼티에 접근할 수 있다.

// Resolution 구조체의 width 프로퍼티에 접근
print(&quot;someResolution의 가로 길이는 \(someResolution.width)이다.&quot;)
// someResolution의 가로 길이는 0이다. 가 출력

// VideoMode 클래스 안에 값으로 사용된 Resolution 구조체 안의 프로퍼티에 접근
print(&quot;someVideoMode의 가로 길이는 \(someVideoMode.resolution.width)이다.&quot;)
// someVideoMode의 가로 길이는 0이다. 가 출력

// 값을 할당 할 때에는 프로퍼티에 접근 후 원하는 값을 할당하면 된다.
someVideoMode.resolution.width = 1280
print(&quot;someVideoMode의 현재 가로 길이는 \(someVideoMode.resolution.width)이다.&quot;)
// someVideoMode의 현재 가로 길이는 1280이다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스와 구조체의 타입&lt;/h3&gt;
&lt;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;값(value) 타입&lt;/b&gt;이다. 이는 함수에서 상수나 변수로 값이 전달될 때 값 그대로 &lt;b&gt;복사&lt;/b&gt;된다는 뜻이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602210355612&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Resolution 구조체의 인스턴스(hd) 생성
let hd = Resolution(width: 1920, height: 1080)

// 생성된 인스턴스 hd를 변수 cinema에 할당
var cinema = hd

// cinema의 width 프로퍼티 값 변경
cinema.width = 2048

// hd와 cinema의 width 프로퍼티 확인
print(&quot;cinema의 현재 가로 길이 \(cinema.width)&quot;)
print(&quot;hd의 가로 길이 \(hd.width)&quot;)

// cinema의 현재 가로 길이 2048
// hd의 가로 길이 1920

// 서로의 값이 다른 것을 확인할 수 있다.
// hd가 cinema에 할당되는 순간 복사되었기 때문에,
// cinema와 hd는 서로 다른 인스턴스가 된다.&lt;/code&gt;&lt;/pre&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;b&gt;참조(Reference) 타입&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;b&gt;true&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;!== : 두 상수나 변수가 &lt;b&gt;다른 인스턴스를 참조&lt;/b&gt;하고 있는 경우에 &lt;b&gt;true&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602211257149&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// VideoMode 클래스의 tenEighty 인스턴스 생성 후 각 프로퍼티에 값 할당
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = &quot;1080i&quot;
tenEighty.frameRate = 25.0

// anotherTenEighty 상수를 하나 만들고, tenEighty 인스턴스를 할당
// anotherTenEighty의 frameRate 프로퍼티의 값을 변경
let anotherTenEighty = tenEighty
anotherTenEighty.frameRate = 30.0

// tenEighty 인스턴스와 anotherTenEighty 인스턴스의 frameRate 프로퍼티 값 확인
print(&quot;tenEighty의 frameRate 값은 \(tenEighty.frameRate)&quot;)
print(&quot;anotherTenEighty의 frameRate 값은 \(anotherTenEighty.frameRate)&quot;)
// tenEighty의 frameRate 값은 30.0
// anotherTenEighty의 frameRate 값은 30.0

// 여기서 보면, 처음에 tenEighty.frameRate에서 할당한 25.0이 아니라
// anotherTenEighty.frameRate에서 할당한 30.0으로 값이 출력되는 것을 볼 수 있다.
// 이는 anotherTenEighty 상수가 tenEighty의 값을 복사한 것이 아니라,
// 바라보고 있는 tenEighty의 값을 변경했기 때문이다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그래서, 언제 클래스를 사용하고 언제 구조체를 사용해야 하나?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 아래 조건 중 1개 이상을 만족하면 구조체를 사용하는 것을 고려해볼 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단한 값을 캡슐화(encapsulate)하기 위한 경우&lt;/li&gt;
&lt;li&gt;인스턴스 또는 프로퍼티가 참조되기 보다 그대로 복사되기를 원하는 경우&lt;/li&gt;
&lt;li&gt;프로퍼티나 메소드 등을 상속할 필요가 없는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 경우를 제외하고는 클래스를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&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-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;여러 값&lt;/b&gt;을 &lt;b&gt;한 곳에 모아서 정의&lt;/b&gt;한 것(예, 요일, 계절 등)이다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스위프트의 열거형은 C나 Objective-C와 다르게 Integer뿐만 아니라 &lt;/span&gt;&lt;b&gt;string, character, floating 값들을 사용할 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;클래스/구조체와 마찬가지로 선언 시에는&amp;nbsp;&lt;b&gt;대문자로 시작(UpperCamelCase)&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단, enum 내의 각 case는 &lt;b&gt;소문자로 시작(LowerCamelCase)&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 형태&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1602213004713&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum CompassPoint {
    case north  // &amp;ne; 0  스위프트는 타 언어와 다르게 내부적으로 정수값을 가지지 않는다.
    case south  // &amp;ne; 1
    case east   // &amp;ne; 2
    case west   // &amp;ne; 3
}


// 여러 case를 콤마(,)로 한줄로 적을 수도 있다.
enum Planet {
    case mercury, venus, earth
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;열거형의 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 열거형의 값을 Switch 문에서 매칭할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602213472391&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 열거형의 값을 새로운 타입으로 할당할 수 있다.
// CompassPoint의 west를 directionToHead 변수에 할당
var directionToHead = CompassPoint.west

// directionToHead에 CompassPoint 타입으로 한번 정의되고 나면,
// 다음에 다른 값을 할당 할 때는 CompassPoint를 생략할 수 있다.
directionToHead = .south

// Switch 구문으로 열거형 값 매칭
// 열거형의 모든 case를 포함해야 한다. 이 경우 default를 생략할 수 있다.
// 만약 모든 case를 포함하지 않는다면, default를 적어 빠진 case가 없도록 해야 한다.
switch directionToHead {
case .north:
    print(&quot;북쪽입니다.&quot;)
case .south:
    print(&quot;남쪽입니다.&quot;)
case .east:
    print(&quot;동쪽입니다.&quot;)
case .west:
    print(&quot;서쪽입니다.&quot;)
}  
// 남쪽입니다. 가 출력된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Raw 값&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앞서, 스위프트의 열거형은 각각의 case에 정수 값을 할당하지 않는다고 했다.&lt;/li&gt;
&lt;li&gt;그러나 &lt;b&gt;Raw 값 지정&lt;/b&gt;을 통해&amp;nbsp;각 case에 &lt;b&gt;Integer를 비롯하여 String, Character 등의 값을 할당&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;Integer&lt;/b&gt; 값을 지정한 경우 은 C 언어의 enum과 마찬가지로 &lt;b&gt;자동으로 1씩 증가&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602213960454&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 열거형의 case에 Character 형을 정의한 경우
// 단, Raw 값은 중복되면 안된다.
enum ASCIIControlCharacter: Character {
    case tab = &quot;\t&quot;
    case lineFeed = &quot;\n&quot;
    case carriageReturn = &quot;\r&quot;
}

// Integer 값을 정의한 경우

enum Planet: Int {
    case mercury = 1 // mercury에만 명시적으로 1을 할당함.
    case venus
    case earth
}
// 위에서 보면 venus와 earth에는 명시적으로 값을 할당하지 않았지만,
// 자동으로 mercury에서 값이 증가된 2와 3이 할당된다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Raw 값을 통한 초기화&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;rawValue&lt;/b&gt;를 통해 열거형 변수를 초기화할 수 있다.&lt;/li&gt;
&lt;li&gt;Raw 값을 통한 초기화는, 열거형에 지정된 Raw 값이 없을 경우 초기화에 실패하여 &lt;b&gt;nil&lt;/b&gt;이 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 raw값에 대해 열거형 case 반환이 보장되지 않으므로 &lt;b&gt;실패할 수 있는 초기자(failable initializer)&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;rawValue를 통해 초기화한 인스턴스는 &lt;b&gt;옵셔널 타입&lt;/b&gt;을 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602214218534&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 예를 들어 아래와 같이 열거형을 생성했다고 가정한다.
enum Planet: Int {
    case mercury = 0
    case venus = 1
    case earth = 2
}

// 값이 존재하는 earth를 열거형 변수의 초기 값으로 지정하면
// 정상적으로 초기 값이 지정된다.
let possiblePlanet = Planet(rawValue: 2)
print(possiblePlanet)
// Optional(test.Planet.earth) 이 출력됨.

// 만약, 존재하지 않는 값(rawValue: 3)을 초기 값으로 지정하면
let possiblePlanet = Planet(rawValue: 3)
print(possiblePlanet)
// nil 이 출력 됨.


// 따라서 옵셔널 변수 처리할 때와 같이
// if let 문을 사용해서 처리하면 된다.
if let somePlanet = Planet(rawValue: 3) {
    switch somePlanet {
    case .earth:
        print(&quot;지구입니다.&quot;)
    default:
        print(&quot;지구가 아닙니다.&quot;)
    }
} else {
    print(&quot;해당 위치의 행성이 존재하지 않습니다.&quot;)
}
// 해당 위치의 행성이 존재하지 않습니다. 이 출력 됨.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>SWIFT</category>
      <category>구조체</category>
      <category>스위프트</category>
      <category>열거형</category>
      <category>클래스</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/81</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-3-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B5%AC%EC%A1%B0%EC%B2%B4-%EC%97%B4%EA%B1%B0%ED%98%95#entry81comment</comments>
      <pubDate>Fri, 9 Oct 2020 12:43:35 +0900</pubDate>
    </item>
    <item>
      <title>스위프트(Swift) 5 배워보기 - 2. 함수, 제어문, 옵셔널</title>
      <link>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-2-%ED%95%A8%EC%88%98-%EC%A0%9C%EC%96%B4%EB%AC%B8-%EC%98%B5%EC%85%94%EB%84%90</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.edwith.org/boostcamp_ios&quot;&gt;iOS 프로그래밍을 위한 스위프트 기초(edwith)&lt;/a&gt;&lt;br /&gt;참고 문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide&quot;&gt;The Swift Language Guide (한국어)&lt;/a&gt;&lt;br /&gt;실행 환경: Xcode 12 실행 &amp;rarr; Create a new Xcode project &amp;rarr; macOS &amp;rarr; Command Line Tool 선택 &amp;rarr; Product Name, Organization Identifier 입력 후 프로젝트 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/79&quot;&gt;스위프트(Swift) 5 배워보기 - 1. 다양한 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;스위프트(Swift)&amp;nbsp;5&amp;nbsp;배워보기&amp;nbsp;-&amp;nbsp;2.&amp;nbsp;함수,&amp;nbsp;제어문,&amp;nbsp;옵셔널&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/81&quot;&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/83&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 4. 클로저&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/84&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 5. 프로퍼티&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/85&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(계속)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수의 기본 형태&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수는 &lt;b&gt;결과 값을 반환&lt;/b&gt;(return)하는 형태와, &lt;b&gt;반환 값이 없는&lt;/b&gt;(Void) 형태로 나뉜다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로는 반환 값이 없는 것이 아니라 &lt;b&gt;Void를 반환&lt;/b&gt;하는 것이다.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Void&lt;/b&gt;는 ()를 사용한 &lt;b&gt;비어있는 튜플&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;함수를 실행할 때 &lt;b&gt;파라미터(인자 값)&lt;/b&gt;를 받을 수도 있고, 안 받을 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601982088182&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 결과 값을 반환하는 형태의 함수

func 함수명(파라미터1: 타입, 파라미터2: 타입 ...) -&amp;gt; 반환타입 {
    return 반환값
}

// 반환하는 값이 없는 형태의 함수
// '-&amp;gt; Void'는 생략 가능

func 함수명(파라미터1: 타입, 파라미터2: 타입 ...) -&amp;gt; Void {
    print(&quot;반환 값이 없습니다.&quot;)
}

// 파라미터가 없는 함수
func 함수명() -&amp;gt; 반환타입 {
	return 반환값
}&lt;/code&gt;&lt;/pre&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;b&gt;파라미터&lt;/b&gt;로 실행(호출)할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601982710631&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// String 타입의 파라미터 1개를 인자로 받고,
// String 타입으로 결과를 반환하는 함수

func greet(person: String) -&amp;gt; String {
    return &quot;Hello, &quot; + person + &quot;!&quot;
}

// '함수명(파라미터)' 로 함수 실행
// 출력 함수(print)가 반환 값에 없기 때문에, print 함수를 사용하여 결과 값 출력
print(greet(person: &quot;nyebo&quot;)) // &quot;Hello, nyebo!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수의 다른 형태&lt;/h3&gt;
&lt;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;할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;기본 값을 설정하면 함수를 호출할 때, 별도로 파라미터를 적지 않아도 자동으로 기본 값이 호출된다.&lt;/li&gt;
&lt;li&gt;대체로 기본 값을 설정한 파라미터는, 파라미터 목록&amp;nbsp;&lt;b&gt;맨 뒤에 위치&lt;/b&gt;하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601983496418&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// parameter2 에 기본 값(10)을 설정한 함수 생성
func someFunc(parameter1: Int, parameter2: Int = 10) {
    print(&quot;parameter1: \(parameter1), parameter2: \(parameter2)&quot;)
}

// parameter1, parameter2 둘 다 값 지정 후 함수 호출
someFunc(parameter1: 5, parameter2: 20)
// parameter1: 5, parameter2: 20
// parameter2의 값이 기본 값으로 지정한 10이 아닌,
// 함수 호출 시 지정한 20으로 출력 됨.

// parameter1 만 값 지정 후 함수 호출
someFunc(parameter1: 7)
// parameter1: 7, parameter2: 10
// 이번에는 parameter2에 별도로 값을 지정하지 않아
// 기본 값인 10이 출력 됨.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파라미터 라벨 지정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파라미터 앞에 별도의 이름을 지정하여,&amp;nbsp;&lt;b&gt;함수 내부에서 사용할 이름&lt;/b&gt;과 &lt;b&gt;함수 호출 시 사용하는 이름&lt;/b&gt;을 다르게 할 수 있다.&lt;/li&gt;
&lt;li&gt;파라미터의 역할을 좀 더 명확하게 표현할 때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601983925547&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 함수 내부에서는 friend, me 함수를 사용하고,
func greeting(to friend: String, from me: String) {
	print(&quot;Hello \(friend)! I'm \(me)&quot;)
}

// 함수 호출 시에는 파라미터 라벨인 to, from을 사용해야 한다.
greeting(to: &quot;jaehyuk&quot;, from: &quot;nyebo&quot;)
// Hello jaehyuk! I'm nyebo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;함수 호출 시 파라미터 생략&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;pre id=&quot;code_1601984837326&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 파라미터 앞에 _를 붙이면, 함수 호출 시 해당 파라미터명을 생략할 수 있다.
func greeting(_ friend: String, me: String) {
	print(&quot;Hello \(friend)! I'm \(me)&quot;)
}

// _ 를 붙인 friend 파라미터는 생략하고 값을 입력할 수 있다.
greeting(&quot;jaehyuk&quot;, me: &quot;nyebo&quot;)
// Hello jaehyuk! I'm nyebo


// 만약 파라미터를 전부 생략하면,
// 함수 호출 시에는 파라미터 순서대로 값을 입력해야 한다.
func greeting(_ friend: String, _ me: String) {
	print(&quot;friend: \(friend), me: \(me)&quot;)
}

greeting(&quot;jaehyuk&quot;, &quot;nyebo&quot;)
// friend: jaehyuk, me: nyebo

// 순서를 바꿔서 호출 하면, 바뀐 순서대로 출력된다.
greeting(&quot;nyebo&quot;, &quot;jaehyuk&quot;)
// friend: nyebo, me: jaehyuk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;가변 파라미터 지정&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;li&gt;기본 파라미터 값과 마찬가지로 파라미터 목록 &lt;b&gt;맨 뒤에 위치&lt;/b&gt;하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601984268632&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 가변 파라미터는 타입에 ...을 붙여서 표현한다.
func sayHello(me: String, friends: String...) {
	print(&quot;Hello \(friends)! I'm \(me)&quot;)
}

sayHello(me: &quot;nyebo&quot;, friends: &quot;jaehyuk&quot;, &quot;minjeong&quot;)
// Hello [&quot;jaehyuk&quot;, &quot;minjeong&quot;]! I'm nyebo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;함수 타입의 사용&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; 수도 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601985282453&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// add 함수 생성
func add(a: Int, b: Int) -&amp;gt; Int {
    return a + b
}

// add 함수를 변수로 정의
// someAdd 변수는 add 함수의 파라미터와 반환 값이 동일하기 때문에
// add 함수가 변수로 할당 될 수 있다.
// 만약 타입이 다르다면, 함수를 변수로 할당 할 수 없다.
var someAdd: (Int, Int) -&amp;gt; Int = add

// someAdd 변수에 파라미터 값 3, 4를 넣으면
// 이 파라미터가 add 함수로 전달되고,
// add 함수의 반환 값이 결과로 출력된다.
print(someAdd(3, 4))
// 7&lt;/code&gt;&lt;/pre&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;br /&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide/language-guide/06-functions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Swift Language Guide (한국어)의 함수 편 참고.&lt;/a&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1601985458741&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;함수 (Functions)&quot; data-og-description=&quot; &quot; data-og-host=&quot;jusung.gitbook.io&quot; data-og-source-url=&quot;https://jusung.gitbook.io/the-swift-language-guide/language-guide/06-functions&quot; data-og-url=&quot;https://jusung.gitbook.io/the-swift-language-guide/language-guide/06-functions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkrm4W/hyHMjWbU0P/6e833ln2SLb8iq6hv69Hg0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide/language-guide/06-functions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jusung.gitbook.io/the-swift-language-guide/language-guide/06-functions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkrm4W/hyHMjWbU0P/6e833ln2SLb8iq6hv69Hg0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;함수 (Functions)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jusung.gitbook.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제어문&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트의 조건문에는 &lt;b&gt;if-else, switch&lt;/b&gt; 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. if-else 문&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;if만 단독으로 사용하거나, else, else if와 조합하여 사용할 수도 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조건&lt;/b&gt;에는 항상 &lt;b&gt;true, false&lt;/b&gt;가 되는 &lt;b&gt;bool 타입의 값&lt;/b&gt;만 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601985847536&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기본 형태
if (조건) {
  /* 실행 */
} else if {
  /* 실행 */
} else {
  /* 실행 */
}


// 사용 예
let someInt = 100

if (someInt &amp;lt; 100) {
	print(&quot;100 미만&quot;)
} else if (someInt &amp;gt; 100) {
	print(&quot;100 초과&quot;)
} else {
	print(&quot;100&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. switch 문&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스위프트의 switch 문은 다양한 패턴과 응용이 가능하다.&lt;/li&gt;
&lt;li&gt;명시적으로 break를 입력하지 않아도 &lt;b&gt;자동&lt;/b&gt;으로 case마다 &lt;b&gt;break&lt;/b&gt; 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;fallthrough&lt;/b&gt;를 사용하여 break를 &lt;b&gt;무시하고 진행&lt;/b&gt;할 수 있다.&lt;/li&gt;
&lt;li&gt;case에 &lt;b&gt;여러 패턴&lt;/b&gt;을 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601986233153&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기본 형태
switch 비교값 {
case 패턴1:
	/* 실행 */
case 패턴2:
	/* 실행 */
default:
	/* 실행 */
}

// 사용 예
let someInt = 100
switch someInt {
case 0:
    print(&quot;zero&quot;)
case 1..&amp;lt;100:  // 인터벌 매칭, 숫자의 특정 범위를 조건으로 사용할 수 있다.
    print(&quot;1~99&quot;)
case 100:
    print(&quot;100&quot;)
case 101...Int.max:
    print(&quot;over 100&quot;)
default:
    print(&quot;unknown&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스위프트의 반복문에는&lt;span&gt;&lt;b&gt;&amp;nbsp;for-in, while, repeat-while&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;등이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. for-in 문&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열, 숫자, 문자열을 순서대로 순회(iterate)할 수 있다.&lt;/li&gt;
&lt;li&gt;딕셔너리를 순회할 때에는 key: value 쌍으로 구성된 튜플을 순회한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601986476948&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기본 형태
let items = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]
for item in items {
	print(item)
}
// a
// b
// c
// d

// 딕셔너리 순회
let numberOfLegs = [&quot;거미&quot;: 8, &quot;개미&quot;: 6, &quot;고양이&quot;: 4]
for (animalName, legCount) in numberOfLegs {
    print(&quot;\(animalName)는 다리가 \(legCount)개 입니다.&quot;)
}
// 거미는 다리가 8개 입니다.
// 고양이는 다리가 4개 입니다.
// 개미는 다리가 6개 입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. while 문&lt;/span&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;/ul&gt;
&lt;pre id=&quot;code_1601986751089&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기본 형태
while 조건 {
	/* 실행 */
}

// 사용 예

var count = 0
while count &amp;lt; 5 {
    count += 1
    print(count)
}

// 1
// 2
// 3
// 4
// 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. repeat-while 문&lt;/span&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;span style=&quot;color: #333333;&quot;&gt;구문을 &lt;b&gt;최소 한 번 이상 실행&lt;/b&gt;하고, 조건이 &lt;b&gt;거짓&lt;/b&gt;이 될 때까지 &lt;b&gt;반복&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 언어의 &lt;b&gt;do-while 문&lt;/b&gt;과 유사&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601986956410&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기본 형태
repeat {
	/* 실행 */
} while 조건

// 사용 예
var count = 1
repeat {
    print(&quot;반복문을 \(count)번 실행합니다. &quot;)
    count += 1
} while count &amp;lt; 0
// 반복문을 1번 실행합니다. &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;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;옵셔널(Optional)&lt;/b&gt;은, 사용자가 &lt;b&gt;의도하지 않는 상황을 최소화&lt;/b&gt;하여 &lt;b&gt;안전한 코딩&lt;/b&gt;을 하기 위해 사용한다.&lt;/li&gt;
&lt;li&gt;예를 들어, 일반적인 Int 변수를 선언한 경우, 이 변수에 &lt;b&gt;값이 없다면(nil이 할당 된다면)&lt;/b&gt;&amp;nbsp;에러가 발생한다.&lt;/li&gt;
&lt;li&gt;반면, 옵셔널 Int 변수를 선언한 경우, &lt;b&gt;nil이 할당될 수 있기 때문에&lt;/b&gt; 에러가 발생하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 경우, nil이 들어온 경우를 조건문으로 제어할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1601988179104&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. Int 변수에 nil이 들어간 경우
var value: Int = nil
// 변수 할당 오류 발생
// 'nil' cannot initialize specified type 'Int'


// 2. 옵셔널 Int 변수에 값이 있는 경우
var value: Int? = 100

switch value {
case .none:
    print(&quot;This Optional variable is nil&quot;)
case .some(let value):
    print(&quot;Value is \(value)&quot;)
}

// 해당 값이 출력 됨
// Value is 100


// 3. 옵셔널 Int 변수에 값이 없는 경우
var value: Int? = nil

switch value {
case .none:
    print(&quot;This Optional variable is nil&quot;)
case .some(let value):
    print(&quot;Value is \(value)&quot;)
}

// 값이 없는 경우를 제어할 수 있다.
// This Optional variable is nil&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;옵셔널 추출&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵셔널의 값을 사용하기 위해 꺼내오는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵셔널 바인딩&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nil 체크 + 안전한 값 추출&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;값이 없으면 오류 발생 없이, 실행만 되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;if-let 방식&lt;/b&gt;으로 값 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602138676774&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myName: String? = &quot;nyebo&quot;
var yourName: String? = nil

// 콤마(,)를 사용해 한 번에 여러 옵셔널을 바인딩할 수 있다.
if let name = myName, let friend = yourName {
	print(&quot;\(name) and \(friend)&quot;)
}
// yourNmae이 nil이기 때문에 해당 구문은 실행되지 않는다.
// 오류 발생 없음.


// yourName에 값 할당
yourName = &quot;jaehyuk&quot;

// 다시 실행해보면 정상적으로 값 출력 됨.
if let name = myName, let friend = yourName {
	print(&quot;\(name) and \(friend)&quot;)
}
// nyebo and jaehyuk
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵셔널 강제 추출&lt;/h4&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;강제 추출 시에는 값이 없으면(nil) 런타입 오류가 발생한다.&lt;/li&gt;
&lt;li&gt;강제 추출은 가능한 사용하지 않는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1602138960834&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myName: String? = &quot;nyebo&quot;

// 느낌표(!)로 강제 추출 할 수 있다.
// 현재는 myName에 값이 있어서 정상적으로 출력 됨.
print(myName!)
// nyebo

// myName에 nil을 할당하면,
myName = nil

// 런타임 오류 발생
print(myName!)
// Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT</category>
      <category>SWIFT</category>
      <category>스위프트</category>
      <category>옵셔널</category>
      <category>제어문</category>
      <category>함수</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/80</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-2-%ED%95%A8%EC%88%98-%EC%A0%9C%EC%96%B4%EB%AC%B8-%EC%98%B5%EC%85%94%EB%84%90#entry80comment</comments>
      <pubDate>Tue, 6 Oct 2020 21:46:28 +0900</pubDate>
    </item>
    <item>
      <title>스위프트(Swift) 5 배워보기 - 1. 다양한 타입</title>
      <link>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-1-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%83%80%EC%9E%85</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트: &lt;a href=&quot;https://www.edwith.org/boostcamp_ios&quot;&gt;iOS 프로그래밍을 위한 스위프트 기초(edwith)&lt;/a&gt;&lt;br /&gt;참고 문서: &lt;a href=&quot;https://jusung.gitbook.io/the-swift-language-guide&quot;&gt;The Swift Language Guide (한국어)&lt;/a&gt;&lt;br /&gt;실행 환경: Xcode 12 실행 &amp;rarr; Create a new Xcode project &amp;rarr; macOS &amp;rarr; Command Line Tool 선택 &amp;rarr; Product Name, Organization Identifier 입력 후 프로젝트 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;스위프트(Swift) 5 배워보기 - 1. 다양한 타입&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/80&quot;&gt;&lt;span&gt;스위프트(Swift)&amp;nbsp;5&amp;nbsp;배워보기&amp;nbsp;-&amp;nbsp;2.&amp;nbsp;함수,&amp;nbsp;제어문,&amp;nbsp;옵셔널&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/81&quot;&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/83&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 4. 클로저&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/84&quot;&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 5. 프로퍼티&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nyebo.net/85&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(계속)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상수와 변수&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;상수(let)&lt;/b&gt;는 한 번 선언된 후에는 &lt;b&gt;변경이 불가능&lt;/b&gt;하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변수(var)&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;pre class=&quot;cs&quot;&gt;&lt;code&gt;// 상수, 변수 선언법
// 타입은 생략 가능
let 상수명:타입 = 값
let 상수명 = 값

var 변수명:타입 = 값
var 변수명 = 값&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;li&gt;만약 선언과 동시에 값을 할당하는 것이 아닌,&lt;b&gt;선언 후 나중에 값을 할당&lt;/b&gt;하려면, 선언 할 때 반드시&lt;b&gt;타입명을 명시&lt;/b&gt;해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;let sum: Int

let numA: Int = 10
let numB: Int = 20

// 선언 후 값 할당
sum = numA + numB


// 만약 상수에 값을 할당 한 뒤,
// 다시 값을 할당하려고 하면 오류가 발생한다.
let sum: Int = 10

let numA: Int = 10
let numB: Int = 20

sum = numA + numB // Cannot assign to value: 'sum' is a 'let' constant&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;h2 data-ke-size=&quot;size26&quot;&gt;기본 데이터 타입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트의 기본 데이터 타입은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bool&lt;/li&gt;
&lt;li&gt;Int, UInt&lt;/li&gt;
&lt;li&gt;Float, Double&lt;/li&gt;
&lt;li&gt;Character, String&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Bool&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;true&lt;/b&gt;와 &lt;b&gt;false&lt;/b&gt; 값만 가진다.&lt;/li&gt;
&lt;li&gt;스위프트에서는 타 언어와는 다르게&lt;b&gt;true 대신 1&lt;/b&gt;,&lt;b&gt;false 대신 0&lt;/b&gt;을 넣으면 오류가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;zephir&quot;&gt;&lt;code&gt;var bool: Bool = true
bool = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Int, UInt&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;Int&lt;/b&gt;: 정수 타입(64비트 정수형)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UInt&lt;/b&gt;: 양의 정수 타입(64비트 양의 정수형)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;zephir&quot;&gt;&lt;code&gt;var int: Int = 100
// int = 100.1 은 오류 발생

var uint: UInt = 100
// uint = -100 은 오류 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Float, Double&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;Float&lt;/b&gt;: 실수 타입(32비트 부동소수형)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Double&lt;/b&gt;: 실수 타입(64비트 부동소수형)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;var float: Float = 3.14
float = 3 // 정수형 할당도 가능하다.

var double: Double = 3.14
double = 3 // 정수형 할당도 가능하다.

// Double형 변수에 Float형 변수 값을 할당 할 수 없다.
double = float // Cannot assign value of type 'Float' to type 'Double'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Character, String&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;Character&lt;/b&gt;: 문자 타입(유니코드)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;String&lt;/b&gt;: 문자열 타입(유니코드)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;// 문자 할당은 큰따옴표(&quot;)로 한다.
// Character는 한 문자만 할당 가능하다.
var character: Character = &quot; &quot; // 이모지 할당 가능
character = &quot; &quot;
character = &quot;가&quot;


// 문자열 할당도 큰따옴표(&quot;)로 한다.
// 여러 문자를 할당할 때에는 String을 사용한다.
var string: String = &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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Any, AnyObject, nil&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에는 기본 데이터 타입 외에 Any, AnyObject, nil 타입이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Any&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 타입&lt;/b&gt;을 지칭하는 키워드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;var any: Any = 100
any = &quot;모든 타입 할당 가능&quot;

// 단, 아래 코드와 같이 any 변수에 Double형 값을 할당 했어도,
// Double 타입 변수에 할당할 수는 없다.
// 이 경우는 명시적으로 형변환을 해줘야 한다. 
any = 123.12
let double: Double = any  // 오류발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. AnyObject&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 클래스 타입&lt;/b&gt;을 지칭하는 프로토콜&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class SomeClass {}
var anyObject: AnyObject = SomeClass()

// AnyObject는 클래스의 인스턴스만 수용 가능하기 때문에 클래스의 인스턴스가 아니면 할당할 수 없습니다.
anyObject = 123.12    // 컴파일 오류발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. nil&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;'없음'&lt;/b&gt;을 의미하는 키워드&lt;/li&gt;
&lt;li&gt;NULL, Null, null 등과 비슷&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;// any는 Any 타입이고, anyObject는 AnyObject 타입이기 때문에 nil을 할당할 수 없습니다.
var any: Any = 100
var anyObject: AnyObject = SomeClass()

someAny = nil         // 컴파일 오류발생
someAnyObject = nil   // 컴파일 오류발생&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;h2 data-ke-size=&quot;size26&quot;&gt;컬렉션 타입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에는 여러 값들을 묶어서 하나로 표현하는 컬렉션 타입이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;475&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sfikf/btqJ4HKgpZs/lsag5BzZBhEcX0O79gGJR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sfikf/btqJ4HKgpZs/lsag5BzZBhEcX0O79gGJR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sfikf/btqJ4HKgpZs/lsag5BzZBhEcX0O79gGJR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsfikf%2FbtqJ4HKgpZs%2Flsag5BzZBhEcX0O79gGJR0%2Fimg.png&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;475&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 배열(Array)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서(index)가 있는 멤버(value) 리스트 형태의 컬렉션 타입&lt;/li&gt;
&lt;li&gt;변수(var)로 할당하면 Array 변경이 가능하고, 상수(let)로 할당하면 변경 불가능하다.&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;var someInts = [Int]()

// 배열에 3을 추가
someInts.append(3)

// 배열 비우기
someInts = []&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;// [0.0, 0.0, 0.0] 배열 생성
var doubles = Array(repeating: 0.0, count: 3)
                    반복할 값         반복횟수&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;// [2.5, 2.5, 2.5] 배열 생성
var threeDoubles = Array(repeating: 2.5, count: 3)

// [0.0, 0.0] 배열 생성
var twoDoubles = Array(repeating: 0.0, count: 2)

// 배열 합치기
// [2.5, 2.5, 2,5, 0.0, 0.0]
var sixDoubles = threeDoubles + twoDoubles&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;var shoppingList: [String] = [&quot;Eggs&quot;, &quot;Milk&quot;]

// 타입 생략 가능
var shoppingList = [&quot;Eggs&quot;, &quot;Milk&quot;]&lt;/code&gt;&lt;/pre&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;count&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;// count를 사용하여 멤버 수를 셀 수 있다.
var shoppingList = [&quot;Eggs&quot;, &quot;Milk&quot;]

print(&quot;shoppingList의 멤버 수는 총 \(shoppingList.count) 개입니다.&quot;)
// shoppingList의 멤버 수는 총 2 개입니다.

// 위 print 함수의 큰따옴표(&quot;&quot;) 안에 있는 \()는
// 문자열 보간법(String Interpolation) 이라고 한다.
// 프로그램 실행 중 문자열 내에 변수 또는 상수를 넣어 실행할 때 사용한다.&lt;/code&gt;&lt;/pre&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;isEmpty&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;if shoppingList.isEmpty {
    print(&quot;쇼핑 목록이 비었습니다.&quot;)
} else {
    print(&quot;쇼핑 목록이 비어있지 않습니다.&quot;)
}&lt;/code&gt;&lt;/pre&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;append, +=&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;shopingList.append(&quot;Four&quot;)

// 또는 +=로 추가할 수 도 있다.
shoppingList += [&quot;Banking Powder&quot;]&lt;/code&gt;&lt;/pre&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;array[index]&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;// index는 0부터 시작한다.
var firstItem = shoppingList[0]
// firstItem: &quot;Eggs&quot;&lt;/code&gt;&lt;/pre&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; insert, at, remove, removeLast&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;// 0번 위치에 값 추가
shoppingList.insert(&quot;Maple Syrup&quot;, at:0)

// 0번 위치의 값을 제거하고 상수에 값 할당
let mapleSyrup = shoppingList.remove(at: 0)
// mapleSyrup: &quot;Maple Syrup&quot;

// 가장 마지막 멤버 삭제
let apples = shoppingList.removeLast()&lt;/code&gt;&lt;/pre&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;for-in, enumerated()&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// for-in 반복문 사용
// 멤버만 출력된다.

for item in shoppingList {
    print(item)
}

// Eggs
// Milk
// Four
// Baking Powder
// Chocolate Spread
// Cheese


// enumerated() 사용
// 인덱스와 멤버를 같이 출력할 수 있다.
for (index, value) in shoppingList.enumerated() {
    print(&quot;Item \(index + 1): \(value)&quot;)
}

// Item 1: Eggs
// Item 2: Milk
// Item 3: Four
// Item 4: Baking Powder
// Item 5: Chocolate Spread
// Item 6: Cheese
&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 셋(Set)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복되지 않은 멤버가 순서없이 존재하는 컬렉션&lt;/li&gt;
&lt;li&gt;멤버의 타입은 반드시 &lt;b&gt;hashable&lt;/b&gt; 이어야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hashable 타입: &lt;b&gt;String, Int, Double, Bool&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&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;빈 Set 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;// Set은 축약형이 없다.
var letters = Set&amp;lt;Character&amp;gt;()

// 멤버 추가
letters.insert(&quot;a&quot;)

// Set 비우기
letters = []&lt;/code&gt;&lt;/pre&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;배열 문자열을 이용한 Set 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;var musicGenres: Set&amp;lt;String&amp;gt; = [&quot;Rock&quot;, &quot;Classical&quot;, &quot;Pop&quot;]

// 타입 생략 가능
var musicGenres: Set = [&quot;Rock&quot;, &quot;Classical&quot;, &quot;Pop&quot;]&lt;/code&gt;&lt;/pre&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;Set 멤버수 확인: &lt;b&gt;count&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;var musicGenres: Set = [&quot;Rock&quot;, &quot;Classical&quot;, &quot;Hip hop&quot;]

print(&quot;내가 좋아하는 음악 장르의 수는 \(musicGenres.count)개 입니다.&quot;)
// 내가 좋아하는 음악 장르의 수는 3개 입니다.&lt;/code&gt;&lt;/pre&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;Set 비었는지 확인: &lt;b&gt;isEmpty&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;if favoriteGenres.isEmpty {
    print(&quot;좋아하는 음악 장르가 없습니다.&quot;)
} else {
    print(&quot;좋아하는 음악 장르가 있습니다.&quot;)
}&lt;/code&gt;&lt;/pre&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;Set 멤버 추가/삭제:&lt;b&gt; insert, remove&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// 멤버 추가
musicGenres.insert(&quot;Kpop&quot;)

// Set 에서는 +=를 사용하여 멤버를 추가할 수 없다.

// 멤버 삭제
musicGenres.remove(&quot;Rock&quot;)&lt;/code&gt;&lt;/pre&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;Set 멤버 포함 여부 확인: &lt;b&gt;contains&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;print(musicGenres.contains(&quot;Kpop&quot;))
// 포함: true, 미포함: false&lt;/code&gt;&lt;/pre&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;Set 순회: &lt;b&gt;for-in&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;for genre in musicGenres {
    print(&quot;\(genre)&quot;)
}

// Kpop
// Hip hop
// Classical

// Set은 index가 없기 때문에 enumrated()를 사용할 수 없다.&lt;/code&gt;&lt;/pre&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;Set 결합: &lt;b&gt;intersection(), symmetricDifference(), union(), subtracting()&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;/ul&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;imageblock alignCenter&quot; width=&quot;503&quot; height=&quot;NaN&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;851&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0TuRv/btqKdFEtlBJ/YGokSSGlVVY5YSTJpecJP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0TuRv/btqKdFEtlBJ/YGokSSGlVVY5YSTJpecJP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0TuRv/btqKdFEtlBJ/YGokSSGlVVY5YSTJpecJP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0TuRv%2FbtqKdFEtlBJ%2FYGokSSGlVVY5YSTJpecJP0%2Fimg.png&quot; width=&quot;503&quot; height=&quot;NaN&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;851&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

// 합집합
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

// 교집합
oddDigits.intersection(evenDigits).sorted()
// []

// 차집합
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]

// 여집합
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]&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;h3 data-ke-size=&quot;size23&quot;&gt;3. 딕셔너리(Dictionary)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[Key: Value] 형태로 이루어진 컬렉션 타입&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;var namesOfIntegers = [Int: String]()

// Key: Value 추가
namesOfIntegers[16] = &quot;sixteen&quot;

// 딕셔너리 비우기
namesOfIntegers = [:]&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;var airports: [String: String] = = [&quot;YYZ&quot;: &quot;Toronto Pearson&quot;, &quot;DUB&quot;: &quot;Dublin&quot;]&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;if airports.isEmpty {
    print(&quot;airports 딕셔너리가 비어있습니다.&quot;)
} else {
    print(&quot;airports 딕셔너리가 비어있지 않습니다.&quot;)
}&lt;/code&gt;&lt;/pre&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;딕셔너리에 Key: Value 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;airports[&quot;LHR&quot;] = &quot;London&quot;&lt;/code&gt;&lt;/pre&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;Key에 해당하는 값(Value) 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;// Key: Value 추가
airports[&quot;KOR&quot;] = &quot;Seoul&quot;

// Value 변경
airports[&quot;KOR&quot;] = &quot;Incheon&quot;&lt;/code&gt;&lt;/pre&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;Key에 해당하는 값(Value) 제거: &lt;b&gt;removeValue&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;airports.removeValue(forKey: &quot;KOR&quot;)

// 또는, nil 할당
airports[&quot;KOR&quot;] = nil&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>SWIFT</category>
      <category>스위프트</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/79</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8Swift-5-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-1-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%83%80%EC%9E%85#entry79comment</comments>
      <pubDate>Mon, 5 Oct 2020 15:50:20 +0900</pubDate>
    </item>
    <item>
      <title>파워목업(PowerMockup) 체험판 간단 사용기</title>
      <link>https://nyebo.tistory.com/entry/%ED%8C%8C%EC%9B%8C%EB%AA%A9%EC%97%85PowerMockup-%EC%B2%B4%ED%97%98%ED%8C%90-%EA%B0%84%EB%8B%A8-%EC%82%AC%EC%9A%A9%EA%B8%B0</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 포스팅은 &lt;b&gt;2020년 5월 23일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p&gt;최근 웹/앱 기획자를 위한 도구들이 시중에 많이 나와있다.&lt;/p&gt;
&lt;p&gt;대표적으로 &lt;a href=&quot;https://www.sketch.com/&quot;&gt;Sketch&lt;/a&gt;, &lt;a href=&quot;https://www.adobe.com/kr/products/xd.html&quot;&gt;Adobe XD&lt;/a&gt;, &lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt; 등이 있다.&lt;/p&gt;
&lt;p&gt;그러나 이런 획기적인 툴들이 나왔음에도, Wireframe, Storyboard 등에 파워포인트를 여전히 사용하고 있다.&lt;/p&gt;
&lt;p&gt;기획자라면 한번씩은 무조건 사용해 보았고, 또 자주 쓰게 되는 파워포인트 플러그인이 바로, &lt;b&gt;파워 목업(Power Mockup)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;체험판 설치&lt;/h2&gt;
&lt;p&gt;체험판은 &lt;a href=&quot;https://www.powermockup.com/&quot;&gt;공식 홈페이지&lt;/a&gt;에서 받을 수 있다.&lt;/p&gt;
&lt;p&gt;다운받아서 설치하고 나면 아래와 같이 파워포인트에 PowerMockup 리본이 추가된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;154&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TAac8/btqJXV9LXym/BkGOVkjvgBRIoWfY1CZKuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TAac8/btqJXV9LXym/BkGOVkjvgBRIoWfY1CZKuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TAac8/btqJXV9LXym/BkGOVkjvgBRIoWfY1CZKuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTAac8%2FbtqJXV9LXym%2FBkGOVkjvgBRIoWfY1CZKuK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;154&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;h2 data-ke-size=&quot;size26&quot;&gt;파워목업 도구 설명&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shapes Panel&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Show Shapes Panel&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;195&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ySbrj/btqJ4HvFZi3/wbefT5TtCosKDIBzqgTHJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ySbrj/btqJ4HvFZi3/wbefT5TtCosKDIBzqgTHJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ySbrj/btqJ4HvFZi3/wbefT5TtCosKDIBzqgTHJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FySbrj%2FbtqJ4HvFZi3%2FwbefT5TtCosKDIBzqgTHJK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;195&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;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;Wireframe, Storyboard 작성 시 자주 사용되는 모양들이 제공된다.
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;&amp;nbsp;각종 placeholder, Icon, Input, Text, Navigation 등이 제공된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파워포인트 도형을 통해 본인이 생성한 모양을 Add Shape를 통해 Custom Shapes에 등록하여 편리하게 재사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;207&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KCJOA/btqJ0nEI9OO/3qRX5rxuKGQc0ZssDXcFK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KCJOA/btqJ0nEI9OO/3qRX5rxuKGQc0ZssDXcFK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KCJOA/btqJ0nEI9OO/3qRX5rxuKGQc0ZssDXcFK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKCJOA%2FbtqJ0nEI9OO%2F3qRX5rxuKGQc0ZssDXcFK1%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;207&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; width=&quot;100%&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b009i8/btqJWTqTXa4/yWIdcWxT5ykzEGzC11IlKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b009i8/btqJWTqTXa4/yWIdcWxT5ykzEGzC11IlKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b009i8/btqJWTqTXa4/yWIdcWxT5ykzEGzC11IlKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb009i8%2FbtqJWTqTXa4%2FyWIdcWxT5ykzEGzC11IlKK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;204&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 data-ke-size=&quot;size20&quot;&gt;Add Online Shape Library&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라우드 저장소와 동일하며, 체험판은 30일 무료로 사용 가능하다.&lt;/li&gt;
&lt;li&gt;Shapes Panel -&amp;gt; Shared Shapes에서 확인 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;321&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H7fUE/btqJ3hxdRby/qUqY8geRkJvpVIbvXDkPC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H7fUE/btqJ3hxdRby/qUqY8geRkJvpVIbvXDkPC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H7fUE/btqJ3hxdRby/qUqY8geRkJvpVIbvXDkPC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH7fUE%2FbtqJ3hxdRby%2FqUqY8geRkJvpVIbvXDkPC0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;321&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; width=&quot;100%&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;918&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vbJfQ/btqJ1LehPFE/hC7NOTfUvQOuciFKuZtdCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vbJfQ/btqJ1LehPFE/hC7NOTfUvQOuciFKuZtdCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vbJfQ/btqJ1LehPFE/hC7NOTfUvQOuciFKuZtdCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvbJfQ%2FbtqJ1LehPFE%2FhC7NOTfUvQOuciFKuZtdCk%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;918&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;h3 data-ke-size=&quot;size23&quot;&gt;Shape Library&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Add Shape&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 만든 도형을 Shape로 등록할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Download Shapes, Import Shapes&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공식 제공되는 Shape들을 다운로드 하거나 가져올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Add User&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본인만의 Shape Library를 다른 사용자에게 공유할 수 있습니다.&lt;/li&gt;
&lt;li&gt;'관리자, 읽고/쓰기, 읽기 전용'의 3가지 권한 설정이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Licensing&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Full Version 구매와 License Code 입력을 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PowerMockup&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내 계정 정보, 업데이트, 버전에 대한 내용을 확인 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;간단 사용기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;620&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JBdpx/btqJ3ipmiIP/yvBS50q2ojolOvcbCcQIB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JBdpx/btqJ3ipmiIP/yvBS50q2ojolOvcbCcQIB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JBdpx/btqJ3ipmiIP/yvBS50q2ojolOvcbCcQIB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJBdpx%2FbtqJ3ipmiIP%2FyvBS50q2ojolOvcbCcQIB0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;620&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체험판은 날짜 제한이 아닌, 사용할 수 있는 모양(Shape)에 제한이 있다.&lt;/li&gt;
&lt;li&gt;체험판에서 사용가능한 모양 만으로는 실제 프로젝트에서 사용하기에 충분하지 않다. 그러나 Full Version의 경우 쉽고 빠른, 강력한 기획 툴이 된다.&lt;/li&gt;
&lt;li&gt;체험판에서 사용 불가능한 모양 사용 시에는 'Full Version Required'로 Full Version 구매를 요구한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가격 및 라이선스&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1072&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dthtg/btqJ3hDZ3tm/GW9xQrseodimT77sO9LXnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dthtg/btqJ3hDZ3tm/GW9xQrseodimT77sO9LXnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dthtg/btqJ3hDZ3tm/GW9xQrseodimT77sO9LXnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDthtg%2FbtqJ3hDZ3tm%2FGW9xQrseodimT77sO9LXnK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1072&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가격정책은 개인(Individual, 1 User), 소규모 팀(Small Team, 5 Users), 팀(Team, 10 Users), 기업(Enterprise, 50 Users) 4가지로 구분되어 있다.&lt;/li&gt;
&lt;li&gt;구독형이 아닌, 한 번 구매시 영구 사용이 가능하다.&lt;/li&gt;
&lt;li&gt;현재 Version 4에 대해서 지속적인 업데이트를 지원받을 수 있다.&lt;/li&gt;
&lt;li&gt;유료 상품 외에 블로거, 기자, 마이크로소프트 MVPs 에 대한 Free License 정책도 존재한다. 자세한 사항은 &lt;a href=&quot;https://www.powermockup.com/order/free-license&quot;&gt;여기&lt;/a&gt;를 참고&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT</category>
      <category>리뷰</category>
      <category>체험판</category>
      <category>파워목업</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/78</guid>
      <comments>https://nyebo.tistory.com/entry/%ED%8C%8C%EC%9B%8C%EB%AA%A9%EC%97%85PowerMockup-%EC%B2%B4%ED%97%98%ED%8C%90-%EA%B0%84%EB%8B%A8-%EC%82%AC%EC%9A%A9%EA%B8%B0#entry78comment</comments>
      <pubDate>Sun, 4 Oct 2020 02:38:55 +0900</pubDate>
    </item>
    <item>
      <title>[정리] 데이터 과학을 위한 통계</title>
      <link>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%BC%ED%95%99%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%86%B5%EA%B3%84</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2019년 12월 20일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&amp;amp;mallGb=KOR&amp;amp;barcode=9791162240984&amp;amp;orderClick=LAG&amp;amp;Kc=&quot;&gt;『데이터 과학을 위한 통계』. 한빛미디어. 2019&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p&gt;데이터 과학을 위한 통계를 공부하기 위해서는, 우선적으로 통계 용어에 익숙해지는 것이 중요하다고 생각한다. 그런면에서 『데이터 과학을 위한 통계』는 각 주제별로 &lt;b&gt;용어&lt;/b&gt;와 &lt;b&gt;개념&lt;/b&gt;을 보기 편하게 구성이 되어있다.&lt;/p&gt;
&lt;p&gt;목차 순서에 따른 용어와 개념적인 부분을 우선 공부하고, 심화된 내용을 채워가는 방법이 좋을 것 같다는 판단에 해당 내용만 따로 공부하기 위해 정리하였다.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;탐색적 데이터 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정형화된 데이터의 요소&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;연속형(continuous) : 일정 범위 안에서 어떤 값이든 취할 수 있는 데이터 (유의어 : 구간형, 실수형, 수치형 데이터)&lt;/li&gt;
&lt;li&gt;이산(discrete): 횟수와 같은 정수 값만 취할 수 있다. (유의어 : 정수형, 횟수 데이터)&lt;/li&gt;
&lt;li&gt;범주형(categorical): 가능한 범주 안의 값만을 취할 수 있다. (유의어 : 목록, 열거, 요인, 명목, 다항형(polychotomous)데이터)&lt;/li&gt;
&lt;li&gt;이진(binary): 두 개의 값(0/1 혹은 참/거직)만을 갖는 범주형 데이터의 특수한 경우다. (유의어 : 이항적, 논리형, 지표(indicator), 불리언 데이터)&lt;/li&gt;
&lt;li&gt;순서형(ordinal): 값들 사이에 분명한 순위가 있는 범주형 데이터다. (유의어 : 정렬된 요인 데이터)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;데이터 종류에는 연속, 이산, 범주(이진), 순서 혀태가 있다.&lt;/li&gt;
&lt;li&gt;소프트웨어에서 데이터 종류를 정하는 것은 해당 데이터를 어떻게 처리할지를 정하는 것과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테이블 데이터&lt;/h3&gt;
&lt;p&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;데이터 프레임(data frame): 통계와 머신러닝 모델에서 가장 기본이 되는 테이블 형태의 데이터 구조를 말한다.&lt;/li&gt;
&lt;li&gt;피처(feature): 일반적으로 테이블의 각 열이 하나의 피처를 의미한다. (유의어 : 특징, 속성, 입력, 예측변수(predictor), 변수)&lt;/li&gt;
&lt;li&gt;결과(outcome): 데이터 과학 프로젝트의 목표는 대부분 어떤 결과를 예측하는 데 있다. 실험이나 연구에서 결과를 예측하기 위해 피처를 사용한다. (유의어 : 종속변수, 응답, 목표, 출력)&lt;/li&gt;
&lt;li&gt;레코드(record): 일반적으로 테이블의 각 행은 하나의 레코드를 의미한다. (유의어 : 기록값, 사건(case), 사례, 예제, 관측값, 패턴, 샘플)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 기본 테이블형 데이터 구조
      data.frame(..., row.names = NULL, check.rows = FALSE,
                 check.names = TRUE, fix.empty.names = TRUE,
                 stringsAsFactors = default.stringsAsFactors())

      # data.frame은 다중 인덱스를 지원하지 않는다. 이를 보완하기 위한 두 가지 패키지를 주로 사용
      data.table
      dplyr&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;위치 추정&lt;/h3&gt;
&lt;p&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;평균(mean): 모든 값의 총합을 개수로 나눈 값 (유의어 : 평균(average))&lt;/li&gt;
&lt;li&gt;가중평균(weighted mean): 가중치를 곱한 값의 총합을 가중치의 총합으로 나눈 값 (유의어 : 가중평균(weighted average))&lt;/li&gt;
&lt;li&gt;중간값(median): 데이터에서 가장 가운데 위치한 값 (유의어 : 50번째 백분위수(percentile))&lt;/li&gt;
&lt;li&gt;가중 중간값(weighted median): 데이터를 정렬한 후, 각 가중치 값을 위에서부터 더할 때, 총합의 중간이 위치하는 데이터 값&lt;/li&gt;
&lt;li&gt;절사평균(trimmed mean): 정해진 개수의 극단값(extreme value)을 제외한 나머지 값들의 평균 (유의어 : 절단평균(truncated mean))&lt;/li&gt;
&lt;li&gt;로버스트하다(robust): 극단값들에 민감하지 않다는 것을 의미한다. (유의어 : 저항성 있다(resistant))&lt;/li&gt;
&lt;li&gt;특잇값(outlier): 대부분의 값과 매우 다른 데이터 값 (유의어 : 극단값)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;중간값, 절사평균과 같은 다른 방법들이 좀 더 로버스트하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 평균
      mean(x, ...)

      # 중간값
      median(x, na.rm = FALSE, ...)

      # 가중평균
      install.packages(&quot;matrixStats&quot;)
      library(matrixStats)

      weighted.mean(x, w, ...)

      # 가중 중간값
      weightedMedian(x, w = NULL, idxs = NULL, na.rm = FALSE,
                     interpolate = is.null(ties), ties = NULL, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변이 추정&lt;/h3&gt;
&lt;p&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;편차(deviation): 관측값과 위치 추정값 사이의 차이 (유의어 : 오차, 잔차)&lt;/li&gt;
&lt;li&gt;분산(variance): 평균과의 편차를 제곱한 값들의 합을 n-q로 나눈 값, n은 데이터 개수 (유의어 : 평균제곱오차)&lt;/li&gt;
&lt;li&gt;표준편차(standard deviation): 분산의 제곱근 (유의어 : L2 노름(norm), 유클리드 노름)&lt;/li&gt;
&lt;li&gt;평균절대편차(mean absolute eeviation): 평균과의 편차의 절댓값의 평균 (유의어 : L1 노름, 맨하탄 노름)&lt;/li&gt;
&lt;li&gt;중간값의 중위절대편차(median absolute deviation from the median): 중간값과의 편차의 절댓값의 중간값&lt;/li&gt;
&lt;li&gt;범위(range): 데이터의 최댓값과 최솟값의 차이&lt;/li&gt;
&lt;li&gt;순서통계량(order statistics): 최소에서 최대까지 정렬된 데이터 값에 따른 계량형 (유의어 : 순위)&lt;/li&gt;
&lt;li&gt;백분위수(percentile): 어떤 값들의 p퍼센트가 이 값 혹은 더 작은 값을 갖고, (100-p)퍼센트가 이 값 혹은 더 큰 값을 갖도록 하는 값 (유의어 : 분위수)&lt;/li&gt;
&lt;li&gt;사분위범위(interquartile range): 75번째 백분위수와 25번째 백분위수 사이의 차이 (유의어 : IQR)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;이들 모두 특잇값에 민감하다.&lt;/li&gt;
&lt;li&gt;평균과 백분위수(분위수)에서의 절대편차의 평균과 중간값을 구하는 것이 좀 더 로버스트하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 표준편차
      sd(x, na.rm = FALSE)

      # 사분위범위(IQR)
      IQR(x, na.rm = FALSE, type = 7)

      # 중위절대편차(MAD)
      mad(x, center = median(x), constant = 1.4826, na.rm = FALSE,
          low = FALSE, high = FALSE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 분포 탐색하기&lt;/h3&gt;
&lt;p&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;상자그림(box plot): 투키가 데이터의 분포를 시각화하기 위한 간단한 방법으로 소개한 그림 (유의어 : 상자 수염도)&lt;/li&gt;
&lt;li&gt;도수분포표(frequency table): 어떤 구간(interval)(빈(bin))에 해당하는 수치 데이터 값들의 빈도를 나타내는 기록&lt;/li&gt;
&lt;li&gt;히스토그램(histogram): x축은 구간들을, y축은 빈도수를 나타내는 도수 테이블의 그림&lt;/li&gt;
&lt;li&gt;밀도 그림(density plot): 히스토그램을 부드러운 곡선으로 나타낸 그림. 커널밀도추정(kernel density estimation)을 주로 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;도수 히스토그램은 y축에 횟수를 x축에 변수 값들을 표시하고 한눈에 데이터의 분포를 볼 수 있다.&lt;/li&gt;
&lt;li&gt;도수분포표는 히스토그램에 보이는 횟수들을 표 형태로 나타낸 것이다.&lt;/li&gt;
&lt;li&gt;상자그림에서 상자의 위 아래 부분은 각각 75%, 25% 백분위수를 의미하며, 이것 역시 데이터의 분포를 한눈에 파악할 수 있도록 돕는다. 주로 분포들을 서로 비교하기 위해 사용된다.&lt;/li&gt;
&lt;li&gt;밀도 그림은 히스토그램의 부드러운 버전이라고 할 수 있다. 데이터로부터 이 그림을 얻기 위해서는 어떤 함수를 구해야 하는데 여러 가지 가능한 추정 방법이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 백분위수
      quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE,
               names = TRUE, type = 7, ...)

      # 상자그림
      ## S3 method for class 'formula'
      boxplot(formula, data = NULL, ..., subset, na.action = NULL,
              xlab = mklab(y_var = horizontal),
              ylab = mklab(y_var =!horizontal),
              add = FALSE, ann = !add, horizontal = FALSE,
              drop = FALSE, sep = &quot;.&quot;, lex.order = FALSE)

      ## Default S3 method:
      boxplot(x, ..., range = 1.5, width = NULL, varwidth = FALSE,
              notch = FALSE, outline = TRUE, names, plot = TRUE,
              border = par(&quot;fg&quot;), col = NULL, log = &quot;&quot;,
              pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5),
               ann = !add, horizontal = FALSE, add = FALSE, at = NULL)

      # 도수분포표
      table(...,
            exclude = if (useNA == &quot;no&quot;) c(NA, NaN),
            useNA = c(&quot;no&quot;, &quot;ifany&quot;, &quot;always&quot;),
            dnn = list.names(...), deparse.level = 1)

      # 히스토그램
      hist(x, breaks = &quot;Sturges&quot;,
           freq = NULL, probability = !freq,
           include.lowest = TRUE, right = TRUE,
           density = NULL, angle = 45, col = NULL, border = NULL,
           main = paste(&quot;Histogram of&quot; , xname),
           xlim = range(breaks), ylim = NULL,
           xlab = xname, ylab,
           axes = TRUE, plot = TRUE, labels = FALSE,
           nclass = NULL, warn.unused = TRUE, ...)

      # 밀도추정
      density(x, bw = &quot;nrd0&quot;, adjust = 1,
              kernel = c(&quot;gaussian&quot;, &quot;epanechnikov&quot;, &quot;rectangular&quot;,
                         &quot;triangular&quot;, &quot;biweight&quot;,
                         &quot;cosine&quot;, &quot;optcosine&quot;),
              weights = NULL, window = kernel, width,
              give.Rkern = FALSE,
              n = 512, from, to, cut = 3, na.rm = FALSE, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이진 데이터와 범주 데이터 탐색하기&lt;/h3&gt;
&lt;p&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;최빈값(mode): 데이터에서 가장 자주 등장하는 범주 혹은 값&lt;/li&gt;
&lt;li&gt;기댓값(expected value): 범주에 해당하는 어떤 수치가 있을 때, 범주의 출현 확률에 따른 평균&lt;/li&gt;
&lt;li&gt;막대도표(bar chart): 각 범주의 빈도수 혹은 비율을 막대로 나타낸 그림&lt;/li&gt;
&lt;li&gt;파이그림(pie chart): 각 범주의 빈도수 혹은 비율을 원의 부채꼴 모양으로 나타낸 그림&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;범주란 전혀 다른 집합(사과/오렌지, 남자/여자), 정도를 나타내는 요인변수의 수준(낮음, 중간, 높음), 혹은 구간별로 나뉜 수치 데이터 같은 것들을 의미한다.&lt;/li&gt;
&lt;li&gt;기댓값은 어떤 값과 그 값이 일어날 확률을 서로 곱해 더한 값을 의미한다. 주로 요인변수의 수준을 요약하는 데 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 막대도표
      ## Default S3 method:
      barplot(height, width = 1, space = NULL,
              names.arg = NULL, legend.text = NULL, beside = FALSE,
              horiz = FALSE, density = NULL, angle = 45,
              col = NULL, border = par(&quot;fg&quot;),
              main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
              xlim = NULL, ylim = NULL, xpd = TRUE, log = &quot;&quot;,
              axes = TRUE, axisnames = TRUE,
              cex.axis = par(&quot;cex.axis&quot;), cex.names = par(&quot;cex.axis&quot;),
              inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
              add = FALSE, ann = !add &amp;amp;&amp;amp; par(&quot;ann&quot;), args.legend = NULL, ...)

      ## S3 method for class 'formula'
      barplot(formula, data, subset, na.action,
              horiz = FALSE, xlab = NULL, ylab = NULL, ...)

      # 파이그림
      pie(x, labels = names(x), edges = 200, radius = 0.8,
          clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
          density = NULL, angle = 45, col = NULL, border = NULL,
          lty = NULL, main = NULL, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상관관계&lt;/h3&gt;
&lt;p&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;상관계수(correlation coefficient): 수치적 변수들 간에 어떤 관계가 있는지를 나타내기 위해 사용되는 측정량 (-1에서 +1까지의 범위)&lt;/li&gt;
&lt;li&gt;상관행렬(correlation matrix): 행과 열이 변수들을 의미하는 표를 말하며, 각 셀은 그 행과 열에 해당하는 변수들 간의 상관관계를 의미한다.&lt;/li&gt;
&lt;li&gt;산점도(scatterplot): x축과 y축이 서로 다른 두 개의 변수를 나타내는 도표&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;v1이 높아질 때 v2도 높아지고, v1이 낮아질 때 v1도 낮아지는 경우는 양의 상관관계가 있다고 한다.&lt;/li&gt;
&lt;li&gt;반대로, v1이 높아질 때 v2는 낮아니고, v1이 낮아질 때 v2는 높아지는 경우는 음의 상관관계가 있다고 한다.&lt;/li&gt;
&lt;li&gt;상관계수는 표준화된 측정 지표라고 할 수 있다. 항상 그 값이 -1(완전 음의 상관관계)에서 +1(완전 양의 상관관계) 사이에 존재한다.&lt;/li&gt;
&lt;li&gt;상관계수가 0이라는 것은 아무런 상관성이 없다는 것을 의미한다. 하지만 데이터를 랜덤하게 재배치하면 우연히 상관계수가 양수나 음수가 될 수도 있다는 점을 알고 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 상관행렬
      install.packages(&quot;corrplot&quot;)
      library(corrplot)

      corrplot(corr, method = c(&quot;circle&quot;, &quot;square&quot;, &quot;ellipse&quot;, &quot;number&quot;, &quot;shade&quot;,
              &quot;color&quot;, &quot;pie&quot;), type = c(&quot;full&quot;, &quot;lower&quot;, &quot;upper&quot;), add = FALSE,
              col = NULL, bg = &quot;white&quot;, title = &quot;&quot;, is.corr = TRUE, diag = TRUE,
              outline = FALSE, mar = c(0, 0, 0, 0), addgrid.col = NULL,
              addCoef.col = NULL, addCoefasPercent = FALSE, order = c(&quot;original&quot;,
              &quot;AOE&quot;, &quot;FPC&quot;, &quot;hclust&quot;, &quot;alphabet&quot;), hclust.method = c(&quot;complete&quot;, &quot;ward&quot;,
              &quot;ward.D&quot;, &quot;ward.D2&quot;, &quot;single&quot;, &quot;average&quot;, &quot;mcquitty&quot;, &quot;median&quot;, &quot;centroid&quot;),
              addrect = NULL, rect.col = &quot;black&quot;, rect.lwd = 2, tl.pos = NULL,
              tl.cex = 1, tl.col = &quot;red&quot;, tl.offset = 0.4, tl.srt = 90,
              cl.pos = NULL, cl.lim = NULL, cl.length = NULL, cl.cex = 0.8,
              cl.ratio = 0.15, cl.align.text = &quot;c&quot;, cl.offset = 0.5, number.cex = 1,
              number.font = 2, number.digits = NULL, addshade = c(&quot;negative&quot;,
              &quot;positive&quot;, &quot;all&quot;), shade.lwd = 1, shade.col = &quot;white&quot;, p.mat = NULL,
              sig.level = 0.05, insig = c(&quot;pch&quot;, &quot;p-value&quot;, &quot;blank&quot;, &quot;n&quot;, &quot;label_sig&quot;),
              pch = 4, pch.col = &quot;black&quot;, pch.cex = 3, plotCI = c(&quot;n&quot;, &quot;square&quot;,
              &quot;circle&quot;, &quot;rect&quot;), lowCI.mat = NULL, uppCI.mat = NULL, na.label = &quot;?&quot;,
              na.label.col = &quot;black&quot;, win.asp = 1, ...)

      # 산점도
      plot(x, y, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두 개 이상의 변수 탐색하기&lt;/h3&gt;
&lt;p&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;분할표(contingency table): 두 가지 이상의 범주형 변수의 빈도수를 기록한 표&lt;/li&gt;
&lt;li&gt;육각형 구간(hexagonal binning): 두 변수를 육각형 모양의 구간으로 나눈 그림&lt;/li&gt;
&lt;li&gt;등고 도표(contour plot): 지도상에 같은 높이의 지점을 등고선으로 나타내는 것처럼, 두 변수의 밀도를 등고선으로 표시한 도표&lt;/li&gt;
&lt;li&gt;바이올린 도표(viloin plot): 상자그림과 비슷하지만 밀도추정을 함께 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;분할표는 두 범주형 변수의 도수를 확인하기 위한 표준 방법이다.&lt;/li&gt;
&lt;li&gt;상자그림과 바이올린 도표는 범주형 변수와 수치형 변수 간의 관계를 도식화하기 위한 도구이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 특정 데이터 제거
      ## Default S3 method:
      subset(x, subset, ...)

      ## S3 method for class 'matrix'
      subset(x, subset, select, drop = FALSE, ...)

      ## S3 method for class 'data.frame'
      subset(x, subset, select, drop = FALSE, ...)

      # 분할표
      CrossTable(x, y,
                 digits = list(expected = 1, prop = 3, percent = 1, others = 3),
                 max.width = NA, expected = FALSE,
                 prop.r = TRUE, prop.c = TRUE, prop.t = TRUE,
                 prop.chisq = TRUE, chisq = FALSE, fisher = FALSE,
                 mcnemar = FALSE, resid = FALSE, sresid = FALSE,
                 asresid = FALSE, missing.include = FALSE,
                 drop.levels = TRUE, format = c(&quot;SAS&quot;,&quot;SPSS&quot;),
                 dnn = NULL, cell.layout = TRUE,
                 row.labels = !cell.layout,
                 percent = (format == &quot;SPSS&quot; &amp;amp;&amp;amp; !row.labels),
                 total.r, total.c, xlab = NULL, ylab = NULL, ...)

      # 육각형 구간
      install.packages(&quot;ggplot2&quot;)
      library(ggplot2)

      ggplot(data = NULL, mapping = aes(), ...,
             environment = parent.frame())

      # 등고 도표
      geom_density_2d(mapping = NULL, data = NULL, stat = &quot;density2d&quot;,
                      position = &quot;identity&quot;, ..., lineend = &quot;butt&quot;, linejoin = &quot;round&quot;,
                      linemitre = 10, na.rm = FALSE, show.legend = NA,
                      inherit.aes = TRUE)

      # 바이올린 도표
      geom_violin(mapping = NULL, data = NULL, stat = &quot;ydensity&quot;,
                  position = &quot;dodge&quot;, ..., draw_quantiles = NULL, trim = TRUE,
                  scale = &quot;area&quot;, na.rm = FALSE, show.legend = NA,
                  inherit.aes = TRUE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터와 표본분포&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;랜덤표본추출과 표본편향&lt;/h3&gt;
&lt;p&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;표본(sample): 더 큰 데이터 집합으로부터 얻은 부분집합&lt;/li&gt;
&lt;li&gt;모집단(population): 어떤 데이터 집합을 구성하는 전체 대상 혹은 전체 집합&lt;/li&gt;
&lt;li&gt;N(n) : 모집단(표본)의 크기&lt;/li&gt;
&lt;li&gt;임의표집(랜덤표본추출)(random sampling): 무작위로 표본을 추출하는 것&lt;/li&gt;
&lt;li&gt;층화표집(층화표본추출)(stratified sampling): 모집단을 층으로 나눈 뒤, 각 층에서 무작위로 표본을 추출하는 것&lt;/li&gt;
&lt;li&gt;단순임의표본(단순랜덤표본)(simple random sample): 모집단 층화 없이 랜덤표본추출로 얻은 표본&lt;/li&gt;
&lt;li&gt;표본편향(sample bias): 모집단을 잘못 대표하는 표본&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;편향은 측정이나 관측에 계통적 오차가 있어 전체 모집단을 제대로 대표하지 못할 경우 발생한다.&lt;/li&gt;
&lt;li&gt;데이터 품질이 데이터 양보다 중요할 때가 자주 있다. 랜덤표보누출은 편향을 줄이고, 나중에 다시 하려면 훨씬 비싼 값을 치룰 수도 있는 품질 향상을 용이하게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선택 편향&lt;/h3&gt;
&lt;p&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;편향(bias): 계통적 오차&lt;/li&gt;
&lt;li&gt;데이터 스누핑(data snooping): 뭔가 흥미로운 것을 찾아 광범위하게 데이터를 살피는 것&lt;/li&gt;
&lt;li&gt;방대한 검색 효과(vast search effect): 중복 데이터 모델리이나 너무 많은 예측변수를 고려하는 모델링에서 비롯되는 편향 혹은 비재현성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;다른 모든 형태의 데이터 분석은 데이터 수집/분석 프로세스에서 생기는 편향의 위험성을 늘 갖고 있다(데이터 마이닝에서의 모델 반복 실행, 연구 시 데이터 스누핑, 흥미로운 사건의 사후 선택 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;통계학에서의 표본분포&lt;/h3&gt;
&lt;p&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;표본통계량(sample statistic): 더 큰 모집단에서 추출된 표본 데이터들로부터 얻은 측정 지표&lt;/li&gt;
&lt;li&gt;데이터 분포(data distribution): 어떤 데이터 집합에서의 각 개별 값의 도수분포&lt;/li&gt;
&lt;li&gt;표본분포(sampling distribution): 여러 표본들 혹은 재표본들로부터 얻은 표본통계량의 도수분포&lt;/li&gt;
&lt;li&gt;중심극한정리(central limit theorem): 표본크기가 커질수록 표본분포가 정규본포를 따르는 경향&lt;/li&gt;
&lt;li&gt;표준오차(standard error): 여러 표본들로부터 얻은 표본통계량의 변량 (개별 데이터 값들의 변량을 뜻하는 표준편차와 혼동하지 말 것)
&lt;ol&gt;
&lt;li&gt;모집단에서 완전히 새로운 샘플들을 많이 수집한다.&lt;/li&gt;
&lt;li&gt;각각의 새 샘플에 대해 통계량 (예: 평균)을 계산한다.&lt;/li&gt;
&lt;li&gt;2단계에서 얻은 통계량의 표준편차를 계산한다. 이것을 표준오차의 추정치로 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;부트스트랩 방식 혹은 중심극한정리에 의존하는 공식을 통해 표본분포를 추정할 수 있다.&lt;/li&gt;
&lt;li&gt;표준오차는 표본통계량의 변동성을 요약하는 주요 지표이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부트스트랩&lt;/h3&gt;
&lt;p&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;부트스트랩 표본(bootstrap sample): 관측 데이터 집합으로부터 얻는 복원추출 표본&lt;/li&gt;
&lt;li&gt;재표집(재표본추출, 리샘플링)(resampling): 관측 데이터로부터 반복해서 표본추출하는 과정. 부트스트랩과 순열(셔플링) 과정을 포함한다.
&lt;ol&gt;
&lt;li&gt;샘플 값을 하나 뽑아서 기록하고 제자리에 놓는다.&lt;/li&gt;
&lt;li&gt;n번 반복한다.&lt;/li&gt;
&lt;li&gt;재표본추출된 값의 평균을 기록한다.&lt;/li&gt;
&lt;li&gt;1~3단계를 R번 반복한다.&lt;/li&gt;
&lt;li&gt;R개의 결과를 사용하여
&lt;ol&gt;
&lt;li&gt;그것들의 표준편차(표본평균의 표준오차)를 계산한다.&lt;/li&gt;
&lt;li&gt;히스토그램 또는 상자그림을 그린다.&lt;/li&gt;
&lt;li&gt;신뢰구간을 찾는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;부트스트랩은 표본분포의 수학적 근사치에 대한 엄청난 연구 없이도 다양한 환경에서 유사한 방식으로 적용될 수 있다.&lt;/li&gt;
&lt;li&gt;또한 수학적 근사가 어려운 통계량에 대해서도 샘플링 분포를 추정할 수 있다.&lt;/li&gt;
&lt;li&gt;예측 모델을 적용할 때, 여러 부트스트랩 표본들로부터 얻은 예측값을 모아서 결론을 만드는 것(배깅)이 단일 모델을 사용하는 것보다 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 부트스트랩
      install.packages(&quot;boot&quot;)
      library(boot)

      boot(data, statistic, R, sim = &quot;ordinary&quot;, stype = c(&quot;i&quot;, &quot;f&quot;, &quot;w&quot;), 
           strata = rep(1,n), L = NULL, m = 0, weights = NULL, 
           ran.gen = function(d, p) d, mle = NULL, simple = FALSE, ...,
           parallel = c(&quot;no&quot;, &quot;multicore&quot;, &quot;snow&quot;),
           ncpus = getOption(&quot;boot.ncpus&quot;, 1L), cl = NULL)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;신뢰구간&lt;/h3&gt;
&lt;p&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;신뢰수준(confidence level): 같은 모집단으로부터 같은 방식으로 얻은, 관심 통계량을 포함할 것으로 예상되는, 신뢰구간의 백분율
&lt;ol&gt;
&lt;li&gt;데이터에서 복원추출 방식으로 크기 n인 표본을 뽑는다(재표본추출).&lt;/li&gt;
&lt;li&gt;재표본추출한 표본에 대해 원하는 통계량을 기록한다.&lt;/li&gt;
&lt;li&gt;1~2단계를 R번 반복한다.&lt;/li&gt;
&lt;li&gt;x% 신뢰구간을 구하기 위해, R개의 재표본 결과로부터 분포의 양쪽 끝에서 [(100 - x) / 2]% 만큼 잘라낸다.&lt;/li&gt;
&lt;li&gt;절단한 점들은 x% 부트스트랩 신뢰구간의 양 끝점이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;구간끝점(interval endpoint): 신뢰구간의 최상위, 최하위 끝점&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;더 많은 데이터를 보유할수록 표본추정치의 변위가 줄어든다.&lt;/li&gt;
&lt;li&gt;허용할 수 있는 신뢰수준이 낮을수록 신뢰구간은 좁아진다.&lt;/li&gt;
&lt;li&gt;부트스트랩은 신뢰구간을 구성하는 효과적인 방법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규분포&lt;/h3&gt;
&lt;p&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;오차(error): 데이터 포인트와 예측값 혹은 평균 사이의 차이&lt;/li&gt;
&lt;li&gt;표준화(정규화)하다(standardize): 평균을 빼고 표준편차로 나눈다.&lt;/li&gt;
&lt;li&gt;z 점수(z-score): 개별 데이터 포인트를 정규화한 결과&lt;/li&gt;
&lt;li&gt;표준정규분포(standard normal distribution): 평균 = 0, 표준편차 = 1인 정규분포&lt;/li&gt;
&lt;li&gt;QQ 그림(QQ-plot): 표본분포가 정규분포에 얼마나 가까운지를 보여주는 그림&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;원시 데이터 자체는 대개 정규분포가 아니지만, 표본들의 평균과 합계, 그리고 오차는 많은 경우 정규분포를 따른다.&lt;/li&gt;
&lt;li&gt;데이터를 z 점수로 변환하려면 데이터의 값에서 평균을 빼고 표준편차로 나눈다. 그러면 데이터를 정규분포와 비교할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 정규분포
      ## Default S3 method:
      qqnorm(y, ylim, main = &quot;Normal Q-Q Plot&quot;,
             xlab = &quot;Theoretical Quantiles&quot;, ylab = &quot;Sample Quantiles&quot;,
             plot.it = TRUE, datax = FALSE, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;긴 꼬리 분포&lt;/h3&gt;
&lt;p&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;꼬리(tail): 적은 수의 극단값이 주로 존재하는, 도수분포의 길고 좁은 부분&lt;/li&gt;
&lt;li&gt;왜도(skewness): 분포의 한쪽 꼬리가 반대쪽 다른 꼬리보다 긴 정도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;정규분포를 따를 것이라는 가정은, 자주 일어나지 않는 예외 경우('흑고니 이론(black swan theory)')에 관한 과소평가를 가져올 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스튜던트의 t 분포&lt;/h3&gt;
&lt;p&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;n : 표본크기&lt;/li&gt;
&lt;li&gt;자유도(degrees of freedom): 다른 표본크기, 통계량, 그룹의 수에 따라 t 분포를 조절하는 변수수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;t 분포는 사실 정규분포와 비슷한데 꼬리만 조금 더 두꺼운 형태이다.&lt;/li&gt;
&lt;li&gt;이것은 표본평균, 두 표본평균 사이의 차이, 회귀 파라미터 등의 분포를 위한 기준으로 널리 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이항분포&lt;/h3&gt;
&lt;p&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;시행(trial): 독립된 결과를 가져오는 하나의 사건 (예 : 동전 던지기)&lt;/li&gt;
&lt;li&gt;성공(success): 시행에 대한 관심의 결과 (유의어 : 1, 즉 0에 대한 반대)&lt;/li&gt;
&lt;li&gt;이항식(binomial): 두 가지 결과를 갖는다. (유의어 : 예/아니오, 0/1, 이진)&lt;/li&gt;
&lt;li&gt;이항시행(binomial trial): 두 가지 결과를 가져오는 시행 (유의어 : 베르누이 시행)&lt;/li&gt;
&lt;li&gt;이항분포(binomial distribution): x번 시행에서 성공한 횟수에 대한 분포 (유의어 : 베르누이 분포)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;이항 시행은 두 가지 결과, 즉 하나는 확률 p, 다른 하나는 확률 (1 - p)인 실험을 말한다.&lt;/li&gt;
&lt;li&gt;n이 크고 p가 0 또는 1에 너무 가깝지 않은 경우, 이항분포는 정규분포로 근사할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 이항 확률
      dbinom(x, size, prob, log = FALSE)
      pbinom(q, size, prob, lower.tail = TRUE, log.p = FALSE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;푸아송 분포와 그 외 관련 분포들&lt;/h3&gt;
&lt;p&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;람다(lambda): 단위 시간이나 단위 면적당 사건이 발생하는 비율&lt;/li&gt;
&lt;li&gt;푸아송 분포(Poisson distribution): 표집된 단위 시간 혹은 단위 공간에서 발생한 사건의 도수분포&lt;/li&gt;
&lt;li&gt;지수분포(exponential distribution): 한 사건에서 그 다음 사건까지의 시간이나 거리에 대한 도수분포&lt;/li&gt;
&lt;li&gt;베이불 분포(Weibull distribution): 사건 발생률이 시간에 따라 변화하는, 지수분포의 일반화된 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;이 시나리오에서, 한 사건과 다음 사건 간의 시간/거리를 지수분포로 모델링할 수도 있다.&lt;/li&gt;
&lt;li&gt;시간에 따라 변화하는 사건 발생률(예를 들어 증가하는 고장률)은 베이불 분포로 모델링할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 푸아송 분포
      rpois(n, lambda)

      # 지수분포
      rexp(n, rate = 1)

      # 베이불 분포
      rweibull(n, shape, scale = 1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통계적 실험과 유의성 검정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A/B 검정&lt;/h3&gt;
&lt;p&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;A/B 검정 : 두 처리 방법, 제품, 혹은 절차 중 어느 쪽이 다른 쪽보다 더 우월하다는 것을 입증하기 위해 실험군을 두 그룹으로 나누어 진행하는 실험이다.&lt;/li&gt;
&lt;li&gt;처리(treatment): 어떤 대상에 주어지는 특별한 환경이나 조건 (약, 가격, 인터넷 뉴스 제목)&lt;/li&gt;
&lt;li&gt;처리군(처리 그룹)(treatment group): 특정 처리에 노출된 대상들의 집단&lt;/li&gt;
&lt;li&gt;대조군(대조 그룹)(control group): 어떤 처리도 하지 않은 대상들의 집단&lt;/li&gt;
&lt;li&gt;임의화(랜덤화)(randomization): 처리를 적용할 대상을 임의로 결정하는 과정&lt;/li&gt;
&lt;li&gt;대상(subject): 처리를 적용할 개체 대상 (유의어 : 피실험자)&lt;/li&gt;
&lt;li&gt;검정통계량(test statistic): 처리 효과를 측정하기 위한 지표&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;이상적으로, 대상들은 그룹에 무작위로 배정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가설검정&lt;/h3&gt;
&lt;p&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;귀무가설(null hypothesis): 우연 때문이라는 가설 (유의어 : 영가설)&lt;/li&gt;
&lt;li&gt;대립가설(alternative hypothesis): 귀무가설과의 대조(증명하고자 하는 가설)&lt;/li&gt;
&lt;li&gt;일원검정(one-way test): 한 방향으로만 우연히 일어날 확률을 계산하는 가설검정&lt;/li&gt;
&lt;li&gt;이원검정(two-way test): 양방향으로 우연히 일어날 확률을 계산하는 가설검정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;가설검정은 귀무가설이 사실이라고 가정하고, '영모형(null model)' (확률모형(probability model))을 생성하여 관찰한 효과가 해당 모델로부터 합리적으로 나올 수 있는 결과인지 여부를 검증하는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재표본추출&lt;/h3&gt;
&lt;p&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;순열검정(permutation test): 두 개 이사으이 표본을 함께 결합하여 관측값들을 무작위로(또는 전부를) 재표본으로 추출하는 과정을 말한다. (유의어 : 임의화검정, 임의순열검정, 정확검정)
&lt;ol&gt;
&lt;li&gt;여러 그룹의 결과를 단일 데이터 집합으로 결합한다.&lt;/li&gt;
&lt;li&gt;결합된 데이터를 잘 섞은 후, 그룹 A와 동일한 크기의 표본을 무작위로(비복원) 추출한다.&lt;/li&gt;
&lt;li&gt;나머지 데이터에서 그룹 B와 동일한 크기의 샘플을 무작위로(비복원) 추출한다.&lt;/li&gt;
&lt;li&gt;C, D 등의 그룹에 대해서도 동일한 작업을 수행한다.&lt;/li&gt;
&lt;li&gt;원래 샘플(예를 들면 그룹 비율의 차이)에 대해 구한 통계량 또는 추정치가 무엇이었든 간에 지금 추출한 재표본에 대해 모두 다시 계산하고 기록한다. 이것으로 한 번의 순열 반복이 진행된다.&lt;/li&gt;
&lt;li&gt;앞선 단계들을 R번 반복하여 검정통계량의 순열 분포를 얻는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;복원/비복원(with or witout replacement): 표본을 추출할 때, 이미 한번 뽑은 데이터를 다음번 추출을 위해 다시 제자리에 돌려 놓거나/다음 추출에서 제외하는 표집 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;그런 다음 섞인 값들을 이용해 재표본추출 과정을 거쳐, 관심 있는 표본통계량을 계산한다.&lt;/li&gt;
&lt;li&gt;이 과정을 반복하고 재표본추출한 통계를 도표화한다.&lt;/li&gt;
&lt;li&gt;관측된 통계량을 재표본추출된 분포와 비교하면 샘플 간에 관찰된 차이가 우연에 의한 것인지를 판단할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 비복원추출 방식 함수
      perm_fun &amp;lt;- function(x, n1, n2)
      {
          n &amp;lt;- n1 + n2
          idx_b &amp;lt;- sample(1:n, n1)
          idx_a &amp;lt;- setdiff(1:n, idx_b)
          mean_diff &amp;lt;- mean(x[idx_b]) - mean(x[idx_a])
          return(mean_diff)
      }&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;통계적 유의성과 p 값&lt;/h3&gt;
&lt;p&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;p 값(p-value): 귀무가설을 구체화한 기회 모델이 주어졌을 때, 관측된 결과와 같이 특이하거나 극단적인 결과를 얻을 확률&lt;/li&gt;
&lt;li&gt;알파(alpha): 실제 결과가 통계적으로 의미 있는 것으로 간주되기 위해, 우연에 의한 기회 결과가 능가해야하는 '비정상적인' 가능성의 임계 확률&lt;/li&gt;
&lt;li&gt;제1종 오류(type I error): 우연에 의한 효과가 실제 효과라고 잘못 결론 내리는 것&lt;/li&gt;
&lt;li&gt;제2종 오류(type II error): 실제 효과를 우연에 의한 효과라고 잘못 결론 내리는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;p 값은 귀무가설로부터 나올 수 있는 결과가 관찰된 결과만큼 극단적으로 나타날 확률이다.&lt;/li&gt;
&lt;li&gt;유의수준(알파)이란, 귀무가설 모델에서 '비정상'이라고 판단할 임계값을 말한다.&lt;/li&gt;
&lt;li&gt;유의성 검정은 데이터 과학보다는 좀 더 공식적인 연구 보고와 관련이 있다(그러나 공식적인 연구 보고의 경우에도 최근에는 중요성이 희미해지고 있다).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;t검정&lt;/h3&gt;
&lt;p&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;검정통계량(test statistic): 관심의 차이 또는 효과에 대한 측정 지표&lt;/li&gt;
&lt;li&gt;t 통계량(t-statistic): 표준화된 형태의 검정통계량&lt;/li&gt;
&lt;li&gt;t 분포(t-distribution): 관측된 t 통계량을 비교할 수 있는, (귀무가설에서 파생된) 기준 분포&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;이렇게 하면 검정통계량이 표준화되어 참고할 분포와 비교할 수 있다.&lt;/li&gt;
&lt;li&gt;널리 사용되는 표준화된 통계량 중 하나가 t 통계량이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# t 통계량
      # Default S3 method:
      t.test(x, y = NULL,
             alternative = c(&quot;two.sided&quot;, &quot;less&quot;, &quot;greater&quot;),
             mu = 0, paired = FALSE, var.equal = FALSE,
             conf.level = 0.95, ...)

      ## S3 method for class 'formula'
      t.test(formula, data, subset, na.action, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다중검정&lt;/h3&gt;
&lt;p&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;제1종 오류(type I error): 어떤 효과가 통계적으로 유의미하다고 잘못된 결론을 내린다.&lt;/li&gt;
&lt;li&gt;거짓 발견 비율(FDR)(false discovery rate): 다중검정에서 1종 오류가 발생하는 비율&lt;/li&gt;
&lt;li&gt;p 값 조정(adjustment of p-value): 동일한 데이터에 대해 다중검정을 수행하는 경우에 필요하다.&lt;/li&gt;
&lt;li&gt;과대적합(오버피팅)(overfitting): 잡음까지 피팅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;여러 통게 비교(즉, 여러 유의성 검정)와 관련된 상황의 경우 통계적 수정 절차가 필요하다.&lt;/li&gt;
&lt;li&gt;데이터 마이닝에서, 라벨리 지정된 결과변수가 있는(즉 분류 결과를 알고 있는) 홀드아웃 표본을 사용하면 잘못된 결과를 피할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자유도&lt;/h3&gt;
&lt;p&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;표본크기 n : 해당 데이터에서 관측값의 개수(행 혹은 기록값의 개수와 같은 의미)&lt;/li&gt;
&lt;li&gt;d.f.(degrees of freedom): 자유도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;자유도(d.f.)는 검정통계량을 표준화하는 계산의 일부이며, 이를 통해 기준 분포(t 분포, F 분포 등)와 비교 할 수 있다.&lt;/li&gt;
&lt;li&gt;자유도 개념은 회귀를 할 때 (다중공선성을 피하기 위해) 범주형 변수들을 n-1 지표 혹은 더미 변수로 요인화하는 것의 이유가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;분산분석&lt;/h3&gt;
&lt;p&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;쌍별 비교(pairwise comparison): 여러 그룹 중 두 그룹 간의 (예를 들면 평균에 대한) 가설검정&lt;/li&gt;
&lt;li&gt;총괄검정(omnibus test): 여러 그룹 평균들의 전체 분산에 관한 단일 가설검정&lt;/li&gt;
&lt;li&gt;분산분해(decomposition of variance): 구성 요소 분리, 예를 들면 전체 평균, 처리 평균, 잔차 오차로부터 개별 값들에 대한 기여를 뜻한다.&lt;/li&gt;
&lt;li&gt;F 통계량(F-statistic): 그룹 평균 간의 차이가 랜덤 모델에서 예상되는 것보다 벗어나는 정도를 측정하는 표준화된 통계량&lt;/li&gt;
&lt;li&gt;SS(sum of squares): 어떤 평균으로부터의 편차들의 제곱합&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;ANOVA(분산분석, analysis of variance)는 여러 그룹의 실험 결과를 분석하기 위한 통계적 절차이다.&lt;/li&gt;
&lt;li&gt;A/B 검정과 비슷한 절차를 확장하여 그룹 간 전체적인 편차가 우연히 발생할 수 있는 범위 내에 있는지를 평가하기 위해 사용한다.&lt;/li&gt;
&lt;li&gt;ANOVA의 결과 중 유용한 점 중 하나는 그룹 처리, 상호작용 효과, 오차와 관련된 분산의 구성 요소들을 구분하는 데 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 총괄(순열)검정
      install.packages(&quot;lmPerm&quot;)
      library(lmPerm)

      aovp(formula, data = NULL, perm=&quot;Exact&quot;, seqs=FALSE, 
                    center=TRUE, projections = FALSE, qr = TRUE,
                    contrasts = NULL, ...)

      # F 통계량
      aov(formula, data = NULL, projections = FALSE, qr = TRUE,
          contrasts = NULL, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;카이제곱검정&lt;/h3&gt;
&lt;p&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;카이제곱검정(chi-square test): 횟수 관련 데이터에 주로 사용되며 예상되는 분포에 얼마나 잘 맞는지를 검정한다.&lt;/li&gt;
&lt;li&gt;카이제곱통계량(chi-square statistic): 기댓값으로부터 어떤 관찰값까지의 거리를 나타내는 측정치&lt;/li&gt;
&lt;li&gt;기댓값(expectation(expected)): 어떤 가정(보통 귀무가설)으로부터 데이터가 발생할 때, 그에 대해 기대하는 정도&lt;/li&gt;
&lt;li&gt;피셔의 정확검정(Fisher's exact test): 사건 발생 횟수가 매우 낮을 때, 재표본추출 방법을 통해 더 정확한 p 값을 얻는 검정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;카이제곱분포는 카이제곱통계량을 비교할 기준 분포(독립성 가정 포함)이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 카이제곱통계량
      chisq.test(x, y = NULL, correct = TRUE,
                 p = rep(1/length(x), length(x)), rescale.p = FALSE,
                 simulate.p.value = FALSE, B = 2000)

      # 피셔의 정확검정
      fisher.test(x, y = NULL, workspace = 200000, hybrid = FALSE,
                  hybridPars = c(expect = 5, percent = 80, Emin = 1),
                  control = list(), or = 1, alternative = &quot;two.sided&quot;,
                  conf.int = TRUE, conf.level = 0.95,
                  simulate.p.value = FALSE, B = 2000)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티암드 밴딧 알고리즘&lt;/h3&gt;
&lt;p&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;멀티암드 밴딧(multi-armed bandit): 고객이 선택할 수 있는 손잡이가 여러 개인 가상의 슬롯머신을 말하며, 각 손잡이는 각기 다른 수익을 가져다 준다. 다중 처리 실험에 대한 비유라고 생각할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엡실론-그리디 알고리즘(epsilon-greedy algorithm)
&lt;ol&gt;
&lt;li&gt;0부터 1 사이의 난수를 생성한다.&lt;/li&gt;
&lt;li&gt;이 숫자가 0과 엡실론(0과 1 사이의 값으로 일반적으로 아주 작다) 사이에 존재하면, 50/50 확률로 동전 뒤집기를 시행한다.
&lt;ol&gt;
&lt;li&gt;그 결과 동전이 앞면이면 제안 A를 표시한다.&lt;/li&gt;
&lt;li&gt;동전이 뒷면이면 제안 B를 표시한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;숫자가 엡실론보다 크면, 지금까지 가장 좋은 결과를 보인 제안을 표시한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐욕 알고리즘(greedy algorithm): 엡실론이 0인 경우. 더 이상의 실험 없이, 피실험자들을 항상 지금까지 알려진 가장 좋은 제안에 할당한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;톰슨의 샘플링(Thompson's sampling)알고리즘
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;베이지언 방식을 사용. 즉 베타 분포(beta distribution)(베이지언 문제에서 사전 정보를 지정하는 일반적인 메커니즘)를 사용하여 수익의 일부 사전 분포를 가정한다. 각 추출 정보가 누적되면서 정보가 업데이트되기 때문에, 다음번에 최고 손잡이를 선택할 확률을 효과적으로 최적화할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;손잡이(arm): 실험에서 어떤 하나의 처리를 말한다(예를 들면 '웹 테스트에서 헤드라인 A').&lt;/li&gt;
&lt;li&gt;상금(수익)(win): 슬롯머신으로 딴 상금에 대한 실험적 비유(예를 들면 '고객들의 링크 클릭 수')&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;전통적 A/B 검정은 임의표집 과정을 기본으로 하기 때문에, 수익이 낮은 것을 너무 많이 시도할 수 있다.&lt;/li&gt;
&lt;li&gt;이와 대조적으로 MAB는 실험 도중에 얻는 정보를 통합하고 수익이 낮은 것의 빈도를 줄이는 쪽으로 표본 추출 과정을 변경한다.&lt;/li&gt;
&lt;li&gt;또한 두 가지 이상의 처리를 효과적으로 다룰 수 있다.&lt;/li&gt;
&lt;li&gt;추출 확률을 수익이 낮은 처리에서 수익이 높으리라 추정되는 쪽으로 이동시키기 위한 다양한 알고리즘이 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;검정력과 표본크기&lt;/h3&gt;
&lt;p&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;효과크기(effect size): '클릭률의 20% 향상'과 같이 통계 검정을 통해 판단할 수 있는 효과의 최소 크기&lt;/li&gt;
&lt;li&gt;검정력(power): 주어진 표본크기로 주어진 효과크기를 알아낼 확률&lt;/li&gt;
&lt;li&gt;유의수준(significance level): 검증 시 사용할 통계 유의수준준&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;알아내고자 하는 효과의 최소 크기를 지정해야 한다.&lt;/li&gt;
&lt;li&gt;또한 효과크기를 알아내기 위해 요구되는 확률(검정력)을 지정해야 한다.&lt;/li&gt;
&lt;li&gt;마지막으로, 수행할 가설검정에 필요한 유의수준을 정해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 표본크기
      install.packages(&quot;pwr&quot;)
      library(pwr)

      pwr.2p.test(h = NULL, n = NULL, sig.level = 0.05, power = NULL, 
                  alternative = c(&quot;two.sided&quot;,&quot;less&quot;,&quot;greater&quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;회귀와 예측&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단순선형회귀&lt;/h3&gt;
&lt;p&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;응답변수(반응변수)(response variable): 예측하고자 하는 변수 (유의어 : 종속변수, 변수 Y, 목표, 출력)&lt;/li&gt;
&lt;li&gt;독립변수(independent variable): 응답치를 예측하기 위해 사용되는 변수 (유의어 : 변수 X, 피처, 속성)&lt;/li&gt;
&lt;li&gt;레코드(record): 한 특정 경우에 대한 입력과 출력을 담고 있는 벡터 (유의어 : 행, 사건, 예시(instance), 예제(example))&lt;/li&gt;
&lt;li&gt;절편(intercept): 회귀직선의 절편. 즉, X = 0일 때 예측값 (유의어 : ${b}&lt;i&gt;{0}$, ${\beta}&lt;/i&gt;{0}$)&lt;/li&gt;
&lt;li&gt;회귀계수(regression coefficient): 회귀직선의 기울기 (유의어 : 기울기(slope), ${b}&lt;i&gt;{1}$, ${\beta}&lt;/i&gt;{1}$, 모수 추정값, 가중치)&lt;/li&gt;
&lt;li&gt;적합값(fitted value): 회귀선으로부터 얻은 추정치 ${\hat{Y}}_{i}$ (유의어 : 예측값)&lt;/li&gt;
&lt;li&gt;잔차(residual): 관측값과 적합값의 차이 (유의어 : 오차)&lt;/li&gt;
&lt;li&gt;최소제곱(least square): 잔차의 제곱합을 최소화하여 회귀를 피팅하는 방법 (유의어 : 보통최소제곱)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;회귀방정식은 응답변수 Y와 예측변수 X 간의 관계를 선형함수로 모델링한다.&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 선형회귀
      lm(formula, data, subset, weights, na.action,
         method = &quot;qr&quot;, model = TRUE, x = FALSE, y = FALSE, qr = TRUE,
         singular.ok = TRUE, contrasts = NULL, offset, ...)

      # 적합값
      predict (object, ...)

      # 잔차
      residuals(object, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다중선형회귀&lt;/h3&gt;
&lt;p&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;제곱근 평균제곱오차(root mean squared error): 회귀 시 평균제곱오차의 제곱근. 회귀모형을 평가하는 데 가장 널리 사용되는 측정 지표다. (유의어 : RMSE)&lt;/li&gt;
&lt;li&gt;잔차 표준오차(residual standard error): 평균제곱오차와 동일하지만 자유도에 따라 보정된 값 (유의어 : RSE)&lt;/li&gt;
&lt;li&gt;R 제곱(r-squared): 0에서 1까지 모델에 의해 설명된 분산의 비율 (유의어 : 결정계수(coefficient of determination)R^2))&lt;/li&gt;
&lt;li&gt;t 통계량(t-statistic): 계수의 표준오차로 나눈 예측변수의 계수. 모델에서 변수의 중요도를 비교하는 기준이 된다.&lt;/li&gt;
&lt;li&gt;가중회귀(weighted regression): 다른 가중치를 가진 레코드들을 회귀하는 방법&lt;/li&gt;
&lt;li&gt;교차타당성검사(cross-validation): 홀드아웃 샘플 아이디어를 여러 개의 연속된 홀드아웃 샘플로 확장한 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k 다중 교차타당성검사(k-fold cross-validation)알고리즘
&lt;ol&gt;
&lt;li&gt;1/k의 데이터를 홀드아웃 샘플로 따로 떼어놓는다.&lt;/li&gt;
&lt;li&gt;남아 있는 데이터로 모델을 훈련시킨다.&lt;/li&gt;
&lt;li&gt;모델을 1/k 홀드아웃에 적용 (점수를 매김)하고 필요한 모델 평가 지표를 기록한다.&lt;/li&gt;
&lt;li&gt;데이터의 첫 번째 1/k을 복원하고 다음 1/k (앞에서 선택했던 레코드는 제외)을 따로 보관한다.&lt;/li&gt;
&lt;li&gt;2~3단계를 반복한다.&lt;/li&gt;
&lt;li&gt;모든 레코드가 홀드아웃 샘플로 사용될 때까지 반복한다.&lt;/li&gt;
&lt;li&gt;모델 평가 지표들을 평균과 같은 방식으로 결합한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;폴드(fold): 훈련을 위한 샘플과 홀드아웃 샘플로 데이터를 나누는 것&lt;/li&gt;
&lt;li&gt;전진선택(forward selection): 예측변수 없이 시작하여 각 단계에서 R^2)에 가장 큰 기여도를 갖는 예측변수를 하나씩 추가하고 기여도가 통계적으로 더 이상 유의미하지 않을 때 중지하는 것&lt;/li&gt;
&lt;li&gt;후진선택(backward selection)또는 후진제거(backward elimination): 전체 모델로 시작해서, 모든 예측변수가 통계적으로 유의미한 모델이 될 때까지, 통계적으로 유의하지 않은 예측변수들을 제거해 나가는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;다중선형회귀 모델은 한 응답변수 Y와 여러 개의 예측변수(${X}&lt;i&gt;{1}, ..., {X}&lt;/i&gt;{p}$) 간의 관계를 나타낸다.&lt;/li&gt;
&lt;li&gt;모델을 평가하는 가장 중요한 지표는 제곱근 평균제곱오차(RMSE)와 R 제곱(R^2)이다.&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 회귀모형, RSE 등 지표 계산
      # Default S3 method:
      summary(object, ..., digits, quantile.type = 7)
      ## S3 method for class 'data.frame'
      summary(object, maxsum = 7,
             digits = max(3, getOption(&quot;digits&quot;)-3), ...)

      ## S3 method for class 'factor'
      summary(object, maxsum = 100, ...)

      ## S3 method for class 'matrix'
      summary(object, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회귀를 이용한 예측&lt;/h3&gt;
&lt;p&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;예측구간(prediction interval): 개별 예측값 주위의 불확실한 구간&lt;/li&gt;
&lt;li&gt;외삽법(extrapolation): 모델리에 사용된 데이터 범위를 벗어난 부분까지 모델을 확장하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;신뢰구간은 회귀계수 주변의 불확실성을 정량화한다.&lt;/li&gt;
&lt;li&gt;예측구간은 개별 예측값의 불확실성을 정량화한다.&lt;/li&gt;
&lt;li&gt;R을 포함한 대부분의 소프트웨어는 수식을 사용하여 예측/신뢰구간을 기본 또는 지정된 출력으로 생성한다.&lt;/li&gt;
&lt;li&gt;수식 대신 부트스트랩을 사용할 수도 있다. 해석과 개념은 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회귀에서의 요인변수&lt;/h3&gt;
&lt;p&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;가변수(dummy variable): 회귀나 다른 모델에서 요인 데이터를 사용하기 위해 0과 1의 이진변수로 부호화한 변수&lt;/li&gt;
&lt;li&gt;기준 부호화(reference coding): 통계학자들이 많이 사용하는 부호화 형태. 여기서 한 요인을 기준으로 하고 다른 요인들이 이 기준에 따라 비교할 수 있도록 한다. (유의어 : 처리 부호화(treatment coding))&lt;/li&gt;
&lt;li&gt;원-핫 인코딩(one-hot encoding): 머신러닝 분야에서 많이 사용되는 부호화. 모든 요인 수준이 계속 유진된다. 어떤 머신러닝 알고리즘에서는 유용한 반면. 다중선형회귀에는 적합하지 않다.&lt;/li&gt;
&lt;li&gt;편차 부호화(deviation coding): 기준 수준과는 반대로 전체 평균에 대해 각 수준을 비교하는 부호화 방법 (유의어 : 총합 대비(sum contrast))&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;요인변수를 P개의 개별 값으로 인코딩하기 위한 가장 흔한 방법은 P-1개의 가변수를 만들어 사용하는 것이다.&lt;/li&gt;
&lt;li&gt;다수의 수준을 갖는 요인변수의 경우, 더 적은 수의 수준을 갖는 변수가 되도록 수준들을 통합해야 한다.&lt;/li&gt;
&lt;li&gt;순서를 갖는 요인변수의 경우, 수치형 변수로 변환하여 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 원-핫 인코딩
      model.matrix(~PropertyType -1, data=house)
      ## -1이라는 인수는 원-핫 인코딩 표시법을 사용한다는 의미이다.(- 기호는 절편을 삭제한다는 것을 뜻한다.)
      ## 이렇게 하지 않으면 기본 설정대로, 첫 요인을 기준으로 삼는 P-1개 열로 이루어진 행렬을 출력한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회귀방정식 해석&lt;/h3&gt;
&lt;p&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;변수 간 상관(correlated variables): 예측변수들끼리 서로 높은 상관성을 갖을 때, 개별 계수를 해석하는 것은 어렵다.&lt;/li&gt;
&lt;li&gt;다중공선성(multicollineartiy): 예측변수들이 완벽하거나 거의 완벽에 가까운 상관성을 갖는다고 할 때, 회귀는 불안정하며 계산이 불가능하다. (유의어 : 공선성(collinearity))
&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;요인변수로부터 p-1개가 아닌 p개의 가변수가 만들어진 경우&lt;/li&gt;
&lt;li&gt;두 변수가 서로 거의 완벽하게 상관성이 있는 경우우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;교란변수(confounding variable): 중요한 예측변수이지만 회귀방정식에 누라되어 결과를 잘못되게 이끄는 변수&lt;/li&gt;
&lt;li&gt;주효과(main effect): 다른 변수들과 독립된, 하나의 옉변수와 결과변수 사이의 관계&lt;/li&gt;
&lt;li&gt;상호작용(interaction): 둘 이상의 예측변수와 응답변수 사이의 상호 의존적인 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;상호작용 항들을 이용한 모델 선택&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;다수의 변수가 존재하는 문제의 경우, 모델에서 어떤 상호자용을 고려해야 할지 결정하기가 매우 어렵다. 이러한 문제에 접근하는 몇 가지 방법에 대해 알아보자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 문제에서는 사전 지식이나 직관이 이러한 상호작용을 결정하는 데 큰 도움이 된다.&lt;/li&gt;
&lt;li&gt;단계적 선택을 사용해서 다양한 모델들을 걸러낼 수 있다.&lt;/li&gt;
&lt;li&gt;벌점을 부여하는 방식의 회귀 방법을 사용하여 자동으로 가능한 상호작용들을 최대한 가려내도록 한다.&lt;/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;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;다중공선성은 회귀방정식을 피팅할 때, 수치 불안정성을 유발할 수 있다.&lt;/li&gt;
&lt;li&gt;교란변수란 모델에서 생략된 중요한 예측변수를 의미하며, 이에 따라 실제로 관계가 없는데 허위로 있는 것처럼 회귀 결과가 나올 수 있다.&lt;/li&gt;
&lt;li&gt;변수와 결과가 서로 의존적일 때, 두 변수 사이의 상호작용을 고려할 필요가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가정 검정: 회귀 진단&lt;/h3&gt;
&lt;p&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;표준화잔차(standardized residual): 잔차를 표준오차로 나눈 값&lt;/li&gt;
&lt;li&gt;특잇값(outlier): 나머지 데이터(혹은 예측값)와 멀리 떨어진 레코드(혹은 출력값)&lt;/li&gt;
&lt;li&gt;영향값(influential value): 있을 때와 없을 때 회귀방정식이 큰 차이를 보이는 값 혹은 레코드&lt;/li&gt;
&lt;li&gt;지렛대(레버리지)(leverage): 회귀식에 한 레코드가 미치는 영향력의 정도 (유의어 : 햇 값(hat-value))&lt;/li&gt;
&lt;li&gt;비정규 잔차(non-normal residual): 정규분포를 따르지 않는 잔차는 회귀분석의 요건을 무효로 만들 수 있다. 데이터 과학에서는 별로 중요하게 다뤄지지 않는다.&lt;/li&gt;
&lt;li&gt;이분산성(heterokedasticity): 어떤 범위 내 출력값의 잔차가 매우 높은 분산을 보이는 경향(어떤 예측변수를 회귀식이 놓치고 있다는 것을 의미할 수 있다.)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더빈-왓슨 통계량(Durbin-Watson statistic): 시계열 데이터를 다루는 회귀분석에서 유의미한 자기상관(autocorrelation)이 있는지를 탐지하는 데 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;편잔차그림(partial residual plot): 결과변수와 특정 예측변수 사이의 관계를 진단하는 그림 (유의어 : 추가변수 그림(added variable plot))&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;데이터 크기가 작을 때는 단일 레코드(회귀 특잇값 포함)가 회귀방정식에 큰 영향을 미치는 경우도 있다. 하지만 빅데이터에서는 이러한 효과가 대부분 사라진다.&lt;/li&gt;
&lt;li&gt;회귀모형을 일반적인 추론(p 값 등)을 위해 사용할 경우 잔차 분포에 대한 특정 가정을 확인해야 한다. 하지만 보통 데이터 과학에서 잔차의 분포는 그렇게 중요하지 않다.&lt;/li&gt;
&lt;li&gt;편잔차그림을 사용하여 각 회귀 항의 적합성을 정량적으로 평가할 수 있다. 즉 대체 모델에 대한 아이디어를 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 표준화잔차
      ## S3 method for class 'lm'
      rstandard(model, infl = lm.influence(model, do.coef = FALSE),
                sd = sqrt(deviance(model)/df.residual(model)),
                type = c(&quot;sd.1&quot;, &quot;predictive&quot;), ...)
      ## S3 method for class 'glm'
      rstandard(model, infl = influence(model, do.coef = FALSE),
                type = c(&quot;deviance&quot;, &quot;pearson&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;/h3&gt;
&lt;p&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;다항회귀(polynomial regression): 회귀모형에 다항식(제곱, 세제곱 등) 항을 추가한 방식&lt;/li&gt;
&lt;li&gt;스플라인 회귀(spline regression): 다항 구간들을 부드러운 곡선 형태로 피팅한다.&lt;/li&gt;
&lt;li&gt;매듭(knot): 스플라인 구간을 구분하는 값들&lt;/li&gt;
&lt;li&gt;일반화가법모형(generalized additive model): 자동으로 구간을 결정하는 스플라인 모델 (유의어 : GAM)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/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;/li&gt;
&lt;li&gt;일반화가법모형(GAM)은 스플라인의 매듭을 자동으로 결정하는 프로세스를 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 다항회귀
      poly(x, ..., degree = 1, coefs = NULL, raw = FALSE, simple = FALSE)

      # b-스플라인
      bs(x, df = NULL, knots = NULL, degree = 3, intercept = FALSE,
         Boundary.knots = range(x))

      # 일반화가법모형(GAM)
      gam(formula, family = gaussian, data, weights, subset, na.action,
          start, etastart, mustart, control = gam.control(...),
          model=TRUE, method, x=FALSE, y=TRUE, ...)

      gam.fit(x, y, smooth.frame, weights = rep(1,nobs), start = NULL,
              etastart = NULL, mustart = NULL, offset = rep(0, nobs), family = gaussian(),
              control = gam.control())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;분류&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;나이브 베이즈&lt;/h3&gt;
&lt;p&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;나이브 베이즈(naive Bayes)알고리즘 : 주어진 결과에 대해 예측변수 값을 관찰할 확률을 사용하여, 예측변수가 주어졌을 때, 결과 Y = i를 관찰할 확률을 추정한다.&lt;/li&gt;
&lt;li&gt;조건부확률(conditional probability): 어떤 사건(Y = i)이 주어졌을 때, 해당 사건(X = i)을 관찰할 확률 $P({X}&lt;i&gt;{i}|{X}&lt;/i&gt;{i})$&lt;/li&gt;
&lt;li&gt;사후확률(posterior probability): 예측 정보를 통합한 후 결과의 확률 (이와 달리, 사전확률에서는 예측변수에 대한 정보를 고려하지 않는다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 나이브 베이즈 모델
      install.packages(&quot;klaR&quot;)
      library(klaR)

      ## S3 method for class 'formula'
      NaiveBayes(formula, data, ..., subset, na.action = na.pass)
      ## Default S3 method:
      NaiveBayes(x, grouping, prior, usekernel = FALSE, fL = 0, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;판별분석&lt;/h3&gt;
&lt;p&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;공분산(covariance): 하나의 변수가 다른 변수와 함께 변화하는 정도(유사한 크기와 방향)를 측정하는 지표&lt;/li&gt;
&lt;li&gt;판별함수(discriminant function): 예측변수에 적용했을 때, 클래스 구분을 최대화하는 함수&lt;/li&gt;
&lt;li&gt;판별 가중치(discriminant weight): 판별함수를 적용하여 얻은 점수를 말하며, 어떤 클래스에 속할 확률을 추정하는 데 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;공분산행렬을 사용하여 한 클래스와 다른 클래스에 속한 데이터들을 구분하는 선형판별함수(linear discriminanat function)를 계산할 수 있다.&lt;/li&gt;
&lt;li&gt;이 함수를 통해 각 레코드가 어떤 클래스에 속할 가중치 혹은 점수(각 클래스당 점수)를 구한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 선형판별분석(LDA)
      install.packages(&quot;MASS&quot;)
      library(MASS)

      ## S3 method for class 'formula'
      lda(formula, data, ..., subset, na.action)

      ## Default S3 method:
      lda(x, grouping, prior = proportions, tol = 1.0e-4,
          method, CV = FALSE, nu, ...)

      ## S3 method for class 'data.frame'
      lda(x, ...)

      ## S3 method for class 'matrix'
      lda(x, grouping, ..., subset, na.action)
      Arguments&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로지스틱 회귀&lt;/h3&gt;
&lt;p&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;로지스틱 회귀(logistic regression): 결과가 이진형 변수라는 점만 빼면 다중선형회귀와 유사하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로지스틱 회귀는 선형회귀를 확장한 &lt;b&gt;일반화선형모형(GLM)&lt;/b&gt;의 특별한 사례이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확률분포 또는 분포군(로지스틱 회귀의 경우 이항분포)&lt;/li&gt;
&lt;li&gt;응답을 예측변수에 매핑하는 연결 함수(로지스틱 회귀의 경우 로짓)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로짓(logit): (0~1이 아니라) &amp;plusmn;&amp;infin;의 범위에서 어떤 클래스에 속할 확률을 결정하는 함수 (유의어 : 로그 오즈)&lt;/li&gt;
&lt;li&gt;오즈(odds): '실패'(0)에 대한 '성공'(1)의 비율&lt;/li&gt;
&lt;li&gt;로그 오즈(log odds): 변환 모델(선형)의 응답변수. 이 값을 통해 확률을 구한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&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;/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;모델을 피팅하는 방식(최소제곱을 사용할 수 없다) : 선형회귀 -&amp;gt; 최소제곱, 로지스틱 회귀 -&amp;gt; 최대우도추정(MLE)&lt;/li&gt;
&lt;li&gt;모델에서 잔차의 특징과 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;선형모형과 비슷한 형태의 모델을 만들기 위해, 응답변수로 오즈비의 로그값을 사용하는 등의 몇 가지 변환이 필요하다.&lt;/li&gt;
&lt;li&gt;반복 과정을 통해 선형모형을 피팅하고 나면, 로그 오즈비는 다시 확률값으로 변환된다.&lt;/li&gt;
&lt;li&gt;로지스틱 회귀는 계산 속도가 빠르고 새로운 데이터에 대해서도 빠르게 결과를 구할 수 있다는 장점 때문에 많이 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 로지스틱 호귀
      glm(formula, family = gaussian, data, weights, subset,
          na.action, start = NULL, etastart, mustart, offset,
          control = list(...), model = TRUE, method = &quot;glm.fit&quot;,
          x = FALSE, y = TRUE, singular.ok = TRUE, contrasts = NULL, ...)

      glm.fit(x, y, weights = rep(1, nobs),
              start = NULL, etastart = NULL, mustart = NULL,
              offset = rep(0, nobs), family = gaussian(),
              control = list(), intercept = TRUE, singular.ok = TRUE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;분류 모델 평가하기&lt;/h3&gt;
&lt;p&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;정확도(accuracy): 정확히 분류된 비율&lt;/li&gt;
&lt;li&gt;혼동행렬(confusion matrix): 분류에서 예측된 결과와 실제 결과에 대한 레코드의 개수를 표시한 테이블(이진형인 경우 2 X 2)&lt;/li&gt;
&lt;li&gt;민감도(sensitivity): 정확히 분류된 1의 비율 (유의어 : 재현율(recall))&lt;/li&gt;
&lt;li&gt;특이도(specificity): 정확히 분류된 0의 비율&lt;/li&gt;
&lt;li&gt;정밀도(precision): 정화히 1이라고 예측된 1의 비율(대응어 : 거짓 양성 비율(false positive ratio))&lt;/li&gt;
&lt;li&gt;ROC 곡선(ROC curve): 민감도와 특이성을 표시한 그림&lt;/li&gt;
&lt;li&gt;곡선 아래 면적(area underneath the curve)(AUC) : ROC 곡선의 아래쪽 면적. AUC 값이 높을수록 더 좋은 분류기라고 할 수 있다.&lt;/li&gt;
&lt;li&gt;리프트(lift): 모델이 다른 확률 컷오프에 대해 (비교적 드문) 1을 얼마나 더 효과적으로 구분하는지 나타내는 측정 지표&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;다른 평가 지표들(재현율, 특이도, 정밀도)은 좀 더 세부적인 성능 특성들을 나타낸다(예를 들면 재현율은 모델이 1을 얼마나 정확히 분류하는지를 나타낸다).&lt;/li&gt;
&lt;li&gt;AUC(ROC 곡선 아래 면적)는 모델의 1와 0을 구분하는 능력을 보여주기 위해 가장 보편적으로 사용되는 지표이다.&lt;/li&gt;
&lt;li&gt;이와 비슷하게, 리프트는 모델이 1을 얼마나 효과적으로 분류해내는지를 측정한다. 가장 1로 분류될 가능성이 높은 것부터 매 십분위마다 이를 계산한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;불균형 데이터 다루기&lt;/h3&gt;
&lt;p&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;과소표본(undersample): 분류 모델에서 개수가 많은 클래스 데이터 중 일부 소수만을 사용하는 것 (유의어 : 다운샘플)&lt;/li&gt;
&lt;li&gt;과잉표본(oversample): 분류 모델에서 희귀 클래스 데이터를 중복해서, 필요하면 부트스트랩 해서 사용하는 것 (유의 : 업샘플)&lt;/li&gt;
&lt;li&gt;상향 가중치(up weight)혹은 하향 가중치(down weight): 모델에서 희귀(혹은 다수) 클래스에 높은(혹은 낮은) 가중치를 두는 것&lt;/li&gt;
&lt;li&gt;데이터 생성(data generation): 부트스트랩과 비슷하게 다시 샘플링한 레코드를 빼고 원래 원본과 살짝 다르게 데이터를 생성하는 것&lt;/li&gt;
&lt;li&gt;z 점수(z-score): 표준화 결과&lt;/li&gt;
&lt;li&gt;K : 최근접 이웃 알고리즘에서 이웃들의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;한 방법은 다수의 데이터를 다운샘플링하거나 희귀한 데이터를 업샘플링해서 학습 데이터의 균형을 맞추는 것이다.&lt;/li&gt;
&lt;li&gt;갖고 있는 1의 데이터를 모두 사용해도 그 개수가 너무 적을 때는, 희귀한 데이터에 대해 부트스트랩 방식을 사용하거나 기존의 데이터와 유사한 합성 데이터를 만들기 위해 SMOTE를 사용한다.&lt;/li&gt;
&lt;li&gt;데이터에 불균형이 존재할 경우 보통은 어느 한쪽(1의 클래스)을 정확히 분류하는 것에 더 좋은 점수를 주게 되어 있고, 이러한 가치 비율이 평가 지표에 반영되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통계적 머신러닝&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;K 최근접 이웃&lt;/h3&gt;
&lt;p&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;K 최근접 이웃(K-nearest neighbors)(KNN) 알고리즘
&lt;ol&gt;
&lt;li&gt;특징들이 가장 유사한(즉, 예측변수들이 유사한) K개의 레코드를 찾는다.&lt;/li&gt;
&lt;li&gt;분류: 이 유사한 레코드들 중에 다수가 속한 클래스가 무엇인지 찾은 후에 새로운 레코드를 그 클래스에 할당한다.&lt;/li&gt;
&lt;li&gt;예측(KNN 회귀(KNN regression)라고도 함) : 유사한 레코드들의 평균을 찾아서 새로운 레코드에 대한 예측값으로 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;이웃(neighbor): 예측변수에서 값들이 유사한 레코드&lt;/li&gt;
&lt;li&gt;거리 지표(distance metric): 각 레코드 사이가 얼마나 멀리 떨어져 있는지를 나타내는 단일 값
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유클리드 거리(Euclidean distance): 두 점 사이의 직선 거리&lt;/li&gt;
&lt;li&gt;맨하탄 거리(Manhattan distance): 한 번에 대각선이 아닌 한 축 방향으로만 움직일 수 있다고 할 때, 두 점 사이의 거리. 점과 점 사이의 이동 시간으로 근접성을 따질 때 좋은 지표.&lt;/li&gt;
&lt;li&gt;마할라노비스 거리(Mahalanobis distance): 두 변수 간의 상관관계를 사용하여 거리 측정. 두 변수 사이에 높은 상관관계가 있다면 아주 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;표준화(standardization): 평균을 뺀 후에 표준편차로 나누는 일 (유의어 : 정규화)&lt;/li&gt;
&lt;li&gt;z 점수(Z-score): 표준화를 통해 얻은 값&lt;/li&gt;
&lt;li&gt;K : 최근접 이웃을 계산하는 데 사용되는 이웃의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;K 최근접 이웃(KNN) 방법이란 유사한 레코드들이 속한 클래스로 레코드를 분류하는 방법이다.&lt;/li&gt;
&lt;li&gt;유사성(거리)은 유클리드 거리나 다른 관련 지표들을 이용해 결정한다.&lt;/li&gt;
&lt;li&gt;가장 가까운 이웃 데이터의 개수를 의미하는 K는 학습 데이터에서 얼마나 좋은 성능을 보이는지를 가지고 결정한다.&lt;/li&gt;
&lt;li&gt;일반적으로 예측변수들을 표준화한다. 이를 통해 스케일이 큰 변수들의 영향력이 너무 커지지 않도록 한다.&lt;/li&gt;
&lt;li&gt;예측 모델링의 첫 단계에서 종종 KNN을 사용한다. 이렇게 얻은 값을 다시 데이터에 하나의 예측변수로 추가해서 두 번째 단계의 (KNN이 아닌) 모델링을 위해 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# KNN
      knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;트리 모델&lt;/h3&gt;
&lt;p&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;트리 모델(tree model): 회귀 및 분석 트리(classification and regression tree)(CART), 의사 결정 트리(decision tree), 혹은 단순히 그냥 트리(tree)라고도 불리며, 효과적이고 대중적인 분류(및 회귀) 방법이다.&lt;/li&gt;
&lt;li&gt;재귀 분할(recursive partitioning): 마지막 분할 영역에 해당하는 출력이 최대한 비슷한(homogeneous)결과를 보이도록 데이터를 반복적으로 분할하는 것&lt;/li&gt;
&lt;li&gt;분할값(split value): 분할값을 기준으로 예측변수를 그 값보다 작은 영역과 큰 영역으로 나눈다.&lt;/li&gt;
&lt;li&gt;마디(노드)(node): 의사 결정 트리와 같은 가지치기 형태로 구성된 규칙들의 집합에서, 노드는 분할 규칙의 시작적인 표시라고 할 수 있따.&lt;/li&gt;
&lt;li&gt;잎(leaf): if-then 규칙의 가장 마지막 부분, 혹은 트리의 마지막 가지(branch)부분을 의미한다. 트리 모델에서 잎 노드는 어떤 레코드에 적용할 최종적인 분류 규칙을 의미한다.&lt;/li&gt;
&lt;li&gt;손실(loss): 분류하는 과정에서 발생하는 오분류의 수. 손실이 클수록 불순도가 높다고 할 수 있다.&lt;/li&gt;
&lt;li&gt;불순도(impurity): 데이터를 분할한 집합에서 서로 다른 클래스의 데이터가 얼마나 섞여 있는지를 나타낸다. 더 많이 섞여 있을수록 불순도가 높다고 할 수 있다. (유의어 : 이질성(heterogeneity), 반의어 : 동질성(homogeneity), 순도)&lt;/li&gt;
&lt;li&gt;가지치기(pruning): 학습이 끝난 트리 모델에서 오버피팅을 줄이기 위해 가지들을 하나씩 잘라내는 과정정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/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;/li&gt;
&lt;li&gt;랜덤 포레스트나 부스팅 트리 같은 다중 트리 알고리즘은 우수한 예측 성능을 보장한다. 하지만 규칙에 기반을 둔 단일 트리 방법의 장점이라고 할 수 있는 전달 능력은 잃어버린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 트리 모델
      rpart(formula, data, weights, subset, na.action = na.rpart, method,
            model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배깅과 랜덤 포레스트&lt;/h3&gt;
&lt;p&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;앙상블(ensemble): 여러 모델의 집합을 이용해서 하나의 예측을 이끌어내는 방식 (유의어 : 모델 평균화(model averaging))
&lt;ol&gt;
&lt;li&gt;주어진 데이터에 대해 예측 모델을 만들고 예측 결과를 기록한다.&lt;/li&gt;
&lt;li&gt;같은 데이터에 대해 여러 모델을 만들고 결과를 기록한다.&lt;/li&gt;
&lt;li&gt;각 레코드에 대해 예측된 결과들의 평균(또는 가중평균, 다수결 투표)을 구한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;배깅(bagging): 데이터를 부트스트래핑해서 여러 모델을 만드는 일반적인 방법 (유의어 : 부트스트랩 종합(bootstrap aggregation))
&lt;ol&gt;
&lt;li&gt;만들 모델의 개수 M과 모델을 만드는 데 사용할 레코드의 개수 n(n &amp;lt; N)의 값을 초기화한다. 반복 변수 m = 1로 놓는다.&lt;/li&gt;
&lt;li&gt;훈련 데이터로부터 복원추출 방법으로 n개의 부분 데이터 Y&lt;del&gt;m&lt;/del&gt;과 X&lt;del&gt;m&lt;/del&gt;을 부트스트랩 재표본 추출한다.&lt;/li&gt;
&lt;li&gt;의사 결정 규칙 ${\hat{f}}_{m}(X)$를 얻기 위해, Y&lt;del&gt;m&lt;/del&gt;과 X&lt;del&gt;m&lt;/del&gt;을 이용해 모델을 학습한다.&lt;/li&gt;
&lt;li&gt;m = m + 1로 모델 개수를 늘린다. m &amp;lt;= M 이면 다시 1단계로 간다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;랜덤 포레스트(random forest): 의사 결정 트리 모델에 기반을 둔 배깅 추정 모델 (유의어 : 배깅 의사결정 트리)&lt;/li&gt;
&lt;li&gt;변수 중요도(variable importance): 모델 성능에 미치는 예측변수의 중요도&lt;/li&gt;
&lt;li&gt;하이퍼파라미터(hyperparameter): 랜덤 포레스트 성능 조절 값. 알고리즘을 피팅하기 전에 미리 세팅해야 하는 파라미터.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nodesize : 말단 노드(나무에서 잎 부분)의 크기를 의미한다. 분류 문제를 위한 기본 설정은 1이며, 회귀 문제에서는 5이다.&lt;/li&gt;
&lt;li&gt;maxnodes : 각 결정 트리에서 전체 노드의 최대 개수를 의미한다. 기본적으로는 제한이 없도 다만 nodesize 제한 설정에 따라 가장 큰 트리의 크기가 결정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부스팅&lt;/h3&gt;
&lt;p&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;부스팅(boosting): 연속된 라운드마다 잔차가 큰 레코드들에 가중치를 높여 일련의 모델들을 생성하는 일반적인 기법&lt;/li&gt;
&lt;li&gt;에이다부스트(AdaBoost): 잔차에 따라 데이터의 가중치를 조절하는 부스팅의 초기 버전&lt;/li&gt;
&lt;li&gt;그레디언트 부스팅(gradient boosting): 비용함수(cost function)를 최소화하는 방향으로 부스팅을 활용하는 좀 더 일반적인 형태&lt;/li&gt;
&lt;li&gt;확률적 그레디언트 부스팅(stochastic gradient boosting): 각 라운드마다 레코드와 열을 재표본추출하는 것을 포함하는 부스팅의 가장 일반적인 형태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;XG부스트(XGBoost): 대중적으로 가장 많이 사용되는 확률적 그레이디언트 부스팅 오픈소스 소프트웨어.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정규화(regularization): 비용함수에 모델의 파라미터 개수에 해당하는 벌점 항을 추가해 오버피팅을 피하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;확률적 그레이디언트 부스팅은 부스팅 가운데에서 가장 일반적으로 사용되며 가장 좋은 성능을 보인다. 확률적 그레이디언트 부스팅의 가장 일반적인 형태는 트리 모델을 사용한다.&lt;/li&gt;
&lt;li&gt;XG부스트는 확률적 그레이디언트 부스팅을 사용하기 위한 가장 유명한 소프트웨어 패키지이다. 데이터 과학에서 활용되는 거의 대부분의 언어를 지원한다.&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;비지도 학습&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주성분분석&lt;/h3&gt;
&lt;p&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;비지도 학습(unsupervised learning): 레이블이 달린 데이터를 이용해 모델을 학습하는 과정없이 데이터로부터 의미를 이끌어내는 통계적 기법들을 의미한다.&lt;/li&gt;
&lt;li&gt;주성분(principal component): 예측변수들의 선형결합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주성분분석(principal components analysis)(PCA) : 수치형 변수가 어떤 식으로 공변하는지 알아내는 기법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부하(loading): 예측변수들을 성분으로 변형할 때 사용되는 가중치 (유의어 : 가중치)&lt;/li&gt;
&lt;li&gt;스크리그래프(screeplot): 성분들의 변동을 표시한 그림. 성분들의 상대적인 중요도를 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;주성분들은 서로 간의 상관관계가 최소화되며 중복성이 줄어들도록 한다.&lt;/li&gt;
&lt;li&gt;제한된 개수의 주성분들로도 결과변수에서 대부분의 변동을 설명할 수 있다.&lt;/li&gt;
&lt;li&gt;제한된 개수의 주성분들을 원래의 예측변수를 대신하여 차원이 감소된 형태로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;K 평균 클러스터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;클러스터(군집)(cluster): 서로 유사한 레코드들의 집합&lt;/li&gt;
&lt;li&gt;클러스터 평균(cluster mean): 한 클러스터 안에 속한 레코드들의 평균 벡터 변수&lt;/li&gt;
&lt;li&gt;K : 클러스터의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;사용자가 원하는 클러스터 개수 K를 선택한다.&lt;/li&gt;
&lt;li&gt;K 평균 알고리즘은 더 이상 클러스터가 변하지 않을 때까지 반복해서 클러스터 평균이 가장 가까운 클러스터에 레코드를 할당한다.&lt;/li&gt;
&lt;li&gt;실무적인 고려 사항을 활용해 K를 선택하는 것이 가장 일반적이다. 통계적으로 최적의 클러스터 개수를 구하는 방법은 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# K 평균 클러스터링
      kmeans(x, centers, iter.max = 10, nstart = 1,
             algorithm = c(&quot;Hartigan-Wong&quot;, &quot;Lloyd&quot;, &quot;Forgy&quot;, &quot;MacQueen&quot;), trace=FALSE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;계층적 클러스터링&lt;/h3&gt;
&lt;p&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;계층적 클러스터링(hierarchical clustering): K 평균보다 유연하고, 수치형 변수가 아니어도 쉽게 적용이 가능하다. 특잇점이나 비정상적인 그룹이나 레코드를 발견하는 데 더 민감하다. 직관적인 시각화가 가능하여 클러스터를 해석하기가 수월하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;병합(agglomerative)알고리즘 : 유사한 클러스터들을 반복적으로 병합하는 역할을 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;덴드로그램(dendrogram): 레코드들, 그리고 레코드들이 속한 계층적 클러스터에 대한 시각적으로 표현&lt;/li&gt;
&lt;li&gt;거리(distance): 한 레코드가 다른 레코드들과 얼마나 가까운지를 보여주는 측정 지표&lt;/li&gt;
&lt;li&gt;비유사도(dissimilarity): 한 클러스터가 다른 클러스터들과 얼마나 가까운지를 보여주는 측정 지표
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비유사도 측정 지표 : 완전연결, 단일연결(single linkage), 평균연결(average linkage), 최소분산(minimum variance)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;클러스터들은 모든 레코드가 하나의 클러스터에 속할 때까지 가까운 클러스터와 계속해서 연결된다(병합 알고리즘).&lt;/li&gt;
&lt;li&gt;병합 과정은 내역이 남고 시각화할 수 있으며, 사용자가 미리 클러스터 수를 지정하지 않더라도 여러 단계에서 클러스터의 수와 구조를 시각화할 수 있다.&lt;/li&gt;
&lt;li&gt;클러스터 간 거리는 모든 레코드 간 거리 정보를 사용하여 여러 가지 다른 방식으로 계산할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 기반 클러스터링&lt;/h3&gt;
&lt;p&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;모델 기반 클러스터링(model-based clustering):전반적으로는 서로 비슷하지만 모든 데이터가 반드시 서로 가까울 필요는 없는 그룹고 서로 비슷하면서 데이터들이 아주 가까이에 있는 또 다른 그룹이 합께 있는 경우에 사용&lt;/li&gt;
&lt;li&gt;다변량정규분포(multivariate normal distribution): p개의 변수 집합 ${X}&lt;i&gt;{1}, {X}&lt;/i&gt;{2}, ...,{X}_{p}$에 대해 정규분포를 일반화한 것.&lt;/li&gt;
&lt;li&gt;베이즈 정보기준(Bayesian information criteria)(BIC) : 후보가 될 만한 모델 집합 중에서 가장 좋은 모델을 찾는 일반적인 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;분포(일반적으로 정규분포) 개수에 대한 가정에 따라 서로 다른 적합한 모델이 있다.&lt;/li&gt;
&lt;li&gt;이 방법은 너무 많은 파라미터(오버피팅의 원인이 될 수 있다)를 사용하지 않으면서도 데이터에 적합한 모델(그리고 연관된 클러스터 개수)을 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스케일링과 범주형 변수&lt;/h3&gt;
&lt;p&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;스케일링(scaling): 데이터의 범주를 늘리거나 줄이는 방식으로 여러 변수들이 같은 스케일에 오도록 하는 것&lt;/li&gt;
&lt;li&gt;정규화(normalization): 원래 변수 값에서 평균을 뺀 후에 표준편차로 나누는 방법으로, 스케일링의 일종이다. (유의어 : 표준화)&lt;/li&gt;
&lt;li&gt;고워 거리(Gower's distance): 수치형과 범주형 데이터가 섞여 있는 경우에 모든 변수가 0~1 사이로 오도록 하는 스케일링 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/li&gt;
&lt;li&gt;일반적인 스케일링 방법은 각 변수에서 평균을 빼고 표준편차로 나눠주는 정규화(표준화) 방법이다.&lt;/li&gt;
&lt;li&gt;또 다른 방법은 고워 거리를 사용하는 것이다. 이 방법은 모든 변수를 0~1 범위로 스케일링한다(수치형과 범주형 데이터가 서로 혼합된 경우에 많이 사용된다).&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT</category>
      <category>데이터분석</category>
      <category>통계</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/77</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%BC%ED%95%99%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%86%B5%EA%B3%84#entry77comment</comments>
      <pubDate>Sun, 4 Oct 2020 02:36:12 +0900</pubDate>
    </item>
    <item>
      <title>[정리] 이것이 리눅스다 (2장~6장)</title>
      <link>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EC%9D%B4%EA%B2%83%EC%9D%B4-%EB%A6%AC%EB%88%85%EC%8A%A4%EB%8B%A4-%EA%B0%95%EC%9D%98-2%EC%9E%A56%EC%9E%A5</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2016년 1월 7일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/o_E9Wo97SHk?list=PLVsNizTWUw7EoFNBhIdVFp9eT6P22hU1o&quot;&gt;'이것이 리눅스다' 유투브 강의&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 포스트에 포함된 내용(2장~6장)&lt;/h2&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;vi 에디터, CDDVD 마운트&lt;/li&gt;
&lt;li&gt;리눅스 기본 명령어&lt;/li&gt;
&lt;li&gt;사용자 및 그룹 관리&lt;/li&gt;
&lt;li&gt;파일의 소유권허가권, 링크&lt;/li&gt;
&lt;li&gt;RPM 사용법, YUM 기본 사용법&lt;/li&gt;
&lt;li&gt;YUM 고급 사용법&lt;/li&gt;
&lt;li&gt;파일 압축과 묶기, CRON과 AT&lt;/li&gt;
&lt;li&gt;네트워크 관련 개념과 명령어, SELinux&lt;/li&gt;
&lt;li&gt;파이프필터 , 프로세스, 서비스소켓&lt;/li&gt;
&lt;li&gt;응급복구, GRUB, 커널 컴파일&lt;/li&gt;
&lt;li&gt;X 윈도 테마, GRUB 배경 화면&lt;/li&gt;
&lt;li&gt;IDE/SCSI 장치 구성, 하드디스크 1개 추가&lt;/li&gt;
&lt;li&gt;RAID 개념과 종류&lt;/li&gt;
&lt;li&gt;디스크 9개 장착, LinearRAID 구현&lt;/li&gt;
&lt;li&gt;RAID 0, RAID 1, RAID 5 구현&lt;/li&gt;
&lt;li&gt;RAID 6, RAID 1+0 구현&lt;/li&gt;
&lt;li&gt;LVM 개념과 구현&lt;/li&gt;
&lt;li&gt;사용자별 공간 할당(쿼터)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2장 CentOS 리눅스 소개&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;1991년 '리누스 토르발스'가 버전 0.01을 최초로 작성.&lt;/li&gt;
&lt;li&gt;1992년 0.02 버전을 공개하면서 시작됨.&lt;/li&gt;
&lt;li&gt;리누스 토르발스는 커널(Kernel)만 개발함.&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;하드웨어 &amp;lt; 커널 &amp;lt; 쉘 &amp;lt; 응용 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GNU 프로젝트&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1984년에 라차드 스톨만에 의해서 GNU 프로젝트가 시작&lt;/li&gt;
&lt;li&gt;목표는 '모두가 공유할 수 있는 소프트웨어'를 만드는 것&lt;/li&gt;
&lt;li&gt;리차드 스톨만은 1985년에 자유 소프트웨어 재단(FSF, Free Software Foundation)을 설립&lt;/li&gt;
&lt;li&gt;목표는 GNU 프로젝트에서 제작한 소프트웨어를 지원함으로써 컴퓨터 프로그램의 복제, 변경, 소스 코드의 사용에 대한 제한을 철폐하는 것.&lt;/li&gt;
&lt;li&gt;GPL(General Public License)을 따름, 이 라이선스는 자유 소프트웨어(Free Software)의 수정과 공유의 자유를 보장함.&lt;/li&gt;
&lt;li&gt;프리웨어(Freeware, 무료 소프트웨어)라는 개념을 뛰어넘어서 진정한 자유에 대한 개념.&lt;/li&gt;
&lt;li&gt;자유 소프트웨어는 심지어 무료로 얻은 소프트웨어를 유상으로 판매할 자유도 보장.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;a href=&quot;http://www.kernel.org&quot;&gt;http://www.kernel.org&lt;/a&gt; 에서 최신버전 다운로드 가능&lt;/li&gt;
&lt;li&gt;커널 버전의 의미 (예: 3.17.4)
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3은 주 버전(Major Version)&lt;/li&gt;
&lt;li&gt;17은 부 버전(Minor Version)&lt;/li&gt;
&lt;li&gt;4는 패치 버전(Patch Version)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배포판에 포함된 기본 커널을 사용자가 직접 최신 커널로 업그레이드 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;레드햇 리눅스와 CentOS 리눅스&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전 세계적으로 가장 유명한 배포판 중 하나가 Red Hat사에서 제작한 'Red Hat Linux'.&lt;/li&gt;
&lt;li&gt;상용으로 판매되는 Red Hat Enterprise Linux(RHEL), 공개된 RHEL의 소스코드를 그대로 가져와서, 로고만 변경한 후에 다시 컴파일(또는 빌드)해서 만든 것이 CentOS.&lt;/li&gt;
&lt;li&gt;기업에서는 별도의 비용이 있다면 RHEL을 구매해서 사용하면 되며, 비용을 절감하고 싶다면 동일한 리눅스인 CentOS를 사용하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4장 서버를 구축할 때 알아야 할 필수 개념과 명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;Ctrl + Alt + F2 ~ F6&lt;/code&gt;.
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Alt + F1&lt;/code&gt;은 X윈도우 모드.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;터미널에서 &lt;code&gt;chvt 가상콘솔번호&lt;/code&gt;를 입력하여 이동 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;런 레벨(Runlevel)&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Runlevel 모드를 확인하려면 &lt;code&gt;/lib/systemd/system&lt;/code&gt; 디렉터리의 &lt;code&gt;runlevel?.target&lt;/code&gt; 파일을 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runlevel&lt;/th&gt;
&lt;th&gt;영문 모드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Power Off&lt;/td&gt;
&lt;td&gt;종료 모드&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Rescue&lt;/td&gt;
&lt;td&gt;시스템 복구 모드&lt;/td&gt;
&lt;td&gt;단일 사용자 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Multi-User&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;사용하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Multi-User&lt;/td&gt;
&lt;td&gt;텍스트 모드의 다중 사용자 모드&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Multi-User&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;사용하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Graphical&lt;/td&gt;
&lt;td&gt;그래픽 모드의 다중 사용자 모드&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Reboot&lt;/td&gt;
&lt;td&gt;재부팅 모드&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# ls -l /lib/systemd/system/runlevel?.target
    /lib/systemd/system/runlevel0.target -&amp;gt; poweroff.target
    /lib/systemd/system/runlevel1.target -&amp;gt; rescue.target
    /lib/systemd/system/runlevel2.target -&amp;gt; multi-user.target
    /lib/systemd/system/runlevel3.target -&amp;gt; multi-user.target
    /lib/systemd/system/runlevel4.target -&amp;gt; multi-user.target
    /lib/systemd/system/runlevel5.target -&amp;gt; graphical.target
    /lib/systemd/system/runlevel6.target -&amp;gt; reboot.target&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;현재 Runlevel 확인&lt;/h4&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# ls -l /etc/systemd/system/default.target
    /etc/systemd/system/default.target -&amp;gt; /lib/systemd/system/graphical.target&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Runlevel 변경(5 &amp;rarr; 3)&lt;/h4&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CD/DVD 마운트&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mkdir /media/cdrom    # 마운트할 디렉터리 생성
    [root@localhost ~]# mount /dev/cdrom /media/cdrom   # DVD장치를 생성한 디렉터리에 마운트
    [root@localhost ~]# umount /dev/cdrom   # 마운트 해제&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;링크&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일의 Link에는 Hard Link와 Symbolic Link(또는 Soft Link) 두 가지가 있다.&lt;/li&gt;
&lt;li&gt;Hard Link를 생성하면 Hard Link File만 하나 생성되며 같은 inode1을 사용.&lt;br /&gt;&lt;code&gt;# ln 링크대상파일이름 링크파일이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Symbolic Link를 생성하면 새로운 inode2를 만들고, 데이터는 원본 파일 포인터를 통해 원본 파일에 연결.&lt;br /&gt;&lt;code&gt;# ln -s 링크대상파일이름 링크파일이&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RPM(Redhat Package Manager)&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;gedit-3.8.3-6.el7.x86_64.rpm
    패키지이름-버전-릴리즈번호.CentOs버전.아키텍처.rpm&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;b&gt;gedit&lt;/b&gt; &amp;rarr; 패키지(프로그램)의 이름.&lt;/li&gt;
&lt;li&gt;버전: &lt;b&gt;3.8.3&lt;/b&gt; &amp;rarr; 대개 3자리수로 구성. 주버전, 부버전, 패치버전.&lt;/li&gt;
&lt;li&gt;릴리즈번호: &lt;b&gt;6&lt;/b&gt; &amp;rarr; 문제점을 개선할 때마다 붙여지는 번호.&lt;/li&gt;
&lt;li&gt;CentOS 버전: &lt;b&gt;el7&lt;/b&gt; &amp;rarr; CentOs에서 배포할 경우에 붙여짐.&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;&lt;b&gt;x86_64&lt;/b&gt; &amp;rarr; 64비트 CPU.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;i386_686&lt;/b&gt; &amp;rarr; 32비트 CPU.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;src&lt;/b&gt; &amp;rarr; 소스.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;noarch&lt;/b&gt; &amp;rarr; 모든 CPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RPM 명령어&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설치: &lt;code&gt;rpm -Uvh 패키지파일이름.rpm&lt;/code&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;U&lt;/b&gt; &amp;rarr; (대문자) 패키지 설치/업그레이드.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;v&lt;/b&gt; &amp;rarr; 설치 과정 확인.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;h&lt;/b&gt; &amp;rarr; 설치 과정을 &quot;#&quot; 마크로 화면에 출력.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삭제: &lt;code&gt;rpm -e 패키지이름&lt;/code&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;&lt;code&gt;rpm -qa 패키지이름&lt;/code&gt; &amp;rarr; 패키지가 설치되었는지 확인.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -qf 파일의절대경로&lt;/code&gt; &amp;rarr; 파일이 어느 패키지에 포함된 것인지 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;아직 설치되지 않은 rpm 파일에 대한 조회
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;rpm -qlp 패키지파일이름.rpm&lt;/code&gt; &amp;rarr; 패키지 파일에 어떤 파일들이 포함되었는지 확인.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -qip 패키지파일이름.rpm&lt;/code&gt; &amp;rarr; 패키지 파일의 상세정보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;YUM(Yellowdog Updater Modified)&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rpm 명령의 패키지 의존성 문제를 해결.&lt;/li&gt;
&lt;li&gt;인터넷을 통하여 필요한 파일을 저장소(Repository)에 자동으로 모두 다운로드해서 설치하는 방식.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;YUM 작동 방식&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;yum install 입력.&lt;/li&gt;
&lt;li&gt;/etc/yum.repos.d/ 디렉터리의 repo 파일을 열어서 URL 주소 확인.&lt;/li&gt;
&lt;li&gt;CentOS 7 패키지 저장소에서 전체 패키지 목록 파일 요청.&lt;/li&gt;
&lt;li&gt;전체 패키지 목록 파일만 다운로드.&lt;/li&gt;
&lt;li&gt;설치할 패키지와 관련된 패키지의 이름을 화면에 출력.&lt;/li&gt;
&lt;li&gt;y를 입력하면 설치에 필요한 패키지 파일을 저장소에 요청함.&lt;/li&gt;
&lt;li&gt;설치할 패키지 파일을 다운로드해서 자동 설치.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;YUM 명령어&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설치: &lt;code&gt;yum -y install 패키지이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;RPM 파일 설치: &lt;code&gt;yum localinstall rpm파일이름.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;업데이트 가능한 목록 보기: &lt;code&gt;yum check-update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;업데이트: &lt;code&gt;yum update 패키지이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;삭제: &lt;code&gt;yum remove 패키지이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;정보 확인: &lt;code&gt;yum info 패키지이름&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;YUM 고급 명령어&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패키지 그룹 설치: &lt;code&gt;yum groupinstall &quot;패키지그룹이름&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;패키지 리스트 확인: &lt;code&gt;yum list 패키지이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;특정 파일이 속한 패키지 이름 확인: &lt;code&gt;yum provides 파일이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GPG 키 검사 생략: &lt;code&gt;yum install --nogpgcheck rpm파일이름.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기존 저장소 목록 지우기: &lt;code&gt;yum clean all&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;repo 파일 활용&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설치 DVD에서 먼저 패키지를 찾고, 없다면 CentOS 패키지 저장소에서 패키지를 찾도록 수정.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# cd /etc/yum.repos.d/
    [root@localhost yum.repos.d]# ll
    합계 24
    -rw-r--r--. 1 root root 1669  1월  6 20:04 CentOS-Base.repo
    -rw-r--r--. 1 root root 1309  4월  1  2015 CentOS-CR.repo
    -rw-r--r--. 1 root root  649  4월  1  2015 CentOS-Debuginfo.repo
    -rw-r--r--. 1 root root 1331  4월  1  2015 CentOS-Sources.repo
    -rw-r--r--. 1 root root 1002  4월  1  2015 CentOS-Vault.repo
    -rw-r--r--. 1 root root  290  4월  1  2015 CentOS-fasttrack.repo
    [root@localhost yum.repos.d]# mkdir backup
    [root@localhost yum.repos.d]# mv *.repo backup/   # 기존 repo 파일 백업
    [root@localhost yum.repos.d]# ll
    합계 0
    drwxr-xr-x 2 root root 156  1월  7 10:13 backup
    [root@localhost yum.repos.d]# vi dvd.repo     # dvd.repo에 아래 내용 추가

    [dvd]
    name=CentOS DVD
    baseurl=file:///media/cdrom   # 마운트 위치
    gpgcheck=0

    [network]
    name=network
    baseurl=
        http://ftp.daum.net/centos/$releasever/os/$basearch/
        http://ftp.kaist.ac.kr/CentOS/$releasever/os/$basearch
    gpgcheck=0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;find [경로] [옵션] [조건] [action]&lt;/b&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[옵션]: -name, -user, -newer, -perm, -size&lt;/li&gt;
&lt;li&gt;[action]: -print, -exec&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find /etc -name &quot;*.conf&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find /bin -size +10k -size -100k&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find /usr/bin -size +95k -size -100k -exec ls -l {} \;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find /home -name &quot;*.swp&quot; -exec rm {} \;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;which 실행파일이름&lt;/b&gt;: PATH에 설정된 디렉터리만 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;whereis 실행파일이름&lt;/b&gt;: 실행 파일, 소스, man 페이지 파일까지 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;locate 파일이름&lt;/b&gt;: 파일 목록 데이터베이스에서 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;system-config-date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;네트워크 설정: &lt;code&gt;nmtui&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;방화벽 설정: &lt;code&gt;firewall-config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;키보드 설정: &lt;code&gt;system-config-keyboard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;언어 설정: &lt;code&gt;system-config-language&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;프린터 설정: &lt;code&gt;system-config-printer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;사용자 설정: &lt;code&gt;syustem-config-users&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;네임 서버 설정: &lt;code&gt;system-config-kickstart&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CRON과 AT&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CRON&lt;/h4&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;code&gt;crond&lt;/code&gt;, 관련 파일은 &lt;code&gt;/etc/crontab&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# cat /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root

    # For details see man 4 crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
     01  3 15  *  * root       run-parts    /etc/cron.monthly&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AT&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cron은 주기적으로 반복되는 작업을 예약하는 것이지만, at은 일회성 작업을 예약&lt;/li&gt;
&lt;li&gt;예약: &lt;code&gt;at &amp;lt;시간&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;확인: &lt;code&gt;at -l&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;취소: &lt;code&gt;atrm &amp;lt;작업번호&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost backup]# at 4:00 am tomorrow
    at&amp;gt; yum -y update
    at&amp;gt; reboot
    at&amp;gt; &amp;lt;EOT&amp;gt;     # Ctrl+D
    job 1 at Fri Jan  8 04:00:00 2016
    [root@localhost backup]# at -l
    1       Fri Jan  8 04:00:00 2016 a root
    [root@localhost backup]# atrm 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네트워크 관련 필수 개념&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP/IP
  &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;/li&gt;
&lt;li&gt;Hostname과 Domain name
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hostname은 각각의 컴퓨터에 저장된 이름.&lt;/li&gt;
&lt;li&gt;Domain name은 naver.com과 같은 형식.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IP 주소
  &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;4바이트로 이루어져 있으며, 각 자리는 0~255까지의 숫자.&lt;/li&gt;
&lt;/ul&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;같은 네트워크에 속해 있는 공통된 주소(192.168.111.0).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Broadcast 주소
  &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;현재 주소의 제일 끝자리를 255로 바꾼 주소(C클래스).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gateway, Router
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Gateway = Router.&lt;/li&gt;
&lt;li&gt;네트워크 간에 데이터를 전송하는 컴퓨터 또는 장비.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Netmask &amp;amp; Class
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크의 규모를 결정(255.255.255.0 - C클래스).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DNS(Domain Name System) 서버(= Nameserver) 주소
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL을 해당 컴퓨터의 IP 주소로 변환해 주는 서버.&lt;/li&gt;
&lt;li&gt;설정 파일은 &lt;code&gt;/etc/resolv.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네트워크 관련 명령어&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nmtui
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크와 관련된 대부분의 작업을 이 명령어에서 수행.
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 IP 주소 또는 고정 IP 주소 사용 결정.&lt;/li&gt;
&lt;li&gt;IP 주소, Subnet Mask, Gateway 정보 입력.&lt;/li&gt;
&lt;li&gt;DNS 정보 입력.&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 설정 적용: &lt;code&gt;systemctl &amp;lt;start/stop/restart/status&amp;gt; network&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;네트워크 장치 On/Off: &lt;code&gt;ifup &amp;lt;장치이름&amp;gt;, ifdown &amp;lt;장치이름&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;장치의 IP주소 설정 정보 출력: &lt;code&gt;ifconfig &amp;lt;장치이름&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DNS 서버 작동 테스트: &lt;code&gt;nslookup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;해당 컴퓨터가 네트워크상에서 응답하는지를 테스트: &lt;code&gt;ping &amp;lt;IP주소 또는 URL&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;/etc/sysconfig/network&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;해당 장치에 설정된 네트워크 정보: &lt;code&gt;/etc/sysconfig/network-scrips/ifcfg-장치이름&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DNS 서버의 정보 및 Hostname: &lt;code&gt;/etc/resolv.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;현재 컴퓨터의 Hostname 및 FQDN: &lt;code&gt;/etc/hosts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777728
    TYPE=&quot;Ethernet&quot;
    BOOTPROTO=none
    IPADDR=192.168.111.100
    NETMASK=255.255.255.0
    GATEWAY=192.168.111.2
    DNS1=192.168.111.2
    DEFROUTE=&quot;yes&quot;
    PEERDNS=&quot;yes&quot;
    PEERROUTES=&quot;yes&quot;
    IPV4_FAILURE_FATAL=&quot;no&quot;
    IPV6INIT=&quot;yes&quot;
    IPV6_AUTOCONF=&quot;yes&quot;
    IPV6_DEFROUTE=&quot;yes&quot;
    IPV6_PEERDNS=&quot;yes&quot;
    IPV6_PEERROUTES=&quot;yes&quot;
    IPV6_FAILURE_FATAL=&quot;no&quot;
    NAME=&quot;eno16777728&quot;
    UUID=&quot;3fa0e59c-d536-4f90-86f9-69b004278436&quot;
    DEVICE=&quot;eno16777728&quot;
    ONBOOT=&quot;yes&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네트워크 보안을 위한 SELinux&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELinux(Security Enhanced Linux)는 보안에 취약한 리눅스를 보호하기 위해 탄생.&lt;/li&gt;
&lt;li&gt;강제(Enforcing), 허용(Permissive), 비활성(Disabled) 세 가지 레벨.
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Enforcing: 시스템 보안에 영향을 미치는 기능이 감지되면 아예 그 기능이 작동되지 않도록 막음.&lt;/li&gt;
&lt;li&gt;Permissive: 시스템 보안에 영향을 미치는 기능이 감지되면 허용은 되지만 그 내용이 로그에 남음.&lt;/li&gt;
&lt;li&gt;Disabled: SELinux를 사용하지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설정 파일인 &lt;code&gt;/etc/sysconfig/selinux&lt;/code&gt;를 편집하거나, &lt;code&gt;system-config-selinux&lt;/code&gt; 명령으로 설정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이프, 필터, 리다이렉션&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이프(pipe)
  &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;code&gt;|&lt;/code&gt; 를 사용.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# ls -s /etc | more&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;필터(filter)
  &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;code&gt;grep&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;, &lt;code&gt;wc&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt; 등&lt;/li&gt;
&lt;li&gt;주로 파이프와 같이 사용.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# ps ef | grep bash&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리다이렉션(redirection)
  &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;code&gt;# ls -l &amp;gt; list.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# soft &amp;lt; list.txt &amp;gt; out.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;Foreground Process: 실행하면 화면에 나타나서 사용자와 상호작용을 하는 프로세스.
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;fg &amp;lt;작업번호&amp;gt;&lt;/code&gt;: Background Process를 Foreground로 불러온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Background Process: 실행은 되었지만, 화면에는 나타나지 않고 실행되는 프로세스.
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;gedit &amp;amp;&lt;/code&gt;: Background로 프로그램을 실행할 수 있다. 터미널 계속 사용 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스 번호: 각각의 프로세스에 할당된 고유번호.&lt;/li&gt;
&lt;li&gt;작업 번호: 현재 실행되고 있는 Background Process의 순차번호&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;모든 프로세스는 부모 프로세스를 가지고 있음.&lt;/li&gt;
&lt;li&gt;부모 프로세스를 kill 하면, 자식 프로세스도 자동으로 kill 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# yes &amp;gt; /dev/null
    ^Z
    [1]+  Stopped                 yes &amp;gt; /dev/null
    [root@localhost ~]# bg
    [1]+ yes &amp;gt; /dev/null &amp;amp;
    [root@localhost ~]# fg 1
    yes &amp;gt; /dev/null
    ^C
    [root@localhost ~]#&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&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;ps&lt;/b&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 프로세스의 상태 확인.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# ps -ef | grep &amp;lt;프로세스 이름&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;kill&lt;/b&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 강제 종료.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# kill -9 &amp;lt;프로세스 번호&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pstree&lt;/b&gt;: 부모 프로세스와 자식 프로세스의 관계를 트리 형태로 보여 줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템과 독자적으로 구동되어 제공하는 프로세스를 말한다. 웹 서버(httpd), DB 서버(mysqld), FTP 서버(vsftpd) 등이 있다.&lt;/li&gt;
&lt;li&gt;실행 및 종료는 대개 &lt;code&gt;systemctl start/stop/restart 서비스이름&lt;/code&gt;으로 사용된다.&lt;/li&gt;
&lt;li&gt;서비스의 실행 스크립트 파일은 &lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt; 디렉터리에 &lt;code&gt;서비스이름.service&lt;/code&gt;라는 이름으로 확인할 수 있다.&lt;/li&gt;
&lt;/ul&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;서비스는 항상 가동되지만, 소켓은 외부에서 특정 서비스를 요청할 경우에 systemd가 구동시킨다. 그리고 요청이 끝나면 소켓도 종료된다.&lt;/li&gt;
&lt;li&gt;그래서 소켓으로 설정된 서비스를 요청할 때는 처음 연결되는 시간이 앞에서 설명한 서비스에 비교했을 때 약간 더 걸릴 수 있다. 왜냐하면 systemd가 서비스를 새로 구동하는 데 시간이 소요되기 때문이다. 예로 텔넷 서버가 있다.&lt;/li&gt;
&lt;li&gt;소켓과 관련된 스크립트 파일은 &lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt; 디렉터리에 &lt;code&gt;소켓이름.socket&lt;/code&gt;라는 이름으로 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;응급 복구(root 비밀번호 분식)&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bW3LH5/btqJZnE2nix/DRbDVTA18lv4BtEt5kvuTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW3LH5/btqJZnE2nix/DRbDVTA18lv4BtEt5kvuTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW3LH5/btqJZnE2nix/DRbDVTA18lv4BtEt5kvuTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW3LH5%2FbtqJZnE2nix%2FDRbDVTA18lv4BtEt5kvuTK%2Fimg.png&quot; width=&quot;100%&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;code&gt;e&lt;/code&gt;를 눌러 edit mode로 들어간다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/dbqwZN/btqJZnSyRjP/7jZmULri29wHpDS3kqZqVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbqwZN/btqJZnSyRjP/7jZmULri29wHpDS3kqZqVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbqwZN/btqJZnSyRjP/7jZmULri29wHpDS3kqZqVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbqwZN%2FbtqJZnSyRjP%2F7jZmULri29wHpDS3kqZqVK%2Fimg.png&quot; width=&quot;100%&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; width=&quot;100%&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/kHfkA/btqJ4Hh7zFg/bMEDkDjxL8ZLDt9cwk8FS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHfkA/btqJ4Hh7zFg/bMEDkDjxL8ZLDt9cwk8FS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHfkA/btqJ4Hh7zFg/bMEDkDjxL8ZLDt9cwk8FS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHfkA%2FbtqJ4Hh7zFg%2FbMEDkDjxL8ZLDt9cwk8FS1%2Fimg.png&quot; width=&quot;100%&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;code&gt;rhgb ~ UTF-8&lt;/code&gt; 부분을 지우고, &lt;code&gt;init=/bin/sh&lt;/code&gt;를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl-x&lt;/code&gt; 를 눌러 시작.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;sh-4.2# whoami
    root&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;root로 로그인 되었다. &lt;code&gt;passwd&lt;/code&gt;로 비밀번호를 변경하면 되지만,&lt;br /&gt;현재 &lt;code&gt;/&lt;/code&gt;가 읽기전용이므로, 수정할 수 있도록 변경해야 한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;sh-4.2# mount
    /dev/sda2 on / type xfs (ro,relatime,attr2,inode64,noquota)

    sh-4.2# mount -o remount,rw /

    sh-4.2# mount
    /dev/sda2 on / type xfs (rw,relatime,attr2,inode64,noquota)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 비밀번호를 변경한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;sh-4.2# passwd
    Changing password for user root.
    New password:
    Retype new password:
    passwd: all authentication tokens updated successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;재부팅 하면, 변경한 비밀번호로 접속할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GRUB 부트로더&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GRUB 부트로더의 특징
  &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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GRUB2의 장점
  &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;그래픽 부트 메뉴를 지원하며, 부트 스플래시(boot splash) 성능이 개선되었다.&lt;/li&gt;
&lt;li&gt;ISO 이미지를 이용해서 바로 부팅할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GRUB2 설정 방법
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정 파일: &lt;code&gt;/boot/grub2/grub.cfg&lt;/code&gt; 직접 변경하면 안 됨.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/default/grub&lt;/code&gt; 파일과 &lt;code&gt;/etc/grub.d/&lt;/code&gt; 디렉터리의 파일을 수정한 후에, &lt;code&gt;grub2-mkconfig -o /boot/grub2/grub.cfg&lt;/code&gt; 명령어를 실행해 설정함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# cat /etc/default/grub
    GRUB_TIMEOUT=5    # 메뉴 선택 시간.
    GRUB_DISTRIBUTOR=&quot;This is Lunix&quot;    # 메뉴 제목.
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT=&quot;console&quot;
    GRUB_CMDLINE_LINUX=&quot;rhgb quiet&quot;
    GRUB_DISABLE_RECOVERY=&quot;true&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GRUB 부트로더 변경시 암호 설정&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GRUB 부트로더에 암호를 설정하지 않으면, 위 응급복구처럼 마음대로 root 비밀번호를 수정할 수 있게된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# vi /etc/grub.d/00_header    # 맨 아래쪽에 아래 내용 추가.

    cat &amp;lt;&amp;lt; EOF
    set superusers=&quot;thisuser&quot;
    password thisuser 4321
    EOF

    [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg    # 설정 적용.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;커널 컴파일 순서
&lt;ol&gt;
&lt;li&gt;현 커널 버전 확인: &lt;code&gt;# uname -r&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;커널 소스 다운로드: &lt;code&gt;# cd /usr/src&lt;/code&gt;에 업로드&lt;/li&gt;
&lt;li&gt;커널 소스 압축 풀기: &lt;code&gt;# tar xvfJ linux-3.17.4.tar.xz&lt;/code&gt;, &lt;code&gt;# cd linux-3.17.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;커널 설정 초기화: &lt;code&gt;# make mrproper&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;커널 환경 설정: &lt;code&gt;# make xconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;이전 정보 삭제: &lt;code&gt;# make clean&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;커널 컴파일 및 설치: &lt;code&gt;# make ; make modules_install ; make install&lt;/code&gt;, &lt;code&gt;# ls -l /boot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;부트 로더 확인: &lt;code&gt;# cat /etc/grub2/grub.cfg&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# uname -r
    3.10.0-229.el7.x86_64

    [root@localhost ~]# wget &quot;https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.4.tar.xz&quot;

    [root@localhost ~]# mv linux-3.17.4.tar.xz /usr/src
    [root@localhost ~]# cd /usr/src/
    [root@localhost src]# ll
    합계 130624
    drwxr-xr-x. 2 root root        6  6월 10  2014 debug
    drwxr-xr-x. 2 root root        6  6월 10  2014 kernels
    -rw-r--r--  1 root root 80337920 11월 22  2014 linux-3.17.4.tar.xz

    [root@localhost src]# tar xfJ linux-3.17.4.tar.xz
    [root@localhost src]# cd linux-3.17.4/
    [root@localhost linux-3.17.4]# ls
    COPYING        Kbuild       Makefile        arch    drivers   include  kernel  net      security  usr
    CREDITS        Kconfig      README          block   firmware  init     lib     samples  sound     virt
    Documentation  MAINTAINERS  REPORTING-BUGS  crypto  fs        ipc      mm      scripts  tools

    [root@localhost linux-3.17.4]# yum -y install gcc gcc-c++ qt qt-devel   # 컴파일에 필요한 패키지 설치

    [root@localhost linux-3.17.4]# make mrproper

    [root@localhost linux-3.17.4]# make xconfig&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/Q3hrS/btqJ6coEXcm/6K9laGL2XPcsxMlRcxa2nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q3hrS/btqJ6coEXcm/6K9laGL2XPcsxMlRcxa2nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q3hrS/btqJ6coEXcm/6K9laGL2XPcsxMlRcxa2nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ3hrS%2FbtqJ6coEXcm%2F6K9laGL2XPcsxMlRcxa2nk%2Fimg.png&quot; width=&quot;100%&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;xconfig로 커널 설정을 할 수 있다. NTFS를 마운트 하고 싶다면 NTFS 관련 항목에 체크해야 한다.&lt;/p&gt;
&lt;p&gt;계속 진행.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost linux-3.17.4]# make clean
    [root@localhost linux-3.17.4]# make ; make modules_install ; make install&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bpyElh/btqJ6c3eI8b/XpYKmTci0oRnOjuh8iZ9hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpyElh/btqJ6c3eI8b/XpYKmTci0oRnOjuh8iZ9hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpyElh/btqJ6c3eI8b/XpYKmTci0oRnOjuh8iZ9hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpyElh%2FbtqJ6c3eI8b%2FXpYKmTci0oRnOjuh8iZ9hK%2Fimg.png&quot; width=&quot;100%&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;재부팅 하면 GRUB 메뉴에 3.17.4 커널이 추가된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6장. 하드디스크 관리와 사용자별 공간 할당&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RAID 정의 및 개념&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID 정의
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID(Redundant Array of Inexpensive Disks)는 여러 개의 디스크를 하나의 디스크처럼 사용함.&lt;/li&gt;
&lt;li&gt;비용 절감 + 신뢰성 향상 + 성능 향상의 효과를 냄.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하드웨어 RAID
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어 제조업체에서 여러 개의 하드디스크를 가지고 장비를 만들어서 그 자체를 공급.&lt;/li&gt;
&lt;li&gt;좀 더 안정적이지만, 상당한 고가임.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;소프트웨어 RAID
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고가의 하드웨어 RAID의 대안.&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Linear RAID, RAID 0&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linear RAID 개요
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소 2개의 하드디스크가 필요.&lt;/li&gt;
&lt;li&gt;2개 이상의 하드디스크를 1개의 볼륨으로 사용.&lt;/li&gt;
&lt;li&gt;앞 디스크부터 차례로 저장.&lt;/li&gt;
&lt;li&gt;100%의 공간효율성(= 비용 저렴).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RAID 0 개용
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소 2개의 하드디스크가 필요.&lt;/li&gt;
&lt;li&gt;모든 디스크에 동시에 저장 됨.&lt;/li&gt;
&lt;li&gt;100%의 공간효율성(= 비용 저렴).&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RAID 1&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID 1 개요
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미러링(Mirroring)이라 부름.&lt;/li&gt;
&lt;li&gt;데이터 저장에 두 배의 용량이 필요.&lt;/li&gt;
&lt;li&gt;결함 허용(Falut-tolerance)을 제공(= 신뢰성 높음).&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;/li&gt;
&lt;li&gt;RAID 0와 RAID 1 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;RAID 0&lt;/th&gt;
&lt;th&gt;RAID 1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&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;/td&gt;
&lt;td&gt;보장 못함(결함 허용 X)&lt;/td&gt;
&lt;td&gt;보장함(결함 허용 O)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공간 효율성&lt;/td&gt;
&lt;td&gt;좋음&lt;/td&gt;
&lt;td&gt;나쁨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RAID 5&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID 5 개요
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID1의 데이터 안전성 + RAID 0처럼 공간 효율성.&lt;/li&gt;
&lt;li&gt;최소한 3개 이상의 하드디스크.&lt;/li&gt;
&lt;li&gt;오류가 발생할 때는 패리티(Parity)를 이용해서 데이터를 복구.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RAID 5 특징
  &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;(디스크의 개수 -1)의 공간을 사용.&lt;/li&gt;
&lt;li&gt;디스크 2개가 고장나면 복구 못 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RAID 6, RAID 1+0&lt;/h4&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID 5보다 신뢰도를 높은 RAID 6.&lt;/li&gt;
&lt;li&gt;신뢰도와 속도 두 마리 토끼를 잡기 위한 RAID 1+0.&lt;/li&gt;
&lt;li&gt;RAID 6은 패리티를 2개 사용하기 떄문에 최소 4개의 디스크가 필요.&lt;/li&gt;
&lt;li&gt;RAID 1+0도 최소 4개 디스크가 필요.&lt;/li&gt;
&lt;li&gt;RAID 6의 공간효율은 N-2&lt;/li&gt;
&lt;li&gt;RAID 1+0의 공간효율은 50%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Linear RAID, RAID 0, RAID 1, RAID 5 구현&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;장치 이름&lt;/th&gt;
&lt;th&gt;용량&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:1&lt;/td&gt;
&lt;td&gt;2GB&lt;/td&gt;
&lt;td&gt;Linear RAID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:2&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;Linear RAID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:3&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:4&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:5&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:6&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:7&lt;/td&gt;
&lt;td&gt;사용 불가&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:8&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:9&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI 0:10&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;RAID 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파티션 타입은 &lt;code&gt;fd&lt;/code&gt;, &lt;code&gt;Linux raid autodetect&lt;/code&gt;로 설정.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;/dev/sdb1            2048     4194303     2096128   fd  Linux raid autodetect
    /dev/sdc1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sdd1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sde1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sdf1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sdg1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sdh1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sdi1            2048     2097151     1047552   fd  Linux raid autodetect
    /dev/sdj1            2048     2097151     1047552   fd  Linux raid autodetect&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;Linear RAID&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mdadm --create /dev/md9 --level=linear --raid-devices=2 /dev/sdb1 /dev/sdc1
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md9 started.

    [root@localhost ~]# mdadm --detail --scan
    ARRAY /dev/md9 metadata=1.2 name=localhost.localdomain:9 UUID=f86f440c:96d42e39:9647f3bd:699c394f

    [root@localhost ~]# mkfs.ext4 /dev/md9
    &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;RAID 0&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1
    [root@localhost ~]# mkfs.ext4 /dev/md0&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;RAID 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdf1 /dev/sdg1
    [root@localhost ~]# mkfs.ext4 /dev/md1&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;RAID 5&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdh1 /dev/sdi1 /dev/sdj1
    [root@localhost ~]# mkfs.ext4 /dev/md5&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;RAID 6&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
    [root@localhost ~]# mkfs.ext4 /dev/md6&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;RAID 1+0&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sdf1 /dev/sdg1
    [root@localhost ~]# mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sdh1 /dev/sdi1

    [root@localhost ~]# mdadm --create /dev/md10 --level=0 --raid-devices=2 /dev/md2 /dev/md3
    [root@localhost ~]# mkfs.ext4 /dev/md10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LVM(Logical Volume Manage)&lt;/h3&gt;
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LVM 주요 기능: 여러 개의 하드디스크를 합쳐서 한 개의 파일시스템으로 사용하는 것으로 필요에 따라서 다시 나눌 수 있다.&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;Physical Volume(물리 볼륨): /dev/sda1, /dev/sdb1 등의 파티션.&lt;/li&gt;
&lt;li&gt;Volume Group(볼륨 그룹): 물리 볼륨을 합쳐서 1개의 물리 그룹으로 만드는 것.&lt;/li&gt;
&lt;li&gt;Logical Volume(논리 볼륨): 볼륨 그룹을 1개 이상으로 나눠서 논리 그룹으로 나눈 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파티션 타입은 &lt;code&gt;8e&lt;/code&gt;, &lt;code&gt;Linux LVM&lt;/code&gt;로 설정.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# pvcreate /dev/sdb1
      Physical volume &quot;/dev/sdb1&quot; successfully created
    [root@localhost ~]# pvcreate /dev/sdc1
      Physical volume &quot;/dev/sdb1&quot; successfully created

    [root@localhost ~]# vgcreate myVG /dev/sdb1 /deb/sdc1
      Volume group &quot;myVG&quot; successfully created

    [root@localhost ~]# lvcreate --size 1G --name myLG1 myVG
      Logical volume &quot;myLG1&quot; created
    [root@localhost ~]# lvcreate --size 3G --name myLG2 myVG
      Logical volume &quot;myLG2&quot; created
    [root@localhost ~]# lvcreate --extents 100%FREE --name myLG3 myVG
      Logical volume &quot;myLG3&quot; created

    [root@localhost ~]# mkfs.ext4 /dev/myVG/myLG1
    [root@localhost ~]# mkfs.ext4 /dev/myVG/myLG2
    [root@localhost ~]# mkfs.ext4 /dev/myVG/myLG3

    [root@localhost ~]# mkdir /lvm1 /lvm2 /lvm3
    [root@localhost ~]# mount /dev/myVG/myLG1 /lvm1
    [root@localhost ~]# mount /dev/myVG/myLG2 /lvm2
    [root@localhost ~]# mount /dev/myVG/myLG3 /lvm3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자별 공간 할당 - 쿼터(Quota)&lt;/h3&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;code&gt;/&lt;/code&gt;로 지정하는 것보다는, 별도의 파일시스템을 지정해서 해당 부분을 쓰도록 하는것이 좋음.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; 파일 시스템을 많은 사용자가 동시에 사용하게 되면, 서버를 운영하기 위해서 디스크를 읽고 쓰는 작업과 일반 사용자가 디스크를 읽고 쓰는 작업이 동시에 발생하므로 전반적으로 시스템의 성능이 저하 됨.&lt;/li&gt;
&lt;li&gt;디스크 추가 후(/dev/sdb), /userHome에 마운트.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# useradd -d /userHome/john john
    [root@localhost ~]# useradd -d /userHome/bann bann&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;code&gt;/etc/fstab&lt;/code&gt;에 &lt;code&gt;usrjquota=aquota.user,jqfmt=vfsv0&lt;/code&gt; 추가.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# vi /etc/fstab
    /dev/sdb1    /userHome    ext4    defaults,usrjquota=aquota.user,jqfmt=vfsv0    1 2
    [root@localhost ~]# mount --options remount /userHome&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 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost ~]# cd /userHome
    [root@localhost userHome]# quotaoff -avug
    /dev/sdb1 [/userHome]: user quotas turned off
    [root@localhost userHome]# quotacheck -augmn
    [root@localhost userHome]# rm -rf aquota.*
    [root@localhost userHome]# quotacheck -augmn
    [root@localhost userHome]# touch aquota.user aquota.group
    [root@localhost userHome]# chmod 600 aquota.*
    [root@localhost userHome]# quotacheck -augmn
    [root@localhost userHome]# quotaon -avug
    /dev/sdb1 [/userHome]: user quotas turned on&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 class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost userHome]# edquota -u john
    Disk quotas for user john (uid 1001):
      Filesystem                   blocks       soft       hard     inodes     soft     hard
      /dev/sdb1                        28      10240      15360          7        0        0&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 class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost userHome]# su - john
    [john@localhost ~]$ cp /boot/vmlinuz-3.10.0-229.el7.x86_64 test1
    [john@localhost ~]$ cp test1 test2
    [john@localhost ~]$ cp test1 test3
    sdb1: warning, user block quota exceeded. # soft 쿼터 초과.
    [john@localhost ~]$ cp test1 test4
    sdb1: write failed, user block limit reached.
    cp: 'test4'에 쓰는 도중 오류 발생: 디스크 할당량이 초과됨
    cp: failed to extend 'test4': 디스크 할당량이 초과됨
    [john@localhost ~]$ ll
    합계 15312
    -rwxr-xr-x. 1 john john 5029136  1월  8 14:23 test1
    -rwxr-xr-x. 1 john john 5029136  1월  8 14:24 test2
    -rwxr-xr-x. 1 john john 5029136  1월  8 14:24 test3
    -rwxr-xr-x. 1 john john  589824  1월  8 14:24 test4  # hard 쿼터 제한

    [john@localhost ~]$ quota
    Disk quotas for user john (uid 1001):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb1   15360*  10240   15360   6days      16       0       0&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 class=&quot;bash&quot;&gt;&lt;code&gt;[root@localhost userHome]# repquota /userHome/
    *** Report for user quotas on device /dev/sdb1
    Block grace time: 7days; Inode grace time: 7days
                            Block limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    root      --      20       0       0              3     0     0
    john      +-   15360   10240   15360  6days      17     0     0
    bann      --      28       0       0              7     0     0

    [root@localhost userHome]# edquota -p john bann # 쿼터 설정 복사

    [root@localhost userHome]# repquota /userHome/
    *** Report for user quotas on device /dev/sdb1
    Block grace time: 7days; Inode grace time: 7days
                            Block limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    root      --      20       0       0              3     0     0
    john      +-   15360   10240   15360  6days      17     0     0
    bann      --      28   10240   15360              7     0     0&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT</category>
      <category>CentOS</category>
      <category>linux</category>
      <category>리눅스</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/76</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EC%9D%B4%EA%B2%83%EC%9D%B4-%EB%A6%AC%EB%88%85%EC%8A%A4%EB%8B%A4-%EA%B0%95%EC%9D%98-2%EC%9E%A56%EC%9E%A5#entry76comment</comments>
      <pubDate>Sun, 4 Oct 2020 02:18:22 +0900</pubDate>
    </item>
    <item>
      <title>[정리] JAVA 기본 개념</title>
      <link>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-JAVA-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2016년 1월 5일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고도서&lt;br /&gt;황희정. 『JUST JAVA 객체지향에 충실한 자바다운 자바』. 한빛아카데미. 2015&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바 언어의 이해&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바는 썬에서 개발한 객체지향 언어이다. 가정용 단말기에 적용하려는 목적으로 1992년에 만든 '오크(OAK)'언어에서 비롯되었다.&lt;/li&gt;
&lt;li&gt;오크는 상품화되지 못했지만, 인터넷이 발전하면서 인터넷 친화적인 개발 언어로 방향을 전환하여 1995년 '자바'라는 이름으로 새롭게 소개되었다.&lt;/li&gt;
&lt;li&gt;현재 자바는 IT 기술 전반에서 가장 널리 사용하는 프로그래밍 언어가 되었다.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- more --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 가상머신&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바는 '바이트코드(Bytecode)'를 생성한다. 바이트코드는 하드웨어에 종속적이지 않은 중간 파일로, 가상머신을 거쳐 해석&amp;middot;실행하는 구조이다.&lt;/li&gt;
&lt;li&gt;가상머신으로 자바는 스마트폰, 컴퓨터, Mac, 리눅스 등 서로 다른 기기나 운영체제에서 동일한 프로그램을 개발하고 실행할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 플랫폼&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바 플랫폼은 자바 프로그램이 실행되는 특정 환경을 말한다.&lt;/li&gt;
&lt;li&gt;여러 제약(화면, 입출력 장치, 성능 등) 때문에 모든 하드웨어나 적용 분야에서 동일한 자바를 사용하는 것은 불가능하다. 각 영역에 특화된 자바 플랫폼이 있다.&lt;/li&gt;
&lt;li&gt;대표적인 자바 플랫폼 기술로 Java SE(Standard Edition), Java ME(Micro Edition), Java EE(Enterprise Edition), Java Card, Java TV 등이 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;a href=&quot;http://docs.oracle.com/javase/8/docs/&quot;&gt;Java 8 SE 구조&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/tGxCj/btqJ6dnyBBF/WC3XQZ0HxeZ5h8HEWXk05K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGxCj/btqJ6dnyBBF/WC3XQZ0HxeZ5h8HEWXk05K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGxCj/btqJ6dnyBBF/WC3XQZ0HxeZ5h8HEWXk05K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGxCj%2FbtqJ6dnyBBF%2FWC3XQZ0HxeZ5h8HEWXk05K%2Fimg.png&quot; width=&quot;100%&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JDK(Java Development Kit): 자바 프로그램 개발에 필요한 구성 요소&lt;/li&gt;
&lt;li&gt;JRE(Java Runtime Environment): 자바 프로그램 실행에 필요한 구성 요소&lt;/li&gt;
&lt;li&gt;API(Application Programming Interface): 자바 응용 프로그램 개발에 사용하는 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바의 장점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;간결하면서도 강력한 객체지향 언어이다.&lt;/li&gt;
&lt;li&gt;개방형 구조로 여러 기술과 융합이 가능하다.&lt;/li&gt;
&lt;li&gt;플랫폼에 독립적이므로, 여러 운영체제나 하드웨어에서도 동일하게 실행한다.&lt;/li&gt;
&lt;li&gt;많은 오픈소스 프레임워크로 생산성을 증가하고 유지보수 비용을 절감할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바의 단점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;처리 속도가 중요한 애플리케이션에는 적합하지 않다.&lt;/li&gt;
&lt;li&gt;GUI 요소가 많은 MS 윈도우 응용 프로그램 개발에는 적합하지 않다.&lt;/li&gt;
&lt;li&gt;하드웨어에 연결하여 제어할 수 없기 때문에(가상머신 이용) 직접 하드웨어를 정밀하게 조정해야 하는 프로그램 개발에는 적합하지 않다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;처음 만나는 자바 프로그램&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 프로그램 개발 절차&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바 프로그램 개발은 자바 소스 코드(.java) 작성 &amp;rarr; 자바 컴파일러 &amp;rarr; 자바 바이트코드(.class, 컴파일) &amp;rarr; 자바 가상머신(JVM) &amp;rarr; 운영체제, 하드웨어 &amp;rarr; 실행의 단계로 진행한다.&lt;/li&gt;
&lt;li&gt;바이트코드는 운영체제에 상관없이 가상머신에서 실행하는 중간 코드이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 소스 프로그램 작성 및 실행&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이클립스는 기본적으로 프로젝트 단위로 소스 파일을 관리한다.&lt;/li&gt;
&lt;li&gt;보통 프로그램은 여러 개의 클래스와 필요한 라이브러리를 비롯한 기타 리소스(자원)로 구성한다.&lt;/li&gt;
&lt;li&gt;이클립스에서 자바 코드는 자바 파일 생성이 아니라 클래스를 작성하는 것으로 시작한다.&lt;/li&gt;
&lt;li&gt;이클립스는 자동으로 코드를 컴파일하기 때문에 코드 작성이 끝나면 컴파일도 함께 끝나는 셈이다.&lt;/li&gt;
&lt;li&gt;자바 클래스를 실행하려면 main() 메서드가 있어야 하며, [Run] - [Run As] - [Java Application] 메뉴로 실행한다.&lt;/li&gt;
&lt;li&gt;실행 결과 System.out.println()은 콘솔 창에 출력된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바의 기초 문법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변수와 자료형&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;변수는 프로그램에서 데이터를 저장하는 공간을 말하고, 자료형은 변수에 저장할 데이터의 유형을 말한다.&lt;/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;변수 이름의 길이에는 제한이 없다.&lt;/li&gt;
&lt;li&gt;반드시 문자나 언더바(_), 달러 기호($)로 시작해야 한다.&lt;/li&gt;
&lt;li&gt;자바의 연산자(+, -, *, /)는 변수 이름에 넣을 수 없다.&lt;/li&gt;
&lt;li&gt;대소문자를 구분한다(int result와 int Result는 다른 변수).&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;/li&gt;
&lt;li&gt;자바의 변수는 유형에 따라 인스턴스 변수, 클래스 변수, 지역 변수, 파라미터로 구분한다.&lt;/li&gt;
&lt;li&gt;자바에서 지원하는 기본 자료형(Primitive Data Types)은 크게 정수형, 실수형, 논리형으로 나눈다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;printf()의 형식 문자와 자료형&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;형식 문자&lt;/th&gt;
&lt;th&gt;자료형&lt;/th&gt;
&lt;th&gt;형식 문자&lt;/th&gt;
&lt;th&gt;자료형&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;%c&lt;/td&gt;
&lt;td&gt;문자형&lt;/td&gt;
&lt;td&gt;%o&lt;/td&gt;
&lt;td&gt;8진수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%d&lt;/td&gt;
&lt;td&gt;정수형&lt;/td&gt;
&lt;td&gt;%s&lt;/td&gt;
&lt;td&gt;문자열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%e&lt;/td&gt;
&lt;td&gt;지수형&lt;/td&gt;
&lt;td&gt;%u&lt;/td&gt;
&lt;td&gt;부호 없는 정수형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%f&lt;/td&gt;
&lt;td&gt;실수형&lt;/td&gt;
&lt;td&gt;%x&lt;/td&gt;
&lt;td&gt;16진수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%d&lt;/td&gt;
&lt;td&gt;정수형&lt;/td&gt;
&lt;td&gt;%%, \%&lt;/td&gt;
&lt;td&gt;% 문자 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정수형&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;자료형&lt;/th&gt;
&lt;th&gt;크기&lt;/th&gt;
&lt;th&gt;입출력 범위&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;byte&lt;/td&gt;
&lt;td&gt;1바이트&lt;/td&gt;
&lt;td&gt;-2^7 ~ 2^7-1&lt;/td&gt;
&lt;td&gt;작은 범위의 값을 저장하기에 유용하다. 컴퓨터 데이터 통신 프로그램에서 많이 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;2바이트&lt;/td&gt;
&lt;td&gt;0 ~ 2^16-1&lt;/td&gt;
&lt;td&gt;음수를 표현하지 않는 unsigned 자료형으로, 문자를 저장하거나 출력하는 용도로 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;2바이트&lt;/td&gt;
&lt;td&gt;-2^15 ~ 2^15-1&lt;/td&gt;
&lt;td&gt;메모리에서 차지하는 크기가 작다는 것이 장점이지만, 잘 사용하지 않는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;4바이트&lt;/td&gt;
&lt;td&gt;-2^31 ~ 2^31-1&lt;/td&gt;
&lt;td&gt;정수 타입의 연산에 기본이 되는 자료형이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;8바이트&lt;/td&gt;
&lt;td&gt;-2^63 ~ 2^63-1&lt;/td&gt;
&lt;td&gt;정수 표현 범위가 큰 데이터를 저장하기에 유용한 자료형이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실수형&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;자료형&lt;/th&gt;
&lt;th&gt;크기&lt;/th&gt;
&lt;th&gt;입출력 범위&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;4바이트&lt;/td&gt;
&lt;td&gt;1.4E^-45 ~ 3.402823E^38&lt;/td&gt;
&lt;td&gt;표현 범위가 작다. 값을 지정할 때 숫자 뒤에 f나 F를 붙여서 구분한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;8바이트&lt;/td&gt;
&lt;td&gt;4.9E^324 ~ 3.402823E^308&lt;/td&gt;
&lt;td&gt;실수형에서 사용하는 기본 데이터형이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;논리형&lt;/h4&gt;
&lt;p&gt;boolean: 1바이트, true 값 또는 false 값만 가진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연산자&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;연산자는 프로그래밍 언어에서 사용할 수 있는 다양한 계산식이다.&lt;/li&gt;
&lt;li&gt;컴퓨터 연산자에는 사칙 연산, 관계 연산, 논리 연산 등이 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연산자 우선 순위&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;우선순위&lt;/th&gt;
&lt;th&gt;연산자&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;., [], ()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;!, ~, +/-, ++/--, (cast)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;+, -, *, /, %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&amp;lt;&amp;lt;, &amp;gt;&amp;gt;, &amp;gt;&amp;gt;&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, ==, !=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&amp;amp;, ^, |&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&amp;amp;&amp;amp;, ||&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;[조건식]?[true]:[false]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;=, +=, -=, *=, /=, %=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, ^=, &amp;amp;=, !=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;++/--(후위형 증감 연산자)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;산술 연산자&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;분류&lt;/th&gt;
&lt;th&gt;연산자&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&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;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;두 수의 차를 구한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;두 수의 곱을 구한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;두 수를 나눈 몫을 구한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;두 수를 나눈 나머지를 구한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;+=&lt;/td&gt;
&lt;td&gt;좌변과 우변을 더한 결과를 좌변에 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;-=&lt;/td&gt;
&lt;td&gt;좌변에서 우변을 뺀 결과를 좌변에 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&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;/td&gt;
&lt;td&gt;++&lt;/td&gt;
&lt;td&gt;변수값을 1 증가시킨다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;변수값을 1 감소시킨다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;관계 연산자&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연산자&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;왼쪽 항이 크면 참, 아니면 거짓.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;오른쪽 항이 크면 참, 아니면 거짓.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;=&lt;/td&gt;
&lt;td&gt;왼쪽 항이 크거나 같으면 참, 아니면 거짓.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;=&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;왼쪽과 오른쪽 항이 다르면 참, 아니면 거짓.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;논리 연산자&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연산자&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&amp;amp;&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;단항 연산을 하며, 연산되는 항이 참이면 거짓, 거짓이면 참.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[조건식]?[true]:[false]&lt;/td&gt;
&lt;td&gt;조건식의 결과가 참일 때 [true] 항을 수행하고, 아니면 [false] 항을 수행한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;비트 연산자&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;분류&lt;/th&gt;
&lt;th&gt;연산자&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;비트 논리&lt;/td&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;두 항의 비트가 모두 1이면 1, 아니면 0으로 연산.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;|&lt;/td&gt;
&lt;td&gt;두 항의 비트가 모두 0이면 0, 아니면 1로 연산.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;^&lt;/td&gt;
&lt;td&gt;두 항의 비트가 서로 다르면 1, 같으면 0으로 연산.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비트 시프트&lt;/td&gt;
&lt;td&gt;&amp;gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;왼쪽 피연산자를 오른쪽 값만큼 부호 비트로 채우면서 오른쪽으로 이동시킨다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;lt;&amp;lt;&lt;/td&gt;
&lt;td&gt;왼쪽 피연산자를 오른쪽 값만큼 비트를 왼쪽으로 이동시킨다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;왼쪽 피연산자를 오른쪽 값만큼 부호 비트를 무시한 채 0으로 채우면서 오른쪽으로 이동시킨다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비트 대입&lt;/td&gt;
&lt;td&gt;&amp;amp;=&lt;/td&gt;
&lt;td&gt;두 항의 비트가 모두 1이면 1, 아니면 0으로 연산하여 왼쪽 피연산자에 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;|=&lt;/td&gt;
&lt;td&gt;두 항의 비트가 모두 0이면 0, 아니면 1로 연산하여 왼쪽 피연산자에 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;^=&lt;/td&gt;
&lt;td&gt;두 항의 비트가 서로 다르면 1, 같으면 0으로 연산하여 왼쪽 피연산자에 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;gt;&amp;gt;=&lt;/td&gt;
&lt;td&gt;왼쪽 피연산자를 오른쪽 값만큼 부호 비트로 채우면서 오른쪽으로 이동한 후 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;lt;&amp;lt;=&lt;/td&gt;
&lt;td&gt;왼쪽 피연산자를 오른쪽 값만큼 비트를 왼쪽으로 이동한 후 대입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;분기문&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;분기문은 프로그램을 개발할 때 논리적 수행을 지원하는 명령어이다.&lt;/li&gt;
&lt;li&gt;자바에서 지원하는 분기문은 if 문과 switch 문이 있다.&lt;/li&gt;
&lt;li&gt;if 문은 중첩 사용이 가능하며, if ~ else if ~ else 문 등 응용이 가능하다. switch 문은 정수형뿐만 아니라 문자열 비교로 case별 처리가 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;if(조건값 1) {
    명령문;
} else if(조건값 2) {
    명령문;
} else if(조건값 3) {
    명령문;
} else {
    명령문;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;if(조건값 1) {
    명령문;
    if(조건값 2) {
        명령문;
    }
} else {
    명령문;
    if(조건값 3) {
        명령문;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;switch(조건값) {
    case 조건 1:
        명령문;
        break;
    case 조건 2:
        명령문;
        break;
    case 조건 3:
        명령문;
        break;
    default:
        명령문;
        break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;반복문은 순환문이라고도 하며, 분기문과 함께 프로그램에서 기본적인 로직을 구성하는 기본 문법 중 하나이다.&lt;/li&gt;
&lt;li&gt;패턴이 일정하여 반복적으로 일을 수행할 때 순환문을 사용하면 쉽게 결과를 확인할 수 있다. 자바 언어에서 지원하는 순환문으로는 for 문과 while 문이 있다.&lt;/li&gt;
&lt;li&gt;for 문은 시작과 조건, 증감식 등으로 구성된다. while 문은 조건을 충족하는 동안 계속 수행하는 반복문으로 경우에 따라 do ~ while 문의 형태로도 사용이 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;for(초기값; 조건값; 증감식) {
    명령문;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;while(조건값) {
    명령문;
}

----------------
do {
    명령문;
} while(조건값)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배열은 인덱스(순차 번호)와 인덱스로 참조 가능한 데이터로 된 일종의 자료구조이다.&lt;/li&gt;
&lt;li&gt;배열은 집합형 데이터 관리가 필요할 때 사용하며, 원시 자료형뿐만 아니라 객체 타입도 지원한다.&lt;/li&gt;
&lt;li&gt;배열은 선언할 때 크기를 지정해야 하고, 나중에 변경할 수 없다. 또 배열 안 모든 데이터는 동일한 자료형이어야 한다.&lt;/li&gt;
&lt;li&gt;배열 안 데이터를 참조하는 인덱스는 0부터 시작하고, 데이터가 할당되지 않은 인덱스 위치를 참조할 때 Null Pointer Exception이 발생한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체지향과 자바&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체지향 프로그래밍 언어&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;객체지향이란 현실 세계의 개체 모델을 바탕으로 프로그램을 구조화하고 개발하는 프로그래밍 기법을 말한다.&lt;/li&gt;
&lt;li&gt;함수와 메서드(Method)가 비슷하며, 기본적으로는 객체 간의 메시지 교환을 이용한 프로그래밍 모델이다.&lt;/li&gt;
&lt;li&gt;상속, 추상화, 캡슐화 등 특징을 활요한 구조적이고 재활용 가능한 모듈화로 생산성과 유지보수 효율성을 높인 프로그래밍 언어이다. 대표적으로 스몰토크(SmallTalk), C++, C#, Net, 자바, 파이썬(Python) 등이 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체&lt;/h3&gt;
&lt;p&gt;객체를 뜻하는 'Object'는 기본적으로는 '사물'이라고 해석된다. 사물은 우리 눈에 보이는 모든 것을 말하며, 그 사물이 가진 속성(Attribute)과 행위(Behavior)로 설명할 수 있는 대상이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스와 인스턴스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;속성이 같은 객체들을 대표할 수 있는 대상을 클래스(Class)라고 한다. 예를 들어 소나무는 클래스가 되고, 주변에 보이는 각 소나무들은 모두 소나무 클래스의 인스턴스(객체)가 되는 것이다.&lt;/li&gt;
&lt;li&gt;클래스는 객체를 정의하는 틀이며, 필드(속성)와 메서드(행위)로 구성한다. 클래스는 추상화를 이용하여 슈퍼 클래스(상위 클래스, 부모 클래스)와 서브 클래스(하위 클래스, 자식 클래스)로 구분한다.&lt;/li&gt;
&lt;li&gt;인스턴스는 클래스에서 생성한 객체로, 고유한 상태가 있다. 동일한 클래스에서 생성된 객체라 할지라도 필드 값과 메서드의 내용은 다를 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상속&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상속은 어떤 클래스에서 좀 더 내용이 구체적인 새로운 클래스가 필요할 때 기존 클래스를 물려받아 새로운 부분만 추가하거나 수정하려고 만든 개념이다.&lt;/li&gt;
&lt;li&gt;상속을 이용하면 슈퍼 클래스의 기본 구성 요소(필드, 메서드)를 물려받으며(상속), 자신만의 필드나 메서드를 추가하여 구체화하는 것이 가능하다. 물론 물려받은 메서드의 내용을 수정하는 것도 가능하다.&lt;/li&gt;
&lt;li&gt;상속은 클래스를 선언할 때 extends 키워드를 사용하여 정의한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체지향 프로그래밍의 주요 특징&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;캡슐화&lt;/b&gt;: 생성한 객체를 어떤 메서드와 필드로 어떻게 일을 수행할지 외부에 숨기는 특성을 말한다.&lt;/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;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 클래스의 기본 구조&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;패키지&lt;/b&gt;: 자바 클래스들을 같은 성격으로 묶어서 관리하는 일종의 디렉터리 개념이다. 역 도메인(Reverse Domain) 방식으로 이름을 부여한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클래스&lt;/b&gt;: 자바 프로그램은 기본적으로 클래스를 만드는 것에서부터 시작한다. 클래스는 자바 프로그램의 기본 단위이며, 프로그램 실행을 위한 main() 메서드를 반드시 클래스에 포함해야 하는 것으 아니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인스턴스&lt;/b&gt;: 객체지향의 개념에 따라 클래스는 바로 사용할 수 없고, 인스턴스로 사용해야 한다. main() 메서드에서는 클래스의 인스턴스를 만들고, 인스턴스를 이용하여 메서드 호출 등 필요한 작업을 처리한다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리턴값이 없다. 따라서 void를 비롯한 리턴값의 데이터형을 입력하면 안 된다.&lt;/li&gt;
&lt;li&gt;파라미터가 있는 다른 여러 생성자를 정의할 수 있다(메서드 오버로딩).&lt;/li&gt;
&lt;li&gt;파라미터가 없는 기본 생성자(Default Constructor)는 특별히 생성자에서 처리해야 하는 일이 없다면 굳이 프로그램에서 구현할 필요가 없다. 다만 생성자를 여러 개 정의할 때는 반드시 기본 생성자를 명시해야 기본 생성자로 객체 생성이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;접근 한정자의 종류와 접근 범위&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;한정자&lt;/th&gt;
&lt;th&gt;클래스 내부&lt;/th&gt;
&lt;th&gt;동일 패키지&lt;/th&gt;
&lt;th&gt;하위 클래스&lt;/th&gt;
&lt;th&gt;그 외의 영역&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;public&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;protected&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;private&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&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;p&gt;static: 클래스 메서드와 클래스 변수를 선언하는 데 사용한다. static은 자바의 정적 영역에 할당되는 리소스를 선언하는 데 사용하며, 동일 가상머신상에서 실행 중인 모든 클래스에서 공유한다. 인스턴스를 생성하지 않고도 클래스의 메서드나 멤버에 접근할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;final: 더 이상 변경할 수 없도록 선언하는 한정자. 클래스에 사용할 때는 서브 클래스를 만들 수 없고, 메서드에 사용할 때는 오버라이딩을 할 수 없다. 변수에 사용하면 변수에 저장된 값이 변할 수 없으므로 변수가 아닌 상수의 역할을 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;abstract: 추상 클래스를 선언하는 데 사용하는 한정자.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;synchronized/volatile: 스레드 프로그래밍에서 여러 스레드가 동시에 자원에 접근할 때 발생하는 데이터 동기화를 처리하는 한정자.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인스턴스 변수와 클래스 변수&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인스턴스 변수는 클래스의 인스턴스로만 접근 가능한 변수를 말하며, 일반적인 멤버 변수가 여기에 속한다. 클래스 외부에서 접근을 차단하려고 private 키워드를 사용하기도 한다.&lt;/li&gt;
&lt;li&gt;동일 클래스의 인스턴스라 해도 각 인스턴스 변수는 값이 서로 다르고 서로에 영향을 주지 않는다.&lt;/li&gt;
&lt;li&gt;클래스 변수는 모든 클래스의 인스턴스로 공유되는 변수로, static 키워드를 사용하여 선언한다. 클래스가 인스턴스되기 전(main() 메서드 시작 부분)에는 인스턴스 변수에 접근할 수 없으므로 main()에서 멤버 변수에 바로 접근하는 것은 불가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자바 가상머신의 메모리 구조&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method 영역&lt;/th&gt;
&lt;th&gt;Heap 영역&lt;/th&gt;
&lt;th&gt;Stack 영역&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&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;클래스(static) 변수&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&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추상 클래스와 인터페이스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;추상 클래스와 인터페이스는 객체지향 개념을 실제 프로그램 개발에 쉽게 적용하고 유연한 설계를 지원하는 요소이다.&lt;/li&gt;
&lt;li&gt;일반 클래스보다 추상적인 관점에서 접근한다. 구체적인 내용보다는 기본적인 속성과 필요한 메서드의 형태(프로토 타입)만 기술하고 세부적인 구현은 구현하는 클래스에서 담당하도록 하는 형태이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&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;/li&gt;
&lt;li&gt;추상 클래스는 일반 클래스와 같이 멤버 변수 및 메서드를 포함할 수 있다.&lt;/li&gt;
&lt;li&gt;추상 클래스는 그 자체를 인스턴스화, 즉 객체 생성에 사용할 수 없으며, 반드시 추상 클래스를 상속받는 클래스를 만든 후 추상 클래스에 선언된 모든 추상 메서드를 오버라이딩해서 구현해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&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;인터페이스는 일반 메서드를 포함할 수 없으며, 모두 추상 메서드(public abstract)로만 구성해야 한다.&lt;/li&gt;
&lt;li&gt;일반 멤버 필드는 없고, public, static, final로 선언한 상수만 있다.&lt;/li&gt;
&lt;li&gt;추상 클래스와 마찬가지로 직접 객체를 생성하는 것은 불가능하고(Anonymous Inner Class 생성 형태로는 가능), 다른 클래스로 구현할 때는 implements 키워드로 구현을 선언해야 한다.&lt;/li&gt;
&lt;li&gt;클래스 상속과는 별도로 동작하므로 문법상 다중 상속을 지원하지 않는 자바에서 다중 상속의 개념을 지원하는 형태로 사용하는 것이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드 오버로딩과 메서드 오버라이딩&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메서드 오버로딩과 메서드 오버라이딩은 자바에서 다형성을 지원하는 구현 형태 중 하나이다.&lt;/li&gt;
&lt;li&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;메서드 이름이 같아야 한다.&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;/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;오버라이딩하는 메서드는 슈퍼 클래스의 메서드와 메서드 구성 요소 모두가 동일해야 한다.&lt;/li&gt;
&lt;li&gt;이때 이름, 파라미터, 리턴 타입이 모두 같아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바 기본 라이브러리 활용&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 API&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;API는 Application Programming Interface의 약어로, 응용 프로그램 개발에 사용할 수 있는 라이브러리 규격을 말한다.&lt;/li&gt;
&lt;li&gt;일반적인 자바 프로그램에서는 Java SE API를 주로 사용하며, 개발에 주로 활용하는 유용한 패키지들은 다음 표와 같다.&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;주요 기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;주요 패키지/클래스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lang and util&lt;/td&gt;
&lt;td&gt;자바 언어의 주요 구성 요소와 관련된 패키지&lt;/td&gt;
&lt;td&gt;java.lang, java.util&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;각종 수학 계산과 관련된 클래스 및 유틸리티&lt;/td&gt;
&lt;td&gt;java.math, java.lang.Math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collections&lt;/td&gt;
&lt;td&gt;다양한 자료구조를 동일한 방법으로 처리할 수 있도록 하는 라이브러리&lt;/td&gt;
&lt;td&gt;java.util&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input/Output&lt;/td&gt;
&lt;td&gt;키보드, 네트워크, 파일 등 입출력 관련 주요 기능을 제공하는 라이브러리&lt;/td&gt;
&lt;td&gt;java.io, java.nio, java.net&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Date and Time&lt;/td&gt;
&lt;td&gt;시간 및 날짜 처리 관련 라이브러리&lt;/td&gt;
&lt;td&gt;java.util, java.text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;네트워크 통신 프로그래밍 관련 라이브러리&lt;/td&gt;
&lt;td&gt;java.net&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swing/AWT&lt;/td&gt;
&lt;td&gt;GUI 구현 관련 라이브러리&lt;/td&gt;
&lt;td&gt;java.swing, java.awt, javax.swing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JDBC&lt;/td&gt;
&lt;td&gt;데이터베이스 프로그래밍 관련 라이브러리&lt;/td&gt;
&lt;td&gt;java.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;java.lang 패키지의 주요 클래스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;java.lang은 자바 언어의 가장 기본이 되는 클래스를 모아 둔 패키지이다.&lt;/li&gt;
&lt;li&gt;String 클래스는 문자열 처리를 위한 클래스로, 자바에서 문자열은 기본 자료형이 아니라 클래스를 사용하는 객체 타입이다.&lt;/li&gt;
&lt;li&gt;문자열을 비교할 때는 '=='이 아닌 equals() 메서드를 사용한다.&lt;/li&gt;
&lt;li&gt;더하기 연산을 수행하면 문자열 결합이 가능하다. 그러나 자바 문자열 특성상 기존 데이터를 대체하는 것이 아니라 계속 새로운 인스턴스를 생성하기 때문에 성능에 문제가 발생할 수 있으므로 주의해야 한다.&lt;/li&gt;
&lt;li&gt;StringBuffer 클래스는 성능에 영향을 받지 않고 문자열 처리를 하는 클래스이다. 긴 문자열 조합은 문자열 더하기 대신 StringBuffer를 사용하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;Wrapper 클래스는 자바의 기본 자료형을 객체 타입으로 처리할 수 있도록 만든 클래스이다. 기본 자료형에 대응하는 클래스들이 모두 준비되어 있다. 각 Wrapper 클래스에는 해당 데이터 타입과 관련된 유용한 기능들이 제공된다.&lt;/li&gt;
&lt;li&gt;System 클래스는 자바 프로그램을 실행하는 것과 관련된 유용한 기능들을 제공한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;java.util 패키지의 주요 클래스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;java.util은 프로그램을 개발할 때 유용한 기능을들 모아 놓은 유틸리티 클래스 패키지이다.&lt;/li&gt;
&lt;li&gt;날짜 처리는 프로그램을 개발할 때 중요하면서도 생각보다 손이 많이 가는 작업이다. java.util.Data, java.util.Calendar 클래스의 주요 메서드와 필드 등을 잘 활용해야 한다.&lt;/li&gt;
&lt;li&gt;Calendar 클래스는 추상 클래스라 인스턴스 생성이 안 되며, getInstance() 메서드를 사용해야 한다.&lt;/li&gt;
&lt;li&gt;날짜 형식 변환은 java.text의 클래스를 사용해야 한다.&lt;/li&gt;
&lt;li&gt;Scanner 클래스는 입력 스트림으로, 데이터를 입력받는 클래스이다. 고급 입출력은 자바 I/O에서 제공하는 클래스들을 사용해야 하며, Scanner 클래스는 상대적으로 간단한 입력을 처리하는 데 사용한다. 객체를 생성할 때 입력 스트림을 변경하면 키보드 외의 파일, 네트워크 등에서 데이터 입력을 받아올 수 있다.&lt;/li&gt;
&lt;li&gt;Random 클래스는 난수를 생성하는 클래스이다. 일련의 규칙에 따라 난수를 생성하는 관계로, 객체를 생성할 때 현재 시간 정보를 시드(Seed)로 하여 더 유용한 난수 생성이 가능하다. 난수 생성 범위를 지정하면 0부터 시작하므로 1부터 시작해야 할 때는 생성된 난수에 1을 더하도록 한다.&lt;/li&gt;
&lt;li&gt;StringTokenizer 클래스는 구분자로 연결된 문자열을 손쉽게 분리(파싱)하는 클래스이다. 일반적으로 구분자에는 공백, 콤마, 탭 등을 많이 사용한다. 특히 콤마로 구분된 데이터는 csv 포맷이라고 하여 엑셀과도 호환된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;java.text 패키지의 주요 클래스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;java.text 패키지는 주로 문자 형태로 구성된 정보의 변환을 지원하는 클래스들로 구성되어 있다.&lt;/li&gt;
&lt;li&gt;날짜 형식을 지정하는 클래스로 DateFormat과 SimpleDateFormat이 있으며, 자바 8에는 java.time API가 새롭게 추가되었다.&lt;/li&gt;
&lt;li&gt;DateForamt은 추상 클래스로 getInstance()를 사용해야 하며, 형식 제한이 있고 다양한 형식 지정을 원할 때는 SimpleDateFormat 클래스를 사용해야 한다. 날짜 지정 형식은 yyyy.MM.dd hh:mm과 같은 형식 지정 문자를 조합해서 원하는 대로 할 수 있다.&lt;/li&gt;
&lt;li&gt;숫자 형식 지정은 NumberFormat과 DecimalFormat 클래스를 사용할 수 있다. 날짜와 함께 숫자 역시 프로그램을 개발할 때 여러 변환이 필요한 데이터 중 하나이다. 화폐 단위를 비롯하여 자릿수 지정 등 숫자와 관련된 유용한 기능들을 제공한다.&lt;/li&gt;
&lt;li&gt;메시지는 문자열로 구성된 의미있는 데이터를 말한다. 프로그램이나 시스템 간에 데이터를 송수신할 때 이용할 수 있고, 규칙화된 문자열 패턴에 데이터를 매핑하는 용도로도 사용한다. MessageFormat 클래스는 패턴과 데이터 조합을 쉽게 연결하여 원하는 문자열을 만들 수 있도록 도와준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바 I/O와 네트워크 프로그래밍&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 I/O&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;I/O는 Input/Output, 즉 입력과 출력을 말한다. 자바에서는 java.io 패키지로 다양한 입출력 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;스트림(Stream)은 입출력 장치와 프로그램 간 데이터 전송 통로를 말한다. 스트림은 단방향으로만 뻗어 있으며, 연속된 데이터의 흐름으로 나타난다.&lt;/li&gt;
&lt;li&gt;입출력 프로그램은 입력 및 출력 장치, 네트워크, 컴퓨터에 유/무선으로 연결된 장치 등을 모두 스트림 기반으로 프로그램하는 것이 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;바이트 스트림과 문자 스트림&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;바이트 스트림은 바이트 단위로 데이터를 전송하고, 문자 스트림은 2바이트 단위로 문자를 전송한다. 예를 들어 숫자 17을 전송할 때 문자 스트림은 숫자 17 그대로 전송하지만, 바이트 스트림은 16진수 0x11이 바이트 단위 0001 0001로 전송된다는 차이가 있다.&lt;/li&gt;
&lt;li&gt;문자 스트림은 Reader와 Writer 클래스 계열을 사용하고, 바이트 스트림은 InputStream, OutputStream 클래스 계열을 사용한다.&lt;/li&gt;
&lt;li&gt;바이트 스트림 중 DataInputStream과 DataOutputStream은 자바의 기본 자료형 처리에 적합한 클래스로, 주로 바이너리 데이터 전송에 많이 사용한다.&lt;/li&gt;
&lt;li&gt;스트림을 사용한 후에는 항상 close() 메서드를 사용하여 닫아 줘야 다른 프로그램에서 해당 장치와 연결할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 파일 입출력&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일은 컴퓨터에서 가장 기본이 되는 중요한 입출력 대상이다. 컴퓨터의 특성상 메모리에 저장된 데이터는 컴퓨터 전원이 꺼지면 사라지므로, 모든 프로그램은 어떤 형태로든 파일을 사용한다.&lt;/li&gt;
&lt;li&gt;디렉터리는 파일을 체계적으로 관리하려는 것으로, 폴더라고도 한다. 디렉터리의 최상위를 루트라고 하며, 유닉스 계열은 '/', MS 윈도우 계열은 '\'를 디렉터리 구분자로 사용한다.&lt;/li&gt;
&lt;li&gt;경로는 디스크상의 파일이나 디렉터리 위치를 말하는 것으로, 디렉터리 구분자와 함께 사용한다. 유닉스는 /home/user1/data/my.txt와 같은 형식을 사용하고, 윈도우는 C:\home\user1\data\my.txt와 같은 형식을 사용한다.&lt;/li&gt;
&lt;li&gt;파일 입출력 프로그램은 File 클래스를 사용하여 원하는 파일 작업을 위한 객체를 생성하고, 입출력 스트림을 생성하여 프로그램하는 방식이다.&lt;/li&gt;
&lt;li&gt;File 클래스는 바이트 스트림과 문자 스트립 계열의 클래스를 모두 지원하며, RandomAccessFile 클래스는 임의의 파일 위치를 읽고 쓸 수 있는 기능을 제공한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 네트워크 프로그래밍&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;네트워크는 컴퓨터와 컴퓨터를 연결한 망형 조직을 말하며, 기업 내 컴퓨터를 연결한 랜(LAN)에서부터 전 세계가 하나로 연결된 인터넷까지 모두 네트워크라고 할 수 있다.&lt;/li&gt;
&lt;li&gt;네트워크의 기술적 유형에는 여러 가지가 있었지만, 지금은 TCP/IP라는 통신 프로토콜을 사용하는 컴퓨터 네트워크가 가장 일반적인 인터넷의 기반이 되었다.&lt;/li&gt;
&lt;li&gt;프로토콜은 컴퓨터와 컴퓨터가 데이터를 주고받는 규약을 말하며, 물리적 레벨에서 응용 프로그램 레벨까지 다양한 프로토콜이 있다.&lt;/li&gt;
&lt;li&gt;네트워크 프로그램은 데이터를 요청하는 클라이언트와 서비스를 제공하는 서버로 구분한다.&lt;/li&gt;
&lt;li&gt;포트는 서버에서 네트워크 접속을 받아들이는 연결 창구를 말한다. 포트에 따라 서로 다른 여러 서비스를 제공할 수 있다.&lt;/li&gt;
&lt;li&gt;소켓은 TCP/IP 네트워크에서 클라이언트와 서버가 통신하는 연결 통로를 말한다. 서버 입장에서는 클라이언트 연결 하나당 하나의 소켓 객체가 필요하다. 따라서 보통 네트워크 프로그램을 소켓 프로그래밍이라고도 한다.&lt;/li&gt;
&lt;li&gt;최근에는 URL을 이용하여 웹 서버의 자원에 접근하는 네트워크 프로그램이 늘어나고 있다. 이는 웹의 프로토콜인 HTTP를 이용한 것으로, 기존 웹 프로그램과 웹 사이트에서 운영 중인 정보를 손쉽게 연동할 수 있다는 점 때문에 널리 확산되었다. 자바에서는 URL 클래스로 HTTP 연결을 지원한다.&lt;/li&gt;
&lt;li&gt;ServerSocket 클래스는 클라이언트 연결을 지원하는 서버 프로그램에서 사용하고, Socket 클래스는 클라이언트 및 서버에서 클라이언트 접속을 처리하려고 사용한다.&lt;/li&gt;
&lt;li&gt;Socket을 사용하여 입출력 스트림을 확보할 수 있으며, 이후의 프로그램은 스트림을 사용하는 일반 자바 입출력 프로그램과 동일하다.&lt;/li&gt;
&lt;li&gt;네트워크 프로그램은 클라이언트와 서버가 상호작용을 해야 하므로 프로토콜 개념이 들어가야 하고, 다중 클라이언트 접속을 처리하려면 스레드 프로그램도 해야 하므로 정밀한 네트워크 프로그램 개발에는 많은 경험이 필요하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GUI 프로그래밍&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GUI 프로그래밍&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GUI는 Graphical User Interface의 약어로, 그래픽 기반의 사용자 인터페이스를 말한다.&lt;/li&gt;
&lt;li&gt;GUI는 일반적으로 사용자가 운영체제를 쉽게 사용하도록 만든 개념으로, 키보드를 이용하여 텍스트 기반으로 운영체제나 프로그램을 제어하는 CLI(Command Line Interface)와 구분된다.&lt;/li&gt;
&lt;li&gt;GUI 인터페이스와 응용 프로그램의 관계는 다음과 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 입력 &amp;rarr; GUI 사용자 인터페이스 &amp;harr; (입력, 출력) &amp;harr; 응용 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자바에서는 GUI 프로그래밍을 할 수 있게 AWT와 Swing이라는 두 가지 라이브러리를 제공하며, 자바 8에서는 JavaFX가 기본 GUI 기술로 자리 잡았다.&lt;/li&gt;
&lt;li&gt;화면을 구성하는 버튼, 스크롤 바, 창, 아이콘, 툴바, 메뉴 바 등을 컴포넌트라고 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GUI 프로그램의 구조&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&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;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;레이아웃&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;컴포넌트를 응용 프로그램에 배치하는 것을 말한다.&lt;/li&gt;
&lt;li&gt;자바에서는 레이아웃 관리자를 이용하여 레이아웃을 배치한다. 많이 사용하는 레이아웃에는 FlowLayout, GridLayout, BorderLayout, CardLayout 등이 있다.&lt;/li&gt;
&lt;li&gt;레이아웃은 컨테이너 클래스, 즉 다른 컴포넌트를 담을 수 있는 객체인 Fream, Panel 클래스에 적용할 수 있다.&lt;/li&gt;
&lt;li&gt;각 레리아웃마다 특징적인 요소들을 속성이나 메서드로 설정하거나 컴포넌트를 컨테이너에 추가할 때 레이아웃 속성을 추가하면 원하는 위치에 배치할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이벤트&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GUI 프로그램에서 발생하는 특정 시점의 의미있는 신호로, 사용자의 입력 결과를 응용 프로그램에 전달한다.&lt;/li&gt;
&lt;li&gt;마우스, 키보드 등은 대표적인 이벤트 발생 소스라고 할 수 있다.&lt;/li&gt;
&lt;li&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;마우스, 키보드 &amp;rarr; (인터럽트 시그널이 발생) &amp;rarr; AWT 스레드 &amp;rarr; (이벤트 발생) &amp;rarr; 이벤트 프로세싱(addXxxListener - (Listener 등록) - 이벤트 핸들러) &amp;rarr; (이벤트 전달) &amp;rarr; 이벤트 핸들러&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이런 이벤트 모델은 자바, 안드로이드, iOS 등 여러 운영체제에서 거의 비슷한 형태로 적용된다.&lt;/li&gt;
&lt;li&gt;이벤트 핸들러 클래스의 이름은 XxxListener 형태이다.&lt;/li&gt;
&lt;li&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;구현 방식에 따라 이벤트를 처리하는 핸들러를 사전에 정의한다.&lt;/li&gt;
&lt;li&gt;이벤트 처리가 필요한 컴포넌트 대상을 정하고, 해당 컴포넌트에 이벤트 핸들러를 등록한다.&lt;/li&gt;
&lt;li&gt;이벤트 핸들러 클래스에서 요구하는 메서드를 오버라이딩하고, 이벤트를 발생할 때 필요한 기능을 구현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자료구조와 컬렉션 프레임워크&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자료구조&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법을 말한다.&lt;/li&gt;
&lt;li&gt;컴퓨터 분야에서는 프로그램 연산에 필요한 데이터들을 효과적으로 사용하려고 고안했다.&lt;/li&gt;
&lt;li&gt;자료구조를 구현하려면 문제를 해결하는 데 적절한 알고리즘이 필요하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자료구조의 종류&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;배열(Array)&lt;/b&gt;: 동일한 타입의 데이터를 연속된 공간에서 관리하는 자료구조이다. 크기가 고정되어 있고 0부터 시작하는 인덱스로 접근할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연결 리스트(Linked List)&lt;/b&gt;: 배열과 유사하지만 논리적으로 연속된 자료 관리를 지원한다. 각 데이터는 노드(Node)로 구분되고, 각 노드에는 다음 데이터의 위치 정보가 들어간다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이중 연결 리스트(Double Linked List)&lt;/b&gt;: 단순 연결 리스트에 이전 데이터의 위치 정보가 추가된 것으로 처음 노드와 마지막 노드를 연결시키면 환형 연결 리스트(Circular Linked List)가 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해시 테이블(Hash Table)&lt;/b&gt;: 임의의 메모리 공간에 데이터를 (Key, Value) 쌍으로 저장하는 형태의 자료구조이다. 내부적으로 버킷(Bucket)이라는 공간으로 구성된 테이블 형태를 취하며, 해시함수를 사용하여 키값을 버킷의 위치 정보로 변환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스택(Stack)&lt;/b&gt;: 데이터를 차곡차곡 쌓는 형태의 자료구조이다. 마지막에 들어간 데이터가 제일 먼저 참조되는 구조(LIFO, Last In First Out)이다. 스택을 이용하면 처리한 작업을 역순으로 진행하는 것이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;큐(Queue)&lt;/b&gt;: 스택과 유사하지만, 먼저 들어온 순서대로 데이터를 처리한다. 요청과 처리를 동시에 할 수 없을 때 먼저 요청된 작업을 먼저 처리하는 용도로 사용한다. 프린터 큐, 비디오 버퍼링 등에 응용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트리(Tree)&lt;/b&gt;: 모든 노드가 루트(Root)라는 최상위 노드에서 시작하며, 각 노드는 부모-자식 관계를 가진다. 컴퓨터 하드디스크의 폴더 구조도 트리 구조이다. 자식 노드가 없는 노드는 리프 노드(Leaf Node)라고 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그래프(Graph)&lt;/b&gt;: 연결되어 있는 객체 간의 관계를 표현할 수 있는 자료구조이다. 그래프의 핵심은 탐색으로 주어진 노드 간의 최소 경로나 최적 경로를 구하는 데 필요한 알고리즘을 구현하는 것이다. 그래프는 G = (V, E)로 표현한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바 컬렉션 프레임워크&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;컬렉션 프레임워크는 자료구조와 관련된 여러 클래스를 정의한 큰 틀로, 자바 자료구조 클래스 개발의 기반이 된다.&lt;/li&gt;
&lt;li&gt;기본적으로 Collection 인터페이스를 상속받는 Set, List, Queue, Deque 인터페이스와 Map 인터페이스를 상속받는 SortedMap 인터페이스로 구성된다. 실제로 프로그램을 작성할 때는 AbstractList, AbstractQueue, AbstractSet, AbstractMap, Dictionary 등 클래스와 이것을 상속받는 ArrayList, HashMap 등 클래스를 주로 사용한다.&lt;/li&gt;
&lt;li&gt;컬렉션 프레임워크를 이용하여 개발자가 복잡한 알고리즘 등을 구현하는 데 들이는 시간과 노력을 줄일 수 있고, 고성능의 자료구조를 제공하여 프로그램의 성능을 향상시킬 수 있다. 또 자료구조 API를 따로 배울 필요가 없고, 표준화된 컬렉션 인터페이스 구조를 제공하여 소프트웨어 재사용이 촉진된다.&lt;/li&gt;
&lt;li&gt;List는 연속된 자료를 처리하는 인터페이스로, 연결 리스트와 구조가 동일하다. ArrayList와 LinkedList가 실제로 구현된 클래스이다.&lt;/li&gt;
&lt;li&gt;Set은 중복되지 않은 자료를 (Key, Value) 쌍으로 저장하고 검색하는 자료구조로, 해시 테이블 구조를 제공한다. Map은 Set과 기본적으로 동일하며, 자료의 중복을 허용한다는 차이만 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ArrayList&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바에서 가장 널리 사용하는 자료구조 클래스이다. 배열과 유사한 형태의 데이터 관리가 필요할 때 사용할 수 있다. 배열과 달리 크기를 지정할 필요가 없고, Object형 원소를 지정하여 다양한 데이터 처리가 가능한 것이 특징이다.&lt;/li&gt;
&lt;li&gt;Object 타입의 데이터를 일관되게 처리하려면 객체 선언을 할 때 제네릭 타입을 반드시 지정해야 한다.&lt;/li&gt;
&lt;li&gt;add() 메서드로 데이터를 추가하고, get() 메서드로 데이터를 가져온다. 데이터 참조는 배열과 마찬가지로 0부터 시작되는 인덱스 값을 사용한다.&lt;/li&gt;
&lt;li&gt;대량의 데이터를 구성한 후 반복해서 참조할 때 유용하게 활용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HashMap&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본적으로 (Key, Value) 쌍으로 데이터를 관리하는 자료구조를 제공하며, 전체 데이터 중 특정 데이터만 신속하게 검색해야 할 때 유용하다.&lt;/li&gt;
&lt;li&gt;키, 값 모두 제네릭 타입을 명시해 주는 것이 좋다.&lt;/li&gt;
&lt;li&gt;put() 메서드로 데이터를 추가하고, get() 메서드로 데이터를 가져온다. 데이터를 가져오는 경우에는 저장할 때 쓴 키 값을 사용한다.&lt;/li&gt;
&lt;li&gt;ArrayList와 달리 전체 데이터를 순차적으로 접근하는 것은 불편하고, 필요하다면 values() 메서드로 Collection 타입으로 변환한 후 사용할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 프로그래밍&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDBC&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;JDBC는 Java DataBase Connectivity의 약어로, 자바에서 데이터베이스 연동 프로그램을 할 수 있도록 만든 기술이다.&lt;/li&gt;
&lt;li&gt;JDBC는 데이터베이스 연결 및 쿼리에서 표준화된 인터페이스를 정의한다. 데이터베이스 회사에서는 자신들의 데이터베이스에 맞는 JDBC Driver를 개발하여 배포하기 때문에 개발자들은 데이터베이스 회사와 상관없이 표준화된 API를 이용하여 프로그램을 개발할 수 있다.&lt;/li&gt;
&lt;li&gt;프로그램에서 JDBC를 사용하려면 해당 데이터베이스 제품에 맞는 JDBC Driver가 필요하다. 보통 .jar 파일로 배포하는데, 자바의 클래스 경로상에 있어야 프로그램에서 참조가 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDBC 프로그램 개발 절차&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;JDBC는 정해진 규칙과 절차에 따라 프로그램해야 한다.&lt;/li&gt;
&lt;li&gt;JDBC Driver의 이름은 JDBC를 구현한 클래스 이름으로, 데이터베이스 회사마다 다른 이름을 사용한다. MySQL은 com.mysql.jdbc.Driver이다.&lt;/li&gt;
&lt;li&gt;JDBC URL은 프로그램에서 특정 데이터베이스에 접속하려고 접속 관련 정보를 표현한 것이다. JDBC Driver 이름과 마찬가지로 각 데이터베이스 회사마다 조금씩 다른 구성을 사용한다. MySQL은 jdbc:mysql://DB서버의 IP 주소/스키마:PORT이다.&lt;/li&gt;
&lt;li&gt;데이터베이스 프로그램을 작성할 때는 사용한 DB 연결 자원을 반드시 반납해야 한다. 예를 들어 Statement, PreparedStatement, ResultSet, Connection 등은 close() 메서드를 사용하여 연결을 종료한다.&lt;/li&gt;
&lt;li&gt;DB 조회 결과를 처리하는 ResultSet 객체는 실제 데이터를 가져오는 것이 아니라 검색된 데이터의 위치 정보로 자원을 close()하기 전에 getXxx() 메서드를 사용하여 필요한 데이터를 확보하는 것이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/oPn0K/btqJ8e0NBea/t1L5gtLjK9a7WDYw0rxks0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oPn0K/btqJ8e0NBea/t1L5gtLjK9a7WDYw0rxks0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oPn0K/btqJ8e0NBea/t1L5gtLjK9a7WDYw0rxks0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoPn0K%2FbtqJ8e0NBea%2Ft1L5gtLjK9a7WDYw0rxks0%2Fimg.png&quot; width=&quot;100%&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;h2 data-ke-size=&quot;size26&quot;&gt;자바 고급 프로그래밍 기술&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외 처리&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;예외 처리는 프로그램 수행 과정에서 발생할 수 있는 문제점을 사전에 검토하고, 예상치 못한 문제가 발생했을 때 처리를 강제하는 자바 언어의 구현 특징 중 하나이다.&lt;/li&gt;
&lt;li&gt;자바에서 오류는 프로그램 문법이나 잘못된 라이브러리 참조 등으로 발생하는 컴파일 오류와 프로그램 실행 과정에서 발생하는 런타임 오류로 구분한다. 예외는 일종의 런타임 오류에 해당하며, 프로그램을 실행할 때 발생하는 예기치 못한 상황을 의미한다.&lt;/li&gt;
&lt;li&gt;throws는 구현하는 메서드에서 특정 예외를 처리하지 않음을 명시적으로 선언하는 것이다. 이때 메서드 안에서는 try ~ catch 구문을 사용할 필요가 없고, 메서드를 호출하는 쪽에서 예외 처리를 요구한다.&lt;/li&gt;
&lt;li&gt;예외 처리의 기본 구문은 다음과 같다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;try {
    예외 처리를 요구하는 메서드 호출 부분
} catch (XXException e) {
    예외 처리 코드 블록
} finally {
    예외 상황이나 그렇지 않을 때 모두 처리되는 블록
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스레드&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스레드는 프로세스에서 독자적인 명령어 제어권을 갖고, 프로세스에 있는 리소스를 공유하는 프로그램의 실행 단위를 말한다.&lt;/li&gt;
&lt;li&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;장점
&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;/ul&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;프로세스 밖에서 각 스레드를 제어할 수 없다.&lt;/li&gt;
&lt;li&gt;멀티스레드 프로그램을 작성할 때 오류 발생 가능성이 커지고, 잘못된 프로그램은 시스템에 영향을 미친다.&lt;/li&gt;
&lt;li&gt;프로그램 디버깅이 상대적으로 어렵다.&lt;/li&gt;
&lt;li&gt;단일 프로세서 시스템에서는 큰 효과를 기대하기 어렵다.&lt;/li&gt;
&lt;li&gt;동기화(Synchronization), 교착 상태(Deadlock) 등의 문제를 고려해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스레드의 구현 방법에는 Runnable 인터페이스를 구현하는 방법과 Thread 클래스를 상속받는 방법이 있다.&lt;/li&gt;
&lt;li&gt;스레드는 run, blocked, daed 중 하나의 상태에 머무르게 된다. create는 스레드를 생성하는 상태, runnable은 실행 가능한 상태를 나타낸다. 그리고 running은 스레드가 실행된 상태이고, blocked는 스레드가 실행을 중지하고 잠시 멈춰 있는 상태이다. 마지막으로 dead는 스레드를 메모리에서 삭제한 상태이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;람다식&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;람다식은 자바 8의 가장 큰 특징 중 하나로, 함수형 프로그래밍의 기본이 된다.&lt;/li&gt;
&lt;li&gt;함수에 기반을 두고 데이터를 중심으로 프로그램을 기술하는 형태인 함수형 언어에는 LISP, 하스켈(Haskell), 얼랭(Erlang), f#, 클로저(Clojure) 등이 있다. 이런 함수형 언어는 단순화된 구조로 입력과 출력을 가능하게 하는 익명화된 함수 표기법인 '람다식'을 사용한다.&lt;/li&gt;
&lt;li&gt;함수형 인터페이스는 메서드가 하나만 있는 인터페이스를 말하는 것으로, 람다식과 함께 자바 8에 추가된 기능이다. 기존의 익명 함수 표기법을 이용한 구현 모델을 람다식 형태로 확장할 수 있도록 추구된 개념이며, @FunctionalInterface 어노테이션을 사용한다.&lt;/li&gt;
&lt;li&gt;람다식에서는 파라미터의 타입을 자동으로 유추하므로 따로 지정할 필요가 없다.&lt;/li&gt;
&lt;li&gt;다음은 간단한 함수 구조를 람다식으로 표현한 것이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;일반 자바 함수 형태&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public void printMsg(String msg) {
    System.out.println(msg);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;람다식 형태&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;(String msg) -&amp;gt; {System.out.println(msg);}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT</category>
      <category>java</category>
      <category>개념</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/75</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-JAVA-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90#entry75comment</comments>
      <pubDate>Sun, 4 Oct 2020 02:14:12 +0900</pubDate>
    </item>
    <item>
      <title>[정리] IT 인프라 구조</title>
      <link>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-IT-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B5%AC%EC%A1%B0</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 10월 20일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;toc-contents&quot;&gt;
  &lt;!-- TOC 시작 --&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;div id=&quot;rgyTOC&quot;&gt;
&lt;ul id=&quot;toc&quot;&gt;&amp;nbsp;&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- TOC 끝 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;참고도서&lt;br /&gt;야마자키 야스시 외 3인. 『그림으로 공부하는 IT 인프라 구조』. 제이펍. 2015&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;1. 인프라 아키텍처&lt;/h2&gt;
&lt;h3&gt;1.1 개념&lt;/h3&gt;
&lt;p&gt;인프라(infra)는 말 그대로 '기반 시설'을, 아키텍처는 '구조'를 의미한다.&lt;/p&gt;
&lt;p&gt;즉, IT 인프라 아키텍처는 서버, 네트워크 등 하드웨어부터 소프트웨어까지 IT 운영에 필요한 제반 사항들을 말한다.&lt;/p&gt;
&lt;p&gt;IT 업계에서 사용되는 인프라 아키텍처는 크게 구성 방식에 따라 '집약형'과 '분할형'으로 나뉘며,&lt;/p&gt;
&lt;p&gt;'분할형'은 다시 '수직 분할', '수평 분할', '지리 분할'로 나뉜다.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1.2 집약형과 분할형 아키텍처&lt;/h3&gt;
&lt;h4&gt;1.2.1 집약형 아키텍처&lt;/h4&gt;
&lt;p&gt;하나의 대형 컴퓨터로 모든 처리를 하는 방식.&lt;/p&gt;
&lt;p&gt;'범용 장비', '호스트', '메인 프레임' 등으로 불린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;한 대의 대형 컴퓨터만 있으면 되므로 구성이 간단하다.&lt;/li&gt;
&lt;li&gt;대형 컴퓨터의 리소스 관리나 이중화에 의해 안정성이 높고 고성능이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;대형 컴퓨터의 도입 비용과 유지 비용이 크다.&lt;/li&gt;
&lt;li&gt;확장성에 한계가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.2.2 분할형 아키텍처&lt;/h4&gt;
&lt;p&gt;여러 대의 소형 컴퓨터를 조합해서 하나의 시스템을 구축하는 구조이다.&lt;/p&gt;
&lt;p&gt;'오픈 시스템', '분산 시스템' 등으로 불리며, 분할형 아키텍처에서 이용되는 컴퓨터를 '서버'라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;낮은 비용으로 시스템을 구축할 수 있다.&lt;/li&gt;
&lt;li&gt;서버 대수를 늘릴 수 있어서 확장성이 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;대수가 늘어나면 관리 구조가 복잡해진다.&lt;/li&gt;
&lt;li&gt;한 대가 망가지면 영향 범위를 최소화하기 위한 구조를 검토해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1.3 수직 분할형 아키텍처&lt;/h3&gt;
&lt;p&gt;분할형에서는 서버 분할 방식으로 고려해야 한다.&lt;/p&gt;
&lt;p&gt;서버별로 다른 역할을 담당하는 방식이 '수직 분햘형 아키텍처'이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.3.1 클라이언트-서버형(C/S) 아키텍처&lt;/h4&gt;
&lt;p&gt;업무 애플리케이션, 미들웨어, 데이터베이스 등의 소프트웨어를 '물리 서버' 상에서 운영하고, 이들 소프트웨어에 '클라이언트' 또는 '단말'이라 불리는 소형 컴퓨터가 접속해서 이용하는 형태.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트 측에서 많은 처리를 할 수 있어서 소수의 서버로 다수의 클라이언트를 처리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트 측의 소프트웨어 정기 업데이트가 필요하다.&lt;/li&gt;
&lt;li&gt;서버 확장성에 한계가 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.3.2 3계층형 아키텍처&lt;/h4&gt;
&lt;p&gt;클라이언트-서버형을 발전시킨 것으로, '프레젠테이션 계층', '애플리케이션 계층', '데이터 계층'의 3층 구조로 분할되어 있다. 대부분의 인터넷/모바일 등 대부분의 시스템에서 3계층 구조를 채용하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;프레젠테이션 계층&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;사용자 입력을 받는다.&lt;/li&gt;
&lt;li&gt;웹 브라우저 화면을 표시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;애플리케이션 계층&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;사용자 요청(request)에 따라 업무 처리를 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;데이터 계층&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션 계층의 요청에 따라 데이터 입출력을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;구조가 클라이언트-서버 구성보다 복잡하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1.4 수평 분할형 아키텍처&lt;/h3&gt;
&lt;p&gt;수직 분할형 아키텍처가 서버별로 다른 역할을 하도록 구성한 것이라면, 수평 분할형 아키텍처는 용도가 같은 서버를 늘려 안정성 및 성능을 향상시키기 위한 구조이다.&lt;/p&gt;
&lt;p&gt;대부분의 시스템에서는 수직 분할형과 수평 분할형을 함께 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.4.1 단순 수평 분할형 아키텍처&lt;/h4&gt;
&lt;p&gt;'sharding(샤딩)', 'partitioning(파티셔닝)'등으로 불린다.&lt;/p&gt;
&lt;p&gt;같은 기능을 가진 복수의(독립된) 시스템으로 단순히 분할한 구조이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;수평으로 서버를 늘리기 때문에 확장성이 향상된다.&lt;/li&gt;
&lt;li&gt;분할한 시스템이 독립적으로 운영되므로 서로 영향을 주지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.4.2 공유형 아키텍처&lt;/h4&gt;
&lt;p&gt;단순 수평 분할형과는 달리, 3계층 중 '데이터 계층'이 서로 동기화가 되어 어느 쪽에서든 데이터를 참조할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;수평으로 서버를 늘리기 때문에 확장성이 향상된다.&lt;/li&gt;
&lt;li&gt;분할한 시스템이 서로 다른 시스템의 데이터를 참조할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;분할한 시스템 간 독립성이 낮아진다.&lt;/li&gt;
&lt;li&gt;공유한 계층의 확장성이 낮아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1.5 지리 분할형 아키텍처&lt;/h3&gt;
&lt;p&gt;업무 연속성 및 시스템 가용성을 높이기 위해 지리적으로 분할한 아키텍처를 말한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.5.1 스탠바이형 아키텍처&lt;/h4&gt;
&lt;p&gt;'HA(High Availability, 고가용성) 구성', '액티브-스탠바이 구성' 등으로 불린다.&lt;/p&gt;
&lt;p&gt;물리 서버를 최소 두 대를 준비하여 한 대에 장애가 발생하면 그 즉시 가동중인 소프트웨어를 다른 한 대로 옮겨서 운영하는 방식이다.&lt;/p&gt;
&lt;p&gt;이때 소프트웨어 재시작을 자동으로 하는 구조를 '페일오버(failover)'라고 한다. 단, 페일오버 대상 서버가 놀고 있는 상태가 되기 때문에 리소스 측면에서 낭비가 발생한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.5.2 재해 대책형 아키텍처&lt;/h4&gt;
&lt;p&gt;특정 데이터 센터(사이트)에 있는 상용 환경에 고장이 발생하면 다른 사이트에 있는 재해 대책 환경에서 업무 처리를 재개하는 것을 말한다. 단, 애플리케이션 최신화와 데이터 최신화가 문제가 될 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1.5.3 클라우드형 아키텍처&lt;/h4&gt;
&lt;p&gt;3계층형 시스템의 일부 또는 전부가 클라우드 서비스 제공자가 보유하고 있는 물리 서버에서 동작한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;SaaS(Software as s Service) 모델&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;서버, 애플리케이션을 포함한 업무 시스템을 클라우드 서비스 회사에서 제공.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;PaaS(Platform as a Service), IaaS(Infrastructure as a Service), DBaaS(Database as a Service) 모델&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;일반적인 3계층형 시스템을 구성하는 서버의 일부 혹은 전부를 클라우드 상의 리소스로 대체.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;2. 서버를 열어 보자&lt;/h2&gt;
&lt;p&gt;(생략)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;3. 3계층형 시스템&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;3.1 3계층형 시스템의 구성도&lt;/h3&gt;
&lt;p&gt;3계층 시스템은 웹 서버 &amp;lt;-&amp;gt; AP 서버 &amp;lt;-&amp;gt; DB 서버로 구성되어 있고, 세 대의 서버는 스위치를 경유해서 연결되어 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3계층형 시스템에 대한 보다 자세한 사항은 '제이펍' 사이트에서 다운로드 가능.&lt;br /&gt;&lt;a href=&quot;http://jpub.tistory.com/503&quot;&gt;http://jpub.tistory.com/503&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;3.2 주요 개념 설명&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.2.1 프로세스와 스레드&lt;/h4&gt;
&lt;p&gt;프로세스 및 스레드는 프로그램 실행 파일 자체가 아니라 OS 상에서 실행돼서 어느 정도 독립성을 가지고 동작하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;프로세스&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;전용 메모리 공간을 이용해서 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;장점&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;개별 처리 독립성이 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;단점&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;생성 시 CPU 부하가 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;스레드&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;다른 스레드와 메모리 공간을 공유한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;장점&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;생성 시 부하가 낮다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;메모리 공간을 공유하기 때문에, 의도하지 않는 데이터 읽기/쓰기가 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.2.2 OS 커널&lt;/h4&gt;
&lt;p&gt;OS의 본질은 커널이다.&lt;br /&gt;커널의 역할은 크게 여섯 가지로 나눌 수 있다.&lt;/p&gt;
&lt;ol&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;li&gt;장치 드라이버&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;시스템 콜 인터페이스&lt;/h5&gt;
&lt;p&gt;AP가 OS를 통해서 어떤 처리를 하고 싶을 때 시스템 콜(디스크 I/O, 네트워크 I/O 등)을 이용하여 커널에 명령을 내린다. 이때 명령이 인터페이스를 통해서 전달된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;프로세스 관리&lt;/h5&gt;
&lt;p&gt;프로세스의 처리 우선순위를 결정하는 등 CPU 코어를 고려하여 프로세스를 관리한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;메모리 관리&lt;/h5&gt;
&lt;p&gt;물리 메모리 공간의 최대치를 고려하여, 프로세스가 이용하는 독립 메모리 공간을 확보하는 등 메모리 영역을 관리한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;네트워크 스택&lt;/h5&gt;
&lt;p&gt;차후 네트워크 부분에서 설명.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;파일 시스템 관리&lt;/h5&gt;
&lt;p&gt;파일 시스템용 인터페이스를 제공한다.&lt;br /&gt;파일 시스템은 OS 기능의 하나로서 물리 디스크에 제공된 데이터를 관리하는 기능이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장치 드라이버&lt;/h5&gt;
&lt;p&gt;디스크나 NIC 등의 물리 장치용 인터페이스를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;3.2 웹 데이터 흐름&lt;/h3&gt;
&lt;p&gt;웹 데이터 흐름의 본질은 '요청 기반으로 어떠한 처리를 하고 필요에 따라 해당 요청을 삼자에게 할당하는 것'이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.3.1 클라이언트 PC부터 웹 서버까지&lt;/h4&gt;
&lt;ol&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;전자일때는 물리 디스크에서 내용을 취득하고, 후자일때는 AP 서버에 요청을 보낸다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.3.2 웹 서버부터 AP 서버까지&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;웹 서버로부터 요청이 도착한다.&lt;/li&gt;
&lt;li&gt;스레드가 요청을 받으면 자신이 계산할 수 있는지, 아니면 DB 접속이 필요한지를 판단한다.&lt;/li&gt;
&lt;li&gt;DB 접속이 필요하면 연결 풀(connection pool)에 액세스한다.&lt;/li&gt;
&lt;li&gt;DB 서버에 요청을 보낸다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.3.3 AP 서버부터 DB 서버까지&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;AP 서버로부터 요청이 도착한다.&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;결과를 AP 서버에 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.3.4 AP 서버부터 웹 서버까지&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;DB 서버로부터 데이터가 도착한다.&lt;/li&gt;
&lt;li&gt;스레드가 데이터를 가지고 계산 등을 한 후에 파일 데이터를 생성한다.&lt;/li&gt;
&lt;li&gt;결과를 웹 서버로 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3.3.5 웹 서버부터 클라이언트 PC까지&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;AP 서버로부터 데이터가 도착한다.&lt;/li&gt;
&lt;li&gt;프로세스는 받은 데이터를 그대로 반환한다.&lt;/li&gt;
&lt;li&gt;결과가 웹 브라우저로 반환되고 화면에 표시된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;4. 인프라 기본 이론&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.1 직렬/병렬&lt;/h3&gt;
&lt;p&gt;직렬 처리로 속도를 올리는 데는 한계가 있다.&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;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;직렬 장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;구조가 간단해서 설계나 구현 난이도가 낮다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;직렬 단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;복수의 리소스(컴퓨터나 프로세서 등)를 유용하게 이용할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;병렬 장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;복수의 리소스를 유용하게 이용할 수 있으며, 직렬에 비해 동일 시간당 처리할 수 있는 양이 증가한다. 또한, 일부가 고장 나더라도 처리를 계속할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;병렬 단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;처리 분기나 합류를 위한 오버헤드가 발생한다. 배타 제어 등을 고려해야 하고 구조가 복잡해서 설계나 구현 난이도가 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.2 동기/비동기&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;동기&lt;/h4&gt;
&lt;p&gt;다른 사람에게 일을 부탁한 후 끝날 때까지 아무것도 하지 않고 기다리기 때문에 그 사이에 다른 것을 할 수 없다. 하지만 의뢰한 것이 끝났는지 여부를 확실하게 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;의뢰한 처리가 끝났는지 여부를 쉽게 확인할 수 있어서 구조가 간단하다.&lt;/li&gt;
&lt;li&gt;구현 난이도가 낮다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;의뢰한 처리가 끝나기까지 기다려야 하기 때문에 대기 시간을 활용할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;비동기&lt;/h4&gt;
&lt;p&gt;끝날 때까지 기다리지 않기 때문에 병렬로 다른 일을 할 수 있다. 하지만 의뢰한 일이 끝났는지 여부를 확인하고 싶으면 별도의 방법을 이용해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;의뢰한 처리가 진행되고 있는 동안 시간을 효율적으로 사용해서 병렬 처리를 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;비동기 단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;의뢰한 처리가 끝났는지 확인하지 않으면 모르기 때문에 불필요한 확인 처리가 늘어난다. - 구조가 복잡해서 구현 난이도가 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.3 큐(queue)&lt;/h3&gt;
&lt;p&gt;큐(대기 행렬)에서는 줄을 설 때는 가장 마지막에 서고, 처리는 선두부터 순서대로 된다. 먼저 들어온 데이터가 먼저 나가는 큐 동작을 FIFO(First In First Out) 방식이라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;사용되는 곳&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CPU 처리를 기다리고 있는 프로세스나 스레드 행렬(런큐, run-queue)&lt;/li&gt;
&lt;li&gt;하드 디스크 등의 저장소 읽기 처리를 기다리고 있는 I/O 요구 행렬&lt;/li&gt;
&lt;li&gt;네트워크 접속 성립을 기다리고 있는 접속 요구 행렬&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.4 배타적 제어&lt;/h3&gt;
&lt;p&gt;복수의 처리가 공유 자원(CPU, 메모리, 디스크 등)에 동시에 액세스(주로 갱신)하면 불일치가 발생할 수 있기 때문에 배타적 제어로 보호해 주어야 한다.&lt;/p&gt;
&lt;p&gt;배타적 제어에서는 특정 처리가 공유 자원을 이용하고 있는 동안 다른 처리가 이용할 수 없계 해서 불일치가 발생하지 않도록 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;배타적 제어를 사용하는 경우 장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;공유 데이터의 일관성을 유지할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;배타적 제어를 사용하는 경우 단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;병렬 처리가 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;배타적 제어를 사용하지 않는 경우 장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;병렬로 빠르게 처리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;배타적 제어를 사용하지 않는 경우 단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;데이터 불일치가 발생할 가능성이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.5 상태 저장/상태 비저장&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;상태 저장(stateful)&lt;/h4&gt;
&lt;p&gt;상태를 고려하기 때문에 복잡한 처리가 가능하지만, 시스템 복잡성이 커진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;자신의 상태를 이해하기 때문에 요청 내용을 최소화할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;상태 비저장(stateless)&lt;/h4&gt;
&lt;p&gt;상태를 고려하지 않기 때문에 간단하며, 성능이나 안정성 측면에서 우수하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;요청과 그에 대한 응답 구조가 간단하다는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;프로세스 상태 전이(프로세스 처리는 상태 저장 방식)&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;애플리케이션을 실행하면 프로세스가 생성된다. (프로세스 실행 개시)&lt;/li&gt;
&lt;li&gt;실행 큐라 불리는 순서 대기 행렬에 줄을 선다. (실행 가능 상태)&lt;/li&gt;
&lt;li&gt;차례가 돌아오면 '실행 상태'로 전이하고 애플리케이션이 처리한다.&lt;/li&gt;
&lt;li&gt;디스크 액세스 등 I/O 대기가 발생하는 처리를 실행한 경우 '대기 상태'로 전이한다.&lt;/li&gt;
&lt;li&gt;이 세 가지 상태를 전이하면서 처리가 전부 끝나면 '종료 상태'가 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.6 가변 길이/고정 길이&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;가변 길이(variable-length)&lt;/h4&gt;
&lt;p&gt;공간을 유용하게 활용할 수 있지만 성능 면에서 불안정하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;고정 길이(fixed-length)&lt;/h4&gt;
&lt;p&gt;쓸데없는 공간이 생기지만 성능 면에서는 안정적이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.7 데이터 구조(배열과 연결 리스트)&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;배열&lt;/h4&gt;
&lt;p&gt;데이터를 빈틈없이 순서대로 나열한 데이터 구조.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;N번째 요소 탐색이 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;데이터 추가, 삭제가 느리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;연결 리스트&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;데이터를 선으로 연결한 데이터 구조.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;데이터 추가, 삭제가 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;단점&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;N번째 요소 탐색이 느리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;해시 테이블&lt;/h4&gt;
&lt;p&gt;배열과 연결 리스트의 상호 장점만 조합해서 약점을 보완한 데이터 구조.&lt;br /&gt;큐(queue)나 스택(stack) 등의 데이터 구조도 배열이나 연결 리스트로 구현돼 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;4.8 탐색 알고리즘(해시/트리 등)&lt;/h3&gt;
&lt;p&gt;필요한 때에 필요한 데이터를 빠르게 찾기 위해서 데이터를 정리해 둘 필요가 있다.&lt;/p&gt;
&lt;p&gt;데이터를 찾을 때의 데이터 구조와 데이터 저장 방식(메모리, HDD, SSD 등) 특성에 따라 적합한 데이터 정리 방법이 달라진다.&lt;/p&gt;
&lt;p&gt;데이터 정리 방법을 '데이터 구조', 처리 순서를 '알고리즘'이라고 한다.&lt;/p&gt;
&lt;p&gt;처리 상대에 맞추어 데이터 구조를 정리할 필요가 있기 때문에 '알고리즘과 데이터 구조'는 자주 함께 다루어진다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;5. 인프라 응용 이론&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.1 캐시(cache)&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;5.1.1 캐시란?&lt;/h4&gt;
&lt;p&gt;일부 데이터를 데이터 출력 위치와 가까운 지점에 일시적으로 저장한다.&lt;/p&gt;
&lt;p&gt;데이터 재사용을 전제로 한다.&lt;/p&gt;
&lt;p&gt;데이터가 실제 데이터와 캐시라는 이중 구조로 저장되기 때문에 리소스 소비가 늘어난다.&lt;/p&gt;
&lt;p&gt;설계 시에는 어떤 데이터를 캐시하는 것이 효과적인지를 검토해야 한다.&lt;/p&gt;
&lt;p&gt;시스템 가동 직후 등에는 캐시에 데이터가 없기 때문에 원하는 성능이 나오지 않을 수 있다.&lt;br /&gt;캐시의 데이터가 손실되는 경우를 대비해서 복구 순서를 설계 시에 확립해야 한다.&lt;/p&gt;
&lt;p&gt;쓰기 데이터를 캐시할 때 캐시가 여러 개 있으면 갱신된 최신 데이터를 서로 뺏으려는 상태가 발생하지 않도록 주의해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;적합한 시스템&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;참조 빈도가 높은 데이터&lt;/li&gt;
&lt;li&gt;캐시의 데이터가 손실돼도 문제가 없는 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;부적합한 시스템&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;데이터 갱신 빈도가 높은 시스템&lt;/li&gt;
&lt;li&gt;대량의 데이터에 액세스하는 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.2 끼어들기(interrupt)&lt;/h3&gt;
&lt;p&gt;키보드 입력 등의 특정 이벤트가 발생했을 때 CPU에 이것을 알려서 해당 이벤트에 대응하는 처리를 끝낸 후 원래 하던 처리를 계속하는 것.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.3 폴링(polling)&lt;/h3&gt;
&lt;p&gt;질의 방향이 단방향이다.&lt;/p&gt;
&lt;p&gt;질의는 일정 간격을 따라 정기적으로 발생한다.&lt;/p&gt;
&lt;p&gt;반복(루프)만 하면 되기에 프로그래밍이 쉽다.&lt;/p&gt;
&lt;p&gt;상대가 응답하는지 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;모아서 일괄적으로 처리할 수 있다.&lt;/p&gt;
&lt;p&gt;네트워크를 경유한 폴링일 때는 처리 지연 시간을 줄이기 위해 폴링 간격을 너무 짧게 잡으면 트래픽 양이 증가하므로 주의가 필요하다. 또한, 서버의 리소스 소비도 늘어난다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;적합한 처리&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;일정 간격으로 처리를 실행하는 좋은 처리&lt;/li&gt;
&lt;li&gt;감시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;부적합한 처리&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;상태가 아닌 입력 내용에 따라 실행 내용을 변경하는 처리&lt;/li&gt;
&lt;li&gt;처리 우선순위를 정해야 하는 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.4 핑퐁(pingpong)&lt;/h3&gt;
&lt;p&gt;예를 들어, 물건을 상자에 넣어서 나를 때 적절한 크기의 상자를 사용하면 쉽게 나를 수 있다. 그런데 상자가 너무 작아서 짐을 운반하기 위해 몇 번이고 왕복해야 하는 상황을 &lt;b&gt;'핑퐁'&lt;/b&gt;이라 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;처리량 중시&lt;/h4&gt;
&lt;p&gt;큰 상자는 대량의 데이터를 빠르게 운반할 수 있다.(오라클의 'db file scattered read')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;지연 시간 중시&lt;/h4&gt;
&lt;p&gt;작은 상자는 소량의 데이터를 빠르게 운반할 수 있다.(오라클의 'db file sequential read')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.5 저널링(journal)&lt;/h3&gt;
&lt;p&gt;저널은 트랜잭션이나 매일 갱신되는 데이터의 변경 이력을 가리킨다. 저널을 남겨두는 것을 저널링이라 한다.(오라클의 Redo Log Buffer)&lt;/p&gt;
&lt;p&gt;데이터 자체가 아닌 처리(트랜잭션) 내용을 기록한다.&lt;/p&gt;
&lt;p&gt;데이터 일관성이나 일치성이 확보되면 필요 없어진다.&lt;/p&gt;
&lt;p&gt;데이터 복구 시 롤백(rollback), 롤포워드(rollforward)에 이용된다.&lt;/p&gt;
&lt;p&gt;저널 데이터는 메모리의 버퍼에 일단 저장된다. 이 정보가 디스크에 기록되지 않으면 장애 시에 잃을 수 있다. 이 때문에 시스템 요건에 따라 버퍼의 디스크 기록 시점을 검토, 조정해야 한다. 하지만 기록 빈도가 많으면 오버헤드가 높아지기 때문에 절충해서 검토해야 한다.&lt;/p&gt;
&lt;p&gt;저널은 트랜잭션 단위로 일치성을 보증하기 때문에 트랜잭션 도중에 장애가 발생하면 종료되지 않은 트랜잭션은 파괴된다. 하나의 트랜잭션 단위가 크면 트랜잭션 도중에 장애가 발생할 가능성이 높다. 따라서 트랜잭션이 길어지지 않도록 설계해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;적합한 시스템&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;데이터 갱신이 발생하는 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;부적합한 시스템&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;데이터 안정성보다 성능을 요구하는 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.6 복제(replication)&lt;/h3&gt;
&lt;p&gt;장애시 데이터 손시을 예방할 수 있다.&lt;/p&gt;
&lt;p&gt;복제를 이용한 부하분산이 가능하다.&lt;/p&gt;
&lt;p&gt;사용자가 데이터에 액세스할 때 복제한 것이라는 것을 의식할 필요가 없다.&lt;/p&gt;
&lt;p&gt;백업과 달리 실제 데이터가 복제 데이터와 실시간으로 동기화된다.&lt;/p&gt;
&lt;p&gt;복제 위치가 많으면 갱신이 많은 시스템과 같이 복제 오버헤드가 높아진다.&lt;/p&gt;
&lt;p&gt;실제 데이터와 복제 데이터를 완전히 일치시키고 싶으면 복제 데이터의 쓰기 완료 처리를 보장해야 한다. 이 경우 시스템 응답이 악화될 수 있다.&lt;/p&gt;
&lt;p&gt;시스템 유지관리나 장애 시에는 복제 데이터도 고려해야 하기 때문에 설계나 운용 난이도가 높아질 수 있다.&lt;/p&gt;
&lt;p&gt;복제 데이터와 실제 데이터의 차이가 커지면 그 차이를 채우기 위한 시간이나 성능도 고려해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;적합한 시스템&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;데이터 손실을 허용하지 않고 장애 시 복구 속도가 빨라야 하는 시스템.&lt;/li&gt;
&lt;li&gt;데이터 참조와 갱신 부분이 나뉘어져 있으며 참조가 많은 시스템.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;부적합한 시스템&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;데이터 갱신이 많은 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.7 마스터-슬레이브(master-slave)&lt;/h3&gt;
&lt;p&gt;마스터-슬레이브는 상호 접속 관계의 일종으로, 한 사람이 관리자가 돼서 모든 것을 제어한다.&lt;/p&gt;
&lt;p&gt;마스터-슬레이브의 반대가 피어 투 피어(peer-to-peer)&lt;/p&gt;
&lt;p&gt;마스터-슬레이브와 피어 투 피어의 장점만 조합해서 이용하는 경우가 오라클의 RAC이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;관리자가 한 명이기 때문에 구현이 쉽다.&lt;/li&gt;
&lt;li&gt;슬레이브 간 처리를 동기화할 필요가 없기 때문에 통신량이 줄어든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;마스터가 없어지면 관리를 할 수 없다(작업 인계 구조가 필요).&lt;/li&gt;
&lt;li&gt;마스터의 부하가 높아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.8 압축&lt;/h3&gt;
&lt;p&gt;압축의 기본은 '중복 패턴 인식'과 그것을 '변경'하는 것&lt;/p&gt;
&lt;p&gt;압축의 장점은 크기를 줄이는 것. 단점은 처리 시간이 걸린다는 것&lt;/p&gt;
&lt;p&gt;압축한 데이터를 원래대로 복원할 수 있는 가역 압축과 이미지나 음성 데이터 등에 있는 사람이 인식할 수 없는 부분을 생략하는 비가역 압축이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;5.9 오류 체크/오류 수정&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;오류 체크:&lt;/b&gt; 디지털 데이터의 오류를 스스로 확인하고, 파손되었을 때 이를 감지하는 것을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;오류 수정:&lt;/b&gt; 자동으로 복구하는 것을 가리킨다.&lt;/p&gt;
&lt;p&gt;오류 검출은 주로 패리티 비트(parity bit)를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;상위 계층에서의 오류 관리 없이 데이터 일치성을 일정 수준 보장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;체크 기능에 의한 리소스 부하 상승, 알고리즘의 복잡화 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;6. 시스템을 연결하는 네트워크 구조&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;6.2 계층 구조(계층 모델)&lt;/h3&gt;
&lt;p&gt;데이터나 기능 호출 흐름에 따라 계층 간 역할이 나누어진다.&lt;/p&gt;
&lt;p&gt;계층 모델의 대표적인 예가 'OSI 7계층 모델'이다. OSI 자체는 현재 사용되고 있지 않지만, 이 계층 구조 개념은 다양한 분야에서 공통적으로 참조할 수 있는 '참조 모델'로 현재도 사용되고 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션 계층(application layer): 애플리케이션 처리&lt;/li&gt;
&lt;li&gt;프레젠테이션 계층(presentation layer): 데이터 표현 방법&lt;/li&gt;
&lt;li&gt;세션 계층(session layer): 통신 시작과 종료 순서&lt;/li&gt;
&lt;li&gt;전송 계층(transport layer): 네트워크의 통신관리&lt;/li&gt;
&lt;li&gt;네트워크 계층(network layer): 네트워크 통신 경로 선택&lt;/li&gt;
&lt;li&gt;데이터 링크 계층(data link layer): 직접 좁속돼 있는 기기 간 처리&lt;/li&gt;
&lt;li&gt;물리 계층(physical layer); 전기적인 접속&lt;/li&gt;
&lt;/ul&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;Java VM&lt;/li&gt;
&lt;li&gt;커널&lt;/li&gt;
&lt;li&gt;하드웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;6.3 프로토콜(protocol)&lt;/h3&gt;
&lt;p&gt;컴퓨터가 서로 소통하기 위해 정한 규약을 가리킨다.&lt;/p&gt;
&lt;p&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;h3&gt;6.4 TCP/IP를 이용하고 있는 현재의 네트워크&lt;/h3&gt;
&lt;p&gt;인터넷을 포함해서 현재 네트워크를 지탱하는 것은 TCP/IP 및 관련 프로토콜(TCP/IP protocl suite)이다.&lt;/p&gt;
&lt;p&gt;OSI 참조 모델에서는 7계층으로 분할했지만, TCP/IP에서는 반드시 이 7계층이 분명하게 나누어지는 것은 아니다. TCP/IP 4계층 모델 등으로 불리며, OSI 7계층의 1&lt;/p&gt;
&lt;del&gt;2계층을 모아서 링크 계층, 5&lt;/del&gt;
&lt;p&gt;7계층을 모아서 애플리케이션으로 취급하기도 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;HTTP 통신의 경우&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;HTTP(애플리케이션 계층)&lt;/li&gt;
&lt;li&gt;TCP(전송 계층)&lt;/li&gt;
&lt;li&gt;IP(IP 계층)&lt;/li&gt;
&lt;li&gt;이너넷(링크 계층)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;TCP/IP는 4계층을 숫자로 부를 때는 OSI 참조 모델의 7계층 방식으로 부르는 경우가 많다.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;링크 계층(이더넷 계층): 레이어2, L2&lt;/li&gt;
&lt;li&gt;IP계층: 레이어3, L3&lt;/li&gt;
&lt;li&gt;전송 계층(TCP 계층): 레리어4, L4&lt;/li&gt;
&lt;li&gt;애플리케이션 계층: 애플리케이션 레이어, L7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;6.5 [레이어7] 애플리케이션 계층의 프로토콜 HTTP&lt;/h3&gt;
&lt;p&gt;애플리케이션이 없으면 통신이 시작되지 않는다.&lt;/p&gt;
&lt;p&gt;애플리케이션이 사용하는 프로토콜을 모두 애플리케이션 계층 프로토콜이라 부른다.&lt;/p&gt;
&lt;p&gt;애플리케이션 계층 프로토콜은 자신이 통신을 하는 것이 아니라 통신 자체는 모두 OS, 즉 TCP/IP에 맡긴다.&lt;/p&gt;
&lt;p&gt;브라우저에 URL을 입력해서 요청이 웹 서버에 도달하면 응답으로 HTML 파일이 반환된다. 브라우저는 이 파일을 해석해서 파일 내에 추가 이미지나 스크립트 등이 포함돼 있으면 다시 웹 서버에 이들을 요청한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.5.1 요청(request)과 응답(response)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;요청:&lt;/b&gt; 서버에 던지는 명령. 헤더 부분에는 다양한 부가 정보가 들어가며 세밀한 제어를 위해 사용(GET, POST).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;응답:&lt;/b&gt; 요청에 대한 결과와 그에 대한 상태 정보를 가지고 있다. 또한, 메시지 바디에 실제 데이터를 저장한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;6.6 [레이어4] 전송 계층 프로토콜 TCP&lt;/h3&gt;
&lt;p&gt;TCP의 역할은 애플리케이션이 보낸 데이터를 그 형태 그대로 상대방에게 확실하게 전달하는 것이다.&lt;/p&gt;
&lt;p&gt;TCP가 담당하는 것은 어디까지나 서버가 송신할 때와 서버가 수신할 후 애플리케이션에게 전달할 때로, 상대 서버까지 전송하는 부분은 하위 계층인 IP에 모두 위임한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.6.1 TCP의 기능(서비스)&lt;/h4&gt;
&lt;ul&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.6.2 커널 공간의 TCP 처리 흐름&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;소켓에 기록된 데이터는 큐를 경유해서 커널 내 네트워크 처리 부분에 전달된다.&lt;/li&gt;
&lt;li&gt;커널에 전달된 데이터는 '소켓 버퍼'라는 메모리 영역에서 처리된다.&lt;/li&gt;
&lt;li&gt;데이터에 TCP 헤더를 붙여서 TCP 세그먼트를 생성한다. TCP 헤더에는 목적 애플리케이션 포트 번호 신호를 포함해 TCP 기능에 필요한 다양한 정보가 기록된다.&lt;/li&gt;
&lt;li&gt;하나의 TCP 세그먼트로 전송할 수 있는 최대 크기를 MSS라고 한다. MSS를 초과한 데이터는 자동적으로 분할돼서 복수의 TCP 세그먼트가 생성된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.6.4 TCP 연결 생성(TCP/IP의 3-way handshaking)&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;클라이언트는 서버 측 OS에게 가상 경로를 열도록 의뢰한다.&lt;/li&gt;
&lt;li&gt;서버 측에서 리슨하고 있는 포트 번호로 통신 요구가 온다. 서버는 문제가 없으면 열어도 된다는 응답을 한다.&lt;/li&gt;
&lt;li&gt;클라이언트 측도 확인했다는 메시지를 보내며, 이때 처음으로 통신용 가상 경로가 열린다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.6.5 데이터 보증과 재전송 제어&lt;/h4&gt;
&lt;p&gt;연결이 생성된 후에야 데이터 송수신이 시작되는데, TCP에는 데이터가 확실히 전달되도록 보증하는 기능이 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;데이터 손실 방지:&lt;/b&gt; 확인 응답과 재전송에 의해 구현된다(ACK).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;데이터 순서 보증:&lt;/b&gt; 각 TCP 세그먼트에 시퀀스(sequence) 번호를 붙여서 구현한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.6.6 흐름 제어와 폭주&lt;/h4&gt;
&lt;p&gt;데이터를 보내고 ACK를 기다리는 처리를 반복(동기 처리)하다 보면 시간이 많이 걸린다.&lt;/p&gt;
&lt;p&gt;TCP는 어느 정도의 세그먼트 수라면 ACK를 기라디지 않고 전송하는 윈도우라는 개념을 가지고 있으며, ACK를 기다리지 않고 전송가능한 데이터 크기를 윈도우 크기라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;6.7 [레이어3] 네트워크 계층의 프로토콜 IP&lt;/h3&gt;
&lt;p&gt;TCP 세그먼트가 만들어지면 다음은 IP 처리가 시작된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.7.1 IP의 역할&lt;/h4&gt;
&lt;p&gt;-IP 주소를 이용해서 최종 목적지에 데이터 전송&lt;br /&gt;-라우팅(routing)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.7.2 커널 공간의 IP 처리 흐름&lt;/h4&gt;
&lt;p&gt;TCP 세그먼트에 IP 헤더를 붙여서 IP 패킷을 생성한다. 대상 서버까지는 이 IP 패킷 형태로 네트워크를 경유해서 도달한다. IP 헤더에는 최종 목적지 서버의 IP 주소가 기록된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.7.3 IP 주소를 이용한 최종 목적지로의 데이터 전송&lt;/h4&gt;
&lt;p&gt;IP 주소는 32비트로 표현된 숫자 집합이다. 사람이 읽기 쉽도록 8비트 단위로 마침표를 찍어서 표현한다.&lt;/p&gt;
&lt;p&gt;IP 주소는 네트워크부와 호스트부로 나뉜다. 네트워크부는 어떤 네트워크인지를 가리키고, 호스트부는 해당 네트워크 내에 있는 컴퓨터(소유자)를 가리킨다.&lt;/p&gt;
&lt;p&gt;네트워크부를 구분하기 위해 '/24'와 같은 CIDR(사이더) 표기를 사용한다. 또는 서브넷 마스크(subnet mask)라고 해서 255.255.255.0과 같이 표현하기도 한다.&lt;/p&gt;
&lt;p&gt;IP 주소 중 호스트부의 비트가 모두 0인 것을 네트워크 주소, 모두 1인 것을 브로드캐스트(broadcast) 주소라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;6.8 [레이어2] 데이터 링크 계층의 프로토콜 이너뎃&lt;/h3&gt;
&lt;p&gt;IP 패킷이 만들어지면 계속해서 링크 계층의 처리가 시작된다.&lt;/p&gt;
&lt;p&gt;이더넷을 포함한 링크 계층 프로토콜의 역할은 '동일 네트워크 내(링크 내) 데이터 전송'이다.&lt;/p&gt;
&lt;p&gt;이더넷은 동일 네트워크 내, 즉 자신이 포함된 링크 내에서만 데이터를 전송할 수 있다. 이때 사용되는 주소가 MAC(맥) 주소다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;6.8.2 커널 공간의 이더넷 처리 흐름&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;IP 패킷에 이더넷 헤더와 푸터를 붙여서 이더넷 프레임을 만든다. 헤더에는 링크 계층 주소인 MAC 주소가 기록돼 있다. 목적지 IP 주소에 따라 라우팅 테이블을 이용해서 어떤 NIC에서 보내야 할지를 결정한다.&lt;/li&gt;
&lt;li&gt;송신 큐에 넣은 후 장치 드라이버 경유로 NIC에 전달한다.&lt;/li&gt;
&lt;li&gt;커널 처리를 끝낸 프레임은 버스를 통해서 NIC로 보낸다.&lt;/li&gt;
&lt;li&gt;NIC에 연결된 장비로 프레임이 전송된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;7. 무정지를 위한 인프라 구조&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.1 안정성 및 이중화&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;안정성, 고가용성:&lt;/b&gt; 시스템 서비스가 가능한 한 멈추지 않도록 하는 것.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;이중화:&lt;/b&gt; 하나의 기능을 병렬로 여러 개 나열해서 하나에 장애가 발생해도 다른 것을 이용해서 서비스를 계속 할 수 있는 것을 가리킨다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.2 서버 내 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.2.1 전원, 장치 등의 이중화&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.2.2 네트워크 인터페이스 이중화&lt;/h4&gt;
&lt;p&gt;PCI 카드 이중화 및 포트 이중화로 카드 장애 및 포트 장애에 대응.&lt;/p&gt;
&lt;p&gt;네트워크 인터페이스 이중화는 하드웨어 또는 OS로 구현한다.&lt;/p&gt;
&lt;p&gt;리눅스 OS의 본딩(bonding) 구조. 본딩의 액티브-스탠바이 구성은 '액티브-백업'이라고 한다.&lt;/p&gt;
&lt;p&gt;본딩이 이중화된 네트워크 인터페이스를 감시하는 방버에는 두 가지가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MII 감시(Media Independent Interface, 대부분 선호)&lt;/li&gt;
&lt;li&gt;ARP 감시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.3 저장소 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.3.1 HDD 이중화&lt;/h4&gt;
&lt;p&gt;컨트롤러에는 CPU나 캐시가 있어서 HDD I/O 제어를 한다.&lt;/p&gt;
&lt;p&gt;최근에는 서버와 저장소 사이를 파이버 채널(FC)로 연결한 SAN(Storage Area Network) 네트워크 구성이 사용된다. SAN에서는 IP대신 WWN(World Wide Name) 주소를 이용해서 데이터를 전송한다.&lt;/p&gt;
&lt;p&gt;HDD를 서로 연결하는 내부 버스는 최근 SAS(Serial Attached SCSI) 방식을 사용한다.&lt;/p&gt;
&lt;p&gt;HDD 자체 이중화는 RAID를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;RAID의 장점&lt;/h5&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;RAID 구성 패턴&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;RAID0: 이중화 없이 HDD에 기록&lt;/li&gt;
&lt;li&gt;RAID1: 일반적으로 OS 디스크 이중화에 사용.&lt;/li&gt;
&lt;li&gt;RAID1+0: 복수의 HDD에 병렬로 이중 기록. 안정성과 성능을 균형 있게 구성. 그러나 미러링을 하기 때문에 HDD 전체 용량의 1/2 용량밖에 사용할 수 없다.&lt;/li&gt;
&lt;li&gt;RAID5: 이중화 확보를 위해 패리티 오류 수정 부호 기록. 패리티를 하나의 HDD에 집중시키지 않고 분산하는 것이 특징. 이중화 부분이 적고 (HDD 수 - 1) / HDD 수만큼의 용량을 사용할 수 있다. 그러나 패리티 연산이 이루어지기 때문에 I/O 성능이 RAID1+0에 비해 느리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.4 웹 서버 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.4.1 웹 서버의 서버 이중화(소프트웨어 관점)&lt;/h4&gt;
&lt;p&gt;클라이언트 관점에서는 서버 측이 프로세스로 가동되고 있는지, 스레드로 가동되고 있는지를 의식할 필요는 없다.&lt;/p&gt;
&lt;p&gt;아파치(Apache HTTP Server)에서는 어느 쪽이든 미리 여러 개를 가동시켜 두어서 클라이언트 요청에 빠르게 대응할 수 있는 구성을 가지고 있다. 프로세스/스레드 중 하나에 장애가 발생해도 다른 프로세스/스레드가 가동되고 있기 때문에 웹 서버의 서비스 전체가 정지되는 일은 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.4.2 서버 이중화(웹 서버 자체)&lt;/h4&gt;
&lt;p&gt;DNS를 이용해서 하나의 호스트명에 대해 복수의 IP 주소를 반환(DNS round robin).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;부하분산 장치를 이용한 웹 서버 이중화.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;부하분산 장치가 이전에 어느 웹 서버에 요청을 할당했는지를 쿠키에 저장한다. 이 쿠키를 읽어서 같은 서버에 요청을 할당한다.&lt;/li&gt;
&lt;li&gt;이를 통해 세션 상태를 저장할 수 있는데, 부하분산 장치는 임시 대응 관리표로 세션 테이블을 만든다.&lt;/li&gt;
&lt;li&gt;세션 상태 저장을 실현하는 기능을 부하분산 장치에서는 '퍼시스턴스(persistence, 지속성)'이라고 한다.
&lt;ul&gt;
&lt;li&gt;소스 IP 주소: 클라이언트 IP 주소를 기반으로 요청을 할당할 웹 서버를 결정.&lt;/li&gt;
&lt;li&gt;쿠키: HTTP 헤더 내에 접속한 웹 서버 정보를 저장.&lt;/li&gt;
&lt;li&gt;URL: URL구조 내에 접속한 웹 서버 정보를 저장.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부하분산 장치의 할당 알고리즘
&lt;ul&gt;
&lt;li&gt;라운드 로빈(round robin): 서버의 IP 주소에 순서대로 요청을 할당.&lt;/li&gt;
&lt;li&gt;최소 연결(least connection): 현재 활성 세션 수보다 세션 수가 가장 적은 서버의 IP 주소에 요청을 할당.&lt;/li&gt;
&lt;li&gt;응답 시간(response time): 서버의 CPU 사용률이나 응답 시간 등을 고려해서 가장 부하가 적은 서버의 IP 주소에 요청을 할당.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.5 AP 서버 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.5.1 서버 이중화&lt;/h4&gt;
&lt;p&gt;웹 서버와 같이 부하분산 장치를 이용하거나, AP 서버가 가진 웹 서버 요청 이중화 기능을 이용해서 AP 서버 요청을 분산.&lt;/p&gt;
&lt;p&gt;서버 내 이중화, 즉 하나의 AP 서버 내에 복수의 AP 서버가 존재하는 형태로, 복수의 JVM이 하나의 AP 서버에서 동작한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.5.2 DB 연결 이중화&lt;/h4&gt;
&lt;p&gt;AP 서버가 DB 서버에 접속하는 경우의 이중화.&lt;/p&gt;
&lt;p&gt;AP 서버에는 DB 서버에 접속 시에 사용할 연결(connection)을 사전에 여러 개 생성해 둔다(연결 풀링, connection pooling).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.6 DB 서버 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.6.1 서버 이중화(액티브-스탠바이)&lt;/h4&gt;
&lt;p&gt;액티브-스탠바이형의 클러스터(cluster) 구성(HA 구성). 일반적으로 클러스터 소프트웨어로 구현한다.&lt;/p&gt;
&lt;p&gt;클러스터의 노드나 서비스 관계는 마스터-슬레이브 개념을 기반으로 한다.&lt;br /&gt;서버가 정상 동작하는지 확인하기 위한 구조로 '하트비트(heartbeat)'나 '투표 장치(voting)' 같은 기능이 존재한다.&lt;/p&gt;
&lt;p&gt;액티브-스탠바이 구성은 서비스를 병렬로 실행할 수 없고 데이터 일관성을 중시하는 서비스/시스템에 적합하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;장애 발생시&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;클러스터 소프트웨어는 등록된 서비스가 정상 동작하고 있는지 정기적으로 확인한다. 이상이 발생하면 서비스를 정지하고 대기하고 있던 스탠바이 측 서비스를 시작해서 서비스를 유지시킨다(페일오버).&lt;/li&gt;
&lt;li&gt;클러스터 소프트웨어는 '하트비트'를 통해 상호 간의 상태를 확인한다. 하트비트를 통해 상태를 인식할 수 없게 되면, 페일 오버 실시 여부를 판단할 수 없다(스플릿 브레인, split-brain).&lt;/li&gt;
&lt;li&gt;스플릿 브레인 시, 투표 장치에 대한 투표 결과를 가지고 클러스터 소프트웨어가 살아 남을 노드를 선택한다(배타적 제어로 데이터 이중 기록 등의 문제 방지). 투표 장치는 하트비트 기능을 보완한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.6.2 서버 이중화(액티브-액티브)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;쉐어드 에브리씽형(shared everything):&lt;/b&gt; Oracle RAC, IBM DB2 puerScale. 디스크, 데이터를 모든 노드가 공유한다. 장애가 발생해도 다른 노드로 쉽게 처리를 계속할 수 있다.
&lt;ul&gt;
&lt;li&gt;캐시 퓨전(cache fusion): 캐시의 데이터를 네트워크 경유로 받아서 디스크 액세스를 줄이고 데이터 취득을 고속화한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쉐어드 낫씽형(shared nothing):&lt;/b&gt; Oracle MySQLCluster 등. 각 노드별로 디스크를 가지고 잇어서 데이터가 분산된다. 노드를 배치하기 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.7 네트워크 장비 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.7.1 L2 스위치 이중화&lt;/h4&gt;
&lt;p&gt;L2 스위치 A와 L2 스위치 B를 서로 캐스케이드(cascade)해서 패킷이 흐르도록 한다.&lt;/p&gt;
&lt;p&gt;최근에는 트렁크 포트를 사용하여 포트를 복수의 VLAN에 소속시켜 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.7.2 L3 스위치 이중화&lt;/h4&gt;
&lt;p&gt;기본적으로 액티브-스탠바이.&lt;/p&gt;
&lt;p&gt;L3 스위치는 스위치 기능과 간이 라우터 기능을 동시에 갖추고 있는 장비이다.&lt;/p&gt;
&lt;p&gt;L3 스위치의 액티브-스탠바이를 실현하는 프로토콜인 Virtual Router Redundancy Protocol(VRRP)가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;VRRP&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;어느 쪽 장비가 기본(마스터 라우터)인지를 정한다.&lt;/li&gt;
&lt;li&gt;정기적인 하트비트(advertisement)를 보내서 생존 감시를 한다.&lt;/li&gt;
&lt;li&gt;보조(백업 라우터) 장비가 애드버타이즈먼트를 일정 시간 수신하지 못하면 마스터 라우터 역할을 인계한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.7.3 네트워크 토폴로지&lt;/h4&gt;
&lt;p&gt;L2 스위치와 L2 스위치를 조합하는 구성을 말한다.&lt;/p&gt;
&lt;p&gt;복수의 경로가 존재하는 네트워크 구성을 '루프(loop)'라고 하는데, 이는 안정성 측면에서 좋지 않다.&lt;/p&gt;
&lt;p&gt;이를 해결하기 위한 수단으로 스패닝 트리 프로토콜(Spanning Tree Protocol, STP)를 사용한다.&lt;/p&gt;
&lt;p&gt;STP를 이용하여 논리적으로 포트를 절단(블로킹 포트)할 수 있다.&lt;/p&gt;
&lt;p&gt;장애 시에는 STP에 의한 재계산이 이루어지며, 논리적으로 절단돼 있는 포트를 개통해서 통신이 가능해진다.&lt;/p&gt;
&lt;p&gt;STP의 단점은 계산에 걸리는 시간인데, 현재는 RSTP(Rapid-STP)가 사용돼서 페일오버 시간은 거의 제로에 가깝다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.8 사이트 이중화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.8.2 웹사이트 이중화&lt;/h4&gt;
&lt;p&gt;글로벌 서버 부하분산(GSLB): 화재 등 재해에 대한 대책으로 원격지 데이터 센터와 연계하는 기술.&lt;/p&gt;
&lt;p&gt;DNS가 반환하는 IP 주소를 동적으로 변경한다.&lt;/p&gt;
&lt;p&gt;원격지에 데이터를 전송할 때 중요한 것은 동기/비동기 여부다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.9 감시&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.9.1 감시란?&lt;/h4&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;성능 감시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.9.2 생존 감시&lt;/h4&gt;
&lt;p&gt;예) ping 명령을 정기적으로 실행해서 서버 이터페이스에 대한 통신을 확인.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.9.3 로그 감시&lt;/h4&gt;
&lt;p&gt;OS나 미들웨어가 출력하는 로그 파일에는 시스템 유지를 위한 중요 정보가 포함돼 있다.&lt;/p&gt;
&lt;p&gt;로그 내용을 선별해서 중요한 로그 정보이면 감시 서버에 경고 메시지를 보낸다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.9.4 성능 감시&lt;/h4&gt;
&lt;p&gt;디스크 사용률, 메모리 사용 현황, 디스크 고갈 등의 리소스 상태 파악&lt;/p&gt;
&lt;p&gt;네트워크 액세스 지연, 디스크 액세스 시간 등의 응답 상태 파악.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.9.5 SNMP&lt;/h4&gt;
&lt;p&gt;SNMP는 네트워크 장비와 서버를 일괄 감시해서 관리할 수 있다.&lt;/p&gt;
&lt;ul&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.9.6 콘텐츠 감시&lt;/h4&gt;
&lt;p&gt;웹 시스템 특유의 감시. 부하분산 장치가 담당한다.&lt;/p&gt;
&lt;p&gt;부하분산 장치에 감시 대상 URL을 등록하고, HTTP의 GET 요청을 해서 정상 여부를 판단한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;7.10 백업&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.10.1 백업이란?&lt;/h4&gt;
&lt;p&gt;이중화와 다른 점은 데이터를 복제해서 별도 장소에 보관한다는 점이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;복구 지표를 정해서 백업을 설계한다.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;RTO(Recovery Time Objective): 복구 목표 시간&lt;/li&gt;
&lt;li&gt;RPO(Recovery Point Objective): 복구 기준 시점&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;시스템에서 백업해야 하는 대상.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;시스템 백업(OS나 미들웨어 등의 백업)&lt;/li&gt;
&lt;li&gt;데이터 백업(데이터베이스나 사용자 파일)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.10.2 시스템 백업&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;다음과 같은 시점에 실시.&lt;/h5&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;취득 방법&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;OS 명령(tar, dump 등)&lt;/li&gt;
&lt;li&gt;백업 소프트웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;7.10.3 데이터 백업&lt;/h4&gt;
&lt;p&gt;시스템 백업과 달리 매일 변경되는 데이터가 손실되지 않도록 하는 것으로, 취득 빈도가 높다.&lt;/p&gt;
&lt;p&gt;데이터베이스 백업은 데이터 자체와 데이터 갱신 내역이 기록돼 있는 저널(journal)을 모두 취득하도록 하고 있다.&lt;/p&gt;
&lt;p&gt;데이터는 기본적으로 서비스를 정지할 수 변경이 발생하지 않는 상태에서 취득한다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>IT</category>
      <category>아키텍처</category>
      <category>인프라</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/74</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-IT-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B5%AC%EC%A1%B0#entry74comment</comments>
      <pubDate>Sun, 4 Oct 2020 02:09:18 +0900</pubDate>
    </item>
    <item>
      <title>[정리] 오라클 관리 실무</title>
      <link>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EC%98%A4%EB%9D%BC%ED%81%B4-%EA%B4%80%EB%A6%AC-%EC%8B%A4%EB%AC%B4</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 10월 19일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고도서&lt;br /&gt;서진수. 『쉬운 설명과 실전 예제가 가득한 오라클 관리 실무』. 생능출판사. 2013&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 오라클 아키텍처&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 오라클 인스턴스와 데이터베이스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bm2jxq/btqJ3iCVMxR/pOYzknMuYdaBwUxZ5Hoaa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm2jxq/btqJ3iCVMxR/pOYzknMuYdaBwUxZ5Hoaa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm2jxq/btqJ3iCVMxR/pOYzknMuYdaBwUxZ5Hoaa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm2jxq%2FbtqJ3iCVMxR%2FpOYzknMuYdaBwUxZ5Hoaa0%2Fimg.png&quot; width=&quot;100%&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;Instance는 Memory에 생성되는 구조이고, Database는 Disk에 생성되는 구조이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Oracle Instance의 할당 및 관리&lt;/h3&gt;
&lt;p&gt;최초 SGA는 Oracle Server Process가 요청하여 생성되고, 이후에는 OS Kernel이 관리한다. Server Process가 종료되어도 SGA는 종료되지 않고, Instance가 종료되어야 SGA가 공유메모리에서 사라진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SGA: System Global Area, 거의 대부분의 작업들이 수행되는 공간.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OS Kernel은 RAM의 일부를 Oracle에게 할당하고 관리한다. 이 때 하나의 메모리 Block을 여러 프로그램이 동시에 사용하는 것을 막기 위해 &lt;b&gt;세마포어(Semaphore)&lt;/b&gt;와 &lt;b&gt;Kernel Parameter&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;세마포어: 깃발(flag)를 의미하며, 어떤 자원의 사용 여부를 set/unset으로 표현한다.&lt;/li&gt;
&lt;li&gt;Kernel Parameter: Linux의 경우 /etc/sysctl.conf, Solaris의 경우 /etc/system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Server에서 동작하는 모든 Process는 메모리 Block을 사용하기 전에 그 Block을 다른 Process가 쓰고 있는지 확인하기 위해 해당 메모리 Block의 세마포어의 상태를 확인한다. 만약 사용 중(set)이라면, Process는 대기 후, 해당 Block이 unset이 되면 즉시 세마포어를 set으로 세팅하고 자원을 사용하게 된다.&lt;/p&gt;
&lt;p&gt;Kernel Parameter를 기초로 SGA로 사용할 공유 메모리를 Oracle에 할당해 줄 때 다음과 같은 방법으로 할당한다.&lt;/p&gt;
&lt;p&gt;공유 메모리로 사용할 물리적 메모리가 충분할 경우, 하나의 segment에 전체 SGA가 할당된다. 하나의 segment에 다 할당할 수 없다면, 연속된 여러 segment로 분산시켜 할당할 수 있다. 위 두 방법이 불가능하면, 여러 segment에 분산시켜 할당할 수 있다. 단, SGA 내 fixed area 부분은 반드시 전체가 1 segment에 할당되어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) SGA의 주요 구성 요소&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. Database Buffer Cache&lt;/h4&gt;
&lt;p&gt;데이터의 조회와 변경 등의 실제 작업이 일어나는 공간, 여러 명의 사용자가 공유한다.&lt;/p&gt;
&lt;p&gt;조회나 변경할 데이터들은 모두 Database Buffer Cache에 그 내용이 존재해야 하며, 없을 경우에는 데이터 파일에서 해당 내용이 들어있는 Block을 복사해서 가져와야 한다.&lt;/p&gt;
&lt;p&gt;이 때 Oracle은 Database Buffer Cache의 Block을 &lt;i&gt;여러 사용자가 동시에 사용하는 것을 막기 위해&lt;/i&gt;, Buffer Block의 상태를 확인할 수 있는 LRU(Least Recently Used) LIST를 만들어서 관리한다.&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&gt;공유 메모리에 생성되는 구조들은 서로 중복 사용되지 않도록 관리해야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Database Buffer Cache Block&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;Pinned Buffer:&lt;/b&gt; 현재 사용 중인 Buffer.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dirty Buffer:&lt;/b&gt; 현재 사용 중이지는 않지만, 사용자가 내용을 변경한 후, 아직 데이터 파일에 저장하지 않은 Buffer.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Free Buffer:&lt;/b&gt; 사용되지 않은(Unused) Buffer 또는 Dirty Buffer였다가 데이터 파일에 저장이 완료되어 재사용 가능한 Buffer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Working Data Set&lt;/b&gt;(Working Set = LRU List + LRUW List) 은 다음과 같다.&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;LRU List&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메인 리스트: 사용된 Buffer. Hot/Cold 영역으로 나뉜다.&lt;/li&gt;
&lt;li&gt;보조 리스트 : 미 사용된 Buffer. DBWR에 의해 기록된 Buffer(Free List)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LRU 보조 리스트에서 가장 먼저 Free Buffer를 찾는다. 만약 보조 리스트의 Free Buffer가 모두 사용되었다면, LRU 메인 리스트의 Cold 영역에서 Free Buffer를 찾는다. 그러나 특정 개수(10g 기준 40%)만큼 찾아도 Free Buffer를 못 찾으면, 스캔을 멈추고 DBWR에게 Dirty Buffer를 내려쓰라고 요청한다. 이후 Dirty Buffer가 Free Buffer로 바뀌어 LRU 보조 리스트에 추가되면, Free Buffer를 확보하고 데이터 파일에서 Block을 복사해 온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LRUW List&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메인 리스트: 변경된 Buffer(Dirty List).&lt;/li&gt;
&lt;li&gt;보조 리스트: 현재 DBWR에 의해 기록 중인 Buffer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. Redo Log Buffer&lt;/h4&gt;
&lt;p&gt;데이터에 변경사항(DDL, DML)이 생길 경우, 장애 복구를 위해 해당 변경 내용을 기록한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Redo Log Buffer:&lt;/b&gt; 변경된 내용을 기록하는 메모리 공간.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Redo Log File:&lt;/b&gt; Redo Log Buffer의 내용을 디스크에 저장해 주는 파일.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C. Shared Pool&lt;/h4&gt;
&lt;p&gt;다른 사용자와 어떤 대상을 공유해서 사용하기 위한 공간.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Library Cache:&lt;/b&gt; Soft Parse에 사용되는 공간&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Data Dictionary Cache:&lt;/b&gt; 구문분석이나 Optimizer가 실행계획을 세울 때 사용하는 주요 Dictionary들이 Row 단위로 Cache되어 있는 공간.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Server Result Cache:&lt;/b&gt; SQL 결과 값을 Cache해 두는 공간.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;D. Large Pool&lt;/h4&gt;
&lt;p&gt;Large Pool을 사용하는 주요 경우는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Shared Server Mode로 Oracle Server를 운영할 경우, UGA가 이곳에 생성된다.&lt;/li&gt;
&lt;li&gt;Parallel Execution(병렬처리) 작업을 할 경우, 각 Process들 간의 Message Buffer가 이곳에 생성된다.&lt;/li&gt;
&lt;li&gt;RMAN으로 백업/복구를 할 경우, RMAN이 사용하는 I/O용 Buffer가 이곳에 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Dynamic SGA 기능&lt;/h3&gt;
&lt;p&gt;관리자가 _SGA의 구성요소의 크기_를 변경한 후, Oracle Instance의 재 시작 없이 즉시 적용할 수 있는 기능.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle에서 메모리를 할당할 때 사용하는 단위는 그래뉼(Granule)이다. 10g 이후 버전 기준으로, SGA_MAX_SIZE가 1GB 이하면 1Granule은 4MB, 1GB 초과면 16MB가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;주요 Parameter는 다음과 같다.&lt;/h5&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_MAX_SIZE:&lt;/b&gt; 현재 사용 중인 SGA 크기.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SHARED_POOL_SIZE:&lt;/b&gt; Shared Pool의 크기.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB_CACHE_SIZE:&lt;/b&gt; Database Buffer Cache 크기.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) Program Global Area(PGA)의 주요 구성 요소.&lt;/h3&gt;
&lt;p&gt;각 Process들이 개별적으로 사용하는 메모리 공간.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/ECz7X/btqJ92Mztld/ksbYt8lgeSLkRHhU6TcCmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECz7X/btqJ92Mztld/ksbYt8lgeSLkRHhU6TcCmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECz7X/btqJ92Mztld/ksbYt8lgeSLkRHhU6TcCmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECz7X%2FbtqJ92Mztld%2FksbYt8lgeSLkRHhU6TcCmK%2Fimg.png&quot; width=&quot;100%&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;h4 data-ke-size=&quot;size20&quot;&gt;A. Private SQL Area&lt;/h4&gt;
&lt;p&gt;SQL 문장에 Bind 변수 등이 있을 경우, 해당 Bind 변수 값을 보관(Persistent Area)하고, 쿼리의 실행 상태 정보와 쿼리를 수행하면서 임시로 정보를 저장(Runtime Area)해야 하는 경우에 사용하는 공간.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. SQL Work Area&lt;/h4&gt;
&lt;p&gt;Sort 관련 작업(Sort Area)이나 Hash 관련 작업(Hash Area)을 수행하는 공간.&lt;/p&gt;
&lt;p&gt;9i부터는 초기화 파라미터 파일에 PGA의 총량(PGA_AGGREGATE_TARGET)을 설정 한 후, WORKAREA_SIZE_POLICY 파라미터를 AUTO로 설정하면, Oracle Server가 자동으로 PGA의 크기를 관리한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. SQL 문장의 실행&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Select 문장의 실행 원리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. Parse(구문 분석 단계)&lt;/h4&gt;
&lt;p&gt;Server Process는 전달 받은 SQL 문장을 SQL Parser를 통해 &lt;b&gt;문법 검사(Syntax Check), 의미 검사(Semantic Check), 권한 검사(Permission Check)&lt;/b&gt;를 한다.&lt;/p&gt;
&lt;p&gt;검사 후 오류가 없다면, SQL 문장을 Hash 함수를 사용하여 Hash Value를 얻은 후, Shared Pool의 Library Cache에 있는 Hash Value와 비교하여 동일한 값이 있는지 확인한다. 이 과정을 &lt;b&gt;커서 공유&lt;/b&gt; 또는 88라 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hash Value들이 저장되어 있는 공간을 해쉬 버킷(Hash Bucket)이라 한다.&lt;/li&gt;
&lt;li&gt;커서 공유: 메모리에 어떤 데이터를 저장하기 위해 만드는 임시 저장 공간으로 공유 커서, 세션 커서, 어플리케이션 커서가 있다. 공유 커서의 역할은 이미 한번 수행되었던 SQL 문장의 실행계획과 관련 정보를 보관한 후, 재활용하여 Hard Parse의 부담을 줄여 SQL 문장의 수행 속도를 빠르게 하는 것이다. 주의할 점은 부모 커서(Parent Cursor)와 자식 커서(Child Cursor) 모두가 완전히 동일해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;공유 커서는 크게 &lt;b&gt;부모 커서(Parent Cursor)&lt;/b&gt;와 &lt;b&gt;자식 커서(Child Cursor)&lt;/b&gt;로 나뉜다. SQL 문장 자체에 대한 값은 부모 커서에 저장되고, 사용자 정보나 Optimizer Mode 정보는 자식 커서에 저장된다.&lt;/p&gt;
&lt;p&gt;커서에 어떤 데이터가 들어있는지 리스트로 관리하는데 이를 88라 한다. Hash List 안의 정보는 &lt;b&gt;체인(Chain) 구조&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;Oracle에서 데이터는 Heap 구조(순서 상관없이 빈 곳에 저장)로 저장된다. 따라서 List에는 같은 정보는 계속 이어서 확인 할 수 있도록 체인 구조로 연결되어 있다.&lt;/li&gt;
&lt;li&gt;Library Cache 안에서 원하는 SQL 문과 실행계획이 들어있는 커서를 찾기 위해서는 반드시 Hash List를 읽어야 하는데, 1개 밖에 존재하지 않아 경합이 발생한다. 이 때 Library Cache Latch를 획득해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그러나 동시에 여러 사용자가 Latch를 획득하려는 경우 대기현상으로 성능저하가 발생하므로, Oracle에서는 &lt;b&gt;Hash List를 조회만 할 경우&lt;/b&gt;에는 동시에 여러 명이 볼 수 있는 기능을 제공하고, 또 SESSION_CACHED_CURSORS 파라미터 제공한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hash List를 조회만 한다는 것은, 사용자가 Select 문을 수행했다는 뜻이 아니다. 어떤 SQL 문이든 Hash List에 해당 내용이 있는지 확인하는 경우를 말한다. 단, Hash List의 내용을 변경(Update)할 때에는 Exclusive로 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;커서 공유가 실패하면 &lt;b&gt;옵티마이저(Optimizer)&lt;/b&gt;는 Dictionary Cache의 &lt;b&gt;Data Dictionary&lt;/b&gt;를 참고하여 새로운 실행 계획을 생성한다. 이를 &lt;b&gt;Hard Parse&lt;/b&gt;라고 한다. Hard Parse 단계는 Soft Parse 단계에 비해 시간이 많이 소요되므로 가능한 Soft Parse를 할 수 있도록 쿼리를 작성해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵티마이저: Rule Based Optimizer(RBO)와 Cost Based Optimizer(CBO)로 나눌 수 있다. 11g 버전부터는 CBO만 사용한다.&lt;/li&gt;
&lt;li&gt;Data Dictionary: 옵티마이저가 참고하는 Dictionary의 대부분은 Static Data Dictionary이다. 10g 버전부터는 Data Dictionary 정보를 자동으로 업데이트하지만 항상 확인해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. Bind(바인드)&lt;/h4&gt;
&lt;p&gt;1,000개의 데이터 중 특정 값만 바꾸어서 조회하는 SQL 문장의 경우, 1,000번의 Parsing와 1,000개의 실행계획을 생성해야 한다.&lt;/p&gt;
&lt;p&gt;이 때 특정 값을 &lt;b&gt;바인드 변수&lt;/b&gt;로 설정하여, 1번의 Parsing과 1개의 실행계획만으로 쿼리를 수행할 수 있도록 하는 것을 Bind라고 한다. 따라서 SQL을 작성할 때 Bind 기능을 사용할 수 있도록 작성하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;Bind를 사용할 경우 Soft Parse를 많이 하므로 성능 상에 이점이 있지만, 데이터가 편중(Skewed)되어 있는 경우에는 Index가 정상적으로 작동하지 않는다. 즉 분포도가 균일하지 못한 경우에는 Bind 변수를 사용할 수 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C. Execute(실행)&lt;/h4&gt;
&lt;p&gt;Parse와 Bind를 거치고 나면, Server Process는 Database Buffer Cache에서 해당 데이터가 들어있는 Block를 찾는다. 만약 없다면, 데이터 파일에서 데이터가 들어있는 Block을 찾아 Database Buffer Cache로 복사해 오는데, 이 과정을 &lt;b&gt;Execute&lt;/b&gt;라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;D. Fetch(인출)&lt;/h4&gt;
&lt;p&gt;실행 단계가 끝나면 Database Buffer Cache에 원하는 데이터와 &lt;b&gt;다른 데이터가 포함된 Block&lt;/b&gt;이 존재하게 된다. 여기서 원하는 데이터만 선별하는 과정을 &lt;b&gt;Fetch&lt;/b&gt;라고 한다. 만약 사용자가 정렬(Sort)을 요구한 경우 Fetch 과정에서 Sort를 완료해서 데이터를 보내게 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 최소 I/O 단위가 Block이기 때문에, 복사한 Block에 원하는 데이터뿐만 아니라 다른 데이터도 존재하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Update 문장의 실행 원리&lt;/h3&gt;
&lt;p&gt;Parse 과정까지는 Select 문장과 동일하게 진행된다.&lt;/p&gt;
&lt;p&gt;Execute 단계에서 원하는 데이터가 들어있는 Block을 Database Buffer Cache로 가져 온 후, Server Process는 변경되는 데이터의 변경 내역을 Redo Log Buffer에 먼저 기록한다.&lt;/p&gt;
&lt;p&gt;그 후, Undo Segment에 원본 데이터를 기록하고 Database Buffer Cache의 내용을 변경한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Oracle Background Processes&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) DBWR(Database Writer)&lt;/h3&gt;
&lt;p&gt;Database Buffer Cache의 Dirty Buffer의 내용을 다음과 같은 경우에 데이터 파일에 저장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Checkpoint 신호가 발생했을 때.&lt;/li&gt;
&lt;li&gt;Dirty Buffer가 임계 값을 지났을 때.&lt;/li&gt;
&lt;li&gt;Time Out이 발생했을 때(3초).&lt;/li&gt;
&lt;li&gt;RAC Ping이 발생했을 때.&lt;/li&gt;
&lt;li&gt;Tablespace가 Read-only 상태로 변경될 때.&lt;/li&gt;
&lt;li&gt;Tablespace가 Offline될 때.&lt;/li&gt;
&lt;li&gt;Tablespace가 Begin Backup 상태가 될 때.&lt;/li&gt;
&lt;li&gt;Drop table이나 Truncate Table될 때.&lt;/li&gt;
&lt;li&gt;Direct Path Read/Write가 진행될 때.&lt;/li&gt;
&lt;li&gt;일부 Parallel Query 작업이 진행될 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) LGWR(Log Writer)&lt;/h3&gt;
&lt;p&gt;Redo Log Buffer에 있는 내용을 다음과 같은 경우에 Redo Log File로 저장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Commit이 발생했을 때.&lt;/li&gt;
&lt;li&gt;1/3이 찼을 때.&lt;/li&gt;
&lt;li&gt;변경 량이 1MB가 되었을 때.&lt;/li&gt;
&lt;li&gt;3초 마다.&lt;/li&gt;
&lt;li&gt;DBWR이 내려 쓰기 전에.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) PMON(Process Monitor)&lt;/h3&gt;
&lt;p&gt;모든 Server Process들을 감시하고 비정상적으로 종료된 Process가 있다면 관련 복구 작업 등을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) SMON(System Monitor)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Instance Crash인 경우, Instance Recovery를 수행한다.&lt;/li&gt;
&lt;li&gt;Instance Recovery 과정에서 누락된 Transaction을 Recovery한다.&lt;/li&gt;
&lt;li&gt;비정상 종료된 Transaction이 사용 중이던 Temporary Segment를 Clean Up한다.&lt;/li&gt;
&lt;li&gt;Dictionary Managed Tablespace에서 Free Extents들을 모은다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) CKPT(Checkpoint Process)&lt;/h3&gt;
&lt;p&gt;DBWR에게 Checkpoint 신호를 전달하며, Control File과 Data File Header에 해당 Checkpoint 정보를 기록한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Oracle 시작/종료하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 초기화 Parameter File&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. Parameter란?&lt;/h4&gt;
&lt;p&gt;SGA를 생성할 때 필요한 각 구성요소에 대한 사항들을 기록하고 있는 파일.&lt;/p&gt;
&lt;p&gt;정적 파라미터인 &lt;b&gt;Pfile(initSID.ora)&lt;/b&gt;과 정적 파라미터인 &lt;b&gt;Spfile(spfileSID.ora)&lt;/b&gt;이 있다. &lt;code&gt;$ORACLE_HOME/dbs/&lt;/code&gt;에 위치한다.&lt;/p&gt;
&lt;p&gt;Pfile과 Spfile이 둘 다 존재할 경우 Spfile의 내용만 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. Parameter File 내용 변경.&lt;/h4&gt;
&lt;p&gt;Pfile은 vi 에디터 등의 OS 편집기로 관리자가 직접 수정하면 된다.&lt;/p&gt;
&lt;p&gt;Spfile은 &lt;code&gt;ALTER SYSTEM SET 변경할_파라미터 SCOPE=옵션&lt;/code&gt; 으로 파라미터 값을 수정할 수 있다.&lt;/p&gt;
&lt;p&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;MEMORY:&lt;/b&gt; Spfile의 내용을 변경하지 말고, 현재 작동 중인 Instance에만 적용. 테스트용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SPFILE:&lt;/b&gt; 현재 운영 중인 Instance에는 적용하지 않고, Spfile의 내용만 변경. 재 부팅 후에 적용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BOTH:&lt;/b&gt; 현재 운영 중인 Instance와 Spfile 내용 모두 변경.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C. 주요 Parameter&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;CONTROL_FILES:&lt;/b&gt; Control File의 경로 지정. 최대 8개까지 등록 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB_BLOCK_SIZE:&lt;/b&gt; Database에서 사용될 Standard Block Size 지정. Database를 생성하기 전에 지정해야 한다. 9i 버전까지는 4KB, 10g 이후 버전부터 기본 값은 8KB.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB_CACHE_SIZE:&lt;/b&gt; Default Database Buffer Cache 크기를 결정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB_nK-CACHE_SIZE:&lt;/b&gt; Non-Standard Block Size 지정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LOG_ARCHIVE_DEST_n:&lt;/b&gt; Archive Redo Log File의 저장 경로 지정. 최대 10개까지 등록 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LOG_ARCHIVE_DEST_STATE_n:&lt;/b&gt; LOG_ARCHIVE_DEST_n에 지정된 디렉터리의 사용 여부 상태를 지정. 사용되는 값으로 ENABLE, DEFER, ALTERNATE가 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PGA_AGGREGATE_TARGET:&lt;/b&gt; 하나의 Instance에 접속한 전체 Server Process가 사용 가능한 총 PGA 크기를 결정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SGA_TARGET:&lt;/b&gt; ASMM을 사용할 경우 SGA의 전체 사이즈를 지정. 이 파라미터를 사용할 경우 다음의 값들이 자동 튜닝의 대상이 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Buffer Cache(DB_CACHE_SIZE)&lt;/li&gt;
&lt;li&gt;Shared Pool(SHARED_POOL_SIZE)&lt;/li&gt;
&lt;li&gt;Large Pool(LARGE_POOL_SIZE)&lt;/li&gt;
&lt;li&gt;Java Pool(JAVA_POOL_SIZE)&lt;/li&gt;
&lt;li&gt;Streams Pool(STREAMS_POOL_SIZE)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UNDO_TABLESPACE:&lt;/b&gt; Instance에서 사용할 UNDO Tablespace 이름 지정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Instance Open하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bDE0s1/btqJ3iiE0Zr/REVIIB49iVxSSrCSAEZwE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDE0s1/btqJ3iiE0Zr/REVIIB49iVxSSrCSAEZwE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDE0s1/btqJ3iiE0Zr/REVIIB49iVxSSrCSAEZwE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDE0s1%2FbtqJ3iiE0Zr%2FREVIIB49iVxSSrCSAEZwE1%2Fimg.png&quot; width=&quot;100%&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;오라클의 시작 과정은 &lt;b&gt;NOMOUNT &amp;rarr; MOUNT &amp;rarr; OPEN&lt;/b&gt;의 단계를 거친다.&lt;/p&gt;
&lt;p&gt;NOMOUNT 단계에서 Parameter File의 내용을 읽고, MOUNT 단계에서 Control File을 읽고, OPEN 단계에서 Data File과 Redo Log File을 읽는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NOMOUNT 단계까지만 시작한 후 나머지 단계 진행하기.&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; STARTUP NOMOUNT;
SYS&amp;gt; ALTER DATABASE MOUNT;
SYS&amp;gt; ALTER DATABASE OPEN;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MOUNT 단계까지 시작한 후 나머지 단계 진행하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; STARTUP MOUNT;
SYS&amp;gt; ALTER DATABASE OPEN;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;읽기전용인 상태로 OPEN하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; STARTUP MOUNT;
SYS&amp;gt; ALTER DATABASE OPEN READ ONLY;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Restricted Mode(제한된 모드)로 OPEN하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; STARTUP RESTRICT;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;현재 OPEN되어 있는 Instance를 Restricted Mode로 변경하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER SYSTEM ENABLE RESTRICTED SESSION;
SYS&amp;gt; ALTER SYSTEM DISABLE RESTRICTED SESSION;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Instance Shutdown하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/vQrND/btqJ0oXWDNP/crHK4Wji730wpbmXhr7Or1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQrND/btqJ0oXWDNP/crHK4Wji730wpbmXhr7Or1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQrND/btqJ0oXWDNP/crHK4Wji730wpbmXhr7Or1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQrND%2FbtqJ0oXWDNP%2FcrHK4Wji730wpbmXhr7Or1%2Fimg.png&quot; width=&quot;100%&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;Startup의 역순으로 종료된다. Shutdown의 옵션은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;NORMAL(기본 옵션):&lt;/b&gt; 사용자들이 모두 스스로 접속을 종료할 때까지 기다렸다가 종료.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;TRANSACTIONAL:&lt;/b&gt; 사용자가 수행중인 Transaction이 끝나는 시점에 강제로 접속을 중단 시키고, Instance를 종료.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;IMMEDIATE:&lt;/b&gt; 사용자의 행동에 상관없이 즉시 접속 종료.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ABORT:&lt;/b&gt; IMMEDIATE와 동일하나, 사용자가 수행한 작업을 저장하지도 ROLLBACK하지도 않고, 즉시 Instance를 종료한다. 다른 말로 Instance Crash라고 한다. 이렇게 종료된 Instance는 Startup될 때 SMON이 Instance Recovery를 수행해서 복구해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Parameter File 생성 및 관리&lt;/h3&gt;
&lt;p&gt;사용중인 Parameter File 확인. VALUE 부분에 값이 있으면 Spfile, 없으면 Pfile이다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; SHOW PARAMETER SPFILE;
SYS&amp;gt; SHOW PARAMETER PFILE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Pfile, Spfile 만들기&lt;/h4&gt;
&lt;p&gt;Pfile과 Spfile이 둘 다 존재할 경우에는, Spfile을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; CREATE PFILE FROM SPFILE;
SYS&amp;gt; CREATE SPFILE FROM PFILE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Parameter File이 모두 삭제된 경우에는, 원본 Pfile을 복사해서 사용한다. 원본 Pfile의 위치는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;[oracle@localhost ~]$ cp $ORACLE_BASE/admin/SID/pfile/init.ora.num $ORACLE_HOME/dbs/initSID.ora&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Control File 관리하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Control File&lt;/h3&gt;
&lt;p&gt;Control File에는 Oracle Server를 운영하는 데 필수적인 정보들이 저장되어 있다.&lt;/p&gt;
&lt;p&gt;Instance가 Mount 이상의 상태부터는 Control File의 내용이 실시간으로 변경되고 조회된다.&lt;/p&gt;
&lt;p&gt;만약, 삭제 될 경우 심각한 장애가 발생하므로 삭제되지 않도록 주의해야 하며, 혹시나 삭제되더라고 복구 할 수 있도록 &lt;b&gt;다중화(Multiplexing)&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;다중화: Control File에는 변경되는 정보가 실시간으로 저장되기 때문에, 이동이나 복사를 할 때에는 가장 최근에 사용한 Control File을 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Control File의 위치는 Parameter File에서 지정할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Control File 관리하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. Spfile일 경우 다중화 하는 방법&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER SYSTEM SET CONTROL_FILES=&amp;lsquo;/disk1/control01.ctl&amp;rsquo;,
                                    &amp;lsquo;/disk2/control02.ctl&amp;rsquo;,
                                    &amp;lsquo;/disk3/control03.ctl&amp;rsquo; SCOPE=SPFILE;
SYS&amp;gt; SHUTDOWN IMMEDIATE;
SYS&amp;gt; !cp /app/oracle/oradata/SID/control01.ctl /disk1/control01.ctl
SYS&amp;gt; !cp /app/oracle/oradata/SID/control01.ctl /disk1/control02.ctl
SYS&amp;gt; !cp /app/oracle/oradata/SID/control01.ctl /disk1/control03.ctl
SYS&amp;gt; STARTUP&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. pfile일 경우 다중화 하는 방법&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; SHUTDOWN IMMEDIATE;
SYS&amp;gt; !vi $ORACLE_HOME/dbs/initSID.ora
-- initSID.ora 파일의 control_files 수정
*.control_files=&amp;lsquo;/disk1/control01.ctl&amp;rsquo;, &amp;lsquo;/disk2/control02.ctl&amp;rsquo;, &amp;lsquo;/disk3/control03.ctl&amp;rsquo;

SYS&amp;gt; !cp /app/oracle/oradata/SID/control01.ctl /disk1/control01.ctl
SYS&amp;gt; !cp /app/oracle/oradata/SID/control01.ctl /disk1/control02.ctl
SYS&amp;gt; !cp /app/oracle/oradata/SID/control01.ctl /disk1/control03.ctl
SYS&amp;gt; STARTUP&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Redo Log 관리하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Redo Log 생성 원리&lt;/h3&gt;
&lt;p&gt;Oracle에서 데이터의 변경(DDL, DML, TCL)이 발생한 경우, &lt;b&gt;Write Log Ahead, Log force at Commit&lt;/b&gt;이라는 두 가지 메커니즘에 의해 Redo Log에 기록된다.&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;Write Log Ahead:&lt;/b&gt; 실제 데이터를 변경하기 전에 Redo Log에 먼저 기록한 후 데이터를 변경한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Log force at Commit:&lt;/b&gt; 사용자로부터 Commit 요청이 들어오면, 관련된 모든 Redo Record들을 Redo Log File에 저장한 후 Commit을 완료한다. 단, 대량의 데이터를 변경하고 한꺼번에 Commit을 할 경우, 성능에 악영향을 줄 수 있다. 이를 해결하기 위해 지연된 커밋(Delayed Commit), 그룹 커밋(Group Commit)을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Redo Log가 생성되고 기록되는 순서는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;(특정 데이터의 변경 시) Server Process가 원하는 Block이 Database Buffer Cache에 있는 확인하고 없으면 Data File에서 찾아서 Database Buffer Cache로 가져온다. 그리고 해당 Block의 해당 row 부분을 다른 사용자가 변경할 수 없도록 Lock을 설정(Page Fix)한다.&lt;/li&gt;
&lt;li&gt;PGA에서 &lt;b&gt;Redo Change Vector&lt;/b&gt;를 생성한 후, Redo Log Buffer에 필요한 용량을 계산한다. 그리고 복사하기 위해 필요한 &lt;b&gt;Redo Copy Latch&lt;/b&gt;를 확보해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redo Change Vector: Redo Log에 기록할 변경된 데이터에 대한 모든 정보의 세트. UNDO 관련 내용도 함께 저장된다.&lt;/li&gt;
&lt;li&gt;Redo Copy Latch: Redo Copy Latch는 Change Vector가 모두 Redo Log Buffer에 기록될 때까지 확보하고 있어야 하기 때문에 여러 개가 존재한다. &lt;b&gt;_log_simultaneous_copies&lt;/b&gt; 히든 파라미터를 사용하여 Redo Copy Latch의 개수를 조정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Redo Copy Latch를 확보한 Server Process는 다음 단계인 &lt;b&gt;Redo Allocation Latch&lt;/b&gt;를 확보하고, Redo Log Buffer에 Change Vector의 내용을 기록한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redo Allocation Latch: Redo Allocation Latch는 1개 밖에 없어서 경합이 발생할 수 있다. 9i 버전부터는 이를 해결하기 위해 Redo Log Buffer를 여러 공간으로 나누어서 각각 Redo Allocation Latch를 할당해주는 &lt;b&gt;Shared Redo Strand&lt;/b&gt;를 도입했다. 10g 버전부터는 더 확장된 개념인 &lt;b&gt;Private Redo Strand&lt;/b&gt; 기능이 도입되었는데, 각 Server Process는 Shared Pool에 자신만의 독립적인 Private Strand 공간을 만들고 그곳에 Change Vector를 생성한 후, 필요하면 LGWR이 Redo Log File에 바로 기록할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;특정 상황(LGWR 작동 조건)이 되면, LGWR이 Redo Entries(Redo Log Buffer에 기록된 Change Vector)의 일부를 &lt;b&gt;Redo Log File에 기록&lt;/b&gt;한다. 그리고 기록된 Redo Entries들은 Redo Log Buffer에서 삭제(Flush)된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LGWR이 Redo Log File에 내려쓰는 방법에는 4가지(&lt;b&gt;WAIT, NOWAIT, IMMEDIATE, BATCH&lt;/b&gt;)가 있다. 보통 2개씩 조합해서 사용한다. BATCH와 NOWAIT와 같이 Redo Log Buffer의 내용이 아직 Redo Log File에 기록이 완료되지 않아도 다른 작업을 할 수 있도록 성능을 높이는 방식을 &lt;b&gt;비동기식 커밋(Asynchronous Commit)&lt;/b&gt;이라 하고, 반대로 IMMEDIATE와 WAIT와 같이 Redo Log File에 기록을 완료해야 후속 작업을 할 수 있는 방식을 &lt;b&gt;동기식 커밋(Synchronous Commit)&lt;/b&gt;이라 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Redo Log File 구성 및 관리하기&lt;/h3&gt;
&lt;p&gt;Redo Log File은 최소 3개의 그룹과 각 그룹별로 최소 2개 이상의 멤버로 구성하는 것을 권장한다.&lt;/p&gt;
&lt;p&gt;LGWR이 Redo Log Buffer의 내용을 Redo Log File에 내려쓰다가, 해당 파일이 가득 차게 되면 다음 그룹으로 자동으로 넘어가서 마저 내려쓴다. 이 과정을 _Log Switch(로그 스위치)_라고 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Log Switch가 일어나는 그룹의 순서는 Round Robin 방식으로 결정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Log Switch가 발생하면 _Checkpoint 신호_가 발생하는데, 이 때 DBWR이 해당 Redo Log File에 있는 내용 중 Database Buffer Cache에서 Data File로 저장하지 못한 변경사항들을 내려쓴다. 그리고 이 정보들을 Data File와 Control File에 반영한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 Alert Log File에 Checkpoint Not Completed라는 오류가 나온다면, 이는 DBWR이 이전에 발생한 Checkpoint의 내용을 Data File에 다 기록하지 못한 상황에서 다시 Log Switch가 발생하여 Checkpoint 신호가 들어온 경우에 발생한다. Redo Log File의 크기나 Redo Log Group의 개수를 증가시키면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;신규 그룹 생성&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE ADD LOGFILE GROUP 4 &amp;lsquo;/app/oracle/oradata/SID/redo04_a.log&amp;rsquo; SIZE 5M;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멤버 추가하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE ADD LOGFILE MEMBER &amp;lsquo;/app/oracle/oradata/SID/redo04_b.log&amp;rsquo; TO GROUP 4;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멤버 삭제하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DROP LOGFILE MEMBER &amp;lsquo;/app/oracle/oradata/SID/redo04_b.log&amp;rsquo;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그룹 삭제하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DROP LOGFILE GROUP 4;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;강제로 Log Switch 발생시키기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER SYSTEM SWITCH LOGFILE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;강제로 Checkpoint 발생시키기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER SYSTEM CHECKPOINT;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) SCN과 CHECKPOINT&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. SCN(System Commit Number)&lt;/h4&gt;
&lt;p&gt;Commit이 발생할 때 마다 모든 Transaction에 생성되는 번호로 장애 복구 시에 사용한다.&lt;/p&gt;
&lt;p&gt;SCN base(4bytes) + SCN Wrap(2bytes)로 구성.&lt;/p&gt;
&lt;p&gt;SCN이 기록되는 장소는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Control File Header: Checkpoint 발생 때, Resetlogs 발생 때, Incomplete Recovery 수행 때.&lt;/li&gt;
&lt;li&gt;Data Blocks(Cache Layer): &lt;b&gt;Block Cleanout&lt;/b&gt;시 마지막 SCN을 각 Block에 기록.&lt;/li&gt;
&lt;li&gt;Data Block에 걸려있던 Lock이 해제되어야 Commit이 완전히 수행된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Blocks(ITL Entries): Data Block의 Transaction Layer 안에 있는 ITL(Interested Transaction List) Entries에 Commit된 SCN 정보를 기록(Delayed Block Cleanout).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data File Headers: 마지막 Checkpoint 발생 때, Begin Backup 수행 때, 복구 완료 후 마지막으로 사용된 SCN을 기록.&lt;/li&gt;
&lt;li&gt;Redo Records / Log Buffer: Commit이 수행되면 Commit Record에 SCN을 포함하여 기록.&lt;/li&gt;
&lt;li&gt;Undo Segment, Tablespace Headers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. SCN(System Change Number)&lt;/h4&gt;
&lt;p&gt;Data File, Redo Log File, Control File 간의 동기화 정보를 맞추기 위해 사용.&lt;/p&gt;
&lt;p&gt;SCN_Base(4bytes) + SCN_Wrap(2bytes) + SCN_Sequence(1byte)로 구성.&lt;/p&gt;
&lt;p&gt;Data Block Header, Redo Records, Segment Header에 기록된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C. Checkpoint&lt;/h4&gt;
&lt;p&gt;Commit된 데이터를 어디까지 저장했는지 확인하기 위해 사용.&lt;/p&gt;
&lt;p&gt;Control File과 Data File의 Checkpoint 정보를 비교하여, 서로 정보가 다르면 해당 부분을 Online Redo Log나 Archived Redo Log를 참고하여 복구를 진행한다.&lt;/p&gt;
&lt;p&gt;Checkpoint가 발생하면 Database Buffer Cache의 Dirty Buffer를 Data File로 저장하게 된다. 그리고 저장된 SCN 중 가장 큰 SCN 번호(Checkpoint SCN)를 Control File와 Data File Header에 기록한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Tablespace와 Data File 관리하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Tablespace의 정의&lt;/h3&gt;
&lt;p&gt;하나 또는 여러 개의 데이터파일로 구성되어 있는 논리적인 데이터 구조.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) SYSTEM Tablespace&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Data Dictionary&lt;/b&gt;들이 저장되어 있다. SYS 사용자도 조회만 가능할 뿐 변경할 수는 없다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Dictionary: Oracle에서 사용하는 거의 모든 메타 정보나 운영과 관련된 정보들이 들어있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Data Dictionary는 &lt;b&gt;Base Table&lt;/b&gt;과 &lt;b&gt;Data Dictionary View&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;Base Table: Database를 생성할 때 생성된다. 원본 데이터가 있는 곳이라 접근할 수 없다.&lt;/li&gt;
&lt;li&gt;Data Dictionary View: 이곳을 통해 Base Table의 내용을 조회할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Data Dictionary View는 다시 &lt;b&gt;Static Dictionary&lt;/b&gt;와 &lt;b&gt;Dynamic Dictionary&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;Statis Dictionary: Dictionary에 저장된 정보들이 자동으로 변경되지 않는다. 따라서 ANALYZE, DBMS_STATS를 사용하여 수동으로 내용을 업데이트해야 한다. 10g 버전부터는 AWR을 사용하여 자동으로 업데이트 된다. Instance가 Open일 경우에만 조회할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dictionary 수동 업데이트&lt;/h4&gt;
&lt;p&gt;ANALYZE 명령어는 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;-- scott 계정의 emp 테이블을 대상으로 통계 정보를 수집하되, 인덱스 및 컬럼 통계가 수집되지 않도록.
DBMS_STATS.GATHER_TABLE_STATS('scott', 'emp',
                              CASCADE =&amp;gt; false,
                              METHOD_OPT =&amp;gt; 'for columns')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Static Dictionary 종류&lt;/h4&gt;
&lt;p&gt;OPEN 상태에서만 조회 가능.&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;USER_XXX:&lt;/b&gt; 해당 사용자가 생성한 내용만 조회 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ALL_XXX:&lt;/b&gt; 해당 사용자가 생성한 것과 생성하지 않았더라도 접근 가능한 내용 조회 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DBA_XXX:&lt;/b&gt; 데이터베이스에 생성되어 있는 모든 내용 조회 가능. DBA 권한 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dynamic Performance View&lt;/h4&gt;
&lt;p&gt;v$controlfile과 같이 v$로 시작. NOMOUNT 상태부터 조회 가능.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) SYSAUX Tablespace&lt;/h3&gt;
&lt;p&gt;튜닝 관련 딕셔너리들이 저장되어 있다.&lt;/p&gt;
&lt;p&gt;(10g 기준)AWR, ADDM, ASH 등과 같은 자동 튜닝 기능들이 이 곳의 정보를 사용.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 일반 Tablespace&lt;/h3&gt;
&lt;p&gt;관리자가 필요에 의해 생성&lt;/p&gt;
&lt;p&gt;일반 Tablespace 생성 및 조회&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; CREATE TABLESPACE haksa DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa01.dbf&amp;rsquo; SIZE 1M;
SYS&amp;gt; SELECT tablespace_name, status, contents,
            extent_management, segment_space_management
 2   FROM dba_tablespaces;
SYS&amp;gt; SELECT tablespace_name, bytes/1024/1024 MB, file_name
 2   FROM dba_data_files;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) Tablespace 관리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace에 Data file 추가&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE haksa ADD DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa02.dbf&amp;rsquo; SIZE 20M;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Data File 크기 수동 조정&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa01.dbf&amp;rsquo; RESIZE 20M;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Data File 크기 자동 증가&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa01.dbf&amp;rsquo; AUTOEXTEND ON;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace Offline&lt;/h4&gt;
&lt;p&gt;Normal Mode&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE haksa OFFLINE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Temporary Mode: Offline 시키려는 Tablespace의 Data File에 이상이 있을 경우에 사용.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE haksa OFFLINE TEMPORARY;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Immediate Mode: Data File에 장애가 발생하여 데이터를 내려쓰지 못하는 상황에서 Tablespace를 Offline 해야 할 경우에 사용. ARCHIVE LOG MODE일 경우에만 사용.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE haksa OFFLINE IMMEDIATE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Data file Offline&lt;/h4&gt;
&lt;p&gt;ARCHIVE LOG MODE&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa01.dbf&amp;rsquo; OFFLINE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NO ARCHIVE LOG MODE&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa01.dbf&amp;rsquo; OFFLINE DROP;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace Online&lt;/h4&gt;
&lt;p&gt;Offline 후 Online 할 때에는 반드시 Checkpoint를 발생시켜 SCN 번호를 동기화 시켜야 함.&lt;/p&gt;
&lt;p&gt;ARCHIVE LOG MODE&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE haksa ONLINE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NO ARCHIVE LOG MODE&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; RECOVER TABLESPACE haksa;
SYS&amp;gt; ALTER TABLESPACE haksa ONLINE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Offline되는 Tablespace의 Data File 이동&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;해당 Tablespace Offline&lt;/li&gt;
&lt;li&gt;Data File을 대상 위치로 복사&lt;/li&gt;
&lt;li&gt;Control File 내의 해당 Data File 위치 변경&lt;/li&gt;
&lt;li&gt;해당 Tablespace Online&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE haksa RENAME
 2   DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/haksa01.dbf&amp;rsquo;
 3   TO &amp;lsquo;/app/oracle/disk1/haksa01.dbf&amp;rsquo;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Offline 안 되는 Tablespace의 Data File 이동&lt;/h4&gt;
&lt;p&gt;Redo Log File 이동도 같은 방법으로 진행, SYSTEM Tablespace, 사용중인 UNDO Tablespace, Default Temporary Tablespace&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DB 종료&lt;/li&gt;
&lt;li&gt;MOUNT 상태로 시작&lt;/li&gt;
&lt;li&gt;Data File 복사&lt;/li&gt;
&lt;li&gt;Control File 내용 변경&lt;/li&gt;
&lt;li&gt;DB OPEN&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE RENAME
 2   FILE &amp;lsquo;/app/oracle/oradata/testdb/system01.dbf&amp;rsquo;
 3   TO &amp;lsquo;/app/oracle/disk3/system01.dbf&amp;rsquo;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace 삭제&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; DROP TABLESPACE haksa [including contents and datafiles];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6) UNDO Tablespace&lt;/h3&gt;
&lt;p&gt;Undo Data 만을 저장하는 Segment를 &lt;b&gt;Undo Segment&lt;/b&gt;라 하고, Undo Segment를 저장하고 있는 Tablespace가 &lt;b&gt;UNDO Tablespace&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;Undo Data: 사용자가 DML을 수행할 경우에 발생하는 원본 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Undo Tablespace 사용 목적&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;Transaction Rollback:&lt;/b&gt; Undo Segment에 저장된 Undo Data를 사용하여 원래의 값으로 복원하는 것. 사용자가 Rollback 명령을 실행하거나, Transaction이 비정상 종료되어 PMON이 자동 Rollback 처리하는 경우에 실행.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Read Consistency(읽기 일관성):&lt;/b&gt; Transaction이 진행되는 동안, 데이터베이스의 다른 사용자는 CR작업을 통해 변경 전 원본 데이터를 보게 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Transaction Recovery(Instance Recovery):&lt;/b&gt; DB가 비정상 종료되었을 때 Roll Forward, Roll Backward 작업을 수행하여, Dirty Database를 Clean Database로 고치는 과정에서 Undo Data가 사용.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Commit을 수행하면 다른 Server Process가 덮어 쓸 수 있을 뿐, Undo Segment 안의 Undo Data를 Delete하는 것은 아니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNDO Tablespace 조회&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; SHOW PARAMETER UNDO;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNDO Tablespace 생성&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; CREATE UNDO TABLESPACE undo01
 2   DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/undo01.dbf&amp;rsquo; SIZE 10M
 3   AUTOEXTEND ON;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNDO Tablespace 변경&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER SYSTEM SET undo_tablespace = undo01;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNDO 관련 주요 Parameter&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;UNDO_RETENTION:&lt;/b&gt; 단위는 초. Commit 수행 후에도 해당 Undo Segment 내의 데이터를 다른 Server Process가 덮어쓰지 못하도록 막아주는 시간. ORA-01555. Snapshot too old 에러 예방 시 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER SYSTEM SET undo_retention = 시간;&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;b&gt;UNDO_RETENTION_GUARANTEE:&lt;/b&gt; Undo Segment 용량이 부족해도, Undo Retention에 설정된 시간 동안 재활용 하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE undotbs1 RETENTION [NO]GUARANTEE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNDO Tablespace 삭제&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; DROP TABLESPACE undotbs1;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7) Temporary Tablespace&lt;/h3&gt;
&lt;p&gt;정렬 작업 등을 수행할 경우, PGA 공간이 부족하면 이 곳을 사용한다.&lt;/p&gt;
&lt;p&gt;성능 향상을 위해 각 사용자 별로 하나씩 각각 할당하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기존 Temporary Tablespace 조회&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; SELECT file_id, tablespace_name, bytes/1024/1024 mb, file_name
 2   FROM dba_temp_files;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;신규 Temporary Tablespace 생성&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; CREATE TEMPORARY TABLESPACE temp2
 2   TEMPFILE &amp;lsquo;/app/oracle/oradata/testdb/temp02.dbf&amp;rsquo; SIZE 10M
 3   AUTOEXTEND ON;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Default Temporary Tablespace 설정 및 조회&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
SYS&amp;gt; SELECT * FROM database_properties
 2   WHERE property_name like &amp;lsquo;DEFAULT_TEMP%&amp;rsquo;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Temporary Tablespace 크기 조정&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER DATABASE TEMPFILE &amp;lsquo;/app/oracle/oradata/testdb/temp02.dbf&amp;rsquo; RESIZE 100M;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Temporary Tablespace 삭제&lt;/h4&gt;
&lt;p&gt;삭제하기 전에 Default Temporary Tablespace 지정 해제.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; DROP TABLESPACE temp2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(11g) Temporary Tablespace Group&lt;/h4&gt;
&lt;p&gt;그룹 생성&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; CREATE TEMPORARY TABLESPACE temp_scott1
 2   TEMPFILE &amp;lsquo;/app/oracle/oradata/testdb/temp_scott01.dbf&amp;rsquo; size 10M
 3   TABLESPACE GROUP temp_scott_group;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그룹에 Tablespace 추가&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE temp_scott2 TABLESPACE GROUP temp_scott_group;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그룹 조회&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; SELECT * FROM dba_tablespace_groups;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그룹에서 탈퇴&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLESPACE temp_scott2 TABLESPACE GROUP &amp;lsquo; &amp;rsquo;;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. Oracle 저장 구조&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Oracle Block 개요&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;OS Block &amp;rarr; Oracle Block &amp;rarr; Extent &amp;rarr; Segment &amp;rarr; Tablespace &amp;rarr; Database&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Standard Block Size:&lt;/b&gt; DB_BLOCK_SIZE로 지정. 기본 값은 8KB. Database 생성 시 한 번 지정되면, Database를 재생성 하기 전에는 변경할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Non-Standard Block Size:&lt;/b&gt; Standard Block Size를 제외한 나머지.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Oracle Data Block 상세 구조&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/wt7bP/btqJXUQA380/hFN6tplWKctFHsxwD39eS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wt7bP/btqJXUQA380/hFN6tplWKctFHsxwD39eS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wt7bP/btqJXUQA380/hFN6tplWKctFHsxwD39eS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwt7bP%2FbtqJXUQA380%2FhFN6tplWKctFHsxwD39eS1%2Fimg.png&quot; width=&quot;100%&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; width=&quot;100%&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/bzETe4/btqJ8fyJkp8/pUszRkPvi119Aec3Cznxv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzETe4/btqJ8fyJkp8/pUszRkPvi119Aec3Cznxv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzETe4/btqJ8fyJkp8/pUszRkPvi119Aec3Cznxv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzETe4%2FbtqJ8fyJkp8%2FpUszRkPvi119Aec3Cznxv0%2Fimg.png&quot; width=&quot;100%&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;Block Header 중 &lt;b&gt;Common(Cache Layer)&lt;/b&gt; 부분은 KCBH 영역이며 20Bytes이다. 다음의 정보가 들어있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Block Address(DBA)&lt;/li&gt;
&lt;li&gt;Block Type(Table, Index, Undo 등)&lt;/li&gt;
&lt;li&gt;Block Format(v6, v7, v8 등)&lt;/li&gt;
&lt;li&gt;System Change Number(SCN, 복구 작업에 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Block Header 중 &lt;b&gt;Transaction Layer&lt;/b&gt;의 &lt;b&gt;Fixed&lt;/b&gt; 영역은 KTBBH 영역이며 48Bytes이다. 다음의 정보가 들어있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Block Type&lt;/li&gt;
&lt;li&gt;마지막으로 수행된 Block Cleanout 시간&lt;/li&gt;
&lt;li&gt;ITL Entries 정보&lt;/li&gt;
&lt;li&gt;Free List Link 정보&lt;/li&gt;
&lt;li&gt;Free Space Lock 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Block Header 중 &lt;b&gt;Transaction Layer&lt;/b&gt;의 &lt;b&gt;Variable&lt;/b&gt; 영역은 KTBIT 영역이며 24Bytes이다. 다음의 정보가 들어있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 Block에 있는 Row를 변경하기를 원하는 실제 ITL 관련 정보
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITL: Oracle에서 특정 Block에 데이터를 변경해야 할 경우 해당 Block의 사용자 명단에 자신의 정보(TxID 등)을 적고 변경해야 한다. 이 때 사용하는 대기자 명단을 ITL이라 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Data Layer&lt;/b&gt;에는 Table Index 항목의 내용과 Row Index 항목의 내용이 들어있다. 실제 데이터가 저장되는 곳이라서 Free Space 관리가 중요하다. Row Index에서 첫 번째 빈 공간의 포인터 주소와 빈 공간의 시작과 끝나는 Offset 주소, 사용 가능 한 빈 공간의 정보를 가지고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) PCTFREE와 PCTUSED&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;PCTFREE:&lt;/b&gt; 해당 Block에 입력되어 있는 데이터들이 Update될 경우를 대비하여 예약해 두는 공간.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;PCTUSED:&lt;/b&gt; Dirty Block에서 지워진 후 남은 용량이 얼마가 되어야 Free Block이 되는가를 결정하는 파라미터.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Row Data와 Row Chaining &amp;amp; Row Migration&lt;/h3&gt;
&lt;p&gt;Row는 크게 &lt;b&gt;Row Header&lt;/b&gt;와 &lt;b&gt;Column Data&lt;/b&gt;로 나뉜다. Row Header에는 해당 Row에 동시에 Transaction을 일으키는 것을 막기 위한 Lock 정보 부분과 해당 Row Piece에 들어있는 Column Data의 개수 등이 기록된다. Column Data 부분은 실제 데이터가 저장되는 곳이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Row Chaining: Block의 크기보다 큰 데이터가 들어와서, 기존 Block와 신규 Block에 걸쳐서 데이터가 저장되는 현상.&lt;/li&gt;
&lt;li&gt;Row Migration: 특정 Block에 위치하던 Row가 Update 등의 이유로 해당 Block에 공간이 부족해서 다른 Block으로 이동하는 것. 원래 Block에는 신규 Block의 포인터 주소를 남겨둔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) Extent와 Segment&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. Extent&lt;/h4&gt;
&lt;p&gt;연속적으로 있는 Block을 모은 것.&lt;/p&gt;
&lt;p&gt;Extent 수동 할당&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLE ex_table01
 2   ALLOCATE EXTENT ( SIZE 100k
 3   DATAFILE &amp;lsquo;/app/oracle/oradata/testdb/ex_test01.dbf&amp;rsquo; );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;사용 안 한 Extent 반환&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLE ex_table01 DEALLOCATE UNUSED;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;데이터가 지워졌더라도 이미 사용 된 Extent는 반환을 할 수 없다. 이럴 때에는 Table을 Reorg 하면 된다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SYS&amp;gt; ALTER TABLE ex_table01 MOVE TABLESPACE USERS;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. Segment&lt;/h4&gt;
&lt;p&gt;여러 개의 Extent가 모여 Segment가 된다.&lt;/p&gt;
&lt;p&gt;Oracle Object 중 독자적인 저장 공간을 가지는 것들을 말한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle Object: Oracle에서 관리자나 사용자가 데이터를 관리하기 위해 만드는 모든 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여러 개의 Extent 중 가장 첫 번째 Extent의 첫 번째 Block에 Segment의 전체 요약정보인 Segment Header 정보가 들어간다. Segment Header에는 해당 Segment의 종류에 대한 정보와, Extent의 할당 상태, 공간 사용 내역 등의 정보들이 저장된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6) Free List Management(FLM) 기법을 사용한 Extent 관리&lt;/h3&gt;
&lt;p&gt;Free Block은 &lt;b&gt;FET$&lt;/b&gt;(Free Extent Table, DBA_FREE_SPACE에서 조회), Dirty Block은 &lt;b&gt;&lt;i&gt;UET$&lt;/i&gt;&lt;/b&gt;(Used Extent Table, DBA_EXTENTS에서 조회)에서 관리.&lt;/p&gt;
&lt;p&gt;만약 사용자가 Drop Tablespace나 Alter Tablespace&amp;hellip;Coalesce 등의 작업을 해서 Dirty Extent에서 Free Extent가 된다면 FET$와 UET$를 업데이트 해야 한다.&lt;/p&gt;
&lt;p&gt;위와 같이 Block들의 정보들을 딕셔너리를 사용해서 일괄적으로 관리하는 방식의 Tablespace를 &lt;b&gt;DMT(Dictionary Management Tablespace)&lt;/b&gt;라고 한다.&lt;/p&gt;
&lt;p&gt;DMT는 FET$와 UET$를 동시에 여러 명이 사용 할 수 없다(&lt;b&gt;딕셔너리 ST락&lt;/b&gt;). 이를 해결한 것이 &lt;b&gt;LMT(Locally Managed Tablespace)&lt;/b&gt; 방식이다. 9i부터 Tablespace 생성 시 자동적으로 LMT로 생성된다.&lt;/p&gt;
&lt;p&gt;LMT인 경우, &lt;b&gt;9i&lt;/b&gt;에는 &lt;b&gt;FLM(Free List Management)&lt;/b&gt; 방식으로 관리되고, &lt;b&gt;10g&lt;/b&gt;부터는 &lt;b&gt;ASSM(Automatic Segment Space Management)&lt;/b&gt; 방식으로 생성되고 관리된다.&lt;/p&gt;
&lt;p&gt;FLM 방식의 경우 &lt;b&gt;Free List&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;Master Free List(Segment Free List):&lt;/b&gt; 해당 Segment에 새롭게 할당된 Free Block이나 트랜잭션이 종료되어 Dirty에서 Free로 반환된 Block들의 목록이 저장되어 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Process Free List:&lt;/b&gt; 해당 Segment에 트랜잭션이 끝나서 Free Block이 된 명단을 가지고 있다. Master Free List의 경합을 막기 위해 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Transaction Free List:&lt;/b&gt; 현재 세션이 트랜잭션을 수행하는 도중 Free Block으로 변한 블록들의 목록을 관리.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Process Free List의 Free Extent가 전부 소진되어 Master Free List에 요청을 했는데 Master Free List에도 Free Extent가 없을 경우, Oracle은 &lt;b&gt;HWM(High Water Mark)&lt;/b&gt;를 오른쪽으로 이동(HWM Bump UP)시킨 후 Free Extent를 새로 생성해서 할당한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7) Automatic Segment Space Management(ASSM) 기법을 사용한 Extent 관리&lt;/h3&gt;
&lt;p&gt;FLM이 수동으로 Extent를 관리했다면, ASSM은 Oracle이 자동으로 Extent를 관리한다.&lt;/p&gt;
&lt;p&gt;Free List가 없고 &lt;b&gt;&lt;i&gt;Bit Map Block(BMB)&lt;/i&gt;&lt;/b&gt;이 Free Block의 상태들을 관리한다. B-Tree 인덱스와 비슷하다. 모든 Data Block에 해당 Block의 여유 상태를 Bitmap으로 나타낸다.&lt;/p&gt;
&lt;p&gt;Segment에 새로운 데이터를 입력하기 위해 Free Block을 찾아야 할 경우, 가장 먼저 L3 BMB를 읽어서 Free Block의 정보를 가진 L2 BMB를 찾고, L2 BMB에서 해당 Block을 관리하는 L1 BMB를 찾는다. L1 BMB까지 찾은 후 해당 블록에 새로운 내용을 추가하고 만약 블록의 용량이 변경되면 블록의 헤더 부분의 Bitmap 정보를 변경한다.&lt;/p&gt;
&lt;p&gt;FLM에서는 HWM 기준으로 왼쪽은 사용 중, 오른쪽은 Free Block이었다면, ASSM은 Block을 순서대로 쓰지 않기 때문에 중간에 빈 Block이 생긴다. 이때 &lt;b&gt;High HWM&lt;/b&gt;과 &lt;b&gt;Low HWM&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;High HWM 이상의 블록들은 모두 비 포맷 상태 블록으로, 아직 사용되지 않은 블록들이다.&lt;/li&gt;
&lt;li&gt;Low HWM 이하의 블록들은 모두 포맷 상태 블록으로 현재 사용중인 블록들이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8) 메모리 관리 기법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A. 9i 버전에서의 메모리 관리&lt;/h4&gt;
&lt;p&gt;SGA의 전체 크기는 &lt;b&gt;SGA_MAX_SIZE&lt;/b&gt;로 지정하며, 이 값을 초과할 수 없다.&lt;/p&gt;
&lt;p&gt;PGA의 전체 크기는 &lt;b&gt;PGA_AGGREGATE_TARGET&lt;/b&gt; 파라미터로 지정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WORKAREA_SIZE_POLICY&lt;/b&gt; 파라미터를 AUTO로 설정할 경우 PGA 전체 크기 범위 안에서 PGA 값을 오라클이 자동으로 관리한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;B. 10g 버전에서의 메모리 관리&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Automatic Shared Memory Management(ASMM)&lt;/b&gt; 등장.&lt;/p&gt;
&lt;p&gt;Redo Log Buffer를 제외한, Shared Pool, Default Database Buffer Cache, Large Pool, Java Pool, Streams Pool을 자동으로 변경한다.&lt;/p&gt;
&lt;p&gt;ASMM 기능을 사용하려면 &lt;b&gt;STATISTICS_LEVEL&lt;/b&gt; 파라미터를 &lt;b&gt;TYPICAL&lt;/b&gt; 또는 &lt;b&gt;ALL&lt;/b&gt;로 설정하고, SGA_TARGET 파라미터의 값을 0보다 큰 값으로 설정한다. 다른 파라미터(DB_CACHE_SIZE 등)는 0으로 설정.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C. 11g 버전에서의 메모리 관리&lt;/h4&gt;
&lt;p&gt;SGA뿐만 아니라 PGA까지 한번에 자동으로 관리하는 &lt;b&gt;Automatic Memory Management(AMM)&lt;/b&gt; 등장.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MEMORY_TARGET&lt;/b&gt; 파라미터에 값을 설정하면 해당 범위 안에서 자동으로 관리한다.&lt;/p&gt;
&lt;p&gt;AMM 기능을 사용하면 SGA_TARGET이나 PGA_AGGREGATE_TARGET 파라미터를 설정할 필요가 없다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>DB</category>
      <category>Oracle</category>
      <category>관리</category>
      <category>오라클</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/73</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EC%98%A4%EB%9D%BC%ED%81%B4-%EA%B4%80%EB%A6%AC-%EC%8B%A4%EB%AC%B4#entry73comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:58:26 +0900</pubDate>
    </item>
    <item>
      <title>[정리] 데이터베이스 개론과 실습</title>
      <link>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%A1%A0%EA%B3%BC-%EC%8B%A4%EC%8A%B5</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 10월 18일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고도서&lt;br /&gt;박우창 외 2인. 『오라클로 배우는 데이터베이스 개론과 실습』. 한빛아카데미. 2014&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 시스템의 개념&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1장. 데이터베이스 시스템&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 데이터베이스&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 데이터베이스의 개념&lt;/h4&gt;
&lt;p&gt;데이터에 대한 &lt;b&gt;통합된 데이터(integrated data), 저장된 데이터(stored data), 운영 데이터(operational data), 공용 데이터(shared data)&lt;/b&gt;를 말한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터베이스의 특징&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;실시간 접근성(real time accessibility), 계속적인 변화(continuous change), 동시 공유(concurrent sharing), 내용에 따른 참조(reference by content)&lt;/b&gt; 등이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 데이터베이스 시스템의 구성&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;데이터베이스 관리 시스템(DBMS):&lt;/b&gt; 사용자와 데이터베이스를 연결시켜주는 소프트웨어.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터베이스:&lt;/b&gt; 데이터를 모아둔 토대.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 모델:&lt;/b&gt; 데이터가 저장되는 기법에 관한 내용.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 정보 시스템의 발전&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; DBMS가 없는 시스템으로, 데이터는 파일 단위로 저장되며 파일을 다루는 파일 서버가 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터베이스 시스템:&lt;/b&gt; DBMS를 도입하여 데이터를 통합 관리하는 시스템이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 데이터베이스 시스템:&lt;/b&gt; 데이터베이스를 웹 브라우저에서 사용하도록 제공하는 시스템이다. 웹 서버와 JSP, PHP, 웹 데이터베이스 연동 언어들을 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분산 데이터베이스 시스템:&lt;/b&gt; 여러 곳에 분산된 DBMS 서버를 연결하여 운영하는 시스템으로 대규모 응용 시스템에 사용된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. DBMS의 장점&lt;/h4&gt;
&lt;p&gt;데이터를 공유하여 중복 가능성을 최소화하고 이를 통해 데이터의 일관성을 유지한다. 또 데이터 구조가 변경되더라도 프로그램을 수정할 필요가 없어 데이터 독립성을 유지할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. SQL&lt;/h4&gt;
&lt;p&gt;데이터베이스 시스템에 사용하는 전용 언어로 &lt;b&gt;데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)&lt;/b&gt;로 구성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 정의어:&lt;/b&gt; SQL의 CREATE, ALTER, DROP 문과 같이 DBMS에 저장된 테이블의 구조를 정의한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 조작어:&lt;/b&gt; SQL의 SELECT, INSERT, DELETE, UPDATE 문과 같이 데이터를 삽입, 삭제, 수정하는데 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 제어어:&lt;/b&gt; SQL의 GRANT, REVOKE 문과 같이 데이터의 사용 권한을 관리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. DBMS의 기능&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;데이터 정의(Definition):&lt;/b&gt; 데이터의 구조를 정의하고 데이터 구조에 대한 삭제 및 변경 기능을 수행함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 조작(Manipulation):&lt;/b&gt; 데이터를 조작하는 소프트웨어(응용 프로그램)가 요청하는 데이터의 삽입, 수정, 삭제, 작업을 지원함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 추출(Retrieval):&lt;/b&gt; 사용자가 조회하는 데이터 혹은 응용 프로그램의 데이터를 추출함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 제어(Control):&lt;/b&gt; 데이터베이스 사용자를 생성하고 모니터링하며 접근을 제어함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 데이터 모델&lt;/h4&gt;
&lt;p&gt;데이터베이스 시스템에서 데이터를 저장하는 이론적인 방법에 관한 것으로, 데이터베이스에 데이터가 어떻게 구조화되어 저장되는지를 결정한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 3단계 데이터베이스 구조&lt;/h4&gt;
&lt;p&gt;외부 단계, 개념 단계, 내부 단계로 나누어지며 각 단계는 외부 스키마, 개념 스키마, 내부 스키마로 구성된다. 스키마(schema)는 그리스어에서 유래된 단어로 데이터베이스의 조직이나 구조를 의미한다.&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; 서브 스키마(sub schema)라고도 하며, 뷰(view)의 개념이다. 개념 스키마 중 사용자에게 필요한 부분 스키마를 의미한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개념 스키마:&lt;/b&gt; 전체 데이터베이스의 정의를 말하는 것으로 통합 조직 별로 하나만 존재한다. 저장 장치에 독립적으로 기술되며, 데이터와 관계(relationship), 제약사항, 무결성에 대한 내용이 포함된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;내부 스키마:&lt;/b&gt; 물리적 저장 장치에서 데이터베이스가 실제로 저장되는 방법의 표현이다. 인덱스, 데이터 레코드의 배치 방법, 데이터 압축 등에 관한 사항이 포함된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11. 데이터 독립성&lt;/h4&gt;
&lt;p&gt;3단계 데이터베이스 구조에서 하위 단계의 내용을 추상화하여 상위 단계에 그 세부 사항을 숨김으로써 한 단계 내의 변경에 대해서 다른 단계와 상호 간섭이 없도록 하는 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;논리적 데이터 독립성:&lt;/b&gt; 외부 단계와 개념 단계 사이의 독립성으로, 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;물리적 데이터 독립성:&lt;/b&gt; 개념 단계와 내부 단계 사이의 독립성으로, 저장 장치 구조 변경과 같이 내부 스키마가 변경되어도 개념 스키마에 영향을 미치지 않도록 지원한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/yPhrZ/btqJZmsxLKG/VuHohm0Bl2ax3NUfl5U5j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yPhrZ/btqJZmsxLKG/VuHohm0Bl2ax3NUfl5U5j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yPhrZ/btqJZmsxLKG/VuHohm0Bl2ax3NUfl5U5j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyPhrZ%2FbtqJZmsxLKG%2FVuHohm0Bl2ax3NUfl5U5j1%2Fimg.png&quot; width=&quot;100%&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;h3 data-ke-size=&quot;size23&quot;&gt;2장. 관계 데이터 모델&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 릴레이션&lt;/h4&gt;
&lt;p&gt;관계 데이터 모델의 핵심적인 개념으로 행과 열로 구성된 테이블을 말한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/dpzP2R/btqJ6dukqm7/153fgrwFxNeJKUKZXsmuek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpzP2R/btqJ6dukqm7/153fgrwFxNeJKUKZXsmuek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpzP2R/btqJ6dukqm7/153fgrwFxNeJKUKZXsmuek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpzP2R%2FbtqJ6dukqm7%2F153fgrwFxNeJKUKZXsmuek%2Fimg.png&quot; width=&quot;100%&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 릴레이션 스키마&lt;/h4&gt;
&lt;p&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;속성(attribute):&lt;/b&gt; 릴레이션 스키마의 열&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도메인(domain):&lt;/b&gt; 속성이 가질 수 있는 값의 집합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차수(degree):&lt;/b&gt; 속성의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 릴레이션 인스턴스&lt;/h4&gt;
&lt;p&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;투플(tuple):&lt;/b&gt; 릴레이션의 행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;카디날리티(cardinality):&lt;/b&gt; 투플의 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 관계 데이터베이스 시스템&lt;/h4&gt;
&lt;p&gt;관계 데이터 모델을 컴퓨터 시스템에 구현한 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 키&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;li&gt;&lt;b&gt;기본키:&lt;/b&gt; 여러 후보키 중 하나를 선정하여 대표로 삼는 키를 말한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대리키:&lt;/b&gt; 일련번호 같은 가상의 속성을 만들어 기본키로 삼는 것을 말한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외래키:&lt;/b&gt; 다른 릴레이션의 기본키를 참조하는 속성을 말한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 릴레이션의 특징&lt;/h4&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;li&gt;투플의 순서는 상관없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 무결성 제약조건&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; 기본키는 NULL 값을 가져서는 안 되며, 릴레이션 내에 오직 하나의 값만 존재해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;참조 무결성 제약조건:&lt;/b&gt; 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 속성의 도메인이 동일해야 하며, 자식 릴레이션의 값 변경 시 부모 릴레이션의 값에 제약을 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 참조 무결성 제약조건의 옵션&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;RESTRICTED:&lt;/b&gt; 자식 릴레이션에서 참조하고 있을 경우 부모 릴레이션의 삭제 작업을 거부함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CASCADE:&lt;/b&gt; 자식 릴레이션의 관련 투플을 같이 삭제함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DEFAULT:&lt;/b&gt; 자식 릴레이션의 관련 투플을 미리 설정해둔 값으로 변경함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NULL:&lt;/b&gt; 자식 릴레이션의 관련 투플을 NULL 값으로 설정함(NULL 값을 허가한 경우).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 관계대수&lt;/h4&gt;
&lt;p&gt;릴레이션에서 원하는 결과를 얻기 위해 수학의 대수와 같은 연산을 이용하여 질의하는 방법을 기술하는 언어이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 셀렉션&lt;/h4&gt;
&lt;p&gt;릴레이션의 투플을 추출하기 위한 연산으로 기호는 &amp;lsquo;&amp;sigma;(sigma)&amp;rsquo;를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11. 프로젝션&lt;/h4&gt;
&lt;p&gt;릴레이션의 속성을 추출하기 위한 연산으로 기호는 &amp;lsquo;&amp;pi;(pi)&amp;rsquo;를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12. 집합연산&lt;/h4&gt;
&lt;p&gt;수학의 집합연산과 동일한 연산으로 합집합, 교집합, 차집합, 카티전 프로덕트 등이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;13. 조인&lt;/h4&gt;
&lt;p&gt;두 릴레이션의 공통 속성을 기준으로 속성 값이 같은 투플을 수평으로 결합하는 연산이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;세타조인:&lt;/b&gt; 두 릴레이션의 속성 값을 비교해서 조건(=, &amp;ne;, &amp;le;, &amp;ge;, &amp;lt;, &amp;gt;)에 만족하는 투플을 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동등조인:&lt;/b&gt; 세타조인에서 = 연산자를 사용한 조인을 말한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자연조인:&lt;/b&gt; 조인에 참여한 속성이 두 번 나오지 않도록 중복된 속성을 제거한 결과를 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세미조인:&lt;/b&gt; 자연조인을 한 후 두 릴레이션 중 한쪽 릴레이션의 결과만 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부조인:&lt;/b&gt; 자연조인 시 조인에 실패한 투플을 모두 보여주되, 값이 없는 대응 속성은 NULL 값을 채워서 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;14. 디비전&lt;/h4&gt;
&lt;p&gt;속성 A와 B로 이루어진 릴레이션 R과 속성 B로 이루어진 릴레이션 S의 디비전 연산은, 릴레이션 S의 속성 B 값과 동일하게 대응하는 릴레이션 R의 속성 A의 투플들을 반환한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 프로그래머&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3장. SQL 기초&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. SQL&lt;/h4&gt;
&lt;p&gt;SQL(Structured Query Language)은 1970년대 후반 IBM이 SEQUEL(Structured English QUEry Language)이라는 이름으로 개발한 관계형 데이터베이스 언어이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 데이터 정의어(DDL)&lt;/h4&gt;
&lt;p&gt;테이블이나 관계의 구조를 생성하는 데 사용하여 CREATE, ALTER, DROP 문 등이 있다.&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;CREATE TABLE 테이블이름
    ( {속성이름 데이터타입
       [NULL | NOT NULL | UNIQUE | DEFAULT 기본값 | CHECK 체크조건]
      }
      [PRIMARY KEY 속성이름(들)]
      {[FOREIGN KEY 속성이름 REFERENCES 테이블이름(속성이름)]
       [ON DELETE {CASCADE | SET NULL}
      }
    (
ALTER TABLE 테이블이름
    [ADD 속성이름 데이터타입]
    [DROP COLUMN 속성이름]
    [MODIFY 속성이름 데이터타입]
    [MODIFY 속성이름 데이터타입 [NULL | NOT NULL]
    [ADD PRIMARY KEY(속성이름)]
    [[ADD | DROP] 제약이름]
DROP TABLE 테이블이름&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터 조작어(DML)&lt;/h4&gt;
&lt;p&gt;테이블에 데이터를 검색, 삽입, 수정, 삭제하는 데 사용하여 SELECT, INSERT, DELETE, UPDATE 문 등이 있다. 여기서 SELECT 문은 데이터를 조회하는 명령어라 하여 특별히 질의어(query)라고 한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    [ALL | DISTINCT]
    [테이블이름.]{ * | 속성이름 [[AS] 속성이름별칭]}
[FROM
    {테이블이름 [AS 테이블이름별칭]}
    [INNER JOIN | LEFT [OUTER] JOIN | RIGHT [OUTER] JOIN
    {테이블 이름 [ON 검색조건]}
    | FULL [OUTER] JOIN {테이블이름}]]
[WHERE 검색조건(들)]
[GROUP BY {속성이름, [ &amp;hellip;, n]}]
[HAVING 검색조건(들)]
[질의 UNION 질의 | 질의 UNION ALL 질의]
[ORDER BY {속성이름 [ASC | DESC], { &amp;hellip;, n}}]
INSERT INTO 테이블이름[(속성리스트)]
    VALUES (값리스트);
UPDATE 테이블이름
SET 속성이름1 = 값1[, 속성이름2 = 값2, &amp;hellip;]
[WHERE &amp;lt;검색조건&amp;gt;];
DELETE FROM 테이블이름
[WHERE 검색조건];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. WHERE 조건&lt;/h4&gt;
&lt;p&gt;WHERE 절 다음에 나올 수 있는 조건으로 사용할 수 있는 술어(predicate)는 비교, 범위, 집합, 패턴, NULL 등이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 집계 함수&lt;/h4&gt;
&lt;p&gt;테이블의 각 열에 대해 계산을 하는 함수로 SUM, AVG, MIN, MAX, COUNT의 다섯 가지가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. GROUP BY&lt;/h4&gt;
&lt;p&gt;속성의 공통 값에 따라 그룹을 만드는 데 사용하는 명령이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. HAVING&lt;/h4&gt;
&lt;p&gt;GROUP BY 절의 결과 나타나는 그룹을 제한하는 역할을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 조인&lt;/h4&gt;
&lt;p&gt;한 테이블의 행을 다른 테이블의 행에 연결함으로써 두 개 이상의 테이블을 결합하는 연산이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 동등조인(내부조인)&lt;/h4&gt;
&lt;p&gt;동등조건에 의하여 테이블을 조인하는 것을 동등조인(equi join)이라고 한다. 조인이라고 하면 대부분 동등조인을 말한다. 동등조인은 내부조인(inner join)이라고도 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 부속질의&lt;/h4&gt;
&lt;p&gt;SELECT 문의 WHERE 절에 또 다른 테이블 결과를 이용하기 위해 다시 SELECT 문을 괄호로 묶는 것을 부속질의(subquery)라고 한다. 부속질의는 질의가 중첩되어 있다는 의미에서 중첩질의(nested query)라고도 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11. 상관 부속질의&lt;/h4&gt;
&lt;p&gt;상관 부속질의(correlated subquery)는 상위 부속질의와 하의 부속질의가 독립적이지 않고 상위 부속질의의 투플을 이용하여 하위 부속질의를 계산하는 질의를 말한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12. 투플 변수&lt;/h4&gt;
&lt;p&gt;FROM 절의 테이블 이름 뒤에 테이블의 다른 이름을 붙여주는 것은 투플 변수라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;13. 집합연산&lt;/h4&gt;
&lt;p&gt;SQL에서 집합연산은 합집합을 UNION, 차집합을 MINUS, 교집합을 INTERSECT로 나타낸다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;14. EXISTS&lt;/h4&gt;
&lt;p&gt;EXISTS는 부속질의문의 어떤 행이 조건에 만족하면 참이다. 반면 NOT EXISTS는 부속질의문의 모든 행이 조건에 만족하지 않을 때만 참이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;15. CREATE&lt;/h4&gt;
&lt;p&gt;테이블을 구성하고, 속성과 속성에 관한 제약을 정의하며, 기본키 및 외래키를 정의한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;16. ALTER&lt;/h4&gt;
&lt;p&gt;생성된 테이블의 속성과 속성에 관한 제약 그리고 기본키 및 외래키를 변경한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;17. DROP&lt;/h4&gt;
&lt;p&gt;테이블의 구조와 데이터를 삭제한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;18. INSERT&lt;/h4&gt;
&lt;p&gt;테이블에 새로운 투플을 삽입한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;19. UPDATE&lt;/h4&gt;
&lt;p&gt;기존 투플에 있는 특정 속성 값을 수정한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;20. DELETE&lt;/h4&gt;
&lt;p&gt;테이블에 있는 기존 투플을 삭제한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4장. SQL 고급&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 내장 함수&lt;/h4&gt;
&lt;p&gt;사용자가 만든 함수에 대비되는 용어로 DBMS에서 제공하는 함수다. 상수나 열 이름을 입력 값으로 받아 호출되며, 단일 값을 결과로 반환한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;숫자 함수&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ABS(숫자):&lt;/b&gt; 숫자의 절댓값을 계산.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;ABS(-4.5)=4.5&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;b&gt;CEILING(숫자):&lt;/b&gt; 숫자보다 크거나 같은 최소의 정수.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;CEILING(4.1)=5&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;b&gt;FLOOR(숫자):&lt;/b&gt; 숫자보다 작거나 같은 최소의 정수.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;FLOOR(4.1)=4&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;b&gt;ROUND(숫자, m):&lt;/b&gt; 숫자의 반올림, m은 반올림 기준 자릿수.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ROUND(5.36, 1)=5.40&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;b&gt;LOG(n, 숫자):&lt;/b&gt; 숫자의 자연로그 값을 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;LOG(10)=2.30359&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;b&gt;POWER(숫자, n):&lt;/b&gt; 숫자의 n제곱 값을 계산.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;POWER(2,3)=8&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;b&gt;SQRT(숫자):&lt;/b&gt; 숫자의 제곱근 값을 계산(숫자는 양수).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;SQRT(9.0)=3.0&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;b&gt;SIGN(숫자):&lt;/b&gt; 숫자가 음수면 -1, 0이면 0, 양수면 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;SIGN(3.45)=1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;문자 함수(문자 값 반환 함수 / s: 문자열, c: 문자, n: 정수, k: 정수)&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CHR(k):&lt;/b&gt; 정수 아스키 코드를 문자로 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;CHR(68)=&amp;rsquo;D&amp;rsquo;&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;b&gt;CONCAT(s1, s2):&lt;/b&gt; 두 문자열을 연결.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;CONCAT(&amp;lsquo;마당&amp;rsquo;,&amp;rsquo; 서점&amp;rsquo;)=&amp;rsquo;마당 서점&amp;rsquo;&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;b&gt;INITCAP(s):&lt;/b&gt; 문자열의 첫 번째 알파벳을 대문자로 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;INITCAP(&amp;lsquo;the soap&amp;rsquo;)=&amp;rsquo;The Soap&amp;rsquo;&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;b&gt;LOWER(s):&lt;/b&gt; 대상 문자열을 모두 소문자로 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;LOWER(&amp;lsquo;MR.SCOTT&amp;rsquo;)=&amp;rsquo;mr.scott&amp;rsquo;&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;b&gt;LPAD(s, n, c):&lt;/b&gt; 대상 문자열의 왼쪽부터 지정한 자리 수까지 지정한 문자로 채움.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;LPAD(&amp;lsquo;Page 1&amp;rsquo;, 10, &amp;lsquo;*&amp;rsquo;)=&amp;rsquo;****Page 1&amp;rsquo;&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;b&gt;LTRIM(s1, s2):&lt;/b&gt; 대상 문자열의 왼쪽부터 지정한 문자들을 제거.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;LTRIM(&amp;lsquo;&amp;lt;==&amp;gt;BROWNING&amp;lt;==&amp;gt;&amp;rsquo;,&amp;rsquo;&amp;lt;&amp;gt;=&amp;rsquo;)=&amp;rsquo;BROWNING&amp;lt;==&amp;gt;&amp;rsquo;&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;b&gt;REPLACE(s1, s2, s3):&lt;/b&gt; 대상 문자열의 지정한 문자를 원하는 문자로 변경.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;REPLCAE(&amp;lsquo;JACK and JUE&amp;rsquo;, &amp;lsquo;J&amp;rsquo;, &amp;lsquo;BL&amp;rsquo;)=&amp;rsquo;BLACK and BLUE&amp;rsquo;&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;b&gt;RPAD(s, n, c):&lt;/b&gt; 대상 문자열의 오른쪽부터 지정한 자리 수까지 지정한 문자로 채움.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;RPAD(&amp;lsquo;AbC&amp;rsquo;, 5, &amp;lsquo;*&amp;rsquo;)=&amp;rsquo;AbC**&amp;rsquo;&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;b&gt;RTRIM(s1, s2):&lt;/b&gt; 대상 문자열의 오른쪽부터 지정한 문자들을 제거.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;RTRIM(&amp;lsquo;&amp;lt;==&amp;gt;BROWNING&amp;lt;==&amp;gt;&amp;rsquo;, &amp;rsquo;&amp;lt;&amp;gt;=&amp;rsquo;)=&amp;rsquo;&amp;lt;==&amp;gt;BROWNINIG&amp;rsquo;&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;b&gt;SUBSTR(s, n, k):&lt;/b&gt; 대상 문자열의 지정된 자리에서부터 지정된 길이만큼 잘라서 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;SUBSTR(&amp;lsquo;ABCDEFG&amp;rsquo;, 3, 4)=&amp;rsquo;CDEF&amp;rsquo;&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;b&gt;TRIM(c FROM s):&lt;/b&gt; 대상 문자열의 양쪽에서 지정된 문자를 삭제(문자열만 넣으면 기본값으로 공백 제거).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;TRIM(&amp;lsquo;=&amp;rsquo; FROM &amp;lsquo;==&amp;gt;BROWNING&amp;lt;==&amp;rsquo;)=&amp;rsquo;&amp;gt;BROWNING&amp;lt;&amp;rsquo;&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;b&gt;UPPER(s):&lt;/b&gt; 대상 문자열을 모두 대문자로 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;UPPER(&amp;lsquo;mr.scott&amp;rsquo;)=&amp;rsquo;MR.SCOTT&amp;rsquo;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;문자 함수(숫자 값 반환 함수)&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASCII(c): 대상 알파벳 문자의 아스키 코드 값을 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;ASCII(&amp;lsquo;D&amp;rsquo;)=68&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;b&gt;INSTR(s1, s2, n, k):&lt;/b&gt; 문자열 중 n번째 문자부터 시작하여 찾고자 하는 문자열 s2가 k번째 나타나는 문자열 위치 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;INSTR(&amp;lsquo;CORPORATE FLOOR&amp;rsquo;, &amp;lsquo;OR&amp;rsquo;, 3, 2)=14&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;b&gt;LENGTH(s):&lt;/b&gt; 대상 문자열의 글자 수를 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;LENGTH(&amp;lsquo;CANDIDE&amp;rsquo;)=7&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;날짜, 시간 함수&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TO_DATE(char, datetime):&lt;/b&gt; 문자형(CHAR) 데이터를 날짜형(DATE)으로 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;TO_DATE(&amp;lsquo;2014-02-14&amp;rsquo;, &amp;lsquo;yyyy-mm-dd&amp;rsquo;)=2014-02-14&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;b&gt;TO_CHAR(date, datetime):&lt;/b&gt; 날짜형(DATE) 데이터를 문자형(VARCHAR2)로 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;TO_CHAR(TO_DATE(&amp;lsquo;2014-02-14&amp;rsquo;, &amp;lsquo;yyyy-mm-dd&amp;rsquo;), &amp;lsquo;yyyymmdd&amp;rsquo;)=&amp;rsquo;20140214&amp;rsquo;&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;b&gt;ADD_MONTHS(date, 숫자):&lt;/b&gt; date 형의 날짜에서 지정한 달만큼 더함(1: 다음달, -1: 이전달).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ADD_MONTHS(TO_DATE(&amp;lsquo;2014-02-14&amp;rsquo;, &amp;lsquo;yyyy-mm-dd&amp;rsquo;), 12)=2015-02-14&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;b&gt;LAST_DAY(date):&lt;/b&gt; date 형의 날짜에서 달의 마지막 날을 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;LAST_DAY(TO_DATE(&amp;lsquo;2014-02-14&amp;rsquo;, &amp;lsquo;yyyy-mm-dd&amp;rsquo;))=2014-02-28&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;b&gt;SYSDATE:&lt;/b&gt; DBMS 시스템상의 오늘 날짜를 반환하는 인자 없는 함수.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;SYSDATE=14/04/20&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 부속질의&lt;/h4&gt;
&lt;p&gt;하나의 SQL 문 안에 다른 SQL 문이 중첩된(nested) 형태로 표현되는 질의를 말한다. 다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공하는 데 사용한다.&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; SELECT 절에서 사용되는 부속질의로 단일 행, 단일 열의 스칼라 값을 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인라인 뷰:&lt;/b&gt; FROM 절에서 사용되는 부속질의로 결과를 뷰(view) 형태로 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중첩질의:&lt;/b&gt; WHERE 절에서 사용되는 부속질의로 주질의에 사용된 자료 집합의 조건을 서술한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 뷰&lt;/h4&gt;
&lt;p&gt;하나 이상의 테이블을 합하여 사용하기 편리하게 만든 가상의 테이블이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;편리성:&lt;/b&gt; 사용자가 필요한 정보만 요구에 맞게 가공하여 뷰로 만들어 쓸 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재사용성:&lt;/b&gt; 자주 사용되는 질의를 뷰로 미리 정의해 놓을 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안성:&lt;/b&gt; 각 사용자별로 필요한 데이터만 선별하여 보여줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE VIEW 뷰이름 [(열이름 [ ,&amp;hellip; n ])]
AS SELECT 문
CREATE OR REPLACE VIEW 뷰이름 [(열이름 [ ,&amp;hellip; n ])]
AS SELECT 문
DROP VIEW 뷰이름 [ ,&amp;hellip; n ];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. DBMS와 데이터 파일&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cIG9XD/btqJWSk9wEd/ZkvVjelkYa3rlPapF6NLak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIG9XD/btqJWSk9wEd/ZkvVjelkYa3rlPapF6NLak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIG9XD/btqJWSk9wEd/ZkvVjelkYa3rlPapF6NLak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIG9XD%2FbtqJWSk9wEd%2FZkvVjelkYa3rlPapF6NLak%2Fimg.png&quot; width=&quot;100%&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;h4 data-ke-size=&quot;size20&quot;&gt;5. 인덱스&lt;/h4&gt;
&lt;p&gt;도서의 색인이나 사전과 같이 데이터를 쉽고 빠르게 찾을 수 있도록 만든 데이터 구조다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. B-tree&lt;/h4&gt;
&lt;p&gt;루트 노드(root node), 내부 노드(internal node), 리프 노드(leaf node)로 구성된 트리 자료구조로, 리프 노드가 모두 같은 레벨에 존재하는 균형(balanced) 트리다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 오라클 인덱스의 종류&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;B-tree 인덱스:&lt;/b&gt; B-tree 구조를 이용한 인덱스로 트리의 리프 노드에 실제 데이터 값 대신 해당되는 행의 위치 값인 rowid를 가지고 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IOT(Index-Organized Table):&lt;/b&gt; 연석된 키 값의 레코드를 묶어서 같은 블록에 저장하는 방법으로, 인덱스 구조의 리프 노드에 rowed 대신 테이블의 투플 자체가 저장된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bitmap:&lt;/b&gt; 컬럼 값들의 유무를 이진의 비트값으로 나열한 인덱스다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FBI(Function-Based Index):&lt;/b&gt; 함수를 사용하여 특정 컬럼을 가공하여 만든 인덱스다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE [REVERSE] [UNIQUE] INDEX 인덱스이름
[ON 테이블이름 (컬럼 [ASC | DESC] [{, 컬럼 [ASC | DESC]} &amp;hellip;])];
ALTER [REVERSE] [UNIQUE] INDEX 인덱스 이름
[ON {ONLY} 테이블이름 (컬럼이름 [{, 컬럼이름 } &amp;hellip;])] REBUILD];
DROP INDEX 인덱스이름;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5장. 데이터베이스 프로그래밍&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 데이터베이스 프로그래밍&lt;/h4&gt;
&lt;p&gt;DBMS에 데이터를 정의하고 시스템에 저장된 데이터를 읽어와 데이터를 변경하는 프로그램을 작성하는 과정을 말한다. 일반 프로그래밍과는 데이터베이스 언어인 SQL을 포함한다는 점이 다르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 삽입 프로그래밍&lt;/h4&gt;
&lt;p&gt;데이터베이스 프로그래밍 방법 중 하나로 SQL을 자바, C와 같은 범용 프로그래밍 언어에 삽입하여 프로그래밍하는 것을 말한다. SQL 문이 삽입된 자바, C와 같은 프로그래밍 언어를 호스트 언어라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. PL/SQL(Procedural Language/Structured Query Language)&lt;/h4&gt;
&lt;p&gt;SQL 언어를 확장하여 데이터베이스 전용 응용 프로그램을 작성할 때 사용하는 오라클사의 SQL 전용 언어다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 저장 프로시저&lt;/h4&gt;
&lt;p&gt;PL/SQL에서 사용하는 기능으로, 일반 프로그래밍 언어의 함수 대신 사용하는 명칭이다. 프로시저를 정의하여 DBMS에 저장한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 커서&lt;/h4&gt;
&lt;p&gt;실행 결과 테이블을 한 번에 한 행씩 처리하기 위하여 테이블의 행을 순서대로 가리키는 데 사용하는 포인터를 말한다. 커서와 관련된 키워드로는 CURSOR, OPEN, FETCH, CLOSE 등이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 트리거&lt;/h4&gt;
&lt;p&gt;데이터의 변경(삽입, 삭제, 수정)문이 실행될 때 자동으로 실행되는 프로시저다. 보통 데이터 변경문이 처리되는 세 가지 시점. 즉 실행 전(BEFORE), 대신하여(INSTEAD OF), 실행 후(AFTER)에 동작한다. 오라클은 기본적으로 BEFORE와 AFTER 트리거를 지원한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 연동&lt;/h4&gt;
&lt;p&gt;어느 한 부분이 움직이면 다른 부분도 같이 움직인다는 의미로, 데이터베이스 응용에서는 일반 프로그램을 수행하여 DBMS를 동작시킨다는 의미이다. 연동은 자바 프로그램 혹은 웹 프로그램을 이용.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. JDBC(Java DataBase Connectivity)&lt;/h4&gt;
&lt;p&gt;자바는 객체지향 언어이기 때문에 객체를 호출하여 데이터베이스에 접속한다. 데이터베이스에 접속하는 API(Application Programming Interface)를 java.sql.*에서 제공한다. java.sql에 정의된 API는 각 DBMS 제조사에게 자신의 제품에 맞게 구현해서 제공하는데, 이를 JDBC(Java DataBase Connectivity) 드라이버라고 한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 설계자&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6장. 데이터 모델링&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 데이터베이스 생명주기&lt;/h4&gt;
&lt;p&gt;데이터베이스 생성과 운영에 관련된 &lt;b&gt;&amp;lsquo;요구사항 수집 및 분석 &amp;ndash; 설계 &amp;ndash; 구현 &amp;ndash; 운영 &amp;ndash; 감시 및 개선&amp;rsquo;&lt;/b&gt; 사이클을 말한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/b45d70/btqJ6b4lnta/atZZ56FKXmRhvCAIK0DwvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b45d70/btqJ6b4lnta/atZZ56FKXmRhvCAIK0DwvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b45d70/btqJ6b4lnta/atZZ56FKXmRhvCAIK0DwvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb45d70%2FbtqJ6b4lnta%2FatZZ56FKXmRhvCAIK0DwvK%2Fimg.png&quot; width=&quot;100%&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 개념적 모델링&lt;/h4&gt;
&lt;p&gt;개체(entity)를 추출하고 각 개체 간의 관계(relationship)를 정의하여 ER 다이어그램을 만드는 과정이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 논리적 모델링&lt;/h4&gt;
&lt;p&gt;개념적 모델링 단계에서 만들어진 ER 다이어그램을 사용하고자 하는 DBMS에 맞게 매핑하여 실제 데이터베이스로 구현하기 위한 모델을 만드는 과정이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 물리적 모델링&lt;/h4&gt;
&lt;p&gt;작성된 논리적 모델을 실제 컴퓨터의 저장 장치에 저장하기 위한 물리적 구조를 정의하여 구현하는 과정이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. ER 모델&lt;/h4&gt;
&lt;p&gt;데이터 모델링 과정 중 개념적 모델링 단계에 사용하는 모델로 1976년 피터 첸(Peter Chen)이 제안하였다. ER 모델의 핵심 개념은 세상의 사물을 개체(entity)와 개체 간의 관계(relationship)로 표현하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 개체와 개체 타입&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 개체 타입의 종류&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 속성&lt;/h4&gt;
&lt;p&gt;개체가 가진 성질을 의미한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 속성의 종류&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순 속성과 복합 속성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단순 속성:&lt;/b&gt; 더 이상 분해가 불가능한 속성이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복합 속성:&lt;/b&gt; 독립적인 의미를 가진 속성으로 분해할 수 있는 속성이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단일값 속성과 다중값 속성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단일값 속성:&lt;/b&gt; 특정 개체 타입에 대해 하나의 값만 가지는 속성이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다중값 속성:&lt;/b&gt; 여러 개의 값을 가질 수 있는 속성이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;저장 속성과 유도 속성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;저장 속성:&lt;/b&gt; 다른 속성의 영향 없이 단독으로 저장되는 속성이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유도 속성:&lt;/b&gt; 다른 저장 속성으로부터 유도된(계산되어진) 속성이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 관계와 관계 타입&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11. 대응 수&lt;/h4&gt;
&lt;p&gt;두 개체 타입의 관계에 실제로 참여하는 개별 개체들의 수를 말한다. 대응수는 하나의 개체가 하나의 개체에 대응하는 1:1 관계, 하나의 개체가 여러 개체에 대응하는 1:N 관계, 여러 개체가 하나의 개체에 대응하는 N:1 관계, 여러 개체가 여러 개쳬에 대응하는 N:M 관계로 나눌 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12. ISA(수퍼클래스와 서브클래스) 관계&lt;/h4&gt;
&lt;p&gt;상위 개체의 특성에 따라 하위 개체 타입이 결정되는 형태를 말한다. 이때 상위 개체 타입을 수퍼클래스, 하위 개체 타입을 서브클래스라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;13. 전체 참여와 부분 참여&lt;/h4&gt;
&lt;p&gt;관계에 참여하는 개체 집합의 참여 형태에 따른 제약 조건으로, 개체 집합의 모든 개체들이 관계에 참여하는 조건을 전체 참여라고 한다. 전체 참여는 개체 타입과 관계 사이를 두 줄 실선으로 표시한다. 일부만 참여하는 부분 참여의 경우는 일반적인 관계의 표현과 동일하게 단일 실선으로 표시한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;14. 순환적 관계&lt;/h4&gt;
&lt;p&gt;하나의 개체 타입이 동일한 개체와 순환적인 관계를 가지는 형태다. 순환적 관계는 관계선을 양쪽 모두에 그린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;15. 식별자&lt;/h4&gt;
&lt;p&gt;약한 개체 타입에서 개별 개체들을 구분할 수 있는 속성을 말한다. 식별자는 강한 개체 타입의 키와 달리 약한 개체 타입을 구분하는 역할을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;16. IE 표기법(Information Engineering Notation)&lt;/h4&gt;
&lt;p&gt;ER 다이어그램을 그리는 대표 프로그램인 ERWin에서 사용하는 표기법 중 하다. IE 표기법은 관계 대응 수의 표현에 새발 같은 모양의 기호를 사용하여 새발 표기법(crow-feet)이라고도 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;17. 사상(mapping, 매핑)&lt;/h4&gt;
&lt;p&gt;ER 모델이 완성되면 실제 데이터베이스를 구축하기 위해 논리적 모델링을 수행하여야 한다. 이때 ER 모델과 사용할 데이터베이스 모델 간의 매핑을 말한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7장. 정규화&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 이상현상&lt;/h4&gt;
&lt;p&gt;잘못 설계된 테이블로 삽입, 삭제, 수정 같은 작업을 했을 때 생기는 현상으로 데이터베이스의 일관성을 훼손하여 데이터의 무결성을 깨뜨린다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;삭제이상:&lt;/b&gt; 투플 삭제 시 하나의 정보를 삭제함으로써 같이 저장된 다른 정보가 연쇄적으로 삭제되는 현상이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;삽입이상:&lt;/b&gt; 투플 삽입 시 제공되지 못하는 속성 값을 NULL 값으로 입력해야 하는 현상이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수정이상:&lt;/b&gt; 투플 수정 시 중복된 데이터의 일부만 수정되어 데이터의 불일치가 일어나는 현상이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 함수 종속성&lt;/h4&gt;
&lt;p&gt;릴레이션 R과 R에 속하는 속성의 집합 X, Y가 있을 때, X 각각의 값이 Y의 값 한 개와 대응될 때 &amp;lsquo;X는 Y를 함수적으로 결정한다&amp;rsquo;라고 하고 X &amp;rarr; Y로 표기한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 정규화&lt;/h4&gt;
&lt;p&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;제 1정규형(1NF):&lt;/b&gt; 어떤 릴레이션 R의 모든 속성 값이 원자값을 가지면 제 1정규형을 만족한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제 2 정규형(2NF):&lt;/b&gt; 어떤 릴레이션 R이 제 1정규형이고 기본키가 아닌 속성이 기본키에 완전 함수 종속일 때 제 2정규형이라고 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;완전 함수 종속(full functional dependency):&lt;/b&gt; A와 B가 릴레이션 R의 속성이고 A &amp;rarr; B 종속성이 성립할 때, B가 A의 속성 전체에 함수 종속하고 부분 집합 속성에 함수 종속하지 않을 경우 완전 함수 종속이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제 3정규형(3NF):&lt;/b&gt; 어떤 릴레이션 R이 제 2정규형이고 기본키가 아닌 속성이 기본키에 비이행적(non-transitive)으로 종속할 때(직접 종속) 제 3정규형이라고 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BCNF(Boyce Codd Normal Form):&lt;/b&gt; 함수 종속성 X &amp;rarr; Y가 성립할 때 모든 결정자 X가 후보키면 BCNF이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 무손실 분해&lt;/h4&gt;
&lt;p&gt;릴레이션 R을 릴레이션 R1과 R2로 분해했을 때, R1 ⋈ R2 = R이면 무손실(lossless-join) 분해라고 한다. 무손실 분해를 위한 조건은 R1 &amp;cap; R2 &amp;rarr; R1 이거나 R1 &amp;cap; R2 &amp;rarr; R2 중 하나를 만족하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8장. 트랜잭션, 동시성 제어, 회복&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 트랜잭션의 상태도&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/u5wEI/btqJXWHEC4Z/w6C7akBk0Pd5TNnDtUAEKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u5wEI/btqJXWHEC4Z/w6C7akBk0Pd5TNnDtUAEKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u5wEI/btqJXWHEC4Z/w6C7akBk0Pd5TNnDtUAEKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu5wEI%2FbtqJXWHEC4Z%2Fw6C7akBk0Pd5TNnDtUAEKK%2Fimg.png&quot; width=&quot;100%&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 트랜잭션의 성질&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; 트랜잭션과 관련된 작업들이 전부 수행되던지 아니면 전부 수행되지 않아야(all or nothing) 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일관성:&lt;/b&gt; 트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관성 있는 상태를 유지해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고립성:&lt;/b&gt; 트랜잭션 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속성:&lt;/b&gt; 성공적으로 수행을 완료한 트랜잭션은 변경한 데이터를 데이터베이스에 영구히 저장해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 동시성 제어&lt;/h4&gt;
&lt;p&gt;트랜잭션이 동시에 실행될 때 데이터베이스의 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 DBMS의 기능이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 갱신손실&lt;/h4&gt;
&lt;p&gt;동시성 제어를 하지 않는 트랜잭션들이 발생시키는 문제로, 한 트랜잭션의 갱신이 다른 트랜잭션에 의하여 분실되는 현상이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 락&lt;/h4&gt;
&lt;p&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;공유락(LS, shared lock):&lt;/b&gt; 읽기를 할 때 사용하는 잠금 장치다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배타락(LX, exclusive lock):&lt;/b&gt; 쓰기를 할 때 사용하는 잠금 장치다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 2단계 락킹&lt;/h4&gt;
&lt;p&gt;트랜잭션이 락을 걸고 해제하는 시점을 2단계로 나누어 시행하는 락킹 기법이다. 확장단계와 수축단계가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 데드락&lt;/h4&gt;
&lt;p&gt;두 개 이상의 트랜잭션이 각각 자신의 데이터에 대하여 락을 획득하고 상대방 데이터에 대하여 락을 요청하여 무한 대기 상태에 빠지는 현상을 말한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 트랜잭션 동시 실행 문제&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; 다른 트랜잭션이 COMMIT하지 않는 데이터를 읽은 후 다른 트랜잭션이 철회(ROLLBACK)하면서 발생하는 현상이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반복불가능 읽기:&lt;/b&gt; 트랜잭션 중간에 다른 트랜잭션이 변경한 데이터를 읽으면서 발생하는 현상이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유령데이터 읽기:&lt;/b&gt; 트랜잭션 중간에 다른 트랜잭션이 삽입한 데이터를 읽으면서 발생하는 현상이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 트랜잭션 고립 수준 명령어&lt;/h4&gt;
&lt;p&gt;트랜잭션의 읽기/쓰기에 대한 고립 수준을 결정하는 명령이다. READ UNCOMMITTED, READ COMMITTED REPEATABLE READ, SERIALIZABLE이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 로그 파일을 이용한 회복&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;재실행(REDO):&lt;/b&gt; 로그 파일에 기록된 로그를 이용하여 트랜잭션이 수행한 결과를 다시 반영하는 연산이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;취소(UNDO):&lt;/b&gt; 로그 파일에 기록된 로그를 이용하여 트랜잭션이 수행한 결과를 취소하는 연산이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11. 회복을 위한 로그 기록 방법&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; 트랜잭션은 &amp;lsquo;갱신 데이터 &amp;rarr; 로그&amp;rsquo;, &amp;lsquo;버퍼 &amp;rarr; 데이터베이스&amp;rsquo; 작업이 부분완료 전에 동시에 진행될 수 있으며 REDO, UNDO 연산을 이용하여 복구한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지연 갱신:&lt;/b&gt; 트랜잭션은 &amp;lsquo;갱신 데이터 &amp;rarr; 로그&amp;rsquo;가 끝난 후 부분완료를 하고 &amp;lsquo;버퍼 &amp;rarr; 데이터베이스&amp;rsquo; 작업은 부분완료 후에 진행한다. REDO 연산을 이용하여 복구한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12. 체크포인트&lt;/h4&gt;
&lt;p&gt;데이터베이스와 트랜잭션 로그 파일을 동기화한 후, 동기화한 시점을 로그 파일에 기록해두는데 이를 체크포인트라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9장. 데이터베이스 보안과 관리&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 테이블스페이스 생성하기&lt;/h4&gt;
&lt;p&gt;테이블스페이스(TABLESPACE)는 오라클에서 데이터를 저장할 때 사용하는 논리적인 저장공간을 의미한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;시스템 테이블스페이스:&lt;/b&gt; 데이터베이스 생성 시 자동 생성.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 테이블스페이스:&lt;/b&gt; 사용자가 필요에 따라 만들어 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLESPACE 테이블스페이스이름
    DATAFILE &amp;lsquo;저장될 경로 및 사용할 파일명&amp;rsquo;
    SIZE 저장공간

DROP TABLESPACE 테이블스페이스이름
    [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 신규 사용자 계정 생성하기&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;CREATE USER 사용자이름
    IDENTIFIED BY 비밀번호
    DEFAULT TABLESPACE 테이블스페이스
ALTER USER 사용자이름
    IDENTIFIED BY 비밀번호
DROP USER 사용자이름 CASCADE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 권한 관리&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;GRANT 문:&lt;/b&gt; 객체를 생성한 소유자가 대상 객체에 대한 권한을 다른 사용자에게 허가하는 명령이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REVOKE 문:&lt;/b&gt; GRANT 문으로 허가한 권한을 취소, 회수하는 명령이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;주요 객체별 지정 가능한 권한(객체 권한)&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ALTER:&lt;/b&gt; 테이블&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DELETE:&lt;/b&gt; 테이블, 뷰&lt;/li&gt;
&lt;li&gt;&lt;b&gt;EXECUTE:&lt;/b&gt; 프로시저/함수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;INDEX:&lt;/b&gt; 테이블&lt;/li&gt;
&lt;li&gt;&lt;b&gt;INSERT:&lt;/b&gt; 테이블, 뷰&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REFERENCES:&lt;/b&gt; 테이블, 뷰&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SELECT:&lt;/b&gt; 테이블, 뷰&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UPDATE:&lt;/b&gt; 테이블, 뷰&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5 data-ke-size=&quot;size18&quot;&gt;주요 시스템 권한&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CREATE TABLE:&lt;/b&gt; 테이블을 생성할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE VIEW:&lt;/b&gt; 뷰를 생성할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE USER:&lt;/b&gt; 새로운 사용자를 생성할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE TABLESPACE:&lt;/b&gt; 테이블스페이스를 생성할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE SESSION:&lt;/b&gt; 데이터베이스에 접속할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DELETE ANY TABLE:&lt;/b&gt; 다른 사용자 테이블의 투플을 삭제(DELETE)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ALTER ANY TABLE:&lt;/b&gt; 다른 사용자의 테이블을 수정(ALTER)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DROP ANY TABLE:&lt;/b&gt; 다른 사용자의 테이블을 삭제(DROP)할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE ANY TABLE:&lt;/b&gt; 다른 사용자의 테이블을 생성(CREATE)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SELECT ANY TABLE:&lt;/b&gt; 다른 사용자의 테이블을 조회(SELECT)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE ANY VIEW:&lt;/b&gt; 다른 사용자의 뷰를 생성(CREATE)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ALTER ANY VIEW:&lt;/b&gt; 다른 사용자의 뷰를 수정(ALTER)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DROP ANY INDEX:&lt;/b&gt; 다른 사용자의 테이블의 인덱스를 삭제(DROP)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CREATE ANY INDEX:&lt;/b&gt; 다른 사용자 테이블의 인덱스를 생성(CREATE)할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ALTER ANY INDEX:&lt;/b&gt; 다른 사용자 테이블의 인덱스를 수정(ALTER)할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;GRANT 권한 [(컬럼[ , &amp;hellip; n ])] [ , &amp;hellip; n ]
    [ON 객체] TO { 사용자 | 롤 | PUBLIC [ , &amp;hellip; n ]}
    [WITH GRANT OPTION]
REVOKE 권한 [(컬럼[ , &amp;hellip; n ])] [ , &amp;hellip; n ]
    [ON 객체] FROM { 사용자 | 롤 | PUBLIC [ , &amp;hellip; n]}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. WITH GRANT OPTION&lt;/h4&gt;
&lt;p&gt;허가 받은 권한을 다른 사용자에게 다시 부여할 때 사용하는 옵션이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 역할(ROLE, 롤)&lt;/h4&gt;
&lt;p&gt;데이터베이스 객체(OBJECT)에 대한 권한을 모아둔 집합이다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE ROLE 역할 이름
DROP ROLE 역할 이름
GRANT 권한 [ON 객체] TO 역할이름
REVOKE 권한 [ON 객체] FROM 역할이름
GRANT 역할이름 TO 사용자&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 백업&lt;/h4&gt;
&lt;p&gt;예상하지 못한 장애에 대비하여 데이터베이스를 복제하여 보관하는 작업이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 복원&lt;/h4&gt;
&lt;p&gt;장애가 발생하여 운영 중인 데이터가 손상을 입었을 때 기존에 복사해 둔 백업 파일을 사용하여 복구하는 작업이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 백업의 종류&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;li&gt;&lt;b&gt;증분 백업:&lt;/b&gt; 데이터베이스에서 수행한 작업을 기록하고 있는 로그 파일을 이용하여 백업한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT</category>
      <category>DB</category>
      <category>Oracle</category>
      <category>개론</category>
      <category>데이터베이스</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/72</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%A0%95%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%A1%A0%EA%B3%BC-%EC%8B%A4%EC%8A%B5#entry72comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:58:02 +0900</pubDate>
    </item>
    <item>
      <title>[워드프레스] crayon syntax highlighter에 bitstream vera sans mono 폰트</title>
      <link>https://nyebo.tistory.com/entry/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-crayon-syntax-highlighter%EC%97%90-bitstream-vera-sans-mono-%ED%8F%B0%ED%8A%B8</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 10월 12일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;crayon syntax highlighter 플러그인은 다양한 폰트를 지원한다.&lt;/p&gt;
&lt;p&gt;그럼에도 원하는 폰트가 없을 경우에는 직접 추가하여 사용하면 된다.&lt;/p&gt;
&lt;p&gt;여기서는 &lt;b&gt;bitstream vera sans mono&lt;/b&gt; 폰트를 추가한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;준비물&lt;/h2&gt;
&lt;p&gt;wp-content/plugins/crayon-syntax-highlighter/fonts/ 디렉터리의 여러 폰트중 ubuntu-mono 폰트를 예로 들면 다음과 같이 구성되어 있다.&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;ubuntu-mono.css&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ubuntu-mono/ubuntu-mono-webfont.eot&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ubuntu-mono/ubuntu-mono-webfont.woff&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ubuntu-mono/ubuntu-mono-webfont.ttf&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ubuntu-mono/ubuntu-mono-webfont.svg&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;font-face를 구성하는 &lt;b&gt;css&lt;/b&gt;와 &lt;b&gt;ttf, eot, woff, svg&lt;/b&gt;가 필요하다.&lt;/p&gt;
&lt;p&gt;위와 동일하게 미리 제작한 bitstream vera sans mono 파일은 아래 링크에서 받을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bCNp8O/btqJWR7CR34/UHDEHPgzjcb2k0Pe9u8ZG1/bitstream-vera-sans-mono-webfont.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;bitstream-vera-sans-mono-webfont.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.13MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&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;/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;bitstream-vera-sans-mono.css&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.eot&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.woff&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.ttf&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.svg&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 다른 폰트를 사용하고 싶다면, 해당 폰트의 ttf, eot, woff, svg 파일를 준비한뒤, css만 수정하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;bitstream-vera-sans-mono.css&lt;/b&gt;의 내용은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@font-face {
font-family: 'BitstreamVeraSansMono';
src: url('bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.eot');
src: url('bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.eot?#iefix') format
('embedded-opentype'),
url('bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.woff') format('woff'),
url('bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.ttf') format('truetype'),
url('bitstream-vera-sans-mono/bitstream-vera-sans-mono-webfont.svg#BitstreamVeraSansMono
') format('svg');
font-weight: normal;
font-style: normal;
}
.crayon-font-bitstream-vera-sans-mono * {
font-family: Bitstream Vera Sans Mono, 'BitstreamVeraSansMono', Georgia !important;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 방법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;bitstream-vera-sans-mono-webfont.zip를 풀면 css 파일과 디렉터리가 생성된다.&lt;/li&gt;
&lt;li&gt;위 파일을 FTP를 사용하여 /wp-content/plugins/crayon-syntax-highlighter/fonts/에 업로드한다.&lt;/li&gt;
&lt;li&gt;소유자와 그룹을 기존 소유자와 그룹과 동일하게 변경한다. 여기서는 www-data:www-data코드로 변경.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sudo chown -R www-data.wwwdata bitstream-vera-sans-mono*&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 Bitstream Vera Sans Mono 폰트가 적용된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bhCUiN/btqJ6cIVmX3/AgNNkZi1qysK7wJKlCGSV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhCUiN/btqJ6cIVmX3/AgNNkZi1qysK7wJKlCGSV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhCUiN/btqJ6cIVmX3/AgNNkZi1qysK7wJKlCGSV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhCUiN%2FbtqJ6cIVmX3%2FAgNNkZi1qysK7wJKlCGSV1%2Fimg.png&quot; width=&quot;100%&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;</description>
      <category>IT</category>
      <category>워드프레스</category>
      <category>폰트</category>
      <category>플러그인</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/71</guid>
      <comments>https://nyebo.tistory.com/entry/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-crayon-syntax-highlighter%EC%97%90-bitstream-vera-sans-mono-%ED%8F%B0%ED%8A%B8#entry71comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:49:45 +0900</pubDate>
    </item>
    <item>
      <title>OPatch Users's Guide</title>
      <link>https://nyebo.tistory.com/entry/OPatch-Userss-Guide</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 2월 28일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이 문서는 &lt;a href=&quot;https://docs.oracle.com/cd/E24628_01/doc.121/e39376/glossary.htm#OPTCH248&quot;&gt;OPatch User's Guide(E39376-07)&lt;/a&gt;를 번역한 것입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;용어 사전(Glossary)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Patch&lt;/h3&gt;
&lt;p&gt;패치는 기존의 코드나 소프트웨어 문제를 수정하기 위한 한 개의 코드 또는 소프트웨어입니다. 패치에는 보안상의 취약점이나 기타 오류 수정 사항이 포함되어 있어, 유용성과 성능을 개선합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bundle Patch&lt;/h3&gt;
&lt;p&gt;Bundle Patch는 특정 제품 또는 컴포넌트를 대상으로 하는 누적된 패치들의 모음집입니다. 이 패치는 제품의 요구조건에 따라 필요한 경우에 발표됩니다. maintenance pack, service pack, MLRs, cumulative patch 또는 update release로서 Bundle Patch를 이해할 필요가 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Diagnostic Patch&lt;/h3&gt;
&lt;p&gt;Diagnostic Patch는 오류를 수정하거나 오류 수정 사항들의 모음을 진단 또는 검증하기 위해 고안되었습니다. test patch, Fix Verification Binary(FVB) 또는 e-fix로서 Diagnostic Patch를 이해할 필요가 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interim Patch(=One-off Patch)&lt;/h3&gt;
&lt;p&gt;Interim Patch는 일회성 오류 수정, 오류 수정 사항들의 모음 또는 특정 고객의 보안 패치를 제공합니다. 일반적으로 이 패치는 특정 고객의 특정 오류에 대응하므로, Oracle Support의 지시가 없은 한 적용할 필요가 없습니다. security one-off, exception release, x-fix, PSE, MLR 또는 hotfix로서 Interim Patch를 이해할 필요가 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Patch Set&lt;/h3&gt;
&lt;p&gt;각 릴리즈 간에 Oracle이 오류의 수정 사항을 제공하는 주된 방법. Oracle에서는 여러개의 패치를 묶어서, 동시에 철저히 테스트하며 패키지화하여 쉽게 다운로드 받아 설치할 수 있도록 하고 있습니다. 일반적으로 이 패치는 새로운 기능은 포함되어 있지 않으며, 추가 인증도 필요하지 않습니다. Patch Set 내의 오류 수정 사항들은 모두 테스트하였으며, 서로 연계되어 작동합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Patch Set Update(PSU)&lt;/h3&gt;
&lt;p&gt;특정 제품 버전(기본 릴리스 또는 Patch Set)에 대해 안정적이고, 사전 예방을 위한 누적 패치 모음을 말합니다. PSU는 누적되며 SPU(이전에는 CPU라고 불렸습니다.) 패치의 모든 보안 수정 사항 및 추가 수정 사항이 포함되어 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Patch Update(SPU)&lt;/h3&gt;
&lt;p&gt;Security Patch Update(SPU)는 보안 관련 오류 수정들의 누적 모음집입니다. 보통 SPU는 정기적으로 발표됩니다. SPU는 예전에는 Critical Patch Update 또는 CPU라고 불렸습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Critical Patch Update(CPU)&lt;/h3&gt;
&lt;p&gt;Critical Patch Updates(CPUs)는 Oracle 제품의 보안 수정 사항을 발표하는 주된 방법입니다. CPU는 이전의 CPU에 대해 누적되어 일반적으로 보안에 대한 수정 사항만 포함되어 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Singleton&lt;/h3&gt;
&lt;p&gt;한 개의 오류를 수정하는 패치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MLR&lt;/h3&gt;
&lt;p&gt;Merge Label Request. 여러 오류를 수정하는 패치 묶음&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Patch Conflict&lt;/h3&gt;
&lt;p&gt;만약 패치가 다른 패치로 이미 변경된 사항에 대해 다시 변경을 시도할 경우, 이들 두 개의 패치는 충돌이 발생하며, 이 중 하나의 패치만 설치됩니다(merge patch 또는 overlay patch를 사용할 수 없는 경우).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Superset Patch&lt;/h3&gt;
&lt;p&gt;만약 적용할 특정 패치가 이미 설치된 패치의 모든 수정 사항 및 추가 수정 사항을 포함하고 있지만, 그 밖에 더 많은 수정 사항들을 포함하고 있다면, 이는 Superset Patch로서 패치 간 충돌이 발생하지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Combination Conflict&lt;/h3&gt;
&lt;p&gt;만약 설치되는 패치가 이미 설치되어 있는 하나 이상의 패치와 충돌한 경우, 이는 Combination Conflict로 간주됩니다. 이 경우 OPatch는 충돌이 발생한 패치를 모두 삭제하고 최신의 패치를 적용합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Merge Patch&lt;/h3&gt;
&lt;p&gt;Merge Patch는 충돌하는 여러개의 패치가 한 개의 패치로 통합된 패치입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overlay Patch&lt;/h3&gt;
&lt;p&gt;개별 패치가 PSU와 충돌할 경우, PSU 패치와 공존하는(PSU 패치를 필요로 하는) 최신 패치를 제공함으로써 패치의 충돌을 해결합니다. 최신 패치는 PSU를 덮어쓰기 때문에, Overlay Patch의 전제 조건은 PSU입니다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>Opatch</category>
      <category>Oracle</category>
      <category>용어</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/70</guid>
      <comments>https://nyebo.tistory.com/entry/OPatch-Userss-Guide#entry70comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:39:16 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 11gR2 Silent Install on RHEL5</title>
      <link>https://nyebo.tistory.com/entry/Oracle-11gR2-Silent-Install-on-RHEL5</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 2월 23일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Setup&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치에 필요한 파일&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle 11gR2 (11.2.0.1) 설치 파일 (/app)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;linux_11gR2_database_1of2.zip&lt;/li&gt;
&lt;li&gt;linux_11gR2_database_2of2.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그룹, 사용자 생성&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;groupadd oinstall
groupadd dba
groupadd oper
useradd -g oinstall -G dba,oper oracle
passwd oracle&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SELINUX 확인&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;vi /etc/selinux/config

SELINUX=permissive # 또는 disable로 수정&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Oracle 11gR2 압축 해제&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;mkdir -p /app/oracle
cd /app
unzip linux_11gR2_database_1of2.zip &amp;amp;&amp;amp; unzip linux_11gR2_database_2of2.zip
chown -R oracle.oinstall /app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필수 패키지 권장사항 확인&lt;/h3&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})\n' binutils \
compat-libstdc++ \
elfutils-libelf \
elfutils-libelf-devel \
elfutils-libelf-devel-static \
gcc \
gcc-c++ \
glibc \
glibc-common \
glibc-devel \
glibc-headers \
ksh \
kernel-headers \
libgomp \
libaio \
libaio-devel \
libgcc \
libstdc++ \
libstdc++-devel \
make \
numactl-devel \
sysstat \
unixODBC \
unixODBC-devel&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;binutils-2.17.50.0.6-26.el5(i386)
package compat-libstdc++ is not installed
elfutils-libelf-0.137-3.el5(i386)
elfutils-libelf-devel-0.137-3.el5(i386)
elfutils-libelf-devel-static-0.137-3.el5(i386)
gcc-4.1.2-55.el5(i386)
gcc-c++-4.1.2-55.el5(i386)
glibc-2.5-123(i686)
glibc-common-2.5-123(i386)
glibc-devel-2.5-123(i386)
glibc-headers-2.5-123(i386)
ksh-20100621-20.el5(i386)
kernel-headers-2.6.18-398.el5(i386)
libgomp-4.4.7-1.el5(i386)
libaio-0.3.106-5(i386)
package libaio-devel is not installed
libgcc-4.1.2-55.el5(i386)
libstdc++-4.1.2-55.el5(i386)
libstdc++-devel-4.1.2-55.el5(i386)
make-3.81-3.el5(i386)
package numactl-devel is not installed
package sysstat is not installed
package unixODBC is not installed
package unixODBC-devel is not installed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;확인 결과 &lt;b&gt;compat-libstdc++, libaio-devel, numactl-devel, sysstat, unixODBC, unixODBC-devel&lt;/b&gt; 패키지가 설치되어 있지 않다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;cd /media/RHEL_5.11\ i386\ DVD/Server/

rpm -Uvh compat-libstdc++-*.rpm;rpm -Uvh libaio-devel-*.rpm;rpm -Uvh numactl-devel-*.rpm;rpm -Uvh sysstat-*.rpm;rpm -Uvh unixODBC-*.rpm --nodeps&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Kernel Parameters 설정&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 해당 값이 없을 경우에는 생략.

vi /etc/profile

ulimit -S -c 0 &amp;gt; /dev/null 2 &amp;gt; &amp;amp;1

# 0을 unlimited로 변경

ulimit -S -c unlimited &amp;gt; /dev/null 2 &amp;gt; &amp;amp;1&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;vi /etc/sysctl.conf

# 아래 내용 추가
# 기본 값이지만, 시스템 상황에 따라 다른 설정 필요.
kernel.core_uses_pid = 1
fs.suid_dumpable = 1
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;변경 값 확인.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sysctl -p&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;vi /etc/security/limits.conf

# 아래 내용 추가
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 4096
oracle hard nofile 65536
oracle soft stack 10240&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;vi /etc/pam.d/login

# 아래 내용 추가
session    required     pam_limits.so&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.bash_profile 파일 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle11gR2부터는 Oracle Engine과 Oracle Database를 같은 장소에 설치하는 것을 권장하지 않는다.&lt;/li&gt;
&lt;li&gt;Oracle11gR2부터는 Oracle 홈 디렉터리를 사용자 계정의 홈 디렉터리로 지정하는 것을 권장하지 않는다. 따라서 기존의 /home/oracle에 설치하는 것이 아닌 /app/oracle에 설치.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;vi /home/oracle/.bash_profile

# 아래 내용 추가
export EDITOR=vi
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0
export ORACLE_SID=testdb
export LANG=C
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export PATH=$PATH:$ORACLE_HOME/bin
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# 변경 사항 적용
source /home/oracle/.bash_profile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/hosts 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;127.0.0.1 localhost.localdomain localhost
192.168.0.60 rhel5.localdomain rhel5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Oracle 11gR2 (11.2.0.1) Installation&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;orainst.loc 파일 생성&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;vi /etc/oraInst.loc

# 아래 내용 추가
inventory_loc=/app/oraInventory
inst_group=oinstall&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 권한 변경
chown -R oracle.oinstall /app
chown oracle.oinstall /etc/oraInst.loc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;response 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;vi /app/database/response/db_install.rsp

# 아래 내용 찾아서 수정
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/app/oraInventory
SELECTED_LANGUAGES=en,ko
ORACLE_HOME=/app/oracle/product/11.2.0
ORACLE_BASE=/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=true
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0  # 여기서는 partitioning만 남기고 삭제
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.installExampleSchemas=true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;11.2.0.1 설치&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;su - oracle
cd /app/database
./runInstaller -silent -responseFile /app/database/response/db_install.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;The installation of Oracle Database 11g was successful.
Please check '/app/oraInventory/logs/silentInstall2015-12-06_08-41-24AM.log' for more details.

As a root user, execute the following script(s):
        1. /app/oracle/product/11.2.0/root.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;터미널을 새로 열어 root로 로그인 후 스크립트 실행.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;su -
/app/oracle/product/11g/root.sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Check /app/oracle/product/11.2.0/install/root_rhel5.localdomain_2015-12-06_08-56-37.log for the output of root script&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치 확인: &lt;code&gt;$ sqlplus / as sysdba&lt;/code&gt;로 버전(11.2.0.1) 확인.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Create Database&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;response 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;su - oracle
vi /app/database/response/dbca.rsp

# 아래 내용 찾아서 수정
GDBNAME = &quot;testdb&quot;
SID = &quot;testdb&quot;
SYSPASSWORD = &quot;oracle&quot; (주석 해제)
SYSTEMPASSWORD = &quot;oracle&quot; (주석 해제)
CHARACTERSET = &quot;AL32UTF8&quot; (주석 해제)
NATIONALCHARACTERSET= &quot;UTF8&quot; (주석 해제)
SAMPLESCHEMA=TRUE (주석 해제)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 생성&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;cd $ORACLE_HOME/bin
dbca -silent -responseFile /app/database/response/dbca.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;Completing Database Creation
66% complete
70% complete
73% complete
85% complete
96% complete
100% complete
Look at the log file &quot;/app/oracle/cfgtoollogs/dbca/testdb/testdb.log&quot; for further details.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;sqlplus / as sysdba
select status from v$instance;
STATUS
------------
OPEN&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;STATUS가 &lt;b&gt;OPEN&lt;/b&gt; 상태이면 정상.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Listener 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Listener 생성&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd $ORACLE_HOME/bin
./netca -silent -responseFile /app/database/response/netca.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Listener 확인&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;lsnrctl status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Service가 로딩되면 정상이다.&lt;/p&gt;
&lt;p&gt;정상적으로 작동되지 않는다면 아래의 절차를 따른다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/etc/hosts의 IP와 HOSTNAME을 확인한다.&lt;/li&gt;
&lt;li&gt;listener.ora 파일의 HOSTNAME 부분을 IP로 변경한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;listener reload&lt;/code&gt; 후, &lt;code&gt;listener status&lt;/code&gt; 로 다시 확인한다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>IT</category>
      <category>11gr2</category>
      <category>DB</category>
      <category>Oracle</category>
      <category>RHEL5</category>
      <category>사일런트</category>
      <category>설치</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/69</guid>
      <comments>https://nyebo.tistory.com/entry/Oracle-11gR2-Silent-Install-on-RHEL5#entry69comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:37:24 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 10gR2 Silent Install on RHEL4</title>
      <link>https://nyebo.tistory.com/entry/Oracle-10gR2-Silent-Install-on-RHEL4</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2015년 2월 17일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Setup&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치에 필요한 파일&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10201_database_linux32.zip (/home/oracle)&lt;/li&gt;
&lt;li&gt;patchset 파일 (/home/oracle/patchset)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p6810189_10204_Linux-x86.zip&lt;/li&gt;
&lt;li&gt;p8202632_10205_LINUX.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;patch 파일 (/home/oracle/patch)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p4198954_40_LINUX.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그룹, 사용자 생성&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;useradd -g dba oracle
passwd oracle&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Oracle 10gR2 압축 해제&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd /home/oracle
unzip 10201_database_linux32.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/home/oracle/database&lt;/code&gt; 디렉터리가 생성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kernel Parameters 설정&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;vi /etc/sysctl.conf

# 아래 내용 추가
kernel.shmmax=536870912
kernel.shmmni=4096
kernel.shmall=2097152
kernel.sem=250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;vi /etc/security/limits.conf

# 아래 내용 추가
oracle10gR2 soft nproc 2047
oracle10gR2 hard nproc 16384
oracle10gR2 soft nofile 1024
oracle10gR2 hard nofile 65536&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;vi /etc/pam.d/login

# 아래 내용 추가
session required pam_limits.so&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패키지 설치&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd /media/cdrecoder/RedHat/RPMS rpm -Uvh libaio-devel-*.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;cd /home/oracle/patch unzip p4198954_40_LINUX.zip

Archive: p4198954_40_LINUX.zip
inflating: compat-libcwait-2.1-1.i386.rpm
inflating: compat-oracle-rhel4-1.0-5.i386.rpm
inflating: README.txt&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;rpm -Uvh compat-libcwait-*.rpm &amp;amp;&amp;amp; rpm -Uvh compat-oracle-rhel4-*.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.bash_profile 파일 설정&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;vi /home/oracle/.bash_profile

# 아래 내용 추가
export EDITOR=vi
export LD_ASSUME_KERNEL=2.4.19
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=testdb
export LANG=ko_KR.eucKR
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export PATH=$PATH:$ORACLE_HOME/bin
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 &lt;b&gt;ANSI&lt;/b&gt;가 아닌 &lt;b&gt;UNICODE&lt;/b&gt;를 사용하고 싶다면, &lt;code&gt;KO16MSWIN949&lt;/code&gt;를 &lt;code&gt;AL32UTF8&lt;/code&gt;로 변경한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/hosts 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;# IP hostname.localdomain hostname 순으로 추가

127.0.0.1 localhost.localdomain localhost
192.168.0.60 rhel5.localdomain rhel5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Oracle 10gR2 (10.2.0.1) Installation&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;orainst.loc 파일 생성&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;vi /etc/oraInst.loc

# 아래 내용 추가
inventory_loc=/home/oracle/oraInventory
inst_group=dba&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# 권한 변경
chown oracle.dba /etc/oraInst.loc
chown -R oracle.dba /home/oracle&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;response 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;su - oracle
vi /home/oracle/database/response/enterprise.rsp

# 아래 내용 찾아서 수정
UNIX_GROUP_NAME=&quot;dba&quot;
ORACLE_HOME=&quot;/home/oracle/product/10.2.0/db_1&quot;
ORACLE_HOME_NAME=&quot;OraDb10gR2Home1&quot;
COMPONENT_LANGUAGES={&quot;en,ko&quot;}
INSTALL_TYPE=&quot;EE&quot;
n_configuratinOption=&quot;3&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10.2.0.1 설치&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cd /home/oracle/database/
./runInstaller -silent -responseFile /home/oracle/database/response/enterprise.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Oracle Universal Installer 시작 중...

설치 프로그램 요구 사항 확인 중...

운영 체제 버전 확인 중: 필수 버전redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2 성공함 설치 프로그램 요구 사항을 모두 충족했습니다.

다음에서 Oracle Universal Installer의 시작을 준비하는 중 /tmp/OraInstall2015-08-11_04-09-11AM. 기다리십시오.[oracle@rhel4 database]$ Oracle Universal Installer, 버전 10.2.0.1.0 Production Copyright (C) 1999, 2005, Oracle. All rights reserved.

(중략)

설치 단계가 완료되었습니다.(Tue Aug 11 04:13:39 KST 2015)

WARNING:시스템을 구성하려면 다음 구성 스크립트 /home/oracle/product/10.2.0/db_1/root.sh을(를) 루트로 실행해야 합니다. 구성 툴 실행을 건너 뛸 경우 구성이 완료되지 않고
제품이 제대로 작동하지 않습니다.제품이 제대로 작동하도록 하기 위해서는 OUI를 종료한 후
스크립트 및 구성 툴을 실행해야 합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;su -
/home/oracle/product/10.2.0/db_1/root.sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;Running Oracle10 root.sh script...
The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME= /home/oracle/product/10.2.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
    Copying dbhome to /usr/local/bin ...
    Copying oraenv to /usr/local/bin ...
    Copying coraenv to /usr/local/bin ...

Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;$ sqlplus / as sysdba&lt;/code&gt;로 버전(10.2.0.1) 확인.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Oracle 10gR2 (10.2.0.4) Patch&lt;/h2&gt;
&lt;p&gt;Oacle이 실행 중이면, 패치가 진행되지 않는다. 재부팅 또는 프로세스 종료 후 패치 진행.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;su - oracle
cd /home/oracle/patchset unzip p6810189_10204_Linux-x86.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;response 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;vi /home/oracle/patchset/Disk1/response/patchset.rsp

# 아래 내용 찾아서 수정
UNIX_GROUP_NAME=&quot;dba&quot;
FROM_LOCATION=&quot;../stage/products.xml&quot;
ORACLE_HOME=&quot;/home/oracle/patchset/product/10.2.0/db_1&quot;
ORACLE_HOME_NAME=&quot;OraDb10gR2Home1&quot;
COMPONENTLANGUAGES={&quot;en,ko&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 GENERAL PURPOSE를 찾을 수 없다고 나오면, FROM_LOCATION의 값을 절대주소로 변경한다. &lt;b&gt;&quot;../stage/products.xml&quot;&lt;/b&gt; &amp;rarr; &lt;b&gt;&quot;/home/oracle/patchset/stage/products.xml&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10.2.0.4 패치&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cd /home/oracle/patchset/Disk1
./runInstaller -silent -responseFile /home/oracle/patchset/Disk1/response/patchset.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Oracle Universal Installer 시작 중...

설치 프로그램 요구 사항 확인 중...

운영 체제 버전 확인 중: 필수 버전redhat-3, SuSE-9, SuSE-10, redhat-4, redhat-5, UnitedLinux-1.0, asianux-1, asianux-2 or asianux-3 성공함 설치 프로그램 요구 사항을 모두 충족했습니다.

다음에서 Oracle Universal Installer의 시작을 준비하는 중 /tmp/OraInstall2015-08-11_05-00-16AM. 기다리십시오.[oracle@rhel4 Disk1]$ Oracle Universal Installer, 버전 10.2.0.5.0 Production Copyright (C) 1999, 2008, Oracle. All rights reserved.

(중략)

설치 단계가 완료되었습니다.(2015년 8월 11일 화요일 오전 5시 04분 49초 KST)
WARNING: 다음 구성 스크립트는 &quot;루트&quot; 사용자로 실행해야 합니다.
#!/bin/sh
#Root script to run
/home/oracle/product/10.2.0/db_1/root.sh
구성 스크립트 실행:
    1. 터미널 창을 엽니다.
    2. &quot;루트&quot;로 로그인합니다.
    3. 스크립트를 실행합니다.

Oracle Database 10g Release 2 Patch Set 3의 설치을(를) 성공했습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;su -
/home/oracle/product/10.2.0/db_1/root.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;[/usr/local/bin]&lt;/b&gt; 에서 &lt;b&gt;[Enter]&lt;/b&gt;, 덮어쓸 것인지 물어보면 전부다 &lt;b&gt;Y&lt;/b&gt; 입력 후, &lt;b&gt;[확인]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;Running Oracle10 root.sh script...

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME= /home/oracle/product/10.2.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file &quot;dbhome&quot; already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
    Copying dbhome to /usr/local/bin ...
The file &quot;oraenv&quot; already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
    Copying oraenv to /usr/local/bin ...
The file &quot;coraenv&quot; already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
    Copying coraenv to /usr/local/bin ...

Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치 확인: &lt;code&gt;$ sqlplus / as sysdba&lt;/code&gt;로 버전(10.2.0.4) 확인.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Create Database&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;response 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;su - oracle
vi /home/oracle/database/response/dbca.rsp

# 아래 내용 찾아서 수정
GDBNAME = &quot;testdb&quot;
SID = &quot;testdb&quot;
TEMPLATENAME = &quot;New Database&quot;
CHARACTERSET = &quot;KO16MSWIN949&quot; # 주석 해제
NATIONALCHARACTERSET= &quot;UTF8&quot; # 주석 해제&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위에서 &lt;b&gt;UNICODE&lt;/b&gt;를 선택했다면 여기서도 KO16MSWIN949를 &lt;b&gt;AL32UTF8&lt;/b&gt;로 변경한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 생성&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;cd /home/oracle/product/10.2.0/db_1/bin/
./dbca -silent -responseFile /home/oracle/database/response/dbca.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;Oracle 인스턴스 생성 및 시작 중
1% 완료
4% 완료
데이터베이스 파일 생성 중
8% 완료
데이터 딕셔너리 뷰 생성 중
9% 완료
10% 완료
(중략)
데이터베이스 생성 완료 중
89% 완료
90% 완료
91% 완료
95% 완료
99% 완료
100% 완료
자세한 내용은 로그 파일 &quot;/home/oracle/product/10.2.0/db_1/cfgtoollogs/dbca/testdb/testdb.log&quot;을(를) 참조하십시오&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;/home/oracle/admin 디렉터리에 &lt;b&gt;testdb&lt;/b&gt; 디렉터리가 생성되어 있으면, DB가 생성된 것이다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;sqlplus / as sysdba
startup
select status from v$instance;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;STATUS가 &lt;b&gt;OPEN&lt;/b&gt; 상태이면 정상.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Oracle 10gR2 (10.2.0.5) Patch&lt;/h2&gt;
&lt;p&gt;Oracle이 실행 중이면, 패치가 진행되지 않는다. 재부팅 또는 프로세스 종료 후 패치 진행.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;su - oracle
cd /home/oracle/patchset
rm -rf Disk1 rm -rf README.html
unzip p8202632_10205_LINUX.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;response 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;vi /home/oracle/patchset/Disk1/response/patchset.rsp

# 아래 내용 찾아서 수정
UNIX_GROUP_NAME=&quot;dba&quot;
FROM_LOCATION=&quot;../stage/products.xml&quot;
ORACLE_HOME=&quot;/home/oracle/product/10.2.0/db_1&quot;
ORACLE_HOME_NAME=&quot;OraDb10gR2Home1&quot;
COMPONENT_LANGUAGES={&quot;en,ko&quot;}
DECLINE_SECURITY_UPDATES=TRUE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10.2.0.5 패치&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cd /home/oracle/patchset/Disk1
./runInstaller -silent -responseFile /home/oracle/patchset/Disk1/response/patchset.rsp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Oracle Universal Installer 시작 중...

설치 프로그램 요구 사항 확인 중...

운영 체제 버전 확인 중: 필수 버전redhat-3, SuSE-9, SuSE-10, redhat-4, redhat-5, redhat-6, UnitedLinux-1.0, asianux-1, asianux-2, asianux-3, enterprise-4, enterprise-5 or SuSE-11 성공함 설치 프로그램 요구 사항을 모두 충족했습니다.

다음에서 Oracle Universal Installer의 시작을 준비하는 중 /tmp/OraInstall2015-08-11_05-55-51AM. 기다리십시오.[oracle@rhel4 Disk1]$ Oracle Universal Installer, 버전 10.2.0.5.0 Production Copyright (C) 1999, 2010, Oracle. All rights reserved.

(중략)

설치 단계가 완료되었습니다.(2015년 8월 11일 화요일 오전 6시 13분 44초 KST)
WARNING: 다음 구성 스크립트는 &quot;루트&quot; 사용자로 실행해야 합니다.
#!/bin/sh
#Root script to run
/home/oracle/product/10.2.0/db_1/root.sh
구성 스크립트 실행:
    1. 터미널 창을 엽니다.
    2. &quot;루트&quot;로 로그인합니다.
    3. 스크립트를 실행합니다.

Oracle Database 10g Release 2 Patch Set 4의 설치을(를) 성공했습니다.
자세한 내용은 '/home/oracle/oraInventory/logs/silentInstall2015-08-11_06-08-16AM.log'을(를) 확인하십시오.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;su -
/home/oracle/product/10.2.0/db_1/root.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;[/usr/local/bin]&lt;/b&gt;에서 &lt;b&gt;[Enter]&lt;/b&gt;, 덮어쓸 것인지 물어보면 전부다 &lt;b&gt;Y&lt;/b&gt; 입력 후, &lt;b&gt;[확인]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;Running Oracle 10g root.sh script...

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME= /home/oracle/product/10.2.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file &quot;dbhome&quot; already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
    Copying dbhome to /usr/local/bin ...
The file &quot;oraenv&quot; already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
    Copying oraenv to /usr/local/bin ...
The file &quot;coraenv&quot; already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
    Copying coraenv to /usr/local/bin ...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;$ sqlplus / as sysdba&lt;/code&gt;로 버전(10.2.0.5) 확인.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Post Upgrade(DB 파라미터 값 수정)&lt;/h2&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;sqlplus / as sysdba
startup upgrade
select status from v$instance;
@?/rdbms/admin/catupgrd.sql&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;DOC&amp;gt;#######################################################################
DOC&amp;gt;#######################################################################
DOC&amp;gt;
DOC&amp;gt; The above PL/SQL lists the SERVER components in the upgraded
DOC&amp;gt; database, along with their current version and status.
DOC&amp;gt;
DOC&amp;gt; Please review the status and version columns and look for
DOC&amp;gt; any errors in the spool log file. If there are errors in the spool
DOC&amp;gt; file, or any components are not VALID or not the current version,
DOC&amp;gt; consult the Oracle Database Upgrade Guide for troubleshooting
DOC&amp;gt; recommendations.
DOC&amp;gt;
DOC&amp;gt; Next shutdown immediate, restart for normal operation, and then
DOC&amp;gt; run utlrp.sql to recompile any invalid application objects.
DOC&amp;gt;
DOC&amp;gt;#######################################################################
DOC&amp;gt;#######################################################################
DOC&amp;gt;#&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;shutdown
startup
@?/rdbms/admin/utlrp.sql&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;TIMESTAMP
------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_END 2015-08-11 06:40:59
DOC&amp;gt; The following query reports the number of objects that have compiled
DOC&amp;gt; with errors (objects that compile with errors have status set to 3 in
DOC&amp;gt; obj$). If the number is higher than expected, please examine the error
DOC&amp;gt; messages reported with each object (using SHOW ERRORS) to see if they
DOC&amp;gt; point to system misconfiguration or resource constraints that must be
DOC&amp;gt; fixed before attempting to recompile these objects.
DOC&amp;gt;#
OBJECTS WITH ERRORS
-------------------
                  0
DOC&amp;gt; The following query reports the number of errors caught during
DOC&amp;gt; recompilation. If this number is non-zero, please query the error
DOC&amp;gt; messages in the table UTL_RECOMP_ERRORS to see if any of these errors
DOC&amp;gt; are due to misconfiguration or resource constraints that must be
DOC&amp;gt; fixed before objects can compile successfully.
DOC&amp;gt;#
ERRORS DURING RECOMPILATION
---------------------------
                          0&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;shutdown
startup
select status from v$instance;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;업그레이드 완료.&lt;/p&gt;</description>
      <category>IT</category>
      <category>10gr2</category>
      <category>DB</category>
      <category>Oracle</category>
      <category>RHEL4</category>
      <category>사일런트</category>
      <category>설치</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/68</guid>
      <comments>https://nyebo.tistory.com/entry/Oracle-10gR2-Silent-Install-on-RHEL4#entry68comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:35:59 +0900</pubDate>
    </item>
    <item>
      <title>QNAP TS-251 개봉 및 설치 감상기</title>
      <link>https://nyebo.tistory.com/entry/QNAP-TS-251-%EA%B0%9C%EB%B4%89-%EB%B0%8F-%EC%84%A4%EC%B9%98-%EA%B0%90%EC%83%81%EA%B8%B0</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 포스팅은 &lt;b&gt;2014년 8월 13일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;자작 NAS인 FreeNAS를 사용하던 중, 상용 NAS를 집에 들일 기회가 생겼다.&lt;/p&gt;
&lt;p&gt;괜찮은 모델이 없나 둘러보던 중, QNAP TS-212 제품이 눈에 들어왔다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;앱 지원 등 편의성은 시놀로지가 좋지만, 비슷한 가격대에서 성능은 QNAP이 조금 더 좋은 편이었다. 그러나 자작 NAS에 비해서는 역시나 비싼편이어서 고민이 되었다.&lt;/p&gt;
&lt;p&gt;그러던 중 새 모델인 TS-251이 출시된다는 소식을 들었다. 검색해보니 아직 국내에는 출시되지 않았고, 해외에서는 $499에 판매중이었다.&lt;/p&gt;
&lt;p&gt;비슷한 가격대의 2베이 상용 NAS 중에서는 가장 좋았기에 TS-251을 구매하기로 마음먹었다. 문제는 QNAP 본사 정책 상, 구매 장소에 따른 로컬 AS라 RMA가 불가하여 해외구매시 AS가 힘들다는 단점이 있었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;국내에서 QNAP 유통을 담당하고 있는 한성 SMB에 연락해보니 아직 국내 출시일은 잡히지 않은 상황. 하지만 곧 출시될 것 같아서 2~3주 정도 기다려보기로 했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8월 1일. 드디어 TS-251가 출시된다는 소식을 들었다. 출시가는 1,089,000원. 해외 구매가 $499였던 것에 비하면 가격이 상당히 높게 측정되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;고민하며 며칠 더 기다렸더니, 다행히 공동구매가 진행되었고, 699,000원이라는 나름(?) 적당한 가격에 구입을 할 수 있게 되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;579&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNO949/btqJZm0mU5B/9gFOPMsIvkbenMonMfTYYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNO949/btqJZm0mU5B/9gFOPMsIvkbenMonMfTYYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNO949/btqJZm0mU5B/9gFOPMsIvkbenMonMfTYYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNO949%2FbtqJZm0mU5B%2F9gFOPMsIvkbenMonMfTYYk%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;579&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; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;211&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K7PJl/btqJWTqTcG2/3IoXE4kO2hVIPWkktgnUC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K7PJl/btqJWTqTcG2/3IoXE4kO2hVIPWkktgnUC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K7PJl/btqJWTqTcG2/3IoXE4kO2hVIPWkktgnUC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK7PJl%2FbtqJWTqTcG2%2F3IoXE4kO2hVIPWkktgnUC0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;211&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;동봉된 CD는 공동구매 사은품인 rebit 백업 소프트웨어이다.&lt;/p&gt;
&lt;p&gt;박스는 생각보다 컸는데, 열어보니 제품은 작고 앙증맞았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b70hUe/btqJ1MK2czY/F9kaL0YP5AwYHEhXUB5dZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b70hUe/btqJ1MK2czY/F9kaL0YP5AwYHEhXUB5dZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b70hUe/btqJ1MK2czY/F9kaL0YP5AwYHEhXUB5dZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb70hUe%2FbtqJ1MK2czY%2FF9kaL0YP5AwYHEhXUB5dZK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;640&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; width=&quot;100%&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL8ec0/btqJZnLJtGq/OlH8jIST7c4flvRHcOL1Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL8ec0/btqJZnLJtGq/OlH8jIST7c4flvRHcOL1Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL8ec0/btqJZnLJtGq/OlH8jIST7c4flvRHcOL1Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL8ec0%2FbtqJZnLJtGq%2FOlH8jIST7c4flvRHcOL1Ek%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;640&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;본체&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전원어댑터&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메뉴얼&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LAN Cable (CAT.5E) 2ea&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bay 고정용 나사 (2.5&amp;rdquo; 6ea, 3.5&amp;rdquo; 8ea)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;본체의 상세 스펙은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zHKda/btqJ6ca6juC/g07ltVrMEc0htjq1XIABD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zHKda/btqJ6ca6juC/g07ltVrMEc0htjq1XIABD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zHKda/btqJ6ca6juC/g07ltVrMEc0htjq1XIABD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzHKda%2FbtqJ6ca6juC%2Fg07ltVrMEc0htjq1XIABD1%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;640&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; width=&quot;100%&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfYxam/btqJ93LtamO/5z2TevC2BViegFeKkcyQqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfYxam/btqJ93LtamO/5z2TevC2BViegFeKkcyQqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfYxam/btqJ93LtamO/5z2TevC2BViegFeKkcyQqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfYxam%2FbtqJ93LtamO%2F5z2TevC2BViegFeKkcyQqK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;640&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; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;382&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKIMN/btqJ4HCsk7n/MyYEBdIoAkP5UvQuhbGqp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKIMN/btqJ4HCsk7n/MyYEBdIoAkP5UvQuhbGqp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKIMN/btqJ4HCsk7n/MyYEBdIoAkP5UvQuhbGqp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKIMN%2FbtqJ4HCsk7n%2FMyYEBdIoAkP5UvQuhbGqp0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;382&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;가장 눈에 띄는 점은 역시 CPU이다.&lt;/p&gt;
&lt;p&gt;비슷한 가격대의 다른 NAS들이 Marvell이나 Atom 1.6Ghz를 사용하는 반면&lt;/p&gt;
&lt;p&gt;TS-251은 Celeron 2.41Ghz를 채택했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;메모리는 기본 2GB에 추가로 업그레이드가 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;USB3.0 포트가 전면과 후면에 각각 1개씩.&lt;/p&gt;
&lt;p&gt;USB2.0 포트가 후면에 2개씩.&lt;/p&gt;
&lt;p&gt;총 4개의 포트가 제공된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다른 것으로는 듀얼 LAN 포트, HDMI, 켄싱턴 락이 제공된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;437&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JI5uQ/btqJ3iJEr4b/ww7IJ9klWquMBmxzJKkry0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JI5uQ/btqJ3iJEr4b/ww7IJ9klWquMBmxzJKkry0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JI5uQ/btqJ3iJEr4b/ww7IJ9klWquMBmxzJKkry0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJI5uQ%2FbtqJ3iJEr4b%2Fww7IJ9klWquMBmxzJKkry0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;437&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; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;370&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO8McV/btqJ8fSV57l/KkrMWnKVKPRrKp4LZRTOi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO8McV/btqJ8fSV57l/KkrMWnKVKPRrKp4LZRTOi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO8McV/btqJ8fSV57l/KkrMWnKVKPRrKp4LZRTOi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO8McV%2FbtqJ8fSV57l%2FKkrMWnKVKPRrKp4LZRTOi0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;370&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;기존에 사용하던 FreeNAS에서 HDD를 2개 가져와서 바로 장착을 하였다.&lt;/p&gt;
&lt;p&gt;베이를 빼고, HDD를 고정시키고, 다시 베이를 넣으면 설치 완료.&lt;/p&gt;
&lt;p&gt;이제 전원만 연결하면 바로 사용 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddgStA/btqJ8gdgoRA/Gqf10pBWJ9Te9PSGseJU0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddgStA/btqJ8gdgoRA/Gqf10pBWJ9Te9PSGseJU0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddgStA/btqJ8gdgoRA/Gqf10pBWJ9Te9PSGseJU0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddgStA%2FbtqJ8gdgoRA%2FGqf10pBWJ9Te9PSGseJU0k%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;640&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;/p&gt;
&lt;p&gt;상태창에서 LED로 현황을 알려준다.&lt;/p&gt;
&lt;p&gt;HDD도 2개다 제대로 인식했고, LAN도 깜빡거리며 정상 작동함을 알려준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;344&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHC9l/btqJ8fyIRtF/vwI64viejUymRj4WEVVWU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHC9l/btqJ8fyIRtF/vwI64viejUymRj4WEVVWU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHC9l/btqJ8fyIRtF/vwI64viejUymRj4WEVVWU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHC9l%2FbtqJ8fyIRtF%2FvwI64viejUymRj4WEVVWU1%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;344&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;메인컴퓨터에서 Qfinder를 설치하니 알아서 설치가 진행되었다.&lt;/p&gt;
&lt;p&gt;초기 세팅을 하는데, 캡쳐에는 40분으로 표시되었는데 실제로는 10분정도만에 완료되었다.&lt;/p&gt;
&lt;p&gt;이제 할당된 IP로 로그인하면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;583&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ3KZN/btqJ0nEHP3y/2j7ViLuremYvOMwtq3AosK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ3KZN/btqJ0nEHP3y/2j7ViLuremYvOMwtq3AosK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ3KZN/btqJ0nEHP3y/2j7ViLuremYvOMwtq3AosK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ3KZN%2FbtqJ0nEHP3y%2F2j7ViLuremYvOMwtq3AosK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;583&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;/p&gt;
&lt;p&gt;FreeNAS를 세팅할 때에 비하면 허탈할 정도로 쉽고 빨랐다.&lt;/p&gt;
&lt;p&gt;상용 NAS는 자작 NAS에 비해서 비싸지만,&lt;/p&gt;
&lt;p&gt;가정용 또는 소규모로 사용하기에는 관리도 용이하고, 스트레스도 덜 받고, 시간도 아끼고 여러모로 좋은 것 겉다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>Nas</category>
      <category>QNAP</category>
      <category>TS-251</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/67</guid>
      <comments>https://nyebo.tistory.com/entry/QNAP-TS-251-%EA%B0%9C%EB%B4%89-%EB%B0%8F-%EC%84%A4%EC%B9%98-%EA%B0%90%EC%83%81%EA%B8%B0#entry67comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:33:33 +0900</pubDate>
    </item>
    <item>
      <title>FreeNAS 9.2.1.5 설치 매뉴얼</title>
      <link>https://nyebo.tistory.com/entry/FreeNAS-9215-%EC%84%A4%EC%B9%98-%EB%A7%A4%EB%89%B4%EC%96%BC</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 포스팅은 &lt;b&gt;2014년 7월 5일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;p&gt;최근 NAS를 사용하는 사람들이 많아졌다.&lt;/p&gt;
&lt;p&gt;가볍게 사용할 수 있는 포고플러그부터, 용량의 확장이 자유롭고 입맛대로 사용할 수 있는 자작 NAS까지 종류도 다양하다.&lt;/p&gt;
&lt;p&gt;사실 말이 자작 NAS이지, 기존의 홈 서버와 크게 다를 것이 없다.&lt;/p&gt;
&lt;p&gt;NAS의 첫 걸음은 목적의 확정에 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;무슨 목적으로 NAS를 사용하려고 하는가?&lt;/p&gt;
&lt;p&gt;단순히 자료 저장만을 원한다면 Dropbox, GoogleDrive, OneDrive, N드라이브 등의 클라우드 서비스를 이용하는 것이 편리하다.&lt;/p&gt;
&lt;p&gt;NAS가 필요하다는 자기합리화(?)가 끝났다면, 이제 두 가지 선택지가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;상용 NAS&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자작 NAS&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;전자는 초기 설정 및 관리가 편리하지만, 성능 대비 가격이 비싸고 확장성이 좋지 않다. 후자는 초기 설정 및 관리가 어렵지만, 성능 대비 가격이 싸고 확장성이 좋다.&lt;/p&gt;
&lt;p&gt;자작 NAS는 크게 세 가지로 분류할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Windows(VMware 등의 가상화 이용)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Linux(서버 구축 또는 Xpenology 등)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FreeBSD(FreeNAS, NAS4Free, OpenMediaValut)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이미 윈도우와 리눅스는 국내에도 사용하는 사람이 많고 자료도 많은 편이다.&lt;/p&gt;
&lt;p&gt;하지만 FreeBSD 기반의 NAS 전용 OS들은 윈도우, 리눅스보다 관리 측면에서 용이하지만, 국내에는 사용하는 사람이 적고 자료도 적은 편이다.&lt;/p&gt;
&lt;p&gt;FreeNAS를 구축하면서 모았던 자료를 정리하면서 자작 NAS에 관심이 있는 사람들에게 조금이나마 도움이 되고자 글로 정리해서 남긴다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;준비물&lt;/h2&gt;
&lt;p&gt;HDD보다 USB에 설치하는 것이 관리하기가 좋기 때문에, 여기서는 USB 설치만 다룬다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;2GB 이상의 USB.&lt;/li&gt;
&lt;li&gt;FreeNAS 이미지 파일을 넣을 USB.&lt;/li&gt;
&lt;li&gt;FreeNAS 9.2.1.5 &lt;a href=&quot;http://web.freenas.org/download-freenas-release.html&quot;&gt;(다운로드)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Win32DiskImager &lt;a href=&quot;http://sourceforge.net/projects/win32diskimager/files/Archive/&quot;&gt;(다운로드)&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 버전은 iso 파일만 제공되므로, UltraISO 등을 이용하여 부팅 가능한 디스크로 생성하면 된다. 여기서는 img 파일을 기준으로 설명한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;FreeNAS-9.2.1.5-RELEASE-x64.img.xz&lt;/b&gt; 파일 압축 해제.&lt;/p&gt;
&lt;p&gt;USB를 연결하고 &lt;b&gt;Win32Disk Imager&lt;/b&gt; 실행 후, &lt;b&gt;FreeNAS-9.2.1.5-RELEASE-x64.img&lt;/b&gt;파일 열기.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Write&lt;/b&gt;를 누르면 부팅 디스크 생성 완료.&lt;/p&gt;
&lt;p&gt;생성된 USB를 NAS에 연결하고, BIOS로 진입하여 &lt;b&gt;USB 부팅&lt;/b&gt;으로 변경 후 부팅한다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/ne7cN/btqJ8frScbL/g8lXABpB95S7E6X2fI72XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ne7cN/btqJ8frScbL/g8lXABpB95S7E6X2fI72XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ne7cN/btqJ8frScbL/g8lXABpB95S7E6X2fI72XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fne7cN%2FbtqJ8frScbL%2Fg8lXABpB95S7E6X2fI72XK%2Fimg.png&quot; width=&quot;100%&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;1) Install/Upgrade 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cOMtL9/btqJ4GQ2WOr/NzyvSwF1VanqYqDfNaFsQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOMtL9/btqJ4GQ2WOr/NzyvSwF1VanqYqDfNaFsQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOMtL9/btqJ4GQ2WOr/NzyvSwF1VanqYqDfNaFsQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOMtL9%2FbtqJ4GQ2WOr%2FNzyvSwF1VanqYqDfNaFsQK%2Fimg.png&quot; width=&quot;100%&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;USB 확인 후, OK 선택&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/Xs70R/btqJXWnkI6l/hjCuZo4ogABGqPVeyxlZb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xs70R/btqJXWnkI6l/hjCuZo4ogABGqPVeyxlZb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xs70R/btqJXWnkI6l/hjCuZo4ogABGqPVeyxlZb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXs70R%2FbtqJXWnkI6l%2FhjCuZo4ogABGqPVeyxlZb1%2Fimg.png&quot; width=&quot;100%&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; width=&quot;100%&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/cJhWEU/btqJ92TkzzO/4DfreftW7jfp5X1BtQnLd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJhWEU/btqJ92TkzzO/4DfreftW7jfp5X1BtQnLd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJhWEU/btqJ92TkzzO/4DfreftW7jfp5X1BtQnLd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJhWEU%2FbtqJ92TkzzO%2F4DfreftW7jfp5X1BtQnLd1%2Fimg.png&quot; width=&quot;100%&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; width=&quot;100%&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/b6YxtK/btqJ926R95y/GC4oxm9NIlDGyfYKshWum0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6YxtK/btqJ926R95y/GC4oxm9NIlDGyfYKshWum0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6YxtK/btqJ926R95y/GC4oxm9NIlDGyfYKshWum0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6YxtK%2FbtqJ926R95y%2FGC4oxm9NIlDGyfYKshWum0%2Fimg.png&quot; width=&quot;100%&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;Console Setup 창이 뜨고, 하단에 IP가 정상적으로 표시되면 성공. IP가 127.0.0.1로 뜬다면 하단을 참고.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/mWaKN/btqJ1LrNC6d/TS6DhKEMNY3twNswuk4dj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mWaKN/btqJ1LrNC6d/TS6DhKEMNY3twNswuk4dj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mWaKN/btqJ1LrNC6d/TS6DhKEMNY3twNswuk4dj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmWaKN%2FbtqJ1LrNC6d%2FTS6DhKEMNY3twNswuk4dj1%2Fimg.png&quot; width=&quot;100%&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;방금 확인 한, IP로 접속하여 root 비밀번호를 설정.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/crQFPP/btqJ6bQP0H7/P1bk2a3f53EAqhZSM8CIzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crQFPP/btqJ6bQP0H7/P1bk2a3f53EAqhZSM8CIzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crQFPP/btqJ6bQP0H7/P1bk2a3f53EAqhZSM8CIzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrQFPP%2FbtqJ6bQP0H7%2FP1bk2a3f53EAqhZSM8CIzK%2Fimg.png&quot; width=&quot;100%&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;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;IP가 127.0.0.1로 표시되는 문제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공유기의 DHCP 기능이 정상 작동하는지 확인.&lt;/li&gt;
&lt;li&gt;IP를 수동으로 설정해야 하는 환경일 경우에는 1) Configure Network Interfaces에 들어가 할당받은 IP를 직접 입력.&lt;/li&gt;
&lt;li&gt;사용중인 랜 카드의 드라이브 미지원.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Realtek 8111g 드라이브 인식 문제&lt;/h3&gt;
&lt;p&gt;아무 문제가 없는데 네트워크를 잡지 못하고 127.0.0.1이 표시된다면,&lt;/p&gt;
&lt;p&gt;랜 카드 드라이브를 인식하지 못하는 경우일 가능성이 높다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예로, MSI B85M-E45 메인보드에는 Realtek 8111G가 내장되어 있는데, 9.2.1.5 버전을 기준으로 드라이브가 OS에 내장되어 있지 않다. (FreeBSD 10버전부터 지원한다고 하니 최신 버전에는 지원될 가능성도 있다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 경우 해결 방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;USB와 if_re.zip 파일&lt;a href=&quot;/attach/if_re.zip&quot;&gt;(다운로드)&lt;/a&gt;을 준비.&lt;/p&gt;
&lt;p&gt;압축 해제 후, &lt;b&gt;if_re.ko&lt;/b&gt;를 USB에 넣고 NAS에 연결.&lt;/p&gt;
&lt;p&gt;부팅 후 &lt;b&gt;Console Setup 화면세서 9&amp;gt; Shell&lt;/b&gt;로 진입&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/ExWSJ/btqJWSMcrvV/xcstWDlT8xcvsxB21KhtZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ExWSJ/btqJWSMcrvV/xcstWDlT8xcvsxB21KhtZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ExWSJ/btqJWSMcrvV/xcstWDlT8xcvsxB21KhtZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FExWSJ%2FbtqJWSMcrvV%2FxcstWDlT8xcvsxB21KhtZk%2Fimg.png&quot; width=&quot;100%&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;USB 확인. 현재 연결된 USB는 &lt;b&gt;da1s1.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;dmesg
ls /dev/da1*

/dev/da1 /dev/da1s1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;USB를 &lt;code&gt;/mnt/usb&lt;/code&gt;로 마운트&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;mkdir /mnt/usb

# USB 포맷이 ntfs인 경우
ntfs-3g /dev/da1s1 /mnt/usb

# USB 포맷이 fat32인 경우
mount_msdosfs /dev/da1 /mnt/usb

# 마운트 과정 중에 fuse가 뜬다면 아래 명령어 입력 후 다시 마운트 시도.
kldload fuse&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;if_re.ko 파일을 커널에 복사할 수 있도록 설정.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;mount -o noatime -uw&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;if_re.ko 파일을 &lt;code&gt;/boot/kernel&lt;/code&gt; 디렉터리에 복사.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd /mnt/usb
cp ir_re.ko /boot/kernel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;부팅시 자동으로 if_re.ko 파일을 읽도록 설정.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;echo if_re_load=&quot;YES&quot; &amp;gt;&amp;gt; /boot/loader.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;USB 언마운트 후, NAS에서 연결 해제.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;mount -r
umount /mnt/usb
init 6&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;재부팅 하면, 네트워크가 제대로 설정된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DDNS 설정&lt;/h2&gt;
&lt;p&gt;NAS를 로컬 상에서만 사용한다면 상관없지만,&lt;/p&gt;
&lt;p&gt;외부에서 NAS에 접속하기 위해서는 DDNS가 필요하다.&lt;/p&gt;
&lt;p&gt;DDNS 서비스는 ipTIME과 같은 공유기나, DDNS 서비스를 제공해주는 사이트를 이용하면 된다.&lt;/p&gt;
&lt;p&gt;DDNS를 할당받았다면 FreeNAS에 접속한다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cncpiu/btqJ6cPHNKr/FQsliSmdEI0bbQzis5UJQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cncpiu/btqJ6cPHNKr/FQsliSmdEI0bbQzis5UJQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cncpiu/btqJ6cPHNKr/FQsliSmdEI0bbQzis5UJQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcncpiu%2FbtqJ6cPHNKr%2FFQsliSmdEI0bbQzis5UJQK%2Fimg.png&quot; width=&quot;100%&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;System Information 화면에서 Hostname 부분을 &lt;b&gt;할당받은 DDNS&lt;/b&gt;(또는 로컬에서 사용할 &lt;b&gt;IP&lt;/b&gt;) 수정.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/5o8E3/btqJ4GXMWbL/Kh304wunfCSevLu9GwDhL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5o8E3/btqJ4GXMWbL/Kh304wunfCSevLu9GwDhL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5o8E3/btqJ4GXMWbL/Kh304wunfCSevLu9GwDhL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5o8E3%2FbtqJ4GXMWbL%2FKh304wunfCSevLu9GwDhL1%2Fimg.png&quot; width=&quot;100%&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;b&gt;Settings&lt;/b&gt; 탭 선택. &lt;b&gt;WebGUI IPv4 Address, Language, Timezone&lt;/b&gt; 수정.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스토리지 구성&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/lWbo9/btqJ3hjEHSt/oWp7qQP23oZ1mE4rnZ64Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lWbo9/btqJ3hjEHSt/oWp7qQP23oZ1mE4rnZ64Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lWbo9/btqJ3hjEHSt/oWp7qQP23oZ1mE4rnZ64Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWbo9%2FbtqJ3hjEHSt%2FoWp7qQP23oZ1mE4rnZ64Z0%2Fimg.png&quot; width=&quot;100%&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;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bl6cMB/btqJ91NE3Fr/cSB8HFb7q1SbLLv7yrUaIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl6cMB/btqJ91NE3Fr/cSB8HFb7q1SbLLv7yrUaIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl6cMB/btqJ91NE3Fr/cSB8HFb7q1SbLLv7yrUaIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl6cMB%2FbtqJ91NE3Fr%2FcSB8HFb7q1SbLLv7yrUaIk%2Fimg.png&quot; width=&quot;100%&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;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/E8Ol7/btqJ1LZC7Tn/xXoAnEqiTeIOjPkDVFFH20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8Ol7/btqJ1LZC7Tn/xXoAnEqiTeIOjPkDVFFH20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8Ol7/btqJ1LZC7Tn/xXoAnEqiTeIOjPkDVFFH20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8Ol7%2FbtqJ1LZC7Tn%2FxXoAnEqiTeIOjPkDVFFH20%2Fimg.png&quot; width=&quot;100%&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;디스크(da1)를 더블클릭.&lt;/p&gt;
&lt;p&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;h2 data-ke-size=&quot;size26&quot;&gt;볼륨(Volume) 구성&lt;/h2&gt;
&lt;p&gt;볼륨을 구성하기 전에 어떻게 구성할 것인지 선택해야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;HDD가 1개인 경우.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HDD가 2개 이상이면서 각각 단일 볼륨으로 사용할 경우.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HDD가 2개 이상이면서 레이드(RAID)로 묵을 경우.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1, 2번&lt;/b&gt;의 경우는 다음과 같다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/EdhnZ/btqJ8gxxxrZ/kVQU4vFuK26nsSZYLMU4s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EdhnZ/btqJ8gxxxrZ/kVQU4vFuK26nsSZYLMU4s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EdhnZ/btqJ8gxxxrZ/kVQU4vFuK26nsSZYLMU4s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEdhnZ%2FbtqJ8gxxxrZ%2FkVQU4vFuK26nsSZYLMU4s1%2Fimg.png&quot; width=&quot;100%&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;저장소에서 UFS Volume Manager(legacy) 선택 후, 각각 볼륨을 생성.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3번 RAID&lt;/b&gt;로 묶을 경우는 다음과 같다.&lt;/p&gt;
&lt;p&gt;보통 RAID 0, RAID 1, RAID 5를 많이 사용한다.&lt;/p&gt;
&lt;p&gt;여기서는 3개의 HDD를 RAID-Z로 구성한다.&lt;/p&gt;
&lt;p&gt;RAID-Z는 ZFS파일 시스템에 사용하며, RAID 5와 비슷하다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RAID에 대해 알고 싶다면, &lt;a href=&quot;http://ko.wikipedia.org/wiki/RAID&quot;&gt;위키백과&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cklAHs/btqJ1Mdadlm/a5jKs2sLxlgdZTKXQaIBHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cklAHs/btqJ1Mdadlm/a5jKs2sLxlgdZTKXQaIBHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cklAHs/btqJ1Mdadlm/a5jKs2sLxlgdZTKXQaIBHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcklAHs%2FbtqJ1Mdadlm%2Fa5jKs2sLxlgdZTKXQaIBHk%2Fimg.png&quot; width=&quot;100%&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ZFS Volumn Manager&lt;/b&gt; 선택.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ZFS 등 파일 시스템에 대해 알고 싶다면, &lt;a href=&quot;http://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EC%8B%9C%EC%8A%A4%ED%85%9C&quot;&gt;위키백과&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bGhD03/btqJ6b4kS8X/oJ9kaCyN3tz1sZSCGSJkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGhD03/btqJ6b4kS8X/oJ9kaCyN3tz1sZSCGSJkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGhD03/btqJ6b4kS8X/oJ9kaCyN3tz1sZSCGSJkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGhD03%2FbtqJ6b4kS8X%2FoJ9kaCyN3tz1sZSCGSJkk0%2Fimg.png&quot; width=&quot;100%&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;b&gt;Volume Name&lt;/b&gt;을 적고 &lt;b&gt;Available disks&lt;/b&gt;를 누르면 자동으로 현재 시스템에 적합한 RAID를 구성한다.&lt;/p&gt;
&lt;p&gt;HDD가 3개인 경우에는 &lt;b&gt;RaidsZ&lt;/b&gt;가 자동으로 선택되며,&lt;/p&gt;
&lt;p&gt;사용가능 한 용량은 &lt;b&gt;'하드 개수 - 1'&lt;/b&gt;이다.&lt;/p&gt;
&lt;p&gt;예를들어 2TB HDD 3개를 RaidsZ로 구성하면 사용가능 한 용량은 4TB가 된다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bE40jV/btqJ1L6l6a1/aM5npwzeQi6szjDmyKkDc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE40jV/btqJ1L6l6a1/aM5npwzeQi6szjDmyKkDc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE40jV/btqJ1L6l6a1/aM5npwzeQi6szjDmyKkDc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE40jV%2FbtqJ1L6l6a1%2FaM5npwzeQi6szjDmyKkDc1%2Fimg.png&quot; width=&quot;100%&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마지막으로 &lt;b&gt;Add Volume&lt;/b&gt;을 선택하면 &lt;b&gt;zpool&lt;/b&gt;이라는 볼륨이 생성된다.&lt;/p&gt;
&lt;p&gt;앞으로 NAS에서 사용하는 모든 파일들은 zpool 볼륨 안에 저장된다.&lt;/p&gt;
&lt;p&gt;경로는 &lt;code&gt;/mnt/zpool/&lt;/code&gt;이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;만약, FreeNAS를 설치하기 전, ZFS Pool을 생성했었다면, 상단 &amp;lsquo;자동으로 볼륨 가져오기&amp;rsquo;를 통해 생성한 ZFS Pool을 그대로 가져올 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bsxO5g/btqJ1Lk276W/KACHQqLsIRKI29PITKrXBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsxO5g/btqJ1Lk276W/KACHQqLsIRKI29PITKrXBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsxO5g/btqJ1Lk276W/KACHQqLsIRKI29PITKrXBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsxO5g%2FbtqJ1Lk276W%2FKACHQqLsIRKI29PITKrXBk%2Fimg.png&quot; width=&quot;100%&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;이제 이 zpool 볼륨 안에 사진, 영화 등을 저장할 media 디렉터리(볼륨)를 생성한다. zpool을 선택하고, &lt;b&gt;Create ZFS Dataset&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/MLJcc/btqJWSZMrzq/KadziPDf6oSPO7aoUKSbXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MLJcc/btqJWSZMrzq/KadziPDf6oSPO7aoUKSbXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MLJcc/btqJWSZMrzq/KadziPDf6oSPO7aoUKSbXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMLJcc%2FbtqJWSZMrzq%2FKadziPDf6oSPO7aoUKSbXk%2Fimg.png&quot; width=&quot;100%&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; width=&quot;100%&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/8Xvqc/btqJ6dHP3D8/KdjceqTUUMZ2quUO6Dpfl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Xvqc/btqJ6dHP3D8/KdjceqTUUMZ2quUO6Dpfl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Xvqc/btqJ6dHP3D8/KdjceqTUUMZ2quUO6Dpfl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Xvqc%2FbtqJ6dHP3D8%2FKdjceqTUUMZ2quUO6Dpfl1%2Fimg.png&quot; width=&quot;100%&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;Dataset Name에는 &lt;b&gt;media&lt;/b&gt;를 입력. Compression level은 &lt;b&gt;기본 값(lz4)&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/c865eR/btqJWRGvNa1/zeTciepHN7ihK70ek7XkFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c865eR/btqJWRGvNa1/zeTciepHN7ihK70ek7XkFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c865eR/btqJWRGvNa1/zeTciepHN7ihK70ek7XkFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc865eR%2FbtqJWRGvNa1%2FzeTciepHN7ihK70ek7XkFk%2Fimg.png&quot; width=&quot;100%&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;zpool 아래에 media 디렉터리가 이 생성된 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;이제 이 media를 활용하여 CIFS, FTP 등으로 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;계정 생성&lt;/h2&gt;
&lt;p&gt;기본적으로 관리자 계정은 root이다.&lt;/p&gt;
&lt;p&gt;이 root 계정은 NAS의 모든 권한을 가지고 있기 때문에,&lt;/p&gt;
&lt;p&gt;평소에는 적절한 권한의 계정을 생성하여 사용하고, 시스템 수정 등 관리가 필요할 때에 root 계정을 사용하는 것이 보안상 좋다.&lt;/p&gt;
&lt;p&gt;여기서는 가족들이 공동으로 사용할 공동 계정을 생성한다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/olfnF/btqJZojAvkH/I5oeKAqeNy95MVzKIigR70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/olfnF/btqJZojAvkH/I5oeKAqeNy95MVzKIigR70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/olfnF/btqJZojAvkH/I5oeKAqeNy95MVzKIigR70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FolfnF%2FbtqJZojAvkH%2FI5oeKAqeNy95MVzKIigR70%2Fimg.png&quot; width=&quot;100%&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;b&gt;계정 &amp;rarr; User 추가하기&lt;/b&gt;를 선택.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;사용자명:&lt;/b&gt; 원하는 이름(nas).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;해당 사용자의 새로운 주그룹 생성하기:&lt;/b&gt; 체크하면 사용자명으로 그룹이 자동 생성되고, 다른 그룹에 속하고 싶다면 체크 후, 아래 주그룹 목록에서 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cExaQS/btqJ1KT0Gie/wYOqivi2SRMK7Azhno3Ix1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cExaQS/btqJ1KT0Gie/wYOqivi2SRMK7Azhno3Ix1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cExaQS/btqJ1KT0Gie/wYOqivi2SRMK7Azhno3Ix1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcExaQS%2FbtqJ1KT0Gie%2FwYOqivi2SRMK7Azhno3Ix1%2Fimg.png&quot; width=&quot;100%&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;b&gt;Home Directory:&lt;/b&gt; zpool 선택(&lt;code&gt;/zpool/nas&lt;/code&gt;). 홈 디렉터리가 필요없다면 nonexistent&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Shell:&lt;/b&gt; 기본 값 또는 사용하는 Shell 선택.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Disable password login:&lt;/b&gt; 체크하면 암호 없이 로그인.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Lock user:&lt;/b&gt; 계정 잠금&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Permit Sudo:&lt;/b&gt; 관리자 권한 획득 가능.&lt;/p&gt;
&lt;p&gt;설정 완료 후 확인을 누르면 계정 생성 완료.&lt;/p&gt;
&lt;p&gt;그룹 생성은 그룹명만 입력하면 되기 떄문에 생략.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서비스 설정&lt;/h2&gt;
&lt;p&gt;기본적으로 사용하는 서비스를 설정.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bWzbLP/btqJ4GcrwHj/8ZR06dcK5uJ7fTulYLwsN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWzbLP/btqJ4GcrwHj/8ZR06dcK5uJ7fTulYLwsN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWzbLP/btqJ4GcrwHj/8ZR06dcK5uJ7fTulYLwsN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWzbLP%2FbtqJ4GcrwHj%2F8ZR06dcK5uJ7fTulYLwsN0%2Fimg.png&quot; width=&quot;100%&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;b&gt;서비스 &amp;rarr; Dynamic DNS&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/b839eM/btqJ4G4Cmeo/QcLhWvg7BIKdmNWXXTrnHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b839eM/btqJ4G4Cmeo/QcLhWvg7BIKdmNWXXTrnHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b839eM/btqJ4G4Cmeo/QcLhWvg7BIKdmNWXXTrnHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb839eM%2FbtqJ4G4Cmeo%2FQcLhWvg7BIKdmNWXXTrnHK%2Fimg.png&quot; width=&quot;100%&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;b&gt;DDNS&lt;/b&gt; 값을 적는다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ipTIME 공유기&lt;/b&gt;를 사용할 경우 &lt;b&gt;Provider&lt;/b&gt;는 비워두고 작성. 그외 다른 DDNS 서비스를 이용하는 경우 해당 서비스 업체를 찾아 선택.&lt;/p&gt;
&lt;p&gt;설정이 끝났다면, 서비스 메뉴에서 Dynamic DNS의 OFF를 ON으로 바꿔주면, DDNS 서비스가 활성화 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FTP 설정&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;서비스 &amp;rarr; FTP&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/sU2HM/btqJ911bLwe/oRK3HSACvm8bmoz9QGRVA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sU2HM/btqJ911bLwe/oRK3HSACvm8bmoz9QGRVA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sU2HM/btqJ911bLwe/oRK3HSACvm8bmoz9QGRVA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsU2HM%2FbtqJ911bLwe%2FoRK3HSACvm8bmoz9QGRVA0%2Fimg.png&quot; width=&quot;100%&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;b&gt;포트:&lt;/b&gt; 기본 값 또는 원하는 값 입력.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;클라이언트:&lt;/b&gt; 최대 동시 접속 수.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;접속:&lt;/b&gt; IP 주소별 최대 접속수(0=무한대).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;로그인 시도:&lt;/b&gt; 접속이 차단 되기 전 최대로 허용되는 로그인 시도 수.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시간초과:&lt;/b&gt; 최대 대기 시간.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;루트 로그인 허용하기:&lt;/b&gt; 관리자로 로그인하려면 체크.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Allow Anonymous Login:&lt;/b&gt; 체크 시 익명 사용자 로그인 가능.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Path:&lt;/b&gt; 익명 로그인시 보여지는 루트 디렉터리를 설정. 예를 들어 &lt;code&gt;/mnt/zpool/anoyftp&lt;/code&gt;로 지정했다면, 익명으로 로그인시 &lt;code&gt;/mnt/zpool/anoyftp&lt;/code&gt; 디렉터리로 로그인하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Allow Local User login:&lt;/b&gt; 체크 시 계정 사용자만 로그인 가능. 여길 체크하면 Allow Anonymous Login은 체크 해제 해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Display Login:&lt;/b&gt; 로그인시 보여지는 메시지를 입력. 익명으로 로그인한 경우에는 보이지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Allow Transfer Resumption:&lt;/b&gt; 체크 시 Winscp 등의 클라이언트를 이용하여 파일을 전송하다 중단될 경우, 이어서 전송할 수 있도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Always Chroot:&lt;/b&gt; 체크 시 wheel 그룹(root 그룹)에 속하지 않은 계정 사용자 들이 자신의 홈 디렉터리를 벗어나지 못하도록 한다. 예를 들어 nyebo 계정이 있고 이 계정의 홈 디렉터리가 &lt;code&gt;/mnt/zpool/nyebo&lt;/code&gt; 일 경우, ftp로 로그인하면 그 상위 디렉터리인 &lt;code&gt;/mnt/zpool/&lt;/code&gt;로 접속할 수 없게된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Perform Reverse DNS Lookups:&lt;/b&gt; 체크 시 IP Address의 DNS 역방향 조회를 허용한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Masquerade address:&lt;/b&gt; 리눅스 호스트의 공식 IP를 이용해 자신은 그 안에 숨어서 접속하는 건데, 기본 값은 체크해제.&lt;/p&gt;
&lt;p&gt;FTP 설정이 끝났다면,&lt;/p&gt;
&lt;p&gt;서비스에서 FTP 서비스를 ON으로 바꾸면 FTP를 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSH 설정&lt;/h2&gt;
&lt;p&gt;FreeNAS에서 SSH를 사용할 일은 많지 않지만, 한번씩 필요한 경우가 있다.&lt;/p&gt;
&lt;p&gt;SSH 서비스를 계속 ON으로 두면, 외부로부터의 접속 시도가 잦다. 따라서 평소에는 끄고, 필요할 때에만 활성화시켜 사용하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;서비스 &amp;rarr; SSH&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/PiPKj/btqJZnZgdal/oAMA3BcmKfRDcKOleYtZhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PiPKj/btqJZnZgdal/oAMA3BcmKfRDcKOleYtZhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PiPKj/btqJZnZgdal/oAMA3BcmKfRDcKOleYtZhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPiPKj%2FbtqJZnZgdal%2FoAMA3BcmKfRDcKOleYtZhK%2Fimg.png&quot; width=&quot;100%&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;b&gt;TCP 포트:&lt;/b&gt; 보안을 위해 다른 번호로 변경.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Root의 암호로 로긴:&lt;/b&gt; 체크 시 Putty 등의 클라이언트로 SSH 접속할때 패스워드 만으로 root로 로그인을 할 수 있다. 체크 해제하면 패스워드로 로그인이 불가능하며 공개 키(public key)를 사용해서만 로그인할 수 있다. 체크.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Allow Password Authentication:&lt;/b&gt; 체크 해제하면 모든 유저가 공개 키를 사용해야 로그인 할 수 있다. 체크 해제.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;TCP Port Forwading:&lt;/b&gt; 포트포워딩 허용. 여기서는 체크해제 하고 공유기에서 포트포워딩 설정.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Compress connections:&lt;/b&gt; 데이터 전송시 압축.&lt;/p&gt;
&lt;p&gt;SSH 설정이 끝나면, 마찬가지로 서비스에서 SSH 서비스를 ON으로 바꾸면 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CIFS 설정&lt;/h2&gt;
&lt;p&gt;CIFS는 윈도우 상에서 네트워크 드라이브를 통해 FreeNAS로 접속할 수 있도록 도와준다.&lt;/p&gt;
&lt;p&gt;Unix는 UFS를 활성하하면 되고,&lt;/p&gt;
&lt;p&gt;MAC 유저는 CIFS가 아닌 Apple AFP를 설정하면 된다. AFP 설정은 CIFS에 비해 간단하므로 생략한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;서비스 &amp;rarr; CIFS&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bt1MbX/btqJ93Ls0Xl/gKYBkraGu91w7R9vOJimU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt1MbX/btqJ93Ls0Xl/gKYBkraGu91w7R9vOJimU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt1MbX/btqJ93Ls0Xl/gKYBkraGu91w7R9vOJimU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt1MbX%2FbtqJ93Ls0Xl%2FgKYBkraGu91w7R9vOJimU0%2Fimg.png&quot; width=&quot;100%&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;b&gt;넷바이오스 명:&lt;/b&gt; 네트워크 드라이브 상에서 보여질 이름.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;워크그룹:&lt;/b&gt; 기본 값 또는 사용중인 환경에 맞게 설정.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;설명:&lt;/b&gt; 서버에 대한 설명.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DOS 문자셋, 유닉스 문자셋:&lt;/b&gt; 기본 값&lt;/p&gt;
&lt;p&gt;&lt;b&gt;로그 레벨, Use syslog:&lt;/b&gt; 로그(log)를 사용하고 싶다면 use syslog에 체크하고, 레벨을 설정.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;파일 마스크, 디렉터리 마스크:&lt;/b&gt; 파일 또는 디렉터리 생성시 어떻게 권한을 설정할 것인지 정한다. 기본 값은 파일 마스크는 0666, 디렉터리 마스크는 0777로 적용.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;EA 지원:&lt;/b&gt; 체크 시 Extended Attribute 활성화.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;도스 파일 속성 지원:&lt;/b&gt; 체크하면 owner가 아니어도 파일에 대한 수정권한을 허용.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;빈 암호 허용:&lt;/b&gt; 체크 시 패스워드를 입력하지 않고 엔터만으로 진입 가능하다. 단, 사용중인 윈도우 계정이 FreeNAS 계정의 username과 password가 일치하여야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;보조 지정자들:&lt;/b&gt; smb.conf 외에 추가로 옵션을 줄 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;홈 디렉터리 활성화, 홈 디렉터리:&lt;/b&gt; 경로를 지정하면 그 위치에 homes 디렉터리 생성.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;홈 디렉터리 브라우징 활성화:&lt;/b&gt; 체크 시 네트워크 상에 이름이 본인다. 체크 해제하면 직접 주소를 쳐서 들어가야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Homes auxiliary parameters:&lt;/b&gt; homes 디렉터리에 대해 옵션 설정. 예를 들어 hide dot files = yes 라고 적으면 홈 디렉터리안의 마침표가 있는 파일(.aaa) 을 숨긴다.&lt;/p&gt;
&lt;p&gt;설정이 끝났다면 확인을 누른다.&lt;/p&gt;
&lt;p&gt;CIFS에 대한 설정이 끝났으니 이제 공유 할 디렉터리를 지정해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;공유 &amp;rarr; Windows (CIFS) Shares &amp;rarr; Windows (CIFS) Share을(를) 추가하기&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/ees1Nm/btqJ4GKhyjy/8cyGitKelNiKrhS04twLa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ees1Nm/btqJ4GKhyjy/8cyGitKelNiKrhS04twLa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ees1Nm/btqJ4GKhyjy/8cyGitKelNiKrhS04twLa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fees1Nm%2FbtqJ4GKhyjy%2F8cyGitKelNiKrhS04twLa1%2Fimg.png&quot; width=&quot;100%&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;b&gt;Name:&lt;/b&gt; 네트워트 상에서 보여질 이름.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;주석:&lt;/b&gt; 공유할 디렉터리에 대한 설명&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Path:&lt;/b&gt; 공유할 디렉터리를 지정. 여기서는 전 글에서 생성한 media를 선택.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Export Read Only:&lt;/b&gt; 체크 시 읽기전용.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Browsable to Netword Clients:&lt;/b&gt; 체크 시 네트워크 상에 이름이 본인다. 체크 해제하면 직접 주소를 쳐서 들어가야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Inherit Owner:&lt;/b&gt; 체크 시 파일과 디렉터리를 새로 생성할 때 상위 디렉터리로부터 ownership(소유권)을 상속받는다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Inherit Permissions:&lt;/b&gt; 체크 시 파일과 디렉터리를 새로 생성할 때 상위 디렉터리로부터 permission(권한)을 상속받는다. 주의할 점은 만약 윈도우 상의 볼륨 권한이 Type of ACL(접근제어목록)로 설정되어 있다면 체크 해제해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Inherit ACLs:&lt;/b&gt; ACL을 상속.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Export Recycle Bin:&lt;/b&gt; 체크 시 파일 삭제 대신, .recycle이라는 숨겨진 디렉터리로 이동.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Show Hidden Files:&lt;/b&gt; 체크 시 숨김 파일(.으로 시작하는 파일)을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Allow Guest Access:&lt;/b&gt; 체크 시 Guest의 접근을 허용.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Only Allow Guest Access:&lt;/b&gt; 오직 Guest로만 접속하도록 강제. Allow Guest Access가 체크되어 있어야 한다.&lt;/p&gt;
&lt;p&gt;만약 잘 모르겠으면 기본 값으로 두고 name과 path만 설정.&lt;/p&gt;
&lt;p&gt;이제 공유 디렉터리인 media의 권한을 설정해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;스토리지 &amp;rarr; media 디렉터리 &amp;rarr; Change Permissions&lt;/b&gt; 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/c38nuP/btqJXVIGkOJ/0UzK4Xsnh2ubOBvaRQExjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c38nuP/btqJXVIGkOJ/0UzK4Xsnh2ubOBvaRQExjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c38nuP/btqJXVIGkOJ/0UzK4Xsnh2ubOBvaRQExjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc38nuP%2FbtqJXVIGkOJ%2F0UzK4Xsnh2ubOBvaRQExjk%2Fimg.png&quot; width=&quot;100%&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;code&gt;/mnt/zpool/media&lt;/code&gt; 디렉터리는 &lt;b&gt;wheel 그룹&lt;/b&gt;에 속한 &lt;b&gt;root&lt;/b&gt;에게 사용 권한이 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Owner&lt;/b&gt;인 &lt;b&gt;root&lt;/b&gt;는 &lt;code&gt;Read(읽기), Write(쓰기), Execute(실행)&lt;/code&gt; 전부 가능하며,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Group&lt;/b&gt;인 &lt;b&gt;wheel 그룹&lt;/b&gt;에 속한 사용자는 &lt;code&gt;읽기&lt;/code&gt;와 &lt;code&gt;쓰기&lt;/code&gt;만을,&lt;/p&gt;
&lt;p&gt;나머지 &lt;b&gt;Other&lt;/b&gt; 역시 &lt;code&gt;읽기&lt;/code&gt;와 &lt;code&gt;쓰기&lt;/code&gt;만 가능하다.&lt;/p&gt;
&lt;p&gt;여기서 나오는 &lt;b&gt;소유자(Owner)&lt;/b&gt;와 &lt;b&gt;권한(Permission)&lt;/b&gt;은 매우 중요하다.&lt;/p&gt;
&lt;p&gt;흔히들 말하는 퍼미션 644, 퍼미션 755 등이 이것을 말하는 것이다.&lt;/p&gt;
&lt;p&gt;숫자로 표현하는 방법은 간단한데,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;읽기는 4, 쓰기는 2, 실행은 1&lt;/b&gt; 이며, 체크한 숫자를 더하면 된다.&lt;/p&gt;
&lt;p&gt;따라서 위의 경우는 755가 되는 것이다.&lt;/p&gt;
&lt;p&gt;Unix나 리눅스 기반의 OS를 사용할때,&lt;/p&gt;
&lt;p&gt;접근이 불가하거나, 복사가 안되거나, 디렉터리 등을 생성하지 못하는 등.&lt;/p&gt;
&lt;p&gt;일반적으로 접하는 대부분의 문제는 권한/소유자 문제일 경우가 대부분이니 잘 확인해야한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Type of ACL:&lt;/b&gt; 기본 값인 UNIX로 선택하면 위에서 설정한 권한을 따르고, Windows/Mac을 선택하면 해당 OS의 권한설정에 따른다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Set permission recursively:&lt;/b&gt; 체크 시 이전에 설정한 권한도 새로 설정한 권한으로 바꾼다. 권한을 변경할때마다 체크.&lt;/p&gt;
&lt;p&gt;media 디렉터리의 권한 설정 끝났다면 윈도우에서 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;탐색기로 들어가서 왼쪽 패널에서 네트워크를 선택.&lt;/p&gt;
&lt;p&gt;네트워크 상에서 CIFS를 설정할때 적었던 넷바이오스 명으로 된 네트워크를 볼 수 있을 것이다.&lt;/p&gt;
&lt;p&gt;이 때, 게스트를 허용하였으면 바로 목록이 뜨겠지만,&lt;/p&gt;
&lt;p&gt;그렇지 않을 경우, 계정과 패스워드를 입력해야 접속할 수 있다.&lt;/p&gt;
&lt;p&gt;Media 디렉터리에 접속된다면 성공이다.&lt;/p&gt;
&lt;p&gt;사용하는 방법은 일반적인 탐색기에서 사용하는 방법과 동일하다.&lt;/p&gt;
&lt;p&gt;드래그앤드롭으로 파일을 복사할 수도 있고,&lt;/p&gt;
&lt;p&gt;문서 작업시 저장위치를 여기로 지정하여 사용할 수도 있다.&lt;/p&gt;
&lt;p&gt;만약 매번 접속해야 하는 것이 귀찮다면,&lt;/p&gt;
&lt;p&gt;Media 디렉터리에서 오른쪽 클릭 후 네트워크 드라이브 연결을 선택한다.&lt;/p&gt;
&lt;p&gt;그러면 창이 뜨는데, 마침을 눌러주면 C드라이브처럼 네트워크 드라이브가 자동 생성된다.&lt;/p&gt;
&lt;p&gt;이제 부팅할때 마다 자동으로 접속하여 편리하게 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;해제할때에는 마찬가지로 오른쪽 클릭 후 연결해제를 누르면 된다.&lt;/p&gt;
&lt;p&gt;만약, CIFS를 설정할 때 네트워크상에 보이지 않도록 설정하였다면 주소를 직접 입력해서 들어가야 한다.&lt;/p&gt;
&lt;p&gt;탐색기 네트워크에서 오른쪽 클릭 후 네트워크 드라이브 연결을 선택하며, 창이 뜬다.&lt;/p&gt;
&lt;p&gt;그러면 조금전과 달리 디렉터리 란이 비어있는데, 거기에 직접 주소를 입력해주면 된다.&lt;/p&gt;
&lt;p&gt;입력하는 방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\\server\share&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;server&lt;/b&gt;에 &lt;b&gt;넷 바이오스 명&lt;/b&gt;을 입력하면 되고,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;share&lt;/b&gt;에는 &lt;b&gt;CIFS에서 지정한 디렉터리명&lt;/b&gt;을 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;플러그인 설치&lt;/h2&gt;
&lt;p&gt;플러그인 설치하기에 앞서 먼저 FreeNAS의 Jail을 잘 이해해야 한다.&lt;/p&gt;
&lt;p&gt;간단히 설명하면 보안을 위해, 이름 그대로 감옥처럼 가상의 공간을 할당하여 각각 독립적(sub-system)으로 작동한다.&lt;/p&gt;
&lt;p&gt;물론 IP도 각각의 Jail마다 개별적으로 할당된다.&lt;/p&gt;
&lt;p&gt;Jail에 대한 것은 플러그인을 설치하다 보면 자연스럽게 알 수 있으므로, 플러그인 설치와 함게 설명한다.&lt;/p&gt;
&lt;p&gt;여기서는 FreeNAS에 포함된 플러그인 중에서 사람들이 가장 많이 사용하는 &lt;b&gt;Plex Media Server, Transmission&lt;/b&gt;을 설치한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex Media Server&lt;/h3&gt;
&lt;p&gt;Plex Media Server를 제일 먼저 설명하는 이유는, PLEX가 Jail과 관련하여 설명하기가 가장 좋기 때문이다.&lt;/p&gt;
&lt;p&gt;PLEX만 제대로 설치할 줄 알면 다른 플러그인도 쉽게 설치할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;플러그인 &amp;rarr; Plex Media Server &amp;rarr; Install &amp;rarr; 확인&lt;/b&gt; 선택.&lt;/p&gt;
&lt;p&gt;설치는 자동으로 진행된다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/lcaEq/btqJ1KNbEVE/whFhSGw1Bm9O6xzDYwL0Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcaEq/btqJ1KNbEVE/whFhSGw1Bm9O6xzDYwL0Gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcaEq/btqJ1KNbEVE/whFhSGw1Bm9O6xzDYwL0Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcaEq%2FbtqJ1KNbEVE%2FwhFhSGw1Bm9O6xzDYwL0Gk%2Fimg.png&quot; width=&quot;100%&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;서비스는 OFF 그대로 두고, 설정부터 한다.&lt;/p&gt;
&lt;p&gt;처음으로 설정해야 할 부분은 미디어가 저장될 저장소(디렉터리)를 지정해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Jails &amp;rarr; plexmediaserver_1 &amp;rarr; Add Storage 선택.&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bR2d4U/btqJ0nYYfnq/PP761pK783Dy8rXFKMLcEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR2d4U/btqJ0nYYfnq/PP761pK783Dy8rXFKMLcEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR2d4U/btqJ0nYYfnq/PP761pK783Dy8rXFKMLcEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR2d4U%2FbtqJ0nYYfnq%2FPP761pK783Dy8rXFKMLcEK%2Fimg.png&quot; width=&quot;100%&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;저장소 추가가 필요한 이유는 Jail 때문이다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/ycCKu/btqJXVaN8gq/c5ZficILYkpnEMudqCjZak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ycCKu/btqJXVaN8gq/c5ZficILYkpnEMudqCjZak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ycCKu/btqJXVaN8gq/c5ZficILYkpnEMudqCjZak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FycCKu%2FbtqJXVaN8gq%2Fc5ZficILYkpnEMudqCjZak%2Fimg.png&quot; width=&quot;100%&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;b&gt;Source&lt;/b&gt;에는 &lt;code&gt;/media&lt;/code&gt;를 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/oLdhJ/btqJWSrRBcr/W0aNpDTIuKAod4lkF4TCRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLdhJ/btqJWSrRBcr/W0aNpDTIuKAod4lkF4TCRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLdhJ/btqJWSrRBcr/W0aNpDTIuKAod4lkF4TCRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLdhJ%2FbtqJWSrRBcr%2FW0aNpDTIuKAod4lkF4TCRk%2Fimg.png&quot; width=&quot;100%&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;b&gt;Destination&lt;/b&gt;에도 &lt;code&gt;/media&lt;/code&gt;를 선택한다.&lt;/p&gt;
&lt;p&gt;같은 /media지만 자세히 보면 경로가 다르다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Source&lt;/b&gt;는 &lt;code&gt;/mnt/zpool/media&lt;/code&gt;이고, &lt;b&gt;Destination&lt;/b&gt;은 &lt;code&gt;/mnt/zpool/jails/plexmediaserver_1/media&lt;/code&gt;이다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/l97PJ/btqJWRGvNcn/OSWSeYLkfKn0fUEKrsK0F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l97PJ/btqJWRGvNcn/OSWSeYLkfKn0fUEKrsK0F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l97PJ/btqJWRGvNcn/OSWSeYLkfKn0fUEKrsK0F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl97PJ%2FbtqJWRGvNcn%2FOSWSeYLkfKn0fUEKrsK0F0%2Fimg.png&quot; width=&quot;100%&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;code&gt;/media&lt;/code&gt;가 생성된다.&lt;/p&gt;
&lt;p&gt;여기서 Destination의 /media는 Plex에서 사용하는 디렉터리이다.&lt;/p&gt;
&lt;p&gt;만약, 일반적인 상황이라면 Transmission으로 Plex의 media 디렉터리에 영상을 받으면, 이를 PLEX에서 바로 볼 수 있다. 하지만, Jail의 특성 상 transmission에서 곧바로 plex의 media 디렉터리로 접근할 수 없다.&lt;/p&gt;
&lt;p&gt;즉, Transmission 등을 통해 영상을 받더라고, 직접 /mnt/zpool/jails/plexmediaserver_1/media으로 영상 파일을 옮겨야 하는 불편함이 있다.&lt;/p&gt;
&lt;p&gt;이러한 불편함을 해결하기 위한 것이 방금 설정한 Source와 Destination이다.&lt;/p&gt;
&lt;p&gt;위에서 설정한 것을 설명하면,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Source에 있는 파일들을 Destination 폴더에서도 사용할 수 있도록 설정하라는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이제 Plex는 &lt;code&gt;/mnt/zpool/media&lt;/code&gt;의 디렉터리를 인식하게 되었다.&lt;/p&gt;
&lt;p&gt;/mnt/zpool/media는 Jail에 속한 디렉터리가 아니기 때문에,&lt;/p&gt;
&lt;p&gt;Transmission에서 /mnt/zpool/media로 영상을 받으면, 별다른 이동 없이 Plex에서도 이를 곧바로 인식한다.&lt;/p&gt;
&lt;p&gt;저장소 생성이 끝났으니, Plexmediaserver를 &lt;b&gt;ON&lt;/b&gt;시킨다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bkeNmG/btqJ91UqhUt/0Ko1sXO0Gr2dZrmyEMKPg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkeNmG/btqJ91UqhUt/0Ko1sXO0Gr2dZrmyEMKPg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkeNmG/btqJ91UqhUt/0Ko1sXO0Gr2dZrmyEMKPg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkeNmG%2FbtqJ91UqhUt%2F0Ko1sXO0Gr2dZrmyEMKPg1%2Fimg.png&quot; width=&quot;100%&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;PlexMediaServer를 실행시키면 창이 뜨는데,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Disable remote security&lt;/b&gt;를 &lt;b&gt;체크&lt;/b&gt;한다.&lt;/p&gt;
&lt;p&gt;체크를 하지 않으면, 외부에서 접속이 되지 않는다.&lt;/p&gt;
&lt;p&gt;here을 선택하면 창이 뜨면서 Plex에 접속된다.&lt;/p&gt;
&lt;p&gt;주의해야 할 점은,&lt;/p&gt;
&lt;p&gt;Plex에서 /mnt/zpool/media 디렉터리를 사용하기 위해서는 권한을 설정해줘야 하는데,&lt;/p&gt;
&lt;p&gt;기본값인 755로 두면 된다.&lt;/p&gt;
&lt;p&gt;문제는 이 media 디렉터리를 transmission에서도 같이 사용할 경우이다.&lt;/p&gt;
&lt;p&gt;Plex에서는 쓰기 권한이 필요없지만, transmission에서는 쓰기 권한이 필요하다.&lt;/p&gt;
&lt;p&gt;여기서 media 권한을 757또는 777로 줘야하는데, 보안의 문제가 생긴다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/RYxk0/btqJ6ca50WE/ddwGLsZ96OkxsEtDAKd7AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RYxk0/btqJ6ca50WE/ddwGLsZ96OkxsEtDAKd7AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RYxk0/btqJ6ca50WE/ddwGLsZ96OkxsEtDAKd7AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRYxk0%2FbtqJ6ca50WE%2FddwGLsZ96OkxsEtDAKd7AK%2Fimg.png&quot; width=&quot;100%&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;b&gt;Sticky bit&lt;/b&gt;을 사용한다.&lt;/p&gt;
&lt;p&gt;Sticky bit 권한이 부여된 디렉터리에 있는 파일들은 생성한 소유자와 root만 삭제할 수 있다.&lt;/p&gt;
&lt;p&gt;WinSCP에서 Sticky bit에 체크(drwxrwxrwt)하거나, SSH에서 1777로 권한을 주면 된다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Plex의 기본 포트는 32400이다. Plex 설정에서 수동으로 지정할 수도 있다. 포트포워드시 참고.&lt;br /&gt;다음무비와 네이버뮤직 에이전트 추가는 &lt;a href=&quot;https://forums.plex.tv/index.php/topic/75675-korean-movie-tv-music-metadata-agents/&quot;&gt;여기&lt;/a&gt;를 참고.&lt;br /&gt;Plex는 파일 네이밍이 중요하다. &lt;a href=&quot;https://oldwiki.plexapp.com/index.php?title=Media_Naming_and_Organization_Guide&quot;&gt;여기&lt;/a&gt;를 참고하여 파일 네이밍을 하면 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;한글 자막 관련&lt;/h4&gt;
&lt;p&gt;최신 버전의 Plex에서는 smi를 공식지원한다.&lt;/p&gt;
&lt;p&gt;아래 순서로 설정하면 smi자막을 사용할 수 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/HYxDo/btqJXWOqjE6/OxVgKCfclc8R59LUAjdJxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HYxDo/btqJXWOqjE6/OxVgKCfclc8R59LUAjdJxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HYxDo/btqJXWOqjE6/OxVgKCfclc8R59LUAjdJxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHYxDo%2FbtqJXWOqjE6%2FOxVgKCfclc8R59LUAjdJxk%2Fimg.png&quot; width=&quot;100%&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;b&gt;Local Media Assets&lt;/b&gt;을 최상위로 올린다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cOKkpX/btqJWR0RNBf/QhW6ARNjsjk06ftRgKQ480/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOKkpX/btqJWR0RNBf/QhW6ARNjsjk06ftRgKQ480/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOKkpX/btqJWR0RNBf/QhW6ARNjsjk06ftRgKQ480/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOKkpX%2FbtqJWR0RNBf%2FQhW6ARNjsjk06ftRgKQ480%2Fimg.png&quot; width=&quot;100%&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;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;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/WPPTQ/btqJ0o4Gv29/abIH7XYVkGif1hOpEjB3pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WPPTQ/btqJ0o4Gv29/abIH7XYVkGif1hOpEjB3pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WPPTQ/btqJ0o4Gv29/abIH7XYVkGif1hOpEjB3pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWPPTQ%2FbtqJ0o4Gv29%2FabIH7XYVkGif1hOpEjB3pK%2Fimg.png&quot; width=&quot;100%&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;Subtitle Edit&lt;a href=&quot;http://www.nikse.dk/subtitleedit&quot;&gt;(다운로드)&lt;/a&gt;를 실행시켜 자막을 불러온다.&lt;/p&gt;
&lt;p&gt;대부분의 한글자막은 인코딩이 949: 한국어로 선택되어 있다.&lt;/p&gt;
&lt;p&gt;이것을 &lt;b&gt;Unicode (UTF-8)&lt;/b&gt;로 바꾸고 저장한다.&lt;/p&gt;
&lt;p&gt;혹시 한글자막인데 Class에 ENCC로 표시된다면, 메모장으로 자막을 열어서 바꾸기 기능을 통해 ENCC를 KRCC로 바꿔주면 된다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Editplus나 notepad2 등으로 자막을 열면 인코딩이 ANSI임을 확인할 수 있다. 이때 인코딩을 UTF-8 Signature를 선택하고 저장한다.&lt;br /&gt;경험상, subtitle edit로 smi는 &lt;b&gt;srt&lt;/b&gt;로, 949:한국어는 &lt;b&gt;Unicode (UTF-8)&lt;/b&gt;로 변경했을때, 자막을 문제없이 잘 인식하였다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;영상과 자막을 같은 디렉터리에 올리고, 자막 파일 마지막에 .ko 또는 .kor을 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ABCD.ko.smi&lt;/code&gt;&lt;br /&gt;&lt;code&gt;ABCD.ko.srt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;업로드가 끝났다면 Plex로 이동하여 라이브러리 업데이트 또는 강제 새로고침을 한다.&lt;/p&gt;
&lt;p&gt;이 때 다음무비를 통해 한글 정보를 받아오는 것이 자막인식에 도움이 된다.&lt;/p&gt;
&lt;p&gt;(최초 라이브러리를 생성할때 에이전트를 다음무비로 선택해 놓으면 된다.)&lt;/p&gt;
&lt;p&gt;혹시 제대로된 정보를 가져오지 못한다면, 불일치 수정을 통하거나, 외국 에이전트를 활용한다.&lt;/p&gt;
&lt;p&gt;영상에 들어가 자막에 한국어(SMI) 가 뜬다면 성공이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Transmission&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;플러그인 &amp;rarr; Transmission 선택&lt;/b&gt;하여 설치.&lt;/p&gt;
&lt;p&gt;설치가 완료되면 Jails 메뉴에 &lt;b&gt;transmission_1이 생성&lt;/b&gt;되었는지 확인.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/cW5Qs2/btqJ8e0M1GC/UiJ0wVcKyiBx5VC8kdhaPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW5Qs2/btqJ8e0M1GC/UiJ0wVcKyiBx5VC8kdhaPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW5Qs2/btqJ8e0M1GC/UiJ0wVcKyiBx5VC8kdhaPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW5Qs2%2FbtqJ8e0M1GC%2FUiJ0wVcKyiBx5VC8kdhaPk%2Fimg.png&quot; width=&quot;100%&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;수정을 눌러서 transmission에 &lt;b&gt;할당된 IP&lt;/b&gt;를 확인&lt;/p&gt;
&lt;p&gt;여기서는 192.168.0.8로 할당되었다.&lt;/p&gt;
&lt;p&gt;다시 &lt;b&gt;플러그인 &amp;rarr; Transmission&lt;/b&gt;을 선택.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/WZCmK/btqJ0picMMO/YXXa6lOLLUpkzWR4Tox7y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WZCmK/btqJ0picMMO/YXXa6lOLLUpkzWR4Tox7y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WZCmK/btqJ0picMMO/YXXa6lOLLUpkzWR4Tox7y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWZCmK%2FbtqJ0picMMO%2FYXXa6lOLLUpkzWR4Tox7y1%2Fimg.png&quot; width=&quot;100%&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;b&gt;Watch Directory:&lt;/b&gt; 여기에 torrent파일을 넣으면 자동으로 다운을 시작.&lt;/p&gt;
&lt;p&gt;기본값 주소 &lt;code&gt;/usr/pbi/transmission-amd64/etc/transmission/home/Downloads&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;필요하다면 별도로 장소를 지정. 기본값처럼 Download 디렉터리와 동일한 곳으로 설정하는게 편리하다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;configuration Directory:&lt;/b&gt; 설정 파일 경로.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Download Directory:&lt;/b&gt; 다운받을 경로.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/zqflg/btqJ3hqsQMh/LM3gM7zQaA0fTG4TIo1zs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zqflg/btqJ3hqsQMh/LM3gM7zQaA0fTG4TIo1zs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zqflg/btqJ3hqsQMh/LM3gM7zQaA0fTG4TIo1zs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzqflg%2FbtqJ3hqsQMh%2FLM3gM7zQaA0fTG4TIo1zs1%2Fimg.png&quot; width=&quot;100%&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;기본값은 watch와 동일한 /usr/pbi/transmission-amd64/etc/transmission/home/Downloads 인데,&lt;/p&gt;
&lt;p&gt;기본 주소를 그대로 설정하면, 경로가 총 88자를 넘어버려서 제대로 작동하지 않는다. 따라서 &lt;code&gt;/media&lt;/code&gt;로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Log file:&lt;/b&gt; 로그 저장 경로&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RPC/WebUI Enabled:&lt;/b&gt; 체크 해제하면 웹상으로 접속할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RPC Port:&lt;/b&gt; 기본값 9091.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RPC Auth. Required:&lt;/b&gt; 체크하면 웹상에서 Transmission 접속시 ID와 PW를 물어본다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RPC Username / Password:&lt;/b&gt; 체크 시 여기에 적은 ID와 PW로만 접속이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RPC Whitelist Enabled:&lt;/b&gt; 위 계정 외에 별도로 접속 허가가 필요한 경우 체크하고,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;RPC Whitelist:&lt;/b&gt; 여기서 접속을 허가할 계정을 적으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Peer port:&lt;/b&gt; 기본값 51413.&lt;/p&gt;
&lt;p&gt;설정이 끝났다면,&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/FLyi9/btqJZnkB0Cp/GAn3eIkQPPrSwENNE5NBdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLyi9/btqJZnkB0Cp/GAn3eIkQPPrSwENNE5NBdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLyi9/btqJZnkB0Cp/GAn3eIkQPPrSwENNE5NBdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLyi9%2FbtqJZnkB0Cp%2FGAn3eIkQPPrSwENNE5NBdK%2Fimg.png&quot; width=&quot;100%&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;b&gt;Add Storage&lt;/b&gt;를 눌러 저장소를 추가.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&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/bdKNrg/btqJ3iJEdyu/ijAtgUL1oKKOiJWUPSIxRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdKNrg/btqJ3iJEdyu/ijAtgUL1oKKOiJWUPSIxRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdKNrg/btqJ3iJEdyu/ijAtgUL1oKKOiJWUPSIxRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdKNrg%2FbtqJ3iJEdyu%2FijAtgUL1oKKOiJWUPSIxRK%2Fimg.png&quot; width=&quot;100%&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;Destination 디렉터리의 경우, Plex와 같은 디렉터리를 사용하려면 media를,&lt;/p&gt;
&lt;p&gt;별도의 디렉터리를 사용하고 싶은 경우에는 스토리지에서 디렉터리를 생성한 후 선택.&lt;/p&gt;
&lt;p&gt;확인을 누르면 저장소 설정이 완료된다..&lt;/p&gt;
&lt;p&gt;앞으로 토렌트로 파일을 받는 경우 media 디렉터리에 저장된다.&lt;/p&gt;
&lt;p&gt;플러그인에서 Transmission을 ON하고,&lt;/p&gt;
&lt;p&gt;아까 확인한 IP주소:9091(192.168.0.8:9091)로 들어간다.&lt;/p&gt;
&lt;p&gt;화면이 뜬다면 제대로 설치 완료.&lt;/p&gt;
&lt;p&gt;이것으로 FreeNAS 설치부터 플러그인 설치까지 완료.&lt;/p&gt;</description>
      <category>IT</category>
      <category>FreeNAS</category>
      <category>Nas</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/66</guid>
      <comments>https://nyebo.tistory.com/entry/FreeNAS-9215-%EC%84%A4%EC%B9%98-%EB%A7%A4%EB%89%B4%EC%96%BC#entry66comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:30:32 +0900</pubDate>
    </item>
    <item>
      <title>교보문고 샘(sam) 0.0086 펌웨어 제작 가이드</title>
      <link>https://nyebo.tistory.com/entry/%EA%B5%90%EB%B3%B4%EB%AC%B8%EA%B3%A0-%EC%83%98sam-00086-%ED%8E%8C%EC%9B%A8%EC%96%B4-%EC%A0%9C%EC%9E%91-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2013년 3월 21일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HISTORY&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;[15. 2. 18]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;네이버 카페 디지털 감성 e북에 올렸던 글을,&lt;br /&gt;0.0086버전 루팅O, X 펌웨어 &lt;a href=&quot;http://cafe.naver.com/ebook/217140&quot;&gt;http://cafe.naver.com/ebook/217140&lt;/a&gt;&lt;br /&gt;루팅O, X 펌웨어 제작 가이드 &lt;a href=&quot;http://cafe.naver.com/ebook/220464&quot;&gt;http://cafe.naver.com/ebook/220464&lt;/a&gt;&lt;br /&gt;기록 보관 차원에서 블로그에도 올립니다.&lt;/p&gt;
&lt;!-- more --&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;/li&gt;
&lt;li&gt;별도의 &lt;b&gt;sign&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;update.zip에서 system.img 추출 -&amp;gt; system.img 마운트 -&amp;gt; 필요한 어플 복사 후 권한 설정 -&amp;gt; system.img 언마운트 -&amp;gt; update.zip에 새로만든 system.img 덮어쓰기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;준비물&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CentOS, Ubuntu 등의 Linux OS&lt;/li&gt;
&lt;li&gt;순정 0.0086 펌웨어 파일 &lt;a href=&quot;https://drive.google.com/file/d/0ByhJYZUuOjPQQmM4SHZlcHJKX00/view&quot;&gt;(다운로드)&lt;/a&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;&lt;b&gt;Zeam Launcher&lt;/b&gt;(Launcher2.apk)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Play Store&lt;/b&gt;(Vending.apk)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Maxthon Browser&lt;/b&gt;(mxbrowser.apk)&lt;/li&gt;
&lt;/ul&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;&lt;b&gt;SU&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SuperSU&lt;/b&gt;(SuperSU-v1.25.apk)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;root browser lite&lt;/b&gt;(com.jrummy.root.browserfree.apk)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;변경할 폰트 파일: &lt;b&gt;KoPub폰트&lt;/b&gt; &lt;a href=&quot;http://www.kopus.org/Biz/electronic/Font.aspx&quot;&gt;(다운로드)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제작 방법&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;윈도우&lt;/b&gt;에서 반디집 등의 압축 프로그램을 이용하여 순정 펌웨어 파일 &lt;b&gt;update.zip&lt;/b&gt;에서 &lt;b&gt;system.img&lt;/b&gt; 파일 추출. (리눅스에서 진행해도 상관없음.)&lt;/p&gt;
&lt;p&gt;리눅스에서 임시 디렉터리 생성&lt;b&gt;(/etc/sam, /etc/sam/system)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;mkdir -p /etc/sam/system&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;/etc/sam 디렉터리에 추출한 &lt;b&gt;system.img&lt;/b&gt; 파일과 펌웨어 제작에 필요한 파일 복사.&lt;/p&gt;
&lt;p&gt;system.img 파일을 system 디렉터리에 마운트.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;mount -o loop system.img /etc/sam/system&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;참고: SAM의 system.img 포맷은 ext2이므로, simg2img, make_ext4fs 등을 사용할 필요가 없습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;다운받은 kopub 폰트 중 &lt;b&gt;KoPubBatangBold.ttf&lt;/b&gt; 폰트를 &lt;b&gt;UnBatang.ttf&lt;/b&gt;로 이름 변경.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;mv KoPubBatangBold.ttf UnBatang.ttf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;변경 한 UnBatang.ttf를 &lt;b&gt;/etc/sam/system/fonts&lt;/b&gt; 디렉터리에 복사.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cp -av UnBatang.ttf /etc/sam/system/fonts/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;복사한 폰트 권한 설정.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;cd /etc/sam/system/fonts
chown root.root UnBatang.ttf
chmod 644 UnBatang.ttf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기본 적용 어플인 Zeam Launcher, Play Store, Browser 적용.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Launcher3.apk, Vending.apk, mxbrowser.apk&lt;/b&gt; 파일을 &lt;b&gt;system/app&lt;/b&gt; 디렉터리에 복사.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cd /etc/sam
cp -av Launcher3.apk /etc/sam/system/app
cp -av Vending.apk /etc/sam/system/app
cp -av mxbrowser.apk /etc/sam/system/app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;권한 설정.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;chown root.root Launcher3.apk
chown root.root Vending.apk
chown root.root mxbrowser.apk
chmod 644 Launcher3.apk
chmod 644 Vending.apk
chmod 644 mxbrowser.apk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;지금부터는 &lt;b&gt;&lt;i&gt;루팅 과정&lt;/i&gt;&lt;/b&gt;이므로, 루팅을 원하지 않는다면 아래의 &lt;b&gt;&lt;i&gt;system 파일 언마운트 과정&lt;/i&gt;&lt;/b&gt;으로 넘어갑니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;SuperSU-v1.25.apk, com.jrummy.root.browserfree.apk&lt;/b&gt; 파일을 &lt;b&gt;system/app&lt;/b&gt; 디렉터리에 복사.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;cd /etc/sam
cp -av SuperSU-v1.25.apk /etc/sam/system/app
cp -av com.jrummy.root.browserfree.apk /etc/sam/system/app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;권한 설정.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;cd /etc/sam/system/app
chown root.root SuperSu-v1.25.apk
chown root.root com.jrummy.root.browserfree.apk
chmod 644 SuperSu-v1.25.apk
chmod 644 com.jrummy.root.browserfree.apk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SU 파일을 &lt;b&gt;system/xbin&lt;/b&gt; 디렉터리에 복사.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cd /etc/sam
cp -av SU /etc/sam/system/xbin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;권한 설정&lt;/b&gt;을 마치면 루팅 적용이 완료된다.&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;cd /etc/sam/system/xbin
chown root.root SU
chmod 4755 SU&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;system.img 언마운트.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;umount /etc/sam/system&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;작업이 끝난 system.img 파일을 윈도우로 복사.&lt;/p&gt;
&lt;p&gt;반디집으로 순정 펌웨어 update.zip 파일을 열어 기존의 system.img 파일을 삭제 후, 펌웨어 작업을 완료한 system.img를 새로압축 추가하여 교체.&lt;/p&gt;
&lt;p&gt;생성된 update.zip을 SAM에 넣고 테스트하면 완료.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고 사이트&lt;br /&gt;&lt;a href=&quot;http://blog.naver.com/PostView.nhn?blogId=glorybeer&amp;amp;logNo=80176390228&quot;&gt;http://blog.naver.com/PostView.nhn?blogId=glorybeer&amp;amp;logNo=80176390228&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>IT</category>
      <category>Sam</category>
      <category>교보문고</category>
      <category>샘</category>
      <category>이북리더</category>
      <category>펌웨어</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/65</guid>
      <comments>https://nyebo.tistory.com/entry/%EA%B5%90%EB%B3%B4%EB%AC%B8%EA%B3%A0-%EC%83%98sam-00086-%ED%8E%8C%EC%9B%A8%EC%96%B4-%EC%A0%9C%EC%9E%91-%EA%B0%80%EC%9D%B4%EB%93%9C#entry65comment</comments>
      <pubDate>Sun, 4 Oct 2020 01:14:53 +0900</pubDate>
    </item>
    <item>
      <title>교보문고 샘(sam) 0.0086 펌웨어 및 폰트 교체</title>
      <link>https://nyebo.tistory.com/entry/%EA%B5%90%EB%B3%B4%EB%AC%B8%EA%B3%A0-%EC%83%98sam-00086-%ED%8E%8C%EC%9B%A8%EC%96%B4-%EB%B0%8F-%ED%8F%B0%ED%8A%B8-%EA%B5%90%EC%B2%B4</link>
      <description>&lt;hr /&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;이 포스팅은 &lt;b&gt;2013년 3월 2일&lt;/b&gt;에 작성된 예전 블로그 글을 새로이 옮긴 것입니다. 참고바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HISTORY&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;[15. 2. 18]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;네이버 카페 디지털 감성 e북에 올렸던 글을,&lt;br /&gt;0.0086버전 루팅O, X 펌웨어 &lt;a href=&quot;http://cafe.naver.com/ebook/217140&quot;&gt;http://cafe.naver.com/ebook/217140&lt;/a&gt;&lt;br /&gt;루팅O, X 펌웨어 제작 가이드 &lt;a href=&quot;http://cafe.naver.com/ebook/220464&quot;&gt;http://cafe.naver.com/ebook/220464&lt;/a&gt;&lt;br /&gt;기록 보관 차원에서 블로그에도 올립니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;b&gt;[13. 4. 1]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;SAM을 떠나보내면서 더이상 펌웨어 작업을 할 수 없게 되었습니다.&lt;br /&gt;다른 분께서 이어서 작업하실 수 있도록 펌웨어 제작 가이드를 남깁니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[13. 3. 20]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;새 펌웨어가 올라왔군요. 0.0082에서 0.0086으로 업그레이드 됐습니다.&lt;br /&gt;적용순서는 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;단말기 초기화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;순정 펌웨어 적용 (82버전 86버전 상관없음)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(루팅) 커스텀 펌웨어 적용&lt;/b&gt;&lt;/li&gt;
&lt;/ol&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;Launcher 어플&lt;/b&gt;을 실행하면 교보문고 &lt;b&gt;SAM 어플&lt;/b&gt;을 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;타 E-Book 어플은 실행이 될 수도 안 될 수도 있습니다.&lt;/li&gt;
&lt;li&gt;타 E-Book 어플은 자동 새로고침이 지원되지 않습니다. &lt;b&gt;수동으로 새로고침&lt;/b&gt;해야 합니다. (크레마의 refreshpie 앱 사용 불가)&lt;/li&gt;
&lt;li&gt;이전에 커스텀 펌웨어를 올린 적이 있다면, 반드시 &lt;b&gt;단말기 초기화 &amp;rarr; 순정 펌웨어 적용 &amp;rarr; 커스텀 펌웨어 적용&lt;/b&gt;의 순서로 진행하세요.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://service.iriver.co.kr/DownLoad/cs_Down.aspx&quot;&gt;순정 펌웨어 다운로드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;플레이스토어에서 해당 어플 삭제&lt;/li&gt;
&lt;li&gt;Zeam Launcher의 경우: 어플 서랍 &amp;rarr; 메뉴 키 &amp;rarr; Uninstall &amp;rarr; 삭제할 어플 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;런처 삭제 방법&lt;b&gt;(루팅 펌웨어만 가능)&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로 사용할 런처 설치 후 진입&lt;/li&gt;
&lt;li&gt;root browser lite 어플(또는 다른 파일 관리 어플) 실행&lt;/li&gt;
&lt;li&gt;system/app 디렉터리에서 이전 런처 파일 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Launcher Pro: com.fede.launcher-1.apk&lt;/li&gt;
&lt;li&gt;Zeam Launcher: Launcher2.apk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;바뀐 사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;0.0086버전 펌웨어&lt;/b&gt;로 교체&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zeam Launcher&lt;/b&gt;로 변경&lt;/li&gt;
&lt;li&gt;Google Browser에서 &lt;b&gt;Maxthon Browser&lt;/b&gt; 로 변경 (안드로이드북님의 게시글 참고 : &lt;a href=&quot;http://cafe.naver.com/ebook/219050&quot;&gt;http://cafe.naver.com/ebook/219050&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;루팅 펌웨어: root explorer 어플에서 &lt;b&gt;root browser lite&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;나눔고딕 &amp;rarr; KoPub 돋움체M&lt;/li&gt;
&lt;li&gt;나눔명조 &amp;rarr; KoPub 돋움체B&lt;/li&gt;
&lt;li&gt;은 돋음 &amp;rarr; KoPub 바탕체M&lt;/li&gt;
&lt;li&gt;은 바탕 &amp;rarr; KoPub 바탕체B&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;간단한 펌웨어 선택 가이드&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;루팅을 해야 할 유의미한 이유(폰트 변경 등)가 없다면, 루팅이 적용되지 않은 펌웨어를 사용하면 됩니다.&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;펌웨어 다운로드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순정 펌웨어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0ByhJYZUuOjPQZmdWZlFaT2liem8/view&quot;&gt;0.0082 펌웨어 다운로드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0ByhJYZUuOjPQQmM4SHZlcHJKX00/view&quot;&gt;0.0086 펌웨어 다운로드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0ByhJYZUuOjPQdUlzVUFsaGNHTEE/view&quot;&gt;루팅 적용 펌웨어 다운로드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0ByhJYZUuOjPQQnA2MmpoQS0xU3c/view&quot;&gt;루팅 미적용 펌웨어 다운로드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;펌웨어 적용 방법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다운받은 펌웨어 파일의 이름을 &lt;b&gt;update.zip&lt;/b&gt;으로 변경.&lt;/li&gt;
&lt;li&gt;SAM을 &lt;b&gt;이동식 디스크&lt;/b&gt;로 연결 후 &lt;b&gt;최상위 디렉터리(root)&lt;/b&gt;에 복사.&lt;/li&gt;
&lt;li&gt;PC 연결 해제 후, SAM 화면에 나타난 &lt;b&gt;펌웨어 업그레이드 확인&lt;/b&gt; 버튼 선택.&lt;/li&gt;
&lt;li&gt;재부팅 후 자동으로 펌웨어 업그레이드가 진행. 만약 재부팅이 되지 않을 경우, 하단 전원키를 5~10초 이상 눌러 수동으로 재부팅을 진행.&lt;/li&gt;
&lt;li&gt;약 10분 이상 기다리면 부팅 완료.&lt;/li&gt;
&lt;li&gt;런처 선택창에서 &lt;b&gt;'Zeam Launcher를 항상 사용'&lt;/b&gt;을 선택
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 런처(SAM Launcher)를 선택하며, Zeam Launcher로 진입할 수 없습니다. 이 경우 &lt;b&gt;단말기 초기화 후 다시 펌웨어를 적용&lt;/b&gt;해야함으로 주의바랍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;/li&gt;
&lt;li&gt;폰트를 변경하기 위해서는 항상 system 디렉터리의 남은 용량을 주의깊에 확인해야 합니다. 용량 확보를 위해 기존 폰트 파일을 제거한 후 새 폰트 파일을 넣는 것이 좋습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;루팅 펌웨어 system 디렉터리의 남은 용량: 4.5MB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;새 폰트 파일 복사 후 권한 설정을 해야합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;폰트 교체 방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폰트 파일은 system/fonts에 저장되어 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Clockopia.ttf&lt;/li&gt;
&lt;li&gt;DICFONT_DS.ttf&lt;/li&gt;
&lt;li&gt;DICFONT_KS.ttf&lt;/li&gt;
&lt;li&gt;DICFONT_U1000.ttf&lt;/li&gt;
&lt;li&gt;DICFONT_U1003.ttf&lt;/li&gt;
&lt;li&gt;DroidSans.ttf&lt;/li&gt;
&lt;li&gt;DroidSansArabic.ttf&lt;/li&gt;
&lt;li&gt;DroidSans-Bold.ttf&lt;/li&gt;
&lt;li&gt;DroidSansFallback.ttf&lt;/li&gt;
&lt;li&gt;DroidSansMono.ttf&lt;/li&gt;
&lt;li&gt;DroidSansThai.ttf&lt;/li&gt;
&lt;li&gt;DroidSerif-Bold.ttf&lt;/li&gt;
&lt;li&gt;DroidSerif-BoldItalic.ttf&lt;/li&gt;
&lt;li&gt;DroidSerif-Italic.ttf&lt;/li&gt;
&lt;li&gt;DroidSerif-Regular.ttf&lt;/li&gt;
&lt;li&gt;NanumGothic.ttf&lt;/li&gt;
&lt;li&gt;NanumMyeongjo.ttf&lt;/li&gt;
&lt;li&gt;UnBatang.ttf&lt;/li&gt;
&lt;li&gt;UnDotum.ttf&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;InterparkGothicMedium.ttf 파일의 이름을 NanumGothic.ttf로 변경.&lt;/li&gt;
&lt;li&gt;SAM을 PC에 연결 한 후, 변경한 폰트(NanumGothic.ttf)를 최상위 디렉터리(root)에 복사.&lt;/li&gt;
&lt;li&gt;SAM 연결 해제 후 root browser lite 실행.&lt;/li&gt;
&lt;li&gt;sdcard 디렉터리에서 방금 복사한 폰트 확인.&lt;/li&gt;
&lt;li&gt;폰트 파일을 길게 눌러 창을 띄운 후 Copy 선택.&lt;/li&gt;
&lt;li&gt;system/fonts 디렉터리에서 Paste 선택. 루트 권한을 물을 시 Yes 선택.&lt;/li&gt;
&lt;li&gt;덮어쓰기 여부를 물으면 Yes 선택.&lt;/li&gt;
&lt;li&gt;복사 가 완료되면, 다시 해당 폰트 파일을 길게 눌러 Permissions 메뉴 선택.&lt;/li&gt;
&lt;li&gt;Read는 전부 체크, Write는 첫 번째 Owner만 체크하고 나머지는 체크해제(740).&lt;/li&gt;
&lt;li&gt;재부팅 후 폰트 적용 확인.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT</category>
      <category>Sam</category>
      <category>교보문고</category>
      <category>샘</category>
      <category>이북리더</category>
      <category>펌웨어</category>
      <author>nyebo</author>
      <guid isPermaLink="true">https://nyebo.tistory.com/64</guid>
      <comments>https://nyebo.tistory.com/entry/%EA%B5%90%EB%B3%B4%EB%AC%B8%EA%B3%A0-%EC%83%98sam-00086-%ED%8E%8C%EC%9B%A8%EC%96%B4-%EB%B0%8F-%ED%8F%B0%ED%8A%B8-%EA%B5%90%EC%B2%B4#entry64comment</comments>
      <pubDate>Sat, 3 Oct 2020 15:24:10 +0900</pubDate>
    </item>
  </channel>
</rss>