<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>go_by.log</title>
        <link>https://velog.io/</link>
        <description>Front를 하다보면 Back이 하고싶고, Back을 하다보면 Front가 하고싶고.</description>
        <lastBuildDate>Wed, 20 Oct 2021 11:11:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>go_by.log</title>
            <url>https://images.velog.io/images/go_by/profile/1d625b0b-1cd5-4f0f-9a58-7be87bc2cecc/icebear.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. go_by.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/go_by" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Algorithm] Programmers_124 나라의 숫자]]></title>
            <link>https://velog.io/@go_by/Algorithm-Programmers124-%EB%82%98%EB%9D%BC%EC%9D%98-%EC%88%AB%EC%9E%90</link>
            <guid>https://velog.io/@go_by/Algorithm-Programmers124-%EB%82%98%EB%9D%BC%EC%9D%98-%EC%88%AB%EC%9E%90</guid>
            <pubDate>Wed, 20 Oct 2021 11:11:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/go_by/post/76dd2fa4-01af-460e-afef-c016d73ce500/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-20%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.06.22.png" alt=""></p>
<p>우선 해당 문제의 규칙을 이해하는데도 한참 걸렸다.</p>
<p>숫자 진법으로 바꾸는 문제라고만 생각을 했는데, 아무리봐도 규칙이 보이지가 않아서 다른 블로그를 참고해보니 <strong>나머지가 0일 때는 나머지를 4로 표기</strong>하고 <strong>몫을 1 감소</strong>시켜야 하는 규칙이 있었다.</p>
<pre><code>function solution(n) {
    var answer = &#39;&#39;;

    var q = parseInt(n / 3);
    var r = n % 3;

    if (r == 0) {
        r = 4;
        q--;
    }

    answer = r;

    while (q &gt; 0) {

        r = q % 3;
        q = parseInt(q / 3)

        if (r == 0) {
            r = 4;
            q--;
        }

        answer = r + &quot;&quot; +answer;
    }

    q = q &lt;= 0 ? &quot;&quot; : q

    answer = q + &quot;&quot; + answer;

    return answer;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] Programmers_조이스틱]]></title>
            <link>https://velog.io/@go_by/Algorithm-Programmers-%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1</link>
            <guid>https://velog.io/@go_by/Algorithm-Programmers-%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1</guid>
            <pubDate>Mon, 11 Oct 2021 01:39:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/go_by/post/3affdcb2-bc4d-4c1d-9b06-7394289db088/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.33.47.png" alt=""></p>
<pre><code>function solution(name) {
    var answer = 0;

    let ascCnt = 0;
    let descCnt = 0;

    let nameArr = name.split(&quot;&quot;);
    let forwardArr = name.split(&quot;&quot;);
    let reverseArr = forwardArr.slice(0, 1).concat(name.split(&quot;&quot;).reverse().slice(0, name.length - 1));

    if (nameArr.filter((x) =&gt; x != &quot;A&quot;).length &lt; 1) return 0;

    for (var i = 0; i &lt; name.length; i ++) {
        if (forwardArr.filter((x) =&gt; x != &quot;A&quot;).length &gt; 0) {
            ascCnt++;   
            forwardArr = forwardArr.slice(1);
            let lastChar = &quot;&quot;;
            if (forwardArr.length * 1.0 / 2 &lt; forwardArr.findIndex((x) =&gt; x != &quot;A&quot;)) {
                lastChar = forwardArr[0];
                forwardArr.reverse();
                forwardArr.pop();
                forwardArr.unshift(lastChar);
            }
        }
        if (reverseArr.filter((x) =&gt; x != &quot;A&quot;).length &gt; 0) {
            descCnt++;
            reverseArr = reverseArr.slice(1);
        }
    }
    ascCnt = ascCnt &gt; 0 ? ascCnt-1 : 0;
    descCnt = descCnt &gt; 0 ? descCnt-1 : 0;

    for (var i = 0; i &lt; nameArr.length; i ++) {
        if (nameArr[i] == &#39;A&#39;) continue;

        let code = nameArr[i].charCodeAt();

        if (code &gt; 78) {
            answer += 25 - Math.abs(code - 65) + 1;
        } else {
            answer += Math.abs(code - 65);
        }
    }

    answer = ascCnt &gt; descCnt ? answer + descCnt : answer + ascCnt;

    return answer;
}</code></pre><p>처음 문제 풀 때 고려했던 4가지는 아래와 같다</p>
<ul>
<li>아스키코드로 절대값(A-B) 계산해서 위 아래 중 뭐가 적은지 비교</li>
<li>절대값이 12 초과 차이 나면 반대로 가야함</li>
<li>만들어야 할 단어가 A 면 스킵하고 넘어가기</li>
<li>글자 수 비교해서 왼쪽으로 이동하는게 빠른지 오른쪽으로 이동하는게 빠른지 체크</li>
</ul>
<p>그런데 위 4가지만 고려하고 코드를 짰을 때는, 테스트케이스에서 1개가 계속 실패했다.</p>
<p>추가로 고려해야했던 상황은
처음엔 정방향으로 갔다가 다시 역순으로 가는게 빠를 때! 이 케이스를 누락했다.</p>
<p>어차피 첫 번째 문자에서 왼쪽 커서를 눌러 오른쪽으로 가게되면 다시 오른쪽으로는 갈 수 없기 때문에
if (forwardArr.length * 1.0 / 2 &lt; forwardArr.findIndex((x) =&gt; x != &quot;A&quot;)) 이 if 문에 걸리는 경우 그냥 배열을 첫 번째 문자 제외하고 역순으로 뒤집어 버렸다.</p>
<p>어렵다 어려워 알고리즘...
더 좋은 방법이 없나 서치 좀 해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] Programmers_타겟넘버]]></title>
            <link>https://velog.io/@go_by/Algorithm-Programmers%ED%83%80%EA%B2%9F%EB%84%98%EB%B2%84</link>
            <guid>https://velog.io/@go_by/Algorithm-Programmers%ED%83%80%EA%B2%9F%EB%84%98%EB%B2%84</guid>
            <pubDate>Mon, 04 Oct 2021 02:06:16 GMT</pubDate>
            <description><![CDATA[<p>[문제 링크]
<a href="https://programmers.co.kr/learn/courses/30/lessons/43165?language=javascript#">https://programmers.co.kr/learn/courses/30/lessons/43165?language=javascript#</a></p>
<pre><code>function solution(numbers, target) {
    var answer = 0;

    //numbers 배열의 모든 총 합이 target과 같은 경우 다른 방법은 없으므로 1로 리턴
    if (numbers.reduce((pre, cur) =&gt; pre + cur) === target) return 1;

    //재귀 작성
    const dfs = (cnt, sum) =&gt; {
        //전체 배열의 길이보다 작은 경우에만
        if (cnt &lt; numbers.length) {
            //더했을 경우와 뺏을 경우 모두 비교해야하므로
            dfs(cnt + 1, sum + numbers[cnt])
            dfs(cnt + 1, sum - numbers[cnt])
        } else {
            //모든 numbers를 다 순회 한 이후 sum과 target이 같으면 ++
            if (sum === target) ++answer;
        }
    }

    dfs(0, 0)

    return answer;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[git] 다른 branch간 파일 비교]]></title>
            <link>https://velog.io/@go_by/git-%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EA%B0%84-%ED%8C%8C%EC%9D%BC-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@go_by/git-%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EA%B0%84-%ED%8C%8C%EC%9D%BC-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Wed, 29 Sep 2021 05:39:55 GMT</pubDate>
            <description><![CDATA[<p><strong>1)  브랜치1과 브랜치2의 다른 내용 전체 비교</strong></p>
<pre><code>git diff 브랜치1명 브랜치2명</code></pre><p><strong>2 ) 브랜치1과 브랜치2의 특정 파일 다른 내용 비교</strong></p>
<pre><code>git diff 브랜치1명 브랜치2명 파일경로</code></pre><p><strong>3 ) git diff 명령어 뒤에 오는 순서에 따라 표기가 달라지게 됨</strong></p>
<pre><code>** Ex. 브랜치 2에만 추가 된 내용이 있는 경우 **

git diff 브랜치1명 브랜치2명 =&gt; 삭제 된 코드로 나옴
git diff 브랜치2명 브랜치1명 =&gt; 추가 된 코드로 나옴</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring Boot] MockMvc multipart/form-data로 테스트하기]]></title>
            <link>https://velog.io/@go_by/Spring-Boot-MockMvc-multipartform-data%EB%A1%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@go_by/Spring-Boot-MockMvc-multipartform-data%EB%A1%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 28 Sep 2021 01:40:19 GMT</pubDate>
            <description><![CDATA[<h4 id="테스트-코드-강제화--보다-더-깔끔한-api-문서-생성을-위해-적용한-spring-rest-docs"><strong>테스트 코드 강제화 + 보다 더 깔끔한 API 문서 생성</strong>을 위해 적용한 <strong>Spring REST Docs</strong></h4>
<p>처음 세팅도 난관이었지만 이건 테스트 코드 작성 + 문서 코드 작성 조차도 쉽지가 않다.
다들 난이도 있다고 한 이유가 있었음을 실감하는 중.</p>
<p>이번 삽질은 게시글 작성 시에 이미지를 함께 첨부할 일이 있어서, multipart/form-data 폼을 사용할 일이 있었는데 다른 것도 아니고 문서 작성 코드를 쓰는데 너무 삽질을 많이 했다.</p>
<p><strong>1. Spring REST Docs 공식 문서</strong>
<img src="https://images.velog.io/images/go_by/post/de03e330-d6c2-4465-9203-4cbb6164531d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-28%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.18.49.png" alt="">공식 문서를 참고해서 가상의 MultipartFile 객체는 어렵지 않게 만들 수 있었다.</p>
<p><strong>2. File 객체 외의 추가 파라미터</strong>
<img src="https://images.velog.io/images/go_by/post/7bb2a582-78ca-40aa-a02b-0ca0021ad4e8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-28%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.21.58.png" alt="">나는 위의 이미지와 같이 file 객체 외에 다른 파라미터들을 함께 넘기고 싶었다.
그래서 생성한 테스트 코드는 아래와 같다.</p>
<p><strong>3. 테스트 코드 작성</strong></p>
<pre><code>MockMultipartFile image = new MockMultipartFile(&quot;files&quot;, &quot;imagefile.jpeg&quot;, &quot;image/jpeg&quot;, &quot;&lt;&lt;jpeg data&gt;&gt;&quot;.getBytes());

    mockMvc
        .perform(RestDocumentationRequestBuilders.fileUpload(apiUrl)
            .file(image)
            .param(&quot;reqType&quot;, &quot;P&quot;)
            .param(&quot;departure&quot;,&quot;mvc test departure&quot;)
            .param(&quot;arrival&quot;,&quot;mvc test arrival&quot;)
            .param(&quot;arrivalDate&quot;, &quot;2021-10-15&quot;)
            .param(&quot;title&quot;,&quot;mvc test title&quot;)
            .param(&quot;content&quot;,&quot;mvc test content&quot;)
            .flashAttr(&quot;write&quot;, new PostDto.Write())
            )</code></pre><p><strong>MockMultipartFile</strong> 생성 시 인자 값은 다음과 같다.</p>
<p>1) file 객체를 받을 Parameter Name (2번의 이미지를 보면 알겠지만, 나는 files라는 key값으로 받고있다)
2) Original File Name
3) MIME TYPE
4) 파일을 구성 데이터</p>
<p>RequestBuilder에서 이미지에 대해서만 .file의 값으로 채웠고, 그 외 다른 파라미터들은 .param 값으로 입력을 했다.</p>
<p>*<em>4. 문서 작성 코드 부분
*</em></p>
<pre><code>.andDo(document(&quot;post/{method-name}&quot;,
    requestParameters(
        parameterWithName(&quot;reqType&quot;).description(&quot;요청 타입&quot;)
        ,parameterWithName(&quot;departure&quot;).description(&quot;출발지&quot;)
        ,parameterWithName(&quot;arrival&quot;).description(&quot;도착지&quot;)
        ,parameterWithName(&quot;arrivalDate&quot;).description(&quot;픽업일자&quot;)
        ,parameterWithName(&quot;title&quot;).description(&quot;제목&quot;)
        ,parameterWithName(&quot;content&quot;).description(&quot;내용&quot;)
    )
    , requestParts(
        partWithName(&quot;files&quot;).description(&quot;첨부 이미지&quot;)
    )</code></pre><p>1번에서 본 공식 문서 가이드에는 file객체 외에 일반 텍스트 파라미터를 함께 명시해 둔 가이드가 없는데 정말 별거 없다.
그냥 requestParameters에 parameterWithName으로 작성해주면 된다.</p>
<p>file 객체는 part 타입으로 넘어오므로 별도로 표기까지 해주었다.</p>
<p>*<em>5. 생성 된 문서
*</em><img src="https://images.velog.io/images/go_by/post/23805e53-57d6-4e1b-ace9-e433fb74d0e6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-28%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.37.52.png" alt="">깔끔해.. 너무 조앙...</p>
<p>요청값과 응답값이 맞지 않으면 테스트 자체를 통과하지 못하고, 그렇기 때문에 문서도 변경되지 않는다. 종종 프로젝트 막바지에 추가로 특정 값들이 추가되거나 그런 경우 문서 업데이트가 누락되는 경우도 많은데 그럴 일이 없어서 좋을 것 같다.
그리고 개발하는데 있어서 단위 테스트 코드 작성에도 습관 들일 수 있을 것 같아서 열심히 사용해보려고 한다.</p>
<p>끗.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] STS 버젼 변경 후 Lombok 에러 ]]></title>
            <link>https://velog.io/@go_by/Spring-STS-%EB%B2%84%EC%A0%BC-%EB%B3%80%EA%B2%BD-%ED%9B%84-Lombok-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@go_by/Spring-STS-%EB%B2%84%EC%A0%BC-%EB%B3%80%EA%B2%BD-%ED%9B%84-Lombok-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Wed, 30 Dec 2020 02:50:11 GMT</pubDate>
            <description><![CDATA[<p><strong>Lombok이란?</strong></p>
<blockquote>
<p>Java에서 getter, setter 등의 메소드를 대신 생성해주는 라이브러리이다.
외에도 편리한 어노테이션들을 많이 제공하고 있다고 한다.</p>
</blockquote>
<p>최근에 맥북 OS 업데이트를 하고나서 갑자기 STS가 실행이 안되는 바람에 JDK 삭제 &gt; 재설치, PC 재부팅 등등 하면서 가까스로 다시 STS를 살려냈는데, 문제는 다음이었다 :(</p>
<p>갑자기 STS 창 분할, 창 이동 등 드래그드랍으로 편리하게 창을 이동하고 분할하고 하던 기능들이 갑자기 먹통이 된 것... 진짜 이런 엄한데서 시간 뺏기면 열 받는다..</p>
<p>찾아보기도 귀찮고 사용하던 STS 버젼이 3 버전대라서 그냥 4버전대로 업데이트도 할 겸, 그냥 쿨하게 삭제하고 STS4를 설치했다.</p>
<p>그리고 workspace 버젼도 다시 업데이트 해주고, jdk도 제대로 잡혀있는지 확인도 하고, 다 멀쩡해 보였는데 코드에서 에러 뿜뿜 ㅠㅠ 보니까 Lombok에서 뭔가 오류가 있는 것 같았다!</p>
<p><img src="https://images.velog.io/images/go_by/post/6f06b35d-395a-4f45-b442-1cbf9a47e2f5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-12-30%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.43.29.png" alt=""></p>
<p>우선 STS 설정파일이 위치한 곳에 lombok.jar가 존재하는지 확인!
나 같은 경우엔 존재는 하는데 뭔가 정상적으로 동작하지가 않아서 그냥 저 jar파일을 삭제했다.</p>
<p><img src="https://images.velog.io/images/go_by/post/c0f5ea9b-88ed-4238-a72f-c13739a593a3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-12-30%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.44.35.png" alt=""></p>
<p>그리고나서 Maven 프로젝트 중 아무거나 하나를 열어서, Maven Dependencies에 있는 lombok.jar 파일을 Java Application으로 실행했다.</p>
<p><img src="https://images.velog.io/images/go_by/post/6d2c8bd1-288e-4016-8792-7a6490881410/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-12-30%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.48.22.png" alt=""></p>
<p>그럼 이런 화면이 뜨는데, Specify location... 을 클릭해서 ini 파일(STS 셋팅 파일 / 위에서 삭제한 lombok.jar 파일의 경로와 같은 곳에 있음)을 선택, 그리고 Install/Upadte를 눌러주면 끝!</p>
<p>STS를 재시작한 후에, clean &gt; build 해 보았더니 오류 없이 정상 동작한다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[RN] react-native-location 보다 더 정확한 위치 가져오기]]></title>
            <link>https://velog.io/@go_by/react-native-location-%EB%B3%B4%EB%8B%A4-%EB%8D%94-%EC%A0%95%ED%99%95%ED%95%9C-%EC%9C%84%EC%B9%98-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@go_by/react-native-location-%EB%B3%B4%EB%8B%A4-%EB%8D%94-%EC%A0%95%ED%99%95%ED%95%9C-%EC%9C%84%EC%B9%98-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Wed, 02 Dec 2020 06:50:23 GMT</pubDate>
            <description><![CDATA[<p>현재 개발 중인 앱에서 현재 위치를 가져오는 기능이 필요해서 아래 패키지를 사용 중이다</p>
<p><a href="https://github.com/timfpark/react-native-location">react-native-location</a></p>
<p>필요한 기능들을 제법 많이 제공하고 있어서 잘 사용 중이었는데, 배포 전 마지막 운영 테스트에서
<strong>&#39;<em>Android 디바이스에서 실제 현재 위치와 앱에서 표기해주는 현재 위치가 다소 차이가 난다</em>&#39;</strong> 는 이슈가 나왔다.</p>
<p>테스트 중인 사무실 위치는 신사동인데 자꾸 한남동으로 나온다는 것이었다.</p>
<p>한남동에서 다리 하나만 건너면 신사동이라 쌩판 잘못됐다기보다는 정확도 문제인 것 같아서,
정확도 향상이 가능한지 다시 한번 문서 정독!</p>
<p><strong>Configuration</strong> 쪽 셋팅 시에, <strong>desiredAccuracy</strong> 라는 값이 있다.</p>
<pre><code>RNLocation.configure({
    distanceFilter: 100, // Meters
    desiredAccuracy: {
      ios: &quot;best&quot;,
      android: &quot;balancedPowerAccuracy&quot;
    },
    // Android only
    androidProvider: &quot;auto&quot;,
    interval: 5000, // Milliseconds
    fastestInterval: 10000, // Milliseconds
    maxWaitTime: 5000, // Milliseconds
    // iOS Only
    activityType: &quot;other&quot;,
    allowsBackgroundLocationUpdates: false,
    headingFilter: 1, // Degrees
    headingOrientation: &quot;portrait&quot;,
    pausesLocationUpdatesAutomatically: false,
    showsBackgroundLocationIndicator: false,
})</code></pre><p>The accuracy of the location data. Defaults to best on iOS and balancedPowerAccuracy on Android.</p>
<p><strong>Valid options for android :</strong> balancedPowerAccuracy, highAccuracy, lowPower, or noPower.</p>
<p><strong>Valid options for ios :</strong> bestForNavigation, best, nearestTenMeters, hundredMeters, or threeKilometers.</p>
<p>위와 같이 정확도와 관련 된 다양한 옵션들을 제공 중이었다.
가장 높은 정확도인 _<strong>highAccuracy</strong>_를 선택하고 다시 빌드 후 실행해보았다</p>
<p>역시나 한 번에 될리가 ㅎㅎ</p>
<p>디버그 모드 실행해서 보니 아래와 같은 warning 발견</p>
<p><img src="https://images.velog.io/images/go_by/post/cc33aff4-f21b-4974-8736-b35c53db9c66/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-12-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.28.44.png" alt=""></p>
<p>확인해보니, RNLocation 사용을 위해 위치 권한을 사용자에 요청할 때 모드가 coarse로 되어 있었다</p>
<p>안드로이드 공식 문서를 조금 더 찾아보니 위와 같은 차이점에 대한 설명을 확인할 수 있었다!</p>
<p>android.permission.<strong>ACCESS_COARSE_LOCATION</strong> - <em>API에서 WiFi 또는 모바일 데이터(또는 둘 다)를 사용하여 기기의 위치를 결정할 수 있습니다. API에서는 정확도가 도시 블록 1개 정도의 오차 수준으로 위치를 반환합니다.</em></p>
<p>android.permission.<strong>ACCESS_FINE_LOCATION</strong> - _API에서 위성 위치 확인 시스템(GPS), WiFi 및 모바일 데이터 등 이용 가능한 위치 제공자를 사용하여 최대한 정확하게 위치를 결정할 수 있습니다.</p>
<p>Coarse 정도의 권한으로는 도시 블록 1개 정도 오차 수준이 발생할 수 있다고 하니, 다리 하나 건너는 정도의 오차가 발생할 수 있었던 것 같다.</p>
<p>*<em>권한 요청 코드 수정
*</em></p>
<ul>
<li>기존 코드<pre><code>  RNLocation.requestPermission({
    ios: &#39;always&#39;,
    android: {
      detail: &#39;coarse&#39;,
    },
  })</code></pre></li>
</ul>
<p>이렇게 되어 있던 코드를 아래와 같이 수정!</p>
<ul>
<li>수정 코드<pre><code>  RNLocation.requestPermission({
    ios: &#39;always&#39;,
    android: {
      detail: &#39;fine&#39;,
    },
  })</code></pre></li>
</ul>
<p>수정하고 나니 매우 잘 된다! 완전 정확히 내가 현재 있는 위치로 좌표가 나오는 것도 확인!</p>
<p>디버깅.. 역시 디버깅이 최고다.....</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Server] AWS EC2 Linux 서버 셋팅]]></title>
            <link>https://velog.io/@go_by/Server-AWS-EC2-Linux-%EC%84%9C%EB%B2%84-%EC%85%8B%ED%8C%85</link>
            <guid>https://velog.io/@go_by/Server-AWS-EC2-Linux-%EC%84%9C%EB%B2%84-%EC%85%8B%ED%8C%85</guid>
            <pubDate>Thu, 26 Nov 2020 02:48:03 GMT</pubDate>
            <description><![CDATA[<p>벌써 개발자로 산 지 어언 3년 차에 접어 들었다.</p>
<p>사실, 아직도 나는 내가 서버 개발자인지 프론트엔드 개발자인지 잘 모르겠다 :(</p>
<p>자사 서비스나 솔루션이 있는 업체라면 말이 달라지겠지만,
작은 규모의 SI 업체에선 사실 하나만 딱 하기는 쉽지 않은 것 같다.</p>
<p>아무튼! 그 동안 우리 회사는 주로 NCP(Naver Cloud Platform)을 사용해왔는데
이번 클라이언트에서는 AWS를 사용하고싶다 하여, 부랴부랴 AWS 셋팅을 하게 되었다.</p>
<p>처음이라 진짜 별거 없는 거에 하루를 쏟아 부었지만 그래도 무사히 착착 진행되었음에 감사하며..
까먹지 않기 위해 글을 남겨본다...</p>
<blockquote>
<p><strong>1) AWS EC2 인스턴스 시작</strong></p>
</blockquote>
<p><strong>인스턴스 시작 전, 반드시 우측 내 ID 옆 리전(지역)을 확인할 것...</strong></p>
<p>최초에 오하이오 미국으로 잡혀 있어서 처음에 만든 인스턴스가 오하이오에 떠있었다 ㅠ_ㅠ
제일 중요한 것..! 리전 변경이 안된다!!!</p>
<p>나는 서버 셋팅이랑 디비 설치까지 다해놓고 그제서야 알아채서 좌절했다...
부랴부랴 서버 이미지 뜨고 서울 리전으로 새로 인스턴스 생성하는데만 또 한 시간은 잡아먹은 것 같다..</p>
<p>이런 삽질 최소화를 위해 현재 내 리전을 잘 체크합시다..!!</p>
<p><img src="https://images.velog.io/images/go_by/post/fabbc74e-368f-4f62-9f80-5107bcdf80a1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.09.20.png" alt=""></p>
<blockquote>
<p><strong>2) Amazon Machine Image(AMI) 선택</strong></p>
</blockquote>
<p>인스턴스 시작을 누르게 되면 MS Window Server, Linux, Ubuntu 등 다양한 서버 이미지를 선택할 수 있는 페이지로 이동된다.
이번 포스팅에서는 리눅스 + 톰캣 서버를 구축하려 하기 때문에, 가장 처음에 있는 Linux 이미지를 선택한다.</p>
<p><img src="https://images.velog.io/images/go_by/post/d655eea2-a277-48d0-be34-34d3a06623e4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.12.09.png" alt=""></p>
<blockquote>
<p><strong>3) 인스턴스 유형 선택</strong></p>
</blockquote>
<p>컴퓨터 맞출 때 사양을 체크하듯이 원하는 서버의 사양을 선택하는 페이지다.
이번 고객사에서는 초기에 비용 최소화를 원한다하셔서, 서버도 t2 micro 프리티어로 우선 선택
메모리 1GB... 쉽지 않다...ㅎㅎ 원하는 서버 사양을 선택했으면 다음으로!
<img src="https://images.velog.io/images/go_by/post/6dfe03b0-d4ce-4689-8e24-31d8c8b46afc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.17.06.png" alt=""></p>
<blockquote>
<p><strong>4) 인스턴스 구성, 스토리지 추가, 태그 추가</strong></p>
</blockquote>
<p>사실 요 3개는 나는 스킵하고 넘어갔다.
별도로 인스턴스 구성을 수정할 필요도 없었고, 스토리지나 태그도 추가할 필요가 없어서 그냥 넘어갔다!
나와 동일하게 기본 서버 구성정도만 필요한 사람은 앞 단계에서 다음이 아니라 그냥 검토 및 시작 버튼으로 넘어가도 될 듯 하다!</p>
<blockquote>
<p><strong>5) 보안 그룹 구성</strong></p>
</blockquote>
<p>보안 그룹 구성이란 쉽게 말해서 외부에서 접근할 수 있는 포트를 열어주는 것이다!
기본적으로는 가장 맨 위 SSH가 사용하는 22번 포트만 추가가 되어 있다.</p>
<p>하지만 나는 이 서버로 Http 통신도 해야하구, 별도로 RDS를 사용하는 것이 아니므로 여기에 DB까지 띄워야한다...
그래서 추가로 아파치에서 사용 할 80 포트와 내 앱 서버와 어드민 서버에서 사용할 8080, 8787
MariaDB에서 사용 할 기본 포트 3306 번까지 추가해줬다.</p>
<p><img src="https://images.velog.io/images/go_by/post/456fb610-3012-4282-90f4-13c684bf0e37/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.33.10.png" alt=""></p>
<p>여기까지 셋팅 후 검토 및 시작을 누르면 끝이다!
우선 가장 기본적인 Linux Server가 생성 된 것이다 ㅎㅎ</p>
<p><img src="https://images.velog.io/images/go_by/post/e85faf7d-4819-4506-b6af-ad37a28d131c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.42.32.png" alt="">
잘 생성되었다면 위 사진과 같이 인스턴스 목록에 1개가 추가되어있다!</p>
<p>여기에 이제 웹 서버로 사용할 톰캣도 설치를 해야하고, MariaDB도 설치를 해야하고...
기타 등등 설정해주어야 할 것이 많다.</p>
<p>다음 편에서는 만든 AWS EC2 Linux 서버에 톰캣을 설치해보는걸로!</p>
]]></description>
        </item>
    </channel>
</rss>