<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Codest</title>
    <link>https://codest.tistory.com/</link>
    <description>Django 백엔드 개발자의 학습 기록</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 18:42:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Codest</managingEditor>
    <image>
      <title>Codest</title>
      <url>https://tistory1.daumcdn.net/tistory/5044342/attach/62c2b6a711cc4e35af750e0b3332bafe</url>
      <link>https://codest.tistory.com</link>
    </image>
    <item>
      <title>[Python] 프로그래머스 코딩테스트 연습 &amp;gt; 나누어 떨어지는 숫자 배열(논리 연산자, 자료형 별 Bool값)</title>
      <link>https://codest.tistory.com/26</link>
      <description>&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;쉬운 문제지만 논리 연산자와 자료형 별 Bool값에 대해 공부할 수 있는 문제라서 가져왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12910&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제 링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674052281028&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12910&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/S4d0q/hyRksqdwoC/b1B417hZ4Qm6ggMN21LT90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/btdrsn/hyRksRieXP/yxBaOPjDkcgywBSWK3v640/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12910&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12910&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/S4d0q/hyRksqdwoC/b1B417hZ4Qm6ggMN21LT90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/btdrsn/hyRksRieXP/yxBaOPjDkcgywBSWK3v640/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;프로그래머스&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;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;모든 문제의 저작권은 프로그래머스에게 있음을 밝힙니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;풀이 과정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;1. 문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;나누어떨어지는숫자.PNG&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVTez5/btrWCTD43FB/mQi3MOW46IbV9O9buFN6vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVTez5/btrWCTD43FB/mQi3MOW46IbV9O9buFN6vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVTez5/btrWCTD43FB/mQi3MOW46IbV9O9buFN6vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVTez5%2FbtrWCTD43FB%2FmQi3MOW46IbV9O9buFN6vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1040&quot; height=&quot;668&quot; data-filename=&quot;나누어떨어지는숫자.PNG&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;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;arr를 탐색하며 divisor로 나누어 떨어지는 숫자들을 배열에 담아 오름차순으로 정렬합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때, 나누어 떨어지는 숫자가 없다면 [-1]을 return 하면 됩니다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 풀이&amp;nbsp;과정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;일반적인 풀이&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674052241918&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(arr, divisor):
    answer = sorted([num for num in arr if num % divisor == 0])
    if answer == []:
        return [-1]

    return answer&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;리스트 컴프리헨션을 이용하여 arr에 있는 숫자 중 divisor로 나누어 떨어지는 숫자만 리스트로 만들었고 sorted() 함수를 통해 오름차순 정렬 해 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에는 조건문을 통해 answer이 빈 리스트인 경우 [-1]을 return 했습니다.&lt;/p&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;논리 연산자 or을 이용한 풀이&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674052241919&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(arr, divisor):
    return sorted([num for num in arr if num % divisor == 0]) or [-1]&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;우선 위의 코드를 이해하기 위해서는 논리 연산자인 and와 or에 대해 알아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A and B&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 58.4884%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;논리식&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;결괏값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;True and True&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;True&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #efefef;&quot;&gt;True and False&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #efefef;&quot;&gt;False and True&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #efefef;&quot;&gt;False and False&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and 연산은 두 값이 모두 True 일 때만 True를 반환하고 한 값이라도 False라면 False를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A or B&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 58.4884%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;논리식&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;결괏값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;True or True&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;True&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef;&quot;&gt;True or False&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;True&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef;&quot;&gt;False or True&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;True&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef;&quot;&gt;False or False&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or 연산은 두 값 중 하나라도 True이면 True를 반환하고 두 값이 모두 False 일 때만 False를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674053588984&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(arr, divisor):
    A = sorted([num for num in arr if num % divisor == 0])
    B = [-1]
	
    return A or B&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B는 값이 있는 리스트 이므로 True고 A는 값이 있을 땐 True, 빈 리스트인 경우에는 False입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 True or True 아니면 False or True인데 전자는 둘 다 True이므로 앞에 있는 True인 정렬된 리스트가 반환되고 후자는 True인 [-1]이 반환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형 별 Bool값을 아신다면 더욱 이해가 편할 겁니다.&lt;/p&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;자료형 별 Bool값&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 82.093%; height: 331px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;값&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;Bool 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&quot;&quot;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;빈 문자열&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&quot;apple&quot; 혹은 &quot; &quot;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;값이 있는 문자열 &lt;br /&gt;(공백만 있어도 O)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;[ ]&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;빈 리스트&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;[1, 2, 3]&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;값이 있는 리스트&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;숫자 0&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;-1 혹은 3.14 혹은 &lt;br /&gt;루트 2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;0을 제외한 모든 숫자 &lt;br /&gt;(실수)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;{}&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;빈 딕셔너리&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;()&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;빈 튜플&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;set()&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;빈 집합&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 나누어 떨어지는 숫자 배열 문제를 통해 논리연산자 and와 or 그리고 자료형 별 Bool값에 대해 공부해 보았습니다. 도움이 되셨다면 하트와 구독 부탁드립니다. 감사합니다.&lt;/p&gt;</description>
      <category>Algorithm/Python</category>
      <category>논리 연산자</category>
      <category>자료형 별 Bool값</category>
      <category>코딩테스트</category>
      <category>파이썬</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/26</guid>
      <comments>https://codest.tistory.com/26#entry26comment</comments>
      <pubDate>Thu, 19 Jan 2023 00:29:51 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 프로그래머스 코딩테스트 연습 &amp;gt; 문자열 밀기 (문자열 슬라이싱, deque)</title>
      <link>https://codest.tistory.com/25</link>
      <description>&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120921&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문자열 밀기 문제 링크&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672031917855&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120921&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e7Ba5/hyQ1jOrYBj/KuKJOpVBTsx0L6NmRlA7q0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/4tCOb/hyQ3RircGn/NLPU3N60hfoIn8rKR1Ugj1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120921&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120921&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e7Ba5/hyQ1jOrYBj/KuKJOpVBTsx0L6NmRlA7q0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/4tCOb/hyQ3RircGn/NLPU3N60hfoIn8rKR1Ugj1/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;프로그래머스&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;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 문제의 저작권은 프로그래머스에게 있음을 밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;풀이 과정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;1. 문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;문자열 밀기.PNG&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8qkM/btrUDg8MKT6/xBSdGgE7dgG9KIG8R1tSFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8qkM/btrUDg8MKT6/xBSdGgE7dgG9KIG8R1tSFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8qkM/btrUDg8MKT6/xBSdGgE7dgG9KIG8R1tSFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8qkM%2FbtrUDg8MKT6%2FxBSdGgE7dgG9KIG8R1tSFK%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;807&quot; height=&quot;757&quot; data-filename=&quot;문자열 밀기.PNG&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A의 마지막 index 문자를 첫 번째 index 문자로 보내고 나머지 문자들은 뒤로 미는 것을 &quot;문자열 밀기&quot;라고 문제에서 정의합니다. A 문자열을 밀어서 B 문자열이 되려면 몇 번 밀어야 하는지 return 하는 함수를 작성하면 됩니다. 단, 밀어서 B가 되지 못할 경우 -1을 return 해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 풀이&amp;nbsp;과정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;문자열 슬라이싱을 이용한 풀이&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672031732180&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(A,B):
    for cnt in range(len(A)):
        if A == B:
            return cnt
        A = A[-1] + A[:-1]
    
    return -1&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 style=&quot;color: #000000;&quot;&gt;조건에는 나와있지 않지만 A와 B가 같은 경우 len(A) 번 민 게 아니라 0번 밀었다고 간주합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A와 B가 같다면 cnt가 0일 때 바로 if문을 만족하기 때문에 return값은 0이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇지 않다면 cnt가 1씩 증가하면서 A = A [-1] + A [:-1] 코드를 통해 한 번씩 밀게 되고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 횟수만큼 return값이 됩니다. 문자열은 리스트와 달리 수정 불가능한(Immutable) 자료구조이기 때문에 A를 재선언하는 방법으로 구현했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;for문을 다 돌아도 if문을 만족하는 cnt가 없다면 -1이 반환돼야 하므로 함수의 return값에 -1을 넣어주었습니다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;리스트 insert, pop 함수를 이용한 풀이&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672031732181&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(A,B):
    A, B = list(A), list(B)
    
    for cnt in range(len(A)):
        if A == B:
            return cnt
        
        A.insert(0,A.pop())
    
    return -1&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 style=&quot;color: #000000;&quot;&gt;수정 가능한(mutable) 리스트의 특성을 이용한 풀이입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A.pop()을 실행하게 되면 마지막 인덱스가 삭제되고 그 값이 return 됩니다. 이 return값을 A의 0번 index에 insert 하면 첫 번째 풀이와 같이 &quot;문자열 밀기&quot;가 일어납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;deque를 이용한 풀이&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672031732182&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def solution(A,B):
    A, B = deque(A), deque(B)
    
    for cnt in range(len(A)):
        if A == B:
            return cnt
        
        A.rotate()
    
    return -1&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 style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;deque는 앞과 뒤에서 데이터를 처리할 수 있는 양방향 자료형으로, 스택(stack)처럼 써도 되고 큐(queue)처럼 써도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;다음은 List와 Deque의 연산자 별 시간 복잡도를 나타낸 표입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;List 관련 함수의 시간 복잡도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbQyx7/btrWDmMLNiS/vmgigMQfdnnuNolCwaHIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbQyx7/btrWDmMLNiS/vmgigMQfdnnuNolCwaHIkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbQyx7/btrWDmMLNiS/vmgigMQfdnnuNolCwaHIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbQyx7%2FbtrWDmMLNiS%2FvmgigMQfdnnuNolCwaHIkk%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;325&quot; height=&quot;416&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;569&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;Deque 관련 함수의 시간 복잡도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NifYD/btrWCTD8gSm/OaL44RG9n4CIihDJywDrkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NifYD/btrWCTD8gSm/OaL44RG9n4CIihDJywDrkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NifYD/btrWCTD8gSm/OaL44RG9n4CIihDJywDrkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNifYD%2FbtrWCTD8gSm%2FOaL44RG9n4CIihDJywDrkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;273&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중간에 데이터를 삽입하거나 삭제하는 경우 list와 deque 모두 O(N), append()와 pop()의 경우 list와 deque 모두 O(1)의 시간 복잡도를 가집니다. 하지만 deque는 양방향이기 때문에 popleft()와 appendleft()의 시간 복잡도가 O(1)입니다.&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 style=&quot;color: #000000;&quot;&gt;이번 문제에서 list를 사용했을 경우 insert 과정에서 첫 번째 index를 제외하고 모두 뒤로 밀어야하기 때문에 시간 복잡도가 O(N)이지만 deque를 사용했을 경우 rotate()는 rotate(1)과 같기 때문에 O(1)의 시간 복잡도를 가집니다.&lt;/span&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 style=&quot;color: #000000;&quot;&gt;데이터의 길이가 길었다면 유의미한 시간 차이가 발생했을 것입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;find 함수를 이용한 풀이&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672036543803&quot; class=&quot;ruby&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(A,B):
    BB = B*2
    return BB.find(A)&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 style=&quot;color: #000000;&quot;&gt;find 함수의 특성을 이용한 신박한 풀이입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 A가 &quot;hello&quot;이고 B가 &quot;lohel&quot;이라고 한다면 BB는 &quot;lohellohel&quot;이 되고 BB.find(A)를 실행하게 되면 hello가 시작되는 index인 2가 반환됩니다. 만약 &quot;hello&quot;가 존재하지 않는다면 find 함수의 특성에 의해 -1이 반환됩니다. 공교롭게도 문제의 조건과 정확히 일치합니다.&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;이렇게 총 4가지 방법으로 문제를 풀어보았습니다. 여러 파이썬 함수들의 특성을 이해할 수 있었고 시간 복잡도에 대해서도 고민해볼 수 있는 시간이었던 것 같습니다.&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;</description>
      <category>Algorithm/Python</category>
      <category>deque</category>
      <category>python</category>
      <category>시간 복잡도</category>
      <category>알고리즘</category>
      <category>코딩 테스트</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/25</guid>
      <comments>https://codest.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 26 Dec 2022 15:44:06 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 프로그래머스 코딩테스트 연습 &amp;gt; 햄버거 만들기</title>
      <link>https://codest.tistory.com/24</link>
      <description>&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;a style=&quot;color: #000000;&quot; href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;프로그래머스 문제 링크&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671964255415&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ckuIdu/hyQ1iHWExE/XhiL3ILVhZKgn99fSLAAU1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bz7zqE/hyQ1oOVVZW/314rftnGLZK5UQAkKFnUI0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ckuIdu/hyQ1iHWExE/XhiL3ILVhZKgn99fSLAAU1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bz7zqE/hyQ1oOVVZW/314rftnGLZK5UQAkKFnUI0/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;프로그래머스&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;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 문제의 저작권은 프로그래머스에게 있음을 밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제 설명&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;풀이 과정&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;1. 문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;햄버거.PNG&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VBuK0/btrUxp5NHsq/6JKKTzVxrTelgTRJKnkmZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VBuK0/btrUxp5NHsq/6JKKTzVxrTelgTRJKnkmZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VBuK0/btrUxp5NHsq/6JKKTzVxrTelgTRJKnkmZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVBuK0%2FbtrUxp5NHsq%2F6JKKTzVxrTelgTRJKnkmZ1%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;910&quot; height=&quot;760&quot; data-filename=&quot;햄버거.PNG&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;간단하게 설명하면 1, 2, 3으로 조합된 list인 ingredient를 parameter로 받아서 [1, 2, 3, 1] 순서의 햄버거가 몇 개나 만들어지는지 return 하는 함수를 작성하면 됩니다.&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 풀이&amp;nbsp;과정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;햄버거 찾아내기 (리스트 탐색)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671965518859&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    answer = 0

    for idx in range(0, len(ingredient)-3):                   
        if ingredient[idx:idx+4] == [1,2,3,1]:
            del ingredient[idx:idx+4]
            answer += 1
    
    return answer&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 style=&quot;color: #000000;&quot;&gt;for문을 통해 리스트를 탐색하면서 슬라이싱을 통해 [1, 2, 3, 1]인 구간을 찾아냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조건을 충족할 경우 그 구간은 삭제하고 return값에 1을 더합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 이대로 실행하면 그다음 햄버거를 찾을 때 index 초기화가 되지 않기 때문에 반복문이 &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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;While문 탈출 조건 추가&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671966238540&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    answer = 0
    len_check = []

    while len(set(len_check)) == len(len_check):
        for idx in range(0, len(ingredient)-3):                   
            if ingredient[idx:idx+4] == [1,2,3,1]:
                del ingredient[idx:idx+4]
                answer += 1
                break
    
        len_check.append(len(ingredient))
    
    return answer&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 style=&quot;color: #000000;&quot;&gt;우선 for문 내에 햄버거가 만들어지면 반복문을 중단하는 break를 추가해 주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;len_check이라는 빈 list를 생성해주고 while문이 반복될 때마다 len(ingredient)를 append해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 중복인 element가 있는 경우 즉, 햄버거가 만들어지지 않은 경우를 set(ingredient)와 원본 ingredient의 길이 비교를 통해 탈출 조건을 걸었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 이대로 실행할 경우 for문의 idx가 0부터 시작하기 때문에 불필요한 탐색이 일어납니다. 이 때문에 ingredient의 길이가 긴 경우 시간초과가 발생하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;불필요한 탐색 줄이기 (최종 코드)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671967068105&quot; class=&quot;angelscript&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    answer = 0
    len_check = []
    idx_check = 2

    while len(set(len_check)) == len(len_check):
        for idx in range(idx_check-2 ,len(ingredient)-3):                   
            if ingredient[idx:idx+4] == [1,2,3,1]:
                del ingredient[idx:idx+4]
                answer += 1
                idx_check = idx
                break
    
        len_check.append(len(ingredient))
    
    return answer&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 style=&quot;color: #000000;&quot;&gt;for문의 시작 index를 햄버거가 만들어진 시점의 idx -2로 설정합니다. 또한 idx를 확인하는 idx_check 변수를 선언하고 맨 처음 for문 돌 때를 대비하여 초기 값을 2로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ingredient가 [1, 1, 1, 1, 2, 1, 2, 3, 1, 3, 1, 2]라고 가정해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[1, 1, 1, 1, 2, (1, 2, 3, 1), 3, 1, 2] 이렇게 햄버거가 만들어지고 이때 시작 idx는 5입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; [1, 1, 1, 1, 2, 3, 1, 2]가 남게 되고 idx -2인 3부터 탐색하면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;idx - 2 이전에서는 절대 햄버거가 만들어질 수 없습니다. 왜냐하면 최악의 경우를 생각해 보아도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(1, 2, 3, 1) 앞에 1, 2, 3이 있으면 (1, 2, 3, 1), 2, 3 ,1 이런 식으로 앞에서 먼저 햄버거가 만들어지기 때문에 굳이 idx - 2 이전의 경우는 탐색할 필요가 없습니다.&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;span style=&quot;color: #000000;&quot;&gt;도움이 되셨다면 하트와 구독 부탁드립니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Algorithm/Python</category>
      <category>python</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/24</guid>
      <comments>https://codest.tistory.com/24#entry24comment</comments>
      <pubDate>Sun, 25 Dec 2022 20:39:50 +0900</pubDate>
    </item>
    <item>
      <title>[Error] Nginx 502 Bad Gateway 에러 해결 방법 (13: Permission denied, 111:unknown error)</title>
      <link>https://codest.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요. 오늘은 AWS 배포를 하다 보면 자주 만나게 되는 Nginx 502 Bad Gateway 에러 해결방법 두 가지에 대해 알아보겠습니다. 502 에러가 발생하는 이유는 매우 매우 다양하기 때문에 제 방법을 사용하더라도 에러가 해결되지 않을 수 있음을 미리 말씀드립니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;502 bad gateway.PNG&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUeeFE/btrNvPwpiFz/F7tRArKtK9yRPILDka750k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUeeFE/btrNvPwpiFz/F7tRArKtK9yRPILDka750k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUeeFE/btrNvPwpiFz/F7tRArKtK9yRPILDka750k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUeeFE%2FbtrNvPwpiFz%2FF7tRArKtK9yRPILDka750k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;125&quot; data-filename=&quot;502 bad gateway.PNG&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;우선 저 에러가 발생하면 nginx error log를 확인하는 습관을 들이셔야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;log를 보면 에러 발생 이유가 나와있기 때문에 대부분 해결 가능합니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664529491646&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -f /var/log/nginx/error.log&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 style=&quot;color: #000000;&quot;&gt;위의 명령어로 error log를 확인할 수 있습니다.&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;error.log 파일의 위치는 nginx.conf 파일에 Logging Settings 부분에 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;logging settings.PNG&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv9PCQ/btrNuT7oPb6/rHEJpWA2Fh16cdap9nKk81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv9PCQ/btrNuT7oPb6/rHEJpWA2Fh16cdap9nKk81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv9PCQ/btrNuT7oPb6/rHEJpWA2Fh16cdap9nKk81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv9PCQ%2FbtrNuT7oPb6%2FrHEJpWA2Fh16cdap9nKk81%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;404&quot; height=&quot;109&quot; data-filename=&quot;logging settings.PNG&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. uwsgi.ini 폴더 경로 잘못 입력했을 경우&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;unknown error.PNG&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceNU4p/btrNuL9CzN5/ksSTETKNPvUy40N1SkGyik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceNU4p/btrNuL9CzN5/ksSTETKNPvUy40N1SkGyik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceNU4p/btrNuL9CzN5/ksSTETKNPvUy40N1SkGyik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceNU4p%2FbtrNuL9CzN5%2FksSTETKNPvUy40N1SkGyik%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;2924&quot; height=&quot;118&quot; data-filename=&quot;unknown error.PNG&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사진을 확대해보시면 코드가 보이는데 3번째 줄에 unix:/home/ubuntu/uwsgi.sock과 연결하는데 실패했다고 나옵니다. 두 번째 줄에는 upstream 이하에는 mac_automl 폴더에 uwsgi.sock가 있다고 나오는데 둘이 다르니 이 경로에 문제가 있는 것을 파악했습니다.&lt;/span&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;sock파일 위치.PNG&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OlH4L/btrNuRu1UPh/p7lv0JyK89VhnBfIthx7w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OlH4L/btrNuRu1UPh/p7lv0JyK89VhnBfIthx7w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OlH4L/btrNuRu1UPh/p7lv0JyK89VhnBfIthx7w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOlH4L%2FbtrNuRu1UPh%2Fp7lv0JyK89VhnBfIthx7w1%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;1336&quot; height=&quot;77&quot; data-filename=&quot;sock파일 위치.PNG&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;uwsgi.sock은 mac_automl 폴더에 있는 것을 볼 수 있습니다. 그럼 unix: 이하 경로를 잘못 적은 것입니다. nginx.conf에 들어가 보니 경로 중간에 mac_automl을 빼고 적었네요. 올바르게 수정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;conf 수정.PNG&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oBgKI/btrNwjqjnr4/F9ekt6ZveyAqefZkMh8QuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oBgKI/btrNwjqjnr4/F9ekt6ZveyAqefZkMh8QuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oBgKI/btrNwjqjnr4/F9ekt6ZveyAqefZkMh8QuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoBgKI%2FbtrNwjqjnr4%2FF9ekt6ZveyAqefZkMh8QuK%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;80&quot; data-filename=&quot;conf 수정.PNG&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수정했다면 이제 nginx와 uwsgi 서버를 재시작해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664529828474&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl restart nginx
sudo systemctl restart uwsgi&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 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;문제가 해결되지 않았다면 nginx.conf / sites-enabled 내 default / uwsgi.ini / uwsgi.service 파일의 경로를 다시 한번 꼼꼼히 확인해보시기 바랍니다.&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. nginx.conf user 권한 문제&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;permission denied.PNG&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b26ziS/btrNvjdHcMK/BqBDOM3sZhZvH6XUflGUj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b26ziS/btrNvjdHcMK/BqBDOM3sZhZvH6XUflGUj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b26ziS/btrNvjdHcMK/BqBDOM3sZhZvH6XUflGUj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb26ziS%2FbtrNvjdHcMK%2FBqBDOM3sZhZvH6XUflGUj1%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;1667&quot; height=&quot;63&quot; data-filename=&quot;permission denied.PNG&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Permission denied 에러가 발생했을 경우에는 user 권한 문제가 대부분 일 것입니다. nginx.conf 파일을 실행해서 user www-data; 부분을 &lt;b&gt;user root&lt;/b&gt;;로 변경해줍니다. root(관리자) 권한으로 nginx를 실행하도록 설정하는 과정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nginx conf.PNG&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFumKS/btrNNz2OVhx/bPJysXJkYlcvSX1Rqqaxak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFumKS/btrNNz2OVhx/bPJysXJkYlcvSX1Rqqaxak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFumKS/btrNNz2OVhx/bPJysXJkYlcvSX1Rqqaxak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFumKS%2FbtrNNz2OVhx%2FbPJysXJkYlcvSX1Rqqaxak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;348&quot; data-filename=&quot;nginx conf.PNG&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;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;pre id=&quot;code_1664948463671&quot; class=&quot;maxima&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl restart nginx
sudo systemctl restart uwsgi&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 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중간에 꼬여서 배포를 올바른 방법으로 다시 하고 싶으시면 제 AWS 배포 시리즈를 참고해주시기 바랍니다.&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;a style=&quot;color: #000000;&quot; href=&quot;https://codest.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;[AWS] 장고 프로젝트 배포하기 (1) AWS 계정 생성, EC2 인스턴스 생성&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://codest.tistory.com/10?category=1022353&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;[AWS] 장고 프로젝트 배포하기 (2) SSH 접속, 패키지 설치, GitHub 연동&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;/b&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;a style=&quot;color: #000000;&quot; href=&quot;https://codest.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;[AWS] 장고 프로젝트 배포하기 (3) WS와 WSGI 그리고 WAS / Nginx와 uWSGI 연동하기&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Error</category>
      <category>502 Error</category>
      <category>AWS</category>
      <category>Bad Gateway</category>
      <category>nginx</category>
      <category>배포</category>
      <category>에러</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/21</guid>
      <comments>https://codest.tistory.com/21#entry21comment</comments>
      <pubDate>Wed, 5 Oct 2022 14:50:19 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 장고 프로젝트 배포하기 (3) WS와 WSGI 그리고 WAS / Nginx와 uWSGI 연동하기</title>
      <link>https://codest.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요, 지난 포스팅에서는 localhost 테스트용 서버에 django 프로젝트를 배포하는 것까지 해보았습니다.&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;a style=&quot;color: #000000;&quot; href=&quot;https://codest.tistory.com/10&quot;&gt;[AWS] 장고 프로젝트 배포하기 (2) SSH 접속, 패키지 설치, GitHub 연동&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657588373275&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] 장고 프로젝트 배포하기 (2) SSH 접속, 패키지 설치, GitHub 연동&quot; data-og-description=&quot;안녕하세요! 지난 글에서는 AWS 계정을 생성하고 인스턴스 설정까지 해보았습니다. [AWS] 장고 프로젝트 배포하기 (1) [AWS] 장고 프로젝트 배포하기 (1) AWS 계정 생성, EC2 인스턴스 생성 안녕하세요! &quot; data-og-host=&quot;codest.tistory.com&quot; data-og-source-url=&quot;https://codest.tistory.com/10&quot; data-og-url=&quot;https://codest.tistory.com/10&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nkHeg/hyO4FRTE6A/H69EZgGXFai3h9go2QkVK0/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/ghGYq/hyO3oEe3yk/lofp68n7T6hgzxResWrMr0/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/Tc6LV/hyO3q9S8jZ/eqr4lKGFsx24qoyYHoIV1K/img.png?width=774&amp;amp;height=487&amp;amp;face=0_0_774_487&quot;&gt;&lt;a href=&quot;https://codest.tistory.com/10&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codest.tistory.com/10&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nkHeg/hyO4FRTE6A/H69EZgGXFai3h9go2QkVK0/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/ghGYq/hyO3oEe3yk/lofp68n7T6hgzxResWrMr0/img.png?width=800&amp;amp;height=420&amp;amp;face=0_0_800_420,https://scrap.kakaocdn.net/dn/Tc6LV/hyO3q9S8jZ/eqr4lKGFsx24qoyYHoIV1K/img.png?width=774&amp;amp;height=487&amp;amp;face=0_0_774_487');&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] 장고 프로젝트 배포하기 (2) SSH 접속, 패키지 설치, GitHub 연동&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! 지난 글에서는 AWS 계정을 생성하고 인스턴스 설정까지 해보았습니다. [AWS] 장고 프로젝트 배포하기 (1) [AWS] 장고 프로젝트 배포하기 (1) AWS 계정 생성, EC2 인스턴스 생성 안녕하세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codest.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;span style=&quot;color: #000000;&quot;&gt;이번 포스팅에서는 Nginx와 uWSGI를 연동하여 Public IP 80 포트에 배포하는 법에 대해 다뤄보겠습니다. 우선 Nginx와 uWSGI는 무엇이고 왜 사용하는가에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;#no_1&quot;&gt;1. WS와 WSGI 그리고 WAS의 개념&amp;nbsp;&lt;/a&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;a style=&quot;color: #000000;&quot; href=&quot;#no_2&quot;&gt;2. uWSGI 설정&lt;/a&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;a style=&quot;color: #000000;&quot; href=&quot;#no_3&quot;&gt;3. Nginx 설정&lt;/a&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;a style=&quot;color: #000000;&quot; href=&quot;#no_4&quot;&gt;4. 서버 재시작&lt;/a&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_1&quot;&gt;1. WS와 WSGI 그리고 WAS의 개념&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 서비스는 기본적으로 정적 컨텐츠를 처리하는 &lt;b&gt;WS(Web Server)&lt;/b&gt;와 동적 컨텐츠를 처리하는 &lt;b&gt;WAS(Web Application Server)&lt;/b&gt;에 의해 동작합니다. 그리고 중간에서 &lt;b&gt;WSGI(&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;Web Server Gateway Interface)&lt;/b&gt;가 WS와 WAS 간의 통신을 담당합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ws was wsgi.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wCeqB/btrLQxRRfhn/awY67y0kFCMDL6WkmQqTo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wCeqB/btrLQxRRfhn/awY67y0kFCMDL6WkmQqTo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wCeqB/btrLQxRRfhn/awY67y0kFCMDL6WkmQqTo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwCeqB%2FbtrLQxRRfhn%2FawY67y0kFCMDL6WkmQqTo1%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;591&quot; height=&quot;301&quot; data-filename=&quot;ws was wsgi.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Web Server (Nginx, Apache)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTML, CSS, JavaScript 등 데이터의 변화가 없는 정적 컨텐츠를 처리하는 서버&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동적 컨텐츠를 처리하느라 부하가 심한 WAS의 부담을 덜어 줄 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 서버로 여러 서비스를 호스팅 할 수 있음 (Sub Domain)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DB를 관리하는 WAS에 대한 접근을 Web Server가 담당하므로 보안 강화에 도움이 됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Web Application Server (Django Server)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Client 요청에 맞게 데이터베이스 조회나 다양한 로직 처리를 요구하는 동적 컨텐츠를 처리하는 서버&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Client의 요청에는 동적 컨텐츠 뿐만 아니라 정적 컨텐츠도 포함되어 있기 때문에 WAS가 정적 컨텐츠 처리까지 담당하는 것은 서버 전체에 부담이 될 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Web Server Gateway Interface (uWSGI, Gunicorn)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WS와 Python 기반 WAS가 통신하기 위한 중간 다리 역할을 담당함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Web Server 자체만으로는 Python 코드를 이해하지 못함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Python은 bytes로 구성되는 HTTP 메시지를 이해하지 못함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 중간 다리 역할인 WSGI가 필요함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_2&quot;&gt;2. uWSGI 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 pem키가 있는 디렉토리로 이동해서 인스턴스에 접속해줍니다.&lt;/span&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;인스턴스 접속.PNG&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lYjUo/btrLMxk13hm/LJ6NHBXMnawfKQFV5soZuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lYjUo/btrLMxk13hm/LJ6NHBXMnawfKQFV5soZuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lYjUo/btrLMxk13hm/LJ6NHBXMnawfKQFV5soZuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlYjUo%2FbtrLMxk13hm%2FLJ6NHBXMnawfKQFV5soZuk%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;1388&quot; height=&quot;247&quot; data-filename=&quot;인스턴스 접속.PNG&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;가상환경 활성화.PNG&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsYwdl/btrLMxL7irb/Q5SjH0hCdXNkQVfE9y5q2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsYwdl/btrLMxL7irb/Q5SjH0hCdXNkQVfE9y5q2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsYwdl/btrLMxL7irb/Q5SjH0hCdXNkQVfE9y5q2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsYwdl%2FbtrLMxL7irb%2FQ5SjH0hCdXNkQVfE9y5q2K%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;1007&quot; height=&quot;260&quot; data-filename=&quot;가상환경 활성화.PNG&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;260&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시스템 전역 uWSGI 설치&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664507632249&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install python3-dev python3-pip python3-setuptools
sudo -H pip3 install --upgrade pip
sudo -H pip3 install wheel
sudo -H pip3 install uwsgi&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 style=&quot;color: #000000;&quot;&gt;가상 환경 내에서 단순히 pip install uWSGI로 설치하면 가상 환경 내에만 패키지가 설치되지만 위 명령어로 설치하면 시스템 전역에서 uWSGI를 설치하게 됩니다. 이후에 service 등록 부분 때문에 필요한 사전작업입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서비스 등록 파일 생성&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664508098080&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vim /etc/systemd/system/uwsgi.service&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 style=&quot;color: #000000;&quot;&gt;위 명령어를 사용하여 system 디렉토리 내에 서비스 파일을 vim 에디터로 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(vim은 vi에서 업그레이드된 텍스트 에디터입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;vim 창이 열렸다면 Shift+i 키를 눌러 INSERT 모드로 변경한 뒤 밑에 코드를 복사하시고 밑에 코드와 같이 작성하시면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664508286492&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Unit]
Description=uWSGI Emperor service

[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target&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 style=&quot;color: #000000;&quot;&gt;모두 입력하셨다면 ESC를 누르고 :wq 입력 후 ENTER로 vim 창을 나가줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ini 파일 생성 (uWSGI 옵션 설정)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음 명령어로 ini 파일을 넣을 디렉토리를 생성해줍니다.&amp;nbsp;&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 style=&quot;background-color: #ffffff;&quot;&gt;추후에 여러 개의 WSGI 서버를 구동할 수도 있기 때문에 &lt;/span&gt;/etc/uwsgi/sites&lt;span style=&quot;background-color: #ffffff;&quot;&gt;와 같은 시스템 설정 디렉토리에 여러 개의. ini 파일을 모아놓는 과정입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664508539804&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir -p /etc/uwsgi/sites&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 style=&quot;color: #000000;&quot;&gt;다음 명령어로 ini 파일을 vim 에디터로 생성해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664514171005&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vim uwsgi.ini&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 style=&quot;color: #000000;&quot;&gt;다음 명령어로 uWSGI 옵션을 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662885138651&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[uwsgi]
chdir=/home/ubuntu/crypto_currency
module=siteproject.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/home/ubuntu/crypto_currency/django.log
home=/home/ubuntu/crypto_currency/venv
virtualenv=/home/ubuntu/crypto_currency/venv
socket=/home/ubuntu/crypto_currency/uwsgi.sock
chmod-socket=666&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 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;chdir=/home/ubuntu/&lt;b&gt;프로젝트 폴더&amp;nbsp;&lt;/b&gt;(프로젝트 폴더 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;module=&lt;b&gt;프로젝트 이름&lt;/b&gt;.wsgi:application (wsgi.py가 위치하는 프로젝트 이름입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;settings.py에 WSGI_APPLICATION 부분을 보면 쉽게 찾을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wsgi.PNG&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WCSjl/btrNIKJqG9H/9hoJAisghQDCWAhHVev7B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WCSjl/btrNIKJqG9H/9hoJAisghQDCWAhHVev7B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WCSjl/btrNIKJqG9H/9hoJAisghQDCWAhHVev7B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWCSjl%2FbtrNIKJqG9H%2F9hoJAisghQDCWAhHVev7B0%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;618&quot; height=&quot;42&quot; data-filename=&quot;wsgi.PNG&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;master=True (uWSGI를 master 모드로 실행하는 옵션입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pidfile=/tmp/project-master.pid (마스터 프로세스 ID를 저장하는 파일 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;vacuum=True (프로세스 종료 시 소켓 파일을 포함하여 환경 변수를 삭제하는 옵션입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;max-requests=5000 (프로세스에서 처리할 최대 요청수입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;daemonize=/home/ubuntu/&lt;b&gt;프로젝트 폴더&lt;/b&gt;/django.log (에러 로그 파일 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;home=/home/ubuntu/&lt;b&gt;프로젝트 폴더&lt;/b&gt;/venv (가상 환경 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;virtualenv=/home/ubuntu/&lt;b&gt;프로젝트 폴더&lt;/b&gt;/venv (가상 환경 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;socket=/home/ubuntu/&lt;b&gt;프로젝트 폴더&lt;/b&gt;/uwsgi.sock (uwsgi.sock 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;chmod-socket=666 (권한 설정입니다.)&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;모두 입력하셨다면 ESC를 누르고 :wq 입력 후 ENTER로 vim 창을 나가줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가상 환경이 프로젝트 폴더 내에 설치되어 있고 프로젝트 폴더 내에서 uWSGI를 설치했다면 위와 같이 코드를 작성하면 될 것이고 그렇지 않다면 경로에 맞게 코드를 수정하시면 됩니다. ini 파일을 정확히 입력하지 않는다면 서버가 정상적으로 동작하지 않으므로 두 번 세 번 꼼꼼하게 검토해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;uWSGI 서비스 시작&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음 명령어로 uWSGI 서비스를 시작해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;start는 서버 시작을 의미하고 enable은 서버 자동시작 옵션을 활성화해주는 것을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664864005560&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl start uwsgi
sudo systemctl enable uwsgi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;uWSGI 서비스 동작 확인&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664515255177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status uwsgi&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 style=&quot;color: #000000;&quot;&gt;서버의 상태가 active(running)으로 잘 동작하는 것을 볼 수 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;uwsgi status.PNG&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kMGTc/btrNL9aOZY0/hdkVdj8CRA7qTiSyZnOF0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kMGTc/btrNL9aOZY0/hdkVdj8CRA7qTiSyZnOF0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kMGTc/btrNL9aOZY0/hdkVdj8CRA7qTiSyZnOF0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkMGTc%2FbtrNL9aOZY0%2FhdkVdj8CRA7qTiSyZnOF0K%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;1312&quot; height=&quot;534&quot; data-filename=&quot;uwsgi status.PNG&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_3&quot;&gt;3. Nginx 설정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Nginx 설치&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;sudo apt-get install nginx&lt;/b&gt; 명령어로 nginx를 설치해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;etc/nginx 경로에 들어가 보시면 nginx.conf와 sites-enabled 같은 nginx 설정 파일들이 모여있는 것을 볼 수 있습니다.&lt;/span&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;nginx 폴더.PNG&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCjMn/btrLLXj036f/MvQkyDGZn9J7CwkeccUlkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCjMn/btrLLXj036f/MvQkyDGZn9J7CwkeccUlkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCjMn/btrLLXj036f/MvQkyDGZn9J7CwkeccUlkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCjMn%2FbtrLLXj036f%2FMvQkyDGZn9J7CwkeccUlkk%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;1340&quot; height=&quot;74&quot; data-filename=&quot;nginx 폴더.PNG&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;nginx.conf 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;sudo vim /etc/nginx/nginx.conf&lt;/b&gt;&amp;nbsp;명령어로 nginx 설정 파일을 vim 에디터로 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;INSERT 모드로 들어가서 http 부분에 upstream django 이하 코드를 삽입합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nginx conf.PNG&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVGJy7/btrNNgABmzB/7N2cL8kLMTMWq9KnV0q7Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVGJy7/btrNNgABmzB/7N2cL8kLMTMWq9KnV0q7Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVGJy7/btrNNgABmzB/7N2cL8kLMTMWq9KnV0q7Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVGJy7%2FbtrNNgABmzB%2F7N2cL8kLMTMWq9KnV0q7Uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;348&quot; data-filename=&quot;nginx conf.PNG&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;server unix:/home/ubuntu/프로젝트 폴더/uwsgi.sock; (uwsgi.sock 파일 경로입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;django와 uwsgi를 연결하는 부분이라고 생각하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 user www-data 부분을 &lt;b&gt;user root;&amp;nbsp;&lt;/b&gt;로 바꿔줍니다. 관리자 권한을 부여하는 과정입니다. 이를 설정하지 않는다면 다음과 같은 permission denied error가 발생할 수 있습니다.&lt;/span&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;nginx tail error log.PNG&quot; data-origin-width=&quot;1663&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KSwEG/btrNrzVTewO/1FiyFgx1fFcf9OpsFwkBOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KSwEG/btrNrzVTewO/1FiyFgx1fFcf9OpsFwkBOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KSwEG/btrNrzVTewO/1FiyFgx1fFcf9OpsFwkBOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKSwEG%2FbtrNrzVTewO%2F1FiyFgx1fFcf9OpsFwkBOk%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;1348&quot; height=&quot;221&quot; data-filename=&quot;nginx tail error log.PNG&quot; data-origin-width=&quot;1663&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모두 입력하셨다면 ESC를 누르고 :wq 입력 후 ENTER로 vim 창을 나가줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Nginx sites-enabled 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음 명령어로 default 파일을 vim 에디터로 실행해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664865786490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vim /etc/nginx/sites-enabled/default&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 style=&quot;color: #000000;&quot;&gt;location 부분에 try file 라인을 지우고 다음과 같이 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664865902927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;include /etc/nginx/uwsgi_params;
uwsgi_pass django;&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 style=&quot;color: #000000;&quot;&gt;uwsgi와 django를 연결하는 과정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 그 밑에 다음 명령어로 정적 파일을 관리하는 static 폴더와 media 폴더 경로를 명시해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664866076426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;location /static/ {
	alias /home/ubuntu/프로젝트 폴더/static/;
}

location /media/ {
	alias /home/ubuntu/프로젝트 폴더/media/;
}&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 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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sites enabled default.PNG&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ICxrN/btrNGxwXOU8/tVUE6LxX6ELkFwBKWctaak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ICxrN/btrNGxwXOU8/tVUE6LxX6ELkFwBKWctaak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ICxrN/btrNGxwXOU8/tVUE6LxX6ELkFwBKWctaak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FICxrN%2FbtrNGxwXOU8%2FtVUE6LxX6ELkFwBKWctaak%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;687&quot; height=&quot;360&quot; data-filename=&quot;sites enabled default.PNG&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본인의 static 폴더 경로를 정확히 입력해야 합니다. media 폴더가 없다면 static 폴더만 입력해도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제 기준으로 /home/ubuntu/crypto_currency/static/ 폴더가 존재하는 것을 볼 수 있습니다.&lt;/span&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;static 폴더경로.PNG&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5fd1b/btrNNfhr7X1/TTJ353V1z01DrC3UJB3RX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5fd1b/btrNNfhr7X1/TTJ353V1z01DrC3UJB3RX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5fd1b/btrNNfhr7X1/TTJ353V1z01DrC3UJB3RX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5fd1b%2FbtrNNfhr7X1%2FTTJ353V1z01DrC3UJB3RX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;77&quot; data-filename=&quot;static 폴더경로.PNG&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;77&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Nginx 에러 로그 보는 법&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664515695058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -f /var/log/nginx/error.log&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 style=&quot;color: #000000;&quot;&gt;위의 명령어를 입력하면 nginx 에러 로그를 확인할 수 있습니다.&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;다음 사진과 같은 502 Bad Gateway 에러가 발생한다면 nginx 에러 로그부터 확인해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;502 bad gateway.PNG&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1rt67/btrNthtEFcl/icJI7RjLyJlHWHhFZEl8L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1rt67/btrNthtEFcl/icJI7RjLyJlHWHhFZEl8L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1rt67/btrNthtEFcl/icJI7RjLyJlHWHhFZEl8L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1rt67%2FbtrNthtEFcl%2FicJI7RjLyJlHWHhFZEl8L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;125&quot; data-filename=&quot;502 bad gateway.PNG&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_4&quot;&gt;4. 서버 재시작&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 설정은 모두 끝났습니다. 다음 명령어로 nginx 설정 문법 검사를 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664516981134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nginx -t&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 style=&quot;color: #000000;&quot;&gt;syntax is ok / test is successful이 출력된다면 nginx.conf 설정 파일 내 문법에 문제가 없다는 뜻입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nginx 문법검사.PNG&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu04PK/btrNFTGPBar/P4eQUNQMggxk4Ocvly1HAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu04PK/btrNFTGPBar/P4eQUNQMggxk4Ocvly1HAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu04PK/btrNFTGPBar/P4eQUNQMggxk4Ocvly1HAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu04PK%2FbtrNFTGPBar%2FP4eQUNQMggxk4Ocvly1HAK%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;755&quot; height=&quot;75&quot; data-filename=&quot;nginx 문법검사.PNG&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;nginx와 uwsgi를 재시작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664517090140&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl restart nginx
sudo systemctl restart uwsgi&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;position: absolute;&quot; 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;nginx와 uwsgi의 동작 상태를 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664517122529&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status nginx
sudo systemctl status uwsgi&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 style=&quot;color: #000000;&quot;&gt;둘 다 active(running) 상태로 잘 동작하는 것을 확인했다면 사이트에 정상적으로 접속될 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nginx status.PNG&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZXVN/btrNNNkxZzc/axqzSKo2cWlswzYf2iogck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZXVN/btrNNNkxZzc/axqzSKo2cWlswzYf2iogck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZXVN/btrNNNkxZzc/axqzSKo2cWlswzYf2iogck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZXVN%2FbtrNNNkxZzc%2FaxqzSKo2cWlswzYf2iogck%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;1333&quot; height=&quot;388&quot; data-filename=&quot;nginx status.PNG&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 할당했던 탄력적 IP로 8000 포트를 빼고 주소창에 입력하면 됩니다.&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;지금까지 총 3개의 포스팅에 걸쳐 AWS에 프로젝트 배포하는 방법에 대해 공부해보았습니다. &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;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>Django</category>
      <category>nginx</category>
      <category>uwsgi</category>
      <category>배포</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/20</guid>
      <comments>https://codest.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 4 Oct 2022 16:05:47 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] RDS 인스턴스 백업 및 복원 (스냅샷, 자동 백업, 특정 시점으로 복원)</title>
      <link>https://codest.tistory.com/19</link>
      <description>&lt;!-- jQuery CDN --&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 오늘은 AWS의 데이터베이스 관리 시스템인 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;데이터베이스의 백업은 개발 업무에 있어 매우 중요한 작업인데요. 백업은 보통 Data Export를 통해 DB를 dump파일로 저장하여 보관합니다. 하지만 RDS를 사용한다면 따로 dump 파일을 저장할 필요 없이 특정 시점의 스냅샷을 저장해놓고 언제든 복원이 가능하며 자동 백업 기능을 활성화해 놓는다면 이러한 과정도 필요 없기 때문에 매우 편리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;#no_1&quot;&gt;1. RDS 백업 설정 확인&lt;/a&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;a style=&quot;color: #000000;&quot; href=&quot;#no_2&quot;&gt;2. 스냅샷 생성 및 복원 (수동 백업)&lt;/a&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;a style=&quot;color: #000000;&quot; href=&quot;#no_3&quot;&gt;3. 특정 시점으로 복원 (자동 백업)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b id=&quot;no_1&quot;&gt;1. RDS 백업 설정 확인&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Amazon RDS - 데이터베이스 - 복구대상 RDS - 유지 관리 및 백업&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;자동백업 활성화.PNG&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUPVx/btrLlFjZYi6/FyXmfh3Mx4JQ7Tbt3M94a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUPVx/btrLlFjZYi6/FyXmfh3Mx4JQ7Tbt3M94a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUPVx/btrLlFjZYi6/FyXmfh3Mx4JQ7Tbt3M94a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUPVx%2FbtrLlFjZYi6%2FFyXmfh3Mx4JQ7Tbt3M94a1%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;1602&quot; height=&quot;262&quot; data-filename=&quot;자동백업 활성화.PNG&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;262&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;자동 백업이 활성화되어 있는 것을 볼 수 있습니다. 7 Days는 최근 7일 동안의 백업 데이터를 저장하고 있다는 의미이고 백업 기간은 19:41 ~ 20:11 사이의 데이터를 백업한다는 의미입니다. 보통 하루에 한 번 백업이 진행되고 설정에 따라 백업 주기는 달라질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Amazon RDS - 스냅샷 - 자동&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9월 5일 기준으로 8월 25일 ~ 9월 4일 기간에 하루 한번 스냅샷이 생성되어있는 것을 볼 수 있습니다.&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;자동 스냅샷.PNG&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XaOro/btrLmxGaT36/EHdi137eZp9oy1Onr8TVEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XaOro/btrLmxGaT36/EHdi137eZp9oy1Onr8TVEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XaOro/btrLmxGaT36/EHdi137eZp9oy1Onr8TVEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXaOro%2FbtrLmxGaT36%2FEHdi137eZp9oy1Onr8TVEK%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;992&quot; height=&quot;590&quot; data-filename=&quot;자동 스냅샷.PNG&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b id=&quot;no_2&quot;&gt;2. 스냅샷 생성 및 복원 (수동 백업)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Amazon RDS - 스냅샷 - 수동&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스냅샷 생성을 누른 후 백업할 DB 인스턴스를 선택한 후 이름을 현재 날짜와 시간을 포함시켜 정한 다음 스냅샷 만들기를 클릭하시면 됩니다. 단, 스냅샷이 생성되는 중에는 기존 DB가 다운될 수 있으니 서비스 중인 인스턴스가 있다면 주의해주시기 바랍니다. (데이터 양에 따라 다르지만 5분 내외로 걸립니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;수동 스냅샷.PNG&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EyuJ0/btrLotwKJoo/JKU7nsa3ZGYaIByWoP3pbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EyuJ0/btrLotwKJoo/JKU7nsa3ZGYaIByWoP3pbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EyuJ0/btrLotwKJoo/JKU7nsa3ZGYaIByWoP3pbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEyuJ0%2FbtrLotwKJoo%2FJKU7nsa3ZGYaIByWoP3pbK%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;750&quot; height=&quot;442&quot; data-filename=&quot;수동 스냅샷.PNG&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;442&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b id=&quot;no_3&quot;&gt;3. 특정 시점으로 복원 (자동 백업)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS 자동 백업 탭에 들어가서 복원하고자 하는 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;RDS 자동백업 탭.PNG&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTiq7c/btrNumIi0RW/NKh0JkvgAYFWFaDTuUqSr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTiq7c/btrNumIi0RW/NKh0JkvgAYFWFaDTuUqSr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTiq7c/btrNumIi0RW/NKh0JkvgAYFWFaDTuUqSr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTiq7c%2FbtrNumIi0RW%2FNKh0JkvgAYFWFaDTuUqSr1%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;1907&quot; height=&quot;392&quot; data-filename=&quot;RDS 자동백업 탭.PNG&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 가장 빠른 복원 가능 시간이란 이 시간 이전의 데이터는 복원할 수 없다는 의미입니다. 그리고 최근 복원 가능 시간이란 이 시간보다 최근의 데이터는 복원할 수 없다는 의미입니다. 즉, 가장 빠른 복원 가능 시간 ~ 최근 복원 가능 시간 사이에 있는 특정 시점으로는 어떠한 데이터라도 복구 가능합니다. 참고로 RDS 복원은 기존 RDS 인스턴스의 데이터가 복구되는 것이 아니라 복구 시점의 데이터를 바탕으로 새로운 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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;특정 시점으로 복원.PNG&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXTkFF/btrLujNp5UJ/TXF5HLSk6fPKexrAV090h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXTkFF/btrLujNp5UJ/TXF5HLSk6fPKexrAV090h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXTkFF/btrLujNp5UJ/TXF5HLSk6fPKexrAV090h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXTkFF%2FbtrLujNp5UJ%2FTXF5HLSk6fPKexrAV090h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;417&quot; data-filename=&quot;특정 시점으로 복원.PNG&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복원 가능한 최근 시간을 선택한다면 제일 최근 시점으로 복원을 할 수 있고 사용자 지정 날짜 및 시간을 선택하면 복구 가능시간 사이에 정확한 시간 분 초까지 설정해서 복원 시점을 정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에 설정들은 기존 RDS 인스턴스와 똑같이 복제되므로 따로 수정할 필요 없습니다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;삭제방지.PNG&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWwXj/btrNvr3gqTX/ixTYkIVr31TK4MCVXbQLr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWwXj/btrNvr3gqTX/ixTYkIVr31TK4MCVXbQLr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWwXj/btrNvr3gqTX/ixTYkIVr31TK4MCVXbQLr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWwXj%2FbtrNvr3gqTX%2FixTYkIVr31TK4MCVXbQLr1%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;726&quot; height=&quot;357&quot; data-filename=&quot;삭제방지.PNG&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 새로운 인스턴스를 기존 프로젝트에 연결하여 사용하시면 됩니다.&lt;/p&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 인스턴스를 삭제하면 자동 백업된 스냅샷들은 같이 삭제가 되고 수동 백업한 스냅샷은 유지가 됩니다. 그렇기 때문에 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;이상으로 포스팅을 마치겠습니다. 감사합니다.&lt;/p&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>AWS</category>
      <category>AWS</category>
      <category>DB 덤프</category>
      <category>RDS</category>
      <category>데이터 백업 및 복원</category>
      <category>데이터베이스</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/19</guid>
      <comments>https://codest.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 30 Sep 2022 17:21:01 +0900</pubDate>
    </item>
    <item>
      <title>[Tistory] 티스토리 블로그 목차 링크 달기(클릭 시 부드러운 이동)</title>
      <link>https://codest.tistory.com/18</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;!-- jQuery CDN --&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;#no_1&quot;&gt;1. 목차에 링크 적용하기&lt;/a&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;a style=&quot;color: #000000;&quot; href=&quot;#no_2&quot;&gt;2. 부드러운 화면 전환(JQuery)&lt;/a&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_1&quot;&gt;1. 목차에 링크 적용하기&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1.&amp;nbsp;Instance&amp;nbsp;Scheduler&amp;nbsp;Architecture &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;CloudFormation&amp;nbsp;-&amp;nbsp;스택&amp;nbsp;생성 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.&amp;nbsp;DynamoDB&amp;nbsp;-&amp;nbsp;테이블&amp;nbsp;수정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.&amp;nbsp;인스턴스에&amp;nbsp;스케줄러&amp;nbsp;적용 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5.&amp;nbsp;웹&amp;nbsp;서버,&amp;nbsp;WSGI&amp;nbsp;restart&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;이제 목차에 링크를 적용해보겠습니다. 글 수정을 누른 후 우측 상단에 있는 버튼을 눌러 HTML 모드로 변경합니다.&lt;/span&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;HTML 모드.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpyDwU/btrLwz49h8Q/KAe8rqSjKDkKkamcSnjbWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpyDwU/btrLwz49h8Q/KAe8rqSjKDkKkamcSnjbWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpyDwU/btrLwz49h8Q/KAe8rqSjKDkKkamcSnjbWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpyDwU%2FbtrLwz49h8Q%2FKAe8rqSjKDkKkamcSnjbWk%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;1396&quot; height=&quot;165&quot; data-filename=&quot;HTML 모드.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;링크 적용전의 목차 부분 HTML 코드입니다. HTML 모드를 사용하면 페이지의 HTML 코드를 직접 수정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;링크X 코드.PNG&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk90HF/btrLDH7WK4t/27enPklhdT3iLY4taBGJG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk90HF/btrLDH7WK4t/27enPklhdT3iLY4taBGJG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk90HF/btrLDH7WK4t/27enPklhdT3iLY4taBGJG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk90HF%2FbtrLDH7WK4t%2F27enPklhdT3iLY4taBGJG1%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;1012&quot; height=&quot;238&quot; data-filename=&quot;링크X 코드.PNG&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;목차마다 a 태그를 삽입합니다. &amp;lt;a href=&quot;# + id&quot;&amp;gt;&amp;lt;a\&amp;gt;의 형태로써 id값에 해당하는 element로 이동하는 태그입니다. id를 no_1, no_2 이렇게 정했으니 이동할 위치에 id를 할당해주어야 합니다. 각 목차의 내용이 시작되는 태그에 id를 적어줍니다. 보통 목차명을 적고 그 뒤에 내용이 시작되니 목차명 부분에 id를 할당해주시면 됩니다.&lt;/span&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;링크 코드.PNG&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tmFao/btrLzpAIPhm/XdxJcH59Ng4PVz3jpI3KrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tmFao/btrLzpAIPhm/XdxJcH59Ng4PVz3jpI3KrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tmFao/btrLzpAIPhm/XdxJcH59Ng4PVz3jpI3KrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtmFao%2FbtrLzpAIPhm%2FXdxJcH59Ng4PVz3jpI3KrK%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;949&quot; height=&quot;240&quot; data-filename=&quot;링크 코드.PNG&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나머지 목차들도 id를 모두 할당해줍니다. CTRL+F를 눌러 검색 기능을 활용하시면 빠르게 목차들의 위치를 찾을 수 있습니다.&lt;/span&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;링크 코드2.PNG&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd9GUv/btrLzQ5ZvyJ/6gRXEMYwdsuY7dxBpzBKNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd9GUv/btrLzQ5ZvyJ/6gRXEMYwdsuY7dxBpzBKNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd9GUv/btrLzQ5ZvyJ/6gRXEMYwdsuY7dxBpzBKNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd9GUv%2FbtrLzQ5ZvyJ%2F6gRXEMYwdsuY7dxBpzBKNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;119&quot; data-filename=&quot;링크 코드2.PNG&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 목차명에 id를 할당해주었다면 수정 완료를 하고 링크가 잘 동작하는지 확인해봅니다.&lt;/span&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;목차 링크 끊김.gif&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsqLqq/btrLAzbWGKM/A3CgH8WZXEvBCN2h6eMMl1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsqLqq/btrLAzbWGKM/A3CgH8WZXEvBCN2h6eMMl1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsqLqq/btrLAzbWGKM/A3CgH8WZXEvBCN2h6eMMl1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dsqLqq/btrLAzbWGKM/A3CgH8WZXEvBCN2h6eMMl1/img.gif&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;1910&quot; height=&quot;927&quot; data-filename=&quot;목차 링크 끊김.gif&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_2&quot;&gt;2. 부드러운 화면 전환(JQuery)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;화면 전환을 부드럽게 하기 위해서는 script 코드를 삽입해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다시 글 수정 페이지에 들어가서 HTML 모드로 들어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;주의할 점은 글 수정을 할 때마다 목차명에 할당되었던 id값이 사라지는 현상이 있습니다.&lt;/b&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;b&gt;사라졌다면 다시 id값을 넣어줍니다. &lt;/b&gt;script코드는 다음과 같습니다.&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;JQuery CDN을 사용하였고 해당 id값의 태그로 이동하는 클릭 이벤트 함수를 작성해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 JQuery란 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;JavaScript 언어를 단순화시킨 오픈 소스 기반의 라이브러리입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662527676292&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- jQuery CDN --&amp;gt;
&amp;lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
jQuery(document).ready(function($) {
    // &amp;lt;a&amp;gt;&amp;lt;/a&amp;gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;링크 코드3.PNG&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5wIfT/btrLBzbJVwD/ynMGpPtVmG0cLVVqB6XQ00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5wIfT/btrLBzbJVwD/ynMGpPtVmG0cLVVqB6XQ00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5wIfT/btrLBzbJVwD/ynMGpPtVmG0cLVVqB6XQ00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5wIfT%2FbtrLBzbJVwD%2FynMGpPtVmG0cLVVqB6XQ00%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;842&quot; height=&quot;420&quot; data-filename=&quot;링크 코드3.PNG&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;목차 링크.gif&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehzghS/btrLDPru06C/Rah04mptsqNKMLufmLgH71/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehzghS/btrLDPru06C/Rah04mptsqNKMLufmLgH71/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehzghS/btrLDPru06C/Rah04mptsqNKMLufmLgH71/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ehzghS/btrLDPru06C/Rah04mptsqNKMLufmLgH71/img.gif&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;1910&quot; height=&quot;927&quot; data-filename=&quot;목차 링크.gif&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;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;글을 중간에 수정하면 id를 할당했던 것들이 풀리는 오류가 있기 때문입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;글 수정에 들어가서 다시 각 목차 부분을 보면 id 값이 없어져 있습니다.&lt;/span&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;링크 풀렸을 때 코드.PNG&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6zwiw/btrNGv0exW4/qbQHbm8XhmzrRKRK2KMaIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6zwiw/btrNGv0exW4/qbQHbm8XhmzrRKRK2KMaIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6zwiw/btrNGv0exW4/qbQHbm8XhmzrRKRK2KMaIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6zwiw%2FbtrNGv0exW4%2FqbQHbm8XhmzrRKRK2KMaIK%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;1443&quot; height=&quot;95&quot; data-filename=&quot;링크 풀렸을 때 코드.PNG&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;당황하지 마시고 id를 다시 할당해주면 됩니다. 번거롭겠지만 글 수정 할 일이 생기면 목차에 id값을 다시 할당해주어야 합니다.&lt;/span&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;링크 풀렸을 때 코드 수정 후.PNG&quot; data-origin-width=&quot;1451&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctcIho/btrNEvGaDGC/LYpqRASlGQllr0jHQgaTk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctcIho/btrNEvGaDGC/LYpqRASlGQllr0jHQgaTk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctcIho/btrNEvGaDGC/LYpqRASlGQllr0jHQgaTk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctcIho%2FbtrNEvGaDGC%2FLYpqRASlGQllr0jHQgaTk1%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;1451&quot; height=&quot;93&quot; data-filename=&quot;링크 풀렸을 때 코드 수정 후.PNG&quot; data-origin-width=&quot;1451&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이상으로 티스토리 목차 링크 달기에 대한 글을 마치겠습니다. 감사합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Tistory</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>jquery</category>
      <category>목차 링크</category>
      <category>티스토리</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/18</guid>
      <comments>https://codest.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 7 Sep 2022 14:36:08 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2 인스턴스 스케줄러 적용, 서버 재시작 자동화</title>
      <link>https://codest.tistory.com/17</link>
      <description>&lt;!-- jQuery CDN --&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요! 이번 포스팅에서는 EC2 인스턴스를 원하는 시간대에 중지하고 시작할 수 있게 해주는 스케줄러 기능을 적용하여 인스턴스 비용을 줄일 수 있는 방법에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;#no_1&quot;&gt;1. Instance Scheduler Architecture&lt;/a&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;a href=&quot;#no_2&quot;&gt;2. CloudFormation - 스택 생성&lt;/a&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;a href=&quot;#no_3&quot;&gt;3. DynamoDB - 테이블 수정&lt;/a&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;a href=&quot;#no_4&quot;&gt;4. 인스턴스에 스케줄러 적용&lt;/a&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;a href=&quot;#no_5&quot;&gt;5. 웹 서버, WSGI restart 자동화&lt;/a&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_1&quot;&gt;1. Instance Scheduler Architecture&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스케줄러 구조.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hg09L/btrLspUo3cc/gSJiMf0gRfU4pZS4gLKiL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hg09L/btrLspUo3cc/gSJiMf0gRfU4pZS4gLKiL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hg09L/btrLspUo3cc/gSJiMf0gRfU4pZS4gLKiL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHg09L%2FbtrLspUo3cc%2FgSJiMf0gRfU4pZS4gLKiL1%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;635&quot; height=&quot;426&quot; data-filename=&quot;스케줄러 구조.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AWS 공식 홈페이지 설명&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://aws.amazon.com/ko/cloudformation/&quot;&gt;AWS CloudFormation&lt;/a&gt;&amp;nbsp;템플릿은 고객이 정의한 간격으로&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://aws.amazon.com/ko/cloudwatch/&quot;&gt;Amazon CloudWatch&lt;/a&gt;&amp;nbsp;이벤트를 설정합니다. 이 이벤트는 Instance Scheduler&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://aws.amazon.com/ko/lambda/&quot;&gt;AWS Lambda 함수&lt;/a&gt;를 호출합니다. 구성 중에 AWS 리전 및 계정을 정의하고 Instance Scheduler on AWS가 일정을 해당&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://aws.amazon.com/ko/ec2/&quot;&gt;Amazon EC2&lt;/a&gt;&amp;nbsp;및&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://aws.amazon.com/ko/rds/&quot;&gt;Amazon RDS&lt;/a&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;2. 이러한 값은&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://aws.amazon.com/ko/dynamodb/&quot;&gt;Amazon DynamoDB&lt;/a&gt;에 저장되며 Lambda 함수는 실행될 때마다 해당 값을 검색합니다. 그런 다음 해당하는 인스턴스에 사용자 지정 태그를 적용할 수 있습니다.&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;3. Instance Scheduler의 초기 구성 중에 해당하는 Amazon EC2 및 Amazon RDS 인스턴스를 식별할 태그 키를 정의합니다. 지정한 이름은 일정 생성 시 태그 지정된 리소스에 적용할 일정을 식별하는 태그 값으로 사용됩니다.&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_2&quot;&gt;2. CloudFormation - 스택 생성&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CloudFormation 서비스 - 스택 - 스택 생성 - 새 리소스 사용(표준)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스택 생성 버튼.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3bZyz/btrLkaxpJCj/VFrTbkKotsnaw086CvBYX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3bZyz/btrLkaxpJCj/VFrTbkKotsnaw086CvBYX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3bZyz/btrLkaxpJCj/VFrTbkKotsnaw086CvBYX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3bZyz%2FbtrLkaxpJCj%2FVFrTbkKotsnaw086CvBYX1%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;1892&quot; height=&quot;470&quot; data-filename=&quot;스택 생성 버튼.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스택 생성 - 템플릿 지정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;준비된 템플릿을 선택하고 템플릿 URL을 입력합니다.&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;AWS에서 제공하는 기본 템플릿 링크입니다. 이를 입력해줍니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/aws-instance-scheduler.template&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/aws-instance-scheduler.template&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스택 생성.PNG&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baCGEs/btrLqV65GnW/PISJGsAQmPQ0UvZC9FKvDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baCGEs/btrLqV65GnW/PISJGsAQmPQ0UvZC9FKvDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baCGEs/btrLqV65GnW/PISJGsAQmPQ0UvZC9FKvDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaCGEs%2FbtrLqV65GnW%2FPISJGsAQmPQ0UvZC9FKvDK%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;1354&quot; height=&quot;776&quot; data-filename=&quot;스택 생성.PNG&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;776&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스택 세부 정보 지정 - 스택 이름&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스택 이름.PNG&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEKwh/btrLlF4SZLM/2AktDkMiMFBlipas3inN3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEKwh/btrLlF4SZLM/2AktDkMiMFBlipas3inN3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEKwh/btrLlF4SZLM/2AktDkMiMFBlipas3inN3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEKwh%2FbtrLlF4SZLM%2F2AktDkMiMFBlipas3inN3k%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;938&quot; height=&quot;239&quot; data-filename=&quot;스택 이름.PNG&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;239&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스택 세부 정보 지정 - 파라미터&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Default time zone - Asia / Seoul로 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;파라미터 설정1.PNG&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GlBYI/btrLuCSXcne/OP28yU9kYrNeTnojZ7oWQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GlBYI/btrLuCSXcne/OP28yU9kYrNeTnojZ7oWQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GlBYI/btrLuCSXcne/OP28yU9kYrNeTnojZ7oWQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGlBYI%2FbtrLuCSXcne%2FOP28yU9kYrNeTnojZ7oWQ0%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;1041&quot; height=&quot;803&quot; data-filename=&quot;파라미터 설정1.PNG&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Frequency는 스케줄러가 동작하는 주기를 설정하는 것입니다. 30으로 설정하면 30분마다 인스턴스가 켜졌다 꺼졌다 하는데 실제로 우리는 원하는 시간대를 설정하여 스케줄러를 적용할 것이기 때문에 신경 쓰지 않아도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Started tags와 Stopped tags를 사진과 같이 설정해줍니다. 스케줄러를 적용한 후 인스턴스의 동작 상태를 태그로 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;파라미터 설정2.PNG&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dofO9D/btrLtYoFxBv/iItlV7OkyWZizoKegkFuU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dofO9D/btrLtYoFxBv/iItlV7OkyWZizoKegkFuU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dofO9D/btrLtYoFxBv/iItlV7OkyWZizoKegkFuU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdofO9D%2FbtrLtYoFxBv%2FiItlV7OkyWZizoKegkFuU0%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;1034&quot; height=&quot;850&quot; data-filename=&quot;파라미터 설정2.PNG&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;850&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스택 옵션 구성&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스택 옵션.PNG&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6xqq/btrLiBPERwu/b0LNszRCDOTBgtxkaDY841/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6xqq/btrLiBPERwu/b0LNszRCDOTBgtxkaDY841/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6xqq/btrLiBPERwu/b0LNszRCDOTBgtxkaDY841/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6xqq%2FbtrLiBPERwu%2Fb0LNszRCDOTBgtxkaDY841%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;944&quot; height=&quot;494&quot; data-filename=&quot;스택 옵션.PNG&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;494&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;검토 -&amp;nbsp; 기능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;CloudFormation에서 리소스를 생성할 수 있는 권한을 부여하는 것입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스택 검토 접근권한.PNG&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TuRLC/btrLqW50usC/OxbqxCFVFanKa0SbAG5Ro1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TuRLC/btrLqW50usC/OxbqxCFVFanKa0SbAG5Ro1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TuRLC/btrLqW50usC/OxbqxCFVFanKa0SbAG5Ro1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTuRLC%2FbtrLqW50usC%2FOxbqxCFVFanKa0SbAG5Ro1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;268&quot; data-filename=&quot;스택 검토 접근권한.PNG&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스택을 생성하게 되면 DynamoDB에 스케줄러 세부 설정을 할 수 있는 테이블이 자동으로 생성됩니다.&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;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_3&quot;&gt;3. DynamoDB - 테이블 수정&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;DynamoDB - 테이블 - 항목 탐색 - ConfigTable&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;
&lt;div&gt;
&lt;div data-context-id=&quot;34177032&quot; data-type=&quot;file&quot; data-node-type=&quot;media&quot; data-width=&quot;1408&quot; data-height=&quot;563&quot; data-id=&quot;34f36e25-fadb-41b6-9ef3-96e7809fc333&quot; data-collection=&quot;contentId-34177032&quot; data-file-name=&quot;dynamo DB 테이블.PNG&quot; data-file-size=&quot;80651&quot; data-file-mime-type=&quot;image/png&quot; data-alt=&quot;&quot;&gt;
&lt;div id=&quot;newFileExperienceWrapper&quot; data-testid=&quot;media-card-view&quot;&gt;
&lt;div data-testid=&quot;media-file-card-view&quot; data-test-status=&quot;complete&quot; data-test-media-name=&quot;dynamo DB 테이블.PNG&quot; data-test-progress=&quot;1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오전 10시 ~ 오후 10시 사이에만 인스턴스가 동작하는 스케줄러를 만들어 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;config, schedule, period 세 가지 type의 항목이 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 config는 그대로 두고 period와 schedule부터 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저는 config만 남기고 기본적으로 생성되어 있는 schedule과 period는 모두 삭제하고 새로 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dynamo DB 테이블.PNG&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWcAoD/btrLu7ST43M/5KHu6aDUEtF0kokkC8aTK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWcAoD/btrLu7ST43M/5KHu6aDUEtF0kokkC8aTK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWcAoD/btrLu7ST43M/5KHu6aDUEtF0kokkC8aTK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWcAoD%2FbtrLu7ST43M%2F5KHu6aDUEtF0kokkC8aTK0%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;1877&quot; height=&quot;750&quot; data-filename=&quot;dynamo DB 테이블.PNG&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;124&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-renderer-start-pos=&quot;124&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;항목 생성 - JSON 뷰 (type : period)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type은 period로 적고 name을 지정해줍니다. name인&amp;nbsp;&lt;b&gt;tenToten&lt;/b&gt;은 schedule 항목과 연결할 때 사용되니 기억해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;begintime, endtime, weekdays을 설정해줍니다. 차례대로 인스턴스 시작시간, 종료시간, 요일입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;period 편집.PNG&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uidfd/btrLu3iIsur/k68CXkQ3tnfGwKzNUu0UEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uidfd/btrLu3iIsur/k68CXkQ3tnfGwKzNUu0UEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uidfd/btrLu3iIsur/k68CXkQ3tnfGwKzNUu0UEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuidfd%2FbtrLu3iIsur%2Fk68CXkQ3tnfGwKzNUu0UEK%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;1190&quot; height=&quot;804&quot; data-filename=&quot;period 편집.PNG&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DynamoDB 데이터 형식에 따르면 S는 String, SS는 String Set 자료형을 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dynamoDB.PNG&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NBeQF/btrLqXqvq8t/S3sOfmRO8FcWvJKLDhRlp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NBeQF/btrLqXqvq8t/S3sOfmRO8FcWvJKLDhRlp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NBeQF/btrLqXqvq8t/S3sOfmRO8FcWvJKLDhRlp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNBeQF%2FbtrLqXqvq8t%2FS3sOfmRO8FcWvJKLDhRlp1%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;1187&quot; height=&quot;568&quot; data-filename=&quot;dynamoDB.PNG&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-renderer-start-pos=&quot;124&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;항목 생성 - JSON 뷰 (type : schedule)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-renderer-start-pos=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type은 schedule로 적고 name을 지정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;name인&amp;nbsp;&lt;b&gt;tetnToten-schedule&lt;/b&gt;은 인스턴스 태그 설정에서 사용되니 기억해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;periods에는 period name인 &lt;b&gt;tenToten&lt;/b&gt;을 적어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;schedule 편집.PNG&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZU06/btrLr1MZZKe/xMEF2WOKIqge59KzQbzcK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZU06/btrLr1MZZKe/xMEF2WOKIqge59KzQbzcK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZU06/btrLr1MZZKe/xMEF2WOKIqge59KzQbzcK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZU06%2FbtrLr1MZZKe%2FxMEF2WOKIqge59KzQbzcK0%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;1188&quot; height=&quot;802&quot; data-filename=&quot;schedule 편집.PNG&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;368&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-renderer-start-pos=&quot;370&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;항목 편집 - JSON 뷰 (type : config)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;
&lt;div&gt;
&lt;div data-context-id=&quot;34177032&quot; data-type=&quot;file&quot; data-node-type=&quot;media&quot; data-width=&quot;899&quot; data-height=&quot;433&quot; data-id=&quot;dedd180c-9aaa-4163-8964-738e5dd05142&quot; data-collection=&quot;contentId-34177032&quot; data-file-name=&quot;config 편집.PNG&quot; data-file-size=&quot;29756&quot; data-file-mime-type=&quot;image/png&quot; data-alt=&quot;&quot;&gt;
&lt;div id=&quot;newFileExperienceWrapper&quot; data-testid=&quot;media-card-view&quot;&gt;
&lt;div data-testid=&quot;media-file-card-view&quot; data-test-status=&quot;complete&quot; data-test-media-name=&quot;config 편집.PNG&quot; data-test-progress=&quot;1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;429&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tagname인&amp;nbsp;&lt;b&gt;Schedule&lt;/b&gt;은 인스턴스 태그 설정에서 사용되니 기억해둡니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;429&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미 Schedule로 설정되어 있다면 따로 수정하지 않고 넘어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;429&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 설정은 모두 끝이 났으니 인스턴스에 스케줄러를 적용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;config 편집.PNG&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4JjTi/btrLuhhv48Y/KTDFLrQX7qag1ZBVwQbPq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4JjTi/btrLuhhv48Y/KTDFLrQX7qag1ZBVwQbPq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4JjTi/btrLuhhv48Y/KTDFLrQX7qag1ZBVwQbPq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4JjTi%2FbtrLuhhv48Y%2FKTDFLrQX7qag1ZBVwQbPq0%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;1191&quot; height=&quot;802&quot; data-filename=&quot;config 편집.PNG&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-renderer-start-pos=&quot;474&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_4&quot;&gt;4. 인스턴스에 스케줄러 적용&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-renderer-start-pos=&quot;474&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;474&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;EC2 탭에서 적용하고 싶은 인스턴스를 선택한 후 태그 - 태그 관리를 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;태그 관리.PNG&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZFaiO/btrLu9ww5uM/FaMKe3LwnmYmGp252Er2R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZFaiO/btrLu9ww5uM/FaMKe3LwnmYmGp252Er2R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZFaiO/btrLu9ww5uM/FaMKe3LwnmYmGp252Er2R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZFaiO%2FbtrLu9ww5uM%2FFaMKe3LwnmYmGp252Er2R1%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;1046&quot; height=&quot;215&quot; data-filename=&quot;태그 관리.PNG&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;state 태그는 무시하셔도 됩니다. 저는 이미 스케줄러를 적용해 놓았기 때문에 인스턴스 상태를 나타내는 state 태그가 자동으로 추가되어있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인스턴스 태그에 키에는 config 항목에서 봤던 tagname인&amp;nbsp;&lt;b&gt;Schedule&lt;/b&gt;을 적어주고 값에는 schedule 항목의 name인&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;537&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;tenToten-schedule&lt;/b&gt;&amp;nbsp;입력하면 스케줄러가 적용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-layout=&quot;align-start&quot; data-width=&quot;91&quot; data-node-type=&quot;mediaSingle&quot;&gt;
&lt;div&gt;
&lt;div data-context-id=&quot;34177032&quot; data-type=&quot;file&quot; data-node-type=&quot;media&quot; data-width=&quot;473&quot; data-height=&quot;186&quot; data-id=&quot;d0e4615c-3d99-4e70-a30b-491c0de7aa75&quot; data-collection=&quot;contentId-34177032&quot; data-file-name=&quot;인스턴스 태그 키.PNG&quot; data-file-size=&quot;14237&quot; data-file-mime-type=&quot;image/png&quot; data-alt=&quot;&quot;&gt;
&lt;div id=&quot;newFileExperienceWrapper&quot; data-testid=&quot;media-card-view&quot;&gt;
&lt;div data-testid=&quot;media-file-card-view&quot; data-test-status=&quot;complete&quot; data-test-media-name=&quot;인스턴스 태그 키.PNG&quot; data-test-progress=&quot;1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;인스턴스 태그 키.PNG&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8GoQC/btrLr3RAPx7/h7PBGKMJrVPFzZkaqIZPlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8GoQC/btrLr3RAPx7/h7PBGKMJrVPFzZkaqIZPlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8GoQC/btrLr3RAPx7/h7PBGKMJrVPFzZkaqIZPlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8GoQC%2FbtrLr3RAPx7%2Fh7PBGKMJrVPFzZkaqIZPlK%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;631&quot; height=&quot;248&quot; data-filename=&quot;인스턴스 태그 키.PNG&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;573&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;575&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 스케줄러 설정 시간인 오전 10시부터 오후 10시 사이에만 인스턴스가 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;621&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이상으로 스케줄러 적용은 끝이 났습니다. 하지만 인스턴스가 중지되었다가 재시작될 때 웹 서버와 WSGI Service를 재시작해줘야 하는 번거로움이 있습니다. 이를 자동화하는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;693&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_5&quot;&gt;5. 웹 서버, WSGI restart 자동화&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저의 배포 환경은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹서버 : Nginx&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WSGI : Gunicorn&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo systemctl enable [service name]을 입력하면 인스턴스가 재부팅될 때마다 자동으로 service가 재시작됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[service name]은 개인 설정에 따라 다를 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;systemctl enable.PNG&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwkmlD/btrLmyZdw83/MD6HN8GGLsgZEE9kkoIF81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwkmlD/btrLmyZdw83/MD6HN8GGLsgZEE9kkoIF81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwkmlD/btrLmyZdw83/MD6HN8GGLsgZEE9kkoIF81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwkmlD%2FbtrLmyZdw83%2FMD6HN8GGLsgZEE9kkoIF81%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;993&quot; height=&quot;65&quot; data-filename=&quot;systemctl enable.PNG&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;65&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;nginx enable&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;nginx 명령어&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662367653454&quot; class=&quot;routeros&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl enable nginx.service&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 style=&quot;color: #000000;&quot;&gt;nginx enabled 설정 확인&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nginx status.PNG&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/burIT8/btrLqeePB6U/xEyb2k8My1VftAFtu2O7u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/burIT8/btrLqeePB6U/xEyb2k8My1VftAFtu2O7u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/burIT8/btrLqeePB6U/xEyb2k8My1VftAFtu2O7u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FburIT8%2FbtrLqeePB6U%2FxEyb2k8My1VftAFtu2O7u1%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;1005&quot; height=&quot;227&quot; data-filename=&quot;nginx status.PNG&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Gunicorn enable&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gunicorn 명령어&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662367728643&quot; class=&quot;routeros&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl enable seasonality.service&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 style=&quot;color: #000000;&quot;&gt;Gunicorn enabled 설정 확인&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gunicorn status.PNG&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7LGTe/btrLuf48UoU/bPNKZLjnjqIpzHkIT33Qu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7LGTe/btrLuf48UoU/bPNKZLjnjqIpzHkIT33Qu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7LGTe/btrLuf48UoU/bPNKZLjnjqIpzHkIT33Qu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7LGTe%2FbtrLuf48UoU%2FbPNKZLjnjqIpzHkIT33Qu1%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;1379&quot; height=&quot;179&quot; data-filename=&quot;gunicorn status.PNG&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-layout=&quot;center&quot; data-width=&quot;100&quot; data-node-type=&quot;mediaSingle&quot;&gt;
&lt;div&gt;
&lt;div data-context-id=&quot;34177032&quot; data-type=&quot;file&quot; data-node-type=&quot;media&quot; data-width=&quot;745&quot; data-height=&quot;49&quot; data-id=&quot;d246aede-4772-4c36-a99b-57102ed3ffaf&quot; data-collection=&quot;contentId-34177032&quot; data-file-name=&quot;systemctl enable.PNG&quot; data-file-size=&quot;9526&quot; data-file-mime-type=&quot;image/png&quot; data-alt=&quot;&quot;&gt;
&lt;div id=&quot;newFileExperienceWrapper&quot; data-testid=&quot;media-card-view&quot;&gt;
&lt;div data-testid=&quot;media-file-card-view&quot; data-test-status=&quot;complete&quot; data-test-media-name=&quot;systemctl enable.PNG&quot; data-test-progress=&quot;1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;999&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;999&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;service name 왼쪽에 초록색으로 enabled라고 되어있으면 재시작 설정이 완료된 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;999&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으로 인스턴스 중지 후 재부팅했을 때 웹 서버와 WSGI가 제대로 동작하는지 테스트해봅니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이상으로 인스턴스 스케줄러 연동에 대한 포스팅을 마치겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;999&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;감사합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>CloudFormation</category>
      <category>dynamodb</category>
      <category>스케줄러</category>
      <category>인스턴스</category>
      <category>자동화</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/17</guid>
      <comments>https://codest.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 5 Sep 2022 18:06:17 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 리스트 컴프리헨션, None값 처리하기</title>
      <link>https://codest.tistory.com/16</link>
      <description>&lt;!-- jQuery CDN --&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-3.2.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
jQuery(document).ready(function($) {
    // &lt;a&gt;&lt;/a&gt; 태그 중 #으로 링크된 태그에 기능 설정
    $(&quot;a[href^='#']&quot;).click(function(event) {
        event.preventDefault();
        var target = $(this.hash);
        $('html, body').animate({scrollTop: target.offset().top}, 500);
    });
});
&lt;/script&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;#no_1&quot;&gt;1. 리스트 컴프리헨션이란?&lt;/a&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;a href=&quot;#no_2&quot;&gt;2. for문을 포함한 리스트&lt;/a&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;a href=&quot;#no_3&quot;&gt;3. for문과 if문을 포함한 리스트&lt;/a&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;a href=&quot;#no_4&quot;&gt;4. for문과 if else문을 포함한 리스트&lt;/a&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;a href=&quot;#no_5&quot;&gt;5. 활용 예제 (None값 처리 함수 만들기)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_1&quot;&gt;1. 리스트 컴프리헨션이란?&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특정 조건을 만족하거나 반복되는 요소(element)의 리스트를 보다 간결하게 만드는 문법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_2&quot;&gt;2.&amp;nbsp; for문을 포함한 리스트&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;pre id=&quot;code_1659790716569&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[반환값 for 변수 in 반복 가능한 자료형(리스트, 딕셔너리, 문자열 등)]&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 style=&quot;color: #000000;&quot;&gt;물론 for 변수 in range()도 사용 가능합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659789793831&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;old_list = [1, 2, 3, 4, 5]
new_list = [i**2 for i in old_list]

&amp;gt;&amp;gt;&amp;gt; new_list
[1, 4, 9, 16, 25]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_3&quot;&gt;3. for문과 if문을 포함한 리스트&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;pre id=&quot;code_1659790946334&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[조건 만족 반환값 for 변수 in 반복 가능한 자료형 if 조건식]&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 style=&quot;color: #000000;&quot;&gt;&lt;u&gt;if문은 for문 뒤에 와야 합니다.&lt;/u&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659791740062&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;old_list = [1, 2, 3, 4, 5, 6]
new_list = [str(i) for i in old_list if i%2 == 0]

&amp;gt;&amp;gt; new_list
['2', '4', '6']

# 홀수 : 아 ㅡㅡ&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_4&quot;&gt;4. for문과 if else문을 포함한 리스트&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 문법은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659790498613&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[조건 만족 반환값 if 조건식 else 조건 만족X 반환값 for 변수 in 반복 가능한 자료형]&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 style=&quot;color: #000000;&quot;&gt;&lt;u&gt;if else문은 for문 앞에 와야 합니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1부터 10까지의 정수 안에서 간단한 3, 6, 9 게임을 만들어 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659789249341&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;game = [&quot;짝&quot; if (i+1)%3==0 else i+1 for i in range(10)]

&amp;gt;&amp;gt;&amp;gt; game
[1, 2, '짝', 4, 5, '짝', 7, 8, '짝', 10]&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 style=&quot;color: #000000;&quot;&gt;이중 for문이나 조건을 여러 개 추가할 수 있지만 오히려 가독성이 떨어질 수 있으니 for문과 if else문 한 번씩만 사용하시는 것을 추천드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b id=&quot;no_5&quot;&gt;5. 활용 예제 (None값 처리 함수 만들기)&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 처리를 하다 보면 None값을 처리해야 하는 경우가 생깁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리스트 컴프리헨션을 활용하여 None값을 0으로 바꾸는 간단한 함수를 작성해보겠습니다.&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;b&gt;- 리스트 컴프리헨션을 사용하지 않은 경우&lt;/b&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;list 안에서 for문을 돌며 i == None인 경우 i=0으로 처리한 후 new_list에 append 해주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659786396394&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;price = [1200, 1300, 1500, None, None]

def none_to_zero(list):
    new_list = []
    for i in list:
        if i == None:
            i = 0
        new_list.append(i)
    
    return new_list

&amp;gt;&amp;gt;&amp;gt; none_to_zero(price)
[1200, 1300, 1500, 0, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;- 리스트 컴프리헨션을 사용한 경우&amp;nbsp;&lt;/b&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;코드가 직관적이고 간결합니다. for문과 if else문을 한 줄에 넣고 append를 생략할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단, list를 돌며 모든 요소를 append 해주는 위의 코드와는 달리 else문에 i값이 None이 아닐 경우 그대로 i를 반환하는 부분을 추가해주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659786844631&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;price = [1200, 1300, 1500, None, None]

def none_to_zero(list):
    new_list = [0 if i==None else i for i in list]
    return new_list    
    
&amp;gt;&amp;gt;&amp;gt; none_to_zero(price)
[1200, 1300, 1500, 0, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;활용 예제를 끝으로 포스팅을 마치겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <category>None값 처리</category>
      <category>리스트 컴프리헨션</category>
      <category>파이썬</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/16</guid>
      <comments>https://codest.tistory.com/16#entry16comment</comments>
      <pubDate>Sat, 6 Aug 2022 22:21:35 +0900</pubDate>
    </item>
    <item>
      <title>[Error] Node.js 설치 / npm install / bash: npm: command not found 에러</title>
      <link>https://codest.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 이번 포스팅에서는 Node.js를 설치하고 로컬 환경에서 npm install 명령어를 사용할 수 있도록 환경변수 편집까지 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Node.js를 설치해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/ko/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1659405144946&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;Node.js&quot; data-og-description=&quot;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/ko/&quot; data-og-url=&quot;https://nodejs.org/ko/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOgs5c/hyPjmqXwy6/lICuRWCptnyi0lcJkIwefK/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/bP5aIh/hyPhojD8Hl/kzKhPF4EoYFRiUk5a5hZK0/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/ko/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOgs5c/hyPjmqXwy6/lICuRWCptnyi0lcJkIwefK/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/bP5aIh/hyPhojD8Hl/kzKhPF4EoYFRiUk5a5hZK0/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&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;Node.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&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;span&gt;이 중에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;안정화되어있는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;LTS 버전을 설치해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;node lts버전.PNG&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx38hG/btrII0DuokT/2pMBXWifUSGZeK1Yk8p9r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx38hG/btrII0DuokT/2pMBXWifUSGZeK1Yk8p9r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx38hG/btrII0DuokT/2pMBXWifUSGZeK1Yk8p9r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx38hG%2FbtrII0DuokT%2F2pMBXWifUSGZeK1Yk8p9r0%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;687&quot; height=&quot;237&quot; data-filename=&quot;node lts버전.PNG&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;msi파일을 실행하고 Next를 눌러줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xCnni/btrIKndSOG4/W0xdRZH86kci7uwoGQrcaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xCnni/btrIKndSOG4/W0xdRZH86kci7uwoGQrcaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xCnni/btrIKndSOG4/W0xdRZH86kci7uwoGQrcaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxCnni%2FbtrIKndSOG4%2FW0xdRZH86kci7uwoGQrcaK%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;495&quot; height=&quot;387&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동의하고 Next를 눌러줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYHNNn/btrIKndSRHb/6AjQwkOokoi1O7K9V9aEqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYHNNn/btrIKndSRHb/6AjQwkOokoi1O7K9V9aEqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYHNNn/btrIKndSRHb/6AjQwkOokoi1O7K9V9aEqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYHNNn%2FbtrIKndSRHb%2F6AjQwkOokoi1O7K9V9aEqK%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;495&quot; height=&quot;387&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 설치 위치인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;C:\Program Files\nodejs에 설치됩니다. 확인하시고 Next&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZWWrk/btrILegI7xc/Pua79BBu74rYYPFMF52OW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZWWrk/btrILegI7xc/Pua79BBu74rYYPFMF52OW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZWWrk/btrILegI7xc/Pua79BBu74rYYPFMF52OW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZWWrk%2FbtrILegI7xc%2FPua79BBu74rYYPFMF52OW0%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;495&quot; height=&quot;387&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;네이티브 모듈은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;필요하신 분들&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;외에는 그냥 Next 눌러주시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;네이티브 툴.PNG&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4MLYJ/btrIGzsRpSp/SvSZlL7En4B5JKs5vJ7sqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4MLYJ/btrIGzsRpSp/SvSZlL7En4B5JKs5vJ7sqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4MLYJ/btrIGzsRpSp/SvSZlL7En4B5JKs5vJ7sqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4MLYJ%2FbtrIGzsRpSp%2FSvSZlL7En4B5JKs5vJ7sqk%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;501&quot; height=&quot;365&quot; data-filename=&quot;네이티브 툴.PNG&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;커스텀 설정도 따로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하지 않고&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Next를 눌러줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lAsca/btrIGyHvSPF/cQPHmGFzIS8tCC1Zyi3hn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAsca/btrIGyHvSPF/cQPHmGFzIS8tCC1Zyi3hn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAsca/btrIGyHvSPF/cQPHmGFzIS8tCC1Zyi3hn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAsca%2FbtrIGyHvSPF%2FcQPHmGFzIS8tCC1Zyi3hn1%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;495&quot; height=&quot;387&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Install을 누르면 설치가 시작됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHTsBc/btrIITw1cX2/g0QqInh2nVGMekPKPJvjn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHTsBc/btrIITw1cX2/g0QqInh2nVGMekPKPJvjn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHTsBc/btrIITw1cX2/g0QqInh2nVGMekPKPJvjn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHTsBc%2FbtrIITw1cX2%2Fg0QqInh2nVGMekPKPJvjn1%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;495&quot; height=&quot;387&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치를 하고 나서 Windows PowerShell에서 node -v를 입력하면 버전이 나올 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리는 VScode와 같은 코드 에디터 내의 터미널에서 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 git bash 터미널에서 npm install 명령어를 사용했더니 다음과 같은 에러 메시지가 출력되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wImR1/btrIEZekcXH/ilzKaNsX0GZaXrJNBIbvPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wImR1/btrIEZekcXH/ilzKaNsX0GZaXrJNBIbvPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wImR1/btrIEZekcXH/ilzKaNsX0GZaXrJNBIbvPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwImR1%2FbtrIEZekcXH%2FilzKaNsX0GZaXrJNBIbvPk%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;623&quot; height=&quot;57&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;57&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;bash : npm : command not found&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 npm이 들어있는 Node.js 설치 폴더가 환경변수에 등록이 되어있지 않아 발생하는 에러입니다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시스템 환경 변수 편집.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUb62/btrIKmTAuJ8/tehyHkjxn6SS7PYVgfpmB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUb62/btrIKmTAuJ8/tehyHkjxn6SS7PYVgfpmB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUb62/btrIKmTAuJ8/tehyHkjxn6SS7PYVgfpmB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUb62%2FbtrIKmTAuJ8%2FtehyHkjxn6SS7PYVgfpmB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;354&quot; data-filename=&quot;시스템 환경 변수 편집.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고급 - 환경변수 - 시스템 변수(S) - 새로 만들기를 누르고 다음과 같이 추가해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 이름은 본인이 알아보게끔 만드시면 되고 변수 값에 Node.js가 설치되어있는 폴더 경로를 입력하고 확인을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시스템변수1.PNG&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o9EHi/btrIJ6QqNm3/oN3jrYfTdtuHLG29T16Vv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o9EHi/btrIJ6QqNm3/oN3jrYfTdtuHLG29T16Vv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o9EHi/btrIJ6QqNm3/oN3jrYfTdtuHLG29T16Vv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo9EHi%2FbtrIJ6QqNm3%2FoN3jrYfTdtuHLG29T16Vv1%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;650&quot; height=&quot;161&quot; data-filename=&quot;시스템변수1.PNG&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 설정하지 않으셨다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;C:\Program Files\nodejs에 설치되어 있을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 위의 경로에 Node.js가 설치되어있는지 한번 확인해보시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시스템변수2.PNG&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KxiL9/btrIH5E4EBn/fl9IMV5rWnnygpShAjTihk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KxiL9/btrIH5E4EBn/fl9IMV5rWnnygpShAjTihk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KxiL9/btrIH5E4EBn/fl9IMV5rWnnygpShAjTihk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKxiL9%2FbtrIH5E4EBn%2Ffl9IMV5rWnnygpShAjTihk%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;432&quot; height=&quot;199&quot; data-filename=&quot;시스템변수2.PNG&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;199&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;시스템 변수에 정상적으로 등록이 된 것을 확인했다면 상단에 사용자 변수에 Path를 클릭하고 편집을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시스템변수3.PNG&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bElDZF/btrII1oRxHf/BPSYuMCEhZToa7dWLUxwfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bElDZF/btrII1oRxHf/BPSYuMCEhZToa7dWLUxwfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bElDZF/btrII1oRxHf/BPSYuMCEhZToa7dWLUxwfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbElDZF%2FbtrII1oRxHf%2FBPSYuMCEhZToa7dWLUxwfk%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;523&quot; height=&quot;496&quot; data-filename=&quot;시스템변수3.PNG&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 %변수 이름% 을 추가하고 확인을 누르면 끝입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 VScode를 껐다가 켜고 터미널에서 npm -v을 입력해보시면 정상적으로 버전이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm install 명령어도 정상적으로 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm.PNG&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zq3Hk/btrIGy8AAsW/GU0yWBvwY15cIye6eYFULk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zq3Hk/btrIGy8AAsW/GU0yWBvwY15cIye6eYFULk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zq3Hk/btrIGy8AAsW/GU0yWBvwY15cIye6eYFULk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzq3Hk%2FbtrIGy8AAsW%2FGU0yWBvwY15cIye6eYFULk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;54&quot; data-filename=&quot;npm.PNG&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;54&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;</description>
      <category>Error</category>
      <category>command not found</category>
      <category>Node.js</category>
      <category>npm</category>
      <category>에러</category>
      <category>환경변수</category>
      <author>Codest</author>
      <guid isPermaLink="true">https://codest.tistory.com/15</guid>
      <comments>https://codest.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 2 Aug 2022 11:46:13 +0900</pubDate>
    </item>
  </channel>
</rss>