<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>인생을 모험하는 개발자</title>
    <link>https://dev-chw.tistory.com/</link>
    <description>자기계발도 하면서 여행도 다니면서 취미도 즐기면서 모험도 하면서 살고싶은 개발자가 되고싶은 초보개발자</description>
    <language>ko</language>
    <pubDate>Mon, 27 Jul 2026 13:44:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>DevChw</managingEditor>
    <image>
      <title>인생을 모험하는 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/5371964/attach/a57a108da8d04bac9b9ee3a066c9aa3c</url>
      <link>https://dev-chw.tistory.com</link>
    </image>
    <item>
      <title>[ EC2_Amazon Linux ] Redis 설치하기</title>
      <link>https://dev-chw.tistory.com/34</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3JT2L/btrQeB3J0ZN/wPEtdrKo7KYxIgYziryX5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3JT2L/btrQeB3J0ZN/wPEtdrKo7KYxIgYziryX5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3JT2L/btrQeB3J0ZN/wPEtdrKo7KYxIgYziryX5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3JT2L%2FbtrQeB3J0ZN%2FwPEtdrKo7KYxIgYziryX5K%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;299&quot; height=&quot;300&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;저번에는 EC2_Amazon Linux 환경에서 mysql을 설치하는 과정을 담았었는데 이번에는 Redis를 설치해보도록 하겠다. mysql 보다 훨씬 쉬웠으니 간단하게 따라올 수 있을 것 이다. 그럼 시작 !&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo yum update -y
$ sudo yum install gcc make -y&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Redis를 설치하기전에 linux 업데이트 및 gcc make를 설치해준다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ wget http://download.redis.io/releases/redis-6.2.5.tar.gz // redis 설치
$ tar xzf redis-6.2.5.tar.gz // 압축해제
$ cd redis-6.2.5 // 압축 해제 된 폴더로 이동
$ make // gcc make를 이용해 컴파일&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위 커맨드를 차례대로 입력하여 Redis를 설치해주자. 어느 폴더에 설치해도 크게 상관은 없지만 혹시 모를 상황을 대비해 쉽게 찾을 수 있는 곳에 놔두는게 좋을 것 같다. 마지막 make를 하게되면 생각보다 오래 걸리니 참고하도록 하자.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo mkdir /etc/redis // 폴더생성
$ sudo mkdir /var/lib/redis // 폴더생성
$ sudo cp src/redis-server src/redis-cli /usr/local/bin/ // redis 설정 관련 파일 복사
$ sudo cp redis.conf /etc/redis/ // redis 설정 관련 파일 복사&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;현재 경로가 이동되어있기 때문에 해당경로에서 움직일 필요없이 폴더를 생성해주고 redis 설정 파일들을 복사해줄 것 이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo vi /etc/redis/redis.conf // vim 에디터로 redis.conf 수정 진입&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 입력하여 redis.conf 의 내용을 수정 해줄 것인데 수정해줄 것은 다음과 같다. 여기서 vi로 진입하든 vim으로 진입하든 상관없다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ bind 0.0.0.0 // 기본값은 127.0.0.1 -::1 일 거임 아마
$ daemonize yes // 기본값은 no
$ logfile /var/log/redis_6379.log // 기본값은 &quot;&quot; 였던거같음
$ dir /var/lib/redis // 기본값이 &quot;&quot;였거나 없었던거 같음&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;스크롤을 내리다보면 해당 항목들을 발견한텐데 이렇게 똑같이 바꿔주면 된다.&lt;br /&gt;bind 의 경우 127.0.0.1 -::1 로 작성되어있고 daemonize 는 no, logfile과 dir은 &quot; &quot; 로 되어있거나 작성되지 않았을텐데 형식을 유지하지 않고 전부 위처럼 바꿔주자.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ wget https://raw.github.com/saxenap/install-redis-amazon-linux-centos/master/redis-server&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이제 위 커맨드를 입력해 Redis 서버 초기화 스크립트를 다운받아 줄 것 이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo mv redis-server /etc/init.d // 다운 받은 파일은 init.d로 옮김
$ sudo chmod 755 /etc/init.d/redis-server // 권한 부여&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다운받은 파일을 init.d 로 옮기고 해당파일에 권한을 부여해준다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo chkconfig --add redis-server // config에 redis-server 추가
$ sudo chkconfig --level 345 redis-server on // Auto-Enable 설정&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Redis-server를 설정한 후에 자동으로 서버가 활성화되게끔 설정해주었다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo service redis-server start // 서버 시작하기
$ redis-cli ping // 서버가 가동되었는지 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 첫번째 커맨드를 입력하여 서버를 시작하면 redis-server로 넘어가는데 나온 후 $ redis-cli ping을 입력하고 PONG이 나오면 정상적으로 서버가 실행됨을 확인 할 수 있다. 아니면 &lt;span style=&quot;color: #383a42;&quot;&gt;$ sudo netstat -plntu 를 입력하여 6379번 포트가 열려있는지 확인해도 좋다. 이렇게 하면 Redis도 잘 설치되었다 !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;EC2 환경에 내가 필요한것을 구축하는 것도 생각보다 할 것이 많다.. 그래도 한번 구축해놓으면 어려움 없이 진행 가능하니 처음만 고생하고 수월하게 진행하도록 하자! 그러면 이번 글도 여기서 마치도록 하겠다. 안녕!&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도움이 된 블로그&lt;/b&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;[AWS] EC2에 Redis 설치&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;AWS EC2에 Redis 설치방법을 정리하고자 합니다. EC2의 경우 Amazon Linux 2 기준으로 진행합니다.Redis의 경우 작성기준일로 6.2.5가 최신이므로 최신버전을 설치합니다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ssoop/AWS-EC2%EC%97%90-Redis-%EC%84%A4%EC%B9%98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ngzNY/hyQqYJ7icW/H1lQeYI0af31XOMN1qyOI1/img.png?width=1544&amp;amp;height=500&amp;amp;face=0_0_1544_500,https://scrap.kakaocdn.net/dn/bwAr2T/hyQqXdlnqB/a2cKTrxn7GkKuB934xAaz1/img.png?width=1544&amp;amp;height=500&amp;amp;face=0_0_1544_500,https://scrap.kakaocdn.net/dn/biWRgx/hyQqU8MKe5/7ozIgxt3Qi10CG1YdSP9d1/img.png?width=1544&amp;amp;height=500&amp;amp;face=0_0_1544_500&quot; data-og-url=&quot;https://velog.io/@ssoop/AWS-EC2에-Redis-설치&quot;&gt;&lt;a href=&quot;https://velog.io/@ssoop/AWS-EC2에-Redis-설치&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ssoop/AWS-EC2%EC%97%90-Redis-%EC%84%A4%EC%B9%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ngzNY/hyQqYJ7icW/H1lQeYI0af31XOMN1qyOI1/img.png?width=1544&amp;amp;height=500&amp;amp;face=0_0_1544_500,https://scrap.kakaocdn.net/dn/bwAr2T/hyQqXdlnqB/a2cKTrxn7GkKuB934xAaz1/img.png?width=1544&amp;amp;height=500&amp;amp;face=0_0_1544_500,https://scrap.kakaocdn.net/dn/biWRgx/hyQqU8MKe5/7ozIgxt3Qi10CG1YdSP9d1/img.png?width=1544&amp;amp;height=500&amp;amp;face=0_0_1544_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] EC2에 Redis 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS EC2에 Redis 설치방법을 정리하고자 합니다. EC2의 경우 Amazon Linux 2 기준으로 진행합니다.Redis의 경우 작성기준일로 6.2.5가 최신이므로 최신버전을 설치합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 끄적노트/Study</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/34</guid>
      <comments>https://dev-chw.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 2 Nov 2022 16:40:32 +0900</pubDate>
    </item>
    <item>
      <title>[ EC2_Amazon Linux ] Mysql 설치하기</title>
      <link>https://dev-chw.tistory.com/33</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmeAuC/btrQdzd2epl/8niKU5lNx8dgMfzWndoXs1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmeAuC/btrQdzd2epl/8niKU5lNx8dgMfzWndoXs1/img.jpg&quot; data-alt=&quot;예?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmeAuC/btrQdzd2epl/8niKU5lNx8dgMfzWndoXs1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmeAuC%2FbtrQdzd2epl%2F8niKU5lNx8dgMfzWndoXs1%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;307&quot; height=&quot;306&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예?&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;저번에 ubuntu를 세팅했었다. Amazon Linux 운영체제에 mysql을 설치하다가 난관에 봉착하여 ubuntu로 도망갔었는데 내가 이거 하나 제대로 못할까란 생각해 다시 Linux 인스턴스를 생성해서 도전에 나섰다. 추후 Redis 설치법까지 알아보도록 하겠다. 이번 편에서는 Mysql를 설치하는 방법만 알아보고 내가 부딪혔던 오류들에 대해 살펴보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-02 오후 4.16.59.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFNwqy/btrQeDUBlc0/VJN1tk14khBJRV2GjFq2C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFNwqy/btrQeDUBlc0/VJN1tk14khBJRV2GjFq2C0/img.png&quot; data-alt=&quot;EC2 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFNwqy/btrQeDUBlc0/VJN1tk14khBJRV2GjFq2C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFNwqy%2FbtrQeDUBlc0%2FVJN1tk14khBJRV2GjFq2C0%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;470&quot; height=&quot;135&quot; data-filename=&quot;스크린샷 2022-11-02 오후 4.16.59.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;EC2 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 진행사항들은 ssh로 생성한 EC2 인스턴스 접속을 한 이후에 진행되는 것 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1667370522517&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo yum update -y
$ sudo yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
$ sudo yum install -y mysql-community-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 위 커맨드들을 EC2 환경에서 차례대로 입력하여 설치를 진행하였다. 설치가 완료된 후 mysql 서버를 가동하려 했으나 서버가 가동이 되지 않았다. 그래서 구글링을 좀 더 해보면서&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667370847292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ sudo yum install mysql-community-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 커맨드를 입력하였는데 &lt;b&gt;(The GPG keys listed for the &quot;MySQL 8.0 Community Server&quot; repository are already installed but they are not correct for this package. Check that the correct key URLs are configured for this repository.)와&lt;/b&gt; 같이 오류가 났다.&lt;/p&gt;
&lt;pre id=&quot;code_1667372622568&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 구글링 박박하고 위의 커맨드를 입력한 후 다시 &lt;b&gt;$ sudo yum install mysql-community-server를&lt;/b&gt; 입력해주니 제대로 먹혔다. 혹시 몰라 설치가 잘되었는지 &lt;b&gt;$ mysql --version&lt;/b&gt; 커맨드를 이용하여 설치가 잘 되었음을 확인하였다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667372337354&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo systemctl enable mysqld
$ sudo systemctl start mysqld
$ sudo netstat -plntu

// 만약 mysql server가 실행되지 않았다면
$ sudo systemctl restart mysqld&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 커맨드를 차례대로 입력 후 mysql 서버를 가동한 후 3306 포트가 떠있는지 확인하였다. 만약 실행되지 않았다면 맨 아래의 커맨드를 이용해 mysql을 재부팅 후 3번째 줄 커맨드를 입력하여 3306 포트가 떠있는지 확인해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기쁜 마음으로&lt;b&gt; root&lt;/b&gt; 계정으로 접속하려 했지만 &lt;b&gt;ubuntu&lt;/b&gt;와 마찬가지로 접속이 되지 않았다. 그래서 root 계정에 들어가기 위해 아래의 과정을 거쳤다.&lt;/p&gt;
&lt;pre id=&quot;code_1667372575393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo grep 'temporary.*root@localhost' /var/log/mysqld.log | tail -n 1 | sed 's/.*root@localhost: //'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 커맨드를 입력하여 성공하였을 경우 임시 비밀번호가 발급된 것을 확인할 수 있을 것이다. 그렇다면 받은 비밀번호로 mysql의 root 계정에 로그인을 해주는데 꼭 sudo 모드로 접속해주도록 하자. ex) $ sudo mysql -u root -p&lt;/p&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 class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; ALTER USER 'root'@'localhost' IDENTIFIED BY '새로운 암호';
mysql&amp;gt; FLUSH PRIVILEGES;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 커맨드를 입력하여 새로운 암호를 만들어주고 2번째 커맨드로 변경사항을 즉시 적용시켜준다. 이제 root 계정이 아닌 외부 접속을 허용할 계정을 하나 만들 것이며 이는 전에 작성한 ubuntu 관련 게시글과 똑같이 해주면 되는데 아래를 참고하자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667373066888&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ create user '사용할 유저명'@'%' identified by '사용할 비밀번호';
$ grant all privileges on *.* to '유저명'@'%' with grant option;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 커맨드를 입력하면 외부에서 접속이 허용 가능한 유저를 만들고 유저를 접속한 곳은 모든 권한을 허용해줄 수 있다. 이렇게 하여 SequelAce를 이용하여 퍼블릭 IP 주소, 설정한 유저명, 비밀번호를 입력하여 접속이 되는 것을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 어려울 것은 없었는데 자꾸 다른길로&amp;nbsp;새 가지고 더 복잡해졌던 것 같다. 이로써 ec2 내부에 mysql 설치 및 외부 접속이 가능하게끔 만들었기에 RDS를 사용하지 않고 ec2 내부 서버로 mysql을 돌릴 수 있게 됐다. RDS가 자꾸 요금이 부과되는 문제를 해결을 못하고 있기에 사실 최선책을 내고 있는 중인데 왜 돈이 나가는지 좀 알고 싶다.. 무튼! 다음 편에는 Redis 설치기로 넘어가겠다. 그럼 20000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도움이 된 블로그&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667372516754&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;AWS EC2 Linux2에 MySQL 8.0 설치하기&quot; data-og-description=&quot;1. sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 2. ** 설치 실패시 ** (The GPG keys listed for the &amp;quot;MySQL 8.0 Community Server&amp;quot; repository are already installed but they are not correct for this package. Check t&quot; data-og-host=&quot;sedangdang.tistory.com&quot; data-og-source-url=&quot;https://sedangdang.tistory.com/187&quot; data-og-url=&quot;https://sedangdang.tistory.com/187&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3IPYr/hyQqK574sN/NJkvcomRGj6K2XiEEvVu61/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/4hKb7/hyQqQFhxKp/zPKY6qWtbj4VC63fgTjU01/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://sedangdang.tistory.com/187&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sedangdang.tistory.com/187&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3IPYr/hyQqK574sN/NJkvcomRGj6K2XiEEvVu61/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/4hKb7/hyQqQFhxKp/zPKY6qWtbj4VC63fgTjU01/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AWS EC2 Linux2에 MySQL 8.0 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 2. ** 설치 실패시 ** (The GPG keys listed for the &quot;MySQL 8.0 Community Server&quot; repository are already installed but they are not correct for this package. Check t&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sedangdang.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1667373233559&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] EC2에 MySQL 설치(MySQL 5.7)&quot; data-og-description=&quot;AWS EC2에 MySQL 설치방법을 정리하고자 합니다.EC2의 경우 Amazon Linux 2 기준으로 진행합니다.3306 포트가 떠있다면 정상적으로 실행되고 있다는 의미입니다.만약 3306 포트가 안보인다면 재실행 해보&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ssoop/AWS-EC2%EC%97%90-MySQL-%EC%84%A4%EC%B9%98MySQL-5.7&quot; data-og-url=&quot;https://velog.io/@ssoop/AWS-EC2에-MySQL-설치MySQL-5.7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cTVVa2/hyQqTWjjzf/NllXsBwc322eQdomFERh71/img.png?width=700&amp;amp;height=350&amp;amp;face=0_0_700_350,https://scrap.kakaocdn.net/dn/ikrod/hyQqP7rAst/5caKo6gJLrkudSDXcxHvl1/img.png?width=700&amp;amp;height=350&amp;amp;face=0_0_700_350,https://scrap.kakaocdn.net/dn/bPFuMz/hyQqQyvxhQ/E07IUmd6woK3KBXzUAxJh1/img.png?width=1280&amp;amp;height=562&amp;amp;face=0_0_1280_562&quot;&gt;&lt;a href=&quot;https://velog.io/@ssoop/AWS-EC2%EC%97%90-MySQL-%EC%84%A4%EC%B9%98MySQL-5.7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ssoop/AWS-EC2%EC%97%90-MySQL-%EC%84%A4%EC%B9%98MySQL-5.7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cTVVa2/hyQqTWjjzf/NllXsBwc322eQdomFERh71/img.png?width=700&amp;amp;height=350&amp;amp;face=0_0_700_350,https://scrap.kakaocdn.net/dn/ikrod/hyQqP7rAst/5caKo6gJLrkudSDXcxHvl1/img.png?width=700&amp;amp;height=350&amp;amp;face=0_0_700_350,https://scrap.kakaocdn.net/dn/bPFuMz/hyQqQyvxhQ/E07IUmd6woK3KBXzUAxJh1/img.png?width=1280&amp;amp;height=562&amp;amp;face=0_0_1280_562');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] EC2에 MySQL 설치(MySQL 5.7)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS EC2에 MySQL 설치방법을 정리하고자 합니다.EC2의 경우 Amazon Linux 2 기준으로 진행합니다.3306 포트가 떠있다면 정상적으로 실행되고 있다는 의미입니다.만약 3306 포트가 안보인다면 재실행 해보&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 끄적노트/Study</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/33</guid>
      <comments>https://dev-chw.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 2 Nov 2022 16:19:15 +0900</pubDate>
    </item>
    <item>
      <title>EC2 Ubuntu 인스턴스 생성부터 Java, Mysql 설치 및 외부접속하기</title>
      <link>https://dev-chw.tistory.com/32</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ubuntu.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chiona/btrQezLDKLo/mG46r3XKqukZ2pw6YTkWg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chiona/btrQezLDKLo/mG46r3XKqukZ2pw6YTkWg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chiona/btrQezLDKLo/mG46r3XKqukZ2pw6YTkWg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchiona%2FbtrQezLDKLo%2FmG46r3XKqukZ2pw6YTkWg1%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;387&quot; data-filename=&quot;ubuntu.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 생성은 전에 후술 한 글을 참고해주세요! 다만 이 부분에서 운영체제를 &lt;b&gt;Ubuntu&lt;/b&gt;로 선택하면 됩니다.&lt;/p&gt;
&lt;figure id=&quot;og_1667308864078&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SpringBoot+AWS+RDS 서버 무중단 배포하기 -EC2편-&quot; data-og-description=&quot;SpringBoot+AWS+RDS 서버 배포하기 -RDS편- 개발을 하는 것도 좋지만 서버를 배포할 일이 생겼다. 처음에는 배포하는 게 뭐 그리 어렵겠냐 생각했는데 진짜 생각보다 많이 어렵다. 막상 배포를 끝내고 &quot; data-og-host=&quot;dev-chw.tistory.com&quot; data-og-source-url=&quot;https://dev-chw.tistory.com/27&quot; data-og-url=&quot;https://dev-chw.tistory.com/27&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cR9Jrj/hyQqU1s2Lh/5OG8EqENAb3UpK8Y8NO7D0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/CEYbY/hyQqRKrH3r/c25iOHASWBiX1xdr1cWksk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bfZQnH/hyQpw2dqmM/1TAnOpRYiFXL5nVkevSqN0/img.jpg?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750&quot;&gt;&lt;a href=&quot;https://dev-chw.tistory.com/27&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-chw.tistory.com/27&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cR9Jrj/hyQqU1s2Lh/5OG8EqENAb3UpK8Y8NO7D0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/CEYbY/hyQqRKrH3r/c25iOHASWBiX1xdr1cWksk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bfZQnH/hyQpw2dqmM/1TAnOpRYiFXL5nVkevSqN0/img.jpg?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SpringBoot+AWS+RDS 서버 무중단 배포하기 -EC2편-&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SpringBoot+AWS+RDS 서버 배포하기 -RDS편- 개발을 하는 것도 좋지만 서버를 배포할 일이 생겼다. 처음에는 배포하는 게 뭐 그리 어렵겠냐 생각했는데 진짜 생각보다 많이 어렵다. 막상 배포를 끝내고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-chw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제를 linux가 아닌 &lt;b&gt;ubuntu&lt;/b&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;내가 인스턴스를 생성하여 접속부터 &lt;b&gt;java&lt;/b&gt;, &lt;b&gt;mysql&lt;/b&gt; 등을 설치하기 까지 험난한 과정을 거쳐서 중간에 포기할 뻔했지만 멘탈&amp;nbsp;꽉 잡고 떠났던 여정을 하나씩 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 인스턴스 접속&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1667309021875&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ssh -i &amp;lt;비밀 키 경로&amp;gt; ubuntu@&amp;lt;IP 주소&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 막혔었는데 이유는 위와 같이 터미널에 입력하여 인스턴스에 접속하여야 하는데 linux 운영체제를 사용하던 것처럼&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ec2-user@&amp;lt;IP 주소&amp;gt; 와 같이 적었었다. ubuntu이기 때문에&lt;b&gt; ubuntu@&amp;lt;IP 주소&amp;gt;&lt;/b&gt;를 입력해주어야 한다. 진짜 바보같이 헤맸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. JDK 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo 권한으로 apt 업데이트를 한 이후에 openjdk v17을 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1667309212169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install openjdk-17-jdk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서는 딱히 문제가 발생하진 않았지만 linux 운영체제와 다른 설치법이기 때문에 작성해 놓는다. 참고로 필자의 경우 Java 17 버전을 사용했기에 17 버전을 설치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Mysql 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이 부분이 내 시간을 헤까닥 잡아먹은 장본인이다. &lt;b&gt;ubuntu&lt;/b&gt;이전에 &lt;b&gt;linux&lt;/b&gt;에 &lt;b&gt;mysql&lt;/b&gt; 내장 DB를 이용하려 했다 큰고 다친 적이 있어 ubuntu로 넘어왔는데 이번에도 발목을 잡기 시작했다. 하지만 여기서 포기하면 뭣도 아닐 거란 생각에 계속 파고 팠다. 설치 과정부터 발목을 잡았던 문제들을 하나씩 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 접속후 apt를 update 해주었기에 바로 mysql을 설치했다.&lt;/p&gt;
&lt;pre id=&quot;code_1667309470618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt install mysql-server
$ mysql --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 입력하여 mysql을 설치하였고 mysql이 잘 설치되었는지 확인하였다. 설치가 잘된 것을 확인하여 기쁜 마음으로 root 계정으로 접속하려던 찰나, &lt;b&gt;접속이 되지 않았다.&lt;/b&gt; mysql을 설치할 때 비밀번호를 입력하는 창도 없었기에 root 계정이 평소처럼 처음 설치했기에 엔터를 입력하면 당연히 접속될 것이라 생각했는데 아니었다. 그렇게 또 구글을 뒤지기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 처음에는 &lt;b&gt;$ sudo mysql_secure_installation&lt;/b&gt;을 입력하여 패스워드를 새로 설정하는 방법을 찾았지만 터미널에 입력 후 새로운 비밀번호와 비밀번호 재확인을 입력하면 자꾸 권한이 거부되었다는 메시지가 출력되었다. 이때부터 멘털이 약간 흔들리기 시작했지만 방법을 다시 찾아 나섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 찾고 난 이후 &lt;b&gt;해결책으로는&lt;/b&gt; 아래와 같았다.&lt;/p&gt;
&lt;pre id=&quot;code_1667309753464&quot; class=&quot;elixir&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 입력 하여 mysql에 접속한다. 그다음&lt;/p&gt;
&lt;pre id=&quot;code_1667309806095&quot; class=&quot;routeros&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '새로운비밀번호';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 sql 문을 실행해주는데 여기서 새로운 비밀번호를 입력할 때 작은따옴표도 적어줘야 한다. 헷갈리지 말자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 비밀번호를 설정할 때 &lt;b&gt;Mysql의 비밀번호 정책에 의거&lt;/b&gt;하여 새로운 비밀번호를 입력해주어야 하기에 비밀번호 설정에 오류가 있다면 정책을 찾아본 이후 제대로 입력해주자. 무튼, 위 sql 문이 정상적으로 작동했다면&lt;b&gt; Query OK&lt;/b&gt; 가 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시&lt;b&gt; mysql 접속을 나온 후&lt;/b&gt; 아래와 같이 입력해주자.&lt;/p&gt;
&lt;pre id=&quot;code_1667309956362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; $ sudo mysql_secure_installation&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 우리가 설정했던 비밀번호를 입력하는 창이 뜨는데 설정해준 대로 적어주자. 여기서 비밀번호를 다시 설정하냐고 물어보는데 우리는 이미 사용할 비밀번호를 정했기에 &lt;b&gt;n&lt;/b&gt;을 입력하여 재설정을 하지 않도록 해주자. 나머지는 전부 &lt;b&gt;y로 처리하자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 root 계정에 드디어 접속할 수 있게 됐다. 하지만 내 목표는 &lt;b&gt;외부에서 접속&lt;/b&gt;하여 해당 &lt;b&gt;DB를 조작&lt;/b&gt;할 수 있게끔, &lt;b&gt;GUI 툴도 사용하여 더 편한 관리&lt;/b&gt;를 하고 싶기에 이제 &lt;b&gt;외부 접속을 허용&lt;/b&gt;시키려 했다. 여기서 내 삽질기는 지속됐다. 하지만 아래의 본문에서는 해결하여 정상적으로 작동한 구문만 작성하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667310153080&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mysql -u root -p
$ create user '사용할 유저명'@'%' identified by '사용할 비밀번호';
$ grant all privileges on *.* to '유저명'@'%' with grant option;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 root 계정에 접속하여 새로 사용할 유저를 &lt;b&gt;모든 곳에서 접속 가능하게끔 생성&lt;/b&gt;해주고 생성한 유저에 모든 곳에서 접속한 모든 유저에게 &lt;b&gt;모든 권한을 주게끔 허용&lt;/b&gt;해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 참고로 생성한 유저를 &lt;b&gt;삭제해야 되는 경우&lt;/b&gt;가 있다면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667311567165&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DROP USER 'user 이름'@'server 이름';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 삭제해주자. 여기서 server 이름은 &lt;b&gt;'localhost'&lt;/b&gt; 이거나 위와 같이 모든 곳에 접속이 가능한 유저의 경우 &lt;b&gt;'%'&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 외부 접속을 허용해주어야 하는데 하는 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &amp;nbsp;EC2 보안 그룹의 인바운드 규칙에 mysql/Aurora에 0.0.0.0/0을 추가 ( 이 경우 블로그 포스팅에 이미 포함하고 있음 )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. mysqld.cnf 수정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번은 이미 필자의 블로그에 서술이 되어있으니&lt;b&gt; EC2와 RDS 편&lt;/b&gt;을 읽어보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번의 경우 차근차근 따라가면 크게 어렵지 않았는데 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1667311094456&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo -i // root 계정으로 전환
$ cd etc/mysql // mysql 폴더로 이동
$ grep -r &quot;bind&quot; ./ // 커맨드를 통해 해당 경로를 파악
$ vim mysql.conf.d/mysqld.cnf // 커맨드를 통해 파악한 경로에 mysqld.cnf를 vim 에디터로 열기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 입력하면 &lt;b&gt;vim&lt;/b&gt; 에디터로 &lt;b&gt;mysqld.cnf&lt;/b&gt;를 열어 수정할 수 있게 되는데 우리가 수정할 부분은 2가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤을 내리다 보면 &lt;b&gt;bind-address&lt;/b&gt;와 &lt;b&gt;mysqlx-bind-address&lt;/b&gt; 항목을 찾을 수 있는데 &lt;b&gt;#&lt;/b&gt; 을 이용해 &lt;b&gt;2가지를 주석처리&lt;/b&gt;해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;:wq&lt;/b&gt;를 이용해 저장하고 나가주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667311213238&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo systemctl restart mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 위와 같이 입력 후 &lt;b&gt;mysql을 재부팅하면 완료&lt;/b&gt;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 내가 사용하는 &lt;b&gt;SequelAce&lt;/b&gt;로 들어가 접속을 테스트하였고 결과는 성공이었다. GUI를 이용해 Database를 생성해는데에도 문제없이 진행되었다. EC2를 이용해 ubuntu 운영체제로 인스턴스를 생성하여 java와 mysql을 설치하는데 꽤나 힘들었다. 이것도 아직 내가 미숙해서 그런 거겠지만, 최종적으로 ubuntu로 넘어온 이유는 &lt;b&gt;데스크톱 GUI 환경 구성&lt;/b&gt;을 하고자 넘어왔다. linux는 방법이 있는지 없는지 잘 모르겠지만 ubuntu로 데스크톱 GUI를 구성하는데 자료가 많아 선택하게 되었다. 아무튼 위와 같이 결국은 해결하게 되었고 잊지 않기 위해서 블로그에 글 작성까지 하게 됐다.&lt;/p&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 인스턴스를 이용해 생성한 ubuntu를 GUI를 통해 작업하는 것이 되지 않을까 싶은데 그때까지 또 삽질해보도록 하자.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도움되었던 블로그 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667311436547&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] EC2에 MySQL 설치하기&quot; data-og-description=&quot;다른 여타 어느 블로그의 글 보다 자세하게 설명 하였습니다. 도움이 될 수 있길!!! 총 3개의 글 시리즈로 작성할 것 입니다!! 1. EC2 인스턴스 만들기 (이전 글) 2. AWS의 EC2에 MySQL을 설치하고, Sequal A&quot; data-og-host=&quot;blogshine.tistory.com&quot; data-og-source-url=&quot;https://blogshine.tistory.com/322&quot; data-og-url=&quot;https://blogshine.tistory.com/322&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XzPwW/hyQqQEzZh8/jrpIKsTA9kb5F9J7HbAeBK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cUjwyp/hyQqM3fTgH/71n4GdoZjRdq8uee7vzEw0/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bdlT8s/hyQqMa7gzC/SKpKKFeCN0AhP38gKzvHhK/img.png?width=2383&amp;amp;height=1399&amp;amp;face=0_0_2383_1399&quot;&gt;&lt;a href=&quot;https://blogshine.tistory.com/322&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blogshine.tistory.com/322&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XzPwW/hyQqQEzZh8/jrpIKsTA9kb5F9J7HbAeBK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cUjwyp/hyQqM3fTgH/71n4GdoZjRdq8uee7vzEw0/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bdlT8s/hyQqMa7gzC/SKpKKFeCN0AhP38gKzvHhK/img.png?width=2383&amp;amp;height=1399&amp;amp;face=0_0_2383_1399');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] EC2에 MySQL 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;다른 여타 어느 블로그의 글 보다 자세하게 설명 하였습니다. 도움이 될 수 있길!!! 총 3개의 글 시리즈로 작성할 것 입니다!! 1. EC2 인스턴스 만들기 (이전 글) 2. AWS의 EC2에 MySQL을 설치하고, Sequal A&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blogshine.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1667311453818&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Ubuntu JDK(JAVA Development Kit) 17 설치&quot; data-og-description=&quot;1. 시험환경 &amp;middot; Ubuntu 20.04 x64 &amp;middot; JDK 17 Win x64 2. 목적 &amp;middot; Ubuntu 환경에서 JDK를 설치한다. &amp;middot; 설치한 JDK 환경을 설정한다. 3. 적용 ① sudo 권한으로 apt 업데이트하고 openjdk v17을 설치한다. - $ sudo apt update - $&quot; data-og-host=&quot;languagestory.tistory.com&quot; data-og-source-url=&quot;https://languagestory.tistory.com/154&quot; data-og-url=&quot;https://languagestory.tistory.com/154&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdGMuU/hyQqMWG3Vo/w0hzBKPKDnkVxEikWn4im0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Crk38/hyQqKYSoGG/sknhNPFzYk244IK08Da4U0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://languagestory.tistory.com/154&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://languagestory.tistory.com/154&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdGMuU/hyQqMWG3Vo/w0hzBKPKDnkVxEikWn4im0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Crk38/hyQqKYSoGG/sknhNPFzYk244IK08Da4U0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu JDK(JAVA Development Kit) 17 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 시험환경 &amp;middot; Ubuntu 20.04 x64 &amp;middot; JDK 17 Win x64 2. 목적 &amp;middot; Ubuntu 환경에서 JDK를 설치한다. &amp;middot; 설치한 JDK 환경을 설정한다. 3. 적용 ① sudo 권한으로 apt 업데이트하고 openjdk v17을 설치한다. - $ sudo apt update - $&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;languagestory.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1667311468179&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS/Linux] AWS EC2 인스턴스에 Ubuntu 데스크톱 환경 만들기&quot; data-og-description=&quot;Amazon EC2의 OS가 Ubuntu Server 18.04 LTS인 인스턴스에 Ubuntu 데스크 톱 환경을 만드는 과정에 대해 기록하고자 한다. 참고로 EC2 인스턴스를 시작하는 과정에 대해서는 생략할 것이다. 환경 클라이언트 &quot; data-og-host=&quot;engineer-mole.tistory.com&quot; data-og-source-url=&quot;https://engineer-mole.tistory.com/261&quot; data-og-url=&quot;https://engineer-mole.tistory.com/261&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1HdeW/hyQpzxTsVU/FkknCp2CQ6pJfWTBzabbFk/img.jpg?width=442&amp;amp;height=341&amp;amp;face=0_0_442_341,https://scrap.kakaocdn.net/dn/F8WvJ/hyQpFkDlb7/e9YmFfEZSkKiZN87F5kAD0/img.jpg?width=442&amp;amp;height=341&amp;amp;face=0_0_442_341,https://scrap.kakaocdn.net/dn/D9pPg/hyQpBoXgVW/IK4ngvTE9e0qboeWUtZRR0/img.jpg?width=522&amp;amp;height=485&amp;amp;face=0_0_522_485&quot;&gt;&lt;a href=&quot;https://engineer-mole.tistory.com/261&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engineer-mole.tistory.com/261&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1HdeW/hyQpzxTsVU/FkknCp2CQ6pJfWTBzabbFk/img.jpg?width=442&amp;amp;height=341&amp;amp;face=0_0_442_341,https://scrap.kakaocdn.net/dn/F8WvJ/hyQpFkDlb7/e9YmFfEZSkKiZN87F5kAD0/img.jpg?width=442&amp;amp;height=341&amp;amp;face=0_0_442_341,https://scrap.kakaocdn.net/dn/D9pPg/hyQpBoXgVW/IK4ngvTE9e0qboeWUtZRR0/img.jpg?width=522&amp;amp;height=485&amp;amp;face=0_0_522_485');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS/Linux] AWS EC2 인스턴스에 Ubuntu 데스크톱 환경 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon EC2의 OS가 Ubuntu Server 18.04 LTS인 인스턴스에 Ubuntu 데스크 톱 환경을 만드는 과정에 대해 기록하고자 한다. 참고로 EC2 인스턴스를 시작하는 과정에 대해서는 생략할 것이다. 환경 클라이언트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engineer-mole.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1667311481431&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Mysql root 비밀번호 setup error(mysql secure installation)&quot; data-og-description=&quot;Ubuntu에서 Mysql 설정을 위해 mysql_secure_installation을 시작하면 root 비밀번호를 설정하는 상황이 나옵니다. 비밀번호를 설정했더니 다음과 같은 에러가 뜹니다. ... Failed! error: SET PASSWORD has no si..&quot; data-og-host=&quot;seong6496.tistory.com&quot; data-og-source-url=&quot;https://seong6496.tistory.com/322&quot; data-og-url=&quot;https://seong6496.tistory.com/322&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ifKOu/hyQqJrNA1q/Bcc7pkBLbrnzHcVkbZlKGK/img.jpg?width=578&amp;amp;height=181&amp;amp;face=0_0_578_181,https://scrap.kakaocdn.net/dn/p9DOZ/hyQpwAPTAz/Cos5KasrReX0JgeZtf5OHk/img.jpg?width=578&amp;amp;height=181&amp;amp;face=0_0_578_181&quot;&gt;&lt;a href=&quot;https://seong6496.tistory.com/322&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://seong6496.tistory.com/322&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ifKOu/hyQqJrNA1q/Bcc7pkBLbrnzHcVkbZlKGK/img.jpg?width=578&amp;amp;height=181&amp;amp;face=0_0_578_181,https://scrap.kakaocdn.net/dn/p9DOZ/hyQpwAPTAz/Cos5KasrReX0JgeZtf5OHk/img.jpg?width=578&amp;amp;height=181&amp;amp;face=0_0_578_181');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mysql root 비밀번호 setup error(mysql secure installation)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu에서 Mysql 설정을 위해 mysql_secure_installation을 시작하면 root 비밀번호를 설정하는 상황이 나옵니다. 비밀번호를 설정했더니 다음과 같은 에러가 뜹니다. ... Failed! error: SET PASSWORD has no si..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;seong6496.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1667311495291&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;mysql -- 사용자 추가, 권한 부여&quot; data-og-description=&quot;mysql -- 사용자 추가, 권한 부여 환경 : ubuntu 14.04 LTS 64bit Server, mysql 5.5 참고 : https://dev.mysql.com/doc/refman/5.5/en/adding-users.html mysql&amp;gt; show databases; ** user 확인mysql&amp;gt; select user, host from mysql.user; +------------------&quot; data-og-host=&quot;freeprog.tistory.com&quot; data-og-source-url=&quot;https://freeprog.tistory.com/168&quot; data-og-url=&quot;https://freeprog.tistory.com/168&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cugo6p/hyQpvbabaD/qiKJkVGChyfvAsCTNWjdI0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bsdM6r/hyQpsZRc9p/xNCaLOz7HehsB5d9FKFcFk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://freeprog.tistory.com/168&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://freeprog.tistory.com/168&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cugo6p/hyQpvbabaD/qiKJkVGChyfvAsCTNWjdI0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bsdM6r/hyQpsZRc9p/xNCaLOz7HehsB5d9FKFcFk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;mysql -- 사용자 추가, 권한 부여&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;mysql -- 사용자 추가, 권한 부여 환경 : ubuntu 14.04 LTS 64bit Server, mysql 5.5 참고 : https://dev.mysql.com/doc/refman/5.5/en/adding-users.html mysql&amp;gt; show databases; ** user 확인mysql&amp;gt; select user, host from mysql.user; +------------------&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;freeprog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 끄적노트/Study</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/32</guid>
      <comments>https://dev-chw.tistory.com/32#entry32comment</comments>
      <pubDate>Tue, 1 Nov 2022 23:12:57 +0900</pubDate>
    </item>
    <item>
      <title>[ Spring + AWS S3 ] 이미지 업로드 / 다운로드 구현하기</title>
      <link>https://dev-chw.tistory.com/31</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;s3.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OF6wx/btrPIglXV71/TF5cru6ssxruFSOAJnCuGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OF6wx/btrPIglXV71/TF5cru6ssxruFSOAJnCuGK/img.png&quot; data-alt=&quot;Amazon Web Service S3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OF6wx/btrPIglXV71/TF5cru6ssxruFSOAJnCuGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOF6wx%2FbtrPIglXV71%2FTF5cru6ssxruFSOAJnCuGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;274&quot; data-filename=&quot;s3.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Amazon Web Service S3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 이미지를 업로드 및 다운로드를 해야 할 일이 생겨서 구현하게 되었는데 로컬로 진행하던 과정이어서 컴퓨터 내부에 파일이 저장되게끔 유도했었다. 하지만 &lt;b&gt;EC2&lt;/b&gt;를 이용한 배포와 &lt;b&gt;RDS&lt;/b&gt;를 사용함에 따라 원격 저장소가 필요하게 됐고 자연스럽게 &lt;b&gt;S3&lt;/b&gt;를 선택하게 되었다. 이미지를 업로드하고 다운로드하는 코드를 짜는 건 어렵지 않다. 그리고 다운되는 곳을 로컬이 아닌 &lt;b&gt;S3&lt;/b&gt;로 저장되게끔 유도만 해주면 되기 때문에 사실 간단한 서비스 구현이 될 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;*** 필수 준비사항 ***&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. S3 버킷 생성해놓기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. IAM 사용자 권한 추가시키기 (IAM 사용자 등록을 안 했다면 생성)&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;*** 이미지 업로드 / 다운로드 로직 ***&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. form-data 형식으로 file을 request 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이미지가 저장될 이름과 경로를 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이미지 다운로드 &amp;amp; 이미지 화면에 노출&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'&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;첫번째로 build.gradle에 위와 같은 &lt;b&gt;dependency&lt;/b&gt;를 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;application.properties&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;cloud.aws.credentials.accessKey = IAM Access Key ID 입력
cloud.aws.credentials.secretKey = IAM Secret Key 입력
cloud.aws.s3.bucket = 자신이 만든 버킷 이름
cloud.aws.region.static = ap-northeast-2
cloud.aws.stack.auto = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;S3&lt;/b&gt;를 사용하기 위해 위와 같이 &lt;b&gt;properties&lt;/b&gt;파일에 설정해준다. 액세스 키와 시크릿키는 보안이 강조되는 사항이기 때문에 &lt;b&gt;꼭 외부로 노출되지 않게끔 하자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;S3 Config.class&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@Configuration
public class S3Config {

    @Value(&quot;${cloud.aws.credentials.accessKey}&quot;)
    private String accessKey;
    @Value(&quot;${cloud.aws.credentials.secretKey}&quot;)
    private String secretKey;
    @Value(&quot;${cloud.aws.region.static}&quot;)
    private String region;

    @Bean
    public AmazonS3 amazonS3Client() {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonS3ClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(region)
                .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;S3를 사용하기 위해 config 클래스를 구현해주었다.&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-filename=&quot;스크린샷 2022-10-27 오후 4.30.58.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cufN8y/btrPGehFcUL/AZyoHa1AcmN4gKq0pACJ0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cufN8y/btrPGehFcUL/AZyoHa1AcmN4gKq0pACJ0k/img.png&quot; data-alt=&quot;Controller&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cufN8y/btrPGehFcUL/AZyoHa1AcmN4gKq0pACJ0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcufN8y%2FbtrPGehFcUL%2FAZyoHa1AcmN4gKq0pACJ0k%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;582&quot; height=&quot;196&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.30.58.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Controller&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;에서는 &lt;b&gt;Put&lt;/b&gt;을 통해 &lt;b&gt;MultpartFile&lt;/b&gt;을 이용하여서 &lt;b&gt;file&lt;/b&gt;이라는 이름으로 &lt;b&gt;request&lt;/b&gt; 받게끔 명시해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.40.32.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kYLcV/btrPFCpAEPQ/eeFNVBmld2nJfnjlCza5nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kYLcV/btrPFCpAEPQ/eeFNVBmld2nJfnjlCza5nk/img.png&quot; data-alt=&quot;Service 클래스에 선언한 값들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kYLcV/btrPFCpAEPQ/eeFNVBmld2nJfnjlCza5nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkYLcV%2FbtrPFCpAEPQ%2FeeFNVBmld2nJfnjlCza5nk%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;461&quot; height=&quot;101&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.40.32.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Service 클래스에 선언한 값들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.32.42.png&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dokR0O/btrPFBYtgR2/MkgG4qUH5FYxwHZaoFDXsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dokR0O/btrPFBYtgR2/MkgG4qUH5FYxwHZaoFDXsK/img.png&quot; data-alt=&quot;Service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dokR0O/btrPFBYtgR2/MkgG4qUH5FYxwHZaoFDXsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdokR0O%2FbtrPFBYtgR2%2FMkgG4qUH5FYxwHZaoFDXsK%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;727&quot; height=&quot;159&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.32.42.png&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Service&lt;/b&gt;에서는 &lt;b&gt;profile_image_name&lt;/b&gt;으로 전송할 파일의 이름을 설정해주었는데 필자의 경우 JWT에서 꺼내온 유저 정보 중 고윳값인 이메일을 이미지 이름으로 설정해주었다. 처음 &lt;b&gt;&quot;profile/&quot;은 S3에 만들어놓은 폴더에 이미지를 업로드하기 위해서 붙여놓았다.&lt;/b&gt; 이미지 이름에 &lt;b&gt;&quot;/&quot;가 들어가 있으면 그 전의 이름들은 경로로 지정이 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ObjMetadata&lt;/b&gt;를 설정하지 않으면 아래와 같은 &lt;b&gt;Exception&lt;/b&gt;이 발생하니 꼭 설정해주도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.amazonaws.services.s3.AmazonS3 Client&amp;nbsp; &amp;nbsp;: No content length specified for stream data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구현하면 S3에 정상적으로 업로드될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;.profileImagePath(amazonS3Client.getUrl(bucket, profile_image_name).toString())&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;필자의 경우 &lt;/span&gt;&lt;b&gt;builder&lt;/b&gt;를 통해 &lt;b&gt;DB&lt;/b&gt;에 &lt;b&gt;save&lt;/b&gt; 해줄 때 위의 코드를 통해 &lt;b&gt;S3&lt;/b&gt;에 저장된 &lt;b&gt;url&lt;/b&gt;을 저장해주었다. 이 &lt;b&gt;url&lt;/b&gt;로 외부에서 파일을 접근할 수 있다. 실제로 &lt;b&gt;url&lt;/b&gt;을 창에 입력해보면 파일이 다운로드되며 &lt;b&gt;front-end&lt;/b&gt;에서 이미지 태그 등을 통해 홈페이지, 또는 앱에서 바로 이미지를 노출시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.44.32.png&quot; data-origin-width=&quot;2188&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ST4sH/btrPJFkBUZm/APqdtZ355HcqFX8EJgnZB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ST4sH/btrPJFkBUZm/APqdtZ355HcqFX8EJgnZB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ST4sH/btrPJFkBUZm/APqdtZ355HcqFX8EJgnZB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FST4sH%2FbtrPJFkBUZm%2FAPqdtZ355HcqFX8EJgnZB0%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;2188&quot; height=&quot;836&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.44.32.png&quot; data-origin-width=&quot;2188&quot; data-origin-height=&quot;836&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;테스트를 해본 결과 파일 이름이 이메일로 S3 내부 경로 &lt;b&gt;profile&lt;/b&gt;에 잘 저장된 것을 확인할 수 있다. 만약 이미지를 저장할 때 고유번호가 필요하다면 &lt;b&gt;UUID&lt;/b&gt; 객체를 하나 생성하여 붙여주도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.45.55.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIDJzp/btrPIICCedR/ZecTnY5ia0hQvcIEJXTGuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIDJzp/btrPIICCedR/ZecTnY5ia0hQvcIEJXTGuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIDJzp/btrPIICCedR/ZecTnY5ia0hQvcIEJXTGuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIDJzp%2FbtrPIICCedR%2FZecTnY5ia0hQvcIEJXTGuK%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;499&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.45.55.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;90&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;위와 같이 UUID 객체를 통해 고유번호를 랜덤 값으로 생성하고 &lt;b&gt;mycloset&lt;/b&gt;이라는 경로에 이미지 이름을 지정받은 랜덤 값으로 저장하게끔 바꾸어 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해당 기능을 구현하면서 발생했던 오류들&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. S3 / 버킷 권한 오류&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.48.23.png&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA27Ga/btrPJYjV5h2/OWQKTP29Aqo22ByKeuObO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA27Ga/btrPJYjV5h2/OWQKTP29Aqo22ByKeuObO0/img.png&quot; data-alt=&quot;권한 설정 오류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA27Ga/btrPJYjV5h2/OWQKTP29Aqo22ByKeuObO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA27Ga%2FbtrPJYjV5h2%2FOWQKTP29Aqo22ByKeuObO0%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;813&quot; height=&quot;156&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.48.23.png&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한 설정 오류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현 완료 후 저장된 이미지의 &lt;b&gt;url&lt;/b&gt;을 가지고 창에 입력했을 경우 오류 -&amp;gt; &lt;b&gt;AWS&lt;/b&gt; 계정과 버킷의 권한 설정이 &lt;b&gt;public&lt;/b&gt;이 아니기 때문에 발생하는 오류이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결&lt;/b&gt; : 아래의 버킷 권한 부분을 확인해 권한을 수정해주도록 하자.&lt;/p&gt;
&lt;figure id=&quot;og_1666857152519&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS]   S3 개념 정리 &amp;amp; 버킷 생성 &amp;middot; 권한(Policy / ACL) 설정하기&quot; data-og-description=&quot;S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는&amp;nbsp;온라인 오브젝트(객체)&amp;nbsp;스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) &quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; data-og-url=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ye44o/hyQmExTxUk/Cif1yUC06SgptkgQ6QtIZK/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/brY5ul/hyQmFXR09J/j0IQuEGu2jeCbqrTeZTjz1/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/jbBy4/hyQls6UmOe/7AJKLdEPKYsO7bzkw1NCuK/img.png?width=1280&amp;amp;height=1024&amp;amp;face=0_0_1280_1024&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ye44o/hyQmExTxUk/Cif1yUC06SgptkgQ6QtIZK/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/brY5ul/hyQmFXR09J/j0IQuEGu2jeCbqrTeZTjz1/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/jbBy4/hyQls6UmOe/7AJKLdEPKYsO7bzkw1NCuK/img.png?width=1280&amp;amp;height=1024&amp;amp;face=0_0_1280_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS]   S3 개념 정리 &amp;amp; 버킷 생성 &amp;middot; 권한(Policy / ACL) 설정하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는&amp;nbsp;온라인 오브젝트(객체)&amp;nbsp;스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. SdkClientException&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.54.28.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhzNKi/btrPFyHLUGZ/mfk2lShRKmwaMdrHg8qJQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhzNKi/btrPFyHLUGZ/mfk2lShRKmwaMdrHg8qJQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhzNKi/btrPFyHLUGZ/mfk2lShRKmwaMdrHg8qJQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhzNKi%2FbtrPFyHLUGZ%2Fmfk2lShRKmwaMdrHg8qJQk%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;747&quot; height=&quot;126&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.54.28.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.55.36.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dymql0/btrPJX6qEaS/M39wcILcvIMTDFjLxEzwUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dymql0/btrPJX6qEaS/M39wcILcvIMTDFjLxEzwUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dymql0/btrPJX6qEaS/M39wcILcvIMTDFjLxEzwUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdymql0%2FbtrPJX6qEaS%2FM39wcILcvIMTDFjLxEzwUK%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;42&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.55.36.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우 &lt;b&gt;Exception&lt;/b&gt;이 발생하나 서버가 잘 돌아가는 것을 알 수 있다. 문제는 &lt;b&gt;EC2&lt;/b&gt; 환경에서 서버를 가동하지 않아서 발생하는 것인데 사실 수정할 사항 없이 그냥 가동해도 된다. 다만 가동할 때마다 해당 &lt;b&gt;Excpeiton&lt;/b&gt;이 발생하는 것이 거슬린다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;logging.level.com.amazonaws.util.EC2MetadataUtils = error&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;application.properties에 위의 코드를 한 줄 적어주면 사라지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;참고한 사이트들&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1666857470692&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] S3를 Spring에서 사용하기 - 이미지 업로드&quot; data-og-description=&quot;[ 버킷 정책 설정 ] 버킷 정책 수정한다. 퍼블릭 엑세스 차단 해제를 하고, 버킷 정책을 설정하는 방법을 사용할 것이다. { &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;, &amp;quot;Statement&amp;quot;: [ { &amp;quot;Sid&amp;quot;: &amp;quot;PublicReadGetObject&amp;quot;, &amp;quot;Effect&amp;quot;:..&quot; data-og-host=&quot;doing7.tistory.com&quot; data-og-source-url=&quot;https://doing7.tistory.com/45&quot; data-og-url=&quot;https://doing7.tistory.com/45&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZaoY0/hyQlBJyrxN/DGv57vVjSGIQ8skauePoC1/img.png?width=800&amp;amp;height=572&amp;amp;face=0_0_800_572,https://scrap.kakaocdn.net/dn/foBfg/hyQlzZgndY/CyuTxkstVzP8A0xmgOsMo0/img.png?width=800&amp;amp;height=572&amp;amp;face=0_0_800_572,https://scrap.kakaocdn.net/dn/b1o2NL/hyQlx8fzoL/aupEizbxADmD9U5IeXKfjk/img.png?width=1073&amp;amp;height=768&amp;amp;face=0_0_1073_768&quot;&gt;&lt;a href=&quot;https://doing7.tistory.com/45&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://doing7.tistory.com/45&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZaoY0/hyQlBJyrxN/DGv57vVjSGIQ8skauePoC1/img.png?width=800&amp;amp;height=572&amp;amp;face=0_0_800_572,https://scrap.kakaocdn.net/dn/foBfg/hyQlzZgndY/CyuTxkstVzP8A0xmgOsMo0/img.png?width=800&amp;amp;height=572&amp;amp;face=0_0_800_572,https://scrap.kakaocdn.net/dn/b1o2NL/hyQlx8fzoL/aupEizbxADmD9U5IeXKfjk/img.png?width=1073&amp;amp;height=768&amp;amp;face=0_0_1073_768');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] S3를 Spring에서 사용하기 - 이미지 업로드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[ 버킷 정책 설정 ] 버킷 정책 수정한다. 퍼블릭 엑세스 차단 해제를 하고, 버킷 정책을 설정하는 방법을 사용할 것이다. { &quot;Version&quot;: &quot;2012-10-17&quot;, &quot;Statement&quot;: [ { &quot;Sid&quot;: &quot;PublicReadGetObject&quot;, &quot;Effect&quot;:..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;doing7.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1666857500146&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring Boot AWS S3 사진 업로드 하는 법&quot; data-og-description=&quot;Spring Boot S3 파일 업로드 하는 법 이번 글에서는 Spring으로 AWS S3에 파일 업로드 하는 글을 정리해보겠습니다.(기존에 썼던 글은 잘못되거나 부족한 점이 많아서 이번 기회에 다시 써서 정리해보려&quot; data-og-host=&quot;devlog-wjdrbs96.tistory.com&quot; data-og-source-url=&quot;https://devlog-wjdrbs96.tistory.com/323&quot; data-og-url=&quot;https://devlog-wjdrbs96.tistory.com/323&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g9Yxq/hyQmKrlFic/h5EAFr1r5YrCkLtIb8QZEk/img.png?width=780&amp;amp;height=330&amp;amp;face=0_0_780_330,https://scrap.kakaocdn.net/dn/cPg3vj/hyQmzXEtMB/OYklYu7KPN9hJSZrDDGpek/img.png?width=780&amp;amp;height=330&amp;amp;face=0_0_780_330,https://scrap.kakaocdn.net/dn/PpUbm/hyQlFyqMse/kSSETdxFkqWorm319sgYM1/img.png?width=2572&amp;amp;height=1300&amp;amp;face=0_0_2572_1300&quot;&gt;&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/323&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devlog-wjdrbs96.tistory.com/323&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g9Yxq/hyQmKrlFic/h5EAFr1r5YrCkLtIb8QZEk/img.png?width=780&amp;amp;height=330&amp;amp;face=0_0_780_330,https://scrap.kakaocdn.net/dn/cPg3vj/hyQmzXEtMB/OYklYu7KPN9hJSZrDDGpek/img.png?width=780&amp;amp;height=330&amp;amp;face=0_0_780_330,https://scrap.kakaocdn.net/dn/PpUbm/hyQlFyqMse/kSSETdxFkqWorm319sgYM1/img.png?width=2572&amp;amp;height=1300&amp;amp;face=0_0_2572_1300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] Spring Boot AWS S3 사진 업로드 하는 법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot S3 파일 업로드 하는 법 이번 글에서는 Spring으로 AWS S3에 파일 업로드 하는 글을 정리해보겠습니다.(기존에 썼던 글은 잘못되거나 부족한 점이 많아서 이번 기회에 다시 써서 정리해보려&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devlog-wjdrbs96.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1666857506902&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS]   S3 개념 정리 &amp;amp; 버킷 생성 &amp;middot; 권한(Policy / ACL) 설정하기&quot; data-og-description=&quot;S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는&amp;nbsp;온라인 오브젝트(객체)&amp;nbsp;스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) &quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; data-og-url=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ye44o/hyQmExTxUk/Cif1yUC06SgptkgQ6QtIZK/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/brY5ul/hyQmFXR09J/j0IQuEGu2jeCbqrTeZTjz1/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/jbBy4/hyQls6UmOe/7AJKLdEPKYsO7bzkw1NCuK/img.png?width=1280&amp;amp;height=1024&amp;amp;face=0_0_1280_1024&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; data-source-url=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ye44o/hyQmExTxUk/Cif1yUC06SgptkgQ6QtIZK/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/brY5ul/hyQmFXR09J/j0IQuEGu2jeCbqrTeZTjz1/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/jbBy4/hyQls6UmOe/7AJKLdEPKYsO7bzkw1NCuK/img.png?width=1280&amp;amp;height=1024&amp;amp;face=0_0_1280_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS]   S3 개념 정리 &amp;amp; 버킷 생성 &amp;middot; 권한(Policy / ACL) 설정하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는&amp;nbsp;온라인 오브젝트(객체)&amp;nbsp;스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1666857553917&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Failed to connect to service endpoint (Warning) 해결&quot; data-og-description=&quot;spring-cloud-aws 를 이용한 프로젝트를 로컬에서 실행시킬때 Application 자체는 잘 뜨는데 이런 Warning이 날 때가 있다. com.amazonaws.SdkClientException: Failed to connect to service endpoint Caused by:..&quot; data-og-host=&quot;lannstark.tistory.com&quot; data-og-source-url=&quot;https://lannstark.tistory.com/71&quot; data-og-url=&quot;https://lannstark.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEzLMr/hyQlxtC2PX/xQE54xA14oufTkc3oyNqj0/img.png?width=800&amp;amp;height=567&amp;amp;face=0_0_800_567,https://scrap.kakaocdn.net/dn/bxX4xz/hyQlB3Q34c/VNETMLloEV81c2QIQOsgb0/img.png?width=800&amp;amp;height=567&amp;amp;face=0_0_800_567,https://scrap.kakaocdn.net/dn/A8MFx/hyQmx6BhGj/29FZJbZkeQiItEbHjH5pO0/img.jpg?width=846&amp;amp;height=972&amp;amp;face=0_0_846_972&quot;&gt;&lt;a href=&quot;https://lannstark.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lannstark.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEzLMr/hyQlxtC2PX/xQE54xA14oufTkc3oyNqj0/img.png?width=800&amp;amp;height=567&amp;amp;face=0_0_800_567,https://scrap.kakaocdn.net/dn/bxX4xz/hyQlB3Q34c/VNETMLloEV81c2QIQOsgb0/img.png?width=800&amp;amp;height=567&amp;amp;face=0_0_800_567,https://scrap.kakaocdn.net/dn/A8MFx/hyQmx6BhGj/29FZJbZkeQiItEbHjH5pO0/img.jpg?width=846&amp;amp;height=972&amp;amp;face=0_0_846_972');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Failed to connect to service endpoint (Warning) 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;spring-cloud-aws 를 이용한 프로젝트를 로컬에서 실행시킬때 Application 자체는 잘 뜨는데 이런 Warning이 날 때가 있다. com.amazonaws.SdkClientException: Failed to connect to service endpoint Caused by:..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lannstark.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/31</guid>
      <comments>https://dev-chw.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 27 Oct 2022 17:03:17 +0900</pubDate>
    </item>
    <item>
      <title>[ SpringSecurity + JWT + Redis ] Redis와 JWT를 이용한 로그아웃 구현하기  &amp;zwj; </title>
      <link>https://dev-chw.tistory.com/30</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beAFe9/btrPfmAR3bt/k7ODVCVCHdgM2C0pbiZ2Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beAFe9/btrPfmAR3bt/k7ODVCVCHdgM2C0pbiZ2Zk/img.png&quot; data-alt=&quot;로그아웃의 핵심&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beAFe9/btrPfmAR3bt/k7ODVCVCHdgM2C0pbiZ2Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeAFe9%2FbtrPfmAR3bt%2Fk7ODVCVCHdgM2C0pbiZ2Zk%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;430&quot; height=&quot;215&quot; data-filename=&quot;redis.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그아웃의 핵심&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;이제 마지막 편인, 로그아웃 서비스를 구현해보도록 하겠다. 저번 편에서 로그인을 할 때 redis를 사용해 RefreshToken을 저장해두었던 이유는 결국 로그아웃 처리를 위해 했다고 생각하면 된다. JWT 특성상 한번 발급된 토큰은 삭제/수정이 불가능하기 때문에 인메모리 데이터를 이용해 빠르고 효율적으로 로그아웃 처리를 할 수 있게 만들었다고 생각하면 된다. 이번 편에서 해볼 거는 로그아웃을 했을 때 동작되는 로직과 Filter에서 어떻게 처리되는지 확인해볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;*** 로그아웃 로직 ***&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 헤더에서 발급되어있는 JWT 토큰을 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 발급되어있는 JWT 토큰의 시간을 가져오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. SecurityContextHolder에 등록되어있는 정보에서 email을 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 로그인할 때 key(email) : value(RefreshToken) 형식으로 저장했기 때문에 가져온 email(key)로 redis에 value가 존재하는지 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 존재한다면 redis에 저장되어있는 RefreshToken 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. [ 블랙리스트 생성 단계 ] redis에 가져온 key(JWT 토큰) : value(&quot;logout&quot;)으로 저장&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Filter에서 redis에 요청받은 토큰이 존재하는지 체크 -&amp;gt; 있다면 Exception 발생&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-22 오후 3.11.56.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfbcOu/btrPgDBDEH2/TqKZr3wq9oh5vFz90kyZqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfbcOu/btrPgDBDEH2/TqKZr3wq9oh5vFz90kyZqK/img.png&quot; data-alt=&quot;로그아웃 Service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfbcOu/btrPgDBDEH2/TqKZr3wq9oh5vFz90kyZqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfbcOu%2FbtrPgDBDEH2%2FTqKZr3wq9oh5vFz90kyZqK%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;675&quot; height=&quot;288&quot; data-filename=&quot;스크린샷 2022-10-22 오후 3.11.56.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그아웃 Service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Service&lt;/b&gt;에서는 크게 어려울 건 없다. 헤더를 통해 &lt;b&gt;auth&lt;/b&gt;에 토큰 정보를 담아서 불필요한 값을 지운 후 &lt;b&gt;atk&lt;/b&gt;에 담아주었다. &lt;b&gt;expiration&lt;/b&gt;에 &lt;b&gt;atk&lt;/b&gt;의 남은 유효시간을 가져오기 위해 메서드를 &lt;b&gt;TokenProvider&lt;/b&gt;에 만들어주었는데 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;public Long getExpiration(String accessToken) {
    // accessToken 남은 유효시간
    Date expiration = Jwts.parserBuilder()
            .setSigningKey(key)
            .build()
            .parseClaimsJws(accessToken)
            .getBody()
            .getExpiration();
    // 현재 시간
    Long now = new Date().getTime();
    return (expiration.getTime() - now);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 &lt;b&gt;SecurityContextHolder&lt;/b&gt;에 등록되어있는 유저 정보를 가져와 이메일을 담아주고 &lt;b&gt;redis&lt;/b&gt;에 해당 이메일로 키값이 설정된 &lt;b&gt;value&lt;/b&gt;값 &lt;b&gt;RefreshToken&lt;/b&gt;이 존재하는지 확인해주고 있다면 삭제해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 현재 가져온 AccessToken(&lt;b&gt;key&lt;/b&gt;)을 &lt;b&gt;redis&lt;/b&gt;에 &quot;logout&quot;(&lt;b&gt;value&lt;/b&gt;)로 설정해주고 , 남은 유효시간만큼 저장해주면서 일종의 블랙리스트를 작성해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &lt;b&gt;Filter&lt;/b&gt;에서 로그아웃이 된 사용자들을 어떻게 검증되는지 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-22 오후 3.32.27.png&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q3dzw/btrPjHiJZCO/82vPar68BtBqNqWIiyj8j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q3dzw/btrPjHiJZCO/82vPar68BtBqNqWIiyj8j1/img.png&quot; data-alt=&quot;doFilter&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q3dzw/btrPjHiJZCO/82vPar68BtBqNqWIiyj8j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq3dzw%2FbtrPjHiJZCO%2F82vPar68BtBqNqWIiyj8j1%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;609&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2022-10-22 오후 3.32.27.png&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;doFilter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GenericFilterBean&lt;/b&gt;을 상속 받은 클래스에서 &lt;b&gt;Override&lt;/b&gt; 받은 &lt;b&gt;doFilter&lt;/b&gt;에서 추가적으로 구현해주었다. &lt;b&gt;jwt&lt;/b&gt;가 정상적으로 헤더에 들어가 있을 경우에 &lt;b&gt;redis&lt;/b&gt;에서 해당 토큰이 &lt;b&gt;getValues&lt;/b&gt;를 통해 블랙리스트에 등록되어있는지 확인해주는 코드가 추가되었다. 토큰이 &lt;b&gt;redis&lt;/b&gt;에 저장되어있는 경우는 블랙리스트이기 때문에 존재하지 않아야 정상적으로 로그인 정보를 등록할 것 이기 때문에 null 인 경우에만 정상적으로 &lt;b&gt;SecurityContextHolder&lt;/b&gt;에 &lt;b&gt;authentication&lt;/b&gt;을 등록해줄 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 &lt;b&gt;redis&lt;/b&gt;에 &lt;b&gt;token&lt;/b&gt;값이 존재한다면(블랙리스트에 토큰이 저장되어있다면) &lt;span style=&quot;color: #000000;&quot;&gt;인증되지 않은 사용자가 인증이 필요한 리소스에 액세스 하려고 하여 예외가 &lt;b&gt;throw&lt;/b&gt; 되기 때문에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;AuthenticationEntryPoint&lt;/b&gt;를 불러온&amp;nbsp;&lt;/span&gt;&lt;b&gt;JwtAuthenticationEntryPoint&lt;/b&gt; 클래스에서 &lt;b&gt;commence&lt;/b&gt; 메서드를 호출하게된다. 해당 메소드를 커스텀해서 클라이언트에게 &lt;b&gt;Jwt&lt;/b&gt;가 만료되었다는 메시지와 상태 코드를 보내주도록 하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입부터 로그인, 로그아웃까지 전부 살펴보았다. 이 3가지 서비스만 잘 만들어보다 보안과 핵심적인 로직들을 잘 만들었다고 볼 수 있기 때문에 어느 프로젝트를 개발할 때 가장 까다로워질 수 있는 부분이다. 열심히 공부해서 더 보안성을 높이고 좋은 회원관리 시스템을 만들어보자  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/30</guid>
      <comments>https://dev-chw.tistory.com/30#entry30comment</comments>
      <pubDate>Sat, 22 Oct 2022 15:50:59 +0900</pubDate>
    </item>
    <item>
      <title>[ SpringSecurity + JWT + Redis ] 로그인과 RefreshToken을 이용한 AccessToken 재발급편  &amp;zwj; </title>
      <link>https://dev-chw.tistory.com/29</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jwt.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4YtDF/btrPewannOL/wlpKFn6KRJFUgPZqa1eZA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4YtDF/btrPewannOL/wlpKFn6KRJFUgPZqa1eZA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4YtDF/btrPewannOL/wlpKFn6KRJFUgPZqa1eZA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4YtDF%2FbtrPewannOL%2FwlpKFn6KRJFUgPZqa1eZA1%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;462&quot; height=&quot;225&quot; data-filename=&quot;jwt.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 &lt;b&gt;로그인&lt;/b&gt;과 &lt;b&gt;토큰 재발급&lt;/b&gt;을 나눠서 진행하려 했는데, 로그인 API가 사실 회원가입과 크게 다를 부분이 없어서 한꺼번에 다루기로 했다. 회원가입에서 save만 빠지면 사실상 로그인이기 때문에 복습 겸 다뤄보도록 하자. 회원가입 편을 보고 온다면 이해가 더 빠를 것 이기 때문에 한번 보고 오는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1666325541864&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ SpringSecurity + JWT + Redis ] 회원가입편&quot; data-og-description=&quot;개발하던 프로젝트에서 사용자의 계정의 권한과 인증에 대해서 처리를 할 때 항상 SpringSecurity와 JWT만을 이용했었는데 그러다 보니 로그아웃을 한다거나 AccessToken을 만료하기위해 직접 DB에 토큰&quot; data-og-host=&quot;dev-chw.tistory.com&quot; data-og-source-url=&quot;https://dev-chw.tistory.com/28&quot; data-og-url=&quot;https://dev-chw.tistory.com/28&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jM23A/hyQbD0FoWy/WKL8jZkfrSHWfPIeY1epN1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/IjQGb/hyQbuQbXWX/k8yd79b2dh0hNtAZUqVfM0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bryvg0/hyQaBvnsCg/tkwjShCIv6z0k3mzrqHDKk/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900&quot;&gt;&lt;a href=&quot;https://dev-chw.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-chw.tistory.com/28&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jM23A/hyQbD0FoWy/WKL8jZkfrSHWfPIeY1epN1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/IjQGb/hyQbuQbXWX/k8yd79b2dh0hNtAZUqVfM0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bryvg0/hyQaBvnsCg/tkwjShCIv6z0k3mzrqHDKk/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ SpringSecurity + JWT + Redis ] 회원가입편&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발하던 프로젝트에서 사용자의 계정의 권한과 인증에 대해서 처리를 할 때 항상 SpringSecurity와 JWT만을 이용했었는데 그러다 보니 로그아웃을 한다거나 AccessToken을 만료하기위해 직접 DB에 토큰&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-chw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인은 크게 다룰 부분이 없기때문에 빠르게 보도록 하자.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Service&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-21 오후 1.12.56.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Cb7S/btrPezdTINi/dqCAIQZnNl51wCK3c8svq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Cb7S/btrPezdTINi/dqCAIQZnNl51wCK3c8svq0/img.png&quot; data-alt=&quot;zService&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Cb7S/btrPezdTINi/dqCAIQZnNl51wCK3c8svq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Cb7S%2FbtrPezdTINi%2FdqCAIQZnNl51wCK3c8svq0%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;307&quot; data-filename=&quot;스크린샷 2022-10-21 오후 1.12.56.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;zService&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입할때에도 가입이 완료 후 &lt;b&gt;JWT&lt;/b&gt;를 발급해주었기 때문에 코드가 매우 비슷하다. 로그인 부분에서는 &lt;b&gt;Validate&lt;/b&gt;를 구현을 해놓았었는데 이 부분을 살펴보면&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;private void LOGIN_VALIDATE(UserDto.login request) {
    userRepository.findByEmail(request.getEmail())
            .orElseThrow(
                    () -&amp;gt; new CustomException(LOGIN_FALSE)
            );

    if (!passwordEncoder.matches(
            request.getPw(),
            userRepository.findByEmail(request.getEmail())
                    .orElseThrow(
                            () -&amp;gt; new CustomException(LOGIN_FALSE)
                    ).getPw())
    ) {
        throw new CustomException(LOGIN_FALSE);
    }
}&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;요청된 정보를 서비스 로직이 실행 전 가장 먼저 검증 단계를 거치는데, 서버의 DB에 해당 이메일이 존재하는지 여부를 먼저 살피고 없다면 CustomException을 통해 로그인 실패 코드를 보내준다. &lt;b&gt;CustomeException&lt;/b&gt;에 궁금하다면 아래 글을 읽어보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1666325785171&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;예외 처리 _ Custom Exception 만들기&quot; data-og-description=&quot;개발을 하다보면 정말 수많은 Exception을 만나게 된다. 그러면 우리는 항상 구글링을 통해, 또는 코드를 뒤적뒤적하다가 Exception을 해결하곤 한다. 근데 이러한 Exception을 사용자가 마주했다면? 그&quot; data-og-host=&quot;dev-chw.tistory.com&quot; data-og-source-url=&quot;https://dev-chw.tistory.com/15?category=1078615&quot; data-og-url=&quot;https://dev-chw.tistory.com/15&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HkalR/hyQbwgbfU3/Y1oxK6nsLelSVENuc4Apa1/img.png?width=586&amp;amp;height=519&amp;amp;face=0_0_586_519,https://scrap.kakaocdn.net/dn/brlWNz/hyQavaSaap/phhToUjEYOFG5X1sKKCkK0/img.png?width=586&amp;amp;height=519&amp;amp;face=0_0_586_519,https://scrap.kakaocdn.net/dn/czW9BD/hyQavaSaiZ/Xk0R8E05LEqtrmYdet2Ebk/img.png?width=1246&amp;amp;height=846&amp;amp;face=0_0_1246_846&quot;&gt;&lt;a href=&quot;https://dev-chw.tistory.com/15?category=1078615&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-chw.tistory.com/15?category=1078615&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HkalR/hyQbwgbfU3/Y1oxK6nsLelSVENuc4Apa1/img.png?width=586&amp;amp;height=519&amp;amp;face=0_0_586_519,https://scrap.kakaocdn.net/dn/brlWNz/hyQavaSaap/phhToUjEYOFG5X1sKKCkK0/img.png?width=586&amp;amp;height=519&amp;amp;face=0_0_586_519,https://scrap.kakaocdn.net/dn/czW9BD/hyQavaSaiZ/Xk0R8E05LEqtrmYdet2Ebk/img.png?width=1246&amp;amp;height=846&amp;amp;face=0_0_1246_846');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;예외 처리 _ Custom Exception 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발을 하다보면 정말 수많은 Exception을 만나게 된다. 그러면 우리는 항상 구글링을 통해, 또는 코드를 뒤적뒤적하다가 Exception을 해결하곤 한다. 근데 이러한 Exception을 사용자가 마주했다면? 그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-chw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이메일이 존재하다면 &lt;b&gt;PasswordEncoder&lt;/b&gt;에서 지원하는 &lt;b&gt;matches&lt;/b&gt;를 통해 현재 요청받은 비밀번호와 DB에 저장되어있는 암호화된 비밀번호가 동일한지에 대해서 검증을 하게되며 이 또한 동일하지 않는다면 &lt;b&gt;CustomException&lt;/b&gt;이 발생하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도의 간단한 &lt;b&gt;Validation&lt;/b&gt;을 구현하였고 만약 프로젝트를 진행 중이라면 해당 보안에 맞게 더 많은 검증을 구현하면 된다. 검증이 완료되었다면 회원가입 때와 마찬가지로 유저의 아이디와 비밀번호로 &lt;b&gt;authentication&lt;/b&gt;을 만들어주고 &lt;b&gt;SecurityContextHolder&lt;/b&gt;에 등록해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;AccessToken&lt;/b&gt;과 &lt;b&gt;RefreshToken&lt;/b&gt;을 발급해주는데 자세한 사항은 회원가입편을 참고하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 유저의 이메일과 &lt;b&gt;RefreshToken&lt;/b&gt;을 가지고 지속시간을 14일로 설정 후 &lt;b&gt;Redis&lt;/b&gt;에 저장해준다. 여기서 &lt;b&gt;Response&lt;/b&gt;는 &lt;b&gt;HttpStatus.Ok&lt;/b&gt;로 보내주었는데 이는 200 코드를 보내준다는 의미이다. &lt;b&gt;회원가입의 경우 201&lt;/b&gt;(Create)였는데 각각의 상태에 맞게 성공 시 코드도 구분하는 것이 좋다 해서 나누게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부족한 설명은 회원가입편에서 돌아보고 로그인 구현에 대한 설명은 여기서 마치겠다. 이제 &lt;b&gt;RefreshToken&lt;/b&gt;을 이용해 &lt;b&gt;AccessToken&lt;/b&gt;을 &lt;b&gt;재발급 하는 API&lt;/b&gt;를 살펴보자 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-21 오후 1.24.28.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnFv6k/btrPbuEKcpi/DkbHcXYGSgjYYjKFeDUNlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnFv6k/btrPbuEKcpi/DkbHcXYGSgjYYjKFeDUNlk/img.png&quot; data-alt=&quot;accessToken 재발급 API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnFv6k/btrPbuEKcpi/DkbHcXYGSgjYYjKFeDUNlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnFv6k%2FbtrPbuEKcpi%2FDkbHcXYGSgjYYjKFeDUNlk%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;306&quot; data-filename=&quot;스크린샷 2022-10-21 오후 1.24.28.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;accessToken 재발급 API&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;size18&quot;&gt;&lt;b&gt;*** 재발급 로직 ***&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;refreshToken&lt;/b&gt;에서 사용자의 이메일을 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 사용자의 이메일을 이용해 &lt;b&gt;redis&lt;/b&gt;에서 해당 유저의 &lt;b&gt;RefreshToken&lt;/b&gt;을 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 가져온 &lt;b&gt;RefreshToken&lt;/b&gt;이 &lt;b&gt;null&lt;/b&gt; 이거나, &lt;b&gt;redis&lt;/b&gt;에 저장된 &lt;b&gt;RefreshToken&lt;/b&gt;과 요청받은 &lt;b&gt;RefreshToken&lt;/b&gt;이 다른 경우 &lt;b&gt;throw&lt;/b&gt;를 던짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 검증을 통과했다면 새로운 &lt;b&gt;AccessToken&lt;/b&gt; 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;accessToken&lt;/b&gt;을 재발급하는 &lt;b&gt;API&lt;/b&gt;는 사실 별거 없다. &lt;b&gt;username에&lt;/b&gt; 권한 정보를 담지 않은 &lt;b&gt;RefreshToken&lt;/b&gt;에서 사용자의 이메일을 담고 rtkInRedis에 &lt;b&gt;redisDao.getvalues&lt;/b&gt;를 통해 해당 유저가 가지고 있는 &lt;b&gt;RefreshToken&lt;/b&gt;을 가져온다. 저번 편에서 설명했듯이 redis를 Spring에서 사용하는 방법은 여러 가지가 있기 때문에 접근하는 법에 있어서는 개발자가 편한 데로 하면 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rtkInRedis에 담은 정보를 토대로 검증을 진행하는데 &lt;b&gt;null&lt;/b&gt;이거나 &lt;b&gt;redis&lt;/b&gt;에 저장된 &lt;b&gt;RefreshToken&lt;/b&gt;과 사용자가 요청한 &lt;b&gt;RefreshToken&lt;/b&gt;이&amp;nbsp;다른 경우 throw를 던지며 410 상태 코드를 보내준다, 다만 에러코드의 경우 개발자와 클라이언트가 조율해서 더 나은 상태 코드로 구현하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검증을 통과한 경우 return에서 새로운 &lt;b&gt;AccessToken&lt;/b&gt;을 재발급해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-21 오후 1.33.31.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVQRG8/btrPevv1Hqx/EiNEmW35FOkSRe3a4Zctz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVQRG8/btrPevv1Hqx/EiNEmW35FOkSRe3a4Zctz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVQRG8/btrPevv1Hqx/EiNEmW35FOkSRe3a4Zctz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVQRG8%2FbtrPevv1Hqx%2FEiNEmW35FOkSRe3a4Zctz0%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;455&quot; height=&quot;112&quot; data-filename=&quot;스크린샷 2022-10-21 오후 1.33.31.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RefreshToken&lt;/b&gt;의 경우 헤더로 요청받게끔 넘겼으며 요청받은 정보를 바로 &lt;b&gt;Service&lt;/b&gt;로 &lt;b&gt;return&lt;/b&gt; 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는 로그아웃 API와 로그아웃이 된 상태를 알아보기 위해 간단한 정보 조회 API를 개발해볼 것이다. 로그아웃을 위해 atk의 블랙리스트를 구현하고 rtk를 삭제하는 로직, Jwt의 Filter에서는 어떻게 처리하는지 알아보도록 하자!&lt;/p&gt;</description>
      <category>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/29</guid>
      <comments>https://dev-chw.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 21 Oct 2022 13:39:08 +0900</pubDate>
    </item>
    <item>
      <title>[ SpringSecurity + JWT + Redis ] 회원가입편</title>
      <link>https://dev-chw.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;security.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OtfJU/btrOQDiKFlE/VeDbVVt5z7BKo1oDsWrep1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OtfJU/btrOQDiKFlE/VeDbVVt5z7BKo1oDsWrep1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OtfJU/btrOQDiKFlE/VeDbVVt5z7BKo1oDsWrep1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOtfJU%2FbtrOQDiKFlE%2FVeDbVVt5z7BKo1oDsWrep1%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;270&quot; height=&quot;270&quot; data-filename=&quot;security.png&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;개발하던 프로젝트에서 사용자의 계정의 권한과 인증에 대해서 처리를 할 때 항상 &lt;b&gt;SpringSecurity&lt;/b&gt;와 &lt;b&gt;JWT&lt;/b&gt;만을 이용했었는데 그러다 보니 로그아웃을 한다거나 &lt;b&gt;AccessToken&lt;/b&gt;을 만료하기위해 직접 DB에 토큰을 넣는 방식을 썼는데, 시스템적 손해가 크기 때문에 잘못된 방법이기도 했다. 또한 &lt;b&gt;RefreshToken&lt;/b&gt;을 발급하는 과정또한 존재하지 않았기 때문에 제대로 된 로그인 시스템을 구축했다고 보기 어려웠다. 그러다 보니 사용자의 계정을 인증하는 방법에 대해서 다시 공부를 하였고 제대로 된 로직을 설계하고 다시 한번 회원가입, 로그인, 토큰 재발급, 로그아웃의 서비스들을 개발했으며 개발한 코드의 이해력을 높이기 위해 글을 작성하려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 &lt;b&gt;회원가입 / 로그인 / 토큰 재발급 / 로그아웃만&lt;/b&gt; 하더라도 꽤나 복잡하다, 물론 계정에 대한 보안과 밀접한 관련이 있기 때문에 더 복잡하겠지만 양이 생각보다 많아서 여러 편으로 나눠서 글을 작성할 예정이다. 그래서 오늘은 회원가입 로직에 대해서 작성해보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그전에 &lt;b&gt;AccessToken&lt;/b&gt;과 &lt;b&gt;RefreshToken&lt;/b&gt;에 대한 선수 개념이 부족하다면 아래 사이트를 참고해 개념과 왜 사용하는지에 대해 이해를 하는 것이 중요하다.&lt;/p&gt;
&lt;figure id=&quot;og_1666276826824&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[WEB]   Access Token &amp;amp; Refresh Token 원리 (feat. JWT)&quot; data-og-description=&quot;Access Token과 Refresh Token 이번 포스팅에서는 기본 JWT 방식의 인증(보안) 강화 방식인 Access Token &amp;amp; Refresh Token 인증 방식에 대해 알아보겠다. 먼저 JWT(Json Web Token) 에 대해 잘 모르는 독자들은..&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT&quot; data-og-url=&quot;https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c0MQ42/hyQazD0i0D/gQpnP3KSWjsI9F6fBAkTK1/img.jpg?width=800&amp;amp;height=494&amp;amp;face=0_0_800_494,https://scrap.kakaocdn.net/dn/cYh1Kq/hyQbD0kPbB/ac94JLt6ISxqtOhoukkti0/img.jpg?width=800&amp;amp;height=494&amp;amp;face=0_0_800_494,https://scrap.kakaocdn.net/dn/dFeEIL/hyQasSqMBr/pqYWKfChsysiMUkHMWlkWk/img.jpg?width=1100&amp;amp;height=680&amp;amp;face=0_0_1100_680&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c0MQ42/hyQazD0i0D/gQpnP3KSWjsI9F6fBAkTK1/img.jpg?width=800&amp;amp;height=494&amp;amp;face=0_0_800_494,https://scrap.kakaocdn.net/dn/cYh1Kq/hyQbD0kPbB/ac94JLt6ISxqtOhoukkti0/img.jpg?width=800&amp;amp;height=494&amp;amp;face=0_0_800_494,https://scrap.kakaocdn.net/dn/dFeEIL/hyQasSqMBr/pqYWKfChsysiMUkHMWlkWk/img.jpg?width=1100&amp;amp;height=680&amp;amp;face=0_0_1100_680');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[WEB]   Access Token &amp;amp; Refresh Token 원리 (feat. JWT)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Access Token과 Refresh Token 이번 포스팅에서는 기본 JWT 방식의 인증(보안) 강화 방식인 Access Token &amp;amp; Refresh Token 인증 방식에 대해 알아보겠다. 먼저 JWT(Json Web Token) 에 대해 잘 모르는 독자들은..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;*** 이 글은 JWT에 대한 기초지식이 필요합니다 ***&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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-filename=&quot;스크린샷 2022-10-20 오후 7.39.17.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7dVkt/btrO6Nld0ZN/PCoxjGK3OoLRm2Oi0CrOW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7dVkt/btrO6Nld0ZN/PCoxjGK3OoLRm2Oi0CrOW0/img.png&quot; data-alt=&quot;패키지 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7dVkt/btrO6Nld0ZN/PCoxjGK3OoLRm2Oi0CrOW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7dVkt%2FbtrO6Nld0ZN%2FPCoxjGK3OoLRm2Oi0CrOW0%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;343&quot; data-filename=&quot;스크린샷 2022-10-20 오후 7.39.17.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;패키지 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** &lt;b&gt;회원가입 로직&lt;/b&gt; ***&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 서버에서 사용의 닉네임, 이메일, 비밀번호를 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 요청받은 값과 유저 권한을 설정해 DB에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 유저의 이메일과 비밀번호를 이용해 Authentication에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. SeucurityContextHolder에 Authentication을 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Authentication의 담긴 정보를 통해 AccessToken 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 권한 정보가 담아져있지 않은 RefreshToken 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Redis를 이용해 [ 사용자의 이메일 : RefreshToken ] 형태로 인메모리 데이터에 저장&lt;/p&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;위의 로직을 토대로 회원가입 서비스를 개발하는데 다만 SpringSecurity의 Filter와 Jwt 관련 Config 클래스는 양이 워낙 많은 관계로 생략하고 서비스 위주의 코드를 살펴보도록 하겠다.&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-filename=&quot;스크린샷 2022-10-20 오후 8.13.01.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKneN/btrO9PbfKmX/9vM61ePhAZ77EF8oEJCQW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKneN/btrO9PbfKmX/9vM61ePhAZ77EF8oEJCQW0/img.png&quot; data-alt=&quot;Config 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKneN/btrO9PbfKmX/9vM61ePhAZ77EF8oEJCQW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKneN%2FbtrO9PbfKmX%2F9vM61ePhAZ77EF8oEJCQW0%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;226&quot; height=&quot;347&quot; data-filename=&quot;스크린샷 2022-10-20 오후 8.13.01.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Config 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jwt와 기타 Config는 위의 패키지 구조로 대체하며, 이 정도가 들어갔다 정도만 글에 작성하겠다,, 다만 서비스 로직에서 중요하게 여겨지는 부분은 다루도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Service&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-20 오후 8.14.49.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SvI1M/btrPa97vpOR/q3dwydBqx4nmTKQaYjsL11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SvI1M/btrPa97vpOR/q3dwydBqx4nmTKQaYjsL11/img.png&quot; data-alt=&quot;Service에서 회원가입 로직&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SvI1M/btrPa97vpOR/q3dwydBqx4nmTKQaYjsL11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSvI1M%2FbtrPa97vpOR%2Fq3dwydBqx4nmTKQaYjsL11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2022-10-20 오후 8.14.49.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Service에서 회원가입 로직&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 미리 서술해둔 회원가입 로직을 토대로 짜인 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA를 이용해 사용자의 데이터를 저장해주었는데, 이때 &lt;b&gt;authorities&lt;/b&gt;에 유저의 권한을 저장해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후 authentication에 사용자의 이메일과 비밀번호를 저장하고 &lt;b&gt;authentication&lt;/b&gt;을 &lt;b&gt;SecurityContextHolder&lt;/b&gt;에 저장해주었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;tokenProvider.createToken(authentication)&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public String createToken(Authentication authentication) {
    String authorities = authentication.getAuthorities().stream()
            .map(GrantedAuthority::getAuthority)
            .collect(Collectors.joining(&quot;,&quot;));

    long now = (new Date()).getTime();
    Date validity = new Date(now + this.tokenValidityInMilliseconds);

    return Jwts.builder()
            .setSubject(authentication.getName())
            .claim(AUTHORITIES_KEY, authorities)
            .signWith(key, SignatureAlgorithm.HS512)
            .setExpiration(validity)
            .compact();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TokenProvider&lt;/b&gt;의 &lt;b&gt;createToke&lt;/b&gt;을 통해 &lt;b&gt;AccessToken&lt;/b&gt;을 생성해주었으며 이는 권한 정보와 사용자의 정보 / 토큰의 유효시간 등을 설정해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;tokenProvider.createRefreshToken(request.getEmail())&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;public String createRefreshToken(String username) {
    long now = (new Date()).getTime();
    Date validity = new Date(now + this.refreshTokenValidityInMilliseconds);
    return Jwts.builder()
            .setSubject(username)
            .setExpiration(validity)
            .signWith(key, SignatureAlgorithm.HS512)
            .compact();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;refreshToken&lt;/b&gt;의 경우 사용자의 권한 정보를 담지 않고 생성해주었으며 유효시간을 길게 잡아주었다. 토큰을 생성하면서 헷갈렸던 점은 &lt;b&gt;setExpiration&lt;/b&gt;의 경우 &lt;b&gt;밀리 세컨드로 저장&lt;/b&gt;해주어야 하기 때문에 시간 변환을 꼭 해주도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 &lt;b&gt;redisDao를&lt;/b&gt; 통해서 유저의 이메일을 &lt;b&gt;key&lt;/b&gt;값으로 지정하여 &lt;b&gt;value&lt;/b&gt;값을 &lt;b&gt;refreshToken&lt;/b&gt;으로 저장 후 14일 동안 지속되게끔 만들어주었다. &lt;b&gt;Spring&lt;/b&gt;에서 &lt;b&gt;redis&lt;/b&gt;를 사용하는 방법은 여러 가지가 있기 때문에 개발자가 편한 대로 &lt;b&gt;redis&lt;/b&gt;를 이용하여 값을 저장하면 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장된 &lt;b&gt;refreshToken&lt;/b&gt;을 통해 추후 &lt;b&gt;AccessToken&lt;/b&gt; 재발급을 해야 할 때 검증을 할 것 이기 때문에 필수로 거쳐야 하는 로직이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 &lt;b&gt;Validation&lt;/b&gt;의 검증을 위해 간단하게 회원정보를 읽어오는 &lt;b&gt;Service&lt;/b&gt;를 개발할 것인데 이때 &lt;b&gt;AccessToken&lt;/b&gt;을 통해 사용자의 인증 상태를 확인하는 로직을 확인해보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/28</guid>
      <comments>https://dev-chw.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 20 Oct 2022 23:41:13 +0900</pubDate>
    </item>
    <item>
      <title>SpringBoot+AWS+RDS 서버 무중단 배포하기 -EC2편-</title>
      <link>https://dev-chw.tistory.com/27</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aws.jpeg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgkAXW/btrN39gGuna/71pGHpaFUQQk0lX4rln2n0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgkAXW/btrN39gGuna/71pGHpaFUQQk0lX4rln2n0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgkAXW/btrN39gGuna/71pGHpaFUQQk0lX4rln2n0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgkAXW%2FbtrN39gGuna%2F71pGHpaFUQQk0lX4rln2n0%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;440&quot; height=&quot;440&quot; data-filename=&quot;aws.jpeg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&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;figure id=&quot;og_1665131907773&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SpringBoot+AWS+RDS 서버 배포하기 -RDS편-&quot; data-og-description=&quot;개발을 하는 것도 좋지만 서버를 배포할 일이 생겼다. 처음에는 배포하는 게 뭐 그리 어렵겠냐 생각했는데 진짜 생각보다 많이 어렵다. 막상 배포를 끝내고 나니 생각보다 쉬운 것처럼 느끼지만&quot; data-og-host=&quot;dev-chw.tistory.com&quot; data-og-source-url=&quot;https://dev-chw.tistory.com/26&quot; data-og-url=&quot;https://dev-chw.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfXT9l/hyP3E6xYdA/G3cX0bKy6Gsou3hjEf0tE1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdu3al/hyP3zEbD1z/ywj7aeApjuRYBBSxkP3K70/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bV8P8O/hyP3w8wIB0/4hd1Ta8DQrCE36VKnnEm50/img.png?width=1566&amp;amp;height=1710&amp;amp;face=0_0_1566_1710&quot;&gt;&lt;a href=&quot;https://dev-chw.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-chw.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfXT9l/hyP3E6xYdA/G3cX0bKy6Gsou3hjEf0tE1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdu3al/hyP3zEbD1z/ywj7aeApjuRYBBSxkP3K70/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bV8P8O/hyP3w8wIB0/4hd1Ta8DQrCE36VKnnEm50/img.png?width=1566&amp;amp;height=1710&amp;amp;face=0_0_1566_1710');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SpringBoot+AWS+RDS 서버 배포하기 -RDS편-&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발을 하는 것도 좋지만 서버를 배포할 일이 생겼다. 처음에는 배포하는 게 뭐 그리 어렵겠냐 생각했는데 진짜 생각보다 많이 어렵다. 막상 배포를 끝내고 나니 생각보다 쉬운 것처럼 느끼지만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-chw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 글의 경우 RDS를 생성하였고 이제 SpringBoot에 연결 후 EC2를 사용해 배포해보도록 하자.&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-filename=&quot;edited_스크린샷 2022-10-07 오후 5.36.07.png&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zG6Xh/btrN39HMceC/wZTiiMA2IKkOZvcOH9qXKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zG6Xh/btrN39HMceC/wZTiiMA2IKkOZvcOH9qXKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zG6Xh/btrN39HMceC/wZTiiMA2IKkOZvcOH9qXKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzG6Xh%2FbtrN39HMceC%2FwZTiiMA2IKkOZvcOH9qXKK%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;2034&quot; height=&quot;172&quot; data-filename=&quot;edited_스크린샷 2022-10-07 오후 5.36.07.png&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;172&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;참고로 localhost자리에 엔드포인트 값만 넣어주면 바로 연동이 된다. 프로젝트에서 RDS가 연동이 잘 된 것을 확인했다면 바로 EC2에 배포를 시작해보자. RDS를 만드는 것보다 훨씬 간단하기 때문에 차근차근 따라온다면 어려울 게 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;준비사항&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. RDS가 연동된 프로젝트 준비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 준비된 프로젝트를 GitHub에 Push 해두기&lt;/p&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;위 준비사항이 완료되었다면 AWS EC2 인스턴스를 생성하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 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;AWS -&amp;gt; EC2로 들어가 인스턴스 시작을 눌러주면&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-filename=&quot;스크린샷 2022-10-07 오후 5.42.25.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vuVA5/btrN3sVD8CP/9ganxgVq1k3rWjasKLOoA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vuVA5/btrN3sVD8CP/9ganxgVq1k3rWjasKLOoA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vuVA5/btrN3sVD8CP/9ganxgVq1k3rWjasKLOoA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvuVA5%2FbtrN3sVD8CP%2F9ganxgVq1k3rWjasKLOoA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;640&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.42.25.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1712&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;위와 같이 인스턴스를 생성하는 페이지로 이동한다. 이름은 자신이 원하는 대로, 우리는 Amazon Linux를 사용한다 -&amp;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-filename=&quot;스크린샷 2022-10-07 오후 5.43.25.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PoQmO/btrN4amoi8S/yxSLzO2qWqi1kV00PAemmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PoQmO/btrN4amoi8S/yxSLzO2qWqi1kV00PAemmK/img.png&quot; data-alt=&quot; &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PoQmO/btrN4amoi8S/yxSLzO2qWqi1kV00PAemmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPoQmO%2FbtrN4amoi8S%2FyxSLzO2qWqi1kV00PAemmK%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;647&quot; height=&quot;329&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.43.25.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 유형은 기본값으로 두고 새 키 페어 생성을 해서 자신이 잘 보관해주자! 매우 중요한 파일이기 때문에 사라지면 곤란하다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 그룹은 저번 편에서 우리가 미리 생성해두었기 때문에 생성해두었던 보안 그룹을 선택하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에는 기본값으로 두고 인스턴스 생성!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.46.24.png&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9HHDz/btrN32ozzQW/OLAjxrja1iKASk2B8tQTBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9HHDz/btrN32ozzQW/OLAjxrja1iKASk2B8tQTBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9HHDz/btrN32ozzQW/OLAjxrja1iKASk2B8tQTBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9HHDz%2FbtrN32ozzQW%2FOLAjxrja1iKASk2B8tQTBk%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;208&quot; height=&quot;128&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.46.24.png&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;128&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;이제 우리는 터미널에서 생성한 AWS EC2 인스턴스로 접속해줄 것이다. (약간 컴퓨터 가동한다고 생각하자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1665132619863&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 권한을 pem 파일에 부여
chmod 600 ***.pem
// ssh 접속하기
ssh -i /Users/유저명/Desktop/testserver.pem ec2-user@{할당받은 public IP 주소}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로의 경우 mac이라면 pem 파일을 option+cmd+c 하면 경로 복사가 되니 참고하도록 하자.&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-filename=&quot;스크린샷 2022-10-07 오후 5.54.32.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQv1Ms/btrN3BZb3KK/kMnXYJdgfI6mckrVH0Lc7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQv1Ms/btrN3BZb3KK/kMnXYJdgfI6mckrVH0Lc7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQv1Ms/btrN3BZb3KK/kMnXYJdgfI6mckrVH0Lc7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQv1Ms%2FbtrN3BZb3KK%2FkMnXYJdgfI6mckrVH0Lc7k%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;496&quot; height=&quot;126&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.54.32.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;126&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;정상적으로 접속했을 시 터미널에 위와 같이 뜰 것이고 처음이기 때문에 가상의 컴퓨터에 git과 java를 설치하도록 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커맨드에서 $ 는 그냥 구분하려고 넣은 거니까 빼고 터미널에 적어주자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Git 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;$ sudo yum install -y git&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;$&lt;/span&gt;&amp;nbsp;git --version&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;2. java 설치 (17 버전 예시)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;자신이 진행한 프로젝트에 jdk 버전을 맞춰서 설치해주도록 하자.&lt;/span&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;$&lt;/span&gt;&amp;nbsp;wget &lt;a style=&quot;color: #000000;&quot; href=&quot;https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm&quot;&gt;https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;$&lt;/span&gt;&amp;nbsp;sudo rpm -ivh jdk-17_linux-x64_bin.rpm&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;$&lt;/span&gt;&amp;nbsp;sudo alternatives --config java&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #383a42;&quot;&gt;$&lt;/span&gt;&amp;nbsp;java -version&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;완료되었다면 push 해둔 프로젝트를 가져와야 하기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ mkdir {아무거나 폴더명}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ cd {만든 폴더}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ git clone {git 주소}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로 가져오자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가져왔다면 cd로 clone 한 프로젝트로 이동해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ sudo chmod 777./gradlew&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 통해 빌드 실행 권한을 주고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$./gradlew build&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력하여 프로젝트를 빌드해주면 되는데 생각보다 좀 걸리니 인내하도록 하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트 내에서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ cd build&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ cd libs&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ java -jar 자신의 프로젝트. jar&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와같이 libs 폴더로 이동한 다음 jar 파일을 실행해주면 서버가 가동되기때문에&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;배포까지 완료된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생각보다 어렵지 않기 때문에 RDS 부분만 잘 마무리된다면 EC2로 배포하는 과정은 쉽다!&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;## 추가내용 (서버 무중단배포)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;터미널을 종료하게되면 서버가 닫히는데 이를 방지하기 위해서 서버를 킬때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ nohup java -jar 자신의 프로젝트.jar &amp;amp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로 실행해주면 터미널을 닫아도 컴퓨터를 꺼도 절대로 서버가 꺼지지 않습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버를 종료하기 위해서는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ssh -i 로 자신의 EC2에 접속한 후&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ ps -ef&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 통해 프로세스를 조회한 후 백그라운드에서 돌아가고 있는 jar파일의 pid 번호를 확인하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$ kill -9 {pid번호}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령어를 입력하여 종료한다 !&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참조&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665133303485&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] Spring Boot 프로젝트를 AWS EC2 에 배포하기 (mac)&quot; data-og-description=&quot;Spring Boot 프로젝트를 AWS EC2 에 배포하기 프로젝트를 AWS EC2에 배포하기 위한 순서는 아래와 같다. Spring Boot 를 통해 프로젝트를 생성하기 (적어도 간단한 텍스트라도 출력되어야 좋음) Github / AWS &quot; data-og-host=&quot;rypro.tistory.com&quot; data-og-source-url=&quot;https://rypro.tistory.com/218#recentComments&quot; data-og-url=&quot;https://rypro.tistory.com/218&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wNu8s/hyP3HI1X8Y/jzJVkUN6BK8b1HKhmzkTFK/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300,https://scrap.kakaocdn.net/dn/qRRoL/hyP3yk1me3/lN3EQIBr3kEkkQSEo6hKlk/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300,https://scrap.kakaocdn.net/dn/cy9WEC/hyP3D0VGpu/rppOZlWss3ohjYrKnwLGX0/img.png?width=1919&amp;amp;height=773&amp;amp;face=0_0_1919_773&quot;&gt;&lt;a href=&quot;https://rypro.tistory.com/218#recentComments&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rypro.tistory.com/218#recentComments&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wNu8s/hyP3HI1X8Y/jzJVkUN6BK8b1HKhmzkTFK/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300,https://scrap.kakaocdn.net/dn/qRRoL/hyP3yk1me3/lN3EQIBr3kEkkQSEo6hKlk/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300,https://scrap.kakaocdn.net/dn/cy9WEC/hyP3D0VGpu/rppOZlWss3ohjYrKnwLGX0/img.png?width=1919&amp;amp;height=773&amp;amp;face=0_0_1919_773');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] Spring Boot 프로젝트를 AWS EC2 에 배포하기 (mac)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 프로젝트를 AWS EC2 에 배포하기 프로젝트를 AWS EC2에 배포하기 위한 순서는 아래와 같다. Spring Boot 를 통해 프로젝트를 생성하기 (적어도 간단한 텍스트라도 출력되어야 좋음) Github / AWS&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rypro.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/27</guid>
      <comments>https://dev-chw.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 7 Oct 2022 18:03:11 +0900</pubDate>
    </item>
    <item>
      <title>SpringBoot+AWS+RDS 서버 배포하기 -RDS편-</title>
      <link>https://dev-chw.tistory.com/26</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aws.jpeg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvH6HN/btrN338zR2K/CQ2kUg3VQKO5tGU9IyBBCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvH6HN/btrN338zR2K/CQ2kUg3VQKO5tGU9IyBBCk/img.jpg&quot; data-alt=&quot;넌 날 힘들게 만들었어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvH6HN/btrN338zR2K/CQ2kUg3VQKO5tGU9IyBBCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvH6HN%2FbtrN338zR2K%2FCQ2kUg3VQKO5tGU9IyBBCk%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;414&quot; height=&quot;414&quot; data-filename=&quot;aws.jpeg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;넌 날 힘들게 만들었어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하는 것도 좋지만 서버를 배포할 일이 생겼다. 처음에는 배포하는 게 뭐 그리 어렵겠냐 생각했는데 진짜 생각보다 많이 어렵다. 막상 배포를 끝내고 나니 생각보다 쉬운 것처럼 느끼지만 이리 치이고 저리 치였던 과거를 다 까먹고 이렇게 다시 착각을 불러일으킨다. 배포를 하기까지의 과정은 초보 개발자인 나한테는 상당히 까다로웠다. 로컬 서버 /&amp;nbsp; 로컬 DB 만 썼던 나한테는 특히 어려운 숙제였다,, 내가 첫 번째로 가졌던 생각은 DB만 일단 로컬이 아닌 RDS를 이용해서 연동이나 시켜보자였다. 근데 배포하기까지 RDS를 설정하는 게 제일 어려웠다.&amp;nbsp;아무튼 이번 글을 통해 서버를 배포하는 과정을 복습도 하면서 잊지 않기 위해 적어놓도록 하자. 사실 오로지 나를 위해 쓰는 글이기도 하다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 테스트용으로 개발해둔 게시판 프로젝트가 있었는데 그걸 실험 삼아 그대로 배포해보려 한다. 그러면 바로 시작!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비물 (더보기)&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS 계정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배포하려는 프로젝트&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(.. 별거 없다)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Amazon RDS DataBase 인스턴스 생성 및 연결 테스트&lt;/h3&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. AWS-&amp;gt;RDS 화면으로 넘어간 후 데이터베이스 생성을 해주자&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-filename=&quot;스크린샷 2022-10-07 오후 5.12.10.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;1710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Oxw3/btrN14Ig0RF/K2K2rFcujUIFpi6W20Q5h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Oxw3/btrN14Ig0RF/K2K2rFcujUIFpi6W20Q5h1/img.png&quot; data-alt=&quot;MySql&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Oxw3/btrN14Ig0RF/K2K2rFcujUIFpi6W20Q5h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Oxw3%2FbtrN14Ig0RF%2FK2K2rFcujUIFpi6W20Q5h1%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;500&quot; height=&quot;546&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.12.10.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;1710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MySql&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;필자의 경우 MySQL을 사용하기 때문에 MySQL을 클릭 해준 후 버전은 8.0.28로 맞춰주었다. 추후에 mysql 8.0 버전을 설정해주는 곳이 있으니 자신이 선택한 버전을 기억해두도록 하자!&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-filename=&quot;스크린샷 2022-10-07 오후 5.14.02.png&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wXN4O/btrN4kPOlIW/ieuvsYRJjFXeP9yXnOt8LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wXN4O/btrN4kPOlIW/ieuvsYRJjFXeP9yXnOt8LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wXN4O/btrN4kPOlIW/ieuvsYRJjFXeP9yXnOt8LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwXN4O%2FbtrN4kPOlIW%2FieuvsYRJjFXeP9yXnOt8LK%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;535&quot; height=&quot;580&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.14.02.png&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1700&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;우리는 무료로 이용할 것 이기 때문에 프리티어 버전을 선택해주고 DB 인스턴스 이름을 설정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 자격 증명 설정의 경우 마스터 사용자 이름은 나의 경우 root로 해주었다. 로컬에서 항상 root로 사용했기 때문이라고,&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-filename=&quot;스크린샷 2022-10-07 오후 5.15.27.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;1674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwZQ3Y/btrN2VRGKGO/smld38IujGhgPRNHAr7Km0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwZQ3Y/btrN2VRGKGO/smld38IujGhgPRNHAr7Km0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwZQ3Y/btrN2VRGKGO/smld38IujGhgPRNHAr7Km0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwZQ3Y%2FbtrN2VRGKGO%2Fsmld38IujGhgPRNHAr7Km0%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;502&quot; height=&quot;540&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.15.27.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;1674&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.17.40.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceMHcP/btrN3roMgHv/IIAr3N9ACFczN5ofMAG9j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceMHcP/btrN3roMgHv/IIAr3N9ACFczN5ofMAG9j1/img.png&quot; data-alt=&quot; &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceMHcP/btrN3roMgHv/IIAr3N9ACFczN5ofMAG9j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceMHcP%2FbtrN3roMgHv%2FIIAr3N9ACFczN5ofMAG9j1%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;544&quot; height=&quot;598&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.17.40.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;1652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; &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;EC2는 수동으로 설정하면 돼서 굳이 연결을 해줄 필요 없다. 그리고 퍼블릭 액세스는 꼭 &quot;예&quot;로 설정을 해주도록 하자. 안 그러면 로컬이 연결이 안 된다.. 보안 그룹은 기존에 있는 거 선택해주고 없으면 생성! 이후에 수정해줄 거다.&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-filename=&quot;스크린샷 2022-10-07 오후 5.19.18.png&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckYyUO/btrN4xuJ81g/Z5WTDUiZKKSK9Jw0SRjpxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckYyUO/btrN4xuJ81g/Z5WTDUiZKKSK9Jw0SRjpxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckYyUO/btrN4xuJ81g/Z5WTDUiZKKSK9Jw0SRjpxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckYyUO%2FbtrN4xuJ81g%2FZ5WTDUiZKKSK9Jw0SRjpxk%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;528&quot; height=&quot;340&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.19.18.png&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1006&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;추가 구성에서 초기 데이터베이스를 하나 만들어 두는 게 좋다, 안 그러면 DB를 따로 생성해야 되는데 크게 상관은 없지만 귀찮다 미리 하나 만들어 두자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 아래에 있는 데이터베이스 생성을 클릭해주면 RDS가 생성이 된다. 생성했으니까 끝났다고 생각하면 오산. 파라미터 그룹을 초기에 하나 생성하여 나머지 설정들을 끝내주도록 하자.&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-filename=&quot;스크린샷 2022-10-07 오후 5.21.59.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOM2kx/btrN2vyW0lZ/np0G2pDZ7PBkGLOulRwetk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOM2kx/btrN2vyW0lZ/np0G2pDZ7PBkGLOulRwetk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOM2kx/btrN2vyW0lZ/np0G2pDZ7PBkGLOulRwetk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOM2kx%2FbtrN2vyW0lZ%2Fnp0G2pDZ7PBkGLOulRwetk%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;249&quot; height=&quot;418&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.21.59.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.23.48.png&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2h3lf/btrN3DP5nIY/HerAYeZQ86VTjgAaZy1pYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2h3lf/btrN3DP5nIY/HerAYeZQ86VTjgAaZy1pYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2h3lf/btrN3DP5nIY/HerAYeZQ86VTjgAaZy1pYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2h3lf%2FbtrN3DP5nIY%2FHerAYeZQ86VTjgAaZy1pYK%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;822&quot; height=&quot;108&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.23.48.png&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;108&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.24.27.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ik3rT/btrN2239iFn/9mfqg0e6AAMC2gm9kgEkNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ik3rT/btrN2239iFn/9mfqg0e6AAMC2gm9kgEkNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ik3rT/btrN2239iFn/9mfqg0e6AAMC2gm9kgEkNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIk3rT%2FbtrN2239iFn%2F9mfqg0e6AAMC2gm9kgEkNK%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;535&quot; height=&quot;327&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.24.27.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 위의 파라미터 값을 현재 값-&amp;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;변경사항 저장을 했다면 다시 데이터베이스로 넘어와서 자신이 만든 RDS -&amp;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-filename=&quot;스크린샷 2022-10-07 오후 5.26.52.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3gdip/btrN24HDLNT/SMfdIZ9TiM968zBObjDtNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3gdip/btrN24HDLNT/SMfdIZ9TiM968zBObjDtNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3gdip/btrN24HDLNT/SMfdIZ9TiM968zBObjDtNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3gdip%2FbtrN24HDLNT%2FSMfdIZ9TiM968zBObjDtNk%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;1138&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.26.52.png&quot; data-origin-width=&quot;1138&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 만든 파라미터 그룹으로 변경해주면 설정이 완료됐고 이제 내 로컬에서 해당 RDS에 접근하기 위해 보안 그룹을 설정해줄 거다.&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-filename=&quot;스크린샷 2022-10-07 오후 5.28.23.png&quot; data-origin-width=&quot;3438&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btJmCa/btrN3KIjB15/i0sWlFdNf8NusyPoBUeqK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btJmCa/btrN3KIjB15/i0sWlFdNf8NusyPoBUeqK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btJmCa/btrN3KIjB15/i0sWlFdNf8NusyPoBUeqK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtJmCa%2FbtrN3KIjB15%2Fi0sWlFdNf8NusyPoBUeqK0%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;634&quot; height=&quot;305&quot; data-filename=&quot;스크린샷 2022-10-07 오후 5.28.23.png&quot; data-origin-width=&quot;3438&quot; data-origin-height=&quot;1656&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;RDS에 설정된 보안 그룹을 위와 같이 인바운드 규칙 추가를 해주면 정말로 설정이 완료된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 다 정상적으로 수행했다면 Sequel Ace를 통해서 DB가 정상적으로 연결되는지 확인해보자.&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-filename=&quot;edited_스크린샷 2022-10-07 오후 5.29.56.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzWZkB/btrN3fvqDKZ/8KkR0SIhPkex2zj3AkkgE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzWZkB/btrN3fvqDKZ/8KkR0SIhPkex2zj3AkkgE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzWZkB/btrN3fvqDKZ/8KkR0SIhPkex2zj3AkkgE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzWZkB%2FbtrN3fvqDKZ%2F8KkR0SIhPkex2zj3AkkgE0%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;450&quot; height=&quot;437&quot; data-filename=&quot;edited_스크린샷 2022-10-07 오후 5.29.56.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;926&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;name은 아무거나 설정해주고 Host에는 발급된 엔드포인트 / 유저네임과 패스워드는 RDS 생성할 때 설정한 것들을 입력해주면 정상적으로 접속이 될 것이다.&lt;/p&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;이제 EC2 배포는 다음 편에서 다뤄보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조&lt;/p&gt;
&lt;figure id=&quot;og_1665131683787&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Amazon RDS DB 인스턴스 생성 및 연결하기&quot; data-og-description=&quot;Amazon RDS DB 인스턴스 생성&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@banjjoknim/AWS-RDS-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@banjjoknim/AWS-RDS-적용하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SfExh/hyP3DzD44u/6o4qUJeufzBgFHWafsiin1/img.png?width=569&amp;amp;height=222&amp;amp;face=0_0_569_222,https://scrap.kakaocdn.net/dn/xdZpB/hyP3Js5A23/XkA05w33LovF08LD4q8pmK/img.png?width=569&amp;amp;height=222&amp;amp;face=0_0_569_222,https://scrap.kakaocdn.net/dn/c4v5fU/hyP3HhKcI5/QfjRkVxAbKgEhiL6IjiExK/img.png?width=1894&amp;amp;height=265&amp;amp;face=0_0_1894_265&quot;&gt;&lt;a href=&quot;https://velog.io/@banjjoknim/AWS-RDS-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@banjjoknim/AWS-RDS-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SfExh/hyP3DzD44u/6o4qUJeufzBgFHWafsiin1/img.png?width=569&amp;amp;height=222&amp;amp;face=0_0_569_222,https://scrap.kakaocdn.net/dn/xdZpB/hyP3Js5A23/XkA05w33LovF08LD4q8pmK/img.png?width=569&amp;amp;height=222&amp;amp;face=0_0_569_222,https://scrap.kakaocdn.net/dn/c4v5fU/hyP3HhKcI5/QfjRkVxAbKgEhiL6IjiExK/img.png?width=1894&amp;amp;height=265&amp;amp;face=0_0_1894_265');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Amazon RDS DB 인스턴스 생성 및 연결하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon RDS DB 인스턴스 생성&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/26</guid>
      <comments>https://dev-chw.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 7 Oct 2022 17:34:52 +0900</pubDate>
    </item>
    <item>
      <title>Docker + SpringBoot 개발환경 구축</title>
      <link>https://dev-chw.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;docker.webp&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TYjKi/btrN3nlz9Oe/uRjYCxIEfHk1GVKFv0dVS0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TYjKi/btrN3nlz9Oe/uRjYCxIEfHk1GVKFv0dVS0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TYjKi/btrN3nlz9Oe/uRjYCxIEfHk1GVKFv0dVS0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTYjKi%2FbtrN3nlz9Oe%2FuRjYCxIEfHk1GVKFv0dVS0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;476&quot; height=&quot;476&quot; data-filename=&quot;docker.webp&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코로나를 걸리면서 일주일정도 푹 쉬게 되었다,, 몸이 약간 나아져서 예전부터 해보고싶었던 Docker에 Spring Boot 구축하기를 여유있을때 공부해보았다. 나중에 Docker를 통해서 배포까지 해보고 싶지만 추후에 미루고 먼저 Docker + SpringBoot 로 개발을 시작하기전 환경 구축을 하는 것을 먼저 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 이미 개발해두었던 API들을 도커에 올리는 형식으로 했다. 이제 하는 방법을 잘 알았으니 다음부터 프로젝트를 할때는 도커와 스프링을 먼저 개발환경 설정해주고 시작해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래부터 차근차근 설정을 해보도록 하겠다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Jar 파일 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.00.36.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eneMrB/btrN2Y0zW6b/SbjgNFiLhGNFZAJxKwt5U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eneMrB/btrN2Y0zW6b/SbjgNFiLhGNFZAJxKwt5U0/img.png&quot; data-alt=&quot;IntelliJ 환경에서 프로젝트에서 Gradle&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eneMrB/btrN2Y0zW6b/SbjgNFiLhGNFZAJxKwt5U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeneMrB%2FbtrN2Y0zW6b%2FSbjgNFiLhGNFZAJxKwt5U0%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;456&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.00.36.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IntelliJ 환경에서 프로젝트에서 Gradle&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번재로 Gradle -&amp;gt; Project이름 -&amp;gt; Tasks -&amp;gt; build 에서 bootJar을 실행시켜주면&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-filename=&quot;스크린샷 2022-10-07 오후 2.01.53.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAlDEv/btrNZjZrpZp/uw7IjZ150nqrsvwrFLmGck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAlDEv/btrNZjZrpZp/uw7IjZ150nqrsvwrFLmGck/img.png&quot; data-alt=&quot;패키지 build&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAlDEv/btrNZjZrpZp/uw7IjZ150nqrsvwrFLmGck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAlDEv%2FbtrNZjZrpZp%2Fuw7IjZ150nqrsvwrFLmGck%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;491&quot; height=&quot;217&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.01.53.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;패키지 build&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 내부에 있는 build-&amp;gt; libs 로 가게되면 jar 파일이 하나 생겼다. 참고로&lt;b&gt; jar&lt;/b&gt; 파일은 여러 개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Dockerfile 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.03.55.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAj7io/btrN1yIfw62/snnQTNjJc4Y6KsLxQYKwc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAj7io/btrN1yIfw62/snnQTNjJc4Y6KsLxQYKwc1/img.png&quot; data-alt=&quot;libs&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAj7io/btrN1yIfw62/snnQTNjJc4Y6KsLxQYKwc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAj7io%2FbtrN1yIfw62%2FsnnQTNjJc4Y6KsLxQYKwc1%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;654&quot; height=&quot;228&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.03.55.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;libs&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;libs 패키지 내부에 Dockerfile 이라는 확장자명이 없는 일반 파일을 하나 생성해주고 그 안에&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.04.41.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxKgSd/btrN15zdhTd/O0znv0H2pk4bMBWohyF3OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxKgSd/btrN15zdhTd/O0znv0H2pk4bMBWohyF3OK/img.png&quot; data-alt=&quot;Dockerfile&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxKgSd/btrN15zdhTd/O0znv0H2pk4bMBWohyF3OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxKgSd%2FbtrN15zdhTd%2FO0znv0H2pk4bMBWohyF3OK%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;512&quot; height=&quot;131&quot; data-filename=&quot;스크린샷 2022-10-07 오후 2.04.41.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dockerfile&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성해주며 각각 아래로 설명된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;FROM&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Docker Base Image / 필자는 java 17버전을 사용했기때문에 17로 명시해주었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ARG&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;컨테이너 내에서 사용할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;변수&lt;span&gt;를 지정할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;COPY&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;위에 선언했던 JAR_FILE 변수를 컨테이너의 app.jar로 복사한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ENTRYPOINT&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 컨테이너가 시작되었을 때 스크립트 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성이 완료되었다면 libs 패키지 내부에 &lt;b&gt;docker-compose.yml&lt;/b&gt; 파일을 하나 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose 파일을 통해 &lt;span style=&quot;color: #000000;&quot;&gt;Dockerfile 하나보다 여러 컨테이너들을 묶어서 편하게 관리해주자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;docker-compose.yml&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;version: '3'

services:
  database:
    container_name: test
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_DATABASE: board
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: 1234
      TZ: 'Asia/Seoul'
    ports:
      - &quot;3305:3306&quot;
    command:
      - &quot;mysqld&quot;
      - &quot;--character-set-server=utf8mb4&quot;
      - &quot;--collation-server=utf8mb4_unicode_ci&quot;
    networks:
      - test_network

  application:
    container_name: docker-compose-test
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - &quot;8000:8080&quot;
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://test:3306/board?characterEncoding=UTF-8&amp;amp;serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: &quot;root&quot;
      SPRING_DATASOURCE_PASSWORD: &quot;1234&quot;
    depends_on:
      - database
    networks:
      - test_network

networks:
  test_network:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mysql container&lt;/b&gt;의 이름은 &lt;b&gt;test&lt;/b&gt; 로 지었고 그 안에 생성할 &lt;b&gt;database&lt;/b&gt;는 &lt;b&gt;board&lt;/b&gt;로 명시해주었다. root에 1234로 비밀번호를 설정해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 &lt;b&gt;Spring_DATASOURCE&lt;/b&gt; 부분은 설정해준데로 &lt;b&gt;test&lt;/b&gt;에 &lt;b&gt;root&lt;/b&gt; / &lt;b&gt;1234&lt;/b&gt; 로 접속해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할점은 &lt;b&gt;mysql&lt;/b&gt;의 경우 내부에서 &lt;b&gt;3306&lt;/b&gt; 포트를 이용하지만 외부는 &lt;b&gt;3305&lt;/b&gt;로 접근하게 해주었으며 &lt;b&gt;서버의 포트&lt;/b&gt;는 &lt;b&gt;8080&lt;/b&gt;으로 내부로 접속하지만 외부에서는 &lt;b&gt;8000&lt;/b&gt;번을 사용하도록 설정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1터미널에서 cd 명령어를 통해 &lt;b&gt;build -&amp;gt; libs 로 이동&lt;/b&gt;한후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;docker-compose up --build -d&lt;/b&gt; 명령어로 빌드해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;b&gt; Control + c&lt;/b&gt; 로 컨테이너를 중지시켜주거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 &lt;b&gt;docker-compose stop&lt;/b&gt; 으로 중지시켜주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 실행하고 사용을 완료했다면 터미널에서&lt;b&gt; docker-compose down&lt;/b&gt; 을 통해 정지시키고 삭제하는것이 좋다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 IP 주소와 외부 포트 번호 + 설정해준 root / 1234로 workbench 나 기타 GUI 툴로 mysql로 접근하는것도 가능하니까 참고해서 데이터베이스를 잘 구성해보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;figure id=&quot;og_1665120832207&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Docker] 도커에 Spring Boot 구축하기&quot; data-og-description=&quot;목차 1. Spring Boot 코드 작성 2. jar 파일 생성 3. Dockerfile 만들기 4. 컨테이너 실행하기 1. Spring Boot 코드 작성 간단한 Hello World 코드를 구현했다. 소스코드는 다음과 같다. package hello.hellosprin..&quot; data-og-host=&quot;da2uns2.tistory.com&quot; data-og-source-url=&quot;https://da2uns2.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4%EC%97%90-Spring-Boot-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://da2uns2.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4%EC%97%90-Spring-Boot-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cXepa4/hyP3H2Z1hq/sN5j8NkOXgOQOiblF4kBBK/img.png?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/uaUvP/hyP3GJNadF/l3bYm7py5yRko6QYIv0Fhk/img.png?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/z7YJ7/hyP3yLKblf/VvtSmqheJm1Y1uutDsHNr1/img.jpg?width=960&amp;amp;height=960&amp;amp;face=0_0_960_960&quot;&gt;&lt;a href=&quot;https://da2uns2.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4%EC%97%90-Spring-Boot-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://da2uns2.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4%EC%97%90-Spring-Boot-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cXepa4/hyP3H2Z1hq/sN5j8NkOXgOQOiblF4kBBK/img.png?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/uaUvP/hyP3GJNadF/l3bYm7py5yRko6QYIv0Fhk/img.png?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/z7YJ7/hyP3yLKblf/VvtSmqheJm1Y1uutDsHNr1/img.jpg?width=960&amp;amp;height=960&amp;amp;face=0_0_960_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Docker] 도커에 Spring Boot 구축하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 1. Spring Boot 코드 작성 2. jar 파일 생성 3. Dockerfile 만들기 4. 컨테이너 실행하기 1. Spring Boot 코드 작성 간단한 Hello World 코드를 구현했다. 소스코드는 다음과 같다. package hello.hellosprin..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;da2uns2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1665120842653&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;docker-compose로 SprongBoot + MySql DB 서버 구동&quot; data-og-description=&quot;UserEntity를 가지고 CURD를 하는 SpringBoot RESTAPI 프로젝트를 만들어보았습니다. 이 프로젝트를 MySql DB와 연동을 해야 하는데 docker-compose.yml 파일로 쉽게 연동할 수 있음을 실습해보겠습니다.build.gradle&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@mooh2jj/docker-compose%EB%A1%9C-SprongBoot-JPA-MySql-DB-%EC%84%9C%EB%B2%84%EB%A7%8C%EB%93%A4%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@mooh2jj/docker-compose로-SprongBoot-JPA-MySql-DB-서버만들기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ElHIp/hyP3vuIRtV/Tki4s4pR6qteTyQKhernJk/img.png?width=336&amp;amp;height=287&amp;amp;face=0_0_336_287,https://scrap.kakaocdn.net/dn/GImZq/hyP3yEY8Hp/OLFe4adVAJ4i1yPREpAmU0/img.png?width=336&amp;amp;height=287&amp;amp;face=0_0_336_287,https://scrap.kakaocdn.net/dn/beRZBm/hyP3I8GzBg/F9iQA7hjtCe5iS5epZADt1/img.jpg?width=1440&amp;amp;height=1440&amp;amp;face=0_0_1440_1440&quot;&gt;&lt;a href=&quot;https://velog.io/@mooh2jj/docker-compose%EB%A1%9C-SprongBoot-JPA-MySql-DB-%EC%84%9C%EB%B2%84%EB%A7%8C%EB%93%A4%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@mooh2jj/docker-compose%EB%A1%9C-SprongBoot-JPA-MySql-DB-%EC%84%9C%EB%B2%84%EB%A7%8C%EB%93%A4%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ElHIp/hyP3vuIRtV/Tki4s4pR6qteTyQKhernJk/img.png?width=336&amp;amp;height=287&amp;amp;face=0_0_336_287,https://scrap.kakaocdn.net/dn/GImZq/hyP3yEY8Hp/OLFe4adVAJ4i1yPREpAmU0/img.png?width=336&amp;amp;height=287&amp;amp;face=0_0_336_287,https://scrap.kakaocdn.net/dn/beRZBm/hyP3I8GzBg/F9iQA7hjtCe5iS5epZADt1/img.jpg?width=1440&amp;amp;height=1440&amp;amp;face=0_0_1440_1440');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;docker-compose로 SprongBoot + MySql DB 서버 구동&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;UserEntity를 가지고 CURD를 하는 SpringBoot RESTAPI 프로젝트를 만들어보았습니다. 이 프로젝트를 MySql DB와 연동을 해야 하는데 docker-compose.yml 파일로 쉽게 연동할 수 있음을 실습해보겠습니다.build.gradle&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose 커맨드와 관련된 부분은 아래 블로그를 참고하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1665120955299&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Docker Compose 커맨드 사용법&quot; data-og-description=&quot;Engineering Blog by Dale Seo&quot; data-og-host=&quot;www.daleseo.com&quot; data-og-source-url=&quot;https://www.daleseo.com/docker-compose/&quot; data-og-url=&quot;https://www.daleseo.com/docker-compose/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkooLH/hyP3DlZvg4/T2KM5ZxQiz0IaMW4ofEcck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.daleseo.com/docker-compose/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.daleseo.com/docker-compose/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkooLH/hyP3DlZvg4/T2KM5ZxQiz0IaMW4ofEcck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Docker Compose 커맨드 사용법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Engineering Blog by Dale Seo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.daleseo.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모험가의 Spring/Spring</category>
      <author>DevChw</author>
      <guid isPermaLink="true">https://dev-chw.tistory.com/24</guid>
      <comments>https://dev-chw.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 7 Oct 2022 14:38:31 +0900</pubDate>
    </item>
  </channel>
</rss>