<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>beom's 기술저장소</title>
    <link>https://beomdrive.tistory.com/</link>
    <description>  글을 통해 배운 것을 정리하고 지식을 공유합니다   
</description>
    <language>ko</language>
    <pubDate>Tue, 26 May 2026 23:08:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>기범_Alex</managingEditor>
    <image>
      <title>beom's 기술저장소</title>
      <url>https://tistory1.daumcdn.net/tistory/4721195/attach/dccf747a6e634069b0f964abd1f324f1</url>
      <link>https://beomdrive.tistory.com</link>
    </image>
    <item>
      <title>Spring Framework 6.0 출시가 임박..!?</title>
      <link>https://beomdrive.tistory.com/20</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  해당 카테고리의 글은 개인적인 궁금증을 좀 더 편하게 작성해보며, 글 작성 능력을 길러보기 위한 카테고리입니다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Framework 6.0이 RC1로 간다는 소식을 아래를 통해 접하게 되었다.&lt;/p&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://spring.io/blog/2022/10/12/spring-framework-6-0-goes-rc1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://spring.io/blog/2022/10/12/spring-framework-6-0-goes-rc1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665717255796&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Framework 6.0 goes RC1&quot; data-og-description=&quot;&amp;lt;p&amp;gt;Dear Spring community,&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;It is my pleasure to announce that a feature-complete Spring Framework 6.0 release candidate is &amp;lt;a href=&amp;quot;https://repo.spring.io/&amp;quot;&amp;gt;available&amp;lt;/a&amp;gt; now! We are expecting a further release candidate in time for the first Spring &quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/blog/2022/10/12/spring-framework-6-0-goes-rc1&quot; data-og-url=&quot;https://spring.io/blog/2022/10/12/spring-framework-6-0-goes-rc1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KTOOL/hyP9lsaudy/asXz19BIibMc5wVVXaspn1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=181_145_314_290,https://scrap.kakaocdn.net/dn/bIdy7X/hyP9i3hJwi/UomxgVtayO7Fo81MCroNU1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=181_145_314_290&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2022/10/12/spring-framework-6-0-goes-rc1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/blog/2022/10/12/spring-framework-6-0-goes-rc1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KTOOL/hyP9lsaudy/asXz19BIibMc5wVVXaspn1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=181_145_314_290,https://scrap.kakaocdn.net/dn/bIdy7X/hyP9i3hJwi/UomxgVtayO7Fo81MCroNU1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=181_145_314_290');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Framework 6.0 goes RC1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;p&amp;gt;Dear Spring community,&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;It is my pleasure to announce that a feature-complete Spring Framework 6.0 release candidate is &amp;lt;a href=&quot;https://repo.spring.io/&quot;&amp;gt;available&amp;lt;/a&amp;gt; now! We are expecting a further release candidate in time for the first Spring&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spring.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;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RC 1이 뭐지?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 5점 대도 잘 모르는데 벌써 6.0이라니.. 근데 저 RC 1은 뭘까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소프트웨어 배포 생명주기&lt;/b&gt;는 아래와 같은 순서로 이루어져 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2fWny/btrOAA5MtQ4/k5990w4ikSxWcIAokJCIQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2fWny/btrOAA5MtQ4/k5990w4ikSxWcIAokJCIQk/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/소프트웨어_배포_생명_주기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2fWny/btrOAA5MtQ4/k5990w4ikSxWcIAokJCIQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2fWny%2FbtrOAA5MtQ4%2Fk5990w4ikSxWcIAokJCIQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;476&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/소프트웨어_배포_생명_주기&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;RC는 Release candidate 단계로 마지막 제품이 될 가능성이 있는 시험판(Beta)으로, 상당한 버그가 나타나지 않으면 출시할 준비가 되었음을 의미한다고 한다.&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;아래 spring-framework 릴리즈 버전들을 보면 M(Mileston), RC(Release Candidate), GA(General Availability) 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-framework/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/spring-projects/spring-framework/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665718846942&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; spring-projects/spring-framework&quot; data-og-description=&quot;Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-framework/releases&quot; data-og-url=&quot;https://github.com/spring-projects/spring-framework/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FHRHJ/hyP9nKjaVt/1MankjV74KiI7KU6vBYM1k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-framework/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-framework/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FHRHJ/hyP9nKjaVt/1MankjV74KiI7KU6vBYM1k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Releases &amp;middot; spring-projects/spring-framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8449%;&quot;&gt;버전&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%;&quot;&gt;요약&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8449%;&quot;&gt;Mx (ex.M1, M6) : Mileston&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%;&quot;&gt;특정한 집합의 기능이 완성되자마자 공개한 버전&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;주요 기능 및 버그를 수정하는 단계로 불안정한 단계라고 볼 수 있다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8449%;&quot;&gt;RCx (ex. RC1) : Release Candidate&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%;&quot;&gt;특별한 큰 버그가 없는 한 출시 준비 완료 버전 (정식 출시 임박)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Preview release 버전이라고 불릴 정도로 마지막 제품이 될 가능성이 있는 최종 베타 버전이다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8449%;&quot;&gt;GA : General Availability&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%;&quot;&gt;정식 출시(Release)로써 다양한 매체를 통해 시장에서 이용 가능한 버전&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;대부분의 기능과 버그들이 안정화 된 버전으로써 필요한 모든 상업화 활동이 완료되어 시장에 배포되는 버전이다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇다면 Release 가 된 소프트웨어는 버저닝(Versioning)을 어떻게 할까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 보편적인 규칙으로는 &lt;b&gt;&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;.&amp;lt;patch&amp;gt;&lt;/b&gt; 로 이루어진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 의미는 다음과 같다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 12.7518%; height: 20px;&quot;&gt;버전&lt;/td&gt;
&lt;td style=&quot;width: 41.7055%; height: 20px;&quot;&gt;요약&lt;/td&gt;
&lt;td style=&quot;width: 45.5426%; height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 12.7518%; height: 20px;&quot;&gt;Major&lt;/td&gt;
&lt;td style=&quot;width: 41.7055%; height: 20px;&quot;&gt;기존 버전과 호환되지 않는 버전&lt;br /&gt;(대규모 업데이트)&lt;/td&gt;
&lt;td style=&quot;width: 45.5426%; height: 20px;&quot;&gt;하위 버전과 호환되지 않을 정도로 대대적인 변화가 일어나는 경우이다&lt;br /&gt;종종 들을 수 있는 &quot;대규모 업데이트&quot; 라는 것이 이에 해당된다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 12.7518%; height: 40px;&quot;&gt;Minor&lt;/td&gt;
&lt;td style=&quot;width: 41.7055%; height: 40px;&quot;&gt;기존 버전과 호환되면서 새로운 기능이 추가된 버전&lt;br /&gt;(기능 추가)&lt;/td&gt;
&lt;td style=&quot;width: 45.5426%; height: 40px;&quot;&gt;하위 버전과는 호환되는 버전으로 기존 기능들은 계속해서 사용할 수 있고, 새로운 기능이 추가될 때 minor 버전을 올린다&lt;br /&gt;또한 기존 기능들의 사용 방법이 변경 되었을 경우에도 이에 해당된다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 12.7518%; height: 40px;&quot;&gt;Patch&lt;/td&gt;
&lt;td style=&quot;width: 41.7055%; height: 40px;&quot;&gt;기존 버전과 호환되면서 버그를 수정한 버전&lt;br /&gt;(버그 수정, 성능 향상, 리팩토링 등)&lt;/td&gt;
&lt;td style=&quot;width: 45.5426%; height: 40px;&quot;&gt;웹 개발을 예로, 기존 클라이언트 단이 알아차리지 못할 정도로 백엔드 단의 내부적인 코드만 수정되었을 경우 patch 버전을 올린다&lt;br /&gt;또는 특정 기능의 버그를 fix하였을 때도 이에 해당된다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 6.0 출시가 임박한다길래 충격 먹으면서 문득 versioning이 궁금해져서 이것저것 알아보았다&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;다 쓰고 보니 또다시 충격이 몰려온다.. 기존 Spring도 제대로 사용해보지 못하고 있는데 기술은 날이 갈수록 발전하는구나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자 다시 공부하러 가보자..!&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  소중한 피드백 의견은 언제나 환영입니다 :)&lt;br /&gt;&lt;br /&gt; &amp;zwj;♂️ Call me&lt;br /&gt;Email : dev.gibeom@gmail.com&lt;br /&gt;KakaoTalk :&amp;nbsp;https://open.kakao.com/me/beomdrive&lt;/blockquote&gt;</description>
      <category>단순 끄적임..</category>
      <category>Spring 6.0</category>
      <category>Versioning</category>
      <category>배포</category>
      <category>버저닝</category>
      <category>버전</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/20</guid>
      <comments>https://beomdrive.tistory.com/20#entry20comment</comments>
      <pubDate>Fri, 14 Oct 2022 13:08:14 +0900</pubDate>
    </item>
    <item>
      <title>순차 리스트 &amp;amp; 연결 리스트</title>
      <link>https://beomdrive.tistory.com/18</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;  자료구조 카테고리의 글은 내용을 간단하게 압축시킨 정리본을 작성할 예정입니다&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;  CS 관련 더 많은 글과 자료는&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/tree/main/Computer-Science&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;All-Rounder-Storage, 성장하는 개발자들의 지식 창고&lt;/a&gt;에서&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt; 볼 수 있습니다 :)&lt;/span&gt;&lt;/span&gt;&lt;/span&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;순차리스트 (Array, ArrayList)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Array&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ArrayList&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;List의 인터페이스를 구현하므로 데이터의 &lt;b&gt;저장순서가 유지&lt;/b&gt;되고 &lt;b&gt;중복을 허용&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Object 배열을 이용해서 데이터를 순차적으로 저장
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null을 포함한 모든 요소 저장을 허용&lt;/li&gt;
&lt;li&gt;n개의 요소를 추가하려면 O(n) 시간이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;내부에서 &lt;b&gt;elementData(capacity)&lt;/b&gt;와 &lt;b&gt;size&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;elementData(capacity)&lt;/b&gt; : 배열의 총 용량&lt;/li&gt;
&lt;li&gt;&lt;b&gt;size&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;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;b&gt;맨 뒤&lt;/b&gt;의 위치에 데이터를 &lt;b&gt;추가&lt;/b&gt;하거나 &lt;b&gt;삭제&lt;/b&gt;하는것은 매우 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;순차적인 데이터 접근이 빠른 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 요소들이 연속적으로 메모리상에 저장되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 일일히 데이터 요소를 하나씩 찾아가는 것이 아닌 아래의 간단한 식 만으로도 위치 판별 가능&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;인덱스가 n인 데이터의 주소 = 배열의 주소 + n * 데이터 타입의 크기
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;용량이 꽉차서 용량을 늘려야 될 때는 &lt;b&gt;2배 더 큰 용량의 배열을 생성&lt;/b&gt;(size &amp;gt;&amp;gt; 1)하여 기존 배열로부터 &lt;b&gt;복사&lt;/b&gt;가 이루어져야 함 &amp;rarr; 효율 감소&lt;/li&gt;
&lt;/ul&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;하면 작업시간이 오래걸림 (시간복잡도: O(n))
&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;System.arraycopy()&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;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;중간에 있는 특정 범위의 값들을 삭제할때는 인덱스를 거꾸로(뒤 &amp;rarr; 앞) 가면서 삭제해야 함
&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;인덱스를 정방향(앞 &amp;rarr; 뒤)로 삭제할 경우 엉뚱한 값들이 삭제될 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2, 3, 4 인덱스를 삭제할 경우 &amp;rarr; 2, 4, 6 인덱스가 삭제될 듯&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연결 리스트 (LinkedList)&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;마찬가지로 List의 인터페이스를 구현하므로 데이터의 &lt;b&gt;저장순서가 유지&lt;/b&gt;되고 &lt;b&gt;중복을 허용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순차 리스트와 내부 구현방법만 다를 뿐 제공하는 기능은 거의 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이동 방향이 단방향이다&lt;/li&gt;
&lt;li&gt;배열과 다르게 불연속적으로 존재하는 데이터를 서로 &lt;b&gt;연결(link)&lt;/b&gt;한 형태&lt;/li&gt;
&lt;li&gt;각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Node {
    Node next;   // 다음 요소의 주소
    Object obj;  // 데이터
}
&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;해당 자료구조가 Java에서 사용되는 &lt;b&gt;LinkedList&lt;/b&gt; 이다&lt;/li&gt;
&lt;li&gt;단순히 &lt;b&gt;링크드 리스트&lt;/b&gt;에서 &lt;b&gt;이전 요소&lt;/b&gt;에 대한 &lt;b&gt;참조 변수를 추가&lt;/b&gt;한 형태&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Node {
    Node next;       // 다음 요소의 주소
    Node previous;   // 이전 요소의 주소
    Object obj;      // 데이터
}&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;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;b&gt;삭제&lt;/b&gt;가 매우 빠르다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 삭제하고자 하는 요소의 이전 요소가 다음 요소를 참조하도록 변경하면 됨&lt;/li&gt;
&lt;li&gt;배열처럼 복사해서 자리 이동시키는 행위가 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불연속적으로 위치한 각 요소들이 서로 연결(link)된 것이라 처음부터 n번째 데이터까지 차례대로 따라가면서 접근해야됨&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;주의점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 LinkedList가 중간 위치의 요소를 추가 및 삭제 하는것이 빠르다고들 하는데, 실제로 해당 요소의 위치까지 접근하는 시간이 O(n)이기 때문에 마냥 빠르다고만 할 수는 없음&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;순차 리스트(ArrayList) vs 연결 리스트(LinkedList)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;ArrayList&lt;/td&gt;
&lt;td&gt;&amp;nbsp;LinkedList&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;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;느리다 (copy &amp;rarr; 이동)&lt;/td&gt;
&lt;td&gt;빠르다 (접근 시간때문에 마냥 빠르진 않다)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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: url('../image/divider-line.svg') center -304px / 200px 420px no-repeat; width: 200px; height: 19px; padding: 18px 20px 17px;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArrayList의 중간 요소를 추가/삭제 하는것이 O(n)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LinkedList가 중간 요소를 추가/삭제하는 것이 시간 복잡도가 1이지만 실제로는 해당 요소까지 접근하는 것이 O(n)이다.&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;b&gt;용량을 넉넉하게 선언한 ArrayList&lt;/b&gt;를 사용하는 것이 제일 좋은 선택이며, &lt;b&gt;데이터 개수의 변경이 잦을 경우&lt;/b&gt;는 &lt;b&gt;LinkedList&lt;/b&gt;를 사용하는 것이 현명해 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  자료가 도움이 되셨다면 &lt;a href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/tree/main/Computer-Science&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;All-Rounder-Storage, 성장하는 개발자들의 지식 창고&lt;/a&gt;로 놀러오세요!&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&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.yes24.com/Product/Goods/24259565&quot;&gt;Java의 정석&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%A0%84%EA%B3%B5%EB%A9%B4%EC%A0%91-cs-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5&quot;&gt;개발자-전공면접-cs-완전정복&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;잘못된 내용이나, 보충할 내용이 있다면 언제든지 편하게 연락 주시면 감사하겠습니다 :)&lt;br /&gt;&lt;br /&gt; &amp;zwj;♂️ Call me&lt;br /&gt;Email : dev.gibeom@gmail.com&lt;br /&gt;KakaoTalk : https://open.kakao.com/me/beomdrive&lt;/blockquote&gt;</description>
      <category>Computer-Science/자료구조</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/18</guid>
      <comments>https://beomdrive.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 13 Oct 2022 23:46:19 +0900</pubDate>
    </item>
    <item>
      <title>로드 밸런싱, 그 속으로</title>
      <link>https://beomdrive.tistory.com/17</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  해당 글에서는 트래픽 분산기술인 로드 밸런싱에 대해서 알아봅니다&lt;br /&gt;  CS 관련 더 많은 글과 자료는&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/tree/main/Computer-Science&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;All-Rounder-Storage, 성장하는 개발자들의 지식 창고&lt;/a&gt;에서&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt; 볼 수 있습니다 :)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드 밸런싱을 알려면 우선 로드 밸런서에 대해서 알아보아야 합니다&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;로드 밸런서(Load Balancer)란?&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 예시와 같이 클라이언트에서 서버로부터의 요청은 로드 밸런서를 통해 각 서버로 전달됩니다&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGfGa/btrMWepUzjK/4tV79KYFtHOGee1NvMa2dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGfGa/btrMWepUzjK/4tV79KYFtHOGee1NvMa2dK/img.png&quot; data-alt=&quot;이미지 출처: https://naver.me/xor8AbSO&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGfGa/btrMWepUzjK/4tV79KYFtHOGee1NvMa2dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGfGa%2FbtrMWepUzjK%2F4tV79KYFtHOGee1NvMa2dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;284&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://naver.me/xor8AbSO&lt;/figcaption&gt;
&lt;/figure&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-로드-밸런서의-기본-기능&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%84%9C%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;로드 밸런서의 기본 기능&lt;/h2&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;a id=&quot;user-content-1-health-check-상태-확인&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#1-health-check-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;1. Health Check (상태 확인)&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;각 서버들의 장애 여부를 판단하여, 정상적으로 동작중인 서버로만 트래픽을 보내줍니다&lt;/li&gt;
&lt;li&gt;주로 하드웨어로 많이쓰는 로드밸런서는 L4와 L7 로써 아래와 같은 방식으로 체크합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;L4 체크 : TCP의 3-way handshaking 방식을 기반으로 각 포트의 상태를 체크합니다&lt;/li&gt;
&lt;li&gt;L7 체크 : 애플리케이션 계층에서 체크하므로 실제 웹 페이지에 통신을 시도하여 상태를 체크합니다&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-2-nat-network-address-translation&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#2-nat-network-address-translation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;2. NAT (Network Address Translation)&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위해 사용되는 방식입니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP 주소를 변환해주는 기능입니다&lt;/li&gt;
&lt;li&gt;공인 IP는 한정적인 수량이므로 IP 주소를 절약할 수 있는 동시에, 하위 서버의 내부적인 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;/ul&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;a id=&quot;user-content-nat의-종류&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#nat%EC%9D%98-%EC%A2%85%EB%A5%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;NAT의 종류&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 60px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style10&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;방식&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;흐름&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;SNAT (Source NAT)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;내부 &amp;rarr; 외부&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;내부 사설 IP 주소를 외부의 공인 IP 주소로 변환하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;DNAT (Destination NAT)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;외부 &amp;rarr; 내부&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;외부 공인 IP 주소를 내부의 사설 IP로 주소로 변환하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ukSPk/btrMTWda41s/cdbmgb0oyBbXNYVmKCVElk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ukSPk/btrMTWda41s/cdbmgb0oyBbXNYVmKCVElk/img.png&quot; data-alt=&quot;이미지 출처: https://www.stevenjlee.net/2020/07/11/이해하기-nat-network-address-translation-네트워크-주소-변환/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ukSPk/btrMTWda41s/cdbmgb0oyBbXNYVmKCVElk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FukSPk%2FbtrMTWda41s%2Fcdbmgb0oyBbXNYVmKCVElk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;286&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://www.stevenjlee.net/2020/07/11/이해하기-nat-network-address-translation-네트워크-주소-변환/&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-3-dsr-direct-server-return-or-direct-server-routing&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#3-dsr-direct-server-return-or-direct-server-routing&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;3. DSR (Direct Server Return or Direct Server Routing)&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;서버 &amp;rarr; 로드 밸런서로 가는 단계를 하나 줄여줌으로써 트래픽 부하를 줄여주는 장점이 있습니다&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;a id=&quot;user-content-4-tunneling&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#4-tunneling&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;4. Tunneling&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;즉 데이터 스트림을 가상의 파이프를 통해 전달시키는 기술입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터를 캡슐화해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;연결된 상호 간에만&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-5-알고리즘에-따른-분산-처리&quot; href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/blob/main/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#5-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B6%84%EC%82%B0-%EC%B2%98%EB%A6%AC&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;5. 알고리즘에 따른 분산 처리&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;1. Vertical Scale-Up&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Horizontal Scale-Out&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. Scale-up (스케일 업)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 자체의 성능을 업그레이드 시켜주는 방식입니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;즉 하나의 서버에 디스크를 추가하거나, CPU 혹은 메모리(Ram)를 업그레이드 시키는 등 한 서버 자체의 사양을 업그레이드 하는 방법을 말합니다&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn0bcv/btrMUGt4yEX/vhJcpl3P542WyBxJy6Zcp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn0bcv/btrMUGt4yEX/vhJcpl3P542WyBxJy6Zcp0/img.png&quot; data-alt=&quot;이미지 출처: https://liasn.tistory.com/2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn0bcv/btrMUGt4yEX/vhJcpl3P542WyBxJy6Zcp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn0bcv%2FbtrMUGt4yEX%2FvhJcpl3P542WyBxJy6Zcp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;240&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://liasn.tistory.com/2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-장점&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EC%9E%A5%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;장점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 추가적인 네트워크 연결이 필요 없으므로 인프라 설계가 쉽습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버를 추가하는 방법이 아니므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터 정합성 문제&lt;/b&gt;로부터 자유롭습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-단점&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%8B%A8%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 하나의 서버의 성능을 높이는 것엔 물리적인 한계가 발생할 수 밖에 없습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버 한대에 모든 부하가 집중되므로 장애 시, 해당 서버가 복구 되기 전까지는 서비스를 중단해야 하는 상황이 발생합니다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Scale-up의 방식은 한 대의 서버에서 모든 데이터를 처리하는 방식이므로, 데이터 갱신이 빈번하게 일어나는&amp;nbsp;데이터베이스 서버에 적합한 방식입니다&lt;/p&gt;
&lt;/blockquote&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;a id=&quot;user-content-2-scale-out-스케일-아웃&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#2-scale-out-%EC%8A%A4%EC%BC%80%EC%9D%BC-%EC%95%84%EC%9B%83&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;2. Scale-out (스케일 아웃)&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;즉 서버 한대에서 처리해야 할 트래픽을 여러대의 서버로 분산시키는 방식입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일반적으로 비슷한 사양이나 덜 좋은 사양의 서버를 추가로 연결합니다&lt;/li&gt;
&lt;li&gt;해당 방식에서 부하를 균등하게 나눠주는 &quot;로드밸런싱&quot;이라는 기술이 필수적으로 적용되어야 합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhvdlP/btrMVceW6ra/coE9M3DjYNV2m3dC6tkBN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhvdlP/btrMVceW6ra/coE9M3DjYNV2m3dC6tkBN0/img.png&quot; data-alt=&quot;이미지 출처: https://liasn.tistory.com/2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhvdlP/btrMVceW6ra/coE9M3DjYNV2m3dC6tkBN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhvdlP%2FbtrMVceW6ra%2FcoE9M3DjYNV2m3dC6tkBN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;175&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://liasn.tistory.com/2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-장점-1&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EC%9E%A5%EC%A0%90-1&quot; aria-hidden=&quot;true&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;서비스 중 서버 한대가 다운되더라도 다른 서버로 서비스 제공이 가능합니다&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;클라우드 서비스에서는 자원 사용량을 모니터링 하여 부하가 많을 경우 자동으로 서버를 증설(Scale-Out) 해주는 Auto Scaling 기능도 있습니다&lt;/li&gt;
&lt;/ul&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-단점-1&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%8B%A8%EC%A0%90-1&quot; aria-hidden=&quot;true&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;여러 대의 서버로 돌아가기 때문에&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;따라서 데이터의 일관성을 유지하기 위한 인프라 설계 및 관리가 복잡하고 어렵습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세션, 웹 이미지 등 서버에 저장되는 데이터를 어떤식으로 확장된 서버들에게도 공유해야할지 등에 대한 기술적인 한계가 존재합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Scale-out 방식은 대규모 서비스일 경우, 또는 모든 서버가 동일한 데이터를 가지고 있어야 하므로, 데이터 변화가 적은&amp;nbsp;웹 서버에 적합한 방식입니다&lt;/p&gt;
&lt;/blockquote&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;a id=&quot;user-content-정리-scale-up-vs-sclae-out&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EC%A0%95%EB%A6%AC-scale-up-vs-sclae-out&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;[정리] Scale-up vs Sclae-out&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 101.977%; height: 275px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Scale-up (Vertical)&lt;/td&gt;
&lt;td&gt;Scale-out (Horizontal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;- 데이터 정합성 처리 불필요&lt;br /&gt;- 관리 포인트 측면에서 관리가 쉬움&lt;br /&gt;- 단일 서버이므로 손쉽게 성능 향상 가능&lt;/td&gt;
&lt;td&gt;- 서버의 중단 없이 무제한 확장 가능&lt;br /&gt;- 유연하게 관리할 수 있어 가용성 증가&lt;br /&gt;- 부품에 의한 성능 향상의 한계가 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단점&lt;/td&gt;
&lt;td&gt;- 유연한 확장 불가능&lt;br /&gt;- 확장하려면 서버를 중단해야 함&lt;br /&gt;- 부품 업그레이드의 한계가 존재&lt;br /&gt;- 단일 서버에서 장애 발생 시 서비스 불가&lt;/td&gt;
&lt;td&gt;- 데이터 정합성 처리가 별도로 필요&lt;br /&gt;- 관리 포인트 증가&lt;br /&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;대규모 서비스일 경우, 데이터 변화가 적은 웹 서버에 적합한 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzuUHn/btrMUUexWvS/1jmOf8qD0sYdVwo4JbooGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzuUHn/btrMUUexWvS/1jmOf8qD0sYdVwo4JbooGk/img.png&quot; data-alt=&quot;이미지 출처: https://tech.gluesys.com/blog/2020/02/17/storage_3_intro.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzuUHn/btrMUUexWvS/1jmOf8qD0sYdVwo4JbooGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzuUHn%2FbtrMUUexWvS%2F1jmOf8qD0sYdVwo4JbooGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;803&quot; height=&quot;344&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://tech.gluesys.com/blog/2020/02/17/storage_3_intro.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이처럼 Scale-up 과 Scale-out의 각각의 장단점이 존재하므로 운영 중인 서비스에 맞게 합리적인 방식을 적용하는 것이 좋습니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 정합성 문제란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 계속 데이터 정합성 문제를 반복해서 말하고 있습니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 정합성 문제란 데이터가 일관되지 않는 문제를 말합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scale-out 방식에서 여러 대의 서버가 병렬적인 환경에서 돌아가므로, 각각의 모든 서버에 데이터를 일관되게 맞춰주는 방법이 필요합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;아래 사진은 구글링하다가 정합성이 훼손된 재밌는 예시가 있어 가져와보았습니다&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJp4Bz/btrMUSOABgl/2YeWkVVTHyRqukKpeQNCy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJp4Bz/btrMUSOABgl/2YeWkVVTHyRqukKpeQNCy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJp4Bz/btrMUSOABgl/2YeWkVVTHyRqukKpeQNCy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJp4Bz%2FbtrMUSOABgl%2F2YeWkVVTHyRqukKpeQNCy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;321&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&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;a id=&quot;user-content-데이터-정합성-문제를-해결하는-방법&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%95%ED%95%A9%EC%84%B1-%EB%AC%B8%EC%A0%9C%EB%A5%BC-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;데이터 정합성 문제를 해결하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scale-out을 통한 웹 서비스 상의 대표적인 데이터 정합성 문제는&lt;span&gt;&amp;nbsp;&lt;/span&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;사용자가 로그인을 Server 1번에서 진행하여 세션을 Server 1번에 저장해놨는데,&lt;br /&gt;다음 요청이 Server 2번을 통해 들어온다면 Server 2번에는 세션이 없어 다시 로그인해야 하는 문제가 생깁니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 정합성 이슈에 대한 해결책은 크게 3가지 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Sticky Session&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Session Clustering&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. In-memory Database&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &amp;nbsp;바쁘시다면!&lt;/td&gt;
&lt;td&gt;내용 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sticky Session&lt;/td&gt;
&lt;td&gt;- 세션을 최초로 생성한 서버로 요청이 고정되는 방식&lt;br /&gt;- 세션 공유 필요 없으므로 정합성 이슈 해결&lt;br /&gt;- 로드 밸런싱과 가용성 면에서 기능 저하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session Clustering&lt;/td&gt;
&lt;td&gt;- 세션이 생성될 때마다 복제하여 나머지 서버에 동기화 작업&lt;br /&gt;- 모든 서버의 세션이 존재하므로 정합성 이슈 해결&lt;br /&gt;- 매번 세션 객체를 복제하는데 오버헤드 발생 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session Storage&lt;/td&gt;
&lt;td&gt;- 세션 저장소를 분리하여 사용하는 방식&lt;br /&gt;- 각 서버에 세션 저장소에 대한 정보만 입력하면 세션 공유 가능하므로 서버의 확장에 유연하게 대처 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-1-sticky-session-서버-고정-방식&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#1-sticky-session-%EC%84%9C%EB%B2%84-%EA%B3%A0%EC%A0%95-%EB%B0%A9%EC%8B%9D&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;1. Sticky Session (서버 고정 방식)&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;첫 요청을 통해 한 서버에서 세션이 생성되었을 경우, 세션기간 동안 동일한 클라이언트의 요청은 로드 밸런서가 항상 같은 서버로만 전달하는 방식입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F9sjU/btrMWRIas7J/dzjKVKL6JuVAoraRoLUPh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F9sjU/btrMWRIas7J/dzjKVKL6JuVAoraRoLUPh1/img.png&quot; data-alt=&quot;이미지 출처: https://liasn.tistory.com/3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F9sjU/btrMWRIas7J/dzjKVKL6JuVAoraRoLUPh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF9sjU%2FbtrMWRIas7J%2FdzjKVKL6JuVAoraRoLUPh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;377&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://liasn.tistory.com/3&lt;/figcaption&gt;
&lt;/figure&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;a id=&quot;user-content-장점-2&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EC%9E%A5%EC%A0%90-2&quot; aria-hidden=&quot;true&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;여러 서버들끼리 세션 데이터를 교환할 필요가 없습니다&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;a id=&quot;user-content-단점-2&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%8B%A8%EC%A0%90-2&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 특정 서버에 부하가 집중될 수 있습니다 &amp;rarr; 로드 밸런싱의 이점 감소&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gy2J9/btrMVczfa7B/dNVH5WpXu8K8ArgamKw9xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gy2J9/btrMVczfa7B/dNVH5WpXu8K8ArgamKw9xk/img.png&quot; data-alt=&quot;이미지 출처: https://hyuntaeknote.tistory.com/6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gy2J9/btrMVczfa7B/dNVH5WpXu8K8ArgamKw9xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGy2J9%2FbtrMVczfa7B%2FdNVH5WpXu8K8ArgamKw9xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;381&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://hyuntaeknote.tistory.com/6&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 특정 서버에 과부하가 걸릴 경우, 로드 밸런서는 이를 감지해 다른 서버로 트래픽을 다시 라우팅합니다&lt;br /&gt;&amp;rarr; 결국 세션 유실&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AyoAT/btrMWSmLJRe/ej3VZz4cAgXG28vH9cqp90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AyoAT/btrMWSmLJRe/ej3VZz4cAgXG28vH9cqp90/img.png&quot; data-alt=&quot;이미지 출처: https://hyuntaeknote.tistory.com/6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AyoAT/btrMWSmLJRe/ej3VZz4cAgXG28vH9cqp90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAyoAT%2FbtrMWSmLJRe%2Fej3VZz4cAgXG28vH9cqp90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;373&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://hyuntaeknote.tistory.com/6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Sticky Session 방식은 세션의 데이터 정합성 문제는 해결할 수 있지만,&lt;br /&gt;Scale-out을 통한 트래픽 분산 효과와 서버 가용성을 제대로 사용할 수 없습니다&lt;/p&gt;
&lt;/blockquote&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;a id=&quot;user-content-2-session-clustering-tomcat&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#2-session-clustering-tomcat&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;2. Session Clustering (Tomcat)&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;구현 방식은 크게 두가지가 있습니다 (Tomcat 지원 기능)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DeltaManager : all-to-all 세션 복제 (4개 이하 클러스터)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;BackupManager : primary-secondary 세션 복제 (4개 이상 클러스터)&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-deltamanager--all-to-all-세션-복제&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#deltamanager--all-to-all-%EC%84%B8%EC%85%98-%EB%B3%B5%EC%A0%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;DeltaManager : all-to-all 세션 복제 (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;/li&gt;
&lt;li&gt;Tomcat 문서에서는 4개보다 더 많은 노드를 가지는 대규모 클러스터 환경에는 적용하지 않는 것을 권장합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S14Uh/btrMWecpe5v/JKdhjdca5Uq3mcN5FtNTSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S14Uh/btrMWecpe5v/JKdhjdca5Uq3mcN5FtNTSK/img.png&quot; data-alt=&quot;이미지 출처: &amp;amp;amp;nbsp; https://hyuntaeknote.tistory.com/6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S14Uh/btrMWecpe5v/JKdhjdca5Uq3mcN5FtNTSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS14Uh%2FbtrMWecpe5v%2FJKdhjdca5Uq3mcN5FtNTSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;335&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: &amp;amp;nbsp; https://hyuntaeknote.tistory.com/6&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-backupmanager--primary-secondary-세션-복제&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#backupmanager--primary-secondary-%EC%84%B8%EC%85%98-%EB%B3%B5%EC%A0%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;BackupManager : primary-secondary 세션 복제 (4개 이상 클러스터)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 세션 저장소에서 세션이 생성되면 세컨드 저장소(백업)에만세션값 전체를 복제하고, 나머지 저장소에는 세션 key인 JSESSION ID만을 복제하여 all-to-all 방식보다 메모리 사용을 줄일수 있는 방식입니다&lt;/li&gt;
&lt;li&gt;4개 이상의 대규모 클러스터에서 사용하기 용이한 방식입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J8zmN/btrMTLJEAXB/sh2EgIRSHTJb2GqxBRBqFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J8zmN/btrMTLJEAXB/sh2EgIRSHTJb2GqxBRBqFk/img.png&quot; data-alt=&quot;이미지 출처: https://hyuntaeknote.tistory.com/6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J8zmN/btrMTLJEAXB/sh2EgIRSHTJb2GqxBRBqFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ8zmN%2FbtrMTLJEAXB%2Fsh2EgIRSHTJb2GqxBRBqFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;407&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://hyuntaeknote.tistory.com/6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;하지만 세션 ID만 가지고 있는 서버로(Primary, Secondary가 아닌) 요청이 들어올 경우에는 Primary 서버에 세션 키를 통해 세션 객체를 받아와야 하는 작업이 발생하는 단점이 있습니다&lt;/blockquote&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;a id=&quot;user-content-3-in-memory-database&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#3-in-memory-database&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;3. Session Storage (In-memory Database)&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;따라서 Scale-out에 장점을 온전히 얻지 못하는 단점이 있습니다 (세션 정합성을 맞춰주기 위해)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세션 데이터를 각 서버들이 갖고있지 않고&amp;nbsp;외부로 분리하는 방식으로 Scale-out의 장점을 극대화하면서, 대용량 트래픽에 대응해 효율적이고 유연하게 확장시킬 수 있는 방식이 Session&amp;nbsp;Storage 방식입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7Er3w/btrMUFooAts/dJvhk1TICkcMDi7roszMdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7Er3w/btrMUFooAts/dJvhk1TICkcMDi7roszMdk/img.png&quot; data-alt=&quot;이미지 출처: https://liasn.tistory.com/3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7Er3w/btrMUFooAts/dJvhk1TICkcMDi7roszMdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7Er3w%2FbtrMUFooAts%2FdJvhk1TICkcMDi7roszMdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;386&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://liasn.tistory.com/3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-장점-3&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EC%9E%A5%EC%A0%90-3&quot; aria-hidden=&quot;true&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;세션을 별도의 저장소로 관리함으로써 데이터 정합성 문제 해결&lt;/li&gt;
&lt;li&gt;임의적으로 라우팅을 고정할 필요 없어 효과적인 로드 밸런싱에 유리 (Sticky Session 단점 해결)&lt;/li&gt;
&lt;li&gt;세션 정보의 복제 과정이 필요 없어 효율적인 메모리 관리 (Session Clustering 단점 해결)&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;user-content-in-memory-db-종류&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#in-memory-db-%EC%A2%85%EB%A5%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;In-memory DB 종류&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 스토리지의 종류로는 대표적으로 Redis와 Memcached가 사용됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style10&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;Memcached&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;- 다양한 자료구조 지원&lt;br /&gt;- 데이터 백업 및 복구 가능&lt;br /&gt;- 다양한 Eviction 결정 방식을 통해 메모리 공간 확보&lt;br /&gt;- Spring 공식 지원&lt;br /&gt;- 일반적으로 Read 성능이 더 좋음&lt;/td&gt;
&lt;td&gt;- Multi-Thread 제공&lt;br /&gt;- 효율적인 메모리 할당 방식을 통한 메모리 파편화 최소화&lt;br /&gt;- LRU 한 가지 방식만으로 메모리 공간 확보&lt;br /&gt;- 일반적으로 Write 성능이 더 좋음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 장단점을 고려하여 서비스에 맞는 기술을 선택하면 됩니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;로드 밸런싱이란? (Load Balancing)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Load(서버가 받는 요청, 부하) + Balancing(분산)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Scale-out 방식&lt;/b&gt;에서 로드 밸런서를 통해 클라이언트로부터 올라오는 모든&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;요청(부하)을 분산해주는 기술&lt;/b&gt;입니다&lt;/li&gt;
&lt;li&gt;로드 밸런싱의 알고리즘 중 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;a id=&quot;user-content-로드-밸런싱-알고리즘&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%8B%B1-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;로드 밸런싱 알고리즘&lt;/h3&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. 라운드로빈 방식 (Round Robin Method)&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&gt;&amp;nbsp;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 가중 라운드로빈 방식 (Weighted Round Robin Method)&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;하위 서버의 성능을 고려&lt;/b&gt;하여 트래픽의 양을 조절해줍니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;주로&lt;span&gt;&amp;nbsp;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;3. IP 해시 방식 (IP Hash Method)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트의 IP 주소를 특정 서버로 매핑(해싱)하여 요청을 처리하는 방식입니다&lt;/li&gt;
&lt;li&gt;이 방식은 사용자가&lt;span&gt;&amp;nbsp;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;4. 최소 연결 방식 (Least Connection Method)&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&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가장 연결상태가 적어&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;5. 최소 리스폰타임 (Least Response Time Method)&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&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;span&gt;&amp;nbsp;&lt;/span&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;&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&gt;&amp;nbsp;&lt;/span&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-하드웨어-구현방법&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EA%B5%AC%ED%98%84%EB%B0%A9%EB%B2%95&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;하드웨어 구현방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어를 통한 로드밸런싱 구현 방법에는 대표적으로 L4와 L7의 로드밸런서가 사용됩니다&lt;/li&gt;
&lt;li&gt;L4 로드밸런서와 L7 로드밸런서의 차이는 아래의 표로 확인해보겠습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/batDTG/btrMTExaTsW/pBJm9UYSjgpxRtuD7OGGKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/batDTG/btrMTExaTsW/pBJm9UYSjgpxRtuD7OGGKk/img.png&quot; data-alt=&quot;이미지 출처: 가비아 - 로드밸런서(Load Balancer)의 개념과 특징&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/batDTG/btrMTExaTsW/pBJm9UYSjgpxRtuD7OGGKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbatDTG%2FbtrMTExaTsW%2FpBJm9UYSjgpxRtuD7OGGKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;434&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: 가비아 - 로드밸런서(Load Balancer)의 개념과 특징&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;간단하게 L4와 L7 장비의 차이는 트래픽 분산을 할 때 그 로드밸런서가 어떤 메타 데이터의 어느 수준(범위)까지 분석해서 분산할지를 가장 큰 차이점으로 두는 것 같습니다&lt;br /&gt;또한 두 장비에 대한 속도적인 비교는 둘 다 장비 자체가 워낙 빠르기 때문에 비교 대상에는 포함되지 않습니다 (마이너한 기준)&lt;br /&gt;&lt;br /&gt;위의 내용에 추가로 L7 로드 밸런서는 특정한 패턴을 지닌 바이러스를 감지해 네트워크를 보호하는 기능이 있으므로, DDoS 같은 비정상적인 트래픽을 필터링하는 기능이 있어 네트워크 보안에 유리합니다&lt;/blockquote&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;하드웨어인 L4, L7 로드밸런서를 대신하여 reverse proxy 형태인 NginX, HAProxy 등의 로드 밸런서 애플리케이션을 활용하여 소프트웨어적으로도 구현할 수 있습니다&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;또한 Scale-out 방식에서 config 설정 파일만 수정하면 바로 적용시킬 수 있기 때문에 유연하고 쉬운 서버 관리가 가능합니다&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굉장히 많은 내용을 통해 로드밸런싱에 대해서 알아보았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국은 트래픽을 효과적으로 분산하는 방법을 통해 대량의 트래픽을 감당하기 위한 방법인데요&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;a id=&quot;user-content-로드-밸런서-자체가-문제가-있다면&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/10week/load_balancing/Computer-Science/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1/Alex/%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1.md#%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%84%9C-%EC%9E%90%EC%B2%B4%EA%B0%80-%EB%AC%B8%EC%A0%9C%EA%B0%80-%EC%9E%88%EB%8B%A4%EB%A9%B4&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;로드 밸런서 자체를 이중화하지 않은 단일 서버 상태라면 해당 장비 or 서버에 장애가 일어난다면 하위 서버는 모두 요청을 전달받지 못해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전체 서비스가 다운&lt;/b&gt;됩니다&lt;/li&gt;
&lt;li&gt;이 현상을 SPOF (Single Point of Failure)라고 부릅니다&lt;/li&gt;
&lt;li&gt;따라서 로드밸런서 자체에도 Scale-Out을 해줌으로써 이중화를 통한 안전성을 확보해야 합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로드밸런서의 확장은 일반적으로 Master-Slave 방식으로 구성됩니다&lt;/li&gt;
&lt;li&gt;평시에는 Master가 로드밸런서의 역할을 주로 수행하고 여분으로 Slave를 갖고있습니다&lt;/li&gt;
&lt;li&gt;Master에 장애 발생 시 여분인 Slave가 Master를 바로 위임받아 로드밸런서 역할을 바로 수행함으로써 서비스가 중단되지 않게 구성해주어야 합니다&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  자료가 도움이 되셨다면 &lt;a href=&quot;https://github.com/All-Rounder-Storage/programmers_knowledge_storage/tree/main/Computer-Science&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;All-Rounder-Storage, 성장하는 개발자들의 지식 창고&lt;/a&gt;로 놀러오세요!&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&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://youtu.be/kYipnodgi2I&quot;&gt;인프라 네트워크 - 로드밸런싱(Load Balancing)이란?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/9_6COPOMZvI&quot;&gt;로드 밸런싱이란? | 천상계 개발자가 되려면 이 정도는 알아야지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://m.post.naver.com/viewer/postView.naver?volumeNo=27046347&amp;amp;memberNo=2521903&quot;&gt;가비아 - 로드밸런서(Load Balancer)의 개념과 특징&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://junghyungil.tistory.com/15&quot;&gt;[Infra] 스케일 업(Scale-up) vs 스케일 아웃(Scale-out)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://souljit2.tistory.com/71#2&quot;&gt;분산 서버 환경의 세션 정합성 관리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://liasn.tistory.com/2&quot;&gt;서버의 확장? Scale up과 Scale out이란?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://liasn.tistory.com/3&quot;&gt;Scale out 확장 구조에서 Session 불일치 문제와 해결 방법&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hyuntaeknote.tistory.com/6&quot;&gt;다중 서버 환경에서 Session은 어떻게 공유하고 관리할까?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;잘못된 내용이나, 보충할 내용이 있다면 언제든지 편하게 연락 주시면 감사하겠습니다 :)&lt;br /&gt;&lt;br /&gt; &amp;zwj;♂️ Call me&lt;br /&gt;Email : dev.gibeom@gmail.com&lt;br /&gt;KakaoTalk : https://open.kakao.com/me/beomdrive&lt;/blockquote&gt;</description>
      <category>Computer-Science/네트워크</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/17</guid>
      <comments>https://beomdrive.tistory.com/17#entry17comment</comments>
      <pubDate>Sat, 24 Sep 2022 14:13:42 +0900</pubDate>
    </item>
    <item>
      <title>변수와 메서드, 그 속으로</title>
      <link>https://beomdrive.tistory.com/16</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  백엔드 관련 자료는 &lt;a href=&quot;https://github.com/giibeom/programmers_knowledge_storage/tree/main/Backend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Backend Wiki&lt;/a&gt;에서 PR을 통해 검증과 내용 보완을 거친 후 블로그로 이관되고 있습니다 :)&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;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;멤버 변수는 두가지로 나뉘어지는데, static이 붙어있으면 클래스 변수이고 붙지 않은것은 인스턴스 변수입니다
&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;변수 종류&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;생성 시기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;클래스 변수 (멤버 변수)&lt;/td&gt;
&lt;td&gt;static이 붙어있는 경우&lt;/td&gt;
&lt;td&gt;클래스가 메모리에 로딩될 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인스턴스 변수 (멤버 변수)&lt;/td&gt;
&lt;td&gt;static이 붙어있지 않은 경우&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;변수 선언문이 수행되었을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public class Study {
    
    int iv; // 인스턴스 변수
    static int cv;  // 클래스 변수 (static변수, 공유변수)

    void method() {
        int lv = 0; // 지역 변수
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;a id=&quot;user-content-인스턴스-변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;Person giibeom =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;new Person();&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인스턴스는 독립적인 저장 공간을 가지므로 각자 서로 다른 값을 가질 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;class Person {
    String name;
    static int eye;
}

// 참조변수 giibeom과 alex는 같은 Person 객체이지만 name은 서로 다른 값을 가진다 (다른 주소값)
Person giibeom = new Person();
giibeom.name = &quot;Myoung gibeom&quot;;

Person alex = new Person();
alex.name = &quot;Alex&quot;;&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;li&gt;인스턴스 변수는 직접 접근이 안되므로 인스턴스 생성 후 접근이 가능합니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1662400469858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Person myoung = new Person();
myoung.name = &amp;ldquo;gibeom&amp;rdquo;;&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;a id=&quot;user-content-클래스-변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;클래스 변수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 변수 선언은 인스턴스 변수 앞에 static을 붙이기만 하면 됩니다&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;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot; data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;Person.eye = 2;&lt;/span&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;&lt;a id=&quot;user-content-지역-변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%A7%80%EC%97%AD-%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;/li&gt;
&lt;li&gt;따라서 메서드가 종료되면({} 밖으로 벗어난 경우) 소멸되어 사용할 수 없습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;// add의 매개변수 x,y 와 minus의 매개변수 x,y는 서로 다른것이다!

int add(int x, int y) {
....
}

int minus(int x, int y) {
....
}&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;a id=&quot;user-content-이-상황에선-클래스-변수-or--인스턴스-변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%9D%B4-%EC%83%81%ED%99%A9%EC%97%90%EC%84%A0-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EC%88%98-or--%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;이 상황에선 클래스 변수? or 인스턴스 변수?&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;pre class=&quot;arduino&quot;&gt;&lt;code&gt;//   원카드, 포커 등을 할 수 있는 게임카드를 예시로 들어보자


// 카드의 속성: 무늬, 숫자, 폭, 높이, 재질

// 카드의 폭, 높이, 재질은 &quot;공통적인 부분&quot;이니 서로 공유하게끔 클래스 변수로 선언합니다
// 무늬와 숫자는 &quot;각자 고유한 값&quot;을 가져가야 하니 인스턴스 변수로 선언합니다
class Card {
    String kind;    // 무늬
    int number;     // 숫자
    static int width = 100;     // 폭
    static int height = 250;    // 높이
    static String material = &quot;plastic&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;&lt;a id=&quot;user-content-메서드&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;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;span&gt;&amp;nbsp;&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-메서드를-사용하는-이유&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;메서드를 사용하는 이유&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;메서드의 대표적인 장점 3가지에 대해서 알아봅시다&lt;/blockquote&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;a id=&quot;user-content-1-높은-재사용성reusability&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#1-%EB%86%92%EC%9D%80-%EC%9E%AC%EC%82%AC%EC%9A%A9%EC%84%B1reusability&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;1. 높은 재사용성(reusability)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미 우리는 Java API에서 제공하는 다양한 메서드들을 사용하면서 경험해본 적이 있습니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;java.lang 패키지 (String, Integer, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;java.util 패키지 (Arrays, Calendar, Date, Objects, StringTokenizer, &amp;hellip;)&lt;/li&gt;
&lt;/ul&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;a id=&quot;user-content-2-중복된-코드의-제거&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#2-%EC%A4%91%EB%B3%B5%EB%90%9C-%EC%BD%94%EB%93%9C%EC%9D%98-%EC%A0%9C%EA%B1%B0&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;2. 중복된 코드의 제거&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;ex) 로그용 System.out.println() 등등 &amp;hellip;&lt;/li&gt;
&lt;li&gt;물론 실무에서는 log 라이브러리를 사용해야 합니다&lt;/li&gt;
&lt;/ul&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-3-프로그램의-구조화&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#3-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%98-%EA%B5%AC%EC%A1%B0%ED%99%94&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;3. 프로그램의 구조화&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;이때 메서드를 통해 프로그램을 구조화 시킬 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6zpdW/btrLqcPfrQC/5lwqgQP5zKID3MnPkrfQS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6zpdW/btrLqcPfrQC/5lwqgQP5zKID3MnPkrfQS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6zpdW/btrLqcPfrQC/5lwqgQP5zKID3MnPkrfQS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6zpdW%2FbtrLqcPfrQC%2F5lwqgQP5zKID3MnPkrfQS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;475&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;위의 코드를 구조화하여 작성해보겠습니다&lt;br /&gt;위의 예제를 작업단위로 나누어서 메서드를 만들어보면 다음과 같습니다&lt;/blockquote&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// 위 사진(코드)의 구조화 적용 코드

public static void main(String[] args) {

    int[] numArr = new int[10];

    initArr(numArr);    // 1. 배열을 초기화
    printArr(numArr);   // 2. 배열을 출력
    sortArr(numArr);    // 3. 배열을 정렬
    printArr(numArr);   // 4. 배열을 출력

}&lt;/code&gt;&lt;/pre&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;a id=&quot;user-content-메서드의-선언과-구현&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%EC%84%A0%EC%96%B8%EA%B3%BC-%EA%B5%AC%ED%98%84&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;메서드의 선언과 구현&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드는 선언부(header, 머리)와 구현부(body, 몸통)로 이루어져 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;반환타입  메서드이름  (타입 변수명, 타입 변수명, ...)      --&amp;gt; 선언부
{
....         --&amp;gt; 구현부
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-메서드-선언부&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C-%EC%84%A0%EC%96%B8%EB%B6%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;메서드의 선언부는 3가지로 구성되어 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 메서드의 이름&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보통 동사로 많이 짓습니다&lt;/li&gt;
&lt;li&gt;메서드의 이름만으로도 어떤 기능인지 쉽게 알 수 있도록 함축적이면서도 의미있는 이름을 짓도록 노력해야 합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 매개변수 선언 (parameter declaration)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업을 수행하는데 제공 받아야 하는 필요한 입력 값들을 적습니다&lt;/li&gt;
&lt;li&gt;매개변수는 여러개가 될 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 반환타입 (return type)&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;반환타입이 void일 경우에는 아무것도 반환하지 않습니다&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;a id=&quot;user-content-메서드-구현부&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C-%EA%B5%AC%ED%98%84%EB%B6%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;해당 메서드 반환 타입이 void가 아닐 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;return 반환값;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 반드시 포함해야 합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환 타입이 void 이면 컴파일러가 메서드 마지막에&lt;span&gt;&amp;nbsp;&lt;/span&gt;return;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 자동적으로 추가해줍니다&lt;/li&gt;
&lt;li&gt;반환 값의 타입은 메서드 선언부의 반환 타입과 일치하거나,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자동 형변환이 가능한 것&lt;/b&gt;이여야 합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// 반환값인 result가 반환타입인 double와 동일하거나 double로 자동 형변환이 되는 타입이어야 한다
// 반환 타입: double,  반환값: int(int -&amp;gt; double 자동 형변환 가능)

double add(int x, int y) {
    int result = x + y;
    return result;
}&lt;/code&gt;&lt;/pre&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;a id=&quot;user-content-메서드의-호출&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%ED%98%B8%EC%B6%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;메서드의 호출&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드는 매개변수(인자)와 일치하는 &amp;lsquo;인수(argument)&amp;rsquo; 를 집어넣어 호출하여야 합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;add(7, 10)          // int add(int x, int y)를 호출하고 인수 7을 x에, 인수 10을 y에 대입
print99danAll();     // void print99danAll()을 호출&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;같은 클래스 내의 메서드끼리는 참조변수 없이 서로 호출이 가능하지만, static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없습니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static &amp;rarr; static : 가능&lt;/li&gt;
&lt;li&gt;non-static &amp;rarr; non-static : 가능&lt;/li&gt;
&lt;li&gt;non-static &amp;rarr; static : 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;static &amp;rarr; non-static : 불가능&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-왜-static에서-non-static을-호출할-수-없을까&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%99%9C-static%EC%97%90%EC%84%9C-non-static%EC%9D%84-%ED%98%B8%EC%B6%9C%ED%95%A0-%EC%88%98-%EC%97%86%EC%9D%84%EA%B9%8C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;왜 static에서 non-static을 호출할 수 없을까?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static 변수와 static 메서드는 &lt;b&gt;클래스가 로딩되는 시점&lt;/b&gt;에 메모리에 올라갑니다&lt;/li&gt;
&lt;li&gt;하지만 non-static은 &lt;b&gt;인스턴스가 생성될 때만 사용이 가능&lt;/b&gt;합니다&lt;/li&gt;
&lt;li&gt;따라서 인스턴스가 생성된 시점에서는 static은 당연히 메모리에 올라가있는 상태이겠지만, 반대로 클래스가 로딩되는 시점엔 인스턴스가 생성 되어있을거란 보장이 없기 때문에 컴파일 오류가 발생합니다&lt;/li&gt;
&lt;li&gt;따라서 static에서 non-static을 사용하려면 메서드 내에서 해당 인스턴스를 생성 한 후 사용하여야 합니다&lt;/li&gt;
&lt;/ul&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;a id=&quot;user-content-jvm의-메모리-구조&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#jvm%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;JVM의 메모리 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JVM 메모리 영역은 주로 사용되는 3가지의 영역이 존재합니다&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT7LKl/btrLsqT6IMj/VEJpX7K9ev6bTjolEhQ42K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT7LKl/btrLsqT6IMj/VEJpX7K9ev6bTjolEhQ42K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT7LKl/btrLsqT6IMj/VEJpX7K9ev6bTjolEhQ42K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT7LKl%2FbtrLsqT6IMj%2FVEJpX7K9ev6bTjolEhQ42K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;490&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&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;a id=&quot;user-content-메서드-영역-method-area&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EB%A9%94%EC%84%9C%EB%93%9C-%EC%98%81%EC%97%AD-method-area&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;메서드 영역 (Method Area)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스파일을 읽고 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장합니다 &amp;rarr; 동적 바인딩&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;a id=&quot;user-content-힙-heap&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%ED%9E%99-heap&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;힙 (Heap)&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;/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;a id=&quot;user-content-호출-스택-call-stack&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%ED%98%B8%EC%B6%9C-%EC%8A%A4%ED%83%9D-call-stack&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;호출 스택 (Call 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;/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;/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;a id=&quot;user-content-프로그램-실행-시-호출-스택call-stack-흐름&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%A4%ED%96%89-%EC%8B%9C-%ED%98%B8%EC%B6%9C-%EC%8A%A4%ED%83%9Dcall-stack-%ED%9D%90%EB%A6%84&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;프로그램 실행 시 호출 스택(Call stack) 흐름&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호출 스택은 이름 그대로 자료구조 중 하나인 Stack 구조를 따라갑니다&lt;/li&gt;
&lt;li&gt;아래 예시의 main 메서드 호출을 통해 흐름을 따라가보겠습니다
&lt;div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class CallStackTest{

    public static void main(String[] args) { // 시작
        firstMethod();
    }

    private static void firstMethod() {
        secondMethod();
    }

    private static void secondMethod() {
        System.out.println(&quot;secondMethod()&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;실행 순서: main - firstMethod - secondMethod - println&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;메서드 실행 흐름대로 호출 스택의 과정을 담은 사진입니다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C7kpe/btrLvKRgeje/iwHUHLk8uYBRkgoydJVfw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C7kpe/btrLvKRgeje/iwHUHLk8uYBRkgoydJVfw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C7kpe/btrLvKRgeje/iwHUHLk8uYBRkgoydJVfw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC7kpe%2FbtrLvKRgeje%2FiwHUHLk8uYBRkgoydJVfw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;390&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&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;a id=&quot;user-content-기본형-매개변수-vs-참조형-매개변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EA%B8%B0%EB%B3%B8%ED%98%95-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98-vs-%EC%B0%B8%EC%A1%B0%ED%98%95-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;기본형 매개변수 vs 참조형 매개변수&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;매개변수&lt;/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;변수의 값을 읽기만 할 수 있다 (read only)&lt;/td&gt;
&lt;td&gt;기본형 값이 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;참조형 매개변수&lt;/td&gt;
&lt;td&gt;변수의 값을 읽고 변경할 수 있다 (read &amp;amp; write)&lt;/td&gt;
&lt;td&gt;인스턴스(객체)의 주소가 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-기본형-매개변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EA%B8%B0%EB%B3%B8%ED%98%95-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;기본형 매개변수&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// 기본형 매개변수는 값을 복사하기 때문에 변경이 불가능하다

public static void main(String[] args) {

    int num = 10;
    System.out.println(&quot;A: &quot; + num);    // A: 10
    change100(10);
    System.out.println(&quot;C: &quot; + num);    // C: 10
}

private static void change100(int num) {
    num = 1000;
    System.out.println(&quot;B: &quot; + num);    // B: 1000
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;a id=&quot;user-content-참조형-매개변수&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%B0%B8%EC%A1%B0%ED%98%95-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;참조형 매개변수&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// 인스턴스나 배열같은 참조형 매개변수는 주소값을 공유한다
// 따라서 메서드 안에서 변경한 값이 메서드 밖에서도 변경된 값으로 출력된다

class Data {
    int num;
}

public class Study {

    public static void main(String[] args) {

        Data d = new Data();
        d.num = 10;

        System.out.println(&quot;A: &quot; + d.num);   // A: 10
        change100(d);    // Data 인스턴스 자체를 넘긴다
        System.out.println(&quot;C: &quot; + d.num);    // C: 1000
    }

    private static void change100(Data data) {
        d.num = 1000;
        System.out.println(&quot;B: &quot; + d.num);    // B: 1000
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그렇다면 Java는 Call by Reference?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 참조형 매개변수로 값을 전달하는 경우 데이터의 값이 변경되면 원본도 변경되어 Call by Reference라고 착각할 수도 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과연 Java는 Call by Reference일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;Java에서는 Call by Value만 존재&lt;/b&gt;&lt;/u&gt;합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시처럼 change100(d)를 넣는다면 &lt;b&gt;d의 주소값이 복사&lt;/b&gt;되어 매개변수 data에 넣어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;d의 주소값이 복사된다&quot;&lt;/b&gt; 즉, 원본 데이터가 바뀌어서 Call by Reference 처럼 동작을 하여 오해하기 쉽지만&lt;br /&gt;&lt;b&gt;객체의 주소값을 복사하기 때문에 Call by Value 입니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-재귀호출recursive-call&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%9E%AC%EA%B7%80%ED%98%B8%EC%B6%9Crecursive-call&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;재귀호출(recursive call)&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lsquo;값에 의한 호출(call by value)&amp;rsquo;&lt;/b&gt;을 통해 원래의 값이 아닌 &lt;b&gt;복사된 값으로 작업&lt;/b&gt;하기 때문에 &lt;b&gt;독립적인 작업수행이 가능&lt;/b&gt;합니다 &amp;rarr; 호출한 메서드와 호출당한 메서드는 서로 관련이 없습니다&lt;/li&gt;
&lt;li&gt;재귀호출을&lt;span&gt;&amp;nbsp;&lt;/span&gt;탈출할 수 있는 조건문이 필수입니다 &amp;rarr; 탈출 조건이 없다면 무한루프가 돌아서 Stack Overflow Error 발생&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;a id=&quot;user-content-그렇다면-재귀호출을-왜-사용할까&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4-%EC%9E%AC%EA%B7%80%ED%98%B8%EC%B6%9C%EC%9D%84-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// 재귀호출 사용에 대표적인 예는 Factorial 입니다

public static void main(String[] args) {

    int result = factorial(4);
    System.out.println(result);
    
}

static int factorial (int n) {
    int result = 0;

    if (n == 1) {
        result = 1;
    } else {
        result = n * factorial(n - 1);  // 메서드 자신을 다시 호출한다.
    }
    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;하지만 재귀 호출은 for문에 비해 비효율적이므로 재귀 호출에 드는 비용보다 &lt;b&gt;재귀 호출이 주는 논리적 간결함의 이득&lt;/b&gt;이 충분히 큰 경우에만 사용하여야 합니다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-클래스-메서드-vs-인스턴스-메서드&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A9%94%EC%84%9C%EB%93%9C-vs-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%A9%94%EC%84%9C%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;클래스 메서드 vs 인스턴스 메서드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수와 동일하게 메서드 앞에 static이 붙어있으면 클래스 메서드, 붙어있지 않으면 인스턴스 메서드입니다&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;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1662406303563&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;클래스 참조변수 = new 클래스();
참조변수.메서드이름(매개변수);&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;a id=&quot;user-content-클래스-메서드-static-메서드&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A9%94%EC%84%9C%EB%93%9C-static-%EB%A9%94%EC%84%9C%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;클래스 메서드 (static 메서드)&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;물론 인스턴스 변수를 사용하지 않는다고 무조건 클래스 메서드(static)로 정의할 필요는 없지만 특별한 이유가 없으면 일반적으로는 클래스 메서드로 정의합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;책 내용과는 별개로 실무에서는 static 메서드와 static 변수를 지양하여야 한다고 합니다
&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;span&gt;static은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리 회수 불가&lt;/li&gt;
&lt;li&gt;static 메서드는 오버라이딩 불가&lt;/li&gt;
&lt;li&gt;static 메서드는 인터페이스 구현 시 사용 불가&lt;/li&gt;
&lt;li&gt;따라서 static은 모든 객체지향적 기능들의 사용을 방해하는 요소라고 합니다&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;&lt;a id=&quot;user-content-인스턴스-메서드&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%A9%94%EC%84%9C%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;인스턴스 변수는 인스턴스 생성 후 사용이 가능하기 때문입니다&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;&lt;a id=&quot;user-content-어느-상황에서-뭘-선언하지&quot; href=&quot;https://github.com/giibeom/programmers_knowledge_storage/blob/main/Backend/Java/Java%EC%9D%98%20%EC%A0%95%EC%84%9D/%EB%B3%80%EC%88%98%EC%99%80%20%EB%A9%94%EC%84%9C%EB%93%9C,%20%EA%B7%B8%20%EC%86%8D%EC%9C%BC%EB%A1%9C.md#%EC%96%B4%EB%8A%90-%EC%83%81%ED%99%A9%EC%97%90%EC%84%9C-%EB%AD%98-%EC%84%A0%EC%96%B8%ED%95%98%EC%A7%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;공통된 값을 유지&amp;rdquo;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해야 한다면 static을 붙여줍니다 (클래스 변수)&lt;/li&gt;
&lt;li&gt;메서드 중 자주 사용되고, 공통적으로 사용되어야 하는 메서드에는 static을 붙여줍니다 (클래스 메서드)&lt;/li&gt;
&lt;li&gt;또한 메서드 중 인스턴스 변수, 인스턴스 메서드를 사용하지 않는 메서드에는 static을 붙여줍니다 (클래스 메서드)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 매개변수로만 작업을 수행하는 경우에는 클래스 메서드(static)&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;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: url('../image/divider-line.svg') center -304px / 200px 420px no-repeat; width: 200px; height: 19px; padding: 18px 20px 17px;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 주제에서는 중요한 내용들이 많았던 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조형 매개변수에서는 원본 데이터가 바뀌므로 Call by Reference로 착각을 했지만, 사실 Java에서는 Call by Value만 있더군요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 책 내용과는 다르게 실무에서는 객체지향적인 기능들을 방해하는 static의 사용을 지양하는 것을 새로 알아가는 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static의 남용은 프로그램의 상태를 추정하기 어렵게 만들며 객체지향적이지 않으므로 앞으로는 static의 사용을 자제해야 할 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  자료가 도움이 되셨다면&amp;nbsp;&lt;a href=&quot;https://github.com/giibeom/programmers_knowledge_storage/tree/main/Backend&quot;&gt;Backend Wiki&lt;/a&gt;로 놀러 오세요!&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&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://www.aladin.co.kr/shop/wproduct.aspx?ItemId=76083001&quot;&gt;Java의 정석&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://deveric.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://deveric.tistory.com/92&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://unabated.tistory.com/entry/%EC%99%9C-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-static%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80&quot;&gt;왜 자바에서 static의 사용을 지양해야 하는가?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;잘못된 내용이나, 보충할 내용이 있다면 언제든지 편하게 연락 주시면 감사하겠습니다 :)&lt;br /&gt;&lt;br /&gt; &amp;zwj;♂️ Call me&lt;br /&gt;Email : dev.gibeom@gmail.com&lt;br /&gt;KakaoTalk : https://open.kakao.com/me/beomdrive&lt;/blockquote&gt;</description>
      <category>Programming/Java</category>
      <category>call by value</category>
      <category>JVM 메모리구조</category>
      <category>static</category>
      <category>메서드</category>
      <category>변수</category>
      <category>인스턴스 멤버</category>
      <category>클래스 멤버</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/16</guid>
      <comments>https://beomdrive.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 6 Sep 2022 04:40:42 +0900</pubDate>
    </item>
    <item>
      <title>객체 지향, 그 속으로</title>
      <link>https://beomdrive.tistory.com/15</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  백엔드 관련 자료는 &lt;a href=&quot;https://github.com/giibeom/programmers_knowledge_storage/tree/main/Backend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Backend Wiki&lt;/a&gt;에서 PR을 통해 검증과 내용 보완을 거친 후 블로그로 이관되고 있습니다 :)&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 지향 프로그래밍 = 실제 세계를 컴퓨터 속에 옮겨 놓기
&lt;ol 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;/ol&gt;
&lt;/li&gt;
&lt;li&gt;실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용입니다&lt;/li&gt;
&lt;li&gt;OOP (캡슐화, 상속, 추상화, 다형성) 개념을 중심으로 점차 구체적으로 발전되었습니다&lt;/li&gt;
&lt;/ul&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;/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;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;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;/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;/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;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체 지향 프로그래밍 특징 - OOP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍의 4대 특징을 간단하게 알아보겠습니다&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;캡슐화 (Encapsulation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통된 데이터와 데이터를 활용하는 함수끼리 캡슐(Class) 안에 두는 것
&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;클래스 안에서는 표시할 속성(public 변수)와 숨길 속성(private 변수)을 선택할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 캡슐화&lt;/td&gt;
&lt;td&gt;필드와 메서드를 하나로 묶는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;은닉화&lt;/td&gt;
&lt;td&gt;외부에 드러나게 하지 않기를 원하는 데이터를 감추어(private) 외부에서 데이터를 직접 접근하는 것을 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class TV {
      int channel;
      // 가격은 getPrice()를 통해서만 가져갈 수 있다 -&amp;gt; 직접 접근 불가
      private int price;
      String color;

      void channelUp() {
          this.channel++;
      }

      public int getPrice() {
          return price;
      }

      public void setColor(String color) {
          this.color = color;
      }
}
&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;상속 (Inheritance)&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;코드를 더 작은 단위로 Class를 쪼개면서 재사용을 할 수 있습니다&lt;/li&gt;
&lt;li&gt;공통적인 요소를 합쳐 중복 코드를 제거할 수 있습니다&lt;/li&gt;
&lt;li&gt;부모 클래스 수정 시 모든 자식 클래스도 일괄 수정되는 특징이 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Entrepreneur {
    String firstName;
    String lastName;
    private int shares;
    private String company;
}

class Actor {
    String firstName;
    String lastName;
    private int oscars;
    private int age;
}

// firstName과 lastName이 공통적으로 사용되는 멤버이다 -&amp;gt; 상속
// &amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;&amp;darr;

class Person {
    String firstName;
    String lastName;
}

class Entrepreneur extends Person {
    private int shares;
    private String company;
}

class Actor extends Person {
    private int oscars;
    private int age;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추상화 (Abstraction)&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;/ul&gt;
&lt;div&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;  예시를 들어보자

자동차에는 엑셀, 브레이크, 핸들, 버튼 등 다양한 인터페이스가 존재한다

우리는 아래와 같이 알 수 있다
엑셀: 차가 움직인다
브레이크: 차가 멈춘다
핸들: 차의 방향을 조절한다
버튼: 각각의 기능이 있다

하지만 구현 세부정보는 각 제조사마다 다르지만 우리는 몰라도 차를 운전하는데 전혀 지장이 없다.
따라서 인터페이스는 구현체 내부에서 어떻게 돌아가는지 몰라도 원하는 기능을 사용하는데 문제가 없다는 특징이 있다&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다형성 (Polymorphism)&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;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;메서드가 어떻게 작동해야 되는지에 대한 최소한의 규칙이 정해져 있습니다 (return 타입 등)
&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;div&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Person {
    public String sayHi() {
        return &quot;ㅎㅇ&quot;;
    }

    public String sayBye() {
        return &quot;ㅂㅂ&quot;;
    }
}

class 한국인 extends Person {
}

class Italian extends Person {
    @Override
    public String sayHi() { // 오버라이딩
        return &quot;Hi!&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public static void main(String[] args) {

    한국인 한국인1 = new 한국인();
    한국인1.sayHi(); // 출력값: ㅎㅇ
    
    Italian italian1 = new Italian();
    italian1.sayHi(); // 출력값: Hi!
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 한국인 객체의 sayHi()와 Italian 객체의 sayHi()의 결과가 다른 것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&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;객체는 &amp;lsquo;실제로 존재하는 것&amp;rsquo; 으로써 우리 주변에서 볼 수 있는 모든 사물들이 곧 객체라고 볼 수 있습니다&lt;/li&gt;
&lt;li&gt;개념이나 논리 같은 무형적인 것들도 포함됩니다&lt;/li&gt;
&lt;li&gt;프로그래밍 관점 &amp;rarr; 클래스에 정의된 내용대로 메모리에 객체가 생성됨&lt;/li&gt;
&lt;li&gt;객체 = 속성(변수) + 기능(메서드)&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;객체&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;객체의 정의&lt;/td&gt;
&lt;td&gt;실제로 존재하는 것, 사물 또는 개념&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;객체의 용도&lt;/td&gt;
&lt;td&gt;객체가 가지고 있는 기능과 속성에 따라 다름&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 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;객체를 정의해놓은 것 &amp;rarr; 객체의 설계도 또는 틀이라고 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;객체&lt;/td&gt;
&lt;td&gt;클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제품&lt;/td&gt;
&lt;td&gt;제품 설계도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TV&lt;/td&gt;
&lt;td&gt;TV 설계도&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스는 객체를 생성하는 데 사용&lt;/b&gt;됩니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동차라는 객체가 필요하다고 가정해봅시다&lt;/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;1. 자동차라는 클래스를 작성합니다 (설계도)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Car {
     ....
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자동차라는 클래스를 통해 &lt;b&gt;객체를 생성&lt;/b&gt;합니다 (인스턴스화)&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Car car= new Car();&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;클래스는 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것입니다&lt;br /&gt;클래스가 곧 사용자 정의 타입입니다 (기본 자료형 외) - (ex. VO, DTO)&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;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;gt; 따라서 &lt;b&gt;문맥에 따라 구별하여 사용&lt;/b&gt;하면 됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xl&quot;&gt;&lt;code&gt;  예시를 들어보자

차 인스턴스다 x -&amp;gt; 차 객체다 o
차는 차 클래스의 객체이다 x -&amp;gt; 차는 차 클래스의 인스턴스이다 O&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;클래스 &amp;mdash;&amp;mdash; (인스턴스화) &amp;mdash;&amp;mdash;&amp;gt; 인스턴스(객체)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스로부터 객체를 만드는 과정 &amp;rarr; 클래스의 인스턴스화&lt;/li&gt;
&lt;li&gt;A 클래스로부터 만들어진 객체 &amp;rarr; A 클래스의 인스턴스&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;// 클래스의 객체를 생성 -&amp;gt; 객체의 주소를 참조변수에 저장
클래스명 변수명 = new 클래스명();

Class Human { ... }

// new를 통해 Human 인스턴스 생성 -&amp;gt; gibeom이라는 참조변수에 Human 인스턴스의 주소 저장
Human gibeom = new Human();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;참조 변수 vs 인스턴스&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 예시에서 &lt;span&gt;gibeom2에 생성된 인스턴스는&lt;/span&gt; gibeom1과 gibeom2이 동시에 가리키고 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;Human gibeom1 = new Human();
Human gibeom2 = new Human();
gibeom1 = gibeom2   // 참조변수 gibeom1한테 gibeom2의 주소값을 부여

// gibeom1의 본래 주소값은 garbage collector에 의해 메모리 반환&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 예시의 gibeom1처럼 덮어씌워집니다&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;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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;속성과 기능을 그 객체의 멤버&lt;/b&gt;(구성원, member)라고 합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구성 요소&lt;/td&gt;
&lt;td&gt;명칭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;속성 (property)&lt;/td&gt;
&lt;td&gt;멤버 변수, 특성(attribute), 필드(field), 상태(state)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기능 (function)&lt;/td&gt;
&lt;td&gt;메서드, 함수, 행위(behavior)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;속성과 기능에 대한 예시 (TV)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 60px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;크기, 길이, 높이, 무게, 색상, 볼륨, 채널 등&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;켜기, 끄기, 볼륨 높이기 낮추기, 채널 변경하기 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;채널 &amp;rarr; int channel;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;채널 변경하기 &amp;rarr; channelUp() { &amp;hellip; }&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;b&gt;각 인스턴스의 속성&lt;/b&gt;(멤버변수)은 독립적으로 서로 다른 값을 유지합니다 &amp;rarr; 서로 다른 객체 주소 값을 참조&lt;/li&gt;
&lt;li&gt;메서드의 행위는 모든 인스턴스에 대해 동일하게 동작합니다 (오버라이딩한 경우 제외)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Class Human {
	String gender;
	int age;

	void increaseAge()  { ++age; }
}

Class HumanTest {
	Human gibeom = new Human();
	Human beom = new Human();
	
	gibeom.increaseAge()

// 속성중에 하나인 멤버변수 age는 각 인스턴스마다 서로 다른 값을 유지
// 하지만 increaseAge 같은 메서드 동작 자체는 모든 인스턴스에서 동일하게 작동
	System.out.println(gibeom.age); // 1
	System.out.println(beom.age); // 0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;객체의 주소를 배열에 저장 &amp;rarr; 즉 참조 변수들을 하나로 묵은 참조 변수의 배열&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;Human[] humanArr = {new Human(), new Human(), new Human()}&lt;/code&gt;&lt;/pre&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: url('../image/divider-line.svg') center -304px / 200px 420px no-repeat; width: 200px; height: 19px; padding: 18px 20px 17px;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바를 다시 공부하면서 객체, 클래스, 인스턴스, 참조 변수 등의 용어가 헷갈렸었던 것들이 재정비가 되는 느낌입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향의 뿌리는 절차적 언어에서 시작됐다는 내용은 흥미로운 것 같네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OOP의 캡!상추다 에 대해서도 다시 한번 상기시키며 개발을 할 때 참고해서 코드를 구성해야 될 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  자료가 도움이 되셨다면&amp;nbsp;&lt;a href=&quot;https://github.com/giibeom/programmers_knowledge_storage/tree/main/Backend&quot;&gt;Backend Wiki&lt;/a&gt;로 놀러 오세요!&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&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://www.aladin.co.kr/shop/wproduct.aspx?ItemId=76083001&quot;&gt;Java의 정석&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/IeLWSKq0xIQ&quot;&gt;노마드 코더 - 객체지향 개념정리 10분컷&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@0sunset0/OOP의-네가지-특징추상화캡슐화상속다형성&quot;&gt;https://velog.io/@0sunset0/OOP의-네가지-특징추상화캡슐화상속다형성&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;잘못된 내용이나, 보충할 내용이 있다면 언제든지 편하게 연락 주시면 감사하겠습니다 :)&lt;br /&gt;&lt;br /&gt; &amp;zwj;♂️ Call me&lt;br /&gt;Email : dev.gibeom@gmail.com&lt;br /&gt;KakaoTalk : https://open.kakao.com/me/beomdrive&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>OOP</category>
      <category>객체</category>
      <category>객체지향</category>
      <category>다형성</category>
      <category>상속</category>
      <category>인스턴스</category>
      <category>추상화</category>
      <category>캡슐화</category>
      <category>클래스</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/15</guid>
      <comments>https://beomdrive.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 6 Sep 2022 02:34:52 +0900</pubDate>
    </item>
    <item>
      <title>소개</title>
      <link>https://beomdrive.tistory.com/pages/%EC%86%8C%EA%B0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;블로그 이전중입니다.... Coming Soon!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/pages/%EC%86%8C%EA%B0%9C</guid>
      <pubDate>Wed, 17 Aug 2022 02:11:12 +0900</pubDate>
    </item>
    <item>
      <title>InfluxDB - (3) 데이터 백업(backup) 및 복구(restore)</title>
      <link>https://beomdrive.tistory.com/9</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;나는 데이터베이스 특성상 중요한 데이터는 미리 백업을 주기적으로 받아놓곤 한다&lt;br /&gt;데이터가 날아가는 최악의 상황에서의 유일한 빛이랄까...&lt;br /&gt;&lt;br /&gt;이번 글에서는 이전 글에서 열심히 데이터를 만들고 지우고 수정하고 하며 생긴 많은 데이터들을 &lt;br /&gt;백업 및 복구하는 방법을 알아볼까 한다&lt;br /&gt;시작해보자!&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Data Backup&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Load Data Backup&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Influxd backup -portable -database {데이터베이스명} {경로}&lt;/li&gt;
&lt;li&gt;해당 데이터베이스를 경로 디렉토리에 백업 (디렉토리가 없을 시 자동 생성함)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654319986215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;influxd backup -portable -database exemDB C:\Users\beom\Downloads\influxBackup&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;style3&quot;&gt; &amp;nbsp; 나는 C:\Users\beom\Downloads\influxBackup 폴더 경로에&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exemDB라는 데이터베이스를 백업해보겠다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bft6wP/btrDWlSONW9/j2eYNw0JIbFMbKlneocLP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bft6wP/btrDWlSONW9/j2eYNw0JIbFMbKlneocLP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bft6wP/btrDWlSONW9/j2eYNw0JIbFMbKlneocLP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbft6wP%2FbtrDWlSONW9%2Fj2eYNw0JIbFMbKlneocLP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;159&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 경로 폴더&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfl6KN/btrDWnb1CT4/HpfUjoN6MSvpewS9h9Cbr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfl6KN/btrDWnb1CT4/HpfUjoN6MSvpewS9h9Cbr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfl6KN/btrDWnb1CT4/HpfUjoN6MSvpewS9h9Cbr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfl6KN%2FbtrDWnb1CT4%2FHpfUjoN6MSvpewS9h9Cbr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;375&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Data Restore&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;위에서 exemDB의 데이터베이스를 백업하였으니 복구를 위해 데이터를 다 날려버리자!&lt;/blockquote&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. measurement 삭제 진행&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;drop measurement 테이블명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654320751435&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drop measurement soccer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0wrBx/btrDWiI5JvN/9KQkz5SZ6xiTv4f302sL7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0wrBx/btrDWiI5JvN/9KQkz5SZ6xiTv4f302sL7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0wrBx/btrDWiI5JvN/9KQkz5SZ6xiTv4f302sL7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0wrBx%2FbtrDWiI5JvN%2F9KQkz5SZ6xiTv4f302sL7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;345&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;drop database 데이터베이스명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654320808454&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drop database exemDB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터베이스 복구 (restore)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;influxd restore -portable -db {데이터베이스명} {백업폴더경로}&lt;/li&gt;
&lt;li&gt;해당 백업폴더 경로에 있는 데이터 압축파일을 influxdb에 import 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654320916309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;influxd restore -portable -db exemDB C:\Users\beom\Downloads\influxBackup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bilPJ5/btrDVD1jdoF/0NLKCbiPMs1VXKcVF9Wqx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bilPJ5/btrDVD1jdoF/0NLKCbiPMs1VXKcVF9Wqx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bilPJ5/btrDVD1jdoF/0NLKCbiPMs1VXKcVF9Wqx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbilPJ5%2FbtrDVD1jdoF%2F0NLKCbiPMs1VXKcVF9Wqx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;143&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;아래 사진을 보면 influx 내 exemDB가 복구된 것을 볼 수 있다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCXcz/btrDWDzvfOL/aYPhm86SQwOMiX0y2R2KKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCXcz/btrDWDzvfOL/aYPhm86SQwOMiX0y2R2KKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCXcz/btrDWDzvfOL/aYPhm86SQwOMiX0y2R2KKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCXcz%2FbtrDWDzvfOL%2FaYPhm86SQwOMiX0y2R2KKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;235&quot; height=&quot;454&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt; &amp;nbsp; Influx 내 데이터베이스 중 회사에서 쓰이는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 데이터베이스가 있으므로 해당 부분은 가리겠습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이처럼 InfluxDB 데이터의 백업과 복구는 이런 식으로 하면 될 것 같습니다&lt;br /&gt;저한테 데이터 백업은 보험 같은 느낌이라서 나는 중요한 상황일 때마다 습관적으로 데이터를 백업하는 것 같네요&lt;br /&gt;&lt;br /&gt;InfluxDB를 자세하게 파고들면 무궁무진한 활용 방법이 있고 Grafana 모니터링 시스템도 구축할 수 있습니다&lt;br /&gt;지금까지 맛보기 정도로만 빠르게 훑어보았습니다&lt;br /&gt;추후에는 SpringBoot 환경에 InfluxDB 사용하기, InfluxDB+Grafana를 활용한 모니터링 시스템도 만들어 볼 생각입니다&lt;br /&gt;&lt;br /&gt;이번 글은 여기에서 마치고 InfluxDB에 대해서는 추후에 다시 돌아오겠습니다!&lt;br /&gt;감사합니다 :)&lt;/blockquote&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;050&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Database/InfluxDB</category>
      <category>InfluxDB backup</category>
      <category>InfluxDB restore</category>
      <category>InfluxDB 백업</category>
      <category>InfluxDB 복구</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/9</guid>
      <comments>https://beomdrive.tistory.com/9#entry9comment</comments>
      <pubDate>Sat, 4 Jun 2022 15:04:35 +0900</pubDate>
    </item>
    <item>
      <title>InfluxDB - (2) CRud 사용법(InfluxQL)</title>
      <link>https://beomdrive.tistory.com/8</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이번 글에서는 InfluxQL을 통한 InfluxDB의 CR-ud 쿼리를 직접 사용해보겠다&lt;br /&gt;Influx 쿼리는 어떻게 사용하는 것일까..&lt;br /&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;Data Format&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;InfluxDB 쿼리를 사용하기 전에 &lt;b&gt;Line protocol&lt;/b&gt;에 대해서 알아보자&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Line protocol&lt;/h3&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: #006dd7;&quot;&gt;Measurement&lt;/span&gt;, &lt;span style=&quot;color: #f3c000;&quot;&gt;Tag set&lt;/span&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;Field set&lt;/span&gt; &lt;span style=&quot;color: #8a3db6;&quot;&gt;timestamp&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째는 항상 Measurement가 와야 함&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;Tag set&lt;span style=&quot;color: #000000;&quot;&gt;과&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;Field set&lt;/span&gt; 은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;key=value&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로 구성되며 여러 개일 경우 쉼표(,)로 구분한다&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;timestamp&lt;span style=&quot;color: #000000;&quot;&gt;는 생략이 가능하다 (생략 시 데이터 삽입 기준 시간이 들어감)&lt;/span&gt;&lt;/span&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;point라 부른다&lt;/li&gt;
&lt;li&gt;line protocol 형식으로 구성되어있다&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;h4 data-ke-size=&quot;size20&quot;&gt;Line protocol 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시 1)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654250720634&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soccer,name=son,team=tot city=&quot;london&quot;,age=28 151178300000000000&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 62.6745%; height: 220px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;measurement&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;soccer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;tag&lt;br /&gt;(only string type)&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;name, team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;field&lt;br /&gt;(모든 타입 가능, string type인 경우 &amp;ldquo; &amp;ldquo; 로 구분한다)&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;city, age&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;timestamp&lt;br /&gt;(생략가능, 생략 시 데이터 삽입 시점 시간이 들어감)&lt;/td&gt;
&lt;td&gt;151178300000000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 2)&lt;/p&gt;
&lt;pre id=&quot;code_1654251007551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bank, company=woowaBro color=&quot;mint&quot;, year=2024&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 62.2093%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 80.2158%; height: 17px;&quot;&gt;&lt;span&gt;measurement&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.6043%; height: 17px;&quot;&gt;bank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 80.2158%; height: 34px;&quot;&gt;tag&lt;br /&gt;&lt;span style=&quot;background-color: #f8fbfb;&quot;&gt;(only string type)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.6043%; height: 34px;&quot;&gt;company&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 80.2158%; height: 37px;&quot;&gt;field&lt;br /&gt;(모든 타입 가능, string type인 경우 &amp;ldquo; &amp;ldquo; 로 구분한다)&lt;/td&gt;
&lt;td style=&quot;width: 19.6043%; height: 37px;&quot;&gt;color, year&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Data Load&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;schemaless&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt; &amp;nbsp; Influx 내 데이터베이스 중 회사에서 쓰이는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 데이터베이스가 있으므로 해당 부분은 가리겠습니다&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 DB와 다르게 Mesurement(Table)를 따로 생성하지 않고 바로 insert 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Measurement 존재 x &amp;rarr; Measurement 생성 뒤 데이터가 저장&lt;/li&gt;
&lt;li&gt;Measurement 존재 o &amp;rarr; 바로 데이터 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;timestamp는 생략 가능, 생략 시 데이터가 저장되는 시점의 시간으로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;InfluxDB를 CR-ud로 표현하는 이유는 시계열 데이터베이스는 쓰기(C), 읽기(R)에 특화되어 있다.&lt;br /&gt;따라서 수정(u)과 삭제(d)를 권장하지 않는 데이터베이스이다.&lt;br /&gt;하지만 실제 실무에서는 무궁무진한 상황이 발생하기 마련이다..&lt;br /&gt;&lt;br /&gt;자 이제 진짜 Line protocol을 활용한 InfluxQL로 CR-ud를 &quot;&lt;b&gt;모두&quot;&lt;/b&gt; 사용해보자!&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Influx Query&lt;/h2&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;background-color: #ffffff; color: #000000;&quot;&gt;1. 데이터 삽입 (insert)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;insert &lt;span style=&quot;color: #006dd7;&quot;&gt;mesurement&lt;/span&gt;,&lt;span style=&quot;color: #f3c000;&quot;&gt;tagSet&lt;/span&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;fieldSet&lt;/span&gt; &lt;span style=&quot;color: #8a3db6;&quot;&gt;timestamp&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;tag 혹은 field 가 여러 개일 경우 쉼표로 구분&lt;/li&gt;
&lt;li&gt;tag &amp;rarr; field 넘어갈 때 공백으로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654252285506&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insert soccer,name=son,team=tot city=&quot;london&quot;,age=28 151178300000000000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGSiEp/btrDV0Oqh3b/7BpdnIg3KzeXALQLlQayK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGSiEp/btrDV0Oqh3b/7BpdnIg3KzeXALQLlQayK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGSiEp/btrDV0Oqh3b/7BpdnIg3KzeXALQLlQayK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGSiEp%2FbtrDV0Oqh3b%2F7BpdnIg3KzeXALQLlQayK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;193&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  쉼표 간의 띄어쓰기를 할시 아래와 같이 오류가 발생한다!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkhg0/btrDUUoaUZC/DlQfvwuqkuZpZxuGSlTU8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkhg0/btrDUUoaUZC/DlQfvwuqkuZpZxuGSlTU8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkhg0/btrDUUoaUZC/DlQfvwuqkuZpZxuGSlTU8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmkhg0%2FbtrDUUoaUZC%2FDlQfvwuqkuZpZxuGSlTU8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;87&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;2. measurement&amp;nbsp;내&amp;nbsp;tag&amp;nbsp;key&amp;nbsp;확인&amp;nbsp;(indexing&amp;nbsp;컬럼)&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;show tag keys on &amp;ldquo;데이터베이스&amp;rdquo; from &amp;ldquo;measurement&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654252754657&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show tag keys on &quot;exemDB&quot; from &quot;soccer&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ihhdi/btrDVCAihOs/2psxs6WRrlwhADhGOECgO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ihhdi/btrDVCAihOs/2psxs6WRrlwhADhGOECgO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ihhdi/btrDVCAihOs/2psxs6WRrlwhADhGOECgO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIhhdi%2FbtrDVCAihOs%2F2psxs6WRrlwhADhGOECgO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;172&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;3. measurement&amp;nbsp;내&amp;nbsp;field&amp;nbsp;key&amp;nbsp;조회&amp;nbsp;(non-indexing&amp;nbsp;컬럼)&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;show field keys on &amp;ldquo;데이터베이스&amp;rdquo; from &amp;ldquo;measurement&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654253026687&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show field keys on &quot;exemDB&quot; from &quot;soccer&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwyb4/btrDUDmCaXW/87VNPW7SxzttCCHexa8bAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwyb4/btrDUDmCaXW/87VNPW7SxzttCCHexa8bAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwyb4/btrDUDmCaXW/87VNPW7SxzttCCHexa8bAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkwyb4%2FbtrDUDmCaXW%2F87VNPW7SxzttCCHexa8bAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;161&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;4. 데이터 조회 (select)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RDB 쿼리와 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654253102071&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select * from soccer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwjsRd/btrDVLRq4ED/3qjLIskqk8Da29rkzTcFrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwjsRd/btrDVLRq4ED/3qjLIskqk8Da29rkzTcFrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwjsRd/btrDVLRq4ED/3qjLIskqk8Da29rkzTcFrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwjsRd%2FbtrDVLRq4ED%2F3qjLIskqk8Da29rkzTcFrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;398&quot; height=&quot;156&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;5. 데이터 삭제 (delete)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;delete from measurement명 where tag키 = &amp;lsquo;tag값&amp;rsquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654253131353&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete from soccer where team = 'brazil'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAagVv/btrDV0OsaH4/kSYNCJykhAHlDzAG1sUp7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAagVv/btrDV0OsaH4/kSYNCJykhAHlDzAG1sUp7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAagVv/btrDV0OsaH4/kSYNCJykhAHlDzAG1sUp7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAagVv%2FbtrDV0OsaH4%2FkSYNCJykhAHlDzAG1sUp7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;351&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;6. 데이터 수정 (update)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InfluxDB는 업데이트 쿼리를 따로 &lt;b&gt;지원하지 않는다&lt;/b&gt;!!&lt;/li&gt;
&lt;li&gt;단 수정할 데이터의 timestamp를 가져와서 그대로 insert 하면 덮어씌워진다&lt;/li&gt;
&lt;li&gt;※ 주의 - tag set의 값은 &lt;b&gt;동일한 상태&lt;/b&gt;에서만 field 값 수정만 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;정상적인 수정&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 timestamp를 그대로 가져와 쿼리 맨 마지막에 세팅&lt;/li&gt;
&lt;li&gt;field인 city 값과 age 값을 변경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;key&lt;/b&gt;인 name과 team은 &lt;b&gt;그대로 같은 값&lt;/b&gt;으로 세팅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejx2dQ/btrDU4xmjVK/VlRS0Ea91QrkpkVjt58h6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejx2dQ/btrDU4xmjVK/VlRS0Ea91QrkpkVjt58h6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejx2dQ/btrDU4xmjVK/VlRS0Ea91QrkpkVjt58h6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fejx2dQ%2FbtrDU4xmjVK%2FVlRS0Ea91QrkpkVjt58h6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;324&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;2. 비정상적인 수정 &amp;rarr; &lt;b&gt;새로운 데이터 삽입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 timestamp를 그대로 가져와 쿼리 맨 마지막에 세팅&lt;/li&gt;
&lt;li&gt;&lt;b&gt;tag 값&lt;/b&gt;인 name을 beom &amp;rarr; beom97로 변경&lt;/li&gt;
&lt;li&gt;field 값인 age 값 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nEPmE/btrDUOBqTjM/23uDW2TJjz4xRR9kKnX9Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nEPmE/btrDUOBqTjM/23uDW2TJjz4xRR9kKnX9Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nEPmE/btrDUOBqTjM/23uDW2TJjz4xRR9kKnX9Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnEPmE%2FbtrDUOBqTjM%2F23uDW2TJjz4xRR9kKnX9Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;353&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이처럼 InfluxDB는 읽기와 쓰기에 특화되어 있어 update는 insert를 통해 덮어 씌우는 방식으로 사용이 가능합니다&lt;br /&gt;CRUD를 모두 해봄으로써 기존 RDB(MariaDB) 쿼리와 유사하며, Line protocol 방식만 추가된 것처럼 느껴집니다&lt;br /&gt;&lt;br /&gt;다음 글에서는 InfluxDB 데이터의 백업, 복구에 대해서 다뤄보도록 하겠습니다!&lt;br /&gt;감사합니다 :)&lt;/blockquote&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;050&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/InfluxDB</category>
      <category>influx delete</category>
      <category>influx insert</category>
      <category>influx update</category>
      <category>Influx 쿼리</category>
      <category>InfluxDB CRUD</category>
      <category>InfluxDB 삭제</category>
      <category>InfluxDB 생성</category>
      <category>InfluxDB 수정</category>
      <category>InfluxDB 조회</category>
      <category>InfluxQL</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/8</guid>
      <comments>https://beomdrive.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 3 Jun 2022 19:56:20 +0900</pubDate>
    </item>
    <item>
      <title>InfluxDB - (1) 시계열 데이터베이스란?</title>
      <link>https://beomdrive.tistory.com/7</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;최근에 회사에서 InfluxDB를 활용한 개발을 하게 되었다&lt;br /&gt;InfluxDB? 시계열 데이터베이스? 처음 접해보는 기술이다..&lt;br /&gt;그 속으로 들어가 보자!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size14&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;/li&gt;
&lt;li&gt;SQL 기반 시계열 질의 지원&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RDB vs 시계열 데이터베이스&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;RDBMS&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;InfluxDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;Measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rows&lt;/td&gt;
&lt;td&gt;Points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PK or Indexed columns&lt;/td&gt;
&lt;td&gt;Tags (String만 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unindexed columns&lt;/td&gt;
&lt;td&gt;Fields&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;여기까지 봤을 땐 긴가민가하다..&lt;br /&gt;자주 사용하는 RDB(MariaDB)랑 비슷한 감이 있고 용어만 달라지는 느낌이 든다&lt;br /&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;Influx 설치&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;a href=&quot;https://portal.influxdata.com/downloads/&quot;&gt;https://portal.influxdata.com/downloads/&lt;/a&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;influxd.exe&lt;/td&gt;
&lt;td&gt;influx.exe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;influx 서버&lt;/td&gt;
&lt;td&gt;influx 클라이언트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXvysw/btrDQefdbp7/oxkQfB27hDjWTmgryQ9nYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXvysw/btrDQefdbp7/oxkQfB27hDjWTmgryQ9nYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXvysw/btrDQefdbp7/oxkQfB27hDjWTmgryQ9nYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXvysw%2FbtrDQefdbp7%2FoxkQfB27hDjWTmgryQ9nYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;258&quot; height=&quot;222&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;❗ 윈도우 cmd 창에서 바로 접근을 원할 시 환경변수 세팅 (InfluxDB window path)&lt;br /&gt;시스템 환경변수 편집 &amp;rarr; 환경 변수 &amp;rarr; 시스템 변수 &amp;rarr; Path &amp;rarr; 편집 &amp;rarr; 새로 만들기 &amp;rarr; influx &lt;b&gt;폴더 경로&lt;/b&gt;를 집어넣고 저장&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;b&gt;환경변수 세팅 후 &lt;span style=&quot;color: #ee2323;&quot;&gt;influxd.exe를 실행 후&lt;/span&gt; cmd 창에서 influx 타이핑 결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0WyUq/btrDVkeKEfH/CVYM9jq9ktOChqaB20rZ3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0WyUq/btrDVkeKEfH/CVYM9jq9ktOChqaB20rZ3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0WyUq/btrDVkeKEfH/CVYM9jq9ktOChqaB20rZ3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0WyUq%2FbtrDVkeKEfH%2FCVYM9jq9ktOChqaB20rZ3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;115&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  자 이제 InfluxDB를 써볼 준비는 끝났다&lt;br /&gt;이번 글에서는 InfluxDB를 간단하게만 사용해보자&lt;br /&gt;&lt;br /&gt;  InfluxQL(CRUD) 쿼리를 보고 싶다면 다음 글로 바로 가면 될 것 같다!&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;Influx 사용&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;내용 중 {}은 괄호 안의 값을 대입하라는 의미입니다&lt;br /&gt;ex) use {데이터베이스 이름} &amp;rarr; use _internal&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&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;현재 influxDB에 데이터베이스를 조회한다.&lt;/li&gt;
&lt;li&gt;기본으로 _internal이라는 데이터베이스가 존재하는 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654179211347&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show database&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfmPjw/btrDViuuKSk/VoQMExu9BghqEiAeARMfI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfmPjw/btrDViuuKSk/VoQMExu9BghqEiAeARMfI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfmPjw/btrDViuuKSk/VoQMExu9BghqEiAeARMfI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfmPjw%2FbtrDViuuKSk%2FVoQMExu9BghqEiAeARMfI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;206&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&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;/li&gt;
&lt;li&gt;use {데이터베이스 이름}&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654179350498&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use _internal&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLBSS/btrDUUgDHUO/1PDUUdAOeYnppkdrcKGkr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLBSS/btrDUUgDHUO/1PDUUdAOeYnppkdrcKGkr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLBSS/btrDUUgDHUO/1PDUUdAOeYnppkdrcKGkr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLBSS%2FbtrDUUgDHUO%2F1PDUUdAOeYnppkdrcKGkr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;114&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. measurement 조회&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선택한 데이터베이스 내의 measurement(table) 조회한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654179841726&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show measurements&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmV5U/btrDV1lxg8j/BXZfuDfTzjemQJkk7LGqX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmV5U/btrDV1lxg8j/BXZfuDfTzjemQJkk7LGqX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmV5U/btrDV1lxg8j/BXZfuDfTzjemQJkk7LGqX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpmV5U%2FbtrDV1lxg8j%2FBXZfuDfTzjemQJkk7LGqX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;290&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 데이터&amp;nbsp;조회&amp;nbsp;(select) 문&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 RDB 쿼리와 동일한 것으로 보임&lt;/li&gt;
&lt;li&gt;시계열 데이터베이스 특성상 select 쿼리 실행 시 timestamp가 자동으로 같이 조회됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654180243027&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select HeapIdle, NumGC from runtime limit 3;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djimGw/btrDVC7nS3x/aDnsm9UgaaylrMntF8PP50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djimGw/btrDVC7nS3x/aDnsm9UgaaylrMntF8PP50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djimGw/btrDVC7nS3x/aDnsm9UgaaylrMntF8PP50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjimGw%2FbtrDVC7nS3x%2FaDnsm9UgaaylrMntF8PP50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;170&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. InfluxDB 종료&lt;/h4&gt;
&lt;pre id=&quot;code_1654184545073&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;quit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;pre id=&quot;code_1654184552317&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;146&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S3aAM/btrDPZ93rDW/LHtSKvDFm0RpEpTCP1zRY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S3aAM/btrDPZ93rDW/LHtSKvDFm0RpEpTCP1zRY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S3aAM/btrDPZ93rDW/LHtSKvDFm0RpEpTCP1zRY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS3aAM%2FbtrDPZ93rDW%2FLHtSKvDFm0RpEpTCP1zRY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;84&quot; data-origin-width=&quot;146&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. InfluxDB 실행 시 옵션 추가&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 조회(select) 시 읽기 쉬운 형태의 시간(timestamp)이 표현된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654184679422&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;influx -precision rfc3339&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pT4D6/btrDPBWgqYK/OBHSJOGnVhyGTU2A8NPSF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pT4D6/btrDPBWgqYK/OBHSJOGnVhyGTU2A8NPSF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pT4D6/btrDPBWgqYK/OBHSJOGnVhyGTU2A8NPSF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpT4D6%2FbtrDPBWgqYK%2FOBHSJOGnVhyGTU2A8NPSF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;260&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;create database {DB 명}&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654184749930&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create database test_beom&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjS4bh/btrDRjty8GB/AsxiWR4yNkSVK04FVGD4ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjS4bh/btrDRjty8GB/AsxiWR4yNkSVK04FVGD4ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjS4bh/btrDRjty8GB/AsxiWR4yNkSVK04FVGD4ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjS4bh%2FbtrDRjty8GB%2FAsxiWR4yNkSVK04FVGD4ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;277&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp; Influx 내 데이터베이스 중 회사에서 쓰이는 데이터베이스가 있으므로 해당 부분은 가리겠습니다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이번 글은 여기까지만 작성해보려고 합니다&lt;br /&gt;다음 글은 InfluxQL(CRUD)에 대해서 다뤄보도록 하겠습니다!&lt;br /&gt;감사합니다 :)&lt;/blockquote&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;050&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Database/InfluxDB</category>
      <category>influxdb</category>
      <category>대용량 데이터처리</category>
      <category>시계열 데이터베이스</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/7</guid>
      <comments>https://beomdrive.tistory.com/7#entry7comment</comments>
      <pubDate>Fri, 3 Jun 2022 00:55:00 +0900</pubDate>
    </item>
    <item>
      <title>CORS, 그 속으로</title>
      <link>https://beomdrive.tistory.com/6</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;CORS Error는 왜 발생할까?&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;Access to XMLHttpRequest at '주소 A' from origin '주소 B' has been blocked by CORS policy:&lt;br /&gt;No 'Access-Control-Allow-Origin' header is present on the requested resource.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JOkMF/btrKFd9kv3L/F9MXpJSK5aE76GBEbZKxnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JOkMF/btrKFd9kv3L/F9MXpJSK5aE76GBEbZKxnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JOkMF/btrKFd9kv3L/F9MXpJSK5aE76GBEbZKxnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJOkMF%2FbtrKFd9kv3L%2FF9MXpJSK5aE76GBEbZKxnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;89&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;101&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;CORS Error는 동일 출처 정책(SOP: Same-Origin Policy)에 의해서&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;CORS는 SOP를 피하기(허용) 위한 수단이다!&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;h2 data-ke-size=&quot;size26&quot;&gt;SOP란 무엇일까? (Same-Origin Policy: 동일 출처 정책)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 웹 브라우저는 SOP라는 보안 정책을 준수합니다&lt;/li&gt;
&lt;li&gt;SOP는 한 Origin(내가 현재 접속해 있는 사이트)에서 로드된 문서나 스크립트가 다른 Origin(다른 사이트)에서 가져온 리소스와 상호 작용하는 것을 제한하는 보안 방식입니다&lt;/li&gt;
&lt;li&gt;말 그대로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;같은 출처에서만 리소스를 공유할 수 있다&lt;/b&gt; 라는 규칙을 가진 정책입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bawNMK/btrKFf7cDgC/Urxs5WdYOmrQFtqvRUkuP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bawNMK/btrKFf7cDgC/Urxs5WdYOmrQFtqvRUkuP0/img.png&quot; data-alt=&quot;이미지 출처: https://evan-moon.github.io/2020/05/21/about-cors/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bawNMK/btrKFf7cDgC/Urxs5WdYOmrQFtqvRUkuP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbawNMK%2FbtrKFf7cDgC%2FUrxs5WdYOmrQFtqvRUkuP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;351&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://evan-moon.github.io/2020/05/21/about-cors/&lt;/figcaption&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;SOP는 왜 만들어졌을까?&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;당장 F12 개발자 도구만 켜도 소스코드가 적나라하게 드러나며, 어떤 서버와 어떻게 통신하는지에 대한 각종 정보들을 무리 없이 열람할 수 있습니다&lt;/li&gt;
&lt;li&gt;만약 SOP 정책이 없다면 서로 다른 두 애플리케이션이 마음대로 소통할 수 있는 환경이 됩니다&lt;/li&gt;
&lt;li&gt;이 말은 즉슨 다른 출처의 애플리케이션에서 악의적인 목적으로 사용자의 정보를 탈취하기가 너무나도 쉬워진다는 겁니다&lt;/li&gt;
&lt;li&gt;따라서 같은 출처에서만 리소스를 공유할 수 있다는 규칙(SOP)을 default로 하여 어느 정도의 보안적인 이점을 가져갈 수 있습니다&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;출처(Origin) 란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 설명에서 출처(Origin)라는 말이 계속 나오고 있습니다&lt;/li&gt;
&lt;li&gt;출처는 &lt;b&gt;Protocol + Host+ Port 의 쌍&lt;/b&gt;을 말합니다&lt;/li&gt;
&lt;li&gt;즉 URL의 맨 앞 3개의 요소인 프로토콜, 호스트, 포트번호가 동일하다면 같은 출처라고 판단하여&lt;br /&gt;SOP(동일 출처 정책)에 가로막히지 않습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;용어&lt;/td&gt;
&lt;td&gt;조건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same Origin (동일 출처)&lt;/td&gt;
&lt;td&gt;Protocol, Host, Port 모두 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross Origin (다른 출처, 교차 출처)&lt;/td&gt;
&lt;td&gt;Protocol, Host, Port 중 하나라도 다를 시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opVKJ/btrKHbotlD5/rbAdkKKVPyFllRZpvQLKzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opVKJ/btrKHbotlD5/rbAdkKKVPyFllRZpvQLKzK/img.png&quot; data-alt=&quot;이미지 출처: [10분 테코톡] 나붐의 CORS (https://youtu.be/-2TgkKYmJt4?t=62)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opVKJ/btrKHbotlD5/rbAdkKKVPyFllRZpvQLKzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopVKJ%2FbtrKHbotlD5%2FrbAdkKKVPyFllRZpvQLKzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;308&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: [10분 테코톡] 나붐의 CORS (https://youtu.be/-2TgkKYmJt4?t=62)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  IE(Internet Explorer)에서는 SOP(동일 출처 정책) 기준에 두 가지 예외사항이 있습니다&lt;br /&gt;하지만 IE는 거의 사용되지 않는 브라우저이므로 해당 예외사항은 알고만 있으면 될 것 같습니다&lt;/blockquote&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;양쪽 도메인 모두 &amp;ldquo;높음&amp;rdquo; 단계의 보안 수준을 가지고 있을 경우 두 출처가 다르더라도 SOP에 가로막히지 않습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 포트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 출처라고 판단하는 기준에서 포트를 포함하지 않습니다&lt;/li&gt;
&lt;li&gt;따라서 IE에서는 Protocol + Host만 동일하다면 같은 출처로 판단합니다&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;CORS란? (Cross-Origin Resource Sharing: 교차 출처 리소스 공유)&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;/li&gt;
&lt;li&gt;CORS란 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이&lt;span&gt;&amp;nbsp;&lt;/span&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;CORS는 어떻게 동작할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 상기하자면 CORS Error는 브라우저에서 발생시키는 오류입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 CORS Error의 발생 과정은 다음과 같습니다&lt;/p&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. HTTP 요청을 하면 브라우저는 요청 헤더에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Origin이라는 필드를 추가합니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Origin&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 요청을 보낸 출처 (ex.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/giibeom&quot;&gt;https://github.com/giibeom&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이후 서버는 응답을 내려줄 때 응답 헤더에&lt;span&gt;&amp;nbsp;access-control-allow-origin&amp;nbsp;라는&lt;/span&gt; 필드를 내려줍니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;access-control-allow-origin&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 해당 리소스를 접근할 수 있게 허용된 출처 (ex.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;access-control-allow-origin:&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;b&gt;*&lt;/b&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;모든 출처를 허용한다는 와일드카드 :&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 브라우저는 응답을 반환하기 전에 Origin과 access-control-allow-origin 값을 비교하여 응답의 유효성을 검증합니다&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;span&gt;&amp;nbsp;&lt;/span&gt;브라우저 단에서 판단하여 응답을 그대로 반환할지 버릴지 판단하는 것입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CORS 접근제어 시나리오&lt;/h2&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;해당 메커니즘, 즉 CORS의 접근제어 시나리오는 대표적으로 3가지의 시나리오로 나뉩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 프리플라이트 요청 (Preflight Request)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 단순 요청 (Simple Request)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 인증정보 포함 요청 (Credentialed Request)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프리플라이트 요청 (Preflight Request)&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;br /&gt;이 요청이 유효한지를 확인합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예비 요청을 프리플라이트(Preflight)라고 부르는 것이며 HTTP 메서드 중&lt;span&gt;&amp;nbsp;&lt;b&gt;OPTIONS&amp;nbsp;&lt;/b&gt;라는&lt;/span&gt; 메서드를 사용합니다&lt;/li&gt;
&lt;/ul&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;h4 data-ke-size=&quot;size20&quot;&gt;Preflight 동작 흐름&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 클라이언트에서 다른 출처에 리소스 자원을 요청합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 브라우저에서는 본 요청을 잠시 대기시켜놓고 예비 요청을 보낼 준비를 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 예비 요청은 OPTIONS 메서드를 사용하며 요청 헤더에는 아래와 같은 정보를 담습니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Origin&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 요청 출처&lt;/li&gt;
&lt;li&gt;Access-Control-Request-Method&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 실제 요청의 메서드&lt;/li&gt;
&lt;li&gt;Access-Control-Request-Headers&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 실제 요청의 추가 헤더&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 예비 요청을 받은 서버는 현재 자신이 어떤 것들을 허용하고 있는지에 대한 정보들을 응답 헤더를 통해 반환합니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예비 요청(Preflight Request)의 응답은 코드는 200, 바디는 비어있는 것이 좋습니다&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Origin&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 서버 측 허가 출처&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Methods&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 서버 측 허가 메서드&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Headers&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 서버 측 허가 헤더&lt;/li&gt;
&lt;li&gt;Access-Control-Max-Age&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Preflight 응답 캐시 기간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프리플라이트(Preflight Request) 방식은 매 요청마다 2개의 요청을 보내는 셈이 됩니다&lt;/li&gt;
&lt;li&gt;따라서&lt;span&gt;&amp;nbsp;&lt;/span&gt;Access-Control-Max-Age는 효율적으로 리소스를 관리해주기 위해 필요한 값입니다&lt;/li&gt;
&lt;li&gt;브라우저는 Access-Control-Max-Age 값 기준으로 캐싱을 하여, 캐시 기간 내에는 해당 출처에 대한 모든 요청에 대해서 Preflight Request를 진행하지 않고 바로 본 요청을 진행합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG0Fuf/btrKFR52NDN/62mTaekQyiqCMeQT3fvTSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG0Fuf/btrKFR52NDN/62mTaekQyiqCMeQT3fvTSK/img.png&quot; data-alt=&quot;이미지 출처: https://evan-moon.github.io/2020/05/21/about-cors/#preflight-request&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG0Fuf/btrKFR52NDN/62mTaekQyiqCMeQT3fvTSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG0Fuf%2FbtrKFR52NDN%2F62mTaekQyiqCMeQT3fvTSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;590&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://evan-moon.github.io/2020/05/21/about-cors/#preflight-request&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;브라우저는 리소스 효율 때문에 캐시까지 사용해가며 예비 요청(Preflight Request)을 하는 이유가 뭘까?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CORS spec이 생기기 이전에 만들어진 서버는 브라우저의 SOP 보안 정책으로 인해 같은 출처에서만 요청이 가능하다는 가정하에 개발되었습니다&lt;/li&gt;
&lt;li&gt;이 말은 즉슨 이전에 만들어진 서버들은 Cross-Origin(교차 출처, 다른 출처)에서의 접근에 대한 보안 메커니즘이 존재하지 않습니다&lt;/li&gt;
&lt;li&gt;만약 Preflight가 없고 CORS에 대응도 안 되는 서버일 경우에는 다음과 같은 문제가 있을 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 다른 출처에서 DB의 DELETE가 발생하는 요청을 합니다&lt;br /&gt;2. CORS의 설정이 없기 때문에 서버 측 허가 출처인 Access-Control-Allow-Origin 이 존재하지 않습니다&lt;br /&gt;3. 하지만 Preflight가 없이 다이렉트로 서버에 꽂힌 요청은 서버에서 모든 동작이 완료된 후, 결과 반환 직전에 브라우저에서 CORS Error를 뱉습니다&lt;br /&gt;4. 뒤늦게 브라우저는 CORS Error를 뱉지만 실제 서버에서는 DB 삭제가 진행되었습니다&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;따라서 이러한 상황을 방지하고자 &lt;b&gt;CORS 설정이 안 되어 있는 서버들을 보호하기 위해 &lt;/b&gt;CORS spec에&lt;br /&gt;예비 요청(preflight request)을 포함시켰다고 합니다&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;span&gt;&amp;nbsp;&lt;a href=&quot;http://www.google.com/&quot;&gt;www.google.com&lt;/a&gt;&amp;nbsp;에서&lt;/span&gt; 제 블로그로 리소스 요청을 전송하였고, 브라우저가 자동으로 진행한 예비 요청(Preflight Request)의 예시입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Nq8F/btrKFETnlga/x0CDgJmAZkZy2V6h5WJfE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Nq8F/btrKFETnlga/x0CDgJmAZkZy2V6h5WJfE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Nq8F/btrKFETnlga/x0CDgJmAZkZy2V6h5WJfE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Nq8F%2FbtrKFETnlga%2Fx0CDgJmAZkZy2V6h5WJfE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;1004&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;1004&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;예비 요청 응답 코드가 200으로 떨어지는 이유는, CORS 에러가 발생하는 시점은 서버의 CORS 허용 정보들을 반환한 다음에 일어나고 실제 예비 요청 자체는 성공하기 때문입니다&lt;/li&gt;
&lt;li&gt;예시 내 응답 헤더에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Access-Control-Allow-Origin과 요청 헤더에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Origin이 서로 다르기 때문에, 예시 아래의 콘솔창과 같이 CORS 에러가 발생하는 것을 볼 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 단순 요청 (Simple Request)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순 요청 방식은 Preflight 요청 없이 바로 다이렉트로 서버에 요청을 꽂아 넣는 방식입니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서 간단하게 설명했던 CORS Error의 발생 과정과 동일하다고 보면 될 것 같습니다&lt;br /&gt;(CORS는 어떻게 동작할까?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리소스 자원을 서버로 바로 요청할 경우 서버는 요청 데이터와 함께&lt;span&gt;&amp;nbsp;&lt;/span&gt;Access-Control-Allow-Origin&lt;span&gt;&amp;nbsp;&lt;/span&gt;값을 반환해줍니다&lt;/li&gt;
&lt;li&gt;브라우저에서는 응답을 반환하기 전 응답 데이터에 있는&lt;span&gt;&amp;nbsp;Access-Control-Allow-Origin&amp;nbsp;와&lt;/span&gt; Request 시 보냈던&lt;span&gt;&amp;nbsp;&lt;/span&gt;Origin을 판별하여 응답의 여부를 결정합니다&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;하지만 단순 요청 (Simple Request) 방식이 일어나는 상황은 아래와 같은 조건을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;모두&amp;rdquo;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;충족할 때 일어납니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 요청의 메서드는&lt;span&gt;&amp;nbsp;&lt;/span&gt;GET,&lt;span&gt;&amp;nbsp;&lt;/span&gt;HEAD,&lt;span&gt;&amp;nbsp;&lt;/span&gt;POST&lt;span&gt;&amp;nbsp;&lt;/span&gt;중 하나여야 합니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Content-Type 에서는 3가지만 허용됩니다&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;application/x-www-form-urlencoded&lt;/li&gt;
&lt;li&gt;multipart/form-data&lt;/li&gt;
&lt;li&gt;text/plain&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 요청 헤더에는 해당 값들만 허용됩니다&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;Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width&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;사실상 3가지의 조건이 모두 충족하기란 쉽지 않습니다 (2, 3 때문에)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2번이 충족되기 어려운 이유는 최근 주로 사용되는 Content-Type은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;application/json&lt;/b&gt;이 많이 사용되기 때문입니다&lt;/li&gt;
&lt;li&gt;3번이 충족되기 어려운 이유는 보통 최근의 토큰 인증 방식으로 헤더에&lt;span&gt;&amp;nbsp;&lt;b&gt;Authorization&lt;/b&gt;&amp;nbsp;를&lt;/span&gt; 많이 세팅하기 때문입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 인증정보를 포함한 요청 (Credentialed Request)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Credentialed Request 방식은 인증된 요청을 사용하는 방식입니다&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;브라우저는 기본적으로 HTTP 통신 시 자동으로 쿠키를 헤더에 포함시켜주지만,&lt;br /&gt;JavaScript를 사용해 만든 &lt;b&gt;교차 출처 요청&lt;/b&gt;에는 Cookie를 헤더에 기본적으로 포함시키지 않습니다&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Not-Default)&lt;/span&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;해당 방식은 &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;size18&quot;&gt;&lt;b&gt;클라이언트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;credentials&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 요청에 인증과 관련된 정보를 담을 수 있게 하는 옵션&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;옵션 값&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;동작 설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;same-origin (기본 값)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;같은 출처 간 요청에만 인증 정보를 담을 수 있습니다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;include&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;모든 요청에 인증 정보를 담을 수 있습니다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;omit&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;모든 요청에 인증 정보를 담지 않습니다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  예시를 들어보자&lt;br /&gt;
&lt;pre id=&quot;code_1661513438563&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fetch('서버주소', {
    credentials: 'include',
});&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약&lt;span&gt;&amp;nbsp;&lt;/span&gt;credentials&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;omit을 제외한 나머지 옵션(same-origin, include)&lt;/b&gt;을 설정하게 되면&lt;br /&gt;브라우저는 기존에 진행했던 Origin &amp;lt;-&amp;gt; Access-Control-Allow-Origin&lt;span&gt; 비교 외&lt;/span&gt;에도 추가적인 검사를 진행합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;서버&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;credentials&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정을 하였다면 두 가지의 설정을 하여야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 응답&amp;nbsp;헤더에&amp;nbsp;Access-Control-Allow-Credentials:&amp;nbsp;true&amp;nbsp;를&amp;nbsp;반환해야&amp;nbsp;합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모든 출처를 허가하겠다는 &lt;b&gt;Access-Control-Allow-Origin: *&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;와일드카드가 아닌 명시적인 URL을 설정해주어야 합니다&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;CORS Error를 해결하는 방법은 뭘까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금까지는 CORS에 대한 전반적인 개념과 CORS의 동작 방식 및 시나리오에 대해서 알아봤습니다&lt;/li&gt;
&lt;li&gt;이젠 CORS를 잘 사용하여 합법적(?)으로 다른 출처의 리소스 자원을 사용하는 방법에 대해서 알아보겠습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CORS Error를 해결하는 방법은 크게 3가지가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 서버에서&lt;span&gt; &quot;&lt;/span&gt;Access-Control-Allow-Origin&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정해주기 (정석)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 프론트 프록시 서버 설정을 변경해주기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. CORS 기능 끄기 (로컬 개발 시 급할 때만 쓰자!)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 서버에서 Access-Control-Allow-Origin 설정해주기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 기준으로 서버에서 CORS 관련 설정하는 방법은 크게 두 가지가 존재합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. @Configuration 설정 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2. @CrossOrigin 설정 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. @Configuration 설정 방법&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 방식은 Configuration 어노테이션을 통해 전역으로 처리하는 방법입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1661516931393&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 전역적으로 CORS 설정을 할 수 있는 방법
@Configuration
public class CorsFilter implements WebMvcConfigurer { // WebMvcConfigurer 구현
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping(&quot;/api&quot;) // 적용할 path 패턴을 입력
                .allowedOrigins(&quot;http://localhost:8081&quot;) // 허가할 출처들을 기입
                .allowedMethods(    // 허가할 메서드를 기입
                        HttpMethod.GET.name,
                        HttpMethod.POST.name,
                        HttpMethod.PUT.name,
                        HttpMethod.DELETE.name
                );
    }
}&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. @CrossOrigin 설정 방법&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;CORS 설정을 적용시킬 Class 혹은 Method 위에 @CrossOrigin 어노테이션을 붙이면 됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1661517044492&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequiredArgsConstructor
@RequestMapping(&quot;/api&quot;)
@CrossOrigin(origins = {&quot;http://localhost:3000&quot;, &quot;http://localhost:8080&quot;}, allowCredentials = &quot;true&quot;)
public class MemberController {

    @GetMapping(&quot;/hello&quot;)
    public String Hello() {
        return &quot;hello&quot;;
    }
}&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;하지만 위 방식은 각각의 Class 혹은 Method 마다 선언해줘야 하므로 보통은 1번 방식을 많이 사용합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 프론트 프록시 서버에서 설정해주기&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;브라우저와 프론트 프록시 서버는 출처가 동일하므로 CORS Error가 발생하지 않습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OdcPb/btrKHdf3oI7/fFvSzoDaLtmkfymZoOomc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OdcPb/btrKHdf3oI7/fFvSzoDaLtmkfymZoOomc1/img.png&quot; data-alt=&quot;이미지 출처: [10분 테코톡] 나붐의 CORS (https://youtu.be/-2TgkKYmJt4?t=62)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OdcPb/btrKHdf3oI7/fFvSzoDaLtmkfymZoOomc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOdcPb%2FbtrKHdf3oI7%2FfFvSzoDaLtmkfymZoOomc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;403&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: [10분 테코톡] 나붐의 CORS (https://youtu.be/-2TgkKYmJt4?t=62)&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. CORS 기능 끄기 (로컬 개발 시 급할 때만 쓰자!)&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;blockquote data-ke-style=&quot;style2&quot;&gt;근본적인 해결이 될 때까지 임시적으로 사용하는 방법입니다! &amp;rarr; 광고 아닙니다.....&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Chrome 웹스토어에 들어갑니다 &amp;rarr; &lt;/b&gt;&lt;a href=&quot;https://chrome.google.com/webstore&quot;&gt;&lt;b&gt;https://chrome.google.com/webstore&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. CORS를 검색합니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. CORS를 허용하게끔 도와주는 확장 프로그램을 다운로드합니다&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;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biZu0f/btrKHVeT66r/QxmLy6Tx9xMIqAKFhG8yOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biZu0f/btrKHVeT66r/QxmLy6Tx9xMIqAKFhG8yOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biZu0f/btrKHVeT66r/QxmLy6Tx9xMIqAKFhG8yOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiZu0f%2FbtrKHVeT66r%2FQxmLy6Tx9xMIqAKFhG8yOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;381&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;381&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;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -304px / 200px 420px no-repeat; width: 200px; height: 19px; padding: 18px 20px 17px;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 CORS 에러를 겪고 나서 제대로 정리하고 싶어서 공부해보았습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 CORS 에러가 &quot;CORS&quot; 때문에 에러가 난다고 생각했지만, 알고 보니 SOP 정책 때문에 에러가 나는 것이고 CORS는 이 SOP 정책을 합법적(?)으로 사용하게 도와주는 방법이더군요 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 실무에서는 Spring에 이미 CORS 허용 설정이 되어있겠지만, 제 경우에는 Spring 모듈과의 통신이 아닌 contents 서버와의 자원(파일) 공유 중 CORS 에러를 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;맞닥뜨린 경험이 있어 Port를 맞춰줌으로써 문제를 해결했었던 기억이 있네요!&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;CORS의 전반적인 역사와 근본적인 내용&lt;/b&gt;이 담긴 블로그 글이 있길래 소개 드리면서 마무리하겠습니다 :) &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://ui.toast.com/weekly-pick/ko_20211110&quot;&gt;CORS에서 이기는 방법&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&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://youtu.be/bW31xiNB8Nc&quot;&gt;얄코 - 웹 개발 짜증유발자! CORS가 뭔가요?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/-2TgkKYmJt4?t=62&quot;&gt;[10분 테코톡] 나붐의 CORS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy&quot;&gt;https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/CORS&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/CORS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://evan-moon.github.io/2020/05/21/about-cors/#preflight-request&quot;&gt;https://evan-moon.github.io/2020/05/21/about-cors/#preflight-request&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;잘못된 내용이나, 보충할 내용이 있다면 언제든지 편하게 연락 주시면 감사하겠습니다 :)&lt;br /&gt;&lt;br /&gt; &amp;zwj;♂️ Call me&lt;br /&gt;Email : dev.gibeom@gmail.com&lt;br /&gt;KakaoTalk : https://open.kakao.com/me/beomdrive&lt;/blockquote&gt;</description>
      <category>Computer-Science/네트워크</category>
      <category>CORS</category>
      <category>CORS policy</category>
      <category>Cross-Origin Resource Sharing</category>
      <category>SOP</category>
      <category>교차출처</category>
      <author>기범_Alex</author>
      <guid isPermaLink="true">https://beomdrive.tistory.com/6</guid>
      <comments>https://beomdrive.tistory.com/6#entry6comment</comments>
      <pubDate>Sun, 13 Feb 2022 16:21:12 +0900</pubDate>
    </item>
  </channel>
</rss>