<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>다디와 괴발개발</title>
    <link>https://dadidadi.tistory.com/</link>
    <description>깃허브 : https://github.com/seongahpark</description>
    <language>ko</language>
    <pubDate>Tue, 21 Jul 2026 02:20:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>아임다디</managingEditor>
    <item>
      <title>[Java] Java에서 char 배열 입력받는 방법</title>
      <link>https://dadidadi.tistory.com/55</link>
      <description>&lt;p&gt;자바에서 입력을 받기위한 방법으로는 크게 두 가지가 있다.&lt;/p&gt;
&lt;p&gt;첫 번째, &lt;strong&gt;Scanner&lt;/strong&gt;를 이용한 입력&lt;/p&gt;
&lt;p&gt;두 번째, &lt;strong&gt;BufferedReader&lt;/strong&gt;를 이용한 방법&lt;/p&gt;
&lt;p&gt;Scanner도 편하고 좋지만, BufferedReader가 더 빨라 알고리즘 문제를 풀 때는 BufferedReader 사용을 더 권장한다고 한다.&lt;/p&gt;
&lt;p&gt;이번 포스팅에서는 Java에서 char 배열을 입력 받기 위한 여러 방법들을 적어보았다.&lt;/p&gt;
&lt;h3&gt;1. Scanner를 이용한 입력방법&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;G B G B B G
B B G B B B
G G B B G B
G G G G B B
G G G G G B&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;배열의 입력은 다음과 같이 들어온다고 가정해보자,&lt;/p&gt;
&lt;p&gt;Scanner에서는 &lt;code&gt;nextInt()&lt;/code&gt; 처럼 &lt;code&gt;nextChar()&lt;/code&gt; 함수가 없다.&lt;/p&gt;
&lt;p&gt;따라서 &lt;code&gt;next().charAt(0)&lt;/code&gt;을 사용해서 입력을 받아야 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
char arr [][] = new char[n][n];

for(int i=0; i&amp;lt;n; i++){
    for(int j=0; j&amp;lt;n; j++){
        arr[i][j] = sc.next().charAt(0);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;2. BufferedReader를 이용한 방법&lt;/h3&gt;
&lt;p&gt;배열의 예시는 1번과 같다고 가정한다&lt;/p&gt;
&lt;p&gt;BufferedReader는 한 줄씩 읽는 것이 특징이고, 무조건 String으로 읽기 때문에 다른 타입을 받을 경우 형변환을 해주어야 한다&lt;/p&gt;
&lt;p&gt;또한 예외 처리를 해주어야 한다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    public static void main(String[] args) throws IOException{ // IO 예외 처리

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        char arr [][] = new char[n][n];

        for(int i=0; i&amp;lt;n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j&amp;lt;n; j++){
                arr[i][j] = st.nextToken().charAt(0);
                // 만약 int 배열이라면?
                // arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        br.close(); // 입력을 다 받았으면 닫아주어야 한다
    }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이번에는 들어오는 배열이 다음과같이 다닥다닥 붙어있는 경우에 대해서 다루어보고자 한다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GBGBBG
BBGBBB
GGBBGB
GGGGBB
GGGGGB&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3. BufferedReader &amp;amp; charAt()을 이용한 읽기&lt;/h3&gt;
&lt;p&gt;문자열이 다닥 붙어있으므로 &lt;code&gt;nextToekn()&lt;/code&gt;을 사용할 수 없다. &lt;code&gt;nextToken&lt;/code&gt;은 띄어쓰기 기반으로 받아오기 때문이다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    public static void main(String[] args) throws IOException{ // IO 예외 처리

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        char arr [][] = new char[n][n];

        for(int i=0; i&amp;lt;n; i++){
            String line = br.readLine();
            for(int j=0; j&amp;lt;n; j++){
                arr[i][j] = line.charAt(j); // charAt()을 이용하여 한 문자씩 받아준다
            }
        }

        br.close();
    }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;근데 사실 이 방법보다 더 쉬운 방법이 있다.&lt;/p&gt;
&lt;h4&gt;4. BufferedReader &amp;amp; toCharArray()를 이용한 읽기&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;toCharArray()&lt;/code&gt;는 문자열을 char 배열로 바꿔주는 함수이다.&lt;br&gt;이를 이용해주면 아주 간단하게 배열을 읽어올 수 있다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    public static void main(String[] args) throws IOException{ // IO 예외 처리

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        char arr [][] = new char[n][n];

        for(int i=0; i&amp;lt;n; i++){
            String line = br.readLine();
            arr[i] = line.toCharArray(); // toCharArray()를 통해 각 행에 해당하는 배열을 한꺼번에 받을 수 있다
        }

        br.close();
    }&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;추가 : 파일로 인풋을 받을 때&lt;/h4&gt;
&lt;p&gt;콘솔로 테스트 해볼 때 마다 입력값을 주기 귀찮으므로, 파일로 인풋을 입력받고자 할 때는 다음라인을 제일 처음에 추가해주면 된다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; System.setIn(new FileInputStream(&amp;quot;Input.txt&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 때, 인풋 파일의 경로는 프로젝트의 최상위 경로로, 만약 src 디렉토리 안에 파일이 있는 경우라면 &lt;code&gt;src/Input.txt&lt;/code&gt;로 경로를 수정해주면 된다&lt;/p&gt;
&lt;p&gt;자바는 왜이렇게 귀찮게 굴까&lt;br&gt;C++ 하다가 오니까 적응이 안된다  &lt;/p&gt;</description>
      <category>알고리즘/Java</category>
      <category>BufferedReader</category>
      <category>char 입력</category>
      <category>Java</category>
      <category>Java 입력</category>
      <category>Scanner</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/55</guid>
      <comments>https://dadidadi.tistory.com/55#entry55comment</comments>
      <pubDate>Sun, 24 Jul 2022 20:12:31 +0900</pubDate>
    </item>
    <item>
      <title>[SSAFY] SSAFY 8기 웰컴키트 후기</title>
      <link>https://dadidadi.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SSAFY 8기 웰컴키트가 드디어 도착했습니다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성품은 &lt;b&gt;얇은 후드티, 반팔티, 스티커, 에코백, 텀블러, 웹캠&lt;/b&gt;! 이렇게 푸짐하게 구성되어 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;2737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VkDDE/btrH083myOW/SXBe3FrUUhMKbCtZizqI81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VkDDE/btrH083myOW/SXBe3FrUUhMKbCtZizqI81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VkDDE/btrH083myOW/SXBe3FrUUhMKbCtZizqI81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkDDE%2FbtrH083myOW%2FSXBe3FrUUhMKbCtZizqI81%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;2053&quot; height=&quot;2737&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;2737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 포부가 큰 삼성! 박스도 너무 이뻐서 버리기 아까워가지구 보관함으로 잘 쓰고있답니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후드티 색은 &lt;u&gt;흰색, 검은색, 파란색&lt;/u&gt; 중 랜덤이라고 하는데요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하하ㅠㅠ 흰색이나 검은색이었으면 더 좋았을텐데 아쉽네요. 동기분들 흰색, 검은색 후드티 보니까 너무 이쁘더라구요오오오오....&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MM23q/btrH0981W4N/flOJLfl2cu1BDnUJhbvWL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MM23q/btrH0981W4N/flOJLfl2cu1BDnUJhbvWL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MM23q/btrH0981W4N/flOJLfl2cu1BDnUJhbvWL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMM23q%2FbtrH0981W4N%2FflOJLfl2cu1BDnUJhbvWL1%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;2250&quot; height=&quot;1500&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자의 필수품 스티커!! 노트북에 스티커가 많이 붙을수록 개발자 포스가 올라간다고 하죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스티커들도 너무 예쁘게 나왔습니다. 8기 슬로건인 &quot;7전 8기 오뚜기&quot; 스티커두 있네요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 기수분들은 어떤 스티커들을 받았는지 궁금합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2154&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djvfAk/btrHZ6ZuHaI/9gZ7EgyfsOTeiTKoelBac1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djvfAk/btrHZ6ZuHaI/9gZ7EgyfsOTeiTKoelBac1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djvfAk/btrHZ6ZuHaI/9gZ7EgyfsOTeiTKoelBac1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjvfAk%2FbtrHZ6ZuHaI%2F9gZ7EgyfsOTeiTKoelBac1%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;2154&quot; height=&quot;1436&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2154&quot; data-origin-height=&quot;1436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 에코백 &amp;amp; 텀블러 &amp;amp; 웹캠 세트!&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;요새 개발자 취준생에게 웹캠은 정말 필수죠. 코딩 테스트, 코로나로 인한 비대면 면접 등 웹캠이 필요한 상황이 굉장히 많습니다. 고마워요 SSAFY  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSAFY의 센스를 다시 한 번 느낄 수 있었던 웰컴 키트! 앞으로의 1년이 정말 기대됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 SSAFY 8기 합격 수기도 남겨보겠습니다. 특히 면접 준비할 때 여러 블로그들을 참고했던게 정말 도움이 많이 됐습니다. 저도 앞으로 들어오실 후배님들께 조금이라도 도움이 됐으면 좋겠네요 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 20000!&lt;/p&gt;</description>
      <category>SSAFY</category>
      <category>SSAFY입학</category>
      <category>부울경</category>
      <category>삼성청년sw아카데미</category>
      <category>코딩교육</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/54</guid>
      <comments>https://dadidadi.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 24 Jul 2022 18:53:05 +0900</pubDate>
    </item>
    <item>
      <title>[OpenSearch] OpenSearch Dashboard에 location data Visualize를 위한 초기 설정 과정</title>
      <link>https://dadidadi.tistory.com/53</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenSearch Dashboard(Kibana Visualize)로 프로젝트에서 사용되는 각 트럭 별로 이동 경로 데이터 보기 위해 해야 할 초기 셋팅 작업&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개념&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;ElasticSearch Mapping&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 입력되어 자동으로 매핑이 생성되기 전에 미리 먼저 인덱스의 매핑을 정의 해 놓으면 정의 해 놓은 매핑에 맞추어 데이터가 입력된다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미 생성된 데이터에 대한 매핑은 불가하다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;즉, &lt;code&gt;location&lt;/code&gt; 데이터가 들어오기 전에 매핑을 먼저 해줘야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Geo&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Elasticsearch에서 제공하는 위치정보 저장 타입 중 하나&lt;/li&gt;
&lt;li&gt;Geo Point 는 위도(latitude)와 경도(longitude) 두 개의 실수 값을 가지고 지도 위의 한 점을 나타내는 값이다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;location&lt;/code&gt;을 &lt;code&gt;geo_point&lt;/code&gt;로 매핑해놓으면 안에 들어있는 &lt;code&gt;lat&lt;/code&gt;, &lt;code&gt;lon&lt;/code&gt;을 자동으로 위도, 경도로 인식해준다&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Kibana Visualize&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kibana에서는 데이터 시각화를 제공해준다&lt;/li&gt;
&lt;li&gt;위치 정보를 보기 위한 &lt;code&gt;Coordinate Map&lt;/code&gt;을 생성하고 데이터를 보기 위해서는 &lt;code&gt;geo_point&lt;/code&gt; 타입이 필수이다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;야크털 쉐이빙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visualize 과정에서 가장 애먹었던 부분은 &lt;code&gt;geo_point&lt;/code&gt;로 mapping 해주는 과정이었다.&lt;br /&gt;기존에 Kinesis Data streams로 부터 데이터가 계속 들어와 있는 상태에서 타입을 재매핑해주려고 하니까 &lt;b&gt;illegal_argument_exception&lt;/b&gt; 오류가 떴다.  &lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;오류 내용&lt;/h4&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;&quot;type&quot; : &quot;illegal_argument_exception&quot;,
&quot;reason&quot; : &quot;mapper [location] cannot be changed from type [long] to [geo_point]&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞의 개념에서도 설명했듯이 &lt;b&gt;이미 생성된 데이터에 대한 재매핑은 불가하므로&lt;/b&gt; 인덱스를 삭제해주고 다시 생성해서 매핑까지 한 뒤에 데이터를 받아야 한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작업 과정 - Index Mapping&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인프라를 모두 구축하고 아무런 데이터가 OpenSearch에 담기지 않은 상태&lt;/li&gt;
&lt;li&gt;OpenSearch Dashboard - DevTools을 통해 Index 생성 및 Mapping을 해준다&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1654582932947&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PUT drivers-log 
{ 
    &quot;mappings&quot;: {
        &quot;properties&quot;: {
            &quot;location&quot;: {
                &quot;type&quot;: &quot;geo_point&quot; 
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답이 아래와 같이 오면 성공적으로 매핑된 것 (상태코드 : 200 - success)&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{ 
  &quot;acknowledged&quot; : true, 
  &quot;shards_acknowledged&quot; : true, 
  &quot;index&quot; : &quot;drivers-log&quot; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스에 대한 정보를 다시 확인하고 싶다면 &lt;code&gt;GET drivers-log&lt;/code&gt;를 해주면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이후 트럭 데이터들을 전송해주면 된다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;+ 여담&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 초반 Kinesis Data Generator를 통해 OpenSearch에 데이터가 잘 도달하는지 테스트 하는 과정에서 OpenSearch에 미리 인덱스를 만들고 테스트를 했을 때 데이터가 도달하지 않아 생겼던 오해에서 비롯해 사용했던 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;일단 위에서 도달하지 않았던 원인은 OpenSearch Backend-Role, Data Type 문제였다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;아무튼! 내가 처음에 사용했던 방법에 대해 후술해보자면,&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Kinesis Data Stream에 데이터를 보내기 위한 API Gateway 엔드포인트로 location이 들어가있지 않은 아무 테스트 데이터를 보내 인덱스를 생성해준다&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주의사항&lt;/b&gt; : &lt;code&gt;location&lt;/code&gt;이 담긴 데이터를 보내면 이미 생성된 데이터에 대한 매핑은 불가하므로 반드시 &lt;code&gt;location&lt;/code&gt;이 없는 아무런 데이터나 보내도록 한다&lt;br /&gt;&lt;code&gt;{ &quot;truckId&quot;: 11, &quot;timestamp&quot;: 20220530021550 }&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OpenSearch Dashboard - DevTools을 통해 Index Mapping을 해준다&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1654583552652&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PUT drivers-log/_mapping 
{ 
	&quot;properties&quot;: {
    	&quot;location&quot;: {
        	&quot;type&quot;: &quot;geo_point&quot;
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작업과정 - Visualize&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OpenSearch Dashboard - StackManagement - Index Patterns 선택&lt;/li&gt;
&lt;li&gt;보고자하는 인덱스의 인덱스 패턴 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;geo_point&lt;/code&gt;으로 성공적으로 매핑이 됐다면 &lt;code&gt;location&lt;/code&gt;의 타입이 &lt;code&gt;geo_point&lt;/code&gt;으로 나온다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qFXE6/btrEbExUFEu/YldCKXsChzrPl5RqKKv9aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qFXE6/btrEbExUFEu/YldCKXsChzrPl5RqKKv9aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qFXE6/btrEbExUFEu/YldCKXsChzrPl5RqKKv9aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqFXE6%2FbtrEbExUFEu%2FYldCKXsChzrPl5RqKKv9aK%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;1280&quot; height=&quot;677&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OpenSearch Dashboard의 Visualize 메뉴 선택&lt;/li&gt;
&lt;li&gt;New Visualize에서 &lt;code&gt;Coordinate Map&lt;/code&gt; 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyS3Fu/btrD6xmtUcM/DQL9b8uZUHRymmFcdKOj6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyS3Fu/btrD6xmtUcM/DQL9b8uZUHRymmFcdKOj6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyS3Fu/btrD6xmtUcM/DQL9b8uZUHRymmFcdKOj6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyS3Fu%2FbtrD6xmtUcM%2FDQL9b8uZUHRymmFcdKOj6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;946&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;우측의 &lt;code&gt;Buckets&lt;/code&gt; 탭에서 Add 선택&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Aggregation&lt;/code&gt;에서 &lt;code&gt;Geohash&lt;/code&gt; 선택, &lt;code&gt;field&lt;/code&gt;에서 &lt;code&gt;location&lt;/code&gt; 선택&lt;/li&gt;
&lt;li&gt;촘촘한 경로를 보고싶다면, &lt;code&gt;Change precision on map zoom&lt;/code&gt; 해제 후 &lt;code&gt;Precision&lt;/code&gt; 수치를 높여준다&lt;/li&gt;
&lt;li&gt;Point 색 변경을 원한다면 &lt;code&gt;Options&lt;/code&gt;의 &lt;code&gt;Color Schema&lt;/code&gt; 변경&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqSdRd/btrEc2Lxord/pXE5HF2hLlhdxQKFKiQjQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqSdRd/btrEc2Lxord/pXE5HF2hLlhdxQKFKiQjQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqSdRd/btrEc2Lxord/pXE5HF2hLlhdxQKFKiQjQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqSdRd%2FbtrEc2Lxord%2FpXE5HF2hLlhdxQKFKiQjQ0%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;1280&quot; height=&quot;713&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 상단의 &lt;code&gt;Add filter&lt;/code&gt;를 통해 원하는 데이터만 출력이 가능하다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매핑은 최초에 한 번만 할 수 있으니 주의하자!&lt;br /&gt;DevTools로 할 수 있는 일이 많으니 활용법을 잘 찾아보고 적재적소에 잘 활용하자!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings/7.2.6-geo&quot;&gt;Elastic Geo&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=xomyjoung&amp;amp;logNo=221677701275&quot;&gt;Kibana Map 사용법&lt;/a&gt;&lt;/p&gt;</description>
      <category>TroubleShooting</category>
      <category>elasticSearch</category>
      <category>Kibana</category>
      <category>map</category>
      <category>OpenSearch</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/53</guid>
      <comments>https://dadidadi.tistory.com/53#entry53comment</comments>
      <pubDate>Tue, 7 Jun 2022 15:04:55 +0900</pubDate>
    </item>
    <item>
      <title>[Project 1 - WAS] Fastify-cli 프로젝트 생성</title>
      <link>https://dadidadi.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Project1 에서 WAS 서버를 만들기 위해 Fastify 프레임워크를 사용하여 Node.js 기반 백엔드를 구현하였다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Fastify 란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 프레임워크 중 하나로 최소한의 오버헤드와 강력한 플러그인 아키텍처를 자랑하는 프레임워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서는 Fastify 프레임워크를 cli로 쉽게 다루기 위해 fastify-cli를 설치하여 사용하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/fastify/fastify-cli&quot;&gt;fastify-cli 공식 Github&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654163116975&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - fastify/fastify-cli: Run a Fastify application with one command!&quot; data-og-description=&quot;Run a Fastify application with one command! Contribute to fastify/fastify-cli development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/fastify/fastify-cli&quot; data-og-url=&quot;https://github.com/fastify/fastify-cli&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhvKRa/hyOCHcs2sy/pYoxP78Y72u65szlkECgPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/fastify/fastify-cli&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/fastify/fastify-cli&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhvKRa/hyOCHcs2sy/pYoxP78Y72u65szlkECgPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - fastify/fastify-cli: Run a Fastify application with one command!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Run a Fastify application with one command! Contribute to fastify/fastify-cli development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Fastify 프로젝트 셋팅 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm을 통해 fastify-cli를 설치해준다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm i fastify-cli --global&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성하고자 하는 위치로 이동해 generate 명령어를 통해 새 프로젝트를 생성해준다&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;fastify generate . // 현재 디렉토리에서 새 프로젝트 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Oe08/btrDOyZAC8n/pLymgpxbZeU7stGsVLpUm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Oe08/btrDOyZAC8n/pLymgpxbZeU7stGsVLpUm1/img.png&quot; data-alt=&quot;generate로 프로젝트 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Oe08/btrDOyZAC8n/pLymgpxbZeU7stGsVLpUm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Oe08%2FbtrDOyZAC8n%2FpLymgpxbZeU7stGsVLpUm1%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;560&quot; height=&quot;400&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;generate로 프로젝트 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행 명령어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fastify 프로젝트를 생성하면 &lt;code&gt;README.md&lt;/code&gt;에 실행방법이 나와있다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm test # test 모듈을 실행
npm run dev # app을 dev mode로 실행한다. 코드에 변경사항이 있을 때 마다 적용
npm start # Production mode로 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;default는 localhost:3000 에서 열리며, fastilfy-cli 옵션으로 다른 포트에서 열리도록 실행 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 실행시에는 &lt;code&gt;npm install&lt;/code&gt;을 통하여 모듈들을 설치해주자&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Directory 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fastify는 기본적으로 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;routes&lt;/b&gt;&lt;/span&gt; 하위에 있는 파일들이 분기점이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, routes/example/index.js 를 보고싶다면 localhost:3000/example을 하면 example/index.js의 내용을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCW6M/btrDPUngDEZ/L7RuXnqcRLXgvnO2Gho7kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCW6M/btrDPUngDEZ/L7RuXnqcRLXgvnO2Gho7kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCW6M/btrDPUngDEZ/L7RuXnqcRLXgvnO2Gho7kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCW6M%2FbtrDPUngDEZ%2FL7RuXnqcRLXgvnO2Gho7kK%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;1198&quot; height=&quot;352&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;example에서 하위 엔드포인트를 만들고 싶다면 example/index.js 에서 원하는 엔드포인트를 만들어주면 된다&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;'use strict'

module.exports = async function (fastify, opts) {
  fastify.get('/', async function (request, reply) {
    return 'this is an example'
  })

  fastify.get('/hi', async function (request, reply) {
    return 'this is hi'
  })
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMEwQG/btrDQdUrZM8/Oe6dyp6QE9AYnmwvt9dKs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMEwQG/btrDQdUrZM8/Oe6dyp6QE9AYnmwvt9dKs0/img.png&quot; data-alt=&quot;localhost:3000/example/hi 를 만들어주었다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMEwQG/btrDQdUrZM8/Oe6dyp6QE9AYnmwvt9dKs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMEwQG%2FbtrDQdUrZM8%2FOe6dyp6QE9AYnmwvt9dKs0%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;1212&quot; height=&quot;340&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;localhost:3000/example/hi 를 만들어주었다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;plugins&lt;/b&gt;&lt;/span&gt; 폴더에는 서버에서 사용 할 여러 모듈들을 연결하는 용도로 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 프로젝트에서 사용했던 dotenv, fastify-mongodb 등의 모듈을 연결하고 사용하는 방법에 대해 포스팅해보겠다.&lt;/p&gt;</description>
      <category>DevOps/Project</category>
      <category>fastify</category>
      <category>fastify-cli</category>
      <category>Was</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/52</guid>
      <comments>https://dadidadi.tistory.com/52#entry52comment</comments>
      <pubDate>Thu, 2 Jun 2022 18:42:07 +0900</pubDate>
    </item>
    <item>
      <title>[Project 1 - WAS] 기능 정의서, ERD, Swagger API 문서 제작</title>
      <link>https://dadidadi.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;조오오금이 아니라 아주 많이 늦게 업로드하지만 드디어 올리는 Codestates DevOps 부트캠프 첫 번째 프로젝트 정리 글!&lt;br /&gt;이번 문서에서는 첫 번째 프로젝트의 목표와 프로젝트 제작을 위해 제작하였던 기능정의서, DB 제작을 위한 ERD, API 통신을 위한 API 문서를 정리해보았다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRUD 기능을 가진 API 서버를 완성합니다.&lt;/li&gt;
&lt;li&gt;클라우드 서비스 데이터베이스를 사용하여 데이터를 영속적으로 저장합니다.&lt;/li&gt;
&lt;li&gt;데이터를 모델링하고, API 문서화를 진행합니다.&lt;/li&gt;
&lt;li&gt;Git을 이용한 협업을 진행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 프로젝트인 만큼 목표는 간단하게 로컬에서 돌아가는 WAS 서버를 제작하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DevOps 부트캠프에서는 프론트는 다루지 않기 때문에 프로젝트 목표에 프론트엔드 구현은 포함되지 않는다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기술 스택&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백엔드 : Node.js (version &amp;gt;= 16), fastify&lt;/li&gt;
&lt;li&gt;데이터베이스 : MongoDB&lt;/li&gt;
&lt;li&gt;API : Swagger&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022 대선 시즌을 맞아 대선 공약을 랜덤으로 출력하여 사용자가 공약에 대한 찬반을 선택해 나와 가장 잘 맞는 / 잘 맞지 않는 추천 후보 보여주는 서비스&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기능 정의&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자는 후보별로 모든 공약을 조회할 수 있다.&lt;/li&gt;
&lt;li&gt;사용자는 화면에 제시된 공약에 대해 찬, 반으로 투표할 수 있다.&lt;/li&gt;
&lt;li&gt;사용자는 랜덤한 순서로 각 후보 마다 7개의 공약을 투표할 수 있다. (총 28 문항)&lt;/li&gt;
&lt;li&gt;사용자는 마지막 화면에서 자신과 가장 잘 맞는 후보와 잘 맞지 않는 후보를 볼 수 있다.&lt;/li&gt;
&lt;li&gt;사용자의 투표 별 선택 결과와 최종 결과는 데이터베이스에 저장된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ERD&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ERD는 &lt;a href=&quot;https://dbdiagram.io/home&quot;&gt;dbdiagram&lt;/a&gt; 사이트를 이용하여 그렸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdisMW/btrDMWs0yHr/ZvFKTcYQr7U30OTyo857Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdisMW/btrDMWs0yHr/ZvFKTcYQr7U30OTyo857Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdisMW/btrDMWs0yHr/ZvFKTcYQr7U30OTyo857Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdisMW%2FbtrDMWs0yHr%2FZvFKTcYQr7U30OTyo857Qk%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;826&quot; height=&quot;540&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 User(유저), Promise(공약), President(대통령 후보)로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User Table에는 유저의 이름과 가장 잘 맞는 후보(best_pres), 잘 맞지 않는 후보(worst_pres)에 대한 정보가 저장된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;President Table에는 대통령 후보의 이름(name)과 당 정보(party)가 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Promise Table을 말하기 앞서, 2022 대선 공약의 7가지 카테고리를 구분하기 위해 Promise_category Table을 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대선 후보 및 공약 관련 내용은 &lt;a href=&quot;https://www.fnnews.com/election2022#choice&quot;&gt;파이낸셜 뉴스&lt;/a&gt; 사이트에서 보고 정리하였다.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;대선 공약 7가지 카테고리 항목&lt;/summary&gt;
&lt;div&gt;- 외교∙안보∙국방&lt;/div&gt;
&lt;div&gt;- 경제∙복지&lt;/div&gt;
&lt;div&gt;- 경제∙노동&lt;/div&gt;
&lt;div&gt;- 사회∙복지&lt;/div&gt;
&lt;div&gt;- 교육&lt;/div&gt;
&lt;div&gt;- 환경&lt;/div&gt;
&lt;div&gt;- IT&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Promise Table에는 대통령의 id값, category의 id값과 공약 내용(contents)가 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 User_Promise 테이블에는 유저가 선택한 항목들을 저장하기 위해서 제작되었으며, 유저 uuid 정보와 선택한 공약에 해당하는 공약 id, 후보 id, 찬/반 여부를 저장하는 choice를 저장한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;API&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 문서는 Swagger를 통해 정리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://app.swaggerhub.com/apis/seongahpark/PJ1-Vote-API/1.0.0#/UserPromise/getUserChoice&quot;&gt;StreetDaeFight API&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654526957851&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;Build, Collaborate &amp;amp; Integrate APIs | SwaggerHub&quot; data-og-description=&quot;&quot; data-og-host=&quot;app.swaggerhub.com&quot; data-og-source-url=&quot;https://app.swaggerhub.com/apis/seongahpark/PJ1-Vote-API/1.0.0#/UserPromise/getUserChoice&quot; data-og-url=&quot;https://app.swaggerhub.com/apis/seongahpark/PJ1-Vote-API/1.0.0#/UserPromise/getUserChoice&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://app.swaggerhub.com/apis/seongahpark/PJ1-Vote-API/1.0.0#/UserPromise/getUserChoice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://app.swaggerhub.com/apis/seongahpark/PJ1-Vote-API/1.0.0#/UserPromise/getUserChoice&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Build, Collaborate &amp;amp; Integrate APIs | SwaggerHub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;app.swaggerhub.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 도중 API를 여러번 바꿔서 프로젝트 끝나고나서 다시 만든건 비밀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 만들어보면서 Swagger Hub 사용법을 많이 익혔다. Swagger Hub 사용법은 따로 포스팅해보겠다.&lt;/p&gt;</description>
      <category>DevOps/Project</category>
      <category>DevOps</category>
      <category>부트캠프</category>
      <category>코드스테이츠</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/51</guid>
      <comments>https://dadidadi.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 2 Jun 2022 17:41:20 +0900</pubDate>
    </item>
    <item>
      <title>[Docker, EC2, SCP] SCP 명령을 통해 로컬에서 EC2로 파일을 옮기는 과정에서 겪었던 야크 털 쉐이빙</title>
      <link>https://dadidadi.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데브옵스 부트캠프 세 번째 프로젝트에서 했던 야크털 깎기 중 최고봉은 바로바로 &lt;b&gt;로컬에서 ec2로 &lt;code&gt;scp&lt;/code&gt; 명령어를 통해 파일을 전달&lt;/b&gt;할 때 발생했던 삽질들이었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표는 로컬에서 EC2로 &lt;code&gt;scp&lt;/code&gt; 명령어를 통해 도커 이미지 빌드에 필요한 파일들을 보낸 후, 이미지를 빌드하여 실행시켜 로컬이 아닌 EC2 환경에서 도커 이미지가 실행되도록 하는 과정이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 많은 야크 털 쉐이빙 과정을 겪었는데 하나씩 풀어보겠다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;save는 돌아가는 길이에요&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 이미지를 로컬에서 ec2로 옮기기 위해 구글링을 해보던 중 &lt;a href=&quot;https://hwanlee.tistory.com/18&quot;&gt;이 글&lt;/a&gt;을 발견했다&lt;br /&gt;이 글에 나와있는 설명을 간단하게 정리해보자면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에서 docker 이미지를 만든다&lt;/li&gt;
&lt;li&gt;이미지를 tar 확장자로 &lt;code&gt;docker save&lt;/code&gt; 명령을 통해 저장한다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scp&lt;/code&gt; 명령을 통해 원격 서버로 tar 파일을 전송한다&lt;/li&gt;
&lt;li&gt;원격서버에서 전송된 tar 파일을 &lt;code&gt;docker load&lt;/code&gt;를 통해 이미지로 저장한다&lt;/li&gt;
&lt;li&gt;저장된 도커 이미지를 실행한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하다가 왜 tar 확장자로 저장하는지 이해가 안돼서 크루분께 여쭤봤더니 돌아오는 말..&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;save는 돌아가는 길이에요 save 쓰지마세요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네...&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 Dockerfile만 ec2로 옮겨서 ec2에 이미지를 만든 뒤 run하기만 하면 됐다..&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;scp&lt;/code&gt;로 Dockerfile과 index.html을 ec2로 옮겨준다&lt;/li&gt;
&lt;li&gt;ec2에서 이미지를 빌드한다&lt;/li&gt;
&lt;li&gt;Run..&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나갈때는 마음대로지만 들어올땐 아니란다&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;scp&lt;/code&gt; 명령을 통해 Dockerfile과 index.html을 보내고싶은데 계속 권한 에러가 떴던 상황이었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;scp&lt;/code&gt; 명령어 사용법을 구글링으로 찾았을 때 다음과 같이 사용하는 것을 알 수 있었다&lt;/p&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;scp [옵션] [파일명] [원격지_id]@[원격지_ip]:[받는 위치]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 명령어를 이렇게 썼더니&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;scp Dockerfile ubuntu@퍼블릭IP주소:/Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응 안돼&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;[ubuntu@퍼블릭IP](mailto:ubuntu@퍼블릭IP): Permission denied (publickey).
lost connection&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러메시지를 복사해서 구글링을 해보니 역시 aws &lt;a href=&quot;https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-linux-fix-permission-denied-errors/&quot;&gt;레퍼런스&lt;/a&gt;를 잘 준비해놨다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 레퍼런스(야크털 쉐이빙 지름길^^)대로 해보자면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에서 ssh 퍼블릭 키 값을 복사한다&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키 값 위치는 &lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt; 에서 확인할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ec2에서 다음 명령어를 실행해준다
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ echo '복사한 ssh 퍼블릭 키' &amp;gt;&amp;gt; /home/ubuntu/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;권한을 수정한다
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;$ sudo chown root:root /home
$ sudo chmod 755 /home
$ sudo chown ubuntu:ubuntu /home/ubuntu -R
$ sudo chmod 700 /home/ubuntur /home/ubuntu/.ssh
$ sudo chmod 600 /home/ubuntu/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;ec2를 종료한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 하고 다시 위의 명령어를 실행했지만 같은 에러를 뱉었고, ec2에 다시 들어가려고 하자&lt;br /&gt;띠용! &lt;b&gt;ec2에 접속 자체가 안된다&lt;/b&gt;!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ec2 접속 명령어를 통해 접속을 시도해도 이전에 봤던 에러 &lt;code&gt;[ubuntu@퍼블릭IP](mailto:ubuntu@퍼블릭IP): Permission denied (publickey).&lt;/code&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;결국 ec2를 새로 만들게 되었다..&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 뻘짓을 안해도 &lt;code&gt;scp&lt;/code&gt; 명령의 옵션을 통해 ec2에 간단하게 접속할 수 있었다&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;scp -i 'pem키_주소' index.html ubuntu@'퍼블릭IP':/index.html&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 허무하다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일 경로 이슈&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 사용한 scp 명령어를 사용하면 사실 또 다른 에러를 뱉는다&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;scp: /index.html: Permission denied&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 진짜 멍청한 실수였다&lt;br /&gt;경로를 &lt;code&gt;/index.html&lt;/code&gt;로 해놓으면 root 폴더에 &lt;code&gt;index.html&lt;/code&gt; 파일을 옮긴다는 건데 당연히 권한 에러가 뜰 수 밖에 없다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;홈 디렉토리&lt;/b&gt;를 애용합시다 ㅎㅎ&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;scp -i 'pem키_주소' index.html ubuntu@'퍼블릭IP':/home/ubuntu/index.html&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 명령을 사용할 때는 명령 사용법을 잘 알아봅시다&lt;/li&gt;
&lt;li&gt;구글링 할 때 한 글만 보지 말고 다른 글들도 보면서 다양한 방법을 찾아봅시다&lt;/li&gt;
&lt;li&gt;EC2는 나쁩니다&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>TroubleShooting</category>
      <category>docker</category>
      <category>EC2</category>
      <category>scp</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/50</guid>
      <comments>https://dadidadi.tistory.com/50#entry50comment</comments>
      <pubDate>Mon, 9 May 2022 15:04:03 +0900</pubDate>
    </item>
    <item>
      <title>[Github] git에서 특정 브랜치만 clone하는 방법</title>
      <link>https://dadidadi.tistory.com/49</link>
      <description>&lt;h2&gt;상황&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Git clone을 하고싶은데 &lt;code&gt;main&lt;/code&gt;이 아닌 다른 특정 브랜치를 clone 해오고싶어서 방법을 찾아봤다.&lt;br&gt;그냥 Git clone을 진행하면 &lt;code&gt;main&lt;/code&gt; 브랜치가 클론되는데, 내가 clone해오고 싶은 브랜치는 &lt;code&gt;master&lt;/code&gt;인 상황이었다.&lt;/p&gt;
&lt;h2&gt;해결&lt;/h2&gt;
&lt;hr&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone -b &amp;#39;branch name&amp;#39; --single-branch &amp;#39;repository url&amp;#39;
git clone -b master --single-branch &amp;#39;repo url&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게하면 master의 branch 내용만 클론 해올 수 있다&lt;/p&gt;</description>
      <category>TroubleShooting</category>
      <category>Branch</category>
      <category>clone</category>
      <category>github</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/49</guid>
      <comments>https://dadidadi.tistory.com/49#entry49comment</comments>
      <pubDate>Sun, 8 May 2022 22:51:10 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)</title>
      <link>https://dadidadi.tistory.com/48</link>
      <description>&lt;h2&gt;발생시기&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;RDS에 접속할 때 발생&lt;/p&gt;
&lt;h2&gt;상황&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;서버에서 RDS 접속하려고 할 때, 또는 로컬이나 EC2에서 RDS에 접속할 때 DB에 접속이 안된다면서 발생하는 에러&lt;/p&gt;
&lt;h2&gt;원인&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;이 에러가 떴다 = &lt;strong&gt;비밀번호 확인하세요&lt;/strong&gt; 제발!!!!!!!&lt;/p&gt;
&lt;p&gt;DB에 연결하기 위한 매개변수들이 잘못되어서 발생하는 오류이다&lt;/p&gt;
&lt;h2&gt;해결&lt;/h2&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;쉘을 통해 RDS에 직접 접속할 때 이 에러가 발생했다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;-&amp;gt; 비밀번호가 잘못되지 않았다고 생각된다면 비밀번호 변경하고 다시 도전&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;서버에서 접속할 때 이 에러가 발생했다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;-&amp;gt; DB 관련 환경 변수가 제대로 되었는지 확인하세요&lt;br&gt;-&amp;gt; Lambda같은 경우에는 Deploy 할 때 환경변수가 날라가는 경우가 있으므로 Lambda 환경변수 확인할 것!&lt;/p&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;환경변수... 비밀번호..^^ 잘 확인합시다&lt;/p&gt;</description>
      <category>TroubleShooting</category>
      <category>mysql</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/48</guid>
      <comments>https://dadidadi.tistory.com/48#entry48comment</comments>
      <pubDate>Fri, 29 Apr 2022 13:07:02 +0900</pubDate>
    </item>
    <item>
      <title>[AWS, RDS] 로컬, EC2에서 RDS 접속하는 방법</title>
      <link>https://dadidadi.tistory.com/47</link>
      <description>&lt;p&gt;이번 포스팅에서는 AWS Mysql RDS를 로컬에서 접속하는 방법에 대해 포스팅 해보겠다&lt;/p&gt;
&lt;p&gt;EC2에서 RDS에 접속하는 방법과 동일한 쉘을 이용해서 접속하는 방법을 소개할 것이다&lt;/p&gt;
&lt;h2&gt;준비사항&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;컴퓨터에 Mysql이 설치되어 있지 않다면 mysql을 설치해준다 &lt;/p&gt;
&lt;p&gt;필자는 Mac이므로 brew를 통해 설치해주었다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew install mysql&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;접속 방법&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;쉘에서 다음 명령을 입력한다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;mysql -h 호스트_엔드포인트 -u 유저이름 -p&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;호스트 엔드포인트는 &lt;strong&gt;RDS의 엔드포인트&lt;/strong&gt;를 말한다&lt;/p&gt;
&lt;p&gt;-p 옵션을 통해 비밀번호를 입력하고 나면 쉘 모양이 &lt;code&gt;mysql&lt;/code&gt;로 변경된 것을 확인할 수 있을 것이다&lt;/p&gt;
&lt;p&gt;그러면 접속 성공!&lt;/p&gt;
&lt;h2&gt;원하는 데이터베이스로 이동하기&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;show databases&lt;/code&gt;를 통해 database이름을 확인할 수 있고,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;use db_name&lt;/code&gt;을 통해 해당 DB로 이동할 수 있다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; show databases; # DB들을 출력해준다 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| project3a          |
+--------------------+
2 rows in set (0.02 sec)

mysql&amp;gt; use project3a # project3a DB를 사용하기 위해 이동 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql&amp;gt; show tables; # project3a에 있는 table들을 출력해준다
+---------------------+
| Tables_in_project3a |
+---------------------+
| advertisement       |
| factory             |
| product             |
+---------------------+
3 rows in set (0.04 sec)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;해당 DB로 이동했으면 Mysql 쿼리문을 통해 원하는 작업을 수행하면 된다&lt;/p&gt;
&lt;p&gt;EC2에서도 로컬에서 쉘로 접속하는 방법과 마찬가지로 동일한 명령을 통해 RDS로 접근할 수 있다&lt;/p&gt;
&lt;p&gt;그저 쉘을 띄운 환경의 차이가 EC2냐 로컬이냐의 차이다!&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>mysql</category>
      <category>RDS</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/47</guid>
      <comments>https://dadidadi.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 29 Apr 2022 11:29:06 +0900</pubDate>
    </item>
    <item>
      <title>[M1 Mac, AWS Lambda] 'sharp' cannot find module, Something went wrong installing the \&amp;quot;sharp\&amp;quot; 오류 해결</title>
      <link>https://dadidadi.tistory.com/46</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;발생시기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 resize하는 AWS Lambda 함수를 만들기 위해 작업하는 도중 발생한 에러&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상황&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm의 &lt;code&gt;sharp&lt;/code&gt;모듈을 사용해야 하는데, 모듈을 사용하려고 하면 &lt;code&gt;'sharp' cannot find module&lt;/code&gt;이나, &lt;code&gt;Something went wrong installing the \&quot;sharp\&quot;&lt;/code&gt; 에러가 출력되는 상황&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M1 Mac 문제인 것으로 확인되며, &lt;code&gt;package.json&lt;/code&gt;의 &lt;code&gt;depencencies&lt;/code&gt;에서 &lt;code&gt;sharp&lt;/code&gt;가 있으면 해당 에러를 뱉는다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;package.json&lt;/code&gt;의 &lt;code&gt;dependencies&lt;/code&gt;에서 &lt;code&gt;sharp&lt;/code&gt;관련 라인을 삭제해준다&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;dependencies&quot;: {
        &quot;aws-sdk&quot;: &quot;^2.1111.0&quot;
          &quot;sharp&quot;: &quot;^0.30.3&quot; // 해당 라인을 삭제해준다
    },
    &quot;devDependencies&quot;: {
        &quot;jest&quot;: &quot;^26.6.3&quot;
    },
    &quot;scripts&quot;: {
        &quot;test&quot;: &quot;jest&quot;,
        &quot;preinstall&quot;: &quot;npm install --platform=linux --arch=x64 --no-save sharp&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 m1이는 왜이렇게 까다로울까. 구글링 할 때도 mac이나 m1을 붙여서 검색하면 좀 더 수월하게 검색할 수 있을 것 같다.&lt;/p&gt;</description>
      <category>TroubleShooting</category>
      <category>M1</category>
      <category>sharp</category>
      <author>아임다디</author>
      <guid isPermaLink="true">https://dadidadi.tistory.com/46</guid>
      <comments>https://dadidadi.tistory.com/46#entry46comment</comments>
      <pubDate>Tue, 26 Apr 2022 21:40:17 +0900</pubDate>
    </item>
  </channel>
</rss>