<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>작은 한걸음</title>
    <link>https://small-stap.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 18:32:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>걸음마 개발자</managingEditor>
    <item>
      <title>Axios Jwt RefreshToken 중복요청</title>
      <link>https://small-stap.tistory.com/117</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client는 모든 Axios 요청에 대해서 Access Token을 Header에 추가하여 요청을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Access Token이 없거나 만료가 되었을 경우 Cookie에 저장되어 있는 Refresh Token을 이용하여 Access Token을 갱신받아 요청들을 다시 재요청하는 방법으로 구현되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Axios의 비동기 방식의 요청에서 문제가 발생하게 되었습니다. Access Token이 만료된 상태에서 Axios를 이용하여 3개의 요청을 보낼경우 Refresh Token 갱신 요청또한 3번이 발생하는 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 문제 순서도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOJOQ1/btsEkCAn9FO/NdbdA9cy48FuePUsuSLFG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOJOQ1/btsEkCAn9FO/NdbdA9cy48FuePUsuSLFG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOJOQ1/btsEkCAn9FO/NdbdA9cy48FuePUsuSLFG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOJOQ1%2FbtsEkCAn9FO%2FNdbdA9cy48FuePUsuSLFG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;796&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실재 동작하는 순서입니다. 우리가 생각한 순서는 1번요청을 하고 1번 요청에서 Access Token이 만료가 된다면 Refresh 토큰을 통해 Access Token을 갱신하고 그다음 2번 요청과 3번 요청을 진행하여 2번과 3번은 Refresh 요청없이 결과를 받아오는 과정을 생각하였을 것입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  혹시 위 순서도에서 1, 2, 3번 순서로 요청했는데 왜 응답은 1, 2, 3 순으로 응답이 오지 않지 할 수 있다. Axios는 비동기로 요청을 보내기 때문에 순서대로 요청을 보내도 Server에서 먼저 처리된 응답을 먼저 전달하여 응답 순서가 달라질 수 있습니다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 문제 해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 해결하는 방법은 많이있을 것 입니다. 그 중 저는 Memoize라는 Library를 이용하여 이 문제를 해결하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Memoize Library를 이용한 방법은 설정한 시간안에 같은 Function을 호출하면 Cache되어 있는 값을 반환하는 방식을 취할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 1, 2, 3번 요청을 진행 2번요청이 가장 먼저 응답되어 Refresh 요청을 보내게 되면 1, 3번 요청은 동일 한 Refresh 요청을 하는 함수를 호출하지만 실제 요청에 대한 결과 값은 Cache된 값에서 전달 받게 되므로 Server로 요청은 진행하지 않게됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 해결 과정&lt;/h2&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;npm을 통한 설치
npm install memoize
----------------------
yarn을 통한 설치
yarn add memoize
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 memoize를 설치 합니다.&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;export let refreshToken = async () =&amp;gt; {
  try{
		// 토큰이 만료되어 갱신요청을 하는 부분
    return http.post('/refresh-token');
  } catch (e) {
		// 오류 발생 시 필요한 조치 추가
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Access Token을 갱신하기 위해 요청하는 부분의 함수입니다.&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;export let memoizeRefreshToken = memoize(async () =&amp;gt; {
  try{
		// 토큰이 만료되어 갱신요청을 하는 부분
    return http.post('/refresh-token');
  } catch (e) {
    // 오류 발생 시 필요한 조치 추가
  }
}, {maxAge: 1000});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 memoize를 통해 함수 결과 Cache가 가능하도록 변경하였습니다. 2번째 파라미터의 maxAge는 해당 함수의 Cache되는 시간을 설정하는 것으로 예시에는 1초로 설정하였습니다.&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;instance.interceptors.response.use(
  (response) =&amp;gt; {
    return response;
  },
  async (error) =&amp;gt; {
    if(error.response.status !== 401){
      //401이 아닌경우 Axios Reject
			return Promise.reject(error);
		}
		
		await memoizeRefreshToken().then((result) =&amp;gt; {
			// 특정 저장소에 accessToken 저장
	    localStorage.setItem('accessToken', result.accessToken);
			// 재요청에는 신규로 발급 받은 AccessToken이 추가
      error.config.headers['Authorization'] = 'Bearer ' + result.accessToken;
    });

		// 401로 응답받은 요청에 대한 재요청을 시도
    return instance.request(error.config);
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Access Token의 갱신 요청을 하는 부분을 확인 해보겠습니다. Axios의 Interceptor를 이용하여 Error에 대한 응답을 Interceptor합니다. 그리고 Error Code가 401인지 확인 401이 아니라면 Reject시키도록 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;401이라면 memoize가 되는 memoizeRefreshToken 함수를 호출합니다. 그리고 응답으로 받은 Access Token을 특정 저장소에 저장 시키고 재요청을 위해 Header에 Access Token을 추가합니다. 마지막으로 첫 요청에 대한 재요청을 진행하여 마무리하게 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 해결 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4xSjt/btsEoNf2QkP/r9Gg7rD22CcTF1bqk4M4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4xSjt/btsEoNf2QkP/r9Gg7rD22CcTF1bqk4M4Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4xSjt/btsEoNf2QkP/r9Gg7rD22CcTF1bqk4M4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4xSjt%2FbtsEoNf2QkP%2Fr9Gg7rD22CcTF1bqk4M4Kk%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;488&quot; height=&quot;645&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 요청 순서를 보면 최초 3개의 Axios 요청을 진행하였으며 3개 모두 401응답이 온 것을 확인 할 수 있습니다. 하지만 Access Token Refresh 요청은 딱 1번만 요청된 것을 확인할 수 있습니다. 이후 3개의 요청은 모두 신규로 발급받은 Access Token을 이용하여 재요청을 진행하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것으로 Axios Jwt Refresh 중복 요청 해결 과정에 대한 설명을 마치도록 하겠습니다.&lt;/p&gt;</description>
      <category>프로그래밍/Javascript</category>
      <category>axios</category>
      <category>JWT</category>
      <category>refresh</category>
      <category>token</category>
      <category>중복</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/117</guid>
      <comments>https://small-stap.tistory.com/117#entry117comment</comments>
      <pubDate>Sun, 4 Feb 2024 17:23:21 +0900</pubDate>
    </item>
    <item>
      <title>[Web] Web Server 과 Web Application Server</title>
      <link>https://small-stap.tistory.com/115</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LZ6ga/btrz61cjFPW/uC3ngKRiKMHzctkrSygEo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LZ6ga/btrz61cjFPW/uC3ngKRiKMHzctkrSygEo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LZ6ga/btrz61cjFPW/uC3ngKRiKMHzctkrSygEo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLZ6ga%2Fbtrz61cjFPW%2FuC3ngKRiKMHzctkrSygEo0%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;152&quot; height=&quot;152&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 정적 페이지와 동적 페이지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web Server와 WAS(Web Application Server)가 나누어진 이유는 바로 정적 페이지와 동적 페이지를 담당하도록 역할을 분리하였기 때문입니다.&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;br /&gt;정적 페이지는 이름에서 유추할 수 있는 것처럼 변화가 없이 동일한 페이지를 의미합니다.&lt;br /&gt;즉 동일한 URL을 통해 페이지를 요청하면 항상 같은 페이지를 응답하는 페이지를 의미합니다.&lt;br /&gt;대표적인 페이지로는 이미지, Javascript파일, CSS파일 등이 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;동적 페이지&lt;br /&gt;동적 페이지는 정적 페이지의 반대로 변화하여 서로 다른 페이지를 의미합니다.&lt;br /&gt;즉 동일한 URL을 통해 페이지를 요청하더라도 인자, Session 등 여러 데이터에 의해 서로 다른 내용의 페이지를 의미합니다.&lt;br /&gt;대표적인 페이지로는 JSP 등이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동적 페이지 예시&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;150&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clpgjl/btrzZ3IoTWr/BqxLkKjxyA4KDQU4POsPs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clpgjl/btrzZ3IoTWr/BqxLkKjxyA4KDQU4POsPs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clpgjl/btrzZ3IoTWr/BqxLkKjxyA4KDQU4POsPs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclpgjl%2FbtrzZ3IoTWr%2FBqxLkKjxyA4KDQU4POsPs0%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;150&quot; height=&quot;66&quot; data-origin-width=&quot;150&quot; data-origin-height=&quot;66&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 HTML 파일이 정적 페이지라면 해당 HTML 파일은 티스토리 회원 수만큼 존재할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍길동_상단. html, 명탐정_상단. html.....처럼 말이죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 경우는 아주 비 효율적입니다. 겨우 닉네임이 다른 것 하나 때문에 html 파일이 수천 개 수만 개가 되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 하나의 html 파일을 생성하고 닉네임이 들어가는 부분은 로그인한 회원정보를 DB로부터 조회하여 html의 닉네&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임 Tag에 닉네임을 동적으로 작성한 파일을 동적 페이지라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Web Server&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byc40Q/btrzYjrWm7k/IMbJ2sc8GfwaKsPSdGT15K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byc40Q/btrzYjrWm7k/IMbJ2sc8GfwaKsPSdGT15K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byc40Q/btrzYjrWm7k/IMbJ2sc8GfwaKsPSdGT15K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyc40Q%2FbtrzYjrWm7k%2FIMbJ2sc8GfwaKsPSdGT15K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;420&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버는 Client의 정적 페이지 요청에 응답을 하며 동적 페이지 요청인 경우 요청을 WAS로 전달하는 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;Client가 Web Server의 정적 페이지인 이미지 자원 1을 요청한 경우 Web Server는 자원 1을 응답하여 자원 1을 Client로 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web Server로는 아파치, NGINX, IIS 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Web Application Server&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kELvL/btrzZzU2LB8/kDndtmPlGFKvKlAM73EUlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kELvL/btrzZzU2LB8/kDndtmPlGFKvKlAM73EUlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kELvL/btrzZzU2LB8/kDndtmPlGFKvKlAM73EUlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkELvL%2FbtrzZzU2LB8%2FkDndtmPlGFKvKlAM73EUlK%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;1310&quot; height=&quot;416&quot; data-origin-width=&quot;1310&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;WAS는 Client가 동적 페이지를 요청하고 Web Server를 통해 요청이 전달됩니다. 그럼 WebContainer에 해당 URL을 담당하는 Servlet이 있는지 확인을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Servlet이 존재한다면 해당 Thread를 생성하고 해당 Thread에서 Servlet의 Service를 수행하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Servlet이 존재하지 않는다면 Servlet 객체를 생성하고 Thread를 생성하여 Servlet의 Service를 수행하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebContainer는 Servlet들을 싱글톤으로 관리하므로 이미 생성되어 있는 Servlet들은 추가로 생성하지 않고 재사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAS로는 톰켓, 제우스, JBoss 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Web Server와 WAS 분리 이유&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버의 부하 분산&lt;br /&gt;정적 페이지를 담당하는 Web Server를 앞단에 둠으로써 정적 페이지 응답 속도를 향상할 수 있습니다.&lt;br /&gt;&lt;br /&gt;WAS의 경우 DB나 Redis 등 외부 서버들과 통신하며 많은 작업들을 수행합니다. 만약 WAS에서 정적 페이지 요청까지 담당하게 된다면 동적 페이지의 응답 속도가 지연될 수 있습니다.&lt;/li&gt;
&lt;li&gt;보안 향상&lt;br /&gt;http 통신의 경우 암호화가 전혀 되지 않은 상태로 통신이 진행됩니다.&lt;br /&gt;암호화된 통신을 위해 SSL을 이용한 https 통신을 이용합니다. 그런데 암호화는 비용이 아주 큰 작업이므로 이 작업을 WAS에서 담당하기에는 부담 있어 단순한 정적 페이지 응답을 담당하는 Web Server에서 SSL의 암복호화를 담당하도록 합니다.&lt;/li&gt;
&lt;li&gt;Load Balancing&lt;br /&gt;하나의 Web Server에 여러 WAS를 연결하여 특정 WAS에 부하가 급증하면 Web Server는 이후 요청을 부하의 여유가 있는 다른 WAS로 요청하여 부하를 분산할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>ServletConatiner</category>
      <category>WAS</category>
      <category>web application server</category>
      <category>Web Server</category>
      <category>WebContainer</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/115</guid>
      <comments>https://small-stap.tistory.com/115#entry115comment</comments>
      <pubDate>Thu, 21 Apr 2022 03:48:16 +0900</pubDate>
    </item>
    <item>
      <title>[Slack] SpringBoot Interactivity Message 전송</title>
      <link>https://small-stap.tistory.com/114</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkOq0X/btryI5O7v7y/YF0O7HLcTKHor9ishNhq5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkOq0X/btryI5O7v7y/YF0O7HLcTKHor9ishNhq5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkOq0X/btryI5O7v7y/YF0O7HLcTKHor9ishNhq5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkOq0X%2FbtryI5O7v7y%2FYF0O7HLcTKHor9ishNhq5K%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;171&quot; height=&quot;171&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;span style=&quot;color: #000000;&quot;&gt;Interactivity Message란&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCNll6/btryFNgL5bk/hCZkj60WlVJeRWoNM6kPn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCNll6/btryFNgL5bk/hCZkj60WlVJeRWoNM6kPn0/img.png&quot; data-alt=&quot;Interactivity Message&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCNll6/btryFNgL5bk/hCZkj60WlVJeRWoNM6kPn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCNll6%2FbtryFNgL5bk%2FhCZkj60WlVJeRWoNM6kPn0%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;674&quot; height=&quot;534&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Interactivity Message&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Interactivity&lt;/span&gt;&amp;nbsp;Message란 상호 작용이 가능한 Message입니다. 즉 Slack의 메시지에서 Input, TextArea, Button과 같이 메시지를 통해 상호작용이 가능한 Message입니다.&lt;/p&gt;
&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: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message를 SpringBoot에서 전송하고 해당 Message에서 입력 값들을 전달받아 활용해보고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.Webhook URL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 포스팅을 통해 Slack의 Webhook URL을 받았습니다. &lt;span style=&quot;color: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message 또한 이 Webhook URL을 통해 Message를 전달하고 사용자가 원하는 URL로 Message의 입력값 등 여러 데이터를 받아보고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Webhook과 관련된 정보는 &lt;a href=&quot;https://small-stap.tistory.com/113&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전 글&lt;/a&gt;에 작성되어 있으므로 모르시는 분들께서는 이전 글을 먼저 읽어보시는 것을 추천드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;span style=&quot;color: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 메뉴에서 Interativity &amp;amp; Shortcuts 메뉴로 이동을 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2wcbQ/btryJwFquKN/ObUak4S2dXBI3RsUPlkN60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2wcbQ/btryJwFquKN/ObUak4S2dXBI3RsUPlkN60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2wcbQ/btryJwFquKN/ObUak4S2dXBI3RsUPlkN60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2wcbQ%2FbtryJwFquKN%2FObUak4S2dXBI3RsUPlkN60%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;205&quot; height=&quot;661&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 화면의 우측 상단의 Toggle 버튼을 클릭하여 On으로 활성화를 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JsPzD/btryKv0o4hx/a8wpvLe9lBBSeNofJYL1YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JsPzD/btryKv0o4hx/a8wpvLe9lBBSeNofJYL1YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JsPzD/btryKv0o4hx/a8wpvLe9lBBSeNofJYL1YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJsPzD%2FbtryKv0o4hx%2Fa8wpvLe9lBBSeNofJYL1YK%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;681&quot; height=&quot;135&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성화가 되면 하단에 Request URL이 생성됩니다. 여기에 Message에 대한 결과를 돌려받고자 하는 URL을 입력하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 'http://example.com/slack/request'와&amp;nbsp;같이 작성하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsUQuX/btryKWwFsho/jjacpQugIf4NKkKhWiidrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsUQuX/btryKWwFsho/jjacpQugIf4NKkKhWiidrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsUQuX/btryKWwFsho/jjacpQugIf4NKkKhWiidrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsUQuX%2FbtryKWwFsho%2FjjacpQugIf4NKkKhWiidrK%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;632&quot; height=&quot;143&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;143&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;이것으로 Slack에서의 &lt;span style=&quot;color: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message를 사용할 준비는 완료가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. SpringBoot에서 &lt;span style=&quot;color: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message 전송&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글에서 Webhook을 통해 Message를 전달할 때 Json 포맷을 이용하여 Text 값을 전달하면 해당 값의 Text가 Message로 전달되었습니다.&lt;/p&gt;
&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: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message도 동일합니다. &lt;span style=&quot;color: #000000;&quot;&gt;Interactivity&lt;/span&gt; Message를 구성하는 정보들을 Json 포맷으로 전달만 하면 Slack에서는 해당 포맷을 파싱 하여 Message로 만들어 표시해주는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack에서는 이러한 Element를 Block이라고 부르며 Block들을 모아 하나의 Message를 구성하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Block에 대한 여러 설명은 &lt;a href=&quot;https://api.slack.com/reference/block-kit/blocks&quot;&gt;Slack Block api&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://app.slack.com/block-kit-builder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Slack Block Builder&lt;/a&gt;에 접속하시면 직접 Interactivity Message를 구성해 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot에서 Slack api 사용을 위해 의존성을 추가하여야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649348643280&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'com.google.code.gson:gson:2.8.6'

implementation 'com.squareup.okhttp3:okhttp:4.2.0'

implementation 'com.slack.api:slack-app-backend:1.6.2'
implementation 'com.slack.api:slack-api-model:1.6.2'
implementation 'com.slack.api:slack-api-client:1.6.2'&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;위 5개의 의존성을 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 Slack에 전송하고자 하는 Message를 구성하는 Block들을 Array에 담아 Webhook으로 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Message를 구성할 Block들을 Blocks의 asBlocks메소드로 Array로 반환받습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6jVA1/btryLAmC2bN/rz1hrcn66mfy5DwHm75Nlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6jVA1/btryLAmC2bN/rz1hrcn66mfy5DwHm75Nlk/img.png&quot; data-alt=&quot;asBlocks 메소드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6jVA1/btryLAmC2bN/rz1hrcn66mfy5DwHm75Nlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6jVA1%2FbtryLAmC2bN%2Frz1hrcn66mfy5DwHm75Nlk%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;537&quot; height=&quot;71&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;asBlocks 메소드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1649349039724&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Blocks.asBlocks(
	slackUtils.getHeader(&quot;Interavitity Message&quot;),
	slackUtils.getSection(&quot;Slack Message 테스트&quot;),
	Blocks.divider(),
	slackUtils.getTextInput(&quot;제목&quot;, &quot;block_title&quot;),
	slackUtils.getTextArea(&quot;내용&quot;, &quot;block_content&quot;),
	Blocks.actions(slackUtils.getConfirmButtonBlocks())
);&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;이제 SlackUtils에서 각각의 Block을 만드는 메소드를 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Block은 Builer와 Lambda를 이용하여 생성할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Header Block을 생성 메소드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649349695566&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public HeaderBlock getHeader(String text) {
	return Blocks.header(h -&amp;gt;
		h.text(plainText(pt -&amp;gt;
			pt.emoji(true).text(text)
		))
	);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649349838676&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public HeaderBlock getHeader(String text) {        
	return HeaderBlock.builder()
			.text(PlainTextObject.builder()
					.text(text)
					.emoji(true)
					.build())
			.build();
}&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;Section Block을 생성 메소드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Section은 HTML의 P 태그와 비슷합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649349938646&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public SectionBlock getSection(String message) {
	return Blocks.section(s -&amp;gt; 
		s.text(BlockCompositions.markdownText(message))
	);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649350082451&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public SectionBlock getSection(String message) {
	return SectionBlock.builder()
			.text(MarkdownTextObject.builder()
					.text(message)
					.build())
			.build();
}&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;TextArea Block을 생성 메소드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input Block의 경우 CallBack 된 Message에서 값을 찾아오기 위해 BlockId를 지정해 주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 지정해주지 않으면 Random으로 배정되기 때문에 값을 찾는 과정이 복잡해집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649350182660&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public InputBlock getTextArea(String labelText, String actionId){
	InputBlock inputBlock = Blocks.input(i -&amp;gt; 
		i.element(BlockElements.plainTextInput(pti -&amp;gt;
			pti.actionId(actionId).multiline(true))
		).label(plainText(labelText)));

	inputBlock.setBlockId(actionId);

	return inputBlock;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649350495299&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public InputBlock getTextArea(String labelText, String actionId){
	return InputBlock.builder()
			.element(PlainTextInputElement.builder()
					.actionId(actionId)
					.multiline(true)
					.build())
			.label(PlainTextObject.builder()
					.text(labelText)
					.build())
			.blockId(actionId)
			.build();
}&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;span&gt;Input Block을 생성&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메소드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649350588967&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public InputBlock getTextInput(String labelText, String actionId){
	InputBlock inputBlock = Blocks.input(i -&amp;gt;
    i.element(BlockElements.plainTextInput(pti -&amp;gt;
    	pti.actionId(actionId)
	)).label(plainText(labelText)));

	inputBlock.setBlockId(actionId);

	return inputBlock;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649350724907&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public InputBlock getTextInput(String labelText, String actionId){
	return InputBlock.builder()
		.element(PlainTextInputElement.builder()
			.actionId(actionId)
			.build())
		.label(PlainTextObject.builder()
			.text(labelText)
			.build())
		.blockId(actionId)
		.build();
}&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;ActionButton Block 생성 메소드 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Button Group을 생성하기 위해 Array로 Button들을 생성&lt;/p&gt;
&lt;pre id=&quot;code_1649350936375&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public List&amp;lt;BlockElement&amp;gt; getConfirmButtonBlocks() {
	List&amp;lt;BlockElement&amp;gt; actions = new ArrayList&amp;lt;&amp;gt;();
	actions.add(getActionButton(&quot;전송&quot;, &quot;submit&quot;, &quot;primary&quot;, &quot;callback_submit&quot;));
	return actions;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649350998857&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public BlockElement getActionButton(String plainText, String value, String style, String actionId) {
	return BlockElements.button(b -&amp;gt;
    	b.text(plainText(plainText, true))
			.value(value)
			.style(style)
			.actionId(actionId));
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649351115693&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public BlockElement getActionButton(String plainText, String value, String style, String actionId) {
	return ButtonElement.builder()
		.text(PlainTextObject.builder()
			.text(plainText)
			.emoji(true)
			.build())
		.value(value)
		.style(style)
		.actionId(actionId)
		.build();
}&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;위 과정으로 만들어진 Block Array를 전송&lt;/p&gt;
&lt;pre id=&quot;code_1649351214913&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Slack.getInstance().send(&quot;Slack Webhook URL&quot;, WebhookPayloads.payload(p -&amp;gt; p.blocks(&amp;lt;만든 Block Array&amp;gt;)));&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649351316481&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Slack.getInstance().send(&quot;Slack Webhook URL&quot;, Payload.builder().blocks(&amp;lt;만든 Block Array&amp;gt;).build());&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;위 send 메소드를 통해 Message를 전송한 결과 Slack에는 Block으로 만든 Message가 도착하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H0uqG/btryMnHmxdk/8Qsi91E5n42K6Y8kx2KSMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H0uqG/btryMnHmxdk/8Qsi91E5n42K6Y8kx2KSMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H0uqG/btryMnHmxdk/8Qsi91E5n42K6Y8kx2KSMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH0uqG%2FbtryMnHmxdk%2F8Qsi91E5n42K6Y8kx2KSMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;330&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Slack Message Callback&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위 Message에서 입력항목에 입력 후 전송 버튼을 누른 경우 해당 값들을 App에서 받아보는 것을 설명하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsUQuX/btryKWwFsho/jjacpQugIf4NKkKhWiidrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsUQuX/btryKWwFsho/jjacpQugIf4NKkKhWiidrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsUQuX/btryKWwFsho/jjacpQugIf4NKkKhWiidrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsUQuX%2FbtryKWwFsho%2FjjacpQugIf4NKkKhWiidrK%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;632&quot; height=&quot;143&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interactivity &amp;amp; Shortcut에서 설정한 Request URL을 통해 Interactivity Message 결과가 전달 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 POST메소드로 JSON이 전달되므로 Controller에서는 @RequestParam으로 JSON String 값을 받아 옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649490637338&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/slack/callback&quot;)
public ResponseEntity&amp;lt;Boolean&amp;gt; slackCallBack(@RequestParam String payload) {
	notificationService.sendResponseMessage(payload);
	return ResponseEntity.ok(true);
}&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;JSON String을 Slack의 BlockActionPayload 객체로 Mapping 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1649490887475&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public BlockActionPayload getPayload(String payloadJson){
	return GsonFactory.createSnakeCase().fromJson(payloadJson, BlockActionPayload.class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BlockActionPayload객체에 Input, TextArea 값들은 ViewState 객체의 values 속성에 담겨있습니다. 그러므로 해당 속성에 접근하여 가져와야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqZWLm/btryUeRmy2O/ZR0SmgfVlr4tSkaKViH3R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqZWLm/btryUeRmy2O/ZR0SmgfVlr4tSkaKViH3R1/img.png&quot; data-alt=&quot;BlockActionPayload Class&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqZWLm/btryUeRmy2O/ZR0SmgfVlr4tSkaKViH3R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqZWLm%2FbtryUeRmy2O%2FZR0SmgfVlr4tSkaKViH3R1%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;452&quot; height=&quot;483&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BlockActionPayload Class&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJCqD/btryQ1ZYoJw/o86ikYFzewTtwNuEh5LitK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJCqD/btryQ1ZYoJw/o86ikYFzewTtwNuEh5LitK/img.png&quot; data-alt=&quot;ViewState Class&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJCqD/btryQ1ZYoJw/o86ikYFzewTtwNuEh5LitK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJCqD%2FbtryQ1ZYoJw%2Fo86ikYFzewTtwNuEh5LitK%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;419&quot; height=&quot;153&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ViewState Class&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;결과가 담겨있는 Map&amp;lt;String, Map&amp;lt;String, Value&amp;gt;&amp;gt;에 결과 값들이 들어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 Map은 BlockId를 Key값으하는 Block이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 Map은 Block의 Element의 ActionId를 Key값으로 하는 Element가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test Message로 사용할 Block들을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T7KTe/btryTsh3ABm/LrGdbfcVopWGlWkOPgrauK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T7KTe/btryTsh3ABm/LrGdbfcVopWGlWkOPgrauK/img.png&quot; data-alt=&quot;Block 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T7KTe/btryTsh3ABm/LrGdbfcVopWGlWkOPgrauK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT7KTe%2FbtryTsh3ABm%2FLrGdbfcVopWGlWkOPgrauK%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;782&quot; height=&quot;173&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Block 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JA7OK/btryUgVZK6e/cXKsPflXCK19aDqKkpJFQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JA7OK/btryUgVZK6e/cXKsPflXCK19aDqKkpJFQK/img.png&quot; data-alt=&quot;전송 Slack Message&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JA7OK/btryUgVZK6e/cXKsPflXCK19aDqKkpJFQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJA7OK%2FbtryUgVZK6e%2FcXKsPflXCK19aDqKkpJFQK%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;613&quot; height=&quot;333&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전송 Slack Message&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;Debug모드로 확인한 Payload values 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2xdYz/btryQB1z5Xc/CjPjpT0bfDddN46MpsEUI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2xdYz/btryQB1z5Xc/CjPjpT0bfDddN46MpsEUI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2xdYz/btryQB1z5Xc/CjPjpT0bfDddN46MpsEUI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2xdYz%2FbtryQB1z5Xc%2FCjPjpT0bfDddN46MpsEUI1%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;468&quot; height=&quot;741&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;741&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;결과 처럼 첫번째 Map은 block_input1, block_input2 를 Key값으로 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 Map의 Element인 두번째 Map은 input, textarea를 Key값으로 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 Map의 value에는 ViewState 객체가 있으며 이 객체의 value값이 바로 Message에서 입력한 값이 들어있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 Slack의 Callback에서 입력된 값을 가져오려면 Payload 객체에서 ViewState의 values 속성값에 있는 Map에서 BlcokId와 ActionId를 통해 해당 Element에 접근하여 value를 가져올 수 있습니다.&lt;/p&gt;</description>
      <category>기타</category>
      <category>Interativity</category>
      <category>Java</category>
      <category>send</category>
      <category>slack</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/114</guid>
      <comments>https://small-stap.tistory.com/114#entry114comment</comments>
      <pubDate>Sat, 9 Apr 2022 17:26:53 +0900</pubDate>
    </item>
    <item>
      <title>[Slack] SpringBoot Slack Message 전송</title>
      <link>https://small-stap.tistory.com/113</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMLGY/btryDQ44mlR/enRJI8iD9pC9huHyiZufak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMLGY/btryDQ44mlR/enRJI8iD9pC9huHyiZufak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMLGY/btryDQ44mlR/enRJI8iD9pC9huHyiZufak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMLGY%2FbtryDQ44mlR%2FenRJI8iD9pC9huHyiZufak%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;171&quot; height=&quot;171&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Slack App 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot App에서 Slack으로 Message를 전달하기 위해서는 먼저 Slack에 App을 생성해야 됩니다.&lt;/p&gt;
&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://api.slack.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Slack Api&lt;/a&gt; 홈페이지에 접속합니다. 우측 상단의 Your App을 클릭하여 App 화면으로 진입합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zmOPO/btryzB8ByMc/cKlRsudIgdkt4xS0wVmCxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zmOPO/btryzB8ByMc/cKlRsudIgdkt4xS0wVmCxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zmOPO/btryzB8ByMc/cKlRsudIgdkt4xS0wVmCxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzmOPO%2FbtryzB8ByMc%2FcKlRsudIgdkt4xS0wVmCxk%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;1149&quot; height=&quot;354&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 화면에서 Create New App을 클릭하여 App생성을 실행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMKpE/btryDQRv1GX/HvHnzuDLtncJKvYyuz7wck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMKpE/btryDQRv1GX/HvHnzuDLtncJKvYyuz7wck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMKpE/btryDQRv1GX/HvHnzuDLtncJKvYyuz7wck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMKpE%2FbtryDQRv1GX%2FHvHnzuDLtncJKvYyuz7wck%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;943&quot; height=&quot;382&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Modal창에서는 From scratch를 클릭하여 App 생성을 진행합니다. 다음 Modal 창에서는 App의 이름과 Slack의 workspace를 선택합니다. 모두 작성이 완료되었다면 우측 하단의 Create App을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjZif/btryCOfCjRV/hqfSsoAM3dUUf3QcSxQ3FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjZif/btryCOfCjRV/hqfSsoAM3dUUf3QcSxQ3FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjZif/btryCOfCjRV/hqfSsoAM3dUUf3QcSxQ3FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSjZif%2FbtryCOfCjRV%2FhqfSsoAM3dUUf3QcSxQ3FK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;365&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;365&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;517&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdIFMI/btryCj70piU/k701XtnhF4IP47fBrOxXZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdIFMI/btryCj70piU/k701XtnhF4IP47fBrOxXZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdIFMI/btryCj70piU/k701XtnhF4IP47fBrOxXZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdIFMI%2FbtryCj70piU%2Fk701XtnhF4IP47fBrOxXZK%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;517&quot; height=&quot;468&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App 생성이 완료가 되었다면 좌측 Menu에서 Incoming Webhooks 메뉴 화면으로 이동합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeB4y/btryDJxNnwe/xknPEv0AidgadmiC2Lq9bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeB4y/btryDJxNnwe/xknPEv0AidgadmiC2Lq9bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeB4y/btryDJxNnwe/xknPEv0AidgadmiC2Lq9bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeB4y%2FbtryDJxNnwe%2FxknPEv0AidgadmiC2Lq9bk%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;206&quot; height=&quot;539&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Webhooks화면에서 이제 Webhook을 활성화합니다. 우측 Toggle 버튼을 클릭하여 On으로 활성화합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgbENq/btryDQxcYK2/3AfqikPRCDMysL38OR4rIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgbENq/btryDQxcYK2/3AfqikPRCDMysL38OR4rIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgbENq/btryDQxcYK2/3AfqikPRCDMysL38OR4rIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgbENq%2FbtryDQxcYK2%2F3AfqikPRCDMysL38OR4rIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;308&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성화가 완료되면 하단에 Webhook을 통해 Slack으로 Message를 전달하는 방법에 대한 설명화 함께 Workspace에 신규 Webhook을 등록하는 버튼이 있습니다. 이 버튼을 클릭하여 Webhook을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLaYj/btryEXJnw0A/6RY7vspWtZcFvbcIrRIQKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLaYj/btryEXJnw0A/6RY7vspWtZcFvbcIrRIQKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLaYj/btryEXJnw0A/6RY7vspWtZcFvbcIrRIQKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLaYj%2FbtryEXJnw0A%2F6RY7vspWtZcFvbcIrRIQKK%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;677&quot; height=&quot;422&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Slack의 Workspace에 연동할 채널을 선택하고 허용을 진행하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dck9px/btryDbOQcHK/xyxSmd6XbLbiIUiyeH8P30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dck9px/btryDbOQcHK/xyxSmd6XbLbiIUiyeH8P30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dck9px/btryDbOQcHK/xyxSmd6XbLbiIUiyeH8P30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdck9px%2FbtryDbOQcHK%2FxyxSmd6XbLbiIUiyeH8P30%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;488&quot; height=&quot;211&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널과의 연동이 완료되면 신규로 생성된 Webhook의 URL 정보와 함께 curl을 통한 Message전달 방법 예제가 만들어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NBT5U/btryCOfC1n1/g9MNsd0e0EnHQuAX6EKb60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NBT5U/btryCOfC1n1/g9MNsd0e0EnHQuAX6EKb60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NBT5U/btryCOfC1n1/g9MNsd0e0EnHQuAX6EKb60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNBT5U%2FbtryCOfC1n1%2Fg9MNsd0e0EnHQuAX6EKb60%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;677&quot; height=&quot;371&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 작업을 통해 Slack으로 Message를 전달하기 위한 Slack의 연동 작업은 완료가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. SpringBoot에서 Slack으로 Message 전송&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot에서 Slack으로 Message를 전송하려면 위 Sample에 대한 설명에도 볼 수 있는 것처럼 Slack으로부터 받은 Webhook URL로 Message정보를 JSON 타입으로 POST 메소드 전송을 하면 연동한 채널에 Message가 전송되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 SpringBoot에서 /slack/test URL로 요청을 받으면 Post Slack이라는 Message가 Slack에 전송되는 코드를 작성하였습니다.&lt;/p&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;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c34uh3/btryF7Lwsjt/zKr8E5Dwts3eDuKIxN54Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c34uh3/btryF7Lwsjt/zKr8E5Dwts3eDuKIxN54Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c34uh3/btryF7Lwsjt/zKr8E5Dwts3eDuKIxN54Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc34uh3%2FbtryF7Lwsjt%2FzKr8E5Dwts3eDuKIxN54Ok%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;214&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;214&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;코드를 잠깐 설명하자면 Slack에서의 예시와 동일하게 RestTemplate 객체를 생성하고 postForObject를 통해 Post 메소드 요청으로 Json을 전달하는 것 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postForObject의 첫번째 파라미터는 Slack으로 부터 받은 Webhook URL을 작성하여 주면 되며 두번째 파라미터로는 Message가 될 정보를 전달해야 되므로 Map으로 필요한 정보를 담아 전달 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 파라미터는 responseType으로 String으로 전달 받기위해 String 클래스를 전달 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Slack의 채널로 이동하면 생성한 App의 이름과 'Posting Slack'의 메시지가 전달된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBYz7L/btryHaBeH8F/Kq5tT9dPRciuKJ4IynS5bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBYz7L/btryHaBeH8F/Kq5tT9dPRciuKJ4IynS5bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBYz7L/btryHaBeH8F/Kq5tT9dPRciuKJ4IynS5bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBYz7L%2FbtryHaBeH8F%2FKq5tT9dPRciuKJ4IynS5bk%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;784&quot; height=&quot;50&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;50&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;다음 포스팅에서는 Slack의 Interactive Message를 전달하는 방법을 알아보도록 하겠습니다.&lt;/p&gt;</description>
      <category>기타</category>
      <category>Java</category>
      <category>slack</category>
      <category>SpringBoot</category>
      <category>전송</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/113</guid>
      <comments>https://small-stap.tistory.com/113#entry113comment</comments>
      <pubDate>Thu, 7 Apr 2022 01:35:51 +0900</pubDate>
    </item>
    <item>
      <title>[ElasticSearch] Windows 설치 및 실행</title>
      <link>https://small-stap.tistory.com/112</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dl2Iw/btrvgmrIMF6/F4AZtaNSSjKCAny1uMRmrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dl2Iw/btrvgmrIMF6/F4AZtaNSSjKCAny1uMRmrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dl2Iw/btrvgmrIMF6/F4AZtaNSSjKCAny1uMRmrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDl2Iw%2FbtrvgmrIMF6%2FF4AZtaNSSjKCAny1uMRmrK%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;411&quot; height=&quot;214&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. ElasticSearch 다운로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;이번 포스팅에서는 Windows 버전을 기준으로 설명을 진행 하도록 하겠습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Linux/Unix의 경우는 명령어를 통해서 설치가능 합니다.&lt;/p&gt;
&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://www.elastic.co/kr/downloads/elasticsearch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ElasticSearch 다운로드&lt;/a&gt; 주소로 이동합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyR5ep/btru9Qul4zD/JZYmc3y8ne2PcQLDGKEma0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyR5ep/btru9Qul4zD/JZYmc3y8ne2PcQLDGKEma0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyR5ep/btru9Qul4zD/JZYmc3y8ne2PcQLDGKEma0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyR5ep%2Fbtru9Qul4zD%2FJZYmc3y8ne2PcQLDGKEma0%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;602&quot; height=&quot;338&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS에 맞는 ElasticSearch를 선택 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uUimH/btru7SyHLLA/IvqcXZ9cL8zng12BP3GgdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uUimH/btru7SyHLLA/IvqcXZ9cL8zng12BP3GgdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uUimH/btru7SyHLLA/IvqcXZ9cL8zng12BP3GgdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuUimH%2Fbtru7SyHLLA%2FIvqcXZ9cL8zng12BP3GgdK%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;422&quot; height=&quot;242&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;242&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드가 완료되면 ElasticSearch의 다운로드는 완료 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. ElasticSearch 설치&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7pK3k/btrvduDMt3P/un4iulSokdTBwvRf8r9Hkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7pK3k/btrvduDMt3P/un4iulSokdTBwvRf8r9Hkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7pK3k/btrvduDMt3P/un4iulSokdTBwvRf8r9Hkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7pK3k%2FbtrvduDMt3P%2Fun4iulSokdTBwvRf8r9Hkk%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;628&quot; height=&quot;341&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;341&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kO3O6/btrvcGR0TeY/bRv3HpkPKzhd1wWKGedxbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kO3O6/btrvcGR0TeY/bRv3HpkPKzhd1wWKGedxbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kO3O6/btrvcGR0TeY/bRv3HpkPKzhd1wWKGedxbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkO3O6%2FbtrvcGR0TeY%2FbRv3HpkPKzhd1wWKGedxbk%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;545&quot; height=&quot;411&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bin 폴더로 이동하여 ElasticSearch의 배치파일을 실행시키면 이걸로 ElasticSearch의 설치도 완료 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치파일 실행 방법은 2가지가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 쉬운 방법인 해당 배치파일을 더블클릭하여 실행하는 방법과 cmd에서 명령어를 통해 실행하는 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOBUJb/btru7RzN9PP/JqQdK0NFXq1LfcrTlmrQAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOBUJb/btru7RzN9PP/JqQdK0NFXq1LfcrTlmrQAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOBUJb/btru7RzN9PP/JqQdK0NFXq1LfcrTlmrQAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOBUJb%2Fbtru7RzN9PP%2FJqQdK0NFXq1LfcrTlmrQAk%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;710&quot; height=&quot;23&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;23&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 &amp;gt; cmd 입력 &amp;gt; 명령 프롬프트(cmd) 실행 &amp;gt; 다운받은 ElasticSearch의 압축을 푼 폴더의 bin 폴더로 이동 &amp;gt; elasticsearch.bat 입력 후 enter 이 방법으로 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 설치 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 통해 ElasticSearch를 정상 설치하였다면 웹 브라우저를 통해 실행되고 있는 ElasticSearch 기본 정보를 받아 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/46kbW/btrvhOuJWHw/oHdt6OdIKJcv55tAkzsXn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/46kbW/btrvhOuJWHw/oHdt6OdIKJcv55tAkzsXn0/img.png&quot; data-alt=&quot;http 프로토콜 접속 시도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/46kbW/btrvhOuJWHw/oHdt6OdIKJcv55tAkzsXn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F46kbW%2FbtrvhOuJWHw%2FoHdt6OdIKJcv55tAkzsXn0%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;1786&quot; height=&quot;517&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http 프로토콜 접속 시도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAgjLu/btru8vRKSuY/GAAG4f0qxwCI9MUwz9RYr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAgjLu/btru8vRKSuY/GAAG4f0qxwCI9MUwz9RYr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAgjLu/btru8vRKSuY/GAAG4f0qxwCI9MUwz9RYr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAgjLu%2Fbtru8vRKSuY%2FGAAG4f0qxwCI9MUwz9RYr1%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;28&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.X 버전 이전에는 Security가 적용되지 않아 HTTP 프로토콜을 통해서도 접속이 가능 하였지만 7.X 버전 이후 Security가 적용된 경우는 &lt;span&gt;HTTP&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로토콜로 접속 시도 시 차단되어 접속이 불가능 하며 cmd 창에 로그 'received plaintext http traffic on an https channel, closing connection Netty4HttpChannel'가 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1787&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfyRmH/btrvdQGolNj/Ieazkw6zKozOGJu0aUCou1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfyRmH/btrvdQGolNj/Ieazkw6zKozOGJu0aUCou1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfyRmH/btrvdQGolNj/Ieazkw6zKozOGJu0aUCou1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfyRmH%2FbtrvdQGolNj%2FIeazkw6zKozOGJu0aUCou1%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;1787&quot; height=&quot;359&quot; data-origin-width=&quot;1787&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ElasticSearch를 실행하고 HTTPS 프로토콜을 이용하여 접속하면 위 이미지 처럼 로그인 요청을 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bq7mN/btrvhMReeh1/4af3xFVnglKM0epBj0dnt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bq7mN/btrvhMReeh1/4af3xFVnglKM0epBj0dnt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bq7mN/btrvhMReeh1/4af3xFVnglKM0epBj0dnt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBq7mN%2FbtrvhMReeh1%2F4af3xFVnglKM0epBj0dnt0%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;745&quot; height=&quot;41&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 ElasticSearch 실행 시 ID와 비밀번호를 알려주지만 이후 실행 시 cmd창에 출력되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란색 밑줄은 ID이며 빨간색 밑줄은 이번 ElasticSearch에서만 유효한 비밀번호 입니다. ElasticSearch를 재 실행하면 비밀번호는 변경 됩니다.&lt;/p&gt;
&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;이제 위 ID와 비밀번호를 웹 브라우저 로그인에 입력하여 접속을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djxXLb/btru8vKYLKP/70aQ3x6a6ODR2hujwy8TTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djxXLb/btru8vKYLKP/70aQ3x6a6ODR2hujwy8TTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djxXLb/btru8vKYLKP/70aQ3x6a6ODR2hujwy8TTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjxXLb%2Fbtru8vKYLKP%2F70aQ3x6a6ODR2hujwy8TTk%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;269&quot; data-origin-width=&quot;444&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>elasticsearch</category>
      <category>Windows</category>
      <category>설치</category>
      <category>실행</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/112</guid>
      <comments>https://small-stap.tistory.com/112#entry112comment</comments>
      <pubDate>Thu, 7 Apr 2022 00:48:27 +0900</pubDate>
    </item>
    <item>
      <title>[Travis] Notification Slack 연동</title>
      <link>https://small-stap.tistory.com/111</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&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/CrPfa/btrxdOaIY9a/PkxtA6gX4ToDOsQ8brOkvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CrPfa/btrxdOaIY9a/PkxtA6gX4ToDOsQ8brOkvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CrPfa/btrxdOaIY9a/PkxtA6gX4ToDOsQ8brOkvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCrPfa%2FbtrxdOaIY9a%2FPkxtA6gX4ToDOsQ8brOkvK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Travis Notification Slack 연동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Travis를 사용중이시라면 아마 기본적으로 Email을 연동하여 사용중 이실거라 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Travis의 경우 Email이 아닌 Slack을 이용하여 Notification을 전달 받을 수 있습니다. 이번 포스팅에서는 Travis Notification을 Slack과 연동하는 방법에 대해 알려드리고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/usoeH/btrxexM7SEW/rl0oXm56IB3szFdMGJOJS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/usoeH/btrxexM7SEW/rl0oXm56IB3szFdMGJOJS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/usoeH/btrxexM7SEW/rl0oXm56IB3szFdMGJOJS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FusoeH%2FbtrxexM7SEW%2Frl0oXm56IB3szFdMGJOJS1%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;1862&quot; height=&quot;844&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 Slack을 사용중이시면 Slack에 로그인 후 &lt;a href=&quot;https://sstlab.slack.com/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Slack App Directory&lt;/a&gt;에 접속합니다. 만약 Slack을 처음 사용하시는 분은 Slack에 회원가입후 &lt;a href=&quot;https://sstlab.slack.com/apps&quot;&gt;Slack&lt;span&gt;&amp;nbsp;&lt;/span&gt;App Directory&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DPflT/btrxh86sfAV/Lmxn3dEKOYSy9PaHlMvtNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DPflT/btrxh86sfAV/Lmxn3dEKOYSy9PaHlMvtNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DPflT/btrxh86sfAV/Lmxn3dEKOYSy9PaHlMvtNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDPflT%2Fbtrxh86sfAV%2FLmxn3dEKOYSy9PaHlMvtNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;248&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App Directory에 접속 후 검색란에 Travis를 검색하여 Travis APP에 접속 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byj4JK/btrxiXXGWQ0/OANOkO56ycZe2VjRX67YPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byj4JK/btrxiXXGWQ0/OANOkO56ycZe2VjRX67YPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byj4JK/btrxiXXGWQ0/OANOkO56ycZe2VjRX67YPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyj4JK%2FbtrxiXXGWQ0%2FOANOkO56ycZe2VjRX67YPK%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;985&quot; height=&quot;317&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속 후 좌측의 Slack에 추가 버튼을 클릭하여 Slack에 Travis App을 추가 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh7eQJ/btrxiuuGuhD/Ok8ICJVkAts1dVyJ5uzNQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh7eQJ/btrxiuuGuhD/Ok8ICJVkAts1dVyJ5uzNQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh7eQJ/btrxiuuGuhD/Ok8ICJVkAts1dVyJ5uzNQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh7eQJ%2FbtrxiuuGuhD%2FOk8ICJVkAts1dVyJ5uzNQk%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;973&quot; height=&quot;450&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 채널을 선택하는 화면이 출력되면 연동을 진행하고자 하는 채널을 선택하여 Travis CI 통합 앱 추가 버튼을 클릭 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FCvwY/btrxfvO8HPw/OOk9jgGjdrPaoFEPBVn3D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FCvwY/btrxfvO8HPw/OOk9jgGjdrPaoFEPBVn3D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FCvwY/btrxfvO8HPw/OOk9jgGjdrPaoFEPBVn3D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFCvwY%2FbtrxfvO8HPw%2FOOk9jgGjdrPaoFEPBVn3D1%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;870&quot; height=&quot;748&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명 지침과 함깨 Token을 할당 받습니다. (Token은 &amp;lt;슬랙도메인&amp;gt;:&amp;lt;travis token&amp;gt;형태로 할당)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648192407886&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;notifications:
  email:
    recipients:
      - email@address.com
  slack: &amp;lt;슬랙도메인&amp;gt;:&amp;lt;travis token&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 연동을 진행하고자 하는 프로젝트의 .travis.yml 파일의 notifications 속성에 slack을 추가하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지가 Travis와 Slack을 연동하는 과정이였습니다. 그러나 이 과정보다 중요한 보안관련 과정이 하나 남아있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.travis.yml파일의 경우 Github와 같은 저장소에 Commit을 하거나 하여 공개가 될 수 있습니다. 이럴 경우 Slack의 Token이 노출되어 보안에 문제가 발생할 수 있습니다. 그래서 &amp;lt;슬랙도메인&amp;gt;:&amp;lt;travis token&amp;gt;값을 암호화 하여야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Token암호화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;token 암호화를 위해서는 travis-cli를 사용할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfogwD/btrxh9dh4ZF/3bS9avEtkx8E6V8KaLw8nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfogwD/btrxh9dh4ZF/3bS9avEtkx8E6V8KaLw8nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfogwD/btrxh9dh4ZF/3bS9avEtkx8E6V8KaLw8nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfogwD%2Fbtrxh9dh4ZF%2F3bS9avEtkx8E6V8KaLw8nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;207&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Window경우 &lt;a href=&quot;https://rubyinstaller.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RubyInstaller&lt;/a&gt;를 설치하여 Ruby를 사용할 수 있도록 합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bogvMC/btrxiWYRove/4sNibKn3eZKk1Atou2l4Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bogvMC/btrxiWYRove/4sNibKn3eZKk1Atou2l4Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bogvMC/btrxiWYRove/4sNibKn3eZKk1Atou2l4Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbogvMC%2FbtrxiWYRove%2F4sNibKn3eZKk1Atou2l4Yk%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;598&quot; height=&quot;462&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;462&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;596&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DPar8/btrxhMCKJkc/BtIiWI7lZl86MgdjhCv3p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DPar8/btrxhMCKJkc/BtIiWI7lZl86MgdjhCv3p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DPar8/btrxhMCKJkc/BtIiWI7lZl86MgdjhCv3p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDPar8%2FbtrxhMCKJkc%2FBtIiWI7lZl86MgdjhCv3p1%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;596&quot; height=&quot;458&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;458&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;594&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yIe1z/btrxezjZGwZ/mEtaGSjdWitX5wZu1AFaNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yIe1z/btrxezjZGwZ/mEtaGSjdWitX5wZu1AFaNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yIe1z/btrxezjZGwZ/mEtaGSjdWitX5wZu1AFaNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyIe1z%2FbtrxezjZGwZ%2FmEtaGSjdWitX5wZu1AFaNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;460&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;460&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648193039501&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ruby -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/83klH/btrxb2fLj42/0BPDP2R4k5G9VT17oBrOEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/83klH/btrxb2fLj42/0BPDP2R4k5G9VT17oBrOEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/83klH/btrxb2fLj42/0BPDP2R4k5G9VT17oBrOEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F83klH%2Fbtrxb2fLj42%2F0BPDP2R4k5G9VT17oBrOEk%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;975&quot; height=&quot;38&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 cmd를 실행하여 ruby -v 명령어를 입력하여 설치된 루비 버전이 정상 출력되는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648193259684&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gem install travis&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciOSGx/btrxdPObxt6/Ovk1GZjMBRIgwcRZAfH3SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciOSGx/btrxdPObxt6/Ovk1GZjMBRIgwcRZAfH3SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciOSGx/btrxdPObxt6/Ovk1GZjMBRIgwcRZAfH3SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciOSGx%2FbtrxdPObxt6%2FOvk1GZjMBRIgwcRZAfH3SK%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;970&quot; height=&quot;36&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 cmd에 gem install travis 명령어를 입력하여 travis를 설치 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pQaiR/btrxiXKaGid/nR5oTimdPa7cHya6Yiu4KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pQaiR/btrxiXKaGid/nR5oTimdPa7cHya6Yiu4KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pQaiR/btrxiXKaGid/nR5oTimdPa7cHya6Yiu4KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQaiR%2FbtrxiXKaGid%2FnR5oTimdPa7cHya6Yiu4KK%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;961&quot; height=&quot;100&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되었다면 이제 travis를 이용하여 login을 진행합니다. 기존 Login 방식으로 로그인시 ID, Password를 통한 Login이 Deprecated 되었다는 경고가 출력 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;※ 로그인의 경우 2020-07-30일 이전에는 GitHub의 ID와 Password로 로그인이 가능 하였지만&amp;nbsp;2020-07-30일 이후로는 GitHub와 연동되는 모든 Access가 Token으로 변경되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인을 위해 GitHub로 부터 Token을 발급 받고 해당 Token을 이용하여 로그인을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648193792638&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;travis login --com --github-token &amp;lt;발급받은Token값&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whuKU/btrxb0PP2xG/W5j5vON8driN1AD4TcWCN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whuKU/btrxb0PP2xG/W5j5vON8driN1AD4TcWCN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whuKU/btrxb0PP2xG/W5j5vON8driN1AD4TcWCN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhuKU%2Fbtrxb0PP2xG%2FW5j5vON8driN1AD4TcWCN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;35&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd에 travis login --com --github-token &amp;lt;발급받은 Token값&amp;gt;명령을 입력하여 login을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인이 성공적으로 되면 Successfully logged in as '사용자명'이 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648194003128&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd &amp;lt;이동하고자하는 Directory명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 암호화를 위하여 cmd의 현재 폴더 위치를 Slack과 연동하고자 하는 Project위치로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSZHWn/btrxiE46erp/3CyDZDqRECbSsFfsKOSzj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSZHWn/btrxiE46erp/3CyDZDqRECbSsFfsKOSzj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSZHWn/btrxiE46erp/3CyDZDqRECbSsFfsKOSzj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSZHWn%2FbtrxiE46erp%2F3CyDZDqRECbSsFfsKOSzj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;129&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1648194253291&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;travis encrypt &quot;&amp;lt;슬랙도메인&amp;gt;:&amp;lt;travis token&amp;gt;&quot; --add notifications.slack --com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동완료 후 설명 지침에 있는 자격증명 암호화 부분을 복사하여 붙여넣은 뒤 마지막에 --com을 붙여 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRuTk/btrxgobi9Rq/i8AaffIQY3bkVBUgLHDzn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRuTk/btrxgobi9Rq/i8AaffIQY3bkVBUgLHDzn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRuTk/btrxgobi9Rq/i8AaffIQY3bkVBUgLHDzn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRuTk%2Fbtrxgobi9Rq%2Fi8AaffIQY3bkVBUgLHDzn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;48&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행을 하면 .travis.yml파일에 slack의 secure 값이 추가된 yml의 모습이 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 변경여부를 입력합니다. 이때 y를 입력하면 .travis.yml파일에 slack과 관련된 값들이 자동적으로 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AW40J/btrxiFCZGUF/854jz9GWX0uwf1mOqfBqh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AW40J/btrxiFCZGUF/854jz9GWX0uwf1mOqfBqh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AW40J/btrxiFCZGUF/854jz9GWX0uwf1mOqfBqh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAW40J%2FbtrxiFCZGUF%2F854jz9GWX0uwf1mOqfBqh1%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;616&quot; height=&quot;74&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Slack으로 돌아가 Notification이 정상적으로 출력된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>CI-CD</category>
      <category>github</category>
      <category>slack</category>
      <category>token</category>
      <category>travis</category>
      <category>연동</category>
      <category>최신</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/111</guid>
      <comments>https://small-stap.tistory.com/111#entry111comment</comments>
      <pubDate>Fri, 25 Mar 2022 16:48:40 +0900</pubDate>
    </item>
    <item>
      <title>[Redis] Redis란 무엇인가?</title>
      <link>https://small-stap.tistory.com/110</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wqXAA/btrwIry3eQH/xtBH3X3Ac0JEg4KxMPUkp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wqXAA/btrwIry3eQH/xtBH3X3Ac0JEg4KxMPUkp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wqXAA/btrwIry3eQH/xtBH3X3Ac0JEg4KxMPUkp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwqXAA%2FbtrwIry3eQH%2FxtBH3X3Ac0JEg4KxMPUkp0%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;308&quot; height=&quot;260&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Redis&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 인 메모리 Key, Value 데이터 구조의 스토리지입니다. 디스크나 SSD에 데이터를 저장하는 DB 시스템과 다르게 메모리에 데이터가 상주함으로 디스크 액세스 과정이 없어 데이터에 빠르게 액세스 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Redis 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redis는 Single Thread로 구성&lt;br /&gt;Redis는 Single Thread로 구성되어 있어 Race Condition이 발생할 가능성이 낮습니다.&lt;br /&gt;즉 여러 Thread가 데이터에 수정을 위해 경합하여 데이터의 정합성이 깨질 가능성이 낮습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Redis는 Atomic을 보장&lt;br /&gt;Redis의 Collection들은 Atomic을 보장합니다. 하지만 사용자의 실수로 인해 Race Condition이 발생할 수 도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Redis Collection 종류&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Strings&lt;br /&gt;가장 기본이 되는 Collection으로 하나의 Key에 하나의 Value를 저장하는 Collection&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;set &amp;lt;Key&amp;gt; &amp;lt;Value&amp;gt; 기본적인 Key Value 형태로 데이터를 저장&lt;/li&gt;
&lt;li&gt;get &amp;lt;Key&amp;gt; Key값으로 저장되어 있는 Value값을 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;List&lt;br /&gt;Java의 List와 비슷한 Collection으로 하나의 Key에 여러 개의 Value를 저장하는 Collection&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;lpush &amp;lt;Key&amp;gt; &amp;lt;Value&amp;gt; 특정 Key로 저장된 List에 가장 앞에 Value를 저장&lt;/li&gt;
&lt;li&gt;rpush &amp;lt;Key&amp;gt; &amp;lt;Value&amp;gt; 특정 Key로 저장된 List에 가장 뒤에 Value를 저장&lt;/li&gt;
&lt;li&gt;lpop &amp;lt;Key&amp;gt; 특정 Key로 저장된 List에 가장 앞에 Value를 조회 조회된 Value는 List에서 제거&lt;/li&gt;
&lt;li&gt;rpop &amp;lt;Key&amp;gt; 특정 Key로 저장된 List에 가장 뒤에 Value를 조회 조회된 Value는 List에서 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Set&lt;br /&gt;Java의 Set과 비슷한 Collection으로 하나의 Key에 여러 개의 Value를 저장할 수 있지만 중복된 Value는 하나의 Value로 취급하는 Collection&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;sadd &amp;lt;Key&amp;gt; &amp;lt;Value&amp;gt; 특정 Key로 저장된 Set에 Value를 저장&lt;/li&gt;
&lt;li&gt;smembers &amp;lt;Key&amp;gt; 특정 Key로 저장된 Set에 모든 Value값을 조회&lt;/li&gt;
&lt;li&gt;sismember &amp;lt;Key&amp;gt; &amp;lt;Value&amp;gt; 특정 Key로 저장된 Set에 특정 Value가 저장되어 있으면 1을 반환 없으면 0을 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sorted Set&lt;br /&gt;Set과 유사한 Collection이지만 스코어 값을 이용하여 정렬이 가능한 Collection
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;zadd &amp;lt;Key&amp;gt; &amp;lt;Score&amp;gt; &amp;lt;Value&amp;gt; 특정 Key로 저장된 SortedSet에 Value를 저장하고 Score값으로 정렬 만약 특정 Key로 저장된 SortedSet에 Value가 이미 저장되어 있다면 Score값만 변경 변경된 Score값으로 재정렬&lt;/li&gt;
&lt;li&gt;zrange &amp;lt;Key&amp;gt; &amp;lt;StartIndex&amp;gt; &amp;lt;EndIndex&amp;gt; 특정 Key로 저장된 SortedSet에 StartIndex부터 EndIndex의 범위까지 저장된 모든 Value를 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hash&lt;br /&gt;하나의 Key에 여러 개의 SubKey(Field)와 Value를 가지는 Collection&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;hmset &amp;lt;Key&amp;gt; &amp;lt;SubKey&amp;gt; &amp;lt;Value&amp;gt; &amp;lt;SubKey&amp;gt; &amp;lt;Value&amp;gt; .... &amp;lt;SubKey&amp;gt; &amp;lt;Value&amp;gt; 특정 Key로 여러 SubKey와 Value를 저장&lt;/li&gt;
&lt;li&gt;hgetall &amp;lt;Key&amp;gt; 특정 Key로 저장된 모든 SubKey와 Value를 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Redis 운영&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 메모리를 이용하는 스토리지로 메모리 관리는 필수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메모리 관리 기본 정보&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redis는 Physical Memory 이상을 사용할 수 없다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Redis도 결국 서버의 가용 가능한 메모리 이상은 사용할 수 없으므로 이 이상의 메모리 사용 시 Swap을 이용합니다. Swap을 이용하면 결국 데이터를 사용하기 위해 디스크에 접근하게 되므로 성능이 느려지게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Maxmemory를 설정하여도 이보다 더 많은 메모리를 사용할 수도 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Redis의 경우 메모리 할당을 위해 Jemalloc을 사용합니다. 그런데 Redis의 경우 Jemalloc이 할당하여 사용하는 메모리를 정확히 알 수 없습니다. 바로 메모리 파편화 때문입니다.&lt;/li&gt;
&lt;li&gt;메모리 파편화 : 메모리 파편화는 Redis가 1byte의 메모리 공간이 필요하여 Jemalloc에 1byte만큼의 메모리 공간을 요청하면 Jemalloc은 메모리의 1Page를 할당하기 때문에 Redis는 실제 1Byte를 사용하여도 메모리는 1Page를 이용하는 것과 같습니다. 만약 1Page가 100Byte면 Redis는 1Byte를 사용하지만 실제 메모리 사용은 100Byte가 되는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RSS 값을 지속적으로 모니터링하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메모리 부족 해결&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리가 더 많은 장비로 Migration 진행
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;메모리가 더 많은 장비로 Migration을 진행하는 도중에 Error가 발생할 수 있습니다. 이유는 Migraion을 진행하기 위해 Redis는 Fork를 사용한다 이때 Fork가 되면 메모리는 현재 사용량은 2배가 되게 된다. 그럼 현재 사용량이 2GB 인대 Physical Memory가 3GB라면 Fork를 진행하면 4GB의 메모리가 필요하지만 최대 메모리는 3GB로 당연하게도 Error가 발생할 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;저장된 데이터 삭제
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;일정한 메모리 사용을 위해 저장된 데이터 중 일부를 삭제하여 관리&lt;/li&gt;
&lt;li&gt;만약 Swap이 발생한 데이터가 있는 경우 불필요한 데이터를 줄인 뒤 반드시 Redis 재시작이 필요합니다. 한번 Swap이 된 데이터는 재시작을 하지 않으면 항상 Swap이 발생하므로 불필요 데이터를 삭제하여도 Swap은 여전히 발생할 확률이 높습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ZipList를 이용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ZipList는 조회 시 특정한 알고리즘을 사용하여 탐색하는 것이 아닌 선형 탐색을 이용하여 필요한 데이터를 조회하는 방법입니다. 이 경우 특별한 Collection이 필요하지 않으므로 메모리 사용량을 조금 아낄 수 있습니다.&lt;/li&gt;
&lt;li&gt;선형 탐색이 가능한 이유는 In-memory 저장소 이기 때문입니다. 아주 많은 데이터가 아니면 알고리즘을 이용한 탐색과 선형 탐색의 속도 차이가 미비하기 때문에 사용이 가능한 방법입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 명령어 사용 주의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 Single Thread로 구현되어 있습니다. 그러므로 동시에 처리 가능한 명령 또한 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;만약 1개의 명령을 수행하는데 10초의 시간이 걸리면 Buffer에 대기 중인 다른 명령들은 10초를 기다린 이후에 처리될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 Timeout 속성이 1초로 되어 있다면 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;결론적으로 Redis의 경우 하나의 명령이 긴 시간이 필요한 명령은 수행해서는 안됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;대표적인 명령&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Keys : 저장된 모든 Key를 조회하는 명령어&lt;br /&gt;Keys의 경우 Scan이라는 명령어로 대체하여 사용이 가능합니다.&lt;/li&gt;
&lt;li&gt;get all collection : Collection의 모든 데이터를 조회&lt;br /&gt;get all collection의 경우 Sorted Set의 경우 zrange를 이용하여 작은 단위로 조회&lt;br /&gt;나머지 Collection의 경우 작은 단위로 Collection을 분리하여 저장하여 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Redis 명령 처리 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mKsJw/btrwpjoIjS0/vKnxYbz8kOE11D5vbJimg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mKsJw/btrwpjoIjS0/vKnxYbz8kOE11D5vbJimg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mKsJw/btrwpjoIjS0/vKnxYbz8kOE11D5vbJimg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmKsJw%2FbtrwpjoIjS0%2FvKnxYbz8kOE11D5vbJimg1%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;887&quot; height=&quot;576&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP 통신의 경우 Packet 단위로 데이터가 전송 되므로 Process Input Buffer에는 전송된 Packet들이 모이게 되고 모인 Packet을 조합하여 처리하고자 하는 데이터가 완성되면 Packet들을 조합하여 Command로 변경을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Process Command에서 해당 Command를 처리하게 됩니다.&lt;/p&gt;</description>
      <category>기타</category>
      <category>Cache</category>
      <category>Memory</category>
      <category>redis</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/110</guid>
      <comments>https://small-stap.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 21 Mar 2022 23:23:07 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon Linux2 Redis 설치</title>
      <link>https://small-stap.tistory.com/109</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU7kFU/btrv12UJYQO/hoFS78ZpOrkAXr5ZvCwOS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU7kFU/btrv12UJYQO/hoFS78ZpOrkAXr5ZvCwOS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU7kFU/btrv12UJYQO/hoFS78ZpOrkAXr5ZvCwOS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU7kFU%2Fbtrv12UJYQO%2FhoFS78ZpOrkAXr5ZvCwOS1%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;308&quot; height=&quot;260&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Redis 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간에는 AWS의 EC2 인스턴스(Amazon Linux2)에 Redis를 설치하는 과정을 설명하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 아래 명령어로 yum을 update 시켜 줍니다. (최신 패키지로 업데이트를 위해서)&lt;/p&gt;
&lt;pre id=&quot;code_1647331133657&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum update&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;아래 그림처럼 Complete!가 출력되면 Update가 완료된 것 입니다. (위 내용과 다른 내용이 출력되고 Complete가 출력될 수 있습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nlLU0/btrvYwvAoD6/mhWYUJe9pBx0L882j0lzuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nlLU0/btrvYwvAoD6/mhWYUJe9pBx0L882j0lzuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nlLU0/btrvYwvAoD6/mhWYUJe9pBx0L882j0lzuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnlLU0%2FbtrvYwvAoD6%2FmhWYUJe9pBx0L882j0lzuk%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;855&quot; height=&quot;160&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;160&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;이제 Redis 설치를 위해 사용할 gcc make를 설치하여야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 yum을 통해 gcc make를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647331412956&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum install gcc make&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;아래 그림처럼 Complete!가 출력되면 Install이 완료된 것 입니다. (위 내용과 다른 내용이 출력되고 Complete가 출력될 수 있습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK4ufR/btrv0O97HON/qzHLB0j1OZfaKq7gAHvs0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK4ufR/btrv0O97HON/qzHLB0j1OZfaKq7gAHvs0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK4ufR/btrv0O97HON/qzHLB0j1OZfaKq7gAHvs0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK4ufR%2Fbtrv0O97HON%2FqzHLB0j1OZfaKq7gAHvs0k%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;1013&quot; height=&quot;154&quot; data-origin-width=&quot;1013&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Redis의 설치 파일을 다운로드 받도록 하겠습니다.&lt;/p&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를 별도의 디렉토리에서 관리하려면 디렉토리를 생성하고 해당 디렉토리에 다운로드 받으면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647331631260&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir Redis

cd Redis&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;아래 명령어로 Redis 설치 파일을 다운로드 받습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647331649370&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo wget http://download.redis.io/redis-stable.tar.gz&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;다운로드 후 디렉토리 내용을 확인 하는 명령어 ll을 이용하면 redis-stable.tar.gz파일이 다운로드되어 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ppgRS/btrv3f0g4EW/bKnoI2eyEU6e5pIf7izKH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ppgRS/btrv3f0g4EW/bKnoI2eyEU6e5pIf7izKH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ppgRS/btrv3f0g4EW/bKnoI2eyEU6e5pIf7izKH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FppgRS%2Fbtrv3f0g4EW%2FbKnoI2eyEU6e5pIf7izKH1%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;331&quot; height=&quot;25&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;25&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 파일을 현재 압축되어 있는 파일이므로 아래 명령어를 통해 압축을 풀어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647331835272&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo tar zxvf redis-stable.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지 처럼 압축을 푼 결과들이 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b74gIC/btrv4JT59aC/PJZIXL13uqDsm1ejNS8XKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b74gIC/btrv4JT59aC/PJZIXL13uqDsm1ejNS8XKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b74gIC/btrv4JT59aC/PJZIXL13uqDsm1ejNS8XKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb74gIC%2Fbtrv4JT59aC%2FPJZIXL13uqDsm1ejNS8XKk%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;309&quot; height=&quot;313&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;313&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;압축 해제가 완료되면 ll명령어를 통해 해당 디렉토리 내용을 확인하면 redis-stable이라는 디렉토리가 생성된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C6Kpu/btrv0Qtmb5s/grFw7Z7OJCtKWvigjAKtW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C6Kpu/btrv0Qtmb5s/grFw7Z7OJCtKWvigjAKtW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C6Kpu/btrv0Qtmb5s/grFw7Z7OJCtKWvigjAKtW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC6Kpu%2Fbtrv0Qtmb5s%2FgrFw7Z7OJCtKWvigjAKtW0%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;44&quot; data-origin-width=&quot;330&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;아래 명령어로 압축이 해제된 디렉토리로 이동합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647332243204&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd redis-stable&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;아래 명령어로 Makfile을 실행시켜 컴파일을 진행 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647332273473&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo make&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;아래 이미지 처럼 기록들이 출력되고 make가 완료됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQpA8w/btrvY4ez6JT/JQSJIQpoZR796VKT855Rek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQpA8w/btrvY4ez6JT/JQSJIQpoZR796VKT855Rek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQpA8w/btrvY4ez6JT/JQSJIQpoZR796VKT855Rek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQpA8w%2FbtrvY4ez6JT%2FJQSJIQpoZR796VKT855Rek%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;362&quot; height=&quot;233&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;233&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;src 폴더에 있는 redis-server 파일과 redis-cli파일을 &lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;/usr/local/bin/ 디렉토리로 복사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647333529711&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo cp src/redis-server src/redis-cli /usr/local/bin/&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;config 파일을 /etc/redis로 복사합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647333703593&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir /etc/redis

sudo cp redis.conf /etc/redis&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;아래 명령어를 통해 방금 복사한 config 파일의 설정들을 변경합니다. (에디터의 경우 익숙한 에디터를 이용하여 설정을 변경하면 됩니다. vi, nano 등)&lt;/p&gt;
&lt;pre id=&quot;code_1647333938405&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/redis/redis.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bind 속성은 사용자가 bind 하고자하는 IP로 변경합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2tzww/btrv6c2EcVl/1uEXSWzSffldEnzHwpEzkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2tzww/btrv6c2EcVl/1uEXSWzSffldEnzHwpEzkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2tzww/btrv6c2EcVl/1uEXSWzSffldEnzHwpEzkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2tzww%2Fbtrv6c2EcVl%2F1uEXSWzSffldEnzHwpEzkK%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;638&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;638&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;daemonize속성을 no에서 yes로 변경합니다. (Redis를 백그라운드에서 실행하기 위해 변경)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/basKDa/btrv5mLb8GE/kqQxDRkdykHXI9j9E9CjbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/basKDa/btrv5mLb8GE/kqQxDRkdykHXI9j9E9CjbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/basKDa/btrv5mLb8GE/kqQxDRkdykHXI9j9E9CjbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbasKDa%2Fbtrv5mLb8GE%2FkqQxDRkdykHXI9j9E9CjbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;139&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis Log 파일을 저장할 위치를 설정합니다. (daemonize를 yes로 설정하였으므로 로그 기록 파일이 필요합니다. 만약 설정하지 않으면 로그 기록이 기록되지 않습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OTbM4/btrv119nGAQ/KaGu6KevEkdETqp4ofKyN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OTbM4/btrv119nGAQ/KaGu6KevEkdETqp4ofKyN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OTbM4/btrv119nGAQ/KaGu6KevEkdETqp4ofKyN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOTbM4%2Fbtrv119nGAQ%2FKaGu6KevEkdETqp4ofKyN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;93&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;93&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;마지막으로 Working Directory를 설정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3VqiM/btrv4mybCy0/G0MHOifxkKadOdxVSRS4q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3VqiM/btrv4mybCy0/G0MHOifxkKadOdxVSRS4q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3VqiM/btrv4mybCy0/G0MHOifxkKadOdxVSRS4q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3VqiM%2Fbtrv4mybCy0%2FG0MHOifxkKadOdxVSRS4q1%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;620&quot; height=&quot;196&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 Redis를 실행시키면 실행되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647335144658&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redis-server&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;아래 이미지 처럼 Redis version 정보와 Port PID 정보들이 출력되고 실행 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bORUAa/btrv6dUOkws/qgmZDt2459QA1Z4NkpxjhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bORUAa/btrv6dUOkws/qgmZDt2459QA1Z4NkpxjhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bORUAa/btrv6dUOkws/qgmZDt2459QA1Z4NkpxjhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbORUAa%2Fbtrv6dUOkws%2FqgmZDt2459QA1Z4NkpxjhK%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;580&quot; height=&quot;357&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;357&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;그런대 Redis를 실행하니 다른 작업을 수행할 수가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 다른 작업을 위해 CTRL + C를 이용하여 Exit하면 Redis 서버가 종료됩니다.&lt;/p&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를 백그라운드에서 실행가능 하도록 하는 작업이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Redis 백그라운드 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 실행을 위해 아래 명령어로 redis-server를 실행하여봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336557250&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service redis-server start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지 처럼 redis-server.service Unit을 찾을 수 없어 실행이 불가능 할 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lvJLK/btrv4Kr37Bk/jnKn4hIoITKZ5EEtCDNcj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lvJLK/btrv4Kr37Bk/jnKn4hIoITKZ5EEtCDNcj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lvJLK/btrv4Kr37Bk/jnKn4hIoITKZ5EEtCDNcj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlvJLK%2Fbtrv4Kr37Bk%2FjnKn4hIoITKZ5EEtCDNcj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;42&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 백그라운드 실행을 위한 작업을 수행하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 통해&amp;nbsp;saxenap분이 작성한 shell script 파일을 다운로드 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647335724368&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo wget https://raw.githubusercontent.com/saxenap/install-redis-amazon-linux-centos/master/redis-server&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;https url을 브라우저에 입력하면 해당 shell script 파일을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iz6SR/btrv3P8cpSc/Oo7ncBhmKQXSzFGeqtaz0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iz6SR/btrv3P8cpSc/Oo7ncBhmKQXSzFGeqtaz0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iz6SR/btrv3P8cpSc/Oo7ncBhmKQXSzFGeqtaz0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIz6SR%2Fbtrv3P8cpSc%2FOo7ncBhmKQXSzFGeqtaz0k%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;766&quot; height=&quot;843&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 saxenap분의 &lt;a href=&quot;https://github.com/saxenap/install-redis-amazon-linux-centos/blob/master/redis-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github&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;다운로드가 완료되면 디렉토리에 redis-server라는 파일이 다운로드 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chamkh/btrv2EMUgYx/AMvlP4ufoFBDOZxNvrtrR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chamkh/btrv2EMUgYx/AMvlP4ufoFBDOZxNvrtrR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chamkh/btrv2EMUgYx/AMvlP4ufoFBDOZxNvrtrR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchamkh%2Fbtrv2EMUgYx%2FAMvlP4ufoFBDOZxNvrtrR1%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;248&quot; height=&quot;25&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;25&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 다운받은 redis-server 파일을 /etc/init.d 디렉토리로 이동합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336009517&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mv redis-server /etc/init.d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래 명령어로 해당 파일에 대한 권한을 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336035335&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod 755 /etc/init.d/redis-server&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;아래 명령어로 다운받은 redis-server Script 파일의 redis 변수값을 확인 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336172033&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/init.d/redis-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 아래 이미지처럼 설정된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvnueX/btrv6kGorYd/eV4VHAGpT4CCEBfJHkjJTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvnueX/btrv6kGorYd/eV4VHAGpT4CCEBfJHkjJTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvnueX/btrv6kGorYd/eV4VHAGpT4CCEBfJHkjJTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvnueX%2Fbtrv6kGorYd%2FeV4VHAGpT4CCEBfJHkjJTk%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;286&quot; height=&quot;25&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;25&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 위치의 redis-server 파일을 설치 초기에 cp 명령어를 통해 다운받은 redis-server을 복사한 위치와 동일하여야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB9K4T/btrvY3UsoEJ/kH6ZQCUAdEG2wTzg7o9dnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB9K4T/btrvY3UsoEJ/kH6ZQCUAdEG2wTzg7o9dnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB9K4T/btrvY3UsoEJ/kH6ZQCUAdEG2wTzg7o9dnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB9K4T%2FbtrvY3UsoEJ%2FkH6ZQCUAdEG2wTzg7o9dnk%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;864&quot; height=&quot;117&quot; data-origin-width=&quot;864&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인이 완료되었다면 아래 명령어로 Auto-Enable을 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336472387&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chkconfig --add redis-server

sudo chkconfig --level 345 redis-server on&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것으로 모든 설정이 완료되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 백그라운드 설정 전 수행하였던 명령어를 수행하도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336685278&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service redis-server start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 아래 이미지 처럼 실행이 될 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mh8rX/btrvYJuapkx/8QzTpvhj0px3kXF6kM6r60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mh8rX/btrvYJuapkx/8QzTpvhj0px3kXF6kM6r60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mh8rX/btrvYJuapkx/8QzTpvhj0px3kXF6kM6r60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMh8rX%2FbtrvYJuapkx%2F8QzTpvhj0px3kXF6kM6r60%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;312&quot; height=&quot;22&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;22&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;여기서 CTRL + C를 통해 빠져나와 아래 명령어로 redis가 정상 실행되고 있는지 확인 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336744184&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ps -ef | grep redis&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 수행하면 아래 이미지 처럼 정상 작동중인 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;20&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbjTN7/btrvX6XwENY/mQgKBctwdk8tuTBg6LsdlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbjTN7/btrvX6XwENY/mQgKBctwdk8tuTBg6LsdlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbjTN7/btrvX6XwENY/mQgKBctwdk8tuTBg6LsdlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbjTN7%2FbtrvX6XwENY%2FmQgKBctwdk8tuTBg6LsdlK%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;20&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;20&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;확인의 다른 방법 cli를 이용한 방법이 있습니다. 아래 명령어를 수행하면 PONG을 출력하면 정상 작동이 되는 것 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647336927383&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redis-cli ping&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;아래 이미지 처럼 명령어 실행 결과 PONG이 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;20&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fx29u/btrv2F6aoos/unyuf8AUMRfIFrrByz0zz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fx29u/btrv2F6aoos/unyuf8AUMRfIFrrByz0zz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fx29u/btrv2F6aoos/unyuf8AUMRfIFrrByz0zz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFx29u%2Fbtrv2F6aoos%2Funyuf8AUMRfIFrrByz0zz1%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;556&quot; height=&quot;20&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;20&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>기타</category>
      <category>amazon linux2</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>redis</category>
      <category>설치</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/109</guid>
      <comments>https://small-stap.tistory.com/109#entry109comment</comments>
      <pubDate>Tue, 15 Mar 2022 18:37:39 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon Linux2 Timezone 변경</title>
      <link>https://small-stap.tistory.com/108</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekmHFf/btrvSetGNlT/kx0KHRmj0nWkOS5QBxBQQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekmHFf/btrvSetGNlT/kx0KHRmj0nWkOS5QBxBQQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekmHFf/btrvSetGNlT/kx0KHRmj0nWkOS5QBxBQQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekmHFf%2FbtrvSetGNlT%2Fkx0KHRmj0nWkOS5QBxBQQ1%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;127&quot; height=&quot;173&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Amazon Linux2 Timezone 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 EC2 인스턴스 생성에서 Amazon Linux를 선택하여 인스턴스를 생성하였다면 기본 Timezone은 UTC로 설정되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 통해 현재 설정되어 있는 Timezone이 무엇인지 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647182355178&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;timedatectl&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;명령을 실행하면 아래와 같이 설정된 Timezone과 Local Time 등 시간 정보가 출력 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tKDWU/btrvNG509NE/YIpI6S1uN17btlk96Zujyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tKDWU/btrvNG509NE/YIpI6S1uN17btlk96Zujyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tKDWU/btrvNG509NE/YIpI6S1uN17btlk96Zujyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtKDWU%2FbtrvNG509NE%2FYIpI6S1uN17btlk96Zujyk%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;372&quot; height=&quot;168&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 설정되어 있는 Timezone은 기본 Timezone인 UTC로 설정되어 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Timezone을 한국 시간의 Timezone으로 변경하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 설정 가능한 Timezone이 무엇이 있는지 확인하는 명령어를 통해 List를 확인해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647182542130&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;timedatectl list-timezones&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;명령어를 실행하면 아래와 같이 설정가능한 Timezone이 List로 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;154&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh1mrd/btrvQhRWpUa/6pBNNlCd8MRNJEBUtjBysk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh1mrd/btrvQhRWpUa/6pBNNlCd8MRNJEBUtjBysk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh1mrd/btrvQhRWpUa/6pBNNlCd8MRNJEBUtjBysk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh1mrd%2FbtrvQhRWpUa%2F6pBNNlCd8MRNJEBUtjBysk%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;154&quot; height=&quot;212&quot; data-origin-width=&quot;154&quot; data-origin-height=&quot;212&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;128&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sGunZ/btrvSef9u0F/Obm6CbuR1oNRNPns4EKlk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sGunZ/btrvSef9u0F/Obm6CbuR1oNRNPns4EKlk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sGunZ/btrvSef9u0F/Obm6CbuR1oNRNPns4EKlk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsGunZ%2FbtrvSef9u0F%2FObm6CbuR1oNRNPns4EKlk1%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;128&quot; height=&quot;125&quot; data-origin-width=&quot;128&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아프리카와 아메리카를 넘으면 아시아가 보이고 서울이 보입니다. 바로 이 Timezone이 우리가 설정한 Timezone입니다. (아마 이미 아시는 분들이 더 많을 것으로 생각됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647182708027&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo timedatectl set-timezone Asia/Seoul&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;명령어를 실행하면 간단하게 Amazon Linux2 인스턴스의 시간이 한국 시간으로 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인을 위해 'date' 명령어를 수행하면 변경된 한국 시간이 출력되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q07Jt/btrvMIwhZ8D/GG9SrlBSSJIiUotBELAL60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q07Jt/btrvMIwhZ8D/GG9SrlBSSJIiUotBELAL60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q07Jt/btrvMIwhZ8D/GG9SrlBSSJIiUotBELAL60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq07Jt%2FbtrvMIwhZ8D%2FGG9SrlBSSJIiUotBELAL60%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;243&quot; height=&quot;23&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;23&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>기타</category>
      <category>amazon linux2</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>Time</category>
      <category>TimeZone</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/108</guid>
      <comments>https://small-stap.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 13 Mar 2022 23:46:45 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2 CodeDeploy Agent 설치와 Ruby Error</title>
      <link>https://small-stap.tistory.com/107</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;틀리거나 잘못된 정보가 있을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;댓글로 알려주시면 수정하도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vCD1x/btrvKJO7wKr/cXnghQQ8yoYNGwRfUCiBK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vCD1x/btrvKJO7wKr/cXnghQQ8yoYNGwRfUCiBK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vCD1x/btrvKJO7wKr/cXnghQQ8yoYNGwRfUCiBK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvCD1x%2FbtrvKJO7wKr%2FcXnghQQ8yoYNGwRfUCiBK1%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;127&quot; height=&quot;173&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. CodeDeploy Agent 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2 인스턴스에 CodeDeploy Agent 설치를 위해 AWS CLI를 설치한 뒤 아래 명령어를 통해 install 파일을 다운로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647077825926&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2&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;정상적으로 다운로드가 완료 되었는지 확인하기 위해 아래 명령어로 현재 Directory의 list를 출력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647077951495&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -al&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;출력 기록에 install이라는 실행 파일이 다운로드 완료된 것을 확인할 수 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;24&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGLBW4/btrvLf1luSe/xxCwKzvijBqU3CN8GZtrrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGLBW4/btrvLf1luSe/xxCwKzvijBqU3CN8GZtrrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGLBW4/btrvLf1luSe/xxCwKzvijBqU3CN8GZtrrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGLBW4%2FbtrvLf1luSe%2FxxCwKzvijBqU3CN8GZtrrK%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;180&quot; height=&quot;24&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;24&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;그리고 다운로드한 install 파일을 실행하기 위해 아래 명령어로 install 파일에 실행 권한을 부여합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647078034116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod +x ./install&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;실행 권한을 부여하고 아래 명령어로 install 파일을 실행하여 설치를 하려고 진행하던 중 문제가 발생하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647078255785&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ./install auto&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;21&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bafGU1/btrvNSwSPPP/sWCeMN0xT7qWlk4J4dYfw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bafGU1/btrvNSwSPPP/sWCeMN0xT7qWlk4J4dYfw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bafGU1/btrvNSwSPPP/sWCeMN0xT7qWlk4J4dYfw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbafGU1%2FbtrvNSwSPPP%2FsWCeMN0xT7qWlk4J4dYfw0%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;371&quot; height=&quot;21&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;21&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 문제(ruby: No such file or directory)의 원인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 문제가 발생하는 이유는 현재 EC2에 루비가 설치되어 있지 않아 해당 파일을 루비가 실행할 수 없기 때문에 발생하는 문제였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인이 바로 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;아래 명령어를 통해 EC2에 루비를 설치 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647078348775&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum install ruby&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;정상적으로 루비가 다운로드 완료되었다면 다시 한번 아래 명령어를 통해 CodeDeploy-Agent를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647078391271&quot; class=&quot;sql&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ./install auto&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;그럼 이전에 발생하였던 ruby: No such file or directory 문제는 더 이상 발생하지 않고 정상 설치가 완료 됩니다.&lt;/p&gt;
&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;아래 명령어로 현재 CodeDeploy-Agent의 상태를 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1647078545380&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service codedeploy-agent status&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;해당 명령어의 결과로 Running과 PID를 받아보면 정상적으로 설치가 완료된 것 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;20&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMXTr1/btrvL4dWVje/7apvif3eXVBW6GeZuhNkGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMXTr1/btrvL4dWVje/7apvif3eXVBW6GeZuhNkGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMXTr1/btrvL4dWVje/7apvif3eXVBW6GeZuhNkGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMXTr1%2FbtrvL4dWVje%2F7apvif3eXVBW6GeZuhNkGK%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;400&quot; height=&quot;20&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;20&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>기타</category>
      <category>AWS</category>
      <category>CodeDeploy</category>
      <category>EC2</category>
      <category>no such file or directory</category>
      <category>RUBY</category>
      <author>걸음마 개발자</author>
      <guid isPermaLink="true">https://small-stap.tistory.com/107</guid>
      <comments>https://small-stap.tistory.com/107#entry107comment</comments>
      <pubDate>Sat, 12 Mar 2022 18:50:32 +0900</pubDate>
    </item>
  </channel>
</rss>