<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>[DEV] J-Jay</title>
    <link>https://dev-junick.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 21 Aug 2026 16:07:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>J-Jay</managingEditor>
    <image>
      <title>[DEV] J-Jay</title>
      <url>https://tistory1.daumcdn.net/tistory/5724566/attach/527a6bc83637442390c8248e784faa02</url>
      <link>https://dev-junick.tistory.com</link>
    </image>
    <item>
      <title>예외(Exception)</title>
      <link>https://dev-junick.tistory.com/77</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예외(Exception)&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: justify;&quot;&gt;프로그램 실행시, 어떤 원인으로 인해 비정상적인 동작을 일으키며 프로그램이 종료되는 상황이 일어 났을때&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;대부분 사람들은 프로그램이 오류가 발생했다고 생각한다. &lt;s&gt;(어떤 오류인지는 관심 없다)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 나는 개발자니까 개발자 기준에서,&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;오류는 크게 두가지 종류가 있다. 컴파일 할 때 발생할 수 있는 &lt;b&gt;컴파일 에러&lt;/b&gt;, 실행 중 발생되는 &lt;b&gt;런타임 에러&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;컴파일 에러는 우리가 잡기가 쉽지만&lt;s&gt;(코딩할떄 나오니까)&lt;/s&gt; 런타임 오류는 실행 중에 발생하기에 잡기가 어렵다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 여기선 런타임 에러에 대해서 깊게 살펴보겠다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;런타임 에러&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서 런타임 오류는 두종류로 보고있다. &lt;b&gt;에러(Error)&lt;/b&gt;와 &lt;b&gt;예외(Exception)&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;b&gt;복구될 수 없는 오류&lt;/b&gt;를 의미하고, 예외는 프로그래머가 &lt;b&gt;직접 예측하여 막을 수 있는 처리가능한 오류&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예외 처리&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외처리란 말 그대로 예외가 발생했을때 어떤 동작을 처리해야하는지를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외처리의 종류는 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;try ~ catch ~ finally&lt;br /&gt;예외가 발생했을때 위의 키워드로 예외 처리를 할 수 있다.&lt;br /&gt;여기서 중요한 점은 모든 예외는 &lt;b&gt;Exception 클래스를 상속&amp;nbsp;&lt;/b&gt;받는다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/syqwd/btsHJVDJ8fh/wG0BMjaHaZC12zc7StUxVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/syqwd/btsHJVDJ8fh/wG0BMjaHaZC12zc7StUxVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/syqwd/btsHJVDJ8fh/wG0BMjaHaZC12zc7StUxVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsyqwd%2FbtsHJVDJ8fh%2FwG0BMjaHaZC12zc7StUxVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;594&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;throws&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외처리는 위와 같이 try ~ catch문으로 처리할 수도 있지만 아래처럼 예외 처리를 다른 곳으로 넘길 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1717246511372&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void divide(int a,int b) throws ArithmeticException {
	if(b==0) throw new ArithmeticException(&quot;몫이 0이면 안됩니다.&quot;);
	int c=a/b;
	System.out.println(c);
}

public static void main(String[] args){
	int a=10;
	int b=0;
		
	divide(a,b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-end/Java</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/77</guid>
      <comments>https://dev-junick.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 1 Jun 2024 21:55:47 +0900</pubDate>
    </item>
    <item>
      <title>내부 클래스(Inner Class)</title>
      <link>https://dev-junick.tistory.com/76</link>
      <description>&lt;h2 id=&quot;내부_클래스_inner_class&quot; style=&quot;background-color: #ffffff; color: #262d40; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;내부 클래스 (Inner Class)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 클래스(inner class)란 하나의 &lt;u&gt;&lt;b&gt;클래스 내부에 선언된 또 다른 클래스&lt;/b&gt;&lt;/u&gt;를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 사용자 클래스 자료형이 필요하면, 메인 클래스 외부에 선언하거나, 따로 독립적인 클래스 파일을 만들어 불러와 사용해 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 클래스는&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;내부에 정의된다는 점을 제외하고는 일반적인 클래스와 다르지 않다. &lt;/b&gt;우리가 어느 클래스에 변수나 상수가 필요하다면 클래스 멤버로서 클래스 내에서 선언하여 사용해 왔듯이, 선언 주체를 변수에서 클래스로 바꾼다면 그것이 내부 클래스인 것이다. 이처럼 내부 클래스는 &lt;b&gt;보통 두 클래스가 서로 긴밀한 관계&lt;/b&gt;가 있거나, &lt;b&gt;하나의 클래스또는 메소드에서만 사용되는 클래스&lt;/b&gt;일 때 이용되는 기법이라고 보면 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;※ 내부(inner) 클래스는 중첩(nested) 클래스로 분류되기도 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;내부_클래스의_장점&quot; style=&quot;background-color: #ffffff; color: #262d40; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;내부 클래스의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;1._클래스를_논리적으로_그룹화&quot;&gt;클래스를 논리적으로 그룹화&lt;br /&gt;클래스가 여러 클래스와 관계를 맺지 않고 &lt;b&gt;하나의 특정 클래스와만 관계&lt;/b&gt;를 맺는다면, 외부에 클래스를 새로 작성하는 것이 아닌 내부 클래스로 작성할 수 있다.또한 내부 클래스로 인해 새로운 클래스를 생성하지 않아도 되므로&amp;nbsp;&lt;b&gt;패키지를 간소화&lt;/b&gt;할 수 있다.평소대로라면 아래처럼 외부 혹은 다른 파일로 클래스를 선언해놓고, 인스턴스화 하여 사용해왔을 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;더욱 타이트한 캡슐화의 적용&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;내부 클래스에&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; private &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;제어자를 적용해줌으로써, 캡슐화를 통해 클래스를 내부로 숨길 수 있다.&lt;br /&gt;&lt;/span&gt;즉, 캡슐화를 통해 외부에서의 접근을 차단하면서도, 내부 클래스에서 외부 클래스의 멤버들을 제약 없이 쉽게 접근할 수 있어 구조적인 프로그래밍이 가능해 진다. 그리고 클래스 구조를 숨김으로써 코드의 복잡성도 줄일 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;내부_클래스_종류&quot; style=&quot;background-color: #ffffff; color: #262d40; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;내부 클래스 종류&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스 클래스&lt;/li&gt;
&lt;li&gt;스태틱 클래스&lt;/li&gt;
&lt;li&gt;지역 클래스&lt;/li&gt;
&lt;li&gt;익명 클래&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Back-end/Java</category>
      <category>내부클래스</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/76</guid>
      <comments>https://dev-junick.tistory.com/76#entry76comment</comments>
      <pubDate>Sat, 1 Jun 2024 21:22:43 +0900</pubDate>
    </item>
    <item>
      <title>다형성(Polymorphism)</title>
      <link>https://dev-junick.tistory.com/75</link>
      <description>&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;프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다. (by.위키피디아)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다형성 예시&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;UserRepository&lt;/b&gt;라는 사용자의 데이터에 대한 인터페이스가 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것의 DB를 초기에는 MySQL로 구현했다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;근데 배포하기 하루전 DB를 Oracle로 바꾸는 일이 생겼다고 할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;s&gt;처음부터 다시 개발하지 뭐...&lt;/s&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런상황에서 사용할 수 있는게 다형성이다.&lt;/p&gt;
&lt;pre id=&quot;code_1716104790491&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface UserRepository {
	public createUser()
    public updateUser()
    public deleteUser()
    public getUser()
}&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;MySql&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716104801775&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class UserRepositoryMySQL implements UserRepository {
	@Override
    createUser() { ... }
    
    ...
    
    @Override
    getUser() { ... }
}&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;Oracle&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716104824368&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class UserRepositoryOracle implements UserRepository {
	@Override
    createUser() { ... }
    
    ...
    
    @Override
    getUser() { ... }
}&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;즉, 위와 같이 하나의 개념(UserRepository 를 DB로 저장)을 서로 다른 N개(MySql로 저장, Oracle 저장)의 개념으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만드는 것을 을 다형성이라고 한다.&lt;/p&gt;</description>
      <category>Back-end/Java</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/75</guid>
      <comments>https://dev-junick.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 19 May 2024 16:48:14 +0900</pubDate>
    </item>
    <item>
      <title>상속(Inheritance)</title>
      <link>https://dev-junick.tistory.com/74</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상속(Inheritance)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속은 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모와 자식으로 생각하면, 자식은 부모의 유전자를 물려받듯, 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만, 모든 멤버를 상속받더라도 항상 직접적으로 접근할 수 있는 것은 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상위 클래스의 필드나 메서드의 접근 제한자가 private이면, 같은 패키지일 지라도 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상위 클래스의 필드나 메서드의 접근 제한자가 default이면, 상위 클래스와 하위 클래스가 다른 패키지일 때 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 경우, getter와 setter를 이용해 간접적으로 접근해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서의 상속은 상위 클래스는 여러 하위 클래스를 가질 수 있지만, 하위 클래스는 여러 상위 클래스를 가질 수 없다. 즉, 단일 상속만을 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속을 받기 위해서는 extends 키워드를 사용한다.&lt;/p&gt;
&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. Single : A &amp;larr; B 상속&lt;/p&gt;
&lt;pre class=&quot;scala&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Parents {
}

class Child extends Parents {
}&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. Multilevel : A &amp;larr; B &amp;larr; C, &amp;hellip; 형태의 상속&lt;/p&gt;
&lt;pre class=&quot;scala&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Grandparents {
}

class Parents extends Grandparents {
}

class Child extends Parents {
}&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.&amp;nbsp;Hierarchical : A &amp;larr; B, A &amp;larr; C, &amp;hellip; 형태의 상속&lt;/p&gt;
&lt;pre class=&quot;scala&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Parents {
}

class Child1 extends Parents {
}

class Child2 extends Parents {
}&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;만약, Child 클래스가 Parents 클래스로부터 상속을 받았다면, Child는 다른 상위 클래스에게 중복하여 상속받을 수는 없다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Person {
    String name;
    int age;

    void learn() {
        System.out.println(&quot;공부하기&quot;);
    }

    void walk() {
        System.out.println(&quot;걷기&quot;);
    }

    void eat() {
        System.out.println(&quot;식사하기&quot;);
    }
}

class Programmer extends Person {
    void coding() {
    	System.out.println(&quot;코딩하기&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Person 클래스를 생성하여 사람의 공통적으로 가질 수 있는 속성과 행위를 정의한 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Programmer라는 직업을 가진 사람이 Person 클래스로부터 상속받아 coding 메서드를 추가로 정의했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 실행하면 다음과 같이 programmer라는 객체를 Programmer 클래스에서 생성하고, Person 클래스의 속성과 행위를 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 추가적으로 작성한 coding() 메서드를 통해 Person보다 확장된 기능을 실행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class PersonEx {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = &quot;홍길동&quot;;
        p.age = 20;

        System.out.println(&quot;이름: &quot; + p.name);
        System.out.println(&quot;나이: &quot; + p.age);
        p.eat();
        p.learn();
        p.walk();

        Programmer programmer = new Programmer();
        programmer.name = &quot;머스크&quot;;
        programmer.age = 25;

        System.out.println(&quot;이름: &quot; + programmer.name);
        System.out.println(&quot;나이: &quot; + programmer.age);
        programmer.eat();
        programmer.learn();
        programmer.walk();
        programmer.coding();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;포함 관계 (Composite)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 포함(Composite)은 상속과 비슷하게 클래스를 재사용할 수 있는 방법이다. 클래스의 멤버로 다른 클래스 타입의 참조 변수를 선언하는 것이다. 즉, 클래스의 속성 값에 다른 클래스를 선언하여 사용하는 것이다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// Address 클래스를 속성으로 가지고 사용하고 있다.
public class CompositeEx {
    int number;
    Address address;

    public CompositeEx(int number, Address address){
        this.number = number;
        this.address = address;
    }

    void printInfo() {
        System.out.println(number + &quot;: &quot; + address.city + &quot;, &quot; + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address(&quot;서울&quot;, &quot;대한민국&quot;);
        Address address2 = new Address(&quot;부산&quot;, &quot;대한민국&quot;);

        CompositeEx result1 = new CompositeEx(1, address1);
        CompositeEx result2 = new CompositeEx(2, address2);

        result1.printInfo();
        result2.printInfo();
    }
}

    class Address {
        String city;
        String country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Back-end/Java</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/74</guid>
      <comments>https://dev-junick.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 19 May 2024 16:38:36 +0900</pubDate>
    </item>
    <item>
      <title>IPC(Inter Process Commuication) - 4</title>
      <link>https://dev-junick.tistory.com/73</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzIKro/btsG3PoO8MM/oIORyTmCkG6ha4CKtdZRKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzIKro/btsG3PoO8MM/oIORyTmCkG6ha4CKtdZRKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzIKro/btsG3PoO8MM/oIORyTmCkG6ha4CKtdZRKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzIKro%2FbtsG3PoO8MM%2FoIORyTmCkG6ha4CKtdZRKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;290&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt; IPC(Inter Process Commuication) Async(비동기) 패턴의 한계&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 특정 상황들에서는 필연적으로 2번이상 데이터를 받을 가능성이 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&amp;nbsp;Async(비동기) 통신을 활용해서 중요한 비즈니스를 하기는 어려울까?&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q. Async에서는 2번이상 수신되는 것을 해결하고 싶으며, Sync에서의 장점으로 설명되었던 중요한 비즈니스에서도 리소스 활용을 최적화 해서 사용하고 싶다면 어떤 방법이 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A. 멱등성(Idemptotent)이 필요한 상황을 식별한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;멱등성(Idemptotent) 이란?&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 특정 호출이 1번 혹은 여러번 호출되더라도 서버의 상태는 1번 호출된 것과 동일해야 한다는 특성이다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 일반적으로 Update, Delete 요청은 멱등성을 가지며, Create 요청은 멱등석을 가지지 않는다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt; Async(비동기) 통신에서의 멱등성&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Async 통신은 기본적으로 멱등성이 보장되지 않는 통신 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 멱등성을 구현하기 위해서는 &quot;무언가&quot; 가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 멱등성 구현을 위한 &lt;b&gt;DB Table(RDB)&lt;/b&gt;를 사용해서 멱등성을 구현&lt;br /&gt;2. 여러 메시징 오픈소스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IPC(Inter Process Commuication) 는 다수의 Process 이다.&lt;/li&gt;
&lt;li&gt;일반적으로 Process는 서비스간의 통신이다.&lt;/li&gt;
&lt;li&gt;IPC의 방식에는 크게 Sync(Http, gRPC), Async(Message Queuing)방식이 존재한다.&lt;/li&gt;
&lt;li&gt;Async 통신에는 위와 같은 한계를 해결하기 위해 멱등성을 식별해야 하고,&lt;br /&gt;최근의 메시징 시스템은 멱등성 기능을 내제하는 Exactly Once 기능을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-end/MSA</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/73</guid>
      <comments>https://dev-junick.tistory.com/73#entry73comment</comments>
      <pubDate>Mon, 29 Apr 2024 22:54:30 +0900</pubDate>
    </item>
    <item>
      <title>IPC(Inter Process Commuication) - 3</title>
      <link>https://dev-junick.tistory.com/72</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U3M5R/btsG3sHnygb/2sFuA9Bsc6DJiKASguLnS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U3M5R/btsG3sHnygb/2sFuA9Bsc6DJiKASguLnS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U3M5R/btsG3sHnygb/2sFuA9Bsc6DJiKASguLnS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU3M5R%2FbtsG3sHnygb%2F2sFuA9Bsc6DJiKASguLnS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;290&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt; IPC(Inter Process Commuication) Async(비동기) 패턴 &lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Queue를 활용하여 Produce, Consume 방식으로 데이터 통신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MQTT (Message Queuing Templemetry Transport)&amp;nbsp; - Spec &amp;darr; 기능&amp;darr; 쓰지 않음&lt;/b&gt;&lt;br /&gt;- 경량 메시징 프로톸로로서, IoT 경량화가 최대 목적인 프로토콜&lt;br /&gt;- Publish, Subscribe, Topic 사용&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AMQP (Advanced Message Queuing Protocol)&lt;/b&gt;&lt;br /&gt;- 엔터프라이즈 레벨의 메시징 시스템을 위한 프로토콜&lt;br /&gt;- MQTT 개념 외에도, Exchange, Binding 등 개념 추가&lt;br /&gt;- Rabbit MQ, Active MQ...&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk790q/btsG3rIt6Xw/gHB8jSH3wBD87e96svLop1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk790q/btsG3rIt6Xw/gHB8jSH3wBD87e96svLop1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk790q/btsG3rIt6Xw/gHB8jSH3wBD87e96svLop1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk790q%2FbtsG3rIt6Xw%2FgHB8jSH3wBD87e96svLop1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1107&quot; height=&quot;598&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Publisher(발행자)는 Exchange(Routing 역할)만 바라본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exchange는 Queue를 통해 Consumer를 통해 Subscribe or Request to Message Sending 방식으로 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kafka&lt;br /&gt;- 링크드인에서 개발한 대용량의 데이터 스트림을 처리하기 위한 분산 스트리밍 플랫폼&lt;br /&gt;- MQTT, AMQP 등의 표준을 구현하는 프로토콜이 아닌, 독립적인 데이터 스트리핑 플랫폼&lt;br /&gt;- 비교적 복잡한 개념들을 가지고 있지만, 성능(=메시지 처리량) &amp;uarr;&lt;br /&gt;- 고성능, 고용량 메시지 처리 설계&lt;br /&gt;- JVM과의 좋은 궁합으로 폭넓게 사용&lt;br /&gt;- 러닝커브 &amp;uarr;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XdHCY/btsG0shwgVw/BKfPQh6kwQLWPPKkt4p8O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XdHCY/btsG0shwgVw/BKfPQh6kwQLWPPKkt4p8O1/img.png&quot; data-alt=&quot;Kafka 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XdHCY/btsG0shwgVw/BKfPQh6kwQLWPPKkt4p8O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXdHCY%2FbtsG0shwgVw%2FBKfPQh6kwQLWPPKkt4p8O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;662&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kafka 아키텍처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Topic : Producer, Consumer의 메시징 객체 (~ 에 보내, ~로 부터 받아)&lt;br /&gt;Partition : Topic을 물리적으로 분할 및 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Broker: Kafka 클러스터의 각 노드를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Zookeeper : Kafka 클러스터의 메타데이터 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-end/MSA</category>
      <category>AMQP</category>
      <category>IPC</category>
      <category>KAFKA</category>
      <category>MQTT</category>
      <category>MSA</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/72</guid>
      <comments>https://dev-junick.tistory.com/72#entry72comment</comments>
      <pubDate>Mon, 29 Apr 2024 22:34:40 +0900</pubDate>
    </item>
    <item>
      <title>IPC(Inter Process Commuication) - 2</title>
      <link>https://dev-junick.tistory.com/71</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clUDD5/btsGYNTjMJX/kpNwbMVUahMmuqyKtfuANK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clUDD5/btsGYNTjMJX/kpNwbMVUahMmuqyKtfuANK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clUDD5/btsGYNTjMJX/kpNwbMVUahMmuqyKtfuANK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclUDD5%2FbtsGYNTjMJX%2FkpNwbMVUahMmuqyKtfuANK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;290&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;IPC(Inter Process Commuication) Sync(동기) 패턴&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP&lt;br /&gt;OSI 7 응용 계층의 통신 프로토콜로서, L4 계층에서는 TCP 방식을 활용하는 프로토콜&lt;br /&gt;여러가지 종류의 메서드가 존재하지만 일반적으로 4개의 메서드를 활용한다. (GET, POST, PUT, DELETE)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;gRPC (google Remote Procedure Call)&lt;br /&gt;Protocol Buffer 라는 것을 기반으로 하는 원격 프로시저 호출 프로엠워크&lt;br /&gt;일반적으로 Server to Server Call 경우에 한해 사용&lt;br /&gt;빠르지만, 번거로운 작업과 위험이 수반 (ex stub파일 생성, type을 하나만 잘못 넣어도 전체 error)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Back-end/MSA</category>
      <category>grpc</category>
      <category>http</category>
      <category>IPC</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/71</guid>
      <comments>https://dev-junick.tistory.com/71#entry71comment</comments>
      <pubDate>Fri, 26 Apr 2024 21:59:47 +0900</pubDate>
    </item>
    <item>
      <title>IPC(Inter Process Commuication)</title>
      <link>https://dev-junick.tistory.com/70</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z4xAE/btsGY5e0w6M/7ohAcugb49w5CDA4SlFDt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z4xAE/btsGY5e0w6M/7ohAcugb49w5CDA4SlFDt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z4xAE/btsGY5e0w6M/7ohAcugb49w5CDA4SlFDt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz4xAE%2FbtsGY5e0w6M%2F7ohAcugb49w5CDA4SlFDt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;290&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;IPC(Inter Process Commuication) 전 사전 지식&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 간 통신 &amp;rarr; 서비스 간 통신 &amp;rarr; MSA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPC를 이용하기 위해서는 Network 통신이 어떻게 이루어지는지 이해가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; OSI 7 계층(Open Systems Interconnection), TCP/IP 모델&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QUfvQ/btsGZxB04dY/Q8nVuJpVu0iKG1JeI19UkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QUfvQ/btsGZxB04dY/Q8nVuJpVu0iKG1JeI19UkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QUfvQ/btsGZxB04dY/Q8nVuJpVu0iKG1JeI19UkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQUfvQ%2FbtsGZxB04dY%2FQ8nVuJpVu0iKG1JeI19UkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;571&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;OSI 7계층(Open Systems Interconnection), TCP/IP 모델&lt;/span&gt; 들은 한 곳에서 다른 곳으로 통신이 어떻게 되는지&lt;br /&gt;설명하는 모델이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리적으로 이해 &amp;rarr; TCP/IP (4 계층) 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 표준 &amp;rarr; OSI 7계층 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;IPC(Inter Process Commuication) 방식&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 IPC 는 크게 2가지로 나눌 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sync(동기) 방식 (Restful, Http, gRPC)&lt;br /&gt;&amp;rarr; &amp;nbsp;적절&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. 굉장히 중요한 작업&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. 비교적 빠른 작업에 대한 요청&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. 선행작업이 필수적인 비즈니스&lt;br /&gt;&lt;br /&gt;&amp;rarr;&amp;nbsp; 부적절&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. 매우 복잡하고 리소스 소모가 많은 작업의 요청&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. 비교적 한정된 컴퓨팅 리소스를 가지고 있는 경우&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;/li&gt;
&lt;li&gt;Async(비동기) 방식 (rabbitmq, kafka, pusbsub)&lt;br /&gt;&amp;rarr; &amp;nbsp;적절&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. 매우 복잡하고 리소스 소모가 많은 작업의 요청 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. 비교적 한정된 컴퓨팅 리소스를 가지고 있는 경우&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. 서버 리소스로 인해 누락이 생기면 안되는 경우&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;4. 독립적으로 실행되는 수 많은 서비스들이 있는 대용량 MSA환경 &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;rarr;&amp;nbsp; 부적절&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. 굉장히 중요한 작업&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. 비교적 빠른 작업에 대한 요청&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. 선행작업이 필수적인 비즈니스&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Back-end/MSA</category>
      <category>async</category>
      <category>IPC</category>
      <category>MSA</category>
      <category>Network</category>
      <category>Sync</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/70</guid>
      <comments>https://dev-junick.tistory.com/70#entry70comment</comments>
      <pubDate>Fri, 26 Apr 2024 21:43:47 +0900</pubDate>
    </item>
    <item>
      <title>MSA 분해로 인해 생긴 문제 해결 방법</title>
      <link>https://dev-junick.tistory.com/69</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUYqP0/btsGVS72H3K/KUwvtBziDgRpvPH9NyaMM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUYqP0/btsGVS72H3K/KUwvtBziDgRpvPH9NyaMM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUYqP0/btsGVS72H3K/KUwvtBziDgRpvPH9NyaMM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUYqP0%2FbtsGVS72H3K%2FKUwvtBziDgRpvPH9NyaMM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;290&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&quot;분해&quot; 로 인해 생기는 문제 해결 방법&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제1: 수 많은 서버와 수 많은 서비스들은 어떻게 배포하고 관리 할 것인가?&lt;/li&gt;
&lt;li&gt;해결1: Container로 관리 &amp;rarr; Docekr&lt;/li&gt;
&lt;li&gt;문제2: 그럼 많은 컨테이너는 또 어떻게 관리할 것인가?&lt;/li&gt;
&lt;li&gt;해결2: Container Ochestration로 관리 &amp;rarr; K8S, docker-compose(경량)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;문제3: MSA환경에서의 모니터링(로깅, 메트릭, 트레이싱, 서비스 메시)은 어떻게 할 것인가?&lt;/li&gt;
&lt;li&gt;해결3(로깅)&lt;br /&gt;- 수많은 서버(IDC, CLoud 내의 수많은 서비스들의 로그들을 적절히 필터링 하여 누락없이 로그 저장소까지 전송&lt;br /&gt;- 수 많은 로그들을 적절히 인덱싱 하여, 필요 시 빠르게 다양한 조건으로 검색&lt;br /&gt;&amp;rarr; EFK, ELK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uP6bp/btsGVUkukk6/HfiK1Cc4OtiNlBGpLDajok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uP6bp/btsGVUkukk6/HfiK1Cc4OtiNlBGpLDajok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uP6bp/btsGVUkukk6/HfiK1Cc4OtiNlBGpLDajok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuP6bp%2FbtsGVUkukk6%2FHfiK1Cc4OtiNlBGpLDajok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;310&quot; height=&quot;286&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결3(메트릭, 얼럿)&lt;br /&gt;- 수 많은 서버(IDC, Cloud) 내의, 수많은 서비스의 메트릭들을 안정적으로 수집하고, 시계열 방식으로 저장 필요&lt;br /&gt;- 다양한 오픈 소스의 메트릭을 지우너하는 대시보드를 사용&lt;br /&gt;- 원하는 복잡한 비즈니스 메트릭을 작성하고, 이를 기반으로 적절하게 Alert 조건을 설정&lt;br /&gt;&amp;rarr; InfluxDB, Prometheus(시계열 DB) / Grafana(visualize 예쁘게)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8omLz/btsGVAfteUr/EDPkaKjbAgOZGOWDQK2zI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8omLz/btsGVAfteUr/EDPkaKjbAgOZGOWDQK2zI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8omLz/btsGVAfteUr/EDPkaKjbAgOZGOWDQK2zI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8omLz%2FbtsGVAfteUr%2FEDPkaKjbAgOZGOWDQK2zI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;232&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결3(트레이싱)&lt;br /&gt;- 하나의 소스(트랜잭션)에 대해서, 여러개의 서비스에서 어떤 과정들을 거쳐 수행되었는지 확인&lt;br /&gt;- 적절한 샘플링과 보기 좋은 UI 제공이 필요&lt;br /&gt;&amp;rarr; Jaeger(go 언어로 만듦), Zipkin, Tempo(Grafana에서 나옴)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc5BtF/btsGVdrqT0T/JojEkfX5lksjdqp1cKO410/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc5BtF/btsGVdrqT0T/JojEkfX5lksjdqp1cKO410/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc5BtF/btsGVdrqT0T/JojEkfX5lksjdqp1cKO410/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc5BtF%2FbtsGVdrqT0T%2FJojEkfX5lksjdqp1cKO410%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;252&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba4EaS/btsGVKbhPt5/2U5faesbvJm6YUPi4hNQKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba4EaS/btsGVKbhPt5/2U5faesbvJm6YUPi4hNQKK/img.png&quot; data-alt=&quot;Jaeger 트레이싱 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba4EaS/btsGVKbhPt5/2U5faesbvJm6YUPi4hNQKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba4EaS%2FbtsGVKbhPt5%2F2U5faesbvJm6YUPi4hNQKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1040&quot; height=&quot;563&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Jaeger 트레이싱 아키텍처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결3(서비스 메시)&lt;br /&gt;- 어느 서비스가 어느 서비스를 호출하고 있는지, 어디로 트래픽이 어느 정도로 발생하고 있는지 모니터링 필요&lt;br /&gt;- 수많은 서비스들이잘 호출되어 있는지 어떻게 하면 서비스들이 호출된것을 편하게 볼 수 있는지가 목적&lt;br /&gt;&amp;rarr; kiali&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qN9zb/btsGXjDKXVV/OCbOVDweKsex1jhWzN1rZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qN9zb/btsGXjDKXVV/OCbOVDweKsex1jhWzN1rZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qN9zb/btsGXjDKXVV/OCbOVDweKsex1jhWzN1rZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqN9zb%2FbtsGXjDKXVV%2FOCbOVDweKsex1jhWzN1rZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;200&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Back-end/MSA</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/69</guid>
      <comments>https://dev-junick.tistory.com/69#entry69comment</comments>
      <pubDate>Thu, 25 Apr 2024 23:10:10 +0900</pubDate>
    </item>
    <item>
      <title>MSA 분해로 생긴 문제들</title>
      <link>https://dev-junick.tistory.com/68</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBmy4/btsGWttp9zc/W7Ca2ilyYweozwTJzAPLRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBmy4/btsGWttp9zc/W7Ca2ilyYweozwTJzAPLRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBmy4/btsGWttp9zc/W7Ca2ilyYweozwTJzAPLRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBmy4%2FbtsGWttp9zc%2FW7Ca2ilyYweozwTJzAPLRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;290&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;1. 모듈간 통신 &amp;rarr; 서비스(프로세스) 간 통신 (개발자 입장)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Method(Function) Call을 해서 &amp;rarr; Network(http, grpc, ... ) 통신을 한다는 과정이라고 했을때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 상황에서는 모놀리식이든, MSA든 전혀 차이가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만! 항상 &lt;b&gt;모든 이슈는 문제(장애) 상황에서 발생&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;발생 가능한 문제들&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요청에 대한 처리량(throughput)이 급격히 하락&amp;darr;&lt;br /&gt;&amp;rarr; 필요한 컴퓨팅 자원의 최적화 어려움 &lt;br /&gt;&amp;rarr; 성능 하락 or 낭비 가능성&lt;/li&gt;
&lt;li&gt;http,grpc 프로토콜 상의 이슈로 문제가 생기는 경우 디버깅이 어려움&lt;br /&gt;&amp;rarr; Connection Pool 관리&lt;br /&gt;&amp;rarr; 한정된 리소스로인한 JVM 최적화가 더 어려워짐으로써 의도치 않은 결과 발생 가능성 &amp;uarr;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &amp;rarr; http, grpc 프로토콜에 디펜던시가 있는 지식 필요함 (Conn Timeout, tcp-3handshake 이해, grpc code, ...)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;2. 모니터링 방식의 변경 (운영, 유지보수 담당자 입장)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모놀리식 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Node Exporter를 활용하여 Node(DB) 상태에 집중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Node 상태 뿐만이 아니라, 서비스 간 호출 상태 파악&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Lantency 증감 확인, Call 증감 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 어떤 API 호출중인지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Async 방식 등에 대해서도 모니터링 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- kafka 큐잉&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 다양한 비즈니스 메트릭에 대해서도 어려워짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; 발생 가능한 문제들 &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;Network hop 이 늘어남에 따라, 어디서 어떤 요청에 대한 문제가 발생했는지 어려움&lt;br /&gt;&amp;rarr; 서비스의 갯수가 늘어가면서, 어느 요청에서 문제가 발생했는지?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;로그 수집을 위한 별도의 인프라 필요 및 관리 필요성 (DevOps)&lt;br /&gt;&amp;rarr; &amp;nbsp;굉장히 복잡하고, 처리해야할 많은 문제들 발생(e.g 누락)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;수십, 수백개의 서비스에 대해 JVM/하드웨어 얼마나 정상적인지 지속적인 확인 필요&lt;br /&gt;&amp;rarr; &amp;nbsp;서비스 또는 서버에 문제가 생기더라도 적절하게 문제 감지 어려움&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;어느 서비스에서 어느 서비스로 호출이 되어야 하는지, 이게 정상인지 확인 필요&lt;br /&gt;&amp;rarr; &amp;nbsp;서비스 간 호출 상태가 옳은 상태인지, 엉뚱한 서비스를 후출하지 않는지 파악 어려움&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-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-end/MSA</category>
      <category>MSA</category>
      <author>J-Jay</author>
      <guid isPermaLink="true">https://dev-junick.tistory.com/68</guid>
      <comments>https://dev-junick.tistory.com/68#entry68comment</comments>
      <pubDate>Thu, 25 Apr 2024 22:23:23 +0900</pubDate>
    </item>
  </channel>
</rss>