<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kyliecamila.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 08 Aug 2022 16:38:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. kyliecamila.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kyliecamila_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[React+DRF]카카오 로그인 구현]]></title>
            <link>https://velog.io/@kyliecamila_/ReactDRF%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@kyliecamila_/ReactDRF%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Mon, 08 Aug 2022 16:38:33 GMT</pubDate>
            <description><![CDATA[<p>구현하기까지 너무나 많은 시행착오와 삽질과.. 
아무튼 고난을 끝냈으니 어디에서 문제가 있었는지 등등을 정리해보고자 한다.
(일단 중요한것만 하고 나중에 한번 전체적으로 다듬을 예정이다)</p>
<p><img src="https://velog.velcdn.com/images/kyliecamila_/post/54b2945b-d748-4cdc-bfc9-4a431767f4fa/image.png" alt=""></p>
<p>위 사진에서 서비스클라이언트=React, 서비스서버=DRF이다.
Kakao Auth Server는 카카오 서버(내가 만든 서버가 아니다)</p>
<p>전반적인 과정에 대해 알고 싶다면 카카오 developers페이지를 참조해보자.
<a href="https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#before-you-begin">https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#before-you-begin</a></p>
<h2 id="카카오-로그인-요청">카카오 로그인 요청</h2>
<p>프런트엔드에서 백엔드로 요청을 보낸다.
<img src="https://velog.velcdn.com/images/kyliecamila_/post/6fc49cdc-896c-4221-a1b0-a5b653165c9f/image.png" alt="">
나는 Auth.js에서(위사진) 카카오톡으로 계속하기 버튼을 누르면 카카오로그인 페이지가 뜨도록 href를 연결해 놓았다.
(href가 실제로 작동하도록 하기 위해서는 1단계까지 마무리해야한다. 지금은 카카오로그인페이지가 당연히 안열린다..!)</p>
<h2 id="1단계---인가코드-받기">1단계 - 인가코드 받기</h2>
<p><a href="https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-code">https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-code</a></p>
<p>href 과정은는 다음 블로그를 많이 참고했다.
<a href="https://data-jj.tistory.com/53">https://data-jj.tistory.com/53</a></p>
<p>oAuth.js를 만들어서 거기에 <code>REST_API_KEY</code>,<code>REDIRECT_URL</code>,<code>KAKAO_AUTH_URL</code>을 저장해 놓았다.
이때 KAKAO_AUTH_URL = <code>https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&amp;redirect_uri=${REDIRECT_URI}&amp;response_type=code</code>이다
(카카오 디벨로퍼즈 요청 sample참조)
참고로 REST_API는 내애플리케이션&gt;{해당프로젝트}&gt;앱설정&gt;요약정보에 있다.
REDIRECT_URL은 카카오로그인을 한 후 리다이렉트될 페이지를 뜻한다. 즉 프런트엔드(리액트) 페이지 중에 골라야한다.
나는 REDIRECT_URL로 <a href="http://localhost:3000/InfoCollect%EB%A1%9C">http://localhost:3000/InfoCollect로</a> 해두었다. (이후 인가코드를 받아올 페이지이다.)</p>
<p>** 이때 내애플리케이션&gt;제품설정&gt;카카오로그인의 맨 하단의 <code>Redirect Url</code>에도 위와 똑같은 <a href="http://localhost:3000/InfoCollect%EB%A5%BC">http://localhost:3000/InfoCollect를</a> 저장해두어야한다.**</p>
<p>설정이 끝나고 아까 만든 Auth페이지에서 버튼을 클릭하면 다음과 같이 카카오 로그인 창으로 리다이렉트 될것이다!</p>
<p><img src="https://velog.velcdn.com/images/kyliecamila_/post/b760d855-7f5b-419e-b037-d195d4d72ef5/image.png" alt=""></p>
<p>로그인하고 나면 아까 설정해두었던 REDIRECT_URL로 가질것이다.
이와 함께 인가코드가 올것인데 어디에 있나면..</p>
<p><img src="https://velog.velcdn.com/images/kyliecamila_/post/3b55a971-40eb-4e8b-9ad0-121a12933237/image.png" alt=""></p>
<p>REDIRECT_URL로 설정해둔 url뒤에 쿼리스트링으로 인가코드가 있는것을 알 수 있다.(이 인가코드는 요청할때마다 바뀌는 값이다.)</p>
<h2 id="15단계">1.5단계</h2>
<p>인가코드를 받아오기는 했는데 이건 지금 프런트단에 있다.
하지만 인가코드는 어디에 쓰이는지 생각해보면 백엔드가 카카오 서버에게 인가코드를 보내고 카카오서버로부터 토큰을 받아올때 사용된다..</p>
<p>즉 프런트단에 있는 인가코드를 백엔드로 넘겨줘야한다는 뜻...</p>
<p>프런트단 url에 있는 인가코드를 변수에 저장해서 백엔드로 넘겨보자!</p>
<h3 id="인가코드-저장">인가코드 저장</h3>
<p>아까 나는 REDIRECT_URL로 <a href="http://localhost:3000/InfoCollect%EB%A1%9C">http://localhost:3000/InfoCollect로</a> 해두었다. 이때 <Callback /> 컴포넌트가 불려진다. 
여기서 다음 코드와 같이 인가코드를 받아서 저장하고 KakaoLogin이라는 컴포넌트로 넘겨주었다.</p>
<p><img src="https://velog.velcdn.com/images/kyliecamila_/post/e005d74e-e0ee-419a-8032-1901d178ffd1/image.png" alt=""></p>
<h3 id="백엔드로-인가코드-넘기기">백엔드로 인가코드 넘기기</h3>
<p>Callback컴포넌트로 부터 받은 인가코드를 이용해서 백엔드에 GET요청을 할것이다.
이유는 인가코드를 백엔드로 넘기기 위해서는 url에 쿼리스트링으로 넘겨야한다고 한다.
(출처는 <a href="https://velog.io/@isabel_noh/React-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-REST-API">https://velog.io/@isabel_noh/React-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-REST-API</a> 왜 인지는 나도 찾아봐야한다..)
<code>http://{서버주소}?code=${code}</code> 형식으로 넘기라고 하니(출처: <a href="https://data-jj.tistory.com/53">https://data-jj.tistory.com/53</a>)
나는 <code>http://localhost:8000/api/oauth/kakao/login?code=${CODE}</code>를 axios를 이용해서 get으로 처리했다.
(axios과정에서 두번호출되고 400에러 500에러 등등 문제가 많았었다. 내가 프런트엔드는 잘 몰라서..)</p>
<p>이때 django 서버를 확인하면 GET요청이 보내졌을것이다.
장고 views에서 GET요청에 포함되어있는 인가코드를 다음과 같이 분리 저장해야한다.
<img src="blob:https://velog.io/9648751f-c659-4699-854b-8e07e83ac472" alt="업로드중.."></p>
<p>이렇게 해서 백엔드에 인가코드가 전달/저장 되었다!</p>
<p>이 과정이 자세히 나와있는 문서가 별로 없어서 더 헤멨던것 같다.</p>
<h2 id="2단계-토큰-받기">2단계 토큰 받기</h2>
<p>백엔드에 인가코드가 있으니 남은 작업은 한결 쉬울것이다.
<code>https://kauth.kakao.com/oauth/token?grant_type=authorization_code&amp;client_id={KAKAO_REST_API_KEY}&amp;redirect_uri={KAKAO_REDIRECT_URI}&amp;code={CODE}</code>
CODE는 인가코드, KAKAO_REST_API_KEY는 미리 앱에서 받아놓았던 위의 REST_API_KEY와 같은 값이다. 
KAKAO_REDIRECT_URI는 아까 설정해둔 REDIRECT_URL과 <code>같은!!</code> urldl여야한다!!(중요!! 여기서 많이 헤멨다.)
KOE303 에러의 원인이기도 하다.</p>
<p>설명에서는 인가코드를 요청할때 url과 같은 url을 쓰라는데 
아까 인가코드 요청코드는
KAKAO_AUTH_URL = <code>https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&amp;redirect_uri=${REDIRECT_URI}&amp;response_type=code</code>이고
여기서 REDIRECT_URL은 <a href="http://localhost:3000/InfoCollect%EC%9D%B4%EB%8B%88">http://localhost:3000/InfoCollect이니</a>,
KAKAO_REDIRECT_URI도 <a href="http://localhost:3000/InfoCollect%EB%A1%9C">http://localhost:3000/InfoCollect로</a> 설정해야한다.</p>
<p>여기까지하면 카카오로그인 버튼 누르고 카카오 로그인후 토큰까지 받을 수 있다.</p>
<p>이후 과정은 나중에 이어서..</p>
<p>[참고자료]
<a href="https://data-jj.tistory.com/53">https://data-jj.tistory.com/53</a>
<a href="https://velog.io/@isabel_noh/React-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-REST-API">https://velog.io/@isabel_noh/React-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-REST-API</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[IntelliJ] 프로젝트 생성후 할 일 + Lombok]]></title>
            <link>https://velog.io/@kyliecamila_/IntelliJ-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%ED%9B%84-%ED%95%A0-%EC%9D%BC-Lombok</link>
            <guid>https://velog.io/@kyliecamila_/IntelliJ-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%ED%9B%84-%ED%95%A0-%EC%9D%BC-Lombok</guid>
            <pubDate>Mon, 01 Aug 2022 06:48:19 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>Build and run using이랑 Run test using부분을 IntelliJ IDEA로 바꾸기 --&gt; Gradle로 해놓는 것보다 빠르다.
<img src="https://velog.velcdn.com/images/kyliecamila_/post/f68962d0-906a-4d8a-af73-4963688f7291/image.png" alt=""></p>
</li>
<li><p>Lombok 사용할 것이라면 Plugins에 들어가서 marketplace에서 lombok검색 (설치가 이미 되어있으면 안뜰것이다)
<img src="https://velog.velcdn.com/images/kyliecamila_/post/e648af75-3604-4967-bc7e-698ffbd9a177/image.png" alt="">
이후 IntelliJ껐다가 다시 킨 후 Installed에 lombok 있는지 확인
<img src="https://velog.velcdn.com/images/kyliecamila_/post/619bab56-5fe2-490e-ace9-0bbf9f5a0046/image.png" alt=""></p>
</li>
<li><p>Lombok작동하게 하려면 Annotation Processors에 들어가서 <code>Enable annotation processing</code> 체크 표시 해주어야한다.
<img src="https://velog.velcdn.com/images/kyliecamila_/post/9fd1ac4c-3469-4539-8cbe-ca4e938bcfb4/image.png" alt=""></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 프로세스와 스레드]]></title>
            <link>https://velog.io/@kyliecamila_/Java-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@kyliecamila_/Java-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C</guid>
            <pubDate>Sun, 31 Jul 2022 11:42:46 GMT</pubDate>
            <description><![CDATA[<p>프로세스와 스레드가 무엇인지 공부한 것을 정리해보려고 한다.</p>
<p>프로세스 안에 스레드가 있다라고 느꼈는데 포함관계는 아니고 프로세스 안에 여러개 스레드가 있다라는 관점에서 그렇게 생각했다.</p>
<h2 id="프로세스">프로세스</h2>
<p>예를 들어서 동영상재생 앱이 작동할때를 생각해보자. 
이때 앱을 하나 열었으니 프로세스는 하나 실행된다. 
만약 같은 앱의 창을 여러개 띄우면 프로세스가 2개 이상, 즉 멀티프로세스라고 할 수 있다. </p>
<h2 id="스레드">스레드</h2>
<p>프로세스를 앱의 단위, 큰 통이라고 생각할 수 있는 반면 스레드는 그 통안에 존재하는 구성품같다는 생각을 했다.</p>
<p>아까 예로든 동영상 재생 앱으로 돌아가보자. 
해당 앱의 기능에는 영상을 보여주는 기능과 함꼐 소리를 들려주는 기능이 있다.
즉 기능이 2개가 있는 것이다.(추가 기능이 있다면 기능은 더 늘어나겠지)
이 기능을 실행시킨다는 말을 다르게 하면 작업을 실행시킨다 라고 할 수 있다.</p>
<p>스레드가 1개라면 한가지 작업이 진행되고 있다는 것이고 스레드가 2개이상, 즉 멀티스레드라면 여러 작업이 실행되고 있다는 뜻이다. 
이때 비록 멀티스레드 일지라도 프로세스는 1개이다. 이는 싱글스레드 일때도 마찬가지이다.</p>
<p>즉, 한 프로세스(통)안에 한개 혹은 그이상의 스레드(구성품)이 있다고 할 수 있다. </p>
<h2 id="멀티프로세스">멀티프로세스</h2>
<p>스레드는 싱글스레드가 있고 멀티스레드가 있는데 프로세스는 어떨까?
프로세스도 마찬가지이다. 아까 앱을 하나 열면 프로세스 하나가 실행된다고 했다. 그렇다면 여러개의 앱을 열면? 바로 멀티프로세스인것이다. </p>
<p>예로 동영상앱과 게임앱을 동시에 켜놓았다고 해보자. 동영상앱에는 스레드가 2개가 있고 게임앱은 스레드가 8개라고 해보자. 
이는 두개의 프로세스(멀티프로세스) 그리고 각각 2개, 8개의 스레드가 실행되고 있는 상태이다. 
두개의 큰 박스가 있고 한 박스에는 실(스레드)가 2개 나머지 박스에는 실이 8개 들어있다고 생각하면 될 것 같다.</p>
<p>*운영체제의 자원은 한정되있다. 따라서 프로세스가 많아지면 한 프로세스당 할당받을 수 있는 양은 자연히 줄 것이다.</p>
<h3 id="그렇다면-프로세스와-스레드의-다른-차이는">그렇다면 프로세스와 스레드의 다른 차이는</h3>
<p>이번에는 독립성 오류관점에서 생각해보자.</p>
<p>운영체제라는 것이 있는데 사용자가 앱을 실행하면 프로세스는 운영체제로부터 앱 실행에 필요한 자원인 메모리를 할당받는다. 
프로세스는 할당받은 메모리를 프로세스에 포함된 스레드들을 실행시키는데 사용된다. 여기서 스레드 실행은 코드를 수행시킨다는 것을 뜻한다.</p>
<p>멀티프로세스에서 각각의 프로세스는 운영체제에서 할당받은 메모리를 가지고 실행하기에 프로세스끼리는 독립적이다. 
즉 하나의 프로세스가 잘못되어도 다른 프로세스에는 영향을 주지 않는다. 
이미 할당 받은 자원을 각자 알아서 사용하는 것이기에 서로 독립적이다. 
그리고 이러한 프로세스들은 병렬적으로 실행된다. 여러앱을 동시에 쓸 수 있다는 말이다.</p>
<p>(참고로 위처럼 멀티프로세스를 실행하는 것도 멀티태스킹이라고 하지만, 한 프로세스 내에서 멀티스레드를 실행시키는 것도 멀티태스킹이라 한다.)</p>
<p>그렇다면 스레드는 어떨까. 멀티스레드는 한 프로세스에 속해 있다. 
같은 자원을 그떄그때 필요에 따라 공유해서 쓰는 것이다. 
스레드는 프로세스 내부에서 생성되는 것이기 떄문에 한 스레드에 문제가 생기면 다른 스레드도 종료가 될 수 있다. 
왜냐하면 한 프로세스에 문제가 생기면 프로세스 자체가 종료될 수 있는데 그러면 실행되고 있는 모든 스레드가 함꼐 종료되기 때문이다.</p>
<p>위의 예를 대입하자면 동영상앱이 문제가 있어도 게임앱은 이와 관계없이 잘 작동한다.(프로세스끼리는 독립적이다.)
하지만 동영상은 재생은 되고 소리는 안나오는 경우 결국 동영상앱은 작동하지 않는다.(스레드끼리는 영향이 있다. 또한 스레드가 문제가 있으면 프로세스도 종료될 수 있다.)</p>
<p>즉, 프로세스끼리는 독립적이지만 스레드끼리는 서로 영향이 있다.(물론 같은 프로세스의 스레드라는 가정하에)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] react-scripts: command not found 에러]]></title>
            <link>https://velog.io/@kyliecamila_/React-react-scripts-command-not-found-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@kyliecamila_/React-react-scripts-command-not-found-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Fri, 29 Jul 2022 06:32:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kyliecamila_/post/0b9a9b55-0561-4fe7-a8a8-6b145743373d/image.png" alt=""></p>
<p><a href="https://velog.io/@soyoungdl/sh-react-scripts-command-not-found-%EB%A6%AC%EC%95%A1%ED%8A%B8">https://velog.io/@soyoungdl/sh-react-scripts-command-not-found-%EB%A6%AC%EC%95%A1%ED%8A%B8</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[환경설정] homebrew python version변경]]></title>
            <link>https://velog.io/@kyliecamila_/homebrew-python-version%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@kyliecamila_/homebrew-python-version%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Thu, 28 Jul 2022 06:58:51 GMT</pubDate>
            <description><![CDATA[<p><code>which python3</code>로 파이썬 경로를 알아내고
--&gt;<code>/opt/homebrew/bin/python3</code>
이 경로는 내가 ~/.zshrc에 <code>export PATH=&quot;/opt/homebrew/bin:$PATH:&quot;</code>를 적어서 경로가 이런것이다.</p>
<p><code>ls -l &lt;찾은 경로 python 전까지&gt;/python*</code>
<code>ls -l /opt/homebrew/bin/python*</code>
에서 원하는 버전이 있는지 확인후</p>
<p><code>ln -s -f /opt/homebrew/bin/python&lt;원하는버전&gt; /opt/homebrew/bin/python</code>
e.g) <code>ln -s -f /opt/homebrew/bin/python3.10 /opt/homebrew/bin/python</code></p>
<p>터미널 껐다가 켜고 <code>python --version</code></p>
<p>바뀌지 않았으면</p>
<p><code>brew unlink python@&lt;끊고싶은버전&gt;</code>
e.g) <code>brew unlink python@3.8</code>
<code>brew link --force python@&lt;연결하고싶은버전&gt;</code>
e.g) <code>brew link --force python@3.10</code></p>
<p>여기까지만 해도 되지만 이후에 which python3를 했을때 경로가 약간 달라질 것이기에 다시 복구하기 위해</p>
<p><code>vi ~/.zshrc</code> 또는 <code>code ~/.zshrc</code>
후자로 하면 vscode에서 열린다
거기서 /opt/homebrew/bin/python3외에 
/opt/homebrew/bin/python&lt;원하는버전&gt;인것이 있을것이다. 그거 삭제.</p>
<p><code>vi ~/.zshrc</code>로 열었다면 새로 삽입하기위해 <code>i</code>를 누르고 원하는 곳에 변화를 준후 <code>esc</code>를 누른후 <code>:wq</code>(저장후 나가기)</p>
<p>변경사항을 반영하기 위해서
<code>source ~/.zshrc</code>
저장하고 다시 <code>which python3</code>해보면 원래 경로가 나올 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[환경설정] python version 변경]]></title>
            <link>https://velog.io/@kyliecamila_/%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95-python-version-%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@kyliecamila_/%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95-python-version-%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Tue, 26 Jul 2022 10:42:36 GMT</pubDate>
            <description><![CDATA[<p><a href="https://minnit-develop.tistory.com/15">https://minnit-develop.tistory.com/15</a></p>
<p><a href="https://clolee.tistory.com/3">https://clolee.tistory.com/3</a></p>
<p>터미널 껐다가 다시 킨 후
파이썬 버전 확인</p>
<blockquote>
<p>python --version</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] push 방법]]></title>
            <link>https://velog.io/@kyliecamila_/git-push-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@kyliecamila_/git-push-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 26 Jul 2022 10:17:36 GMT</pubDate>
            <description><![CDATA[<p><code>git init</code>  *최초 1회만
<code>git  add .</code>(파일 상단에서) or <code>git add &lt;추가할 파일&gt;</code>
<code>git commit -m &quot;&lt;커밋 메세지&gt;&quot;</code>
<code>git remote add &lt;저장소 별칭&gt; &lt;저장소 주소&gt;</code> *한 이름(e.g)origin)별로 1번만 연결하면 된다
e.g) git remote add origin <a href="https://github">https://github</a>~
<code>git push &lt;저장소 별칭&gt; &lt;브랜치 이름&gt;</code>
e.g) git push origin main
&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp    git push origin kyliecamila</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS/TS] static, class, instance]]></title>
            <link>https://velog.io/@kyliecamila_/JSTS-static-class-instance</link>
            <guid>https://velog.io/@kyliecamila_/JSTS-static-class-instance</guid>
            <pubDate>Tue, 26 Jul 2022 10:16:22 GMT</pubDate>
            <description><![CDATA[<p>class의 메소드나 프로퍼티에 static을 붙였을 때 class와 instance에서의 접근방법에 대해서 정리해보자</p>
<h3 id="static이란">static이란</h3>
<p>static 키워드를 붙이면 class내의 메소드나 프로퍼티가
정적 메소드 / 정적 프로퍼티로 바뀌게 된다. (그렇게 정의 하게 되는 것이다)</p>
<h3 id="예시">예시</h3>
<pre><code class="language-typescript">class ClassWithStaticMethod {
  static staticProperty = &#39;someValue&#39;;
  static staticMethod() {
    return &#39;static method has been called.&#39;;
  }
  static {
    console.log(&#39;Class static initialization block called&#39;);
  }
}

console.log(ClassWithStaticMethod.staticProperty);
// output: &quot;someValue&quot;
console.log(ClassWithStaticMethod.staticMethod());
// output: &quot;static method has been called.&quot;
</code></pre>
<p>정적 메서드와 정적 프로퍼티는 클래스에 종속적이다.
클래스(붕어빵틀)에서 인스턴스(붕어빵)를 생성할 수 있는데
보통 클래스의 메서드와 프로퍼티는 특정 인스턴스와 연결되어있다.</p>
<p>하지만 정적 메서드와 정적 프로퍼티는 클래스와 연결되어있다. 
그래서 <code>정적 메소드/프로퍼티</code>는 <code>클래스이름.메소드/프로퍼티</code> 형식으로 사용해야하고 <code>일반 메소드/프로퍼티</code>는 인스턴스 생성후 <code>인스턴스이름.메소드/프로퍼티</code> 형식으로 사용해야한다.</p>
<blockquote>
<p>형식
정적 메소드/프로퍼티 : <code>클래스이름.메소드/프로퍼티</code> 
일반 메소드/프로퍼티 : <code>인스턴스이름.메소드/프로퍼티</code></p>
</blockquote>
<h3 id="예시-1">예시</h3>
<p><img src="https://images.velog.io/images/kyliecamila/post/89750e44-522e-427d-8ff9-c25d2dae110c/image.png" alt=""></p>
<pre><code class="language-typescript">//_instructor와 _numbers는 private로 설정해 두어서 
//외부에서 접근이 불가하다.

//클래스이름.정적메소드();          가능
const firstInstructor = Instructor.getInstance();
const secondInstructor = Instructor.getInstance();

//인스턴스.비정적메소드();          가능
firstInstructor.addNumber(1);  
secondInstructor.show();       

//Instructor.addNumber(3);        불가
//Instructor.show();              불가
//firstInstructor.getInstance();  불가</code></pre>
<pre><code class="language-typescript">class Instructor {
    private static _instructor :Instructor;
    private _numbers: number[];

    private constructor(numbers:number[]){
        this._numbers = numbers;
    }
    public static getInstance(): Instructor{
        if(this._instructor==null){
            this._instructor = new Instructor([]);
        }
        return this._instructor;
    }
    public addNumber(number:number){
        this._numbers.push(number);
    }
    public show(): void{
        for(const candidate of this._numbers){
            console.log(candidate);
        }
    }
}

const firstInstructor = Instructor.getInstance();
const secondInstructor = Instructor.getInstance();
firstInstructor.addNumber(1);
secondInstructor.show();

//Instructor.addNumber(3);       불가
//Instructor.show();             불가
//firstInstructor.getInstance(); 불가</code></pre>
<h3 id="정적-메소드프로퍼티-호출">정적 메소드/프로퍼티 호출</h3>
<h3 id="this-vs-class이름">this vs class이름</h3>
<blockquote>
<ol>
<li>동일한 클래스 내의 <code>정적 메소드에서 정적메소드</code>를 호출한 경우
=&gt; <code>this</code></li>
</ol>
</blockquote>
<h4 id="예시-2">예시</h4>
<pre><code class="language-javascript">class StaticMethodCall {
  static staticMethod() {
    return &#39;Static method has been called&#39;;
  }
  static anotherStaticMethod() {
    return this.staticMethod() + &#39; from another static method&#39;;
  }
}
StaticMethodCall.staticMethod();
// &#39;Static method has been called&#39;

StaticMethodCall.anotherStaticMethod();
// &#39;Static method has been called from another static method&#39;</code></pre>
<blockquote>
<ol start="2">
<li>동일한 클래스 내의 constructor를 비롯한 <code>비정적 메소드에서 정적메소드</code>를 호출한 경우
=&gt; <code>class이름</code></li>
</ol>
</blockquote>
<h4 id="예시-3">예시</h4>
<pre><code class="language-javascript">class StaticMethodCall {
  constructor() {
    console.log(StaticMethodCall.staticMethod());
    // &#39;static method has been called.&#39;

    console.log(this.constructor.staticMethod());
    // &#39;static method has been called.&#39;
  }

  static staticMethod() {
    return &#39;static method has been called.&#39;;
  }
}</code></pre>
<blockquote>
<ol start="3">
<li>보통의 경우인 <code>비정적 메소드에서 비정적 메소드</code>를 호출한 경우
=&gt; <code>this</code></li>
</ol>
</blockquote>
<h4 id="종합-예시">종합 예시</h4>
<pre><code class="language-javascript">class Bird{
        static readonly _wingNumber : number=2;
        private _species :String;
//비정적에서 비정적 호출
        constructor(species:String){
                this._species = species;
        }
//비정적에서 비정적 호출
        species():String {
                return this._species;
        }
//비정적에서 정적 호출
        wingNumber(): number{
                return Bird._wingNumber;
        }
//정적에서 정적 호출
        static showWingNumber(): number{
                  return this._wingNumber;
        }
}</code></pre>
<h3 id="주의">주의</h3>
<h3 id="정적에서-비정적-호출">정적에서 비정적 호출</h3>
<p>정적 메서드와 정적 프로퍼티는 인스턴스와는 연결되어 있지 않기에 인스턴스를 만들때 사용되는 클래스의 데이터를 가져오지 못한다.</p>
<h4 id="예시-4">예시</h4>
<pre><code class="language-javascript">// 클래스 데이터 접근 예제
class Person {
  constructor() {
    this._name = &quot;내이름은&quot;;
  }

  static get name(){
    return this._name
  }

}

// 1. 정적 메서드를 이용해 클래스 데이터 가져오기 - 실패
console.log(Person.name)  // undefined

// 2. 클래스 인스턴스를 선언해 클래스 데이터 가져오기 - 실패
const person = new Person();
console.log(person.name)  // undefined</code></pre>
<p><code>참고자료</code>
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/static">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/static</a></p>
<p><a href="https://velog.io/@hchayan/1.-JS-static-%ED%82%A4%EC%9B%8C%EB%93%9C">https://velog.io/@hchayan/1.-JS-static-%ED%82%A4%EC%9B%8C%EB%93%9C</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] 특정 git branch clone하는 법 + github token authentication]]></title>
            <link>https://velog.io/@kyliecamila_/git-%ED%8A%B9%EC%A0%95-git-branch-clone%ED%95%98%EB%8A%94-%EB%B2%95-github-token-authentication</link>
            <guid>https://velog.io/@kyliecamila_/git-%ED%8A%B9%EC%A0%95-git-branch-clone%ED%95%98%EB%8A%94-%EB%B2%95-github-token-authentication</guid>
            <pubDate>Tue, 26 Jul 2022 10:14:37 GMT</pubDate>
            <description><![CDATA[<p><code>특정 branch를 clone</code>하는 법과 <code>github token authenticatioin</code>에 대해 정리해보자
<br></p>
<h3 id="방법">방법</h3>
<blockquote>
<p>$ git clone -b &lt;branch명&gt; &lt;remote_repo 주소&gt;</p>
</blockquote>
<p>branch명은 clone하고자 하는 branch이름</p>
<p>여기서는 feature/responsive</p>
<p>여기서 remote-repo주소란 </p>
<p>초록색 Code 버튼 눌렀을때 나오는 주소
<img src="https://images.velog.io/images/kyliecamila/post/4de979e2-53ba-4262-8bfd-d03ed2e5ac69/%EA%B7%B8%EB%A6%BC1.png" alt=""></p>
<p>﻿또 참고로 git clone할때 인증방법이 바뀌여서 authentication token을 만들어서 사용해야한다.</p>
<h3 id="github-token-authentication">github token authentication</h3>
<p><img src="https://images.velog.io/images/kyliecamila/post/4645b4d3-e8ca-428d-b527-56149de0a669/image.png" alt=""></p>
<h4 id="personal-access-token-생성방법">personal access token 생성방법</h4>
<p><img src="https://images.velog.io/images/kyliecamila/post/2c9215ca-3c88-411c-afe7-4edd406dd2da/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/kyliecamila/post/bc79adef-47ec-4774-9838-90a627c51e71/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/kyliecamila/post/c4581758-6985-4111-8a16-ea95f2d623de/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/kyliecamila/post/6405605c-4443-4704-b406-8ba6dd230c54/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/kyliecamila/post/beb067dc-cea9-4fc8-a2be-cf577f521cc8/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/kyliecamila/post/0337d24d-7c9b-4c9a-9e57-170fa0749128/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/kyliecamila/post/5fe23b2c-a3db-4b1d-9519-f9edbfebb5dc/image.png" alt=""></p>
<p>앞으로는 github에서 push 등의 작업을 수행할 떄, 
PW를 입력하라고 뜨면 Personal Access Token을 복사해서 넣으면 된다.</p>
<p><br><br></p>
<p><code>참고자료</code>
<a href="https://curryyou.tistory.com/344">https://curryyou.tistory.com/344</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C] atoi 사용법]]></title>
            <link>https://velog.io/@kyliecamila_/C-atoi-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@kyliecamila_/C-atoi-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Tue, 26 Jul 2022 10:12:10 GMT</pubDate>
            <description><![CDATA[<p>C에서 atoi 함수를 쓰던 와중 의문이 생겼다.
atoi(2019.txt)를 했더니 2019가 반환된 것이다.
왜 그런지 알아보자.</p>
<h3 id="atoi-함수란">atoi 함수란</h3>
<p>atoi 함수는 기본적으로 char to int, 문자열을 정수타입으로 바꾸는 함수이다.
#include &lt;stdlib.h&gt;를 해야 사용할 수 있다.</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main(){
int num = 0;
char myString[20] = &quot;2019&quot;;

printf(&quot;string = %s\n&quot;,myString);
//2019 출력
num = atoi(myString);
printf(&quot;int = %d\n&quot;,num);
//2019 출력

char str1[]=&quot;testing&quot;;
char str2[]=&quot;2019&quot;;
char str3[]=&quot;2021testing&quot;;
char str4[]=&quot;testing2022&quot;;

printf(&quot;int = %d\n&quot;,atoi(str1));
//0
printf(&quot;int = %d\n&quot;,atoi(str2));
//2019
printf(&quot;int = %d\n&quot;,atoi(str3));
//2021
printf(&quot;int = %d\n&quot;,atoi(str4));
//0
}</code></pre>
<p>atoi(&quot;문자&quot;) -&gt; 문자가 맨처음 나와서 0 리턴
atoi(&quot;숫자&quot;) -&gt; 숫자 반환
atoi(&quot;숫자 + 문자&quot;) -&gt; 문자나오기 전까지 숫자 반환
atoi(&quot;문자 + 숫자&quot;) -&gt; 문자가 바로 나와서 0리턴</p>
<p>즉 atoi 함수는 매개변수로 들어온 문자열을 앞에서 부터 읽어서 숫자가 아닌 문자가 올떄까지 읽고 숫자로 변환해주는 함수이다.</p>
<p><br><br>
<code>참고자료</code>
<a href="https://blockdmask.tistory.com/331">https://blockdmask.tistory.com/331</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C] realloc 에러]]></title>
            <link>https://velog.io/@kyliecamila_/C-realloc-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@kyliecamila_/C-realloc-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Tue, 26 Jul 2022 10:11:27 GMT</pubDate>
            <description><![CDATA[<p>C로 자료구조 문제를 풀다가 생긴 에러가 있다.
realloc을 사용했을 때 나타난 문제다.</p>
<p>warning: ignoring return value of ‘realloc’, declared with attribute warn_unused_resul</p>
<p><img src="https://images.velog.io/images/kyliecamila/post/83679465-097f-409a-9d05-a2b959174048/image.png" alt=""></p>
<p>realloc을 하면 기존보다 더 많은 메모리를 할당받을 때 주소가 바뀌는 경우가 있어서 그 주소값을 다른 곳에 저장하고 다시 사용해야한다고 한다.</p>
<p><a href="https://www.codestudyblog.com/questions/sf/0421201641.html">https://www.codestudyblog.com/questions/sf/0421201641.html</a></p>
<p>그래서 storeHere = realloc(str,memorySize);
이런식으로 정의하면 에러가 나지 않는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[linux] 파일비교 + 메모리 누수 확인 방법]]></title>
            <link>https://velog.io/@kyliecamila_/linux-%ED%8C%8C%EC%9D%BC%EB%B9%84%EA%B5%90-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%ED%99%95%EC%9D%B8-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@kyliecamila_/linux-%ED%8C%8C%EC%9D%BC%EB%B9%84%EA%B5%90-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%ED%99%95%EC%9D%B8-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 26 Jul 2022 10:10:33 GMT</pubDate>
            <description><![CDATA[<p><code>diff -s &lt;파일1&gt; &lt;파일2&gt;</code>
파일1과 파일2가 같은지 여부를 알려준다.</p>
<p><code>diff -c &lt;파일1&gt; &lt;파일2&gt;</code>
파일1과 파일2에서 다른 줄이 있으면 출력한다.</p>
<p><code>diff3 &lt;파일1&gt; &lt;파일2&gt; &lt;파일3&gt;</code>
파일 3개를 비교한다.</p>
<p><code>valgrind ./a.out</code>
메모리 누수가 있는지 알려준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[iterm git branch 보이게하기]]></title>
            <link>https://velog.io/@kyliecamila_/iterm-git-branch-%EB%B3%B4%EC%9D%B4%EA%B2%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@kyliecamila_/iterm-git-branch-%EB%B3%B4%EC%9D%B4%EA%B2%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 26 Jul 2022 10:00:57 GMT</pubDate>
            <description><![CDATA[<p><a href="https://dev.to/ahmettkartal/display-current-git-branch-on-iterm2-3ko8">https://dev.to/ahmettkartal/display-current-git-branch-on-iterm2-3ko8</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[pip install psycopg2-binary 조건]]></title>
            <link>https://velog.io/@kyliecamila_/pip-install-psycopg2-binary-%EC%A1%B0%EA%B1%B4</link>
            <guid>https://velog.io/@kyliecamila_/pip-install-psycopg2-binary-%EC%A1%B0%EA%B1%B4</guid>
            <pubDate>Tue, 26 Jul 2022 09:58:23 GMT</pubDate>
            <description><![CDATA[<p>맥 M1에서 (homebrew가 깔려있다는 전제하에)
pip install psycopg2-binary 깔기 위해서는</p>
<ol>
<li>python version 3.9이상</li>
<li>pip version 20.1.1 버전</li>
<li>brew install postgresql</li>
</ol>
<p>다 한후에 시도해보면 될 거다</p>
]]></description>
        </item>
    </channel>
</rss>