<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DEVELOPyo</title>
    <link>https://developyo.tistory.com/</link>
    <description>since 2018.12~</description>
    <language>ko</language>
    <pubDate>Tue, 16 Jun 2026 17:34:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>펭귄대장</managingEditor>
    <item>
      <title>intellij 내에서 파일 열리지 않을 때</title>
      <link>https://developyo.tistory.com/entry/intellij-%EB%82%B4%EC%97%90%EC%84%9C-%ED%8C%8C%EC%9D%BC-%EC%97%B4%EB%A6%AC%EC%A7%80-%EC%95%8A%EC%9D%84-%EB%95%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;preferences -&amp;gt; file Types -&amp;gt; File type auto-detected by file content 선택 후 File name patterns 제거&lt;/p&gt;</description>
      <category>etc./etc.</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/458</guid>
      <comments>https://developyo.tistory.com/entry/intellij-%EB%82%B4%EC%97%90%EC%84%9C-%ED%8C%8C%EC%9D%BC-%EC%97%B4%EB%A6%AC%EC%A7%80-%EC%95%8A%EC%9D%84-%EB%95%8C#entry458comment</comments>
      <pubDate>Mon, 15 Apr 2024 10:16:35 +0900</pubDate>
    </item>
    <item>
      <title>Datadog aws metric 연동</title>
      <link>https://developyo.tistory.com/entry/Datadog-aws-metric-%EC%97%B0%EB%8F%99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DATADOG -&amp;gt; Integrations -&amp;gt; AWS Install -&amp;gt; Configure -&amp;gt; Account 선택 -&amp;gt; Metric Collection 에서 search -&amp;gt; enable&lt;/p&gt;
&lt;p data-ke-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>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/457</guid>
      <comments>https://developyo.tistory.com/entry/Datadog-aws-metric-%EC%97%B0%EB%8F%99#entry457comment</comments>
      <pubDate>Tue, 27 Feb 2024 12:41:59 +0900</pubDate>
    </item>
    <item>
      <title>intellij eclipse import 시 파일 인덱스 문제</title>
      <link>https://developyo.tistory.com/entry/intellij-eclipse-import-%EC%8B%9C-%ED%8C%8C%EC%9D%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EB%AC%B8%EC%A0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파일 간의 이동(hierarchy / reference 이동) 할 때 ctrl / command 키 + 클릭 으로 이동이 가능한데&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f6aa2daf-e63d-40da-a603-f13c44c34b54&quot; style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&quot;cannot find declaration to go to&quot;  alert 과 함께&amp;nbsp;&lt;/span&gt;&lt;span&gt;이동이 안되는 현상.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[ 해결방법 ]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6df4b87e-5e46-4f01-9e4f-90474ffc1e2d&quot; style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;src 폴더 우클릭 -&amp;gt; &lt;/span&gt;&lt;span&gt;Mark directory as -&amp;gt; Sources Root 클릭&lt;/span&gt;&lt;/p&gt;</description>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/456</guid>
      <comments>https://developyo.tistory.com/entry/intellij-eclipse-import-%EC%8B%9C-%ED%8C%8C%EC%9D%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EB%AC%B8%EC%A0%9C#entry456comment</comments>
      <pubDate>Thu, 15 Feb 2024 14:07:18 +0900</pubDate>
    </item>
    <item>
      <title>cold vs hot sequence</title>
      <link>https://developyo.tistory.com/entry/cold-vs-hot-sequence</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cold Sequence&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구독 할 때마다 타임라인이 새로 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구독하는 시점과 상관없이 첫번째로 emit 된 데이터부터 읽을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Flux.fromIterable(Array.asList(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribe(data -&amp;gt; Logger.info(&quot;data : {}&quot;, data) // ABC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribe(data -&amp;gt; Logger.info(&quot;data : {}&quot;, data) // ABC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;Hot Sequence&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임라인이 하나만 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구독하는 시점에 따라 구독 시점 이후로 emit 된 데이터만 읽을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Flux.fromStream(Stream.of(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;).delayElements(Duration.ofSeconds(1)).share()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribe(data -&amp;gt; Logger.info(&quot;data : {}&quot;, data) // A B&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TimeUtils.sleep(2000)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribe(data -&amp;gt; Logger.info(&quot;data : {}&quot;, data) // C&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* share() : cold 시퀀스를 hot 시퀀스로 변환해줌&lt;/p&gt;</description>
      <category>back/Reactive Java</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/452</guid>
      <comments>https://developyo.tistory.com/entry/cold-vs-hot-sequence#entry452comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:19:34 +0900</pubDate>
    </item>
    <item>
      <title>Reactive 란?</title>
      <link>https://developyo.tistory.com/entry/Reactive-%EB%9E%80</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reactive System 설계 원칙&lt;/h4&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;Responsive : 응답성 즉각적인 응답&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resilient : 회복성 장애시 회복성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Elastic : 탄력성 작업량 변화에도 응답성을 유지하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Message Driven : 비동기(async) 메시지 주고받아 느슨한 결합(loose coupling), 위치 투명성(location transparency) 보장&lt;/p&gt;
&lt;p data-ke-size=&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;Reactive programming 특징&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 데이터 소스에 변경이 있을때마다 데이터를 전파 - publisher 데이터 전파, subscriber 전파된 데이터를 받아서 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 선언형 프로그래밍 패러다임 : 실행할 동작을 구체적으로 명시하지 않고 목표만 정의&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 함수형 프로그래밍 기법 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;명령형 프로그래밍 vs 선언형 프로그래밍&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령형 프로그래밍&lt;/p&gt;
&lt;pre id=&quot;code_1697464876987&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Integer&amp;gt; numbers = Arrays.asList(1,3,21,10,8);
int sum = 0;

for (int number: numbers) {
 if (number &amp;gt; 6 &amp;amp;&amp;amp; (number % 2 != 0)) {
   sum += number;
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언형 프로그래밍&lt;/p&gt;
&lt;pre id=&quot;code_1697464927628&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Integer&amp;gt; numbers = Arrays.asList(1,3,21,10,8);

int sum = numbers.stream()
	.filter(number -&amp;gt; number &amp;gt; 6 &amp;amp;&amp;amp; number%2!=0)
	.mapToInt(number -&amp;gt; number)
	.sum();&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;Reactive Streams 란?&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;a href=&quot;https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#specification&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#specification&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;reactive streams 4가지 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Publisher : 데이터 통제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Subscriber : 퍼블리셔가 통제한 데이터를 구독하는 구독자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Subscription : 구독 자체를 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Process : Publisher &amp;amp; Subsriber 역할을 동시에 할 수 있는 인터페이스&lt;/p&gt;
&lt;p data-ke-size=&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;Reactive Streams 구현체&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) RxJava&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Java 9 Flow API&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Akka Streams&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Reactor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) RxJS, RxScala, RxAndroid 등..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;reactivemanifesto.org&lt;/p&gt;</description>
      <category>back/Reactive Java</category>
      <category>reactive</category>
      <category>rxjava</category>
      <category>webflux</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/451</guid>
      <comments>https://developyo.tistory.com/entry/Reactive-%EB%9E%80#entry451comment</comments>
      <pubDate>Mon, 16 Oct 2023 23:06:53 +0900</pubDate>
    </item>
    <item>
      <title>apply, also, let, with, run 차이</title>
      <link>https://developyo.tistory.com/entry/apply-also-let-with-run-%EC%B0%A8%EC%9D%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;* apply: 전달 받은 수신 객체를 변경하여 반환할 때 사용/ 전달받은 수신 객체 반환&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;* also: 전달 받은 수신 객체를 변경하지 않고 사용할 때 사용(데이터의 유효성 검사할때 유용함)/ 전달 받은 수신 객체 반환&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;* let: Nullable 수신 받은 객체가 널이 아닌경우 수행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;* with: non-nullable(null이 될수 없는) 객체이고 결과가 필요 없는 경우에만 사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;* run: 어떤 값을 계산할 필요가 있거나, 지역 변수를 제한하려 할때 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/Kotlin</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/450</guid>
      <comments>https://developyo.tistory.com/entry/apply-also-let-with-run-%EC%B0%A8%EC%9D%B4#entry450comment</comments>
      <pubDate>Thu, 7 Sep 2023 15:24:17 +0900</pubDate>
    </item>
    <item>
      <title>[Intellij] Syntax highlighting has been temporarily turned off 에러</title>
      <link>https://developyo.tistory.com/entry/Syntax-highlighting-has-been-temporarily-turned-off-%EC%97%90%EB%9F%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Intellij Syntax highlighting has been temporarily turned off 에러 발생시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bean 주입받는 모든 곳에서 import 에러 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File &amp;gt; Repair IDE 클릭 &amp;gt; 문제가 해결될 때 까지 Fix Next Step&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/kotest/kotest-intellij-plugin/issues/168&quot;&gt;https://github.com/kotest/kotest-intellij-plugin/issues/168&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc./error note</category>
      <category>Intellij</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/446</guid>
      <comments>https://developyo.tistory.com/entry/Syntax-highlighting-has-been-temporarily-turned-off-%EC%97%90%EB%9F%AC#entry446comment</comments>
      <pubDate>Tue, 30 May 2023 20:41:32 +0900</pubDate>
    </item>
    <item>
      <title>Resilience4j / CircuitBreaker 개념</title>
      <link>https://developyo.tistory.com/entry/Resilience4j-CircuitBreaker-%EA%B0%9C%EB%85%90</link>
      <description>&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-서킷브레이커(CircuitBreaker)란&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서킷브레이커(CircuitBreaker)란&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서킷브레이커 패턴이란 외부 서비스에 의한 문제를 방지하기 위해 등장한 디자인 패턴으로 문제가 발생한 지점을 감지하고 실패하는 요청을 계속하지 않도록 방지합니다.&lt;br /&gt;그리고 이를 통해 시스템의 장애 확산을 막고 장애 복구를 도와주며 유저는 불필요하게 대기하지 않게 됩니다.&lt;br /&gt;가정집에 있는 누전차단기가 화재를 막는 것과 비슷하게 CircuitBreaker(직역하면 회로차단기)는 서비스의 장애 전파를 막는다고 이해하면 됩니다.&lt;br /&gt;&lt;br /&gt;아래 그림과 같이 ServiceA가 ServiceB를 호출 할 때&lt;br /&gt;ServiceB가 반복적으로 실패한다면 CircuitBreaker 를 Open 하여 ServiceB에 대한 흐름을 차단하는게 서킷브레이커의 역할입니다.&lt;br /&gt;* CircuitBreaker 의 Open 은 흐름을 차단하는 것으로, 흐름을 열어둔다(opened) 라는 의미가 아닙니다.&lt;br /&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;반대로 CircuitBreaker 의 Closed 상태는 흐름을 허용하는 정상상태를 의미합니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-24 오후 3.49.05.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8ZLw/btseBc0V7H0/rbps9LhpH8pNuyJDPxWHN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8ZLw/btseBc0V7H0/rbps9LhpH8pNuyJDPxWHN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8ZLw/btseBc0V7H0/rbps9LhpH8pNuyJDPxWHN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8ZLw%2FbtseBc0V7H0%2Frbps9LhpH8pNuyJDPxWHN1%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;410&quot; height=&quot;358&quot; data-filename=&quot;스크린샷 2023-04-24 오후 3.49.05.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;이미지 출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://symphony.is/blog/service-resiliency-with-spring-boot-and-resilience4j&quot;&gt;https://symphony.is/blog/service-resiliency-with-spring-boot-and-resilience4j&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&quot;CircuitBreaker 가 무엇인지 그리고 어떤 역할을 하는지 알았으니, 이제 CircuitBreaker의 상태인 Closed/Open/Half Open에 대해 좀 더 알아보겠습니다.&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-서킷브레이커의3가지상태&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서킷브레이커의 3가지 상태&lt;/b&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot;&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;Closed&lt;/td&gt;
&lt;td&gt;Open&lt;/td&gt;
&lt;td&gt;HalfOpen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;상황&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;정상&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;장애&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;Open 상태가 되고 일정 요청 횟수/시간이 지난 상황.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Open 으로 상태를 변경할지, Closed 로 상태를 변경할지에 대한 판단이 이루어지는 상황&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;요청에 대한 처리&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;요청에 대한 처리 수행.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;정해진 횟수만큼 실패할 경우 Open 상태로 변경&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;외부 요청을 차단하고 에러를 뱉거나 지정한 callback 메소드를 호출&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;요청에 대한 처리를 수행하고 실패시 CircuitBreaker 를 Open 상태로 변경.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;성공시 CircuitBreaker를 Close 상태로 변경&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 서킷브레이커에서 장애판단의 기준(Closed 상태에서 Open 이 되기 위해 카운팅 되는 실패의 기준)은 아래와 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) slow call : 기준보다 오래 걸린 요청&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) failure call : 실패하거나 오류 응답을 받은 요청&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* slow call 과 failure call 은 CircuitBreaker의 프로퍼티로 정의되어 있으며 사용자가 특정 값으로 지정할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;아래는 CircuitBreaker 의 3가지 상태에 대해 이해를 돕기 위한 순서도와 그림입니다.&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-24 오후 4.32.27.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bONZoA/btseCEJELcA/y3qCwRqyyB6mRHZblsvEck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bONZoA/btseCEJELcA/y3qCwRqyyB6mRHZblsvEck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bONZoA/btseCEJELcA/y3qCwRqyyB6mRHZblsvEck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbONZoA%2FbtseCEJELcA%2Fy3qCwRqyyB6mRHZblsvEck%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;400&quot; data-filename=&quot;스크린샷 2023-04-24 오후 4.32.27.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-서킷브레이커상태변경&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서킷브레이커 상태 변경&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이미지 출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://martinfowler.com/bliki/CircuitBreaker.html&quot;&gt;https://martinfowler.com/bliki/CircuitBreaker.html&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서킷브레이커의 상태는 아래와 같이 변경됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;정상 요청 수행(Closed)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 실패 임계치 도달(Closed &amp;rarr; Open)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 일정시간 소요(Open &amp;rarr; Half Open)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 요청 수행&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;a. 수행 결과 정상 (Half Open &amp;rarr; Closed)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;b. 수행 결과 실패 (Half Open &amp;rarr; Open)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-서킷브레이커라이브러리종류&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서킷브레이커 라이브러리 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) Netflix Hystrix&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;넷플릭스에서 개발한 라이브러리로 MSA 환경에서 분산된 서비스간 통신이 원할하지 않을 경우 각 서비스가 장애 내성과 지연 내성을 갖게하도록 하는 라이브러리&lt;br /&gt;현재는 deprecated 된 상태로 Resilience4j 사용을 권장&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) Resilience4j&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Netflix Hystrix 로부터 영감을 받아 개발된 Fault Tolerance Library&amp;nbsp;&lt;br /&gt;Java 전용으로 개발된 경량화된 라이브러리&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;Netflix Hystrix 공식 doc에서도 Resilience4j 사용을 권장하고 있으니, Hystrix 를 사용할 이유가 없습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Hystrix 에 대해 알아볼 필요 없이 바로 Resilence4j 에 대해 알아보겠습니다.&quot;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-Resilience4j의코어모듈&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Resilience4j 의 코어 모듈&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) CircuitBreaker : 장애 전파 방지 기능 제공&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) Retry : 요청 실패시 재시도 처리 기능 제공&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) RateLimiter : 제한치를 넘어서 요청을 거부하거나 Queue 생성하여 처리하는 기능 제공&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) TimeLimiter : 실행 시간 제한 설정 기능 제공&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5) Bulkhead : 동시 실행 횟수 제한 기능 제공&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;6) Cache : 결과 캐싱 기능 제공&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Resilience4j 의 코어 모듈은 위와 같으며 필요한 모듈의 의존성을 설정해 주어 필요한 모듈만 사용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Gradle 예시&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_10896&quot; style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1683703776721&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
  implementation(&quot;io.github.resilience4j:resilience4j-circuitbreaker:${resilience4jVersion}&quot;)
  implementation(&quot;io.github.resilience4j:resilience4j-ratelimiter:${resilience4jVersion}&quot;)
  implementation(&quot;io.github.resilience4j:resilience4j-retry:${resilience4jVersion}&quot;)
  implementation(&quot;io.github.resilience4j:resilience4j-bulkhead:${resilience4jVersion}&quot;)
  implementation(&quot;io.github.resilience4j:resilience4j-cache:${resilience4jVersion}&quot;)
  implementation(&quot;io.github.resilience4j:resilience4j-timelimiter:${resilience4jVersion}&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-Resilience4j모듈의우선순위&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Resilience4j 모듈의 우선순위&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;id-010701.CircuitBreaker/resilience4j-Retry(CircuitBreaker(RateLimiter(TimeLimiter(BulkHead(TargetFunction)))))&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Retry ( CircuitBreaker ( RateLimiter ( TimeLimiter ( BulkHead ( TargetFunction ) ) ) ) )&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 우선순위로 모듈이 적용됩니다. (Retry 모듈이 가장 마지막에 적용됨)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 알아보기 위해 resilience4j jar의 CircuitBreakerConfigurationProperties, RetryConfigurationProperties 클래스 내부를 살펴보면,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CircuitBreaker 와 Retry 의 Order 값이 각각 -3, -4 로&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;별도 처리가 없을 경우 CircuitBreaker 가 Retry 보다 우선으로 적용됨을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CircuitBreakerConfigurationProperties&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_667418&quot; style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1683703792346&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CircuitBreakerConfigurationProperties extends
    io.github.resilience4j.common.circuitbreaker.configuration.CircuitBreakerConfigurationProperties {

    private int circuitBreakerAspectOrder = Ordered.LOWEST_PRECEDENCE - 3;
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RetryConfigurationProperties&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_833382&quot; style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1683703802336&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class RetryConfigurationProperties extends
    io.github.resilience4j.common.retry.configuration.RetryConfigurationProperties {

    private int retryAspectOrder = Ordered.LOWEST_PRECEDENCE - 4;
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CircuitBreakerAspect&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_362375&quot; style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1683703812536&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Aspect
public class CircuitBreakerAspect implements Ordered {
   ...
   @Override
    public int getOrder() {
        return circuitBreakerProperties.getCircuitBreakerAspectOrder();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AOP 기반하에 동작하므로 우선순위를 바꿔서 적용하고자 할 경우 annotation 방식을 사용하여 layer 를 분리하거나 aspectOrder 속성값을 수정하여 적용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-Resilience4jConfiguration&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Resilience4j Configuration&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Resilience4j 의 Configuration 은 yml 파일을 사용하거나, java 코드를 통해 설정할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) yml 파일을 사용한 Config 예시&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_652595&quot; style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1683703823363&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resilience4j.circuitbreaker:
    configs:
        default:
            slidingWindowSize: 100
            waitDurationInOpenState: 10000
            permittedNumberOfCallsInHalfOpenState: 30
            failureRateThreshold: 60
            eventConsumerBufferSize: 10
        custom:
            slidingWindowSize: 50
            permittedNumberOfCallsInHalfOpenState: 10
            ... 생략&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) Java 코드를 통한 Config 예시&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_293507&quot; style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1683703833036&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
class CircuitBreakerProvider(
    val circuitBreakerRegistry: CircuitBreakerRegistry,
) {

    companion object {
        const val CIRCUIT_MEMDB: String = &quot;CB_MEMDB&quot;
    }

    @Bean
    fun memDBCircuitBreaker(): CircuitBreaker {
        return circuitBreakerRegistry.circuitBreaker(            
            CIRCUIT_MEMDB, CircuitBreakerConfig.custom()
                .failureRateThreshold(10F)  // 실패비율 10% 이상시 서킷 오픈
                .slowCallDurationThreshold(Duration.ofMillis(500))  // 500ms 이상 소요시 실패로 간주
                .slowCallRateThreshold(10F) // slowCallDurationThreshold 초과 비율이 10% 이상시 서킷 오픈
                .waitDurationInOpenState(Duration.ofMillis(60000))   // OPEN -&amp;gt; HALF-OPEN 전환 전 기다리는 시간
                .minimumNumberOfCalls(5) // 집계에 필요한 최소 호출 수
                .slidingWindowSize(5)    // 서킷 CLOSE 상태에서 5회 호출 도달시 failureRateThreshold 실패비율 계산
                .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)    // 호출 횟수 기준 계산 (TIME_BASED는 시간 기준)
                .ignoreExceptions(StockManageException::class.java)   // 화이트리스트로 서킷 오픈 기준 ex 관리
                .build()
        )
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;Resilience4j 모듈 중 가장 많이 사용되는 CircuitBreaker, Retry 모듈의 속성값에 대해 간단히 알아보겠습니다.&quot;&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-Resilience4jCircuitBreakerProperty&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Resilience4j CircuitBreaker Property&lt;/b&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot;&gt;property설명
&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;text-align: left;&quot;&gt;failureRateThreshold&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;실패비율 임계치를 백분율로 설정 해당 값을 넘어갈 시 Circuit Breaker 는 Open상태로 전환되며, 이때부터 호출을 차단한다 (기본값: 50)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;slowCallRateThreshold&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;임계값을 백분율로 설정, CircuitBreaker는 호출에 걸리는 시간이 slowCallDurationThreshold보다 길면 느린 호출로 간주, 해당 값을 넘어갈 시 Circuit Breaker 는 Open상태로 전환되며, 이때부터 호출을 차단한다 (기본값: 100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;slowCallDurationThreshold&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;호출에 소요되는 시간이 설정한 임계치보다 길면 느린 호출로 계산한다. -&amp;gt; 응답시간이 느린것으로 판단할 기준 시간 (60초, 1000 ms = 1 sec) (기본값: 60000[ms])&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;permittedNumberOfCallsInHalfOpenState&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;HALF_OPEN 상태일 때, OPEN/CLOSE 여부를 판단하기 위해 허용할 호출 횟수를 설정 수 (기본값: 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;maxWaitDurationInHalfOpenState&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;HALF_OPEN 상태로 있을 수 있는 최대 시간이다. 0일 때 허용 횟수 만큼 호출을 모두 완료할 때까지 HALF_OEPN 상태로 무한정 기다린다. (기본값: 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;slidingWindowType&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;sliding window 타입을 결정한다. COUNT_BASED인 경우 slidingWindowSize만큼의 마지막 call들이 기록되고 집계됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;TIME_BASED인 경우 마지막 slidingWindowSize초 동안의 call들이 기록되고 집계됩니다. (기본값: COUNT_BASED)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;slidingWindowSize&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;CLOSED 상태에서 집계되는 슬라이딩 윈도우 크기를 설정한다. (기본값: 100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;minimumNumberOfCalls&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;minimumNumberOfCalls 이상의 요청이 있을 때부터 faiure/slowCall rate를 계산한다. 예를들어, 해당값이 10이라면 최소한 호출을 10번을 기록해야 실패 비율을 계산할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;기록한 호출 횟수가 9번뿐이라면 9번 모두 실패했더라도 circuitbreaker는 열리지 않는다. (기본값: 100)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;waitDurationInOpenState&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;OPEN에서 HALF_OPEN 상태로 전환하기 전 기다리는 시간 (60초, 1000 ms = 1 sec) (기본값: 60000[ms])&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;recordExceptions&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;실패로 기록할 Exception 리스트 (기본값: empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;ignoreExceptions&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;실패나 성공으로 기록하지 않을 Exception 리스트 (기본값: empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;ignoreException&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;기록하지 않을 Exception을 판단하는 Predicate&amp;lt;Throwable&amp;gt;을 설정 (커스터마이징, 기본값: throwable -&amp;gt; true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;recordFailure&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;어떠한 경우에 Failure Count를 증가시킬지 Predicate를 정의해 CircuitBreaker에 대한 Exception Handler를 재정의하는 것이다. true를 return할 경우, failure count를 증가시키게 된다 (기본값: false)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id-010701.CircuitBreaker/resilience4j-Resilience4jRetryProperty&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Resilience4j Retry Property&lt;/b&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot;&gt;property설명
&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;text-align: left;&quot;&gt;maxRetryAttempts&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;최대 재시도 수(최초 호출도 포함, 기본값 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;waitDuration&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;재시도 할 때마다 기다리는 고정시간 (1초[1000ms], 기본값: 0.5초[500ms])&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;retryOnResultPredicate&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;반환되는 결과에 따라서 retry를 할지 말지 결정하는 filter, true로 반환하면 retry하고 false로 반환하면 retry 하지 않습니다. (기본값: (numOfAttempts,Either&amp;lt;throwable, result) -&amp;gt; waitDuration)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;retryExceptionPredicate&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;예외(Exception)에 따라 재시도 여부를를 결정하기 위한 filter, 만약 예외에 따라 재시도해야 한다면 true를, 그 외엔 false를 리턴해야 한다. (기본값: result -&amp;gt; false)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;retryExceptions&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;실패로 기록되는 블랙리스트 예외. empty일 경우 모든 에러 클래스를 재시도 한다. (기본값: empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;ignoreExceptions&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;무시되어야 하는 예외(화이트리스트) 즉, 재시도 되지 않아야 할 에러 클래스 리스트이다. (기본값: empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;failAfterMaxRetries&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;설정한 maxAttempts 만틈 재시도하고 나서도 결과가 여전히 retryOnResultPredicate를 통과하지 못했을 때 MaxRetriesExceededException 발생을 활성화/비활성화하는 boolean (기본값: false)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;그외 모듈에 대한 속성값이 궁금하시다면 아래의 Resilience4j 공식 document 를 참고해주세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고 :&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://resilience4j.readme.io/docs/getting-started&quot;&gt;https://resilience4j.readme.io/docs/getting-started&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/Spring Boot</category>
      <category>Circuitbreaker</category>
      <category>Resilience4j</category>
      <category>retry</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/445</guid>
      <comments>https://developyo.tistory.com/entry/Resilience4j-CircuitBreaker-%EA%B0%9C%EB%85%90#entry445comment</comments>
      <pubDate>Wed, 10 May 2023 19:04:22 +0900</pubDate>
    </item>
    <item>
      <title>[etc.] nativeQuery 복붙할 때 따옴표(&amp;quot;) 제거하기</title>
      <link>https://developyo.tistory.com/entry/etc-nativeQuery-%EB%B3%B5%EB%B6%99%ED%95%A0-%EB%95%8C-%EB%94%B0%EC%98%B4%ED%91%9C-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 쿼리를 DBeaver 에 복붙시 따옴표 자동 제거하기&lt;/p&gt;
&lt;pre id=&quot;code_1681889090383&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@NamedNativeQuery(
    name = &quot;example&quot;,
    query = &quot;   SELECT EX_CD AS exampleCd&quot; +
            &quot;     FROM EXAMPLE&quot;,
    resultSetMapping = &quot;example&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;DBeaver -&amp;gt; 윈도우 -&amp;gt; 설정 -&amp;gt; 편집기 -&amp;gt; SQL 편집기 -&amp;gt; Auto format -&amp;gt; Extract SQL from source code 활성화&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PeNYj/btsa8Bi8Voi/BA00MtAKkB0oSwZ5NrV5HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PeNYj/btsa8Bi8Voi/BA00MtAKkB0oSwZ5NrV5HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PeNYj/btsa8Bi8Voi/BA00MtAKkB0oSwZ5NrV5HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPeNYj%2Fbtsa8Bi8Voi%2FBA00MtAKkB0oSwZ5NrV5HK%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;560&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 문자열 (&quot; 포함) 을 복사후,&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681889520151&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;   SELECT EX_CD AS exampleCd&quot; +
&quot;     FROM EXAMPLE&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;DBeaver 에 붙여넣기 할 경우&amp;nbsp; Auto format 되어 SQL 만 추출됨&lt;/p&gt;
&lt;pre id=&quot;code_1681889499197&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EX_CD AS exampleCd
FROM EXAMPLE&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc.</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/442</guid>
      <comments>https://developyo.tistory.com/entry/etc-nativeQuery-%EB%B3%B5%EB%B6%99%ED%95%A0-%EB%95%8C-%EB%94%B0%EC%98%B4%ED%91%9C-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0#entry442comment</comments>
      <pubDate>Wed, 19 Apr 2023 20:32:13 +0900</pubDate>
    </item>
    <item>
      <title>Slack reminder 푸시 설정</title>
      <link>https://developyo.tistory.com/entry/Slack-reminder-%ED%91%B8%EC%8B%9C-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;/remind [수신자or채널] [메시지] [알림시간]&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eg) /remind&amp;nbsp;#스쿼드채널&amp;nbsp;데일리미팅&amp;nbsp;at&amp;nbsp;10:00am&amp;nbsp;every&amp;nbsp;weekday&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/remind list : 리마인드 목록 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://slack.com/intl/ko-kr/resources/using-slack/how-to-use-reminders-in-slack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://slack.com/intl/ko-kr/resources/using-slack/how-to-use-reminders-in-slack&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://slack.com/intl/ko-kr/help/articles/208423427-%EB%A6%AC%EB%A7%88%EC%9D%B8%EB%8D%94-%EC%84%A4%EC%A0%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://slack.com/intl/ko-kr/help/articles/208423427-%EB%A6%AC%EB%A7%88%EC%9D%B8%EB%8D%94-%EC%84%A4%EC%A0%95&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc.</category>
      <category>slack</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/441</guid>
      <comments>https://developyo.tistory.com/entry/Slack-reminder-%ED%91%B8%EC%8B%9C-%EC%84%A4%EC%A0%95#entry441comment</comments>
      <pubDate>Fri, 7 Apr 2023 19:35:12 +0900</pubDate>
    </item>
    <item>
      <title>Mac 듀얼모니터에서 Dock 위치 옮기기</title>
      <link>https://developyo.tistory.com/entry/Mac-%EB%93%80%EC%96%BC%EB%AA%A8%EB%8B%88%ED%84%B0%EC%97%90%EC%84%9C-Dock-%EC%9C%84%EC%B9%98-%EC%98%AE%EA%B8%B0%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;옮길 모니터 하단(모니터 제일 아래 최하단 끝에 닿게)에 마우스를 놓고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤 아래로 내리면 해당 모니터로 Dock 옮겨진다.&lt;/p&gt;</description>
      <category>etc./etc.</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/440</guid>
      <comments>https://developyo.tistory.com/entry/Mac-%EB%93%80%EC%96%BC%EB%AA%A8%EB%8B%88%ED%84%B0%EC%97%90%EC%84%9C-Dock-%EC%9C%84%EC%B9%98-%EC%98%AE%EA%B8%B0%EA%B8%B0#entry440comment</comments>
      <pubDate>Tue, 4 Apr 2023 16:00:24 +0900</pubDate>
    </item>
    <item>
      <title>AWS MemoryDB for Redis 영속성과 내구성</title>
      <link>https://developyo.tistory.com/entry/AWS-MemoryDB-for-Redis</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon MemoryDB for Redis 는 OpenSource 인 Redis 를 Amazon 클라우드 컴퓨팅 자원을 사용해 AWS 에서 지원하는 것으로, Redis 와 거의 모든 면에서 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 AWS Redis 를 사용할 경우, Redis 서버를 직접 구축하는 것 보다 Performance와 Durability 면에서 이점을 가지며, 설정이 편리한 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에선 Redis의 Persistence(영속성)/Durability(내구성) 측면을 중점적으로 다뤄보겠습니다.&lt;/p&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;[ Redis RDB vs AOF&amp;nbsp; ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리는 휘발성이므로 memory DB 인 Redis 프로세스를 종료하게 되면 데이터가 모두 유실됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 단순 캐시용도가 아닌 Persistence 한 DB로 활용하기 위해서는 데이터를 Disk 에 저장하여 데이터 유실이 발생하지 않도록 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 Redis 엔 RDB(snapshot) 와 AOF(Append Only File) 기능이 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. RDB&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RDB 는 memory snapshot 파일의 확장자인 .rdb 를 의미&lt;/li&gt;
&lt;li&gt;특정 시점/간격 마다 메모리의 전체 데이터를 디스크에 바이너리 파일로 저장(snapshot)하는 방식&lt;/li&gt;
&lt;li&gt;특정 시점마다 백업을 받을 때 사용&lt;/li&gt;
&lt;li&gt;&lt;span&gt;AOF 파일보다 사이즈가 작다는 특징이 있고 사이즈가 작으므로 로딩 속도도 AOF 보다 빠른 장점이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;RDB 관련주요 redis.conf 파라미터&lt;/span&gt;&lt;span&gt;&lt;/span&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 style=&quot;width: 48.3721%;&quot;&gt;dbfilename $rdbTargetFileName&lt;/td&gt;
&lt;td style=&quot;width: 51.6279%;&quot;&gt;RDB 파일명 지정&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.3721%;&quot;&gt;save $duration $cnt&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 51.6279%;&quot;&gt;특정시간(duration)동안 특정횟수(cnt) 이상 key 변경이 발생하면 저장 (eg: save 300 10 : 300초 동안 10번 이상 key 변경 발생시 저장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.3721%;&quot;&gt;stop-writes-on-bgsave-error $yesOrNo&lt;/td&gt;
&lt;td style=&quot;width: 51.6279%;&quot;&gt;RDB 파일을 디스크에 저장하다 실패하면 save 이벤트를 거부할지에 대한 파라미터(yes 일 경우 RDB 저장 실패시 쓰기 요청 거부)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.3721%;&quot;&gt;rdbcompression $yesOrNo&lt;/td&gt;
&lt;td style=&quot;width: 51.6279%;&quot;&gt;RDB 파일을 쓸 때 압축 여부&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;span&gt;RDB 방식의 문제점&lt;br /&gt;Redis 장애 발생시 .rdb 백업 시점 이후에 발생한 데이터는 유실됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680241400014&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .rdb 데이터 유실 예시
&amp;gt; SET key val
&amp;gt; SET key1 val1
&amp;gt; SAVE
&amp;gt; SET key val2 #SAVE 이후로 데이터 유실
&amp;gt; SET key1 val3 #SAVE 이후로 데이터 유실&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;2. AOF&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Append Only File 이라는 의미에서 알 수 있듯이 .aof 파일에 모든 쓰기 명령을 기록 (조회는 제외)&lt;/li&gt;
&lt;li&gt;redis client 가 redis 에 쓰기 명령을 요청하면 Redis 는 해당 명령을 .aof 파일(디스크)에 저장한 후, 해당 명령을 수행하는 방식으로 RDB 방식과 달리 특정 시점이 아닌 항상 현재 시점까지의 로그를 기록&lt;/li&gt;
&lt;li&gt;CUD 를 계속 append 하며 기록하게 되므로 파일 크기가 계속 커지게 되는데, Rewrite 를 하게 되면 최종 데이터만 기록되어 파일 크기가 작아진다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680241418350&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 appendonly.aof 파일 예시
SET key value
SET key value2
SET key value3
SET key value4

# AOF REWRITE 실행 후 appendonly.aof 파일
SET key value4 # 최종 데이터인 key value4 만 남게된다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AOF 관련 주요 redis.conf 파라미터&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 style=&quot;width: 50%;&quot;&gt;appendfilename $aofTargetFileName&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;AOF 파일명 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;appendfsync $everysec&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;AOF 기록되는 시점 지정&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;always : 모든 명령 시행마다 기록&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;everysec : 1초마다 AOF 에 기록(권장)&lt;/li&gt;
&lt;li&gt;no : 기록 시점을 OS 가 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;auto-aof-rewrite-min-size $size&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;AOF 파일 사이즈가 64mb 이하면 rewrite 를 하지 않음(rewrite 를 자주 하는 것을 방지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;auto-aof-rewrite-percentage $percentage&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;AOF 파일 사이즈가 rewrite 되는 파일 사이즈 기준으로, redis 서버가 시작할 시점의 AOF 파일 사이즈를 기준으로 함 (만약 redis 서버 시작시 AOF 파일 사이즈가 0 이라면 rewrite를 하지 않음)&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AOF 를 사용한 복구 예시&amp;nbsp;&lt;br /&gt;.aof 파일에서 문제가 되는 명령어를 수정/제거한 후 redis 서버를 재시작하면 데이터 손실없이 DB를 살릴 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680241429331&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .aof 를 사용한 복구 예시
*1
$8
flushall #문제가 되는 해당 명령어 삭제 후 저장&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;AOF 방식의 문제점&lt;br /&gt;모든 쓰기 기록이 남아있는 파일이므로 RDB 방식에 비해 백업 데이터 크기가 크고, 모든 라인이 한 줄 씩 재수행 되므로 서버자원을 많이 사용&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;[ RDB vs AOF 무엇을 써야하는가? ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 시점을 기준으로 메모리 DB의 데이터를 백업하는 snapshot 방식의 RDB 방식과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회 명령을 제외한 모든 쓰기 명령을 기록하는 AOF 방식은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 장단점이 명확하므로 AOF 를 default로 사용하고 RDB 를 optional로 사용하는 방식으로 둘을 조합하여 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서버가 실행될 때 백업된 .rdb 를 reload 하여 복구하고, snapshot 시점과 shutdown 사이의 데이터만 AOF 로그로 복구하여 서버 재기동 시간과 서버자원을 절약&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 RDB 와 AOF 방식을 통해 memory DB 인 Redis 를 Persistence 하게 사용 할 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 쓰기 명령을 로그로 기록하는 AOF 방식도 아래와 같은 데이터 손실 가능성이 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 AWS memoryDB 관련 가이드 발췌 글입니다. (출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://aws.amazon.com/ko/memorydb/faqs/&quot;&gt;https://aws.amazon.com/ko/memorydb/faqs/&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;How is MemoryDB&amp;rsquo;s durability functionality different from open source Redis&amp;rsquo; append-only file (AOF)?&lt;/b&gt;&lt;br /&gt;MemoryDB leverages a distributed transactional log to durably store data. By storing data across multiple AZs, MemoryDB has fast database recovery and restart. Also, MemoryDB offers eventual consistency for replica nodes and consistent reads on primary nodes.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Open source Redis includes an optional append-only file (AOF) feature, which persists data in a file on a primary node&amp;rsquo;s disk for durability. However, because AOF stores data locally on primary nodes in a single availability zone, there are risks for data loss. Also, in the event of a node failure, there are risks of consistency issues with replicas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How does MemoryDB durably store my data?&lt;br /&gt;MemoryDB stores your entire data set in memory and uses a distributed Multi-AZ transactional log to provide data durability, consistency, and recoverability. By storing data across multiple AZs, MemoryDB has fast database recovery and restart. By also storing the data in-memory, MemoryDB can deliver ultra-fast performance and high throughput.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 글에서 알 수 있듯이 Redis AOF는 .aof 파일을 마스터 노드 디스크(싱글 AZ라 할 수 있는)에만 저장하여 데이터 loss risk가 있으며 노드 장애시 슬레이브 노드와 데이터 일관성 문제가 있을 수 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS memoryDB for Redis 는 모든 메모리 데이터를 분산된 multi AZ 에 transaction log 로 기록하여 durability 와 마스터 노드 &amp;harr; 슬레이브 노드간의 데이터 일관성을 보장한다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Redis 와 AWS MemoryDB for Redis 의 차이를 정리한 차트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;RedisAWS MemoryDB for RedisRedisAWS MemoryDB for Redis&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&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;text-align: left;&quot;&gt;내구성(Durability)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;AOF, RDB 로 내구성 처리&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Transaction log 까지 작성 후 응답하여 데이터 무손실 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;성능&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;12만/sec&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;read : 마이크로초&lt;/span&gt;&lt;br /&gt;&lt;span&gt;write : ms (한자리 milisecond)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Cluster mode&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Cluster mode 선택적 운영&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Cluster mode 활성화 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;접속&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;2&quot;&gt;redis-cli 사용하여 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;백업&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;특정 시점 RDB 백업&lt;/span&gt;&lt;br /&gt;&lt;span&gt;AOF 로 모든 CUD DML 저장&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;24시간 동안 20개 까지 스냅샷 생성 제한&lt;/span&gt;&lt;br /&gt;&lt;span&gt;해당 Region 에서 수동 스냅샷 보유 개수 제한 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;복구&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;RDB 시점 복원&lt;/span&gt;&lt;br /&gt;&lt;span&gt;AOF 사용시 원하는 명령까지 복원&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;RDB 스냅샷 복원&lt;/span&gt;&lt;br /&gt;&lt;span&gt;특점시점 복원은 불가&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Transaction log 사용하여 장애 최종 복구 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;고가용성(HA)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;replica&lt;/span&gt;&lt;br /&gt;&lt;span&gt;shard 구성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;replica node 의 복제가 실패할 경우&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실패 노드를 감지하여 오프라인 전환 및 동일 AZ에 교체노드 실행하여 동기화 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;MemoryDB MultiAZ primary 장애&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MemoryDB 에서 Primary 오류 감지하면, replica node들 중 primary 정합성 체크 후 primary 승격 후 다른 AZ에 있는 primary spin up 이후 동기화 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;복제&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;replica 구성&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;async 복제
&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;복제 버퍼 내용 복제&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span&gt;transaction lop 를 사용하는 async 복제&lt;/span&gt;&lt;br /&gt;&lt;span&gt;transaction log 에 저장(영구저장) 하므로 데이터 손실 위험 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://redis.io/docs/management/persistence/&quot;&gt;https://redis.io/docs/management/persistence/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/memorydb/latest/devguide/what-is-memorydb-for-redis.html&quot;&gt;https://docs.aws.amazon.com/memorydb/latest/devguide/what-is-memorydb-for-redis.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/memorydb/faqs/&quot;&gt;https://aws.amazon.com/ko/memorydb/faqs/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hyunki1019.tistory.com/169&quot;&gt;https://hyunki1019.tistory.com/169&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rmcodestar.github.io/redis/2018/12/10/redis-persistence/&quot;&gt;https://rmcodestar.github.io/redis/2018/12/10/redis-persistence/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Jbq_XZMZEKY&quot;&gt;https://www.youtube.com/watch?v=Jbq_XZMZEKY&lt;/a&gt;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>aof</category>
      <category>AWS</category>
      <category>RDB</category>
      <category>Redis</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/439</guid>
      <comments>https://developyo.tistory.com/entry/AWS-MemoryDB-for-Redis#entry439comment</comments>
      <pubDate>Fri, 31 Mar 2023 14:44:57 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] .bashrc .profile</title>
      <link>https://developyo.tistory.com/entry/Linux-bashrc-profile</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Login Shell vs Non-login Shell ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Login Shell : 계정/암호를 입력하여 Shell 실행하는 것. ex) ssh 로그인 / GUI에서 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Non-login Shell : 로그인 없이 실행되는 Shell. ex) ssh 접속 후 bash 를 다시 실행하는 경우, GUI에서 터미널을 띄운 경우 sudo su 로 계정 변경하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 파일 로드 순서 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. /etc/profile&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: /etc/profile.d 디렉토리 안의 모든 쉘 스크립트 실행시킴. /etc/profile.d 엔 vim, qt, lang 등 다양한 설정이 sh 파일 형태로 존재. 쉘에 로그인하면 일단 이 sh 파일을 모두 실행시키는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. ~/.bash_profile or ~/.profile&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 계정 디렉토리에 있는 .bash_profile or .profile 로드. 이 파일들은 계정에 종속적이기 때문에 계정 디렉토리에 존재하므로 ~/.bash_profile or ~/.profile 파일을 로드하게 되는 것. PATH 같은 환경변수를 설정할 때 이 파일을 수정하는 이유가 여기에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. ~/.bashrc&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 계정 디렉토리에 있는 .bashrc 파일 로드. 이 파일은 로그인과 상관없이 bash 콘솔을 새롭게 열 때 실행됨. 파일 안에는 아래와 같은 구문이 있는데, /etc/bashrc 파일을 실행하라는 뜻.&lt;/p&gt;
&lt;pre id=&quot;code_1670083300780&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. /etc/bashrc&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 /etc/bashrc 파일 실행. 이 파일도 /etc/profile 과 마찬가지로 계정과 상관없이 전역적으로 영향을 미침.&lt;/p&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;[ /etc/profile , /etc/bashrc ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일들은 계정과 상관없이 전역적 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ ~/.profile, ~/.bashrc ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정&amp;nbsp;디렉터리로&amp;nbsp;가면&amp;nbsp;.bashrc와&amp;nbsp;.bash_profile&amp;nbsp;or&amp;nbsp;.profile이라는&amp;nbsp;2개이&amp;nbsp;파일이&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.bash_profile이란 bash로 로그인 할 때만 로드된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 .profile은 bash와 상관없이 로그인 하면 로드된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개 중 하나만 로드되며 bash로 로그인하면 .bash_profile만, bash 외 쉘로 로그인하면 .profile만 로드된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일들은 공통적으로 환경변수를 세팅할 때 사용하고, 차이점은 실행되는 시점이 다르다는 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) .profile :&lt;/b&gt; 로그인 되는 시점에 실행 (Login Shell). bash와 상관 없는 것들을 넣는다.&lt;br /&gt;&lt;b&gt;2) .bash_profile&lt;/b&gt; &lt;b&gt;:&lt;/b&gt; Bash로 로그인 되는 시점에 실행 (Login Shell).&lt;br /&gt;&lt;b&gt;3) .bashrc :&lt;/b&gt; 새로운 콘솔을 열 때 실행 (Non-login Shell). 로그인 없이 Bash가 실행될 때 로드된다. bash 쉘이 아닌 경우 각 쉘에 맞는 cshrc, tcshrc, kshrc 파일 등이 동일한 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 환경변수 설정 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 파일 설정 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경설정은 /etc/profile에, 기타 함수나 alias 설정은 /etc/bashrc에..&lt;/p&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;/etc/profile :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670084046501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/etc/bashrc :&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670084053415&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# System wide functions and aliases
# Environment stuff goes in /etc/profile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 사용자 계정 파일 설정 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사용자 디렉터리에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.bash_profile&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.profile&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.bashrc&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가 위의 전역 파일들에 대응된다고 볼 수 있다. 다만 로드 순서는 전역 파일이 먼저고 사용자 파일이 그 다음이다. 두 파일에서 중복되지 않는 내용들은 둘 다 적용된다고 볼 수 있다. 하지만 만약 내용이 중복된다면 사용자 계정 파일의 내용이 우선된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가급적 사용자 계정 디렉터리에 있는 환경설정 파일을 수정하고, 전역 설정을 변경해야 하는 경우에도 직접 전역 파일을 건드리지 말고 사용자 계정의 환경설정 파일 내에서 연속성을 유지할 수 있도록 수정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&amp;nbsp; PATH를 수정해야 하는 상황에 놓였을 때, /etc/profile 를 직접 수정하는 것이 아니라 ~/.profile을 아래와 같이 전역 설정을 기반으로 연속적으로 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/profile&lt;/p&gt;
&lt;pre id=&quot;code_1670084202768&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PATH=&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~/.profile&lt;/p&gt;
&lt;pre id=&quot;code_1670084208588&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PATH=&quot;$PATH:/usr/home/test&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://projooni.tistory.com/entry/bashrc-%EC%99%80-profile-%EC%B0%A8%EC%9D%B4%EC%99%80-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://projooni.tistory.com/entry/bashrc-%EC%99%80-profile-%EC%B0%A8%EC%9D%B4%EC%99%80-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/linux</category>
      <category>bashrc</category>
      <category>Profile</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/438</guid>
      <comments>https://developyo.tistory.com/entry/Linux-bashrc-profile#entry438comment</comments>
      <pubDate>Sun, 4 Dec 2022 01:17:32 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2 ssh 접속 및 bastion rsa 설정</title>
      <link>https://developyo.tistory.com/entry/AWS-EC2-%EC%A0%91%EC%86%8D</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. aws 에서 생성한 키페어를 사용하여 외부 접근이 허용된 서버 (ex: 0.0.0.0/0 에 대한 인바운드 허용 Security Group 사용중인 bastion 서버) 에 접속&lt;/p&gt;
&lt;pre id=&quot;code_1669826816318&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh -i key.pem ubuntu@bastion서버publicIP&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;2. aws 에서 생성한 키페어 를 home 디렉토리에 key.pem 생성&lt;/p&gt;
&lt;pre id=&quot;code_1669826807463&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi key.pem&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;3. bastion 서버에서 내부망 서버 접속&lt;/p&gt;
&lt;pre id=&quot;code_1669826811326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh -i key.pem ubuntu@내부망ip&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;[ 보다 쉽게 접속을 위한 ssh rsa 공유키/개인키 설정하기 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) bastion 서버에서 공개키 생성&lt;/p&gt;
&lt;pre id=&quot;code_1669826591796&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh-keygen -t rsa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) bastion 에서 접속할 내부망 서버에 접속하여 공개키 추가 (공백 라인 추가 후 1)번의 bastion 서버 공개키 붙여넣기)&lt;/p&gt;
&lt;pre id=&quot;code_1669826596091&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi ~/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 접속&lt;/p&gt;
&lt;pre id=&quot;code_1669826650167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh ubuntu@내부망서버IP&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ bastion 서버 /etc/hosts 에 내부망서버IP 를 등록 후 alias 사용하여 접속 가능&lt;/p&gt;
&lt;pre id=&quot;code_1669826759504&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /etc/hosts
192.168.52.129 db&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 후 접속&lt;/p&gt;
&lt;pre id=&quot;code_1669826795853&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh db&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://johncom.tistory.com/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://johncom.tistory.com/42&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;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>ssh</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/435</guid>
      <comments>https://developyo.tistory.com/entry/AWS-EC2-%EC%A0%91%EC%86%8D#entry435comment</comments>
      <pubDate>Thu, 1 Dec 2022 01:47:13 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] VPC 구성</title>
      <link>https://developyo.tistory.com/entry/AWS-VPC-%EA%B5%AC%EC%84%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. VPC 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ex) 192.168.52.0/24 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 서브넷 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 할당할 IP 갯수를 고려하여 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 서브넷마스크 테이블&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.52.0/26 : 192.168.52.0 ~ 192.168.52.63 (64개 할당) - 서비스 외부망&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.52.64/26 : 192.168.52.64 ~ 192.168.52.127 (64개 할당) - 서비스 외부망&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.52.128/27 : 192.168.52.128 ~ 192.168.52.159 (32개 할당) - DB 내부망&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.52.160/27 : 192.168.52.160 ~ 192.168.52.191 (32개 할당) - bastion 외부망&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RGUj3/btrSxEp9rMT/140BMaJ8kIvpGG3DiUiR21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RGUj3/btrSxEp9rMT/140BMaJ8kIvpGG3DiUiR21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RGUj3/btrSxEp9rMT/140BMaJ8kIvpGG3DiUiR21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRGUj3%2FbtrSxEp9rMT%2F140BMaJ8kIvpGG3DiUiR21%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;1800&quot; height=&quot;786&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;786&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;3. Internet Gateway 생성&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버와 인터넷망 연결에 필요. VPC 생성시 자동 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Nat Gateway 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부망서버가 인터넷 망으로 나가기 위해 Nat Gateway 필요 (eg: nat gw 없인 내부망 DB 서버에서 yum install mysql 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블에 0.0.0.0/0 nat gateway 지정 필요&lt;/p&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;4. Route Table 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 내부망 subnet (ex: DB) : 내부ip 대역 로컬 대상 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5I311/btrSxldd3JJ/fzaK1pT5vT60SXLfWIv5N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5I311/btrSxldd3JJ/fzaK1pT5vT60SXLfWIv5N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5I311/btrSxldd3JJ/fzaK1pT5vT60SXLfWIv5N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5I311%2FbtrSxldd3JJ%2FfzaK1pT5vT60SXLfWIv5N0%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;1620&quot; height=&quot;525&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 외부망 subnet (ex: bastion) : 내부ip 대역 로컬 대상,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0.0.0.0/0 인터넷게이트웨이 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1599&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daeHqU/btrSwCGAA52/HkpJCUyLFjkp33Llskjeo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daeHqU/btrSwCGAA52/HkpJCUyLFjkp33Llskjeo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daeHqU/btrSwCGAA52/HkpJCUyLFjkp33Llskjeo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaeHqU%2FbtrSwCGAA52%2FHkpJCUyLFjkp33Llskjeo1%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;1599&quot; height=&quot;528&quot; data-origin-width=&quot;1599&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Security Group 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bastion 서버 inbound : 내공인IP 22번 port 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부망서버(DB) inbound : DB port (3306)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bastion서버 SG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부망서버(웹서버) inbound : 서비스 port (ex: 8080, 443, 80)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bastion서버 SG&amp;nbsp;&lt;/p&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;6. EC2 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1~5 설정한 정보 기준으로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ AZ(Availability Zone) 은 이중화 구조에선 DR등을 고려하여 #1과 #2를 각각 다르게 설정&lt;/p&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;[ bastion (배스천) 서버란? ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부와 외부 네트워크 사이에서 내부망을 보호하기 위한 게이트웨이 역할을 수행하는 호스트서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bastion 서버의 inbound 를 특정 ip(ex: 내 공인IP) 로 security group 을 설정해주고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 서버의 inbound 설정은 22번 port 를 bastion 서버에게만 허용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bastion 서버에 보안을 집중.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://www.youtube.com/watch?v=lqnncuQgz28&amp;amp;t=800s&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/434</guid>
      <comments>https://developyo.tistory.com/entry/AWS-VPC-%EA%B5%AC%EC%84%B1#entry434comment</comments>
      <pubDate>Thu, 1 Dec 2022 01:26:15 +0900</pubDate>
    </item>
    <item>
      <title>[SSH] RSA 공유키 충돌 문제</title>
      <link>https://developyo.tistory.com/entry/SSH-RSA-%EA%B3%B5%EC%9C%A0%ED%82%A4-%EC%B6%A9%EB%8F%8C-%EB%AC%B8%EC%A0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[현상]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개키와 개인키를 사용하여 서버 접속 시도시 하기와 같은 에러가 발생할 경우.&lt;/p&gt;
&lt;pre id=&quot;code_1669824758465&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-192-168-52-177:~$ ssh ubuntu@db
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The ECDSA host key for db has changed,
and the key for the corresponding IP address 192.168.52.148
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:e0+0wN11IMq46zRTMCLGotYpg3hm/oPWUAbPF1K72Zk.
Please contact your system administrator.
Add correct host key in /home/ubuntu/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/ubuntu/.ssh/known_hosts:4
  remove with:
  ssh-keygen -f &quot;/home/ubuntu/.ssh/known_hosts&quot; -R &quot;db&quot;
ECDSA host key for db has changed and you have requested strict checking.
Host key verification failed.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[원인]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기존에 접속한 적이 있는 서버와 RSA 공유키를 교환한 상태에서 서버가 바뀌었기 때문에 발생. 기존 서버 정보를 찾아갔으나 다른 서버로 접속된, man-in-the-middle attack(중간자 공격)으로 감지된 상황.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(ex: /etc/hosts 의 ip alias 에서 ip 정보가 바뀐 경우 발생 192.168.52.148 db 와 같이 로컬에 호스트정보가 있었으나, 접속한 이력이 있던 상태에서 로컬 hosts 설정의 ip를 바꾼경우 발생)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[해결]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하기와 같이 alias 혹은 ip 에 대한 인증키 제거&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669825170661&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; ssh-keygen -R ip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cpuu.postype.com/post/30065&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cpuu.postype.com/post/30065&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/433</guid>
      <comments>https://developyo.tistory.com/entry/SSH-RSA-%EA%B3%B5%EC%9C%A0%ED%82%A4-%EC%B6%A9%EB%8F%8C-%EB%AC%B8%EC%A0%9C#entry433comment</comments>
      <pubDate>Thu, 1 Dec 2022 01:23:19 +0900</pubDate>
    </item>
    <item>
      <title>[node.js] 설치</title>
      <link>https://developyo.tistory.com/entry/nodejs-%EC%84%A4%EC%B9%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[node.js란]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 런타임이 브라우저에 존재하여 이 한계를 극복하기 위해 등장한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 자바스크립트를 동작할 수 있도록 하는 플랫폼.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[nvm : Node Version Manager]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 버전 관리자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 에서 제공하는 여러 버전의 사용을 돕는 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 설치 툴&lt;/p&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;nvm -&amp;gt; Node.js -&amp;gt; npm&amp;nbsp;&lt;/p&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;[npm : Node Package Manager]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 패키지 매니저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 로 개발된 프로그램(npm 패키지)를 편리하게 설치, 업데이트/삭제 해 주는 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 가 설치된 상태에서 npm 명령어를 통해 npm 서비스에 등록된 Node.js 로 작성된 패키지 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 설치시 npm 이 같이 설치됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;1. brew 사용하여 nvm 설치&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;brew install nvm&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 디렉토리 생성&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;mkdir ~/.nvm&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;.zshrc&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;vi ~/.zshrc&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하기 텍스트 삽입&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;export&amp;nbsp;NVM_DIR=&quot;$HOME/.nvm&quot;&lt;br /&gt;[&amp;nbsp;-s&amp;nbsp;&quot;/opt/homebrew/opt/nvm/nvm.sh&quot;&amp;nbsp;]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;.&amp;nbsp;&quot;/opt/homebrew/opt/nvm/nvm.sh&quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;This&amp;nbsp;loads&amp;nbsp;nvm&lt;br /&gt;[&amp;nbsp;-s&amp;nbsp;&quot;/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm&quot;&amp;nbsp;]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;br /&gt;.&amp;nbsp;&quot;/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm&quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;This&amp;nbsp;loads&amp;nbsp;nvm&amp;nbsp;bash_completion&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. nvm -v 로 nvm 설치 확인&lt;/p&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;[node js 설치]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. node.js 설치&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# LTS(Long Term Support : 지난 2년간 개선사항에 대한 패치를 보증하는 버전) 버전 설치&lt;br /&gt;nvm install --lts&amp;nbsp;&lt;br /&gt;# 지정한 버전 설치&lt;br /&gt;nvm install 14.17.4&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 설치된 node.js 리스트 보기&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;nvm ls&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 특정 버전 node.js 사용하기&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;nvm use 버전&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;a href=&quot;https://cotak.tistory.com/156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cotak.tistory.com/156&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@minidoo/Node-npm%EA%B3%BC-nvm-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@minidoo/Node-npm%EA%B3%BC-nvm-%EC%B0%A8%EC%9D%B4&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>front</category>
      <category>nodejs</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/431</guid>
      <comments>https://developyo.tistory.com/entry/nodejs-%EC%84%A4%EC%B9%98#entry431comment</comments>
      <pubDate>Thu, 17 Nov 2022 00:41:51 +0900</pubDate>
    </item>
    <item>
      <title>[AT] 인수테스트</title>
      <link>https://developyo.tistory.com/entry/ATDD-%EC%9D%B8%EC%88%98%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 인수테스트 (AT : Acceptance Test) ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인수테스트란 요구사항을 작성하는데 집중.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙박스 테스트의 성격을 가지므로 시스템 내부 코드를 직접 호출하는 것이 아닌 외부에서 요청하는 방식으로 검증.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 블랙박스란? 결과물의 내부 구현이나 사용된 기술을 기반으로 검증하기 보단 표면적으로 확인할 수 있는 요소를 바탕으로 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* ATDD(Acceptance Test-Driven Development)는 기획 단계부터 인수 테스트를 통해 공통의 이해를 도모해 프로젝트를 진행하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@SpringBootTest 웹서버를 사용하여 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webEnvironment 설정을 통해 웹 서버 환경을 지정&lt;/p&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;[ MockMvc vs RestAssured vs WebTestClient ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. MockMvc&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@SpringBootTest 의 webEnvironment.MOCK과 함께 사용가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mocking된 web environment(ex Tomcat) 환경에서 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. WebTestClient&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@SpringBootTest의 webEnvironment.RANDOM_PORT나 DEFINED_PORT와 함께 사용, Netty를 기본으로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. RestAssured&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 web environment(Apache Tomcat)을 사용하여 테스트&lt;/p&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;[ RestAssured 사용법 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RestAssured.given().log().all()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.body(params)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.contentType(MediaType.APPLICATION_JSON_VALUE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.when()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.post(&quot;/~&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.then().log().all()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.statusCode(HttpStatus.CREATED.value())&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.header(&quot;&quot;, notNullValue();&lt;/p&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;blockquote data-ke-style=&quot;style3&quot;&gt;Feature: 간략한 기능 서술&lt;br /&gt;&amp;nbsp; Scenario: 시나리오 제목&lt;br /&gt;&amp;nbsp; &amp;nbsp; Given: 사전조건&lt;br /&gt;&amp;nbsp; &amp;nbsp; And: 앞선 내용의 추가적인 내용&lt;br /&gt;&amp;nbsp; &amp;nbsp; And: 앞선 내용의 추가적인 내용&lt;br /&gt;&amp;nbsp; &amp;nbsp; When: 발생해야하는 이벤트&lt;br /&gt;&amp;nbsp; &amp;nbsp; Then: 사후조건&lt;/blockquote&gt;</description>
      <category>back/TDD</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/430</guid>
      <comments>https://developyo.tistory.com/entry/ATDD-%EC%9D%B8%EC%88%98%ED%85%8C%EC%8A%A4%ED%8A%B8#entry430comment</comments>
      <pubDate>Sun, 13 Nov 2022 21:33:17 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] cascade</title>
      <link>https://developyo.tistory.com/entry/JPA-cascade</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;영속성&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CascadeType.ALL:&amp;nbsp;모든&amp;nbsp;Cascade를&amp;nbsp;적용&lt;br /&gt;CascadeType.PERSIST:&amp;nbsp;엔티티를&amp;nbsp;영속화할&amp;nbsp;때,&amp;nbsp;연관된&amp;nbsp;엔티티도&amp;nbsp;함께&amp;nbsp;유지&lt;br /&gt;CascadeType.MERGE:&amp;nbsp;엔티티&amp;nbsp;상태를&amp;nbsp;병합(Merge)할&amp;nbsp;때,&amp;nbsp;연관된&amp;nbsp;엔티티도&amp;nbsp;모두&amp;nbsp;병합&lt;br /&gt;CascadeType.REMOVE:&amp;nbsp;엔티티를&amp;nbsp;제거할&amp;nbsp;때,&amp;nbsp;연관된&amp;nbsp;엔티티도&amp;nbsp;모두&amp;nbsp;제거&lt;br /&gt;CascadeType.DETACH:&amp;nbsp;부모&amp;nbsp;엔티티를&amp;nbsp;detach()&amp;nbsp;수행하면,&amp;nbsp;연관&amp;nbsp;엔티티도&amp;nbsp;detach()상태가&amp;nbsp;되어&amp;nbsp;변경&amp;nbsp;사항&amp;nbsp;반영&amp;nbsp;X&lt;br /&gt;CascadeType.REFRESH:&amp;nbsp;상위&amp;nbsp;엔티티를&amp;nbsp;새로고침(Refresh)할&amp;nbsp;때,&amp;nbsp;연관된&amp;nbsp;엔티티도&amp;nbsp;모두&amp;nbsp;새로고침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Question N : User 1 관계일 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User user = new User(?);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Question question = Question.builder(?).title(?).user(user).build();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;questionRepository.save(question);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할 경우 exception 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Question Entity 연관관계 매핑(@ManyToOne)에서 CascadeType.PERSIST 를 지정할 경우 User 객체도 영속성이 전이됨(영속화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zzang9ha.tistory.com/350&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zzang9ha.tistory.com/350&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/JPA</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/429</guid>
      <comments>https://developyo.tistory.com/entry/JPA-cascade#entry429comment</comments>
      <pubDate>Thu, 10 Nov 2022 01:37:31 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 소스코드에서 마지막 개행의 필요성</title>
      <link>https://developyo.tistory.com/entry/CS-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EB%A7%88%EC%A7%80%EB%A7%89-%EA%B0%9C%ED%96%89%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;POSIX 명세에 따라 텍스트 파일끼리 구분을 짓기 위해 소스 마지막 부분은 개행한다.&lt;/p&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://blog.coderifleman.com/2015/04/04/text-files-end-with-a-newline/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.coderifleman.com/2015/04/04/text-files-end-with-a-newline/&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;</description>
      <category>Computer Science</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/427</guid>
      <comments>https://developyo.tistory.com/entry/CS-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EB%A7%88%EC%A7%80%EB%A7%89-%EA%B0%9C%ED%96%89%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1#entry427comment</comments>
      <pubDate>Tue, 8 Nov 2022 23:54:39 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] equals , hashcode</title>
      <link>https://developyo.tistory.com/entry/JPA-equals-hashcode</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[ Object equals ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;equals 메서드는 같은 객체(인스턴스) 일 경우에만 동일하다고 판단.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reflexive : x.equals(x) 는 항상 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;symmetric : x.equals(y) 가 참이라면 y.equals(x) 역시 참이어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transitive : x.equals(y) 가 참이고 y.equals(z) 가 참일 때 x.equals(z) 역시 참이어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;consistent : x.equals(y)가 참일 때 equals 메서드에 사용된 값이 변하지 않는 이상 몇번을 호출해도 같은 결과가 나와야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x가 null이 아닐 때 x.equals(null) 은 항상 거짓이어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ JPA 에서의 equals ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔티티 매니저의 영속성 컨텍스트에서 1차 캐시를 이용해 같은 ID의 엔티티를 항상 같은 객체로 가져올 수 있다. 하지만 1차 캐시를 초기화 한 후 다시 데이터베이스에서 동일한 엔티티를 읽어오는 경우 초기화 전에 얻었던 객체와 초기화 이후에 얻은 객체가 서로 다른 객체로 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 equals 메서드의 consistent 원칙을 위반하는 것이며 엔티티는 자바 객체라기 보단 데이터베이스 테이블 레코드에 가깝기 때문에 엔티티 객체의 필드(pk)가 동일하다면 같은 레코드, 즉 객체라고 판단해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 이유로 equals 메서드와 hashCode 메서드를 재정의 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 준영속 상태의 엔티티 간 비교, 비교할 두 인자가 둘 다 null 인 상태에서의 비교 등을 고려하여&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Objects.hash 메서드를 사용하여 hashCode 구현&lt;/p&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://velog.io/@park2348190/JPA-Entity%EC%9D%98-equals%EC%99%80-hashCode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@park2348190/JPA-Entity%EC%9D%98-equals%EC%99%80-hashCode&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/JPA</category>
      <category>equals</category>
      <category>hashcode</category>
      <category>JPA</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/426</guid>
      <comments>https://developyo.tistory.com/entry/JPA-equals-hashcode#entry426comment</comments>
      <pubDate>Tue, 8 Nov 2022 23:34:27 +0900</pubDate>
    </item>
    <item>
      <title>[Design Pattern] 정적 팩토리 메소드 패턴</title>
      <link>https://developyo.tistory.com/entry/%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-%ED%8C%A8%ED%84%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[ 정적팩토리메소드 패턴 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://7942yongdae.tistory.com/147&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://7942yongdae.tistory.com/147&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 정적팩토리메소드 패턴 네이밍 룰 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. from: 하나의 매개변수를 받아서 해당 타입의 인스턴스 생성&lt;br /&gt;2. of: 여러개의 매개변수를 받아서 인스턴스를 생성&lt;br /&gt;3. instance or getInstance: 인스턴스를 반환하지만 동일한 인스턴스임을 보장하지 않는다.&lt;br /&gt;4. create or newInstance: instance 혹은 getInstance와 같지만, 매번 새로운 인스턴스를 생성하여 반환함을 보장.&lt;br /&gt;5. getType: getInstance와 같으나 생성할 클래스가 아닌 다른 클래스에 팩토리 메소드를 정의할 때 사용. (호출하는 클래스와 다른 타입의 인스턴스를 반환할때 사용)&lt;/p&gt;
&lt;pre id=&quot;code_1668347397839&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FileStore fs = Files.getFileStore(path);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. newType: getType과 같지만 매번 새로운 인스턴스를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. type : getType 과 newType의 간결한 버전&lt;/p&gt;
&lt;pre id=&quot;code_1668347513690&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Test&amp;gt; list = Collections.list(test);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@saint6839/%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EB%B0%A9%EC%8B%9D&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@saint6839/%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EB%B0%A9%EC%8B%9D&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 생성자에 코드를 넣지 말자 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cozzin.tistory.com/71&quot;&gt;https://cozzin.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;※ 디미터법칙&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2020-06-02-law-of-demeter/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tecoble.techcourse.co.kr/post/2020-06-02-law-of-demeter/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 객체 자신의 메서드들&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. 메서드의 파라미터로 넘어온 객체들의 메서드들&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3. 메서드 내부에서 생성, 초기화된 객체의 메서드들&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. 인스턴스 변수로 가지고 있는 객체가 소유한 메서드들&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;</description>
      <category>back/Design Pattern</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/425</guid>
      <comments>https://developyo.tistory.com/entry/%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-%ED%8C%A8%ED%84%B4#entry425comment</comments>
      <pubDate>Thu, 3 Nov 2022 02:23:08 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 일급콜렉션 : First Class Collection</title>
      <link>https://developyo.tistory.com/entry/Java-%EC%9D%BC%EA%B8%89%EC%BD%9C%EB%A0%89%EC%85%98-First-Class-Collection</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 일급콜렉션 : First Class Collection ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collection 을 Wrapping 한 클래스&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;규칙 8: 일급 콜렉션 사용&lt;br /&gt;이 규칙의 적용은 간단하다.&lt;br /&gt;콜렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.&lt;br /&gt;각 콜렉션은 그 자체로 포장돼 있으므로 이제 콜렉션과 관련된 동작은 근거지가 마련된셈이다.&lt;br /&gt;필터가 이 새 클래스의 일부가 됨을 알 수 있다.&lt;br /&gt;필터는 또한 스스로 함수 객체가 될 수 있다.&lt;br /&gt;또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙을 적용하는 등의 동작을 처리할 수 있다.&lt;br /&gt;이는 인스턴스 변수에 대한 규칙의 확실한 확장이지만 그 자체를 위해서도 중요하다.&lt;br /&gt;콜렉션은 실로 매우 유용한 원시 타입이다.&lt;br /&gt;많은 동작이 있지만 후임 프로그래머나 유지보수 담당자에 의미적 의도나 단초는 거의 없다. - 소트웍스 앤솔로지 객체지향 생활체조편&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 일급콜렉션의 예 ]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1665066689096&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 콜렉션 사용
final List&amp;lt;Integer&amp;gt; lottoTicket = new ArrayList&amp;lt;&amp;gt;();
lottoTicket.add(4);
lottoTicket.add(11);
lottoTicket.add(15);
lottoTicket.add(21);
lottoTicket.add(33);
lottoTicket.add(45);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1665066819778&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 일급콜렉션 (Wrapping)
public class LottoTicket {
	
    private final List&amp;lt;Integer&amp;gt; lottoNumbers;
    
    public LottoTicket(List&amp;lt;Integer&amp;gt; lottoNumbers){
    	this.lottoNumbers = lottoNumbers;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 일급콜렉션을 왜 써야 하는가? ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;1. 비지니스에 종속적인 자료구조 : Wrapper 클래스(일급콜렉션 클래스) 내에서 콜렉션에 대한 유효성 검사 및 정제 등의 로직을 포함하여 비지니스에 필요한 자료구조를 만들 수 있다. (ex: LottoTicket 내에서 Lotto 번호 범위(1~45)에 대한 유효성 검사 로직을 추가)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;2. 불변 : 콜렉션 변수를 final 로 선언시 재할당만 불가할 뿐, 콜렉션에 .set 등이 가능하여 불변성 보장이 되지 않는 반면 일급콜렉션 사용시 선언 후엔 조작이 불가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 상태와 행위를 한 곳에서 관리 : 값과 로직이 함께 존재 (ex: 일급콜렉션 클래스 내에 콜렉션의 합계를 구하는 메소드를 구현하여 상태와 행위를 한 곳에서 관리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이름이 있는 컬렉션 : Wrapping 한 클래스를 사용하므로 인스턴스 생성시 new ArrayList&amp;lt;&amp;gt;() 대신 new LottoTicket(createNonDuplicatedNumbers()) 이 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 일급콜렉션에서 Wrapping 한 인스턴스 변수를 외부에서 필요로 할 땐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collections.unmidifiableList 를 사용하여 리턴하여 외부에서의 변경을 막는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;출처 및 참고 :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/412&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jojoldu.tistory.com/412&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@injoon2019/%EC%9D%BC%EA%B8%89%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%98-%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4-unmodifiable-%EB%B0%A9%EC%96%B4%EC%A0%81-%EB%B3%B5%EC%82%AC&quot;&gt;https://velog.io/@injoon2019/%EC%9D%BC%EA%B8%89%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%98-%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4-unmodifiable-%EB%B0%A9%EC%96%B4%EC%A0%81-%EB%B3%B5%EC%82%AC&lt;/a&gt;&lt;/p&gt;</description>
      <category>back</category>
      <category>First Class Collection</category>
      <category>일급콜렉션</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/424</guid>
      <comments>https://developyo.tistory.com/entry/Java-%EC%9D%BC%EA%B8%89%EC%BD%9C%EB%A0%89%EC%85%98-First-Class-Collection#entry424comment</comments>
      <pubDate>Thu, 6 Oct 2022 23:36:32 +0900</pubDate>
    </item>
    <item>
      <title>[TDD] 테스트주도개발</title>
      <link>https://developyo.tistory.com/entry/TDD-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%A3%BC%EB%8F%84%EA%B0%9C%EB%B0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[ TDD란 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test Driven Development 의 약자로 테스트 코드를 작성하고 프로덕션 코드를 개발하는, 테스트에서 부터 개발이 이뤄지는 테스트가 주도하는 개발 방법.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TDD = TFD(Test First Development) + 리팩토링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ TDD 원칙 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패하는 단위 테스트를 작성할 때 까지 프로덕션 코드를 작성하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실패하는 테스트를 통과할 정도로만 실제 코드 작성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ TDD 는 어떻게 해야하나 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 분석을 통한 대략적인 설계를 한 후 객체를 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI, DB 등과 의존관계를 가지지 않는 핵심 도메인 영역을 집중 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller , View 보단 우선적으로 Domain(Model) 영역을 1차적으로 단위테스트 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back</category>
      <category>tdd</category>
      <category>TFD</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/423</guid>
      <comments>https://developyo.tistory.com/entry/TDD-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%A3%BC%EB%8F%84%EA%B0%9C%EB%B0%9C#entry423comment</comments>
      <pubDate>Tue, 4 Oct 2022 23:10:16 +0900</pubDate>
    </item>
    <item>
      <title>[Java] GC</title>
      <link>https://developyo.tistory.com/entry/Java-GC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ GC : Garbage collector ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM 메모리는 크게 class / stack / heap 영역으로 나누어지며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GC 는 heap 영역을 대상으로 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heap 영역은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Young / Old / Perm 영역으로 나눌 수 있으며 (java 8부터 Perm 영역은 제거되었음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Young 영역은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eden , survivor 0, survivor 1 로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 객체 생성시 Eden 영역에 할당되며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eden 영역이 다 찼을 경우 reachable (접근 가능한 상태) 한 객체는 survivor 0로 옮기고 Eden 영역을 정리한다 (minor GC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복적으로 Eden 영역을 정리하다 survivor 0 이 다 찬 경우, reachable 한 객체를 survivor 1 로 옮긴 후 survivor 0 을 비워준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 age 가 특정 임계점 도달시 Old 영역으로 객체를 옮겨준다 (promote)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 반복하다 Old 영역도 다 차게되면 Full GC (major GC) 가 발생한다.&lt;/p&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;GC 수행시 아래 작업을 공통적으로 수행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mark and Sweep : Mark(사용되는 메모리와 사용되지 않는 메모리 구분), Sweep(사용되지 않는 메모리 해제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stop the world : GC 수행하는 쓰레드를 제외한 모든 쓰레드 작업 중단&lt;/p&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;[ GC 알고리즘 종류 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Serial GC : 싱글쓰레드로 GC 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Parallel GC : Young 영역 GC 를 멀티쓰레드로 수행 (java 8)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Parallel Old GC : Young , Old 영역 모두 GC를 멀티쓰레드로 수행 (java 8)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. CMS GC :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. G1 GC : Heap 을 일정한 크기의 region 으로 나눔. (java 9)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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://mangkyu.tistory.com/118&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mangkyu.tistory.com/118&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@injoon2019/CS-%EC%A0%95%EB%A6%AC-GC-Garbage-Collector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@injoon2019/CS-%EC%A0%95%EB%A6%AC-GC-Garbage-Collector&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/java</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/420</guid>
      <comments>https://developyo.tistory.com/entry/Java-GC#entry420comment</comments>
      <pubDate>Tue, 23 Aug 2022 14:49:08 +0900</pubDate>
    </item>
    <item>
      <title>[SECURITY] JWT</title>
      <link>https://developyo.tistory.com/entry/SECURITY-JWT</link>
      <description>&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;1181&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvTtMh/btrJHeBAGaA/Lg4P1UlYSlFwzcFkOpPKBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvTtMh/btrJHeBAGaA/Lg4P1UlYSlFwzcFkOpPKBK/img.png&quot; data-alt=&quot;https://jwt.io/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvTtMh/btrJHeBAGaA/Lg4P1UlYSlFwzcFkOpPKBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvTtMh%2FbtrJHeBAGaA%2FLg4P1UlYSlFwzcFkOpPKBK%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;1181&quot; height=&quot;628&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://jwt.io/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[JWT]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Json Web Token 의 약자로 토큰값 자체에 데이터를 가지고 있는 인증 토큰.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.으로 구분되는 3개 영역, Header.Payload.Signature 으로 나뉘어 진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 영역은 Base64로 인코딩 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Base64란? Binary Data를 Text로 바꾸는 Encoding 방법 중 하나로 Binary Data를 Character set 에 영향을 받지 않는 공통 ASCII 영역의 문자로만 이루어진 문자열로 바꾸는 Encoding.&lt;/p&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;[Header.Payload.Signature]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Header : 토큰에 사용된 알고리즘(SHA256, HS512 등)과 MIME 타입(보통 &quot;typ&quot; : &quot;JWT&quot; 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Payload : 토큰의 바디로써 Claim(User Id 와 같은 Entity 정보) 정보를 담고 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 암호화 되어있지 않고 단순 Base64 인코딩이 되어있으므로 패스워드와 같이 중요한 데이터를 담지 않도록 주의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Signature : Header 와 Payload 가 위변조 되었는지 검증하기 위한 부분으로써 Header와 Payload 를 base64 encoding 해서 만든 두 값을 . 로 이어 붙이고 Header 에서 지정한 알고리즘(alg)로 인코딩하여 Signature 를 만듬.&lt;/p&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://blog.outsider.ne.kr/1160&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.outsider.ne.kr/1160&lt;/a&gt;&lt;/p&gt;</description>
      <category>back/SECURITY</category>
      <category>JWT</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/415</guid>
      <comments>https://developyo.tistory.com/entry/SECURITY-JWT#entry415comment</comments>
      <pubDate>Tue, 16 Aug 2022 23:44:47 +0900</pubDate>
    </item>
    <item>
      <title>[SECURITY] Authentication vs Authorization</title>
      <link>https://developyo.tistory.com/entry/SECURITY-Authentication-vs-Authorization</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-16 오후 11.20.29.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vY7Qk/btrJSlTirBW/2hXT1ZehL3GtMTLTI8LWF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vY7Qk/btrJSlTirBW/2hXT1ZehL3GtMTLTI8LWF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vY7Qk/btrJSlTirBW/2hXT1ZehL3GtMTLTI8LWF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvY7Qk%2FbtrJSlTirBW%2F2hXT1ZehL3GtMTLTI8LWF1%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;541&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2022-08-16 오후 11.20.29.png&quot; data-origin-width=&quot;541&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;&lt;b&gt;Authentication (인증) 과 Authorization (인가) 의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 : 유저가 누구인지 확인&lt;/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;</description>
      <category>back/SECURITY</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/414</guid>
      <comments>https://developyo.tistory.com/entry/SECURITY-Authentication-vs-Authorization#entry414comment</comments>
      <pubDate>Tue, 16 Aug 2022 23:23:28 +0900</pubDate>
    </item>
    <item>
      <title>[Gradle] implementation vs compile</title>
      <link>https://developyo.tistory.com/entry/Gradle-implementation-vs-compileOnly</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP8LcB/btrJFOJiHgR/MTvIrflZVowuZNr5fkZxfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP8LcB/btrJFOJiHgR/MTvIrflZVowuZNr5fkZxfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP8LcB/btrJFOJiHgR/MTvIrflZVowuZNr5fkZxfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP8LcB%2FbtrJFOJiHgR%2FMTvIrflZVowuZNr5fkZxfK%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;761&quot; height=&quot;254&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;254&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;[compileOnly vs rumtimeOnly]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compileOnly : compile시 필요한 library. compileClasspath 에만 들어감 (대표적으로 lombok)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;runtimeOnly : rumtime시 필요한 library. runtimeClasspath 에만 들어감 (대표적으로 h2database)&lt;/p&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;[compile(api) vs implementation]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;implementation : 지정한 라이브러리만 빌드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compile : 의존하고 있는 상위 라이브러리 까지 빌드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* compile 키워드는 gradle 7.x 부터 deprecated 되었음 (api 로 대체)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A &amp;gt; B &amp;gt; C 의존성을 갖는 상황, C 가 변경되었을 때&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compile : A, B 까지 rebuild&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;implementation : B 만 rebuild  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* compile(api) 은 프로젝트가 무거워지므로 사용을 지양할 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kotlinworld.com/317&quot;&gt;https://kotlinworld.com/317&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/mindorks/implementation-vs-api-in-gradle-3-0-494c817a6fa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/mindorks/implementation-vs-api-in-gradle-3-0-494c817a6fa&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration&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;annotationprocessor :&amp;nbsp;&lt;/p&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://tomgregory.com/annotation-processors-in-gradle-with-the-annotationprocessor-dependency-configuration/#:~:text=Annotation%20processing%20is%20a%20Java,such%20as%20classes%20or%20documentation.&quot;&gt;https://tomgregory.com/annotation-processors-in-gradle-with-the-annotationprocessor-dependency-configuration/#:~:text=Annotation%20processing%20is%20a%20Java,such%20as%20classes%20or%20documentation.&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;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://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/Maven, Gradle</category>
      <category>gradle</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/413</guid>
      <comments>https://developyo.tistory.com/entry/Gradle-implementation-vs-compileOnly#entry413comment</comments>
      <pubDate>Mon, 15 Aug 2022 23:32:52 +0900</pubDate>
    </item>
    <item>
      <title>[logback] 로그파일 분기처리하기 : SIFT 사용</title>
      <link>https://developyo.tistory.com/entry/logback-%EB%A1%9C%EA%B7%B8%ED%8C%8C%EC%9D%BC-%EB%B6%84%EA%B8%B0%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-SIFT-%EC%82%AC%EC%9A%A9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SIFT Appender 를 사용하여 로그 분기처리&lt;/p&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;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #e5e5e5;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #666; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;35&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;36&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;37&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;38&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;39&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;40&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;41&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;42&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;43&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;44&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;45&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;46&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;version&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;encoding&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;CONSOLE&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;ch.qos.logback.core.ConsoleAppender&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;encoder&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;Pattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;%d{yyyy-MM-dd&amp;nbsp;HH:mm:ss.SSS}[%-5level]&amp;nbsp;:&amp;nbsp;%msg%n&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;Pattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;encoder&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;TST&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;ch.qos.logback.core.ConsoleAppender&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;encoder&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;Pattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;%d{yyyy-MM-dd&amp;nbsp;HH:mm:ss.SSS}[%-5level]-%msg%n&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;Pattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;encoder&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;SIFT&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;ch.qos.logback.classic.sift.SiftingAppender&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;discriminator&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;discr&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;defaultValue&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;type&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;defaultValue&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;discriminator&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;sift&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;FILE-${discr}&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;/${discr}.log&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;layout&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;ch.qos.logback.classic.PatternLayout&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;Pattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;%d&amp;nbsp;[%thread]&amp;nbsp;%level&amp;nbsp;%mdc&amp;nbsp;%logger{35}&amp;nbsp;SIFT-&amp;nbsp;%msg%n&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;Pattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;rollingPolicy&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;fileNamePattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;/${discr}_%d{yyyy-MM-dd-HH-mm}.%i.log&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;fileNamePattern&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;rollingPolicy&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;sift&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;logger&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;jpabook.jpashop.service.OrderService&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;level&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;additivity&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;&amp;lt;!--&amp;lt;appender-ref&amp;nbsp;ref=&quot;TST&quot;/&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender-ref&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;SIFT&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;root&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;level&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;debug&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;appender-ref&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;CONSOLE&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[테스트]&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #e5e5e5;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #666; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;import&lt;/span&gt;&amp;nbsp;org.slf4j.MDC;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;@Slf4j&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Sample&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;void&lt;/span&gt;&amp;nbsp;testLog(){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MDC.put(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;discr&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;TYP1&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//log.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.trace(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;test&amp;nbsp;trace&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.debug(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;test&amp;nbsp;debug&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.info(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;test&amp;nbsp;info&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.warn(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;test&amp;nbsp;warn&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.error(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;test&amp;nbsp;error&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MDC.put(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;discr&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;TYP2&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.error(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;test&amp;nbsp;error222&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[결과]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tSKe2/btrHd2CBmOM/KJIi7Xf4ksPQrVKdCxUm2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tSKe2/btrHd2CBmOM/KJIi7Xf4ksPQrVKdCxUm2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tSKe2/btrHd2CBmOM/KJIi7Xf4ksPQrVKdCxUm2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtSKe2%2FbtrHd2CBmOM%2FKJIi7Xf4ksPQrVKdCxUm2k%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;614&quot; height=&quot;44&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;44&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;* ThreadPool 사용시 MDC key값을 전달받지 못함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;: MDC.setContextMap 으로 key 값 전달가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;참고 : &lt;a href=&quot;https://stackoverflow.com/questions/6073019/how-to-use-mdc-with-thread-pools&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/6073019/how-to-use-mdc-with-thread-pools&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;* slf4j MDC 를 사용하지 않더라도, strategy pattern 과 같은 디자인 패턴을 사용하고, 분기처리할 구현체에 logger 를 지정하여 패키지 경로마다 별도 로그 파일 및 별도 경로의 로그파일에 로그 적재가 가능할 듯.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>back/Spring Boot</category>
      <category>log4j</category>
      <category>logback</category>
      <category>sift</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/409</guid>
      <comments>https://developyo.tistory.com/entry/logback-%EB%A1%9C%EA%B7%B8%ED%8C%8C%EC%9D%BC-%EB%B6%84%EA%B8%B0%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-SIFT-%EC%82%AC%EC%9A%A9#entry409comment</comments>
      <pubDate>Thu, 14 Jul 2022 01:07:37 +0900</pubDate>
    </item>
    <item>
      <title>[IDE] IntelliJ 단축키</title>
      <link>https://developyo.tistory.com/entry/IDE-IntelliJ-%EB%8B%A8%EC%B6%95%ED%82%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[Window / Mac]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + X : 한줄지우기(ctrl+D)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Alt + V : 변수선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+Shift+C : 커서 파일에 두고 수행시 파일경로 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Shift+F10 : 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+Shift+F9 : recompile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+Shift+T : test 생성 (mac : command shift T)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+Shift+방향키 : 블럭이동 (eclipse : Ctrl+방향키)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alt + enter : 아직 생성하지 않은 (선언한) 객체에 커서두고 실행시 create class&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Alt + 방향키 : 이전파일로 돌아가기 (alt+방향키)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alt + Shift + L : beautify (줄정렬) ctrl + shift + f&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Shift + F : 호출부 찾기 ctrl + shift + g&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alt + enter : import (mac : option + enter)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Alt + N : 여러줄 로직을 하나로 줄이기 (ex: 객체 선언부와 리턴이 각개로 있을 경우 리턴 바로하도록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Alt + M : 선택된 로직 덩어리를 메소드로 만들어버리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Alt + P : 변수에 커서를 두고 단축키 입력시 변수를 파라미터로 빼줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Alt + V : 메소드에 커서 두고 단축키 입력시 메소드 리턴값을 받는 변수 좌측에 선언됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + H : eclipse Ctrl+T&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alt + Insert : generate Constructor (mac : cmd+N)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + o : override method (오버라이드 가능한 메소드 목록 불러오기 및 오버라이딩)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + e : 최근 열었던 파일 리스트 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Ctrl + 방향키 : 멀티라인 셀렉트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Mac]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + B = 호출부 찾기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ctrl + shift + 방향키 = 블럭이동&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + 1 = project view&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;shift + shift (연타) = search 창&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + option + V = 리팩토링 (변수 빼기)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + shift + F = 퀵서치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + option + 방향키 = 이전 이후 파일로 이동&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ctrl + shift + O = 파일찾기 (ctrl + shift + R (이클립스))&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + option + l = formatting&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd + n = equals / hashcode overriding&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[설정]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eclipse 'Link with Editor' 기능: 좌측 프로젝트 트리에서 우상단의 툴팁 클릭 후 'Always Select Opened File' 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[플러그인] IntelliJ 유용한 Plugin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.ignore&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Atom Material Icons&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CodeGlance Pro&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitToolBox&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grep Console&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Key Promoter X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Korean Language Pack (미사용.. 영어에 익숙해지자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Meterial Theme UI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rainbow Brackets&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc.</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/407</guid>
      <comments>https://developyo.tistory.com/entry/IDE-IntelliJ-%EB%8B%A8%EC%B6%95%ED%82%A4#entry407comment</comments>
      <pubDate>Mon, 11 Jul 2022 23:53:46 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] SSO : Single Sign-On</title>
      <link>https://developyo.tistory.com/entry/AWS-SSO-Single-Sign-On</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS SSO ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Centrally manage Single Sign-On to access multiple accounts and 3rd party business applications&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Integrated with AWS Organizations&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Supports SAML 2.0 markup&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Integration with on-premis Active Directory&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Centralized permission management&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Centralized auditing with CloudTrail&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;845&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UKXGm/btrDfDy73g7/3ntLQ5fNGwLHJywdsK5Rt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UKXGm/btrDfDy73g7/3ntLQ5fNGwLHJywdsK5Rt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UKXGm/btrDfDy73g7/3ntLQ5fNGwLHJywdsK5Rt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUKXGm%2FbtrDfDy73g7%2F3ntLQ5fNGwLHJywdsK5Rt0%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;716&quot; height=&quot;459&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ SSO vs AssumeRoleWithSAML ]&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;1126&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLomCg/btrDcTRcq7V/XwvOeq5i8fMO6dvFKAyE41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLomCg/btrDcTRcq7V/XwvOeq5i8fMO6dvFKAyE41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLomCg/btrDcTRcq7V/XwvOeq5i8fMO6dvFKAyE41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLomCg%2FbtrDcTRcq7V%2FXwvOeq5i8fMO6dvFKAyE41%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;776&quot; height=&quot;324&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>SSO</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/404</guid>
      <comments>https://developyo.tistory.com/entry/AWS-SSO-Single-Sign-On#entry404comment</comments>
      <pubDate>Thu, 26 May 2022 23:29:38 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 20-4. Resource Access Manager</title>
      <link>https://developyo.tistory.com/entry/AWS-20-4-Resource-Access-Manager</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS Resource Access Manager (RAM) ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자신의 AWS 리소스를 타 AWS 계정과 공유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리소스 중복 생성 막을 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VPC Subnets/AWS Transit Gateway/Route 53 Resolver Rules/&lt;b&gt;License Manager Configurations 등 공유 가능&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Share AWS resources that you own with other AWS accounts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Share with any account or within your Organization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Avoid resource duplication!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- VPC Subnets:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- allow to have all the resources launched in the same subnets&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- must be from the same AWS Organizations&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Cannot share security groups and default VPC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Participants can manage their own resources in there&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Participants can't view, modify, delete resources that belong to other participants or the owner&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- AWS Transit Gateway&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Route53 Resolver Rules&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- License Manager Configurations&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* VPC : Virtual Private Cloud&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Resource Access Manager - VPC example ]&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;641&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hk9uc/btrDeCtWtDW/iAauuytvWcsplLmb8KkGMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hk9uc/btrDeCtWtDW/iAauuytvWcsplLmb8KkGMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hk9uc/btrDeCtWtDW/iAauuytvWcsplLmb8KkGMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHk9uc%2FbtrDeCtWtDW%2FiAauuytvWcsplLmb8KkGMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;330&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각각의 계정은 다른 계정의 리소스를 읽고쓰고지우는 행위를 할 수 없음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크가 공유되기 때문에 resource 간의 통신이 가능, 이때 private IP 사용.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Each account is responsible for its own resources.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Each account cannot view, modify/delete other resources in other accounts.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Network is shared so, anything deployed in the VPC can talk to other resources in the VPC.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Applications are accessed easily across accounts,&lt;b&gt; using private IP.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Security groups from other accounts can be referenced for maximum security&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS RAM</category>
      <category>AWS Resource Access Manager</category>
      <category>vpc</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/403</guid>
      <comments>https://developyo.tistory.com/entry/AWS-20-4-Resource-Access-Manager#entry403comment</comments>
      <pubDate>Thu, 26 May 2022 23:25:15 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 20-3. AWS IAM Advanced, IAM Policy Evaluation Logic</title>
      <link>https://developyo.tistory.com/entry/AWS-20-3-AWS-IAM-Advanced</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ IAM Conditions ]&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;365&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhF7T9/btrC88MYTpN/5aLFMQhUKsOR0KCaPLtZ30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhF7T9/btrC88MYTpN/5aLFMQhUKsOR0KCaPLtZ30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhF7T9/btrC88MYTpN/5aLFMQhUKsOR0KCaPLtZ30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhF7T9%2FbtrC88MYTpN%2F5aLFMQhUKsOR0KCaPLtZ30%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;365&quot; height=&quot;319&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시한 두 아이피 대역을 제외한 모든 클라이언트 호출을 제한함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deny everything(*)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws:SourceIP: restrict the client IP from which the API calls are being made&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;327&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo7pJE/btrC8e1dbTS/kaF2eqkcn5XqWQV8ln9gN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo7pJE/btrC8e1dbTS/kaF2eqkcn5XqWQV8ln9gN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo7pJE/btrC8e1dbTS/kaF2eqkcn5XqWQV8ln9gN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo7pJE%2FbtrC8e1dbTS%2FkaF2eqkcn5XqWQV8ln9gN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;327&quot; height=&quot;416&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시한 두개의 region 에게 ec2/rds/dynamodb 의 모든 액션을 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws:RequestedRegion: restrict the region The API calls are made to&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;525&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyhj8d/btrC9mkgpV7/MnQE69L5iK0L3wGPHiOvdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyhj8d/btrC9mkgpV7/MnQE69L5iK0L3wGPHiOvdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyhj8d/btrC9mkgpV7/MnQE69L5iK0L3wGPHiOvdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feyhj8d%2FbtrC9mkgpV7%2FMnQE69L5iK0L3wGPHiOvdk%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;525&quot; height=&quot;392&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;restrict based on tags&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;483&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0Z4J/btrC7KzEffb/FkKT49e2ME1YwRhwelm8l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0Z4J/btrC7KzEffb/FkKT49e2ME1YwRhwelm8l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0Z4J/btrC7KzEffb/FkKT49e2ME1YwRhwelm8l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0Z4J%2FbtrC7KzEffb%2FFkKT49e2ME1YwRhwelm8l1%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;464&quot; height=&quot;375&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;force MFA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ IAM for S3 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ListBucket permission applies to&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arn:aws:s3:::test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; bucket level permission&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetObject, PutObject, DeleteObject applies to&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arn:aws:s3:::test&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;418&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v6mFK/btrC8m58lPO/YDlcMsUgE3LUQ7tthEyRRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v6mFK/btrC8m58lPO/YDlcMsUgE3LUQ7tthEyRRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v6mFK/btrC8m58lPO/YDlcMsUgE3LUQ7tthEyRRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv6mFK%2FbtrC8m58lPO%2FYDlcMsUgE3LUQ7tthEyRRK%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;348&quot; height=&quot;401&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;482&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;[ IAM Roles vs Resource Based Policies ]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attach a policy to a resource (ex: S3 bucket policy) &lt;b&gt;vs&lt;/b&gt; attaching of a using a role as a proxy&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgnGXN/btrC8TJp67D/Sbr41CSV3LI83dxripMMqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgnGXN/btrC8TJp67D/Sbr41CSV3LI83dxripMMqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgnGXN/btrC8TJp67D/Sbr41CSV3LI83dxripMMqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgnGXN%2FbtrC8TJp67D%2FSbr41CSV3LI83dxripMMqK%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;691&quot; height=&quot;117&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;way1. Account A 가 Account B 의 S3 를 사용하려면 STS 를 사용하여 role assume 후 Account B 의 S3 접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt;&amp;nbsp;When you assume a role (user, application or service), you give up your original permissions and take the permissions assigned to the role&lt;/p&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;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM15wN/btrC89SEmUx/TOk1QNPATq31eOevSHOLVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM15wN/btrC89SEmUx/TOk1QNPATq31eOevSHOLVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM15wN/btrC89SEmUx/TOk1QNPATq31eOevSHOLVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM15wN%2FbtrC89SEmUx%2FTOk1QNPATq31eOevSHOLVk%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;688&quot; height=&quot;109&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;way2. S3 bucket policy 생성 후 Account A 의 액세스를 허용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt;&amp;nbsp;When using a resource based policy, the principal doesn't have to give up his permissions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;way1의 role assume 을 사용할 때의 문제점 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Account A 의 DynamoDB 테이블 스캔 후 타계정의 S3 bucket 에 저장할 때 Account B의 권한만 갖게 되므로 Account A 의 권한이 없어짐. 이와 같은 경우 Resource Based policy 를 사용해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex: User in account A needs to scan a DynamoDB table in Account A and dump it in an S3 bucket in AccountB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resource Based policy Supported by : Amazon S3 buckets, SNS topics, SQS queues&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ IAM Permission Boundaries ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM Permission Boundaries are supported for users, groups and roles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Advanced feature to use a managed policy to set the maximum permissions and IAM entity can get&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VhdRH/btrC8TWXyqC/sRDcs7nRbQMb54HENH3SfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VhdRH/btrC8TWXyqC/sRDcs7nRbQMb54HENH3SfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VhdRH/btrC8TWXyqC/sRDcs7nRbQMb54HENH3SfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVhdRH%2FbtrC8TWXyqC%2FsRDcs7nRbQMb54HENH3SfK%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;729&quot; height=&quot;273&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM Policy 로 유저생성 권한을 주었지만 IAM Permission Boundary 로 S3, cloudwatch, ec2 에 대한 권한만 주었기 때문에 실제론 아무 권한이 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; IAM Policy 로 권한을 부여해도 IAM Permission Boundary 가 우선적으로 권한을 제어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ IAM Permission Boundaries ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Can be used in combinations of AWS Organizations SCP&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3E9dy/btrC8nqsWek/ensc8xNKsK7S9hMww8byG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3E9dy/btrC8nqsWek/ensc8xNKsK7S9hMww8byG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3E9dy/btrC8nqsWek/ensc8xNKsK7S9hMww8byG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3E9dy%2FbtrC8nqsWek%2Fensc8xNKsK7S9hMww8byG1%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;330&quot; height=&quot;269&quot; data-origin-width=&quot;330&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;Organizagions SCP , Permissions boundary, Identity-based policy 를 조합하여 효율적인 권한제어 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 유저에게만 권한 제어 가능, 개발자들이 스스로 admin 권한을 주는 것을 막을 수 있음.. 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Delegate responsibilities to non administrators within their permission boundaries, for example create new IAM users&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Allow developers to self-assign policies and manage their own permissions, while making sure they can't escalate their privileges (make themselves admin)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Useful to restrict one specific user (instead of a whole account using Organizations &amp;amp; SCP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ IAM Policy Evaluation Logic ]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Swt0h/btrDaoWfval/V6e92kIXfdxGKcGIkSU3PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Swt0h/btrDaoWfval/V6e92kIXfdxGKcGIkSU3PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Swt0h/btrDaoWfval/V6e92kIXfdxGKcGIkSU3PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSwt0h%2FbtrDaoWfval%2FV6e92kIXfdxGKcGIkSU3PK%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;1154&quot; height=&quot;517&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;517&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;[ Example IAM Policy ]&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;276&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrXpJ/btrC7yl1IB3/PbqEr8sb58TliFPkM6OuwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrXpJ/btrC7yl1IB3/PbqEr8sb58TliFPkM6OuwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrXpJ/btrC7yl1IB3/PbqEr8sb58TliFPkM6OuwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrXpJ%2FbtrC7yl1IB3%2FPbqEr8sb58TliFPkM6OuwK%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;245&quot; height=&quot;304&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.sqs:CreateQueue 권한 없음 : sqs:* 가 Deny&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.sqs:DeleteQueue 권한 없음 : Deny on sqs:* 이로 다른블럭에 allow 로 명시되어 있어도 Deny.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ec2:DescribeInstance 권한 없음 : EC2에 대해 Allow 명시되어 있지 않으므로 (no explicit Allow) EC2 에 대한 권한 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>IAM</category>
      <category>IAM boundaries</category>
      <category>IAM policy</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/402</guid>
      <comments>https://developyo.tistory.com/entry/AWS-20-3-AWS-IAM-Advanced#entry402comment</comments>
      <pubDate>Wed, 25 May 2022 23:38:52 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 20-2. AWS AD (Active Directory), Organizations, OU</title>
      <link>https://developyo.tistory.com/entry/AWS-20-2-AWS-AD-Active-Directory</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;What&amp;nbsp;is&amp;nbsp;Microsoft&amp;nbsp;Active&amp;nbsp;Directory&amp;nbsp;(AD)?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자가 공유된 자원의 위치와 해당 서버의 로컬 사용자 계정을 모두 알고있지 않아도 중앙에서 Admin 이 사용자 인증 및 권한 부여 처리가 가능하도록 하여 기업내 자원 및 권한 관리에 사용.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows 환경에서 사용하기 위해 개발된 LDAP 디렉토리 서비스&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Found on any Windows Server with AD Domain Services&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Database of objects : User Accounts, Computers, Printers, File Shares, Security Groups&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Centralized security management, create account, assign permissions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Objects are organized in trees&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A group of trees is a forest&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* AD(Active Directory) : &lt;a href=&quot;https://mpain.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mpain.tistory.com/153&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* LDAP : &lt;a href=&quot;https://yongho1037.tistory.com/796&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yongho1037.tistory.com/796&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS Directory Services ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- AWS Managed Microsoft AD&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Create your own AD in AWS, managed users locally, supports MFA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Establish &quot;trust&quot; connections with your on-premise AD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- AD Connector&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Directory Gateway (&lt;b&gt;proxy&lt;/b&gt;) to redirect to on-premise AD, supports MFA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Users are managed on the on-premise AD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Simple AD&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AD-compatible managed directory on AWS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Cannot be joined with on-premise AD&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbLqHg/btrC3etpOLw/bXKuVbtw0FOP21o2PVC7i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbLqHg/btrC3etpOLw/bXKuVbtw0FOP21o2PVC7i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbLqHg/btrC3etpOLw/bXKuVbtw0FOP21o2PVC7i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbLqHg%2FbtrC3etpOLw%2FbXKuVbtw0FOP21o2PVC7i1%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;256&quot; height=&quot;272&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;568&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;[ AWS Organizations ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Global sevice&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Allows to manage multiple AWS accounts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The main account is the master account - you cannot change it&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Other accounts are member accounts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Member accounts can only be part of one organization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Consolidated(병합된) Billing across all accounts - single payment method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pricing benefits from aggregated usage (volume discount for EC2, S3..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- API is available to automate AWS account creation&lt;/p&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;[ Multi Account Strategies ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Create accounts per department, per cost center, per dev/test/prod, based on regulatory restrictions (using SCP), for better resource isolation (ex:VPC), to have separate per-account service limits, isolated account for logging&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Multi Account vs One Account Multi VPC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use tagging standards for billing purposes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Enable CloudTrail on all accounts, send logs to central S3 account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Send CloudWatch Logs to central logging account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Establish Cross Account Roles for Admin purposes&lt;/p&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;[ Organizational Units (OU) - Examples ]&amp;nbsp;&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;1171&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwPJKG/btrC2XSAv6y/hcx0mtIwQZgml13C1Idbj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwPJKG/btrC2XSAv6y/hcx0mtIwQZgml13C1Idbj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwPJKG/btrC2XSAv6y/hcx0mtIwQZgml13C1Idbj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwPJKG%2FbtrC2XSAv6y%2Fhcx0mtIwQZgml13C1Idbj1%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;1171&quot; height=&quot;336&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;336&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;[ Service Control Policies (SCP) ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IAM 작업에 대한 화이트/블랙 리스트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OU 혹은 계정에 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마스터 계정엔 적용되지 않음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ROOT 를 포함한 모든 계정 및 Role 에 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;service-linked role 엔 적용되지 않음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SCP 는 명시적 허용이 있어야함 (default 는 모든 권한이 없음)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 서비스에 대한 액세스 제한 등 권한 제한용으로 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Whitelist or blacklist IAM actions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Applied at the OU or Account level&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Does not apply to the Master Account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SCP is applied to all the Users and Roles of the Account, including ROOT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The SCP does not affect service-linked roles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Service-linked roles enable other AWS services to integrate with AWS Organizations and can't be restricted by SCPs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SCP must have an explicit Allow (does not allow anything by default)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use cases :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Restrict access to certain services (for example : can't use EMR)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Enforce PCI compliance by explicitly disabling services&lt;/p&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;[ SCP - Hierarchy ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하위 계층의 OU는 상위 계층의 OU 의 Access/Deny 정책을 따름&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex: Account B 는 Lambda와 Redshift 액세스 불가, Account A 는 Redshift 액세스 불가&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;1166&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwCEW7/btrC4PfnHlv/IGIcialsEVSWpcxZ5SyaXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwCEW7/btrC4PfnHlv/IGIcialsEVSWpcxZ5SyaXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwCEW7/btrC4PfnHlv/IGIcialsEVSWpcxZ5SyaXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwCEW7%2FbtrC4PfnHlv%2FIGIcialsEVSWpcxZ5SyaXk%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;1166&quot; height=&quot;467&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;467&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;[ AWS Organization - Moving Accounts ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 organization 으로 계정 옮길 땐 asis organization 에서 계정 제거 후 tobe organization 에 초대 및 초대 수락하여 옮김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS AD</category>
      <category>AWS Organizations</category>
      <category>Organizations Units</category>
      <category>ou</category>
      <category>SCP</category>
      <category>Service Control Policies</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/401</guid>
      <comments>https://developyo.tistory.com/entry/AWS-20-2-AWS-AD-Active-Directory#entry401comment</comments>
      <pubDate>Tue, 24 May 2022 23:53:47 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 20-1. AWS STS, Identity Federation</title>
      <link>https://developyo.tistory.com/entry/AWS-20-1-AWS-STS</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS STS (Security Token Service) ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS 리소스에 대한 임시 접근 권한 부여(임시토큰)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;토큰은 최대 1시간 유효 (refresh 필요)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AssumeRole/AssumeRoleWithSAML/AssumeRoleWithWebIdentity/GetSessionToken&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Allows to grant limited and temporary access to AWS resources&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Token is valid for up to one hour (must be refreshed)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. AssumeRole&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Within your own account: for enhanced security&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Cross Account Access : assume role in target account to perform actions there&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. AssumeRoleWithSAML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; return credentials for users logged with SAML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. AssumeRoleWithWebIdentity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; return creds for users logged with an IDP(Identity Provider) (Facebook/Google Login..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AWS recommends against using this, and using Cognito instead&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. GetSessionToken&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; for MFA(MultiFactorAthentication), from a user or AWS account root user&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Using STS to Assume a Role ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. IAM Role 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. IAM Role 에 대한 principal 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. AWS STS 를 사용하여 자격 취득&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 임시 자격은 15분에서 1시간 까지 유효&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Define an IAM Role within your account or cross-account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Define which principals can access this IAM Role&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Use AWS STS (Security Token Service) to retrieve credentials and impersonate(가장하다) the IAM Role you have access to (AsumeRole API)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Temporary credentials can be valid between 15 minutes to 1 hour&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG9Rss/btrC2MqlQaY/aWFD1Sf9mTAe3o9ZWjk7j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG9Rss/btrC2MqlQaY/aWFD1Sf9mTAe3o9ZWjk7j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG9Rss/btrC2MqlQaY/aWFD1Sf9mTAe3o9ZWjk7j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG9Rss%2FbtrC2MqlQaY%2FaWFD1Sf9mTAe3o9ZWjk7j1%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;691&quot; height=&quot;307&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;387&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;[ Identity Federation in AWS ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Identity Federation 을 통해 외부 사용자가 AWS 자원에 대한 임시 접근 권한을 가질 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이를 사용하여 IAM 유저 생성 없이 AWS 접근 허용이 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Federation lets users outside of AWS to assume temporary role for accessing AWS resources&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- These users assume identity provided access role&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Federations can have many flavors&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- SAML 2.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Custom Identity Broker&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Web Identity Federation with Amazon Cognito&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Web Identity Federation without Amazon Cognito&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Single Sign On&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Non-SAML with AWS Microsoft AD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Using federation, you don't need to create IAM users (user management is outside of AWS)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BiU8r/btrC4hC9pxZ/z2Uk214dtpA0LDrplNU590/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BiU8r/btrC4hC9pxZ/z2Uk214dtpA0LDrplNU590/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BiU8r/btrC4hC9pxZ/z2Uk214dtpA0LDrplNU590/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBiU8r%2FbtrC4hC9pxZ%2Fz2Uk214dtpA0LDrplNU590%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;263&quot; height=&quot;291&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;444&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;[ SAML 2.0 Federation ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- To integrate Active Directory/ADFS with AWS (or any SAML 2.0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Provides access to AWS Console or CLI (through temporary creds)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- No need to create an IAM user for each of your employees&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* SSO (Single Sign On) : 여러 AWS 계정 및 비지니스 앱에 대한 액세스를 중앙에서 관리 및 사용자에게 Single Sign-On 액세스 제공하여 할당된 모든 계정 및 앱을 한곳에서 액세스 가능케 하는 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(AWS STS 사용하기(좌측) : &lt;a href=&quot;https://gnidoc.tistory.com/entry/%EB%A7%A5%EC%97%90%EC%84%9C-AWS-STS-CodeCommit-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gnidoc.tistory.com/entry/%EB%A7%A5%EC%97%90%EC%84%9C-AWS-STS-CodeCommit-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(SSO 사용 하기(우측 그림) : &lt;a href=&quot;https://cloudest.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cloudest.tistory.com/62&lt;/a&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;1101&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9uAVh/btrC4hwomMd/qCxitR70iKGhHpgDl9zlgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9uAVh/btrC4hwomMd/qCxitR70iKGhHpgDl9zlgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9uAVh/btrC4hwomMd/qCxitR70iKGhHpgDl9zlgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9uAVh%2FbtrC4hwomMd%2FqCxitR70iKGhHpgDl9zlgK%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;1101&quot; height=&quot;300&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ SAML 2.0 Federation - Active Directory FS ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Same process as with any SAML 2.0 compatible idp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KOIzX/btrC1hx9WZf/PrBn1GDyE343yDJXWKnlOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KOIzX/btrC1hx9WZf/PrBn1GDyE343yDJXWKnlOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KOIzX/btrC1hx9WZf/PrBn1GDyE343yDJXWKnlOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKOIzX%2FbtrC1hx9WZf%2FPrBn1GDyE343yDJXWKnlOK%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;301&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;379&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;[ SAML 2.0 Federation ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IAM 과 SAML 간의 양방향 신뢰 설정 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SAML2.0 은 웹기반에서만 동작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AssumeRoleWithSAML STS API 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가급적 SSO 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Needs to setup a trust between AWS IAM and SAML (both ways)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SAML 2.0 enables web-based, cross domain SSO&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Uses the STS API : AssumeRoleWithSAML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Note federation through SAML is the old way of doing things&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Amazon Single Sign On(SSO) Federation is the new managed and simpler way&lt;/p&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;[ Custom Identity Broker Application ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SAML 2.0 사용 불가할 경우 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AssumeRole/GetFederation 토큰 등 STS API 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use only if identity provider is not compatible with SAML 2.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The identity broker must determine the appropriate IAM policy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Uses the STS API : AssumeRole or GetFederation Token&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blsmE7/btrC2K0pBXH/Pk2OLu4Kfkq4KKi9LtrREk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blsmE7/btrC2K0pBXH/Pk2OLu4Kfkq4KKi9LtrREk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blsmE7/btrC2K0pBXH/Pk2OLu4Kfkq4KKi9LtrREk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblsmE7%2FbtrC2K0pBXH%2FPk2OLu4Kfkq4KKi9LtrREk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;312&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Web Identity Federation - AssumeRoleWithWebIdentity ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Not recommended by AWS - use Cognito Instead (allows for anonymous users, data synchronization, MFA)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZpZjc/btrC2vPXmUa/3nQgQCRGnTbUI4eipM3TCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZpZjc/btrC2vPXmUa/3nQgQCRGnTbUI4eipM3TCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZpZjc/btrC2vPXmUa/3nQgQCRGnTbUI4eipM3TCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZpZjc%2FbtrC2vPXmUa%2F3nQgQCRGnTbUI4eipM3TCK%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;407&quot; height=&quot;315&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS Cognito ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Goal :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Provide direct access to AWS Resources from the Client Side(mobile/web app)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- provide (temporary) access to write to S3 bucket using Facebook Login&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Problem :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- We don't want to create IAM users for our app users&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;How :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Log in to federated identity provider - or remain anonymous&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Get temporary AWS credeantials back from the Federated Identity Pool&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- These credentials come with a pre-defined IAM policy stating their permissions&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4q1B0/btrC4iviheO/oBpHAWsXTbqroJXyipakP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4q1B0/btrC4iviheO/oBpHAWsXTbqroJXyipakP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4q1B0/btrC4iviheO/oBpHAWsXTbqroJXyipakP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4q1B0%2FbtrC4iviheO%2FoBpHAWsXTbqroJXyipakP1%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;399&quot; height=&quot;413&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;600&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;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>AWS Federation</category>
      <category>AWS STS</category>
      <category>cognito</category>
      <category>saml</category>
      <category>SSO</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/400</guid>
      <comments>https://developyo.tistory.com/entry/AWS-20-1-AWS-STS#entry400comment</comments>
      <pubDate>Tue, 24 May 2022 22:54:33 +0900</pubDate>
    </item>
    <item>
      <title>AWS saml</title>
      <link>https://developyo.tistory.com/entry/AWS-saml</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;[Security] SSO 개념 (SAML, OAuth, OIDC) - https://nyyang.tistory.com/m/142&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/399</guid>
      <comments>https://developyo.tistory.com/entry/AWS-saml#entry399comment</comments>
      <pubDate>Thu, 19 May 2022 09:11:01 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 19-6. AWS Config, Config Rules/Remediations/Notifications</title>
      <link>https://developyo.tistory.com/entry/AWS-19-6-AWS-Config</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS Config ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS 리소스의 변화에 대한 로깅으로 Security group 에 제한된 SSH 접근이 있는지, S3 버킷이 퍼블릭 억세스 인지, ALB(Application Load Balancer) 설정이 어떻게 변했는지 등에 대한 로깅.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;region 별 서비스, 변경시 SNS 알림 가능, region/계정에 대한 집계 가능, S3 에 저장하여 Athena를 통한 분석 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Helps with auditing and recording compliance of your AWS resources&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Helps record configurations and changes over time&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Questions that can be solved by AWS Config:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Is there unrestricted SSH access to my security groups?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Do my buckets have any public access?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; How has my ALB configuration changed over time?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can receive alerts (SNS notifications) for any changes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS Config is a per-region service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can be aggregated across regions and accounts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Possibility of storing the configuration data into S3 (analyzed by Athena)&lt;/p&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;[ Config Rules ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사전 정의된 룰 사용가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 EBS 디스크가 gp2 타입인지 확인, EC2 instance 가 t2.micro 타입인지 확인하는 등의 사용자 지정 룰 사용 가능(AWS Lambda 사용)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정 변경시 트리거에의해 동작 혹은 스케쥴링에 의해 확인 가능.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Confg Rules 는 설정변경을 막진 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무료 아님.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can use AWS managed config rules (over 75 rules)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can make custom config rules (must be defined in AWS Lambda)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ex1: evaluate if each EBS disk is of type gp2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ex2: evaluate if each EC2 instance is t2.micro&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Rules can be evaluated/triggered For each config changes (+ at regular time intervals)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS Config Rules does not prevent actions from happening (no deny)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pricing : no free tier, pay per configuration item recorded per region, pay per config rule evaluation per region&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;[ Config Rules - Remediations ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SSM 자동화 문서를 사용하여 부적합 리소스에 대한 수정을 자동화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Lambda 함수 호출하는 사용자 지정 문서 생성 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동 수정 후에도 리소스가 부적합한 경우 retry 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Automate remediation of non-compliant resources using SSM Automation Documents&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use AWS-Managed Automation Documents or create custom Automation Documents&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Tip: you can create custom Automation Documents that invokes Lambda function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can set Remediation Retries if the resource is still non-compliant after auto-remediation&lt;/p&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;[ Config Rules - Notifications ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use EventBridge to trigger notifications when AWS resources are non-compliant&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WmL9m/btrCwa6kmxK/4ZM7SvNVrD8ljs5fsSDWRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WmL9m/btrCwa6kmxK/4ZM7SvNVrD8ljs5fsSDWRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WmL9m/btrCwa6kmxK/4ZM7SvNVrD8ljs5fsSDWRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWmL9m%2FbtrCwa6kmxK%2F4ZM7SvNVrD8ljs5fsSDWRk%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;1207&quot; height=&quot;154&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ability to send configuration changes and compliance state notifications to SNS (all events - use SNS Filtering or filter at client-side)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddOC88/btrCw8tCnuI/krUncpglETGDDjgEqvKD81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddOC88/btrCw8tCnuI/krUncpglETGDDjgEqvKD81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddOC88/btrCw8tCnuI/krUncpglETGDDjgEqvKD81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddOC88%2FbtrCw8tCnuI%2FkrUncpglETGDDjgEqvKD81%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;1037&quot; height=&quot;150&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch vs CloudTrail vs Config ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudWatch&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Performance monitoring (metrics, CPU, network, etc..) &amp;amp; dashboards&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Events &amp;amp; Alerting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Log Aggregation &amp;amp; analysis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudTrail&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Record API calls made within your Account by everyone&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can define trails for specific resources&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Global Service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Config&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Record configuration changes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Evaluate resources against compliance rules&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Get timeline of changes and compliance&lt;/p&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;[ For an Elastic Load Balancer ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudWatch :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메트릭에 기반한 성능 모니터링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Monitoring Incoming connections metric&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Visualize error codes as a % over time&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Make a dashboard to get an idea of your load balancer performance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Config :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정 정합성 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Track security group rules for the Load Balancer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Track configuration changes for the Load Balancer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ensure an SSL certificate is always assigned to the Load Balancer(compliance)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudTrail :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 사용자가 설정을 변경했는지 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Track who made any changes to the Load Balancer with API calls&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS Config</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/398</guid>
      <comments>https://developyo.tistory.com/entry/AWS-19-6-AWS-Config#entry398comment</comments>
      <pubDate>Wed, 18 May 2022 22:43:32 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 19-5. CloudTrail</title>
      <link>https://developyo.tistory.com/entry/AWS-19-5-CloudTrail</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudTrail ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudTrail 은 사용자 이벤트 로깅과 비슷한 기능으로 default 로 활성화 되어있으며 무료임.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;콘솔/SDK/CLI/AWS Services 에서의 히스토리를 확인할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Provides governance, comliance and audit for your AWS Account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudTrail is enabled by default&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Get an history of events / API calls made within your AWS Account by :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Console/&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;SDK/&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;CLI/&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;AWS Services&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can put logs from CloudTrail into CloudWatch Logs or S3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A trail can be applied to All Regions (default) or a single Region&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If a resource is deleted in AWS, ingestigate CloudTrail first.&lt;/p&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;[ CloudTrail Events ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관리이벤트와 데이터 이벤트 CloudTrail Insights 이벤트 등으로 나눌 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보안/라우팅 설정 등의 AWS 계정의 리소스에 대해 수행되는 작업들, S3 object 레벨의 작업, Lambda 함수 실행 기록 등 (데이터 이벤트는 용량문제로 default 가 비활성화 상태임)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Management Events :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Operations that are performed on resources in your AWS account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Examples :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Configuring security (IAM AttachRolePolicy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Configuring rules for routing data (Amazon EC2 CreateSubnet)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Setting up logging (AWS CloudTrail CreateTrail)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- By default, trails are configured to log management events&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can separte Read Events (that don't modify resources) from Write Events (that may modify resources)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Data Events :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- By default, data events are not logged (because high volume operations)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Amazon S3 object-level activity (ex: GetObject, DeleteObject, PutObject) : can seperate Read and Write Events&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS Lambda function execution activity (that Invoke API)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. CloudTrail Insights Events :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudTrail Insights 를 활성화하여 계정의 비정상적인 활동 감지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부정확한 자원 할당/&lt;/b&gt;&lt;b&gt;서비스 사용량 초과 등&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 일반 관리 이벤트를 분석하여 기준선 생성 후 쓰기 이벤트를 지속적으로 분석하여 비정상적 패턴 감지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Enable CloudTrail Insights to detect unusual activity in your account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inaccurate resource provisioning&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hitting service limits&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bursts of AWS IAM actions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gaps in periodic maintenance activity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudTrail Insights analyzes normal management events to create a baseline&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- And then continuously analyzes write events to detect unusual patterns&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anomalies appear in the CloudTrail console&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Event is sent to Amazon S3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;An EventBridge event is generated (for automation needs)&lt;/p&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;[ CloudTrail Events Retention ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 로깅은 90일간 CloudTrail에 보관되며, 90일 이상 저장하고 싶으면 S3 에 쌓아야함. S3 쌓을 경우 Athena 를 사용하여 쿼리 할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Events are stored for 90 days CloudTrail&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- To keep events beyond this period, log them to S3 and use Athena&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>CloudTrail</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/397</guid>
      <comments>https://developyo.tistory.com/entry/AWS-19-5-CloudTrail#entry397comment</comments>
      <pubDate>Mon, 16 May 2022 23:48:08 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 19-4. AWS EventBridge</title>
      <link>https://developyo.tistory.com/entry/AWS-19-3-AWS-EventBridge</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Amazon EventBridge ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudWatch 다음에 나온 관제 기능. AWS service 를 기반한 이벤트 버스와 기타 소프트웨어 및 사용자 앱 기반 이벤트 버스 사용 가능. 타 AWS 계정에서 이벤트 버스 접근이 가능. 이벤트 버스로 보내지는 이벤트를 저장관리 할 수 있음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(관제 알림 및 메시지를 보관 하는 느낌)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EventBridge is the next evolution of CloudWatch Events&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Default Event Bus&lt;/b&gt; - generated by AWS services (CloudWatch Events)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Partner Event Bus&lt;/b&gt; - receive events from SaaS service or applications (Zendesk, DataDog, Segment, Auth0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Custom Event Buses&lt;/b&gt; - for your own applications&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Event buses can be accessed by other AWS accounts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can &lt;b&gt;archive events&lt;/b&gt; (all/filter) sent to an event bus (indefinitely or set period)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ability to &lt;b&gt;replay archived events&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Rules : how to process the events (liake CloudWatch Events)&lt;/p&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;[ Amazon EventBridge - Schema Registry ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EventBridge 의 Schema registry 를 통해 코드를 생성하여 이벤트 버스에서 데이터가 어떻게 구조화 되어있는지 확인이 가능. 버전 관리 가능. (JSON 형태)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EventBridge can analyze the events in your bus and infer the schema&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The Schema Registry allows you to generate code for your application, that will know in advance how data is structured in the event bus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Schema can be versioned&lt;/p&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;[ Amazon EventBridge - Resource-based Policy ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 AWS 계정 또는 AWS region 의 이벤트 버스 허용/거부 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Manage permissions for a specific Event Bus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Example : allow/deny events from another AWS account or AWS region&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use case : aggregate all events from your AWS Organization in a single AWS account or AWS region&lt;/p&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;[ Amazon EventBridge vs CloudWatch Events ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudWatch 확장형이 Amazon EventBridge(최근엔 CloudWatch 메뉴자체가 없어진듯. Amazon EventBridge 로 명칭자체가 바뀌어서 노출되는 듯)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공통점 : 동일한 이벤트 버스 기능(관제)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;차이점 : EventBridge는 Schema Registry 기능이 있으며, 사용자 앱 및 SaaS(소프트웨어) 용 이벤트 버스 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Amazon EventBridge builds upon and extends CloudWatch Events&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- It uses the same service API and endpoint, and the same underlying service infrastructure&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EventBridge allows extension to add event buses for your custom applications and your third-party SaaS apps&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EventBridge has the Schema Registry capability&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EventBridge has a different name to mark the new capabilities&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Over time, the CloudWatch Events name will be replaced with EventBridge&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>Amazon EventBridge</category>
      <category>CloudWatch</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/396</guid>
      <comments>https://developyo.tistory.com/entry/AWS-19-3-AWS-EventBridge#entry396comment</comments>
      <pubDate>Mon, 16 May 2022 23:08:50 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 직렬화</title>
      <link>https://developyo.tistory.com/entry/JAVA-%EC%A7%81%EB%A0%AC%ED%99%94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt;자바 직렬화&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/268&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://devlog-wjdrbs96.tistory.com/268&lt;/span&gt;&lt;/a&gt;&lt;br&gt; &lt;a href=&quot;https://findmypiece.tistory.com/m/166&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://findmypiece.tistory.com/m/166&lt;/span&gt;&lt;/a&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>back/java</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/395</guid>
      <comments>https://developyo.tistory.com/entry/JAVA-%EC%A7%81%EB%A0%AC%ED%99%94#entry395comment</comments>
      <pubDate>Fri, 15 Apr 2022 23:13:07 +0900</pubDate>
    </item>
    <item>
      <title>multi thread , sync vs async , block vs non-block</title>
      <link>https://developyo.tistory.com/entry/multi-thread-sync-vs-async-block-vs-non-block</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. sync vs async&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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. block vs non-block&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드를 호출하는 클라이언트 관점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 호출시 응답을 받을때 까지 기다린다 block&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 호출 후 다른 작업 수행이 가능, 메소드 내에서 callback 함수를 호출해주어 클라이언트에 결과 회신&lt;/p&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://brunch.co.kr/@springboot/267#comment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brunch.co.kr/@springboot/267#comment&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/@springboot/267#comment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brunch.co.kr/@springboot/267#comment&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;</description>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/394</guid>
      <comments>https://developyo.tistory.com/entry/multi-thread-sync-vs-async-block-vs-non-block#entry394comment</comments>
      <pubDate>Mon, 27 Dec 2021 15:56:33 +0900</pubDate>
    </item>
    <item>
      <title>[SVN] 로그인 정보 제거</title>
      <link>https://developyo.tistory.com/entry/SVN-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%A0%95%EB%B3%B4-%EC%A0%9C%EA%B1%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C:\Users\사용자\AppData\Roaming\Subversion\auth\svn.simple 제거&lt;br&gt; &lt;/p&gt;</description>
      <category>CI/svn</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/393</guid>
      <comments>https://developyo.tistory.com/entry/SVN-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%A0%95%EB%B3%B4-%EC%A0%9C%EA%B1%B0#entry393comment</comments>
      <pubDate>Mon, 25 Oct 2021 11:00:07 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 19-3. AWS Monitoring : CloudWatch Alarms</title>
      <link>https://developyo.tistory.com/entry/AWS-19-3-AWS-Monitoring-CloudWatch-Alarms</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS&amp;nbsp;Monitoring&amp;nbsp;:&amp;nbsp;CloudWatch&amp;nbsp;Alarms ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Alarm은 metric 값에 대한 알림을 주기위해 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Alarms are used to trigger notifications for any metric&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Various options (sampling, %, max, min, etc..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Alarms States :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) OK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) INSUFFICIENT_DATA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) ALARM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Period :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Length of time in seconds to evaludate the metric&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- High resolution custom metrics : 10 sec, 30 sec, or multiples of 60 sec&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Alarm Targets ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudWatch 가 Alarm 이 울리면(metric 값에 의해) EC2 를 Stop, Terminate, Reboot, or Recover 할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Auto Scaling 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SNS 로 알림&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Stop, Terminate, Reboot, or Recover an EC2 Instance&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Trigger Auto Scaling Action&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Send notification to SNS (from which you can do pretty much anything)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ EC2 Instance Recovery ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Status Check :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Instance status = check the EC2 VM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; System status = check the underlying hardware&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/citBVS/btrgbzt4QvD/qmTwv867iWk0fkpIWDSrrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/citBVS/btrgbzt4QvD/qmTwv867iWk0fkpIWDSrrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/citBVS/btrgbzt4QvD/qmTwv867iWk0fkpIWDSrrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcitBVS%2Fbtrgbzt4QvD%2FqmTwv867iWk0fkpIWDSrrk%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;653&quot; height=&quot;193&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Recovery : Same Private, Public, Elastic IP, metadata, placement group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Alarm : good to know ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CloudWatch Logs Metrics Filter 에 의해 알람이 생성되며 알람은 SNS 를 통해 adm에게 알림&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Alarms can be created based on CloudWatch Logs Metrics Filters&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzL7i/btrgjEUI5AA/QRFKlWALQnvoahIu5U3biK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzL7i/btrgjEUI5AA/QRFKlWALQnvoahIu5U3biK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzL7i/btrgjEUI5AA/QRFKlWALQnvoahIu5U3biK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzL7i%2FbtrgjEUI5AA%2FQRFKlWALQnvoahIu5U3biK%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;434&quot; height=&quot;157&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- To test alarms and notifications, set the alarm state to Alarm using CLI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;aws cloudwatch set-alarm-state --alarm-name &quot;myalarm&quot; --state-value ALARM --state-reason &quot;testing purposes&quot;&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;&lt;b&gt;[ CloudWatch Events ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS 서비스 관제기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EC2 인스턴스 기동 등의 AWS 서비스로부터 이벤트 인터셉트. 스케쥴링이나 크론으로 설정 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* EC2 인스턴스 실행시 관제 메시지 발생시키거나 하는 등의 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Event Pattern : Intercept events from AWS services (Sources)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example sources: EC2 Instance Start, CodeBuild Failure, S3, Trusted Advisor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can intercept any API call with CloudTrail integration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Schedule or Cron&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A JSON payload is created from the event and passed to a target&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Compute : Lambda, Batch, ECS task&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Integration : SQS, SNS, Kinesis Data Streams, Kinesis Data Firehose&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Orchestration : Step Functions, CodePipeline, CloudBuild&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Maintenance : SSM, EC2 Actions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>AWS Monitoring</category>
      <category>CloudWatch Alarms</category>
      <category>CloudWatch Events</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/392</guid>
      <comments>https://developyo.tistory.com/entry/AWS-19-3-AWS-Monitoring-CloudWatch-Alarms#entry392comment</comments>
      <pubDate>Tue, 28 Sep 2021 00:50:54 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 19-2. AWS Monitoring : CloudWatch Logs, Agent</title>
      <link>https://developyo.tistory.com/entry/AWS-19-2-AWS-Monitoring-CloudWatch-Logs</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS&amp;nbsp;Monitoring&amp;nbsp;:&amp;nbsp;CloudWatch&amp;nbsp;Logs ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Applications can send logs to CloudWatch using the SDK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudWatch can collect log from :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) Elastic Beanstalk : collection of logs from application&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) ECS : collection from containers&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) AWS Lambda : collection from function logs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4) VPC Flow Logs : VPC specific logs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5) API Gateway&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 6) CloudTrail based on filter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 7) CloudWatch log agents : for example on EC2 machines&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 8) Route53 : Log DNS queries&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudWatch Logs can go to :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) Batch exporter to S3 for archival&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) Stream to ElasticSearch cluster for further analytics&lt;/p&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;[ AWS CloudWatch Logs ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Logs storage architecture :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Log groups : arbitrary(임의의) name, usually representing an application&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Log stream : instances within application/log files/containers&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can define log expiration policies (never expire, 30 days, etc..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Using the AWS CLI we can trail CloudWatch logs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- To send logs to CloudWatch, make sure IAM permissions are correct!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Security : encryption of logs using KMS at the Group Level&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Logs Metric Filter &amp;amp; Insights ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudWatch Logs can use filter expressions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- For example, find a specific IP inside of a log&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Metric filters can be used to trigger alarms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ CloudWatch Logs Insights (new - Nov 2018) can be used to query logs and add queries to CloudWatch Dashboards&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Logs for EC2 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- By default, no logs from your EC2 machine will go to CloudWatch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You need to run a CloudWatch agent on EC2 to push the log files you want&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Make sure IAM permissions are correct&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The CloudWatch log agent can be setup on-premises too&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;426&quot; width=&quot;360&quot; height=&quot;373&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oyskL/btrga3nHIIw/DkVAOfrZcfluzNOqKwcWI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oyskL/btrga3nHIIw/DkVAOfrZcfluzNOqKwcWI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oyskL/btrga3nHIIw/DkVAOfrZcfluzNOqKwcWI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoyskL%2Fbtrga3nHIIw%2FDkVAOfrZcfluzNOqKwcWI0%2Fimg.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;426&quot; width=&quot;360&quot; height=&quot;373&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ On-premise : 자사가 보유한 서버에 서비스 구축&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ Off-premise : AWS와 같은 원격 클라우드 등에 서비스 구축&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Log Agent &amp;amp; Unified Agent ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- For virtual servers (EC2 instances, on-premise servers..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. CloudWatch Logs Agent&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Old version of the agent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Can only send to CloudWatch Logs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-2. CloudWatch Unified Agent&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Collect additional system-level metrics such as RAM, processes, etc...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Collect logs to send to CloudWatch Logs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Centralized configuration using SSM Parameter Store&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Unified Agent - Metrics ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Collected directly on your Linux server / EC2 instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) CPU (active, guest, idle, system, user, steal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Disk metrics (free, used, total), Disk IO (writes, reads, bytes, iops)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) RAM (free, inactive, used, total, cached)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Netstat (number of TCP and UDP connections, net packets, bytes)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) Processes (total, dead, bloqued, idle, running, sleep)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) Swap Sapce (free, used, used &amp;amp;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ Reminder : out-of-the box metrics for EC2 - disk, CPU, network (high level)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>AWS Monitoring</category>
      <category>CloudWatch Agent</category>
      <category>CloudWatch Logs</category>
      <category>CloudWatch Unified Agent</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/391</guid>
      <comments>https://developyo.tistory.com/entry/AWS-19-2-AWS-Monitoring-CloudWatch-Logs#entry391comment</comments>
      <pubDate>Tue, 28 Sep 2021 00:05:18 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 19. AWS Monitoring : CloudWatch</title>
      <link>https://developyo.tistory.com/entry/AWS-19-AWS-Monitoring-CloudWatch</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ AWS Monitoring : CloudWatch ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Metrics ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CloudWatch provides metrics for every services in AWS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Metric&lt;/b&gt; is a variable to monitor (CPUUtilization, NetworkIn..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Metrics belong to &lt;b&gt;namespaces&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Demension&lt;/b&gt; is an attribute of a metric (instance id, environment, etc...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Up to 10 dimensions per metric&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Metrics have &lt;b&gt;timestamps&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Can create CloudWatch dashboards of metrics&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ EC2 Detailed monitoring ]&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EC2 instance metrics have metrics &quot;every 5 minutes&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- With detailed monitoring (for a cost), you get data &quot;every 1 minute&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use detailed monitoring if you want to scale faster for your ASG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The AWS Free Tier allows us to have 10 detailed monitoring metrics&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Note : EC2 Memory usage is by default no pushed (must be pushed from inside the instance as a custom metric)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Custom Metrics ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2주 과거, 2시간 미래의 매츠릭 데이터 포인트 사용 가능 (EC2 instance 시간이 정확하게 맞춰져있어야 함)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PutMetricData API 호출을 통해 커스텀 매트릭을 CloudWatch에&amp;nbsp; 보낼 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Possibility to define and send your own custom metrics to CloudWatch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example : memory(RAM) usage, disk space, number of logged in users&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Use API call &lt;b&gt;PutMetricData&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ability to use dimensions (attributes) to segment metrics&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Instance.id&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Environment.name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Metric resolution (&lt;b&gt;StorageResolution&lt;/b&gt; API parameter - two possible value) :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Standard : 1 minute (60 seconds)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- High Resolution : 1/5/10/30 second(s) - Higher cost&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ Important&lt;/b&gt; : Accepts metric data points two weeks in the past and two hours in the future (make usre to configure your EC2 instance time correctly)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;528&quot; width=&quot;636&quot; height=&quot;427&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctMBrK/btrfU2XVAhA/Jfm1Nx2PRrkL3qnBsz8wlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctMBrK/btrfU2XVAhA/Jfm1Nx2PRrkL3qnBsz8wlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctMBrK/btrfU2XVAhA/Jfm1Nx2PRrkL3qnBsz8wlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctMBrK%2FbtrfU2XVAhA%2FJfm1Nx2PRrkL3qnBsz8wlk%2Fimg.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;528&quot; width=&quot;636&quot; height=&quot;427&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ CloudWatch Dashboards ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러개의 AWS Account 및 regions 의 그래프를 대시보드에 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Great way to setup custom dashboards for quick access to key metrics and alarms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Dashboards are global&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Dashboards can include graphs from different AWS accounts and regions ***&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can change the time zone &amp;amp; time range of the dashboards&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can setup automatic refresh (10s, 1m, 2m, 5m, 15m)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Dashboards can be shared with people who don't have an AWS account (public, email address, 3rd party SSO provider through Amazon Cognito)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pricing :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; --&amp;nbsp; 3 dashboards (up to 50 metrics) for free&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- $3 per dashboard per month afterwards&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>AWS Monitoring</category>
      <category>CloudWatch Metrics</category>
      <category>Custom Metrics</category>
      <category>EC2 monitoring</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/390</guid>
      <comments>https://developyo.tistory.com/entry/AWS-19-AWS-Monitoring-CloudWatch#entry390comment</comments>
      <pubDate>Mon, 27 Sep 2021 00:09:38 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 18-10. Databases in AWS : ElasticSearch</title>
      <link>https://developyo.tistory.com/entry/AWS-18-10-Databases-in-AWS-ElasticSearch</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Databases in AWS : ElasticSearch ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주로 다른 DB 를 보완하기위해 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필드 상관없이 조회 가능, 부분 매칭이어도 조회가 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example : In DynamoDB, you can only find by primary key or indexes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;With ElasticSearch, you can search any field, even partially matches&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- It's common to use ElasticSearch as a complement to another database&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ElasticSearch also has some usage for Big Data applications&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can provision a cluster of instances&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Built-in integrations : Amazon Kinesis Data Firehose, AWS IoT, and Amazon CloudWatch Logs for data ingestion&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Security through Cognito &amp;amp; IAM, KMS encryption, SSL &amp;amp; VPC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Comes with Kibana (visualization) &amp;amp; Logstash (log ingestion) - ELK stack&lt;/p&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;[ ElasticSearch for Solutions Architect ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Operations :&lt;/b&gt; similar to RDS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Security :&lt;/b&gt; Cognito, IAM, VPC, KMS, SSL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reliability :&lt;/b&gt; Multi-AZ, clustering&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Performance :&lt;/b&gt; based on ElasticSearch project(open source), petabyte scale&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cost :&lt;/b&gt; pay per node provisioned (similar to RDS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Remember :&lt;/b&gt; ElasticSearch = Search/Indexing&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>Databases in AWS</category>
      <category>elasticsearch</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/389</guid>
      <comments>https://developyo.tistory.com/entry/AWS-18-10-Databases-in-AWS-ElasticSearch#entry389comment</comments>
      <pubDate>Sun, 26 Sep 2021 22:24:04 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 18-9. Databases in AWS : Neptune</title>
      <link>https://developyo.tistory.com/entry/AWS-18-9-Databases-in-AWS-Neptune</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Databases&amp;nbsp;in&amp;nbsp;AWS&amp;nbsp;:&amp;nbsp;Neptune ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Fully managed graph database&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- When do we use Graphs?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- High relationship data&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Social Networking : Users friends with Users, replied to comment on post of user and likes other comments&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Knowledge graphs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Highly available across 3 AZ, with up to 15 read replicas&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Point-in-time recovery, continuous backup to Amazon S3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Support for KMS encryption at rest + HTTPS&lt;/p&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;[ Neptune for Solutions Architect ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Operations :&lt;/b&gt; similar to SDS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Security :&lt;/b&gt; IAM, VPC, KMS, SSL (similar to RDS) + IAM Authentication&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reliability :&lt;/b&gt; Multi-AZ, clustering&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Performance :&lt;/b&gt; best suited for graphs, clustering to improve performance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cost :&lt;/b&gt; pay per node provisioned (similar to RDS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ Remember : Neptune = Graphs&lt;/b&gt;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>Databases in AWS</category>
      <category>NEPTUNE</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/388</guid>
      <comments>https://developyo.tistory.com/entry/AWS-18-9-Databases-in-AWS-Neptune#entry388comment</comments>
      <pubDate>Sun, 26 Sep 2021 22:17:34 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 18-8. Databases in AWS : Glue</title>
      <link>https://developyo.tistory.com/entry/AWS-Databases-in-AWS-Glue</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Databases&amp;nbsp;in&amp;nbsp;AWS&amp;nbsp;:&amp;nbsp;Glue ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Managed extract, transform, and load (ETL) service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Useful to prepare and transform data for analytics&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Fully serverless service&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;111&quot; width=&quot;539&quot; height=&quot;104&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nlHVV/btrfVsuMcrV/GdPP2GlTp7KOFD651Oc5tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nlHVV/btrfVsuMcrV/GdPP2GlTp7KOFD651Oc5tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nlHVV/btrfVsuMcrV/GdPP2GlTp7KOFD651Oc5tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnlHVV%2FbtrfVsuMcrV%2FGdPP2GlTp7KOFD651Oc5tK%2Fimg.png&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;111&quot; width=&quot;539&quot; height=&quot;104&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Glue Data Catalog ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Glue Data Catalog : catalog of datasets&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;322&quot; width=&quot;643&quot; height=&quot;264&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cggujc/btrf3xO6FO8/QiPUfZY5ExmzIHRpeTMuDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cggujc/btrf3xO6FO8/QiPUfZY5ExmzIHRpeTMuDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cggujc/btrf3xO6FO8/QiPUfZY5ExmzIHRpeTMuDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcggujc%2Fbtrf3xO6FO8%2FQiPUfZY5ExmzIHRpeTMuDk%2Fimg.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;322&quot; width=&quot;643&quot; height=&quot;264&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>Databases in AWS</category>
      <category>Glue</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/387</guid>
      <comments>https://developyo.tistory.com/entry/AWS-Databases-in-AWS-Glue#entry387comment</comments>
      <pubDate>Sun, 26 Sep 2021 22:13:38 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 18-7. Databases in AWS : Redshift</title>
      <link>https://developyo.tistory.com/entry/AWS-18-7-Databases-in-AWS-Redshift</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Databases in AWS : Redshift ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PostgreSQL 기반이지만 OLTP(트랜잭션 프로세싱) 지원하지않음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로우기반이아닌 칼럼기반 데이터 저장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MPP(대규모 병렬 쿼리)를 사용하여 다른 데이터베이스에 비해 월등히 뛰어난 성능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS Quicksight/Tableau 등의&amp;nbsp;BI(Business Intelligence) 툴 제공&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Redshift is based on PostgreSQL, but it's not used for OLTP(Online Transaction Processing)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- It's OLAP(Online Analytical Processing) - online analytical processing (analytics and data warehousing)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 10x better performance than other data warehouses, scale to PBs of data&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Columnar storage of data&lt;/b&gt; (instead of row based)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Massively Parallel Query Execution (MPP)&lt;/b&gt; -&amp;gt; reason why it is such high performance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pay as you go based on the instances provisioned&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Has a SQL interface for performing the queries&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BI(Business Intelligence tools such as AWS Quicksight or Tableau integrate with it&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Data is loaded from S3, DynamoDB, DMS, other DBs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- From 1 node to 128 nodes, upto 128TB of space per node&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-- Leader node : for query planning, results aggregation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-- Compute node : for performing the queries, send results to leader&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Redshift Spectrum : perform queries directly against S3 (no deed to load)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Backup &amp;amp; Restore, Security VPC / IAM / KMS, Monitoring&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Redshift Enhanced VPC Routing : COPY / UNLOAD goes through VPC&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Redshift - Snapshots &amp;amp; DR ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Redshift has no &quot;Multi-AZ&quot; mode&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Snapshots are point-in-time backups of a clust, stored internally in S3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Snapshots are incremental (only what has changed is saved)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can restore a snapshot into a new cluster&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Automated : every 8 hours, every 5 GB, or on a schedule, Set retention&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -- Manual : snapshot is retained until you delete it&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- You can figure Amazon Redshift to automatically copy snapshots (automated or manual) of a cluster to another AWS Region&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DR(Disaster Recovery) plan : 스냅샷 자동생성 활성화, Redshift cluster 가 자동으로 스냅샷을 다른 AWS Region에 카피하도록 설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;538&quot; width=&quot;280&quot; height=&quot;319&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyAteS/btrfZpqddcO/RwMPMY4vVnkzi05ktQwUI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyAteS/btrfZpqddcO/RwMPMY4vVnkzi05ktQwUI0/img.png&quot; data-alt=&quot;the way of copy snapshots of cluster to another AWS Region&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyAteS/btrfZpqddcO/RwMPMY4vVnkzi05ktQwUI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyAteS%2FbtrfZpqddcO%2FRwMPMY4vVnkzi05ktQwUI0%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;538&quot; width=&quot;280&quot; height=&quot;319&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;the way of copy snapshots of cluster to another AWS Region&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Loading data into Redshift ]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;475&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN7gpl/btrf1hFs1nY/uC9k3SdP5G9rX0KqegKqv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN7gpl/btrf1hFs1nY/uC9k3SdP5G9rX0KqegKqv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN7gpl/btrf1hFs1nY/uC9k3SdP5G9rX0KqegKqv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN7gpl%2Fbtrf1hFs1nY%2FuC9k3SdP5G9rX0KqegKqv1%2Fimg.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;475&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Redshift Spectrum ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;S3 의 데이터를 Redshift 테이블에 직접 넣지 않고(로딩하지 않고) 쿼리의 실행이 가능하도록 하는 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Redshift cluster 가 활성화 되어있어야 사용가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Query data that is already in S3 without loading it&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Must have a Redshift cluster available to start the query&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The query is then submitted to thousands of Redshift Spectrum nodes&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;657&quot; width=&quot;474&quot; height=&quot;421&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EhE5n/btrfUQJmjpv/lPsXI5CFo1Sx7wJnpKatp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EhE5n/btrfUQJmjpv/lPsXI5CFo1Sx7wJnpKatp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EhE5n/btrfUQJmjpv/lPsXI5CFo1Sx7wJnpKatp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEhE5n%2FbtrfUQJmjpv%2FlPsXI5CFo1Sx7wJnpKatp1%2Fimg.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;657&quot; width=&quot;474&quot; height=&quot;421&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Redshift for Solutions Architect ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Operations&lt;/b&gt; : like RDS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Security :&lt;/b&gt; IAM, VPC, KMS, SSL (like RDS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reliability :&lt;/b&gt; auto healing features, cross-region snapshot copy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Performance :&lt;/b&gt; 10x performance vs other data warehousing, compression&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cost :&lt;/b&gt; pay per node provisioned, 1/10th of the cost vs other warehouses&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vs Athena :&lt;/b&gt; faster queries / joins / aggregations thanks to indexes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※&amp;nbsp;Redshift = Analytics / BI / Data Warehouse&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>AWS</category>
      <category>Databases in AWS</category>
      <category>Redshift</category>
      <category>Redshift Spectrum</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/386</guid>
      <comments>https://developyo.tistory.com/entry/AWS-18-7-Databases-in-AWS-Redshift#entry386comment</comments>
      <pubDate>Sat, 25 Sep 2021 22:35:36 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 18-6. Databases in AWS : Athena</title>
      <link>https://developyo.tistory.com/entry/AWS-18-6-Databases-in-AWS-Athena</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Athena Overview ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Database 는 아니지만 S3위에 query 엔진을 제공&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Fully Serverless database with SQL capabilities&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Used to query data in S3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pay per query&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output results back to S3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Secured through IAM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※&amp;nbsp;Use Case : one time SQL queries, serverless queries on S3, log analytics&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Athena for Solutions Architect ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Operations :&lt;/b&gt; no operations needed, serverless&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Security :&lt;/b&gt; IAM + S3 security&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reliability :&lt;/b&gt; managed service, uses Presto engine, highly available&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Performance :&lt;/b&gt; queries scale based on data size&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cost :&lt;/b&gt; pay per query / per TB of data scanned, serverless&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>infra &amp;amp; cloud/AWS</category>
      <category>Athena</category>
      <category>AWS</category>
      <category>Databases in AWS</category>
      <author>펭귄대장</author>
      <guid isPermaLink="true">https://developyo.tistory.com/385</guid>
      <comments>https://developyo.tistory.com/entry/AWS-18-6-Databases-in-AWS-Athena#entry385comment</comments>
      <pubDate>Sat, 25 Sep 2021 21:54:51 +0900</pubDate>
    </item>
  </channel>
</rss>