<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>code_sign.log</title>
        <link>https://velog.io/</link>
        <description>방탈출 좋아하는 코딩덕후</description>
        <lastBuildDate>Sat, 12 Jun 2021 10:38:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>code_sign.log</title>
            <url>https://images.velog.io/images/code_sign/profile/c54bc08e-5c5c-4a70-8409-550c27888bc6/스크린샷 2020-12-29 오후 10.38.22.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. code_sign.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/code_sign" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[ToyProject] 압축 파일을 받아 리스트, 편집기능!
]]></title>
            <link>https://velog.io/@code_sign/ToyProject-%EC%95%95%EC%B6%95-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EB%B0%9B%EC%95%84-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%ED%8E%B8%EC%A7%91%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@code_sign/ToyProject-%EC%95%95%EC%B6%95-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EB%B0%9B%EC%95%84-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%ED%8E%B8%EC%A7%91%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Sat, 12 Jun 2021 10:38:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/a48fd572-055e-4103-bd66-fb02f2454c42/ToyProject.001.jpeg" alt=""></p>
<p>저번에 이은 다른 기능을 소개하려고 한다.</p>
<p>바로 zip, tar 확장자를 가진 파일을 받아 업로드 시키고,
그것을 리스트로 만들어서 텍스트 파일 형태라면 편집까지 가능한 구조이다.</p>
<p><code>Frontend</code>부분을 먼저 보면서 flow대로 설명을 하도록 하겠다.</p>
<h2 id="🚀-frontend---페이지만들기">🚀 FrontEnd - 페이지만들기</h2>
<p><img src="https://images.velog.io/images/code_sign/post/f7c24e40-8707-4dba-a2bb-10934431a1b3/%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-06-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.21.29.png" alt="">
<img src="https://images.velog.io/images/code_sign/post/cd56690b-2015-4bc6-a326-2560217e1f70/image.png" alt=""></p>
<h3 id="state-설명">State 설명</h3>
<ul>
<li><strong>uploadFile</strong>: 업로드 할 파일을 선택했을 때 저장된다.</li>
<li><strong>fileList</strong>: 업로드가 완료되면 해당 압축 파일을 풀어 리스트 형태로 파일 리스트를 저장하게 된다.</li>
<li><strong>selectFile</strong>: 편집할 파일을 선택했을때 해당 파일의 경로가 저장되게 되는데 특이한건 해당 index로 저장되어 fileList를 통해 찾을 수 있다.</li>
<li><strong>contents</strong>: 편집할 파일의 내용이 담기게 된다.</li>
</ul>
<h3 id="upload">upload</h3>
<p>업로드 파일을 선택하는 <code>&lt;input&gt;</code>을 만들고 <code>onChange</code>가 일어나게 되면 <code>uploadFile</code>을 업데이트 해준다.</p>
<p>업로드 버튼을 눌렀을때 <code>uploadFile</code>이 비어있다면 에러핸들링을 통해 에러를 일으키고 정상적으로 업로드가 된다면 압축을 푸는 과정을 거친다. 여기서는 <strong>백엔드에서 압축을 풀어 파일을 저장시키는 시스템과 프론트엔드에서 압축을 풀어 해당 리스트를 얻어보는 방법을 채택하였다.</strong></p>
<p>31번째 줄부터 시작하는 코드가 해당 코드이며, JSZIP 라이브러리를 이용하여 경로와 dir(해당 파일이 폴더인지 아닌지) 값을 얻을 수 있다. 얻은 값은 <code>FileList</code>에 저장된다.</p>
<h3 id="file-edit">file edit</h3>
<p><code>fileList</code>를 얻었다면 해당 내용은 <code>render()</code>의 부분(106번째 줄) <code>&lt;li&gt;</code>태그를 만들어서 나타내준다.</p>
<p>해당 태그를 클릭했을때 폴더라면 에러처리를 반환하고, 아니라면 해당 내용을 <code>axios</code>를 통해 불러와 <code>&lt;textarea&gt;</code>로 불러와 편집이 가능하게 한다.</p>
<h2 id="🚀-backend">🚀 BackEnd</h2>
<p>해당 파일들은 따로 DB에 저장하지 않고 사용이 된다.
그래서 upload를 처리하는 js만 만들어 구현했다.</p>
<h3 id="uploadjs">upload.js</h3>
<p><img src="https://images.velog.io/images/code_sign/post/d5929d32-c23b-45c1-b918-2435b7247249/image.png" alt=""></p>
<p><code>multer</code>를 사용해서 파일 업로드를 해주었다.
해당 경로는 <code>src/files/</code>에 저장을 해두었고, 파일의 이름 또한 <code>&lt;해당 유저 id&gt;_&lt;원래 이름&gt;</code>으로 설정하여 저장했다.</p>
<h3 id="api">API</h3>
<p><img src="https://images.velog.io/images/code_sign/post/27b9b80d-49b1-4cc0-abe2-7dc93d6eb79b/image.png" alt=""></p>
<p>API는 총 3개로 나뉜다.</p>
<ol>
<li>업로드 될 때 실행되는 POST</li>
<li>파일의 내용을 얻어오는 GET</li>
<li>파일의 내용을 변경한는 POST</li>
</ol>
<h4 id="업로드-될-때-실행되는-post">업로드 될 때 실행되는 POST</h4>
<p>우리가 만들어둔 <code>upload.js</code>를 <code>require</code>을 해와서 사용한다. 압축 파일 자체를 저장시켜 준 뒤, 압축을 푸는 <code>amd-zip</code>을 이용하여 압축도 풀어준다.</p>
<p>해당 api가 잘 작동 되면 front에서는 파일 압축을 풀어 <code>fileList</code>에 저장하는 과정이랑 연결된다.</p>
<h4 id="파일의-내용을-얻어오는-get">파일의 내용을 얻어오는 GET</h4>
<p>절대 경로로 찾아올 파일의 경로를 설정해준뒤 <code>fs</code>의 속성을 이용하여 가져와서 <code>contents</code>를 반환하게 된다.</p>
<h4 id="파일의-내용을-변경한는-post">파일의 내용을 변경한는 POST</h4>
<p>GET과 마찬가지로 fs를 이용하여 변경해주는 간단한 API를 실행해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ToyProject] 실시간 채팅과 귓속말까지! (feat. socket.io)]]></title>
            <link>https://velog.io/@code_sign/ToyProject-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%B1%84%ED%8C%85%EA%B3%BC-%EA%B7%93%EC%86%8D%EB%A7%90%EA%B9%8C%EC%A7%80-feat.-socket.io</link>
            <guid>https://velog.io/@code_sign/ToyProject-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%B1%84%ED%8C%85%EA%B3%BC-%EA%B7%93%EC%86%8D%EB%A7%90%EA%B9%8C%EC%A7%80-feat.-socket.io</guid>
            <pubDate>Mon, 07 Jun 2021 08:56:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/c80c17bb-13e4-4535-b330-30e6b0d4c5d6/ToyProject.001.jpeg" alt=""></p>
<p>이번 프로젝트에서는 2가지의 기능을 핵심으로 설정을 했다.</p>
<ol>
<li>실시간 채팅(+ 귓속말)</li>
<li>압축된 파일 풀어 리스트 만들기(+ 편집)</li>
</ol>
<p>우선은 실시간 채팅에 대해서 자세히 블로깅을 시작하겠다!</p>
<h2 id="🚀-socketio-설정하기">🚀 socket.io 설정하기</h2>
<p><code>node</code>의 <code>express</code>를 기본으로 사용을 하였다.
<code>app.js</code>에서 등록을 하여 설정을 해주어야 하는데, 나는 이것을 따로 <code>socket.js</code>파일로 빼내어 정리를 한다음 <code>app.js</code>에서 다시 _require_해주었다.</p>
<h3 id="socketjs-생성">socket.js 생성</h3>
<p><img src="https://images.velog.io/images/code_sign/post/f305402b-f512-47eb-b49c-c16dab88c445/image.png" alt=""></p>
<p><code>module.exports</code>를 통해 외부에서 <code>require</code>로 리턴 할 수 있게 해주었다.
<code>socket</code>의 연결은 <code>connection</code>으로 연결을 해주었고, 연결이 됐을때(<code>connection</code>)와 연결이 해제되었을때(<code>disconnect</code>) 구분해줄 <code>ip</code>를 선언하고 이용하였다.</p>
<pre><code class="language-bash">새로운 접속 ::ffff:172.17.0.1 zRomb4oZ26jTwQd5AAAB
클라이언트 접속 해제 ::ffff:172.17.0.1 zRomb4oZ26jTwQd5AAAB</code></pre>
<p>나머지 기능은 채팅의 BackEnd에서 자세히 설명</p>
<h3 id="appjs에-등록연결">app.js에 등록/연결</h3>
<p><img src="https://images.velog.io/images/code_sign/post/bfd1cb63-01c8-457d-b103-091300b98817/image.png" alt=""></p>
<p>회색 부분은 나머지 설정이라 볼 필요는 없다.</p>
<p><code>const main</code>을 보면 <code>redis</code>로 선언된 <code>server</code>를 우리가 설정한 <code>socket.js</code>에서 불러와 연결을 해주었다.</p>
<p>이럼으로 서버에서는 <code>socket</code>을 통해 이용할 수 있게 되었다.</p>
<h2 id="🚀-db-스키마-설정">🚀 DB 스키마 설정</h2>
<p><code>mongodb</code>는 <code>noSQL</code>이지만, 그래도 스키마 형태로 가공해주는 것이 편리하기 떄문에 스키마 설정을 해주었다. (<code>mongoose</code> 사용)</p>
<h3 id="필요한-필드-정리">필요한 필드 정리</h3>
<p>채팅에서 공통적으로 필요한 것들은 다음과 같다.
<span style='background-color: #FBF3DB'>보낸 사람, 메세지 내용, 메세지 날짜</span>(날짜는 db에서 필수적이다.)
그리고 귓속말 기능에서는 추가적으로 <span style='background-color: #FBF3DB'>받는 사람</span>이 필요하기에 이것을 구분해줄 <span style='background-color: #FBF3DB'>타입</span>(귓속말인지 아닌지)으로 나누어 구축을 해주었다.</p>
<h3 id="chatjs-생성">chat.js 생성</h3>
<p><img src="https://images.velog.io/images/code_sign/post/4862c4d9-9dc0-4cc8-a455-29c837f4d05a/image.png" alt="">
필수적으로 필요한 것들은 <code>require</code>을 <code>true</code>로 설정했다. 그리고 <code>createAt</code>은 지금 등록된 날짜를, <code>type</code>은 기본적으로 전체 채팅을 뜻하는 <code>public</code>으로 설정하였다.</p>
<p><code>user</code>는 이미 만들어둔 것으로 <code>ref</code>를 통해 참조 할 수 있도록 했다.</p>
<h2 id="🚀-전체-채팅-구현">🚀 전체 채팅 구현</h2>
<h3 id="frontend---메인-페이지">FrontEnd - 메인 페이지</h3>
<p><img src="https://images.velog.io/images/code_sign/post/f6d5b657-c78d-4450-a6c9-c9e82363646a/image.png" alt=""></p>
<p><code>socket</code>으로 현재 <code>socket</code>을 사용할 주소를 입력하여 선언한다.</p>
<p><code>componenteDidMount()</code>에는 <code>mount</code>됐을때 실행되어야 할 것들을 선언해준다.</p>
<ul>
<li>user_id 받아오기</li>
<li>전에 있던 채팅들을 받아오기 (logs)</li>
<li><code>joinChat</code>으로 <code>socket</code>의 유저리스트에 등록을 시킨다.</li>
<li><code>getUserList</code>를 통해 새로운 유저가 들어왔을때 userList를 업데이트 해준다.</li>
<li>새로운 전체 채팅 메세지를 받으면 logs를 업데이트 해준다.</li>
</ul>
<p>보여지는 페이지는 총 3부분으로 나눌 수 있다.</p>
<h4 id="1-채팅이-보이는-채팅-보드">1. 채팅이 보이는 채팅 보드</h4>
<p><code>logs</code>를 통해 지난 메세지들을 받아오면 <code>map</code>을 통해 <code>MessageBox</code>라는 <code>Component</code>를 돌려준다.</p>
<p><img src="https://images.velog.io/images/code_sign/post/88c3e237-a726-4125-80ae-d8b5dc7ddede/image.png" alt=""></p>
<p>내가 보낸 것인지, 상대방이 보낸 것인지, 귓속말인지에 따라 <code>CSS</code>설정을 다르게 하여 잘 구분될 수 있게 하였다.</p>
<p><img src="https://images.velog.io/images/code_sign/post/07551bb8-3aff-46fb-8ce5-32f21f5a7a10/%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-06-07%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.25.25.png" alt=""></p>
<p>내가 보낸 메세지는 오른쪽 정렬로 아이디 없이 표시하였다.</p>
<p>다른 유저가 보낸 메세지들은 왼쪽 정렬을 했다.</p>
<p>청록색은 귓속말로 어떤 유저에게 보내는지 보여진다.
위에서는 codesign이 code에게 보내는 귓속말이다.</p>
<p>일반 채팅의 경우 하얀색 바탕으로 받게 된다.</p>
<h4 id="2-귓속말-상대를-선택할-수-있는-셀렉트">2. 귓속말 상대를 선택할 수 있는 셀렉트</h4>
<p><code>componentDidMount()</code>가 실행이 되면서 <code>userList</code>를 받아오게 되는데 이것이 접속해 있는 유저들의 리스트이다. 이것을 통해 귓속말 할 상대를 정할 수 있게 된다.</p>
<p>마찬가지로 <code>map</code>을 통해 리스트를 만들었고, 해당 리스트의 유저를 클릭하면 해당 유저에게 메세지를 보낼 수 있게 된다. 동시에 <code>state</code>의 <code>type</code>, <code>toUser</code>가 바뀌게 된다. 물론, 자기 자신을 선택할 수는 없다.</p>
<h4 id="3-메시지를-입력하여-내보내는-인풋창">3. 메시지를 입력하여 내보내는 인풋창</h4>
<p>기본적으로 <code>bootstrap</code>으로 디자인을 하였고, <code>onChange</code>를 통해 <code>state</code>의 <code>message</code>를 바로 변경 가능하게 하였다.</p>
<p>버튼을 누르면 해당 메세지가 귓속말인지 아닌지, 비어있는지 아닌지 등을 확인하여 백엔드와 통신하게 되고 잘 통신이 되었다면 <code>socket</code>을 통해 전체 메세지를 전달하게 되고, 해당 <code>state</code>들을 초기화해준다.</p>
<h3 id="backend">BackEnd</h3>
<h4 id="다시-보자-socketjs-">다시 보자 socket.js !!</h4>
<p><img src="https://images.velog.io/images/code_sign/post/9a4bf5c9-6522-4ea8-a238-2057f1ced582/image.png" alt=""></p>
<p>새로운 유저가 접속을 하게 되면 <code>socket.join</code>을 통해 등록을 시키고,
<code>userList</code>에 추가하게 된다. 그리고 업데이트된 <code>userList</code>를 전체 <code>socket</code>으로 보내어 받게 된다. </p>
<p>채팅은 전체 채팅과 귓속말이 나누어져 있는데, 한 <code>socket</code>의 기능에서 처리하게 하였다. 전달받은 object의 <code>toUser</code>가 있다면 귓속말이므로 해당 소켓의 아이디를 가진 사람에게만 전달하기 위해 <code>io.to(받을사람 id).emit()</code>으로 처리하였다.</p>
<p>만약 접속을 해지하게 된다면 <code>splice</code> 내부 함수를 사용하여 해당 유저를 제외하게 했다.</p>
<h3 id="api">API</h3>
<p><img src="https://images.velog.io/images/code_sign/post/151abe79-2a0c-44b0-a33e-077b263db747/image.png" alt=""></p>
<h4 id="get-init-api">[GET] /init API</h4>
<p>처음 페이지에 들어와 실행하게 되는 <code>/init</code>에서는 모든 채팅을 찾게 된다.
해당 함수인 <code>findAllChats</code>는 접속한 유저의 아이디를 통해 DB를 다음과 같은 조건으로 조회하게 된다.</p>
<ul>
<li>전체 채팅 -&gt; <code>toUser</code>가 없는 채팅들
또는</li>
<li><code>toUser</code>가 접속한 유저인 것 (귓속말 받은 상대가 해당 유저)
또는</li>
<li><code>user</code>가 접속한 유저인 것 (귓속말 보낸 사람이 해당 유저)</li>
</ul>
<p>이렇게 되면 다른 사람에게 보낸/받은 메세지들을 제외하고 조회하게 된다.</p>
<h4 id="post-message-api">[POST] /message API</h4>
<p>메세지를 보내는 기능들 담당하는 이 API는 <code>addChat</code> 함수를 실행한다.
해당 함수는 전체 채팅인지 귓속말인지를 판단 후 넘겨 받은 Object를 DB에 저장시킨다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] Vuex? 중앙데이터..관리...??]]></title>
            <link>https://velog.io/@code_sign/Vue.js-Vuex-%EC%A4%91%EC%95%99%EB%8D%B0%EC%9D%B4%ED%84%B0..%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@code_sign/Vue.js-Vuex-%EC%A4%91%EC%95%99%EB%8D%B0%EC%9D%B4%ED%84%B0..%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Sun, 28 Mar 2021 12:48:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/798ab168-a55d-48c1-aef1-da90ca601700/%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-03-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.07.19.png" alt=""></p>
<ul>
<li><p>Vuex란?</p>
<ul>
<li>무수히 많은 컴포넌트의 데이터를 관리하기 위한 상태 관리 패턴이자 라이브러리</li>
<li>React의 Flux 패턴에서 기인함</li>
<li>Vue.js 중고급 개발자로 성장하기 위한 필수 관문</li>
</ul>
</li>
<li><p>Flux ?</p>
<ul>
<li>MVC 패턴의 복잡한 데이터 흐름 문제를 해결하는 개발 패턴
<img src="https://images.velog.io/images/code_sign/post/ab1be55d-8c81-4227-9e5d-55017d920aeb/_2021-03-18__5.15.56.png" alt=""></li>
</ul>
<ol>
<li>action: 화면에서 발생하는 이벤트 또는 사용자의 입력</li>
<li>dispatcher: 데이터를 변경하는 방법, 메서드</li>
<li>model: 화면에 표시할 데이터</li>
<li>view: 사용자에게 비춰지는 화면</li>
</ol>
</li>
<li><p>MVC 패턴과 Flux 패턴</p>
<h3 id="mvc-패턴의-문제점">MVC 패턴의 문제점</h3>
<p>  <img src="https://images.velog.io/images/code_sign/post/7206bae2-af91-4bdb-8940-b0dc0433c832/_2021-03-18__5.17.50.png" alt=""></p>
<h3 id="flux-패턴의-단방향-데이터-흐름">Flux 패턴의 단방향 데이터 흐름</h3>
<p>  <img src="https://images.velog.io/images/code_sign/post/355c3a15-d8a5-4911-a3c2-23c4ccc3c04d/_2021-03-18__5.19.14.png" alt=""></p>
</li>
<li><p>Vuex로 해결 할 수 있는 문제</p>
<ol>
<li>MVC 패턴에서 발생하는 구조적 오류</li>
<li>컴포넌트 간 데이터 전달 명시</li>
<li>여러 개의  컴포넌트에서 같은 데이터를 업데이트 할 때 동기화 문제</li>
</ol>
</li>
<li><p>Vuex 컨셉</p>
<ul>
<li>State: 컴포넌트간에 공유하는 데이터 <code>data()</code></li>
<li>View: 데이터를 표시하는 화면 <code>template</code></li>
<li>Action: 사용자의 입력에 따라 데이터를 변경하는 <code>methods</code>
<img src="https://images.velog.io/images/code_sign/post/ecb2f7cc-e883-4308-80d0-6b01fa92d9ab/_2021-03-18__5.25.31.png" alt=""></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] 백엔드지만... ToDoList를 만들었다!]]></title>
            <link>https://velog.io/@code_sign/Vue.js-%EB%B0%B1%EC%97%94%EB%93%9C%EC%A7%80%EB%A7%8C...-ToDoList%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%97%88%EB%8B%A4</link>
            <guid>https://velog.io/@code_sign/Vue.js-%EB%B0%B1%EC%97%94%EB%93%9C%EC%A7%80%EB%A7%8C...-ToDoList%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%97%88%EB%8B%A4</guid>
            <pubDate>Sun, 21 Mar 2021 11:28:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/a479254b-d6af-464d-9123-b012ba269f1e/%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-03-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.07.19.png" alt=""></p>
<p><code>Brandi</code> internship을 진행하다 보니 <code>vue.js</code>가 필요한 상황이었다.
그래서 열심히 책도 읽고 강의도 찾아보면서 <code>todo list</code>를 만들어 보였다.</p>
<h3 id="어떤-기술들을-이용했는지">어떤 기술들을 이용했는지?</h3>
<ul>
<li>vue.js<ul>
<li>component로 만들어 사용</li>
<li>props, event 이용
데이터를 올리고 내리고 하는 기능을 이용해봄!</li>
<li>route 이용</li>
</ul>
</li>
<li>vuex<ul>
<li>store 디렉토리를 이용하여 중앙 데이터 관리</li>
<li>헬퍼 함수를 이용</li>
</ul>
</li>
<li>storage에 저장하여 새로고침해도 사라지지 않음!</li>
</ul>
<h3 id="시연-영상">시연 영상</h3>
<p><img src="https://images.velog.io/images/code_sign/post/c8eda7c0-7048-4493-a9ca-17231d32afd2/Mar-21-2021%2020-27-24.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Brnadi internship] Vue.js시작! 그 과정에 대한 정리 1 (js에 대한 정리)]]></title>
            <link>https://velog.io/@code_sign/Brnadi-internship-Vue.js%EC%8B%9C%EC%9E%91-%EA%B7%B8-%EA%B3%BC%EC%A0%95%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC-1-js%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@code_sign/Brnadi-internship-Vue.js%EC%8B%9C%EC%9E%91-%EA%B7%B8-%EA%B3%BC%EC%A0%95%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC-1-js%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 21 Mar 2021 11:04:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/08d704c9-9f95-4242-a907-1460be2f1bfe/%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-03-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.48.29.png" alt=""></p>
<p>일단 <code>vue.js</code>를 공부하기 위해서는 <code>js</code>에 대한 공부가 필요했다.</p>
<p>다음은 내가 <code>js</code>를 공부하면서 몰랐던 내용들에 대해 정리한 내용이다.</p>
<hr>
<ul>
<li><p>computed VS watch
  computed: 자주 사용하는 것들에 사용
  watch: 자주 사용하지 않는 것들에 사용</p>
</li>
<li><p>ES6 특징</p>
<ul>
<li>Hoisting x</li>
<li>const, let 추가 (var 사용 x)</li>
<li>arrow function<pre><code class="language-jsx">  var a = function(b) {
      return b
  }
  let a = b =&gt; { return b}</code></pre>
</li>
<li>축약 function<pre><code class="language-jsx">  a = {
      b: function() {
          return 10
      }
  }
  a() { return 10 }</code></pre>
</li>
<li>같은 경우의 function 줄이기<pre><code class="language-jsx">  var a = {
      &#39;b&#39;: b
  }
  let a = {
      b
  }</code></pre>
</li>
<li>Modules<ul>
<li>default export는 한 파일당 하나만 export한다는 뜻</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<p>새롭게 공부하는 과정이지만,
새로운 지식을 배우는것이 나는 참 즐겁다!</p>
<p><code>python</code>의 너무 깔끔한면이
<code>js</code>를 공부하면서 장단점을 더 명확히 알 수 있는 소중한 시간을 보내고 있는 것 같다.
<code>js</code>의 고수가 되어서 <code>typescript</code>도 정복하고 <code>node.js</code>도 배워보고 싶다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Brandi internship] 백엔드가 UI를 맡다?! feat.Vue_js 😂]]></title>
            <link>https://velog.io/@code_sign/Brandi-internship-%EB%B0%B1%EC%97%94%EB%93%9C%EA%B0%80-UI%EB%A5%BC-%EB%A7%A1%EB%8B%A4-feat.Vuejs</link>
            <guid>https://velog.io/@code_sign/Brandi-internship-%EB%B0%B1%EC%97%94%EB%93%9C%EA%B0%80-UI%EB%A5%BC-%EB%A7%A1%EB%8B%A4-feat.Vuejs</guid>
            <pubDate>Sun, 21 Mar 2021 10:58:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/12a3e54d-fb90-461d-93e0-94dc738dfabc/%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-03-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.48.29.png" alt=""></p>
<p>이번에 <code>Brnadi</code> <strong>인턴쉽과정</strong>을 하게 되었다!
다행이 <code>Brandi</code>는 <strong>프로젝트 준비와 인턴들의 관리가 굉장히 잘 되어있는 기업</strong>이었다!! (너무 만족스럽고 다행이었다.)</p>
<p>인턴은 <strong>총 5명으로 백엔드만 5명</strong>이었기 때문에 
조금이나마 UI를 다뤄본 내가 <strong>&#39;일단&#39;은 Frontend를 맡게 되어 진행</strong>하게 되었다.</p>
<p>기술스택으론</p>
<ul>
<li><code>flask</code>(백엔드)<ul>
<li>ORM 사용 x</li>
</ul>
</li>
<li><code>Vue.js</code> (프론트엔드)</li>
</ul>
<p>였기 때문에 나는 급한데로 <strong><code>vue.js</code> 공부를 하기 시작</strong>했다!
하지만 <strong>하루이틀만에 하기엔 무리가 되는 new framework</strong>...
내 마음은 하루하루 지날때마다 불안해지기 시작하면서 뭔가에 쫓기는 느낌이 들었다.
(당장이라도 뭔가를 뽑아내야 할 것 같은 느낌이었다.)</p>
<p>다행히도 팀장님이 <strong>전 인턴들이 하던 <code>UI</code>를 제공</strong>해 주어서 그것을 바탕으로 진행하게 되었다.
하지만, <strong>모든 페이지가 있지 않아</strong> 어떤 UI가 있고 없는지에 따른 파악을 먼저 하기로 하였다.</p>
<p>다음은 그 파악을 위한 문서이다!
(이제부터 내가 구멍들을 메꾸어야 할 녀석들이다...☠️)</p>
<hr>
<ul>
<li>UI 상황<ul>
<li>서비스<ul>
<li>유저<ul>
<li><input checked="" disabled="" type="checkbox"> 로그인</li>
<li><input checked="" disabled="" type="checkbox"> 회원가입</li>
<li><input disabled="" type="checkbox"> 회원가입 - flow</li>
</ul>
</li>
<li>상품 리스트<ul>
<li><input disabled="" type="checkbox"> 헤더 부분(필터)</li>
<li><input disabled="" type="checkbox"> 바디 부분(상품 이미지, 타이틀, 가격 등)</li>
</ul>
</li>
<li>상품 디테일<ul>
<li><input checked="" disabled="" type="checkbox"> 헤더 부분(사진, 사이즈/색상 선택, 가격 등)</li>
<li><input checked="" disabled="" type="checkbox"> 바디 부분(상품 정보)</li>
<li><input disabled="" type="checkbox"> QnA 등록</li>
<li><input checked="" disabled="" type="checkbox"> QnA 리스트</li>
</ul>
</li>
<li>결재<ul>
<li><input checked="" disabled="" type="checkbox"> 결재 상황 페이지(주소, 수량체크 등등)</li>
<li><input disabled="" type="checkbox"> 주소 선택 모달창</li>
<li><input disabled="" type="checkbox"> 주문 완료 페이지 ???-없는거같다</li>
</ul>
</li>
<li>장바구니<ul>
<li><input disabled="" type="checkbox"> 장바구니에 대한 전체 부분</li>
</ul>
</li>
<li>마이페이지<ul>
<li><input checked="" disabled="" type="checkbox"> 마이페이지 헤더(주문 배송조회, 포인트, 쿠폰 등등)</li>
<li><input checked="" disabled="" type="checkbox"> 주문 리스트</li>
<li><input disabled="" type="checkbox"> 주문 상세 페이지</li>
<li><input disabled="" type="checkbox"> QnA 리스트</li>
</ul>
</li>
<li>혜택존<ul>
<li><input checked="" disabled="" type="checkbox"> 슬라이드</li>
<li><input checked="" disabled="" type="checkbox"> 상세이미지 (디테일)</li>
<li><input checked="" disabled="" type="checkbox"> 상세이미지 (상품리스트)</li>
</ul>
</li>
</ul>
</li>
<li>어드민<ul>
<li><input checked="" disabled="" type="checkbox"> 홈 (매출통계, 상품 상태 현황) - seller</li>
<li>회원<ul>
<li><input checked="" disabled="" type="checkbox"> 로그인</li>
<li><input checked="" disabled="" type="checkbox"> 회원가입</li>
</ul>
</li>
<li>회원관리<ul>
<li><input checked="" disabled="" type="checkbox"> 샐러계정관리 - master</li>
<li><input checked="" disabled="" type="checkbox"> 샐러 정보 수정페이지 - master</li>
<li><input disabled="" type="checkbox"> 샐러정보 관리 - seller</li>
</ul>
</li>
<li>상품 관리<ul>
<li><input checked="" disabled="" type="checkbox"> 상품 관리 - master</li>
<li><input disabled="" type="checkbox"> 상품 관리 - seller</li>
<li><input disabled="" type="checkbox"> 상품 등록 - master</li>
<li><input checked="" disabled="" type="checkbox"> 상품 등록 - seller</li>
</ul>
</li>
<li>주문 관리<ul>
<li><input checked="" disabled="" type="checkbox"> 상품 준비 관리 - seller</li>
<li><input disabled="" type="checkbox"> 상품 준비 관리 - master</li>
<li><input checked="" disabled="" type="checkbox"> 배송중 관리 - seller</li>
<li><input disabled="" type="checkbox"> 배송중 관리 - master</li>
<li><input checked="" disabled="" type="checkbox"> 배송 완료 관리 - seller</li>
<li><input disabled="" type="checkbox"> 배송 완료 관리 - master</li>
<li><input disabled="" type="checkbox"> 구매 확정 관리 - seller</li>
<li><input disabled="" type="checkbox"> 구매 확정 관리 - master</li>
<li><input checked="" disabled="" type="checkbox"> 주문 상세 관리 - seller, master</li>
</ul>
</li>
<li>기획전<ul>
<li><input disabled="" type="checkbox"> 기획전 등록 - master</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<p>이제부터 UI공장이 되어 나의 원래 신분이었던
백엔드로 돌아가는 날까지 화이팅이다!!!</p>
<p>아즈아!😆🙌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[원티드 클론 사이트] 서로 다른 형식의 쿼리를 합쳐보자! (Resume + ResumeFile)]]></title>
            <link>https://velog.io/@code_sign/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%A1%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%84%9C%EB%A1%9C-%EB%8B%A4%EB%A5%B8-%ED%98%95%EC%8B%9D%EC%9D%98-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%95%A9%EC%B3%90%EB%B3%B4%EC%9E%90-Resume-ResumeFile</link>
            <guid>https://velog.io/@code_sign/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%A1%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%84%9C%EB%A1%9C-%EB%8B%A4%EB%A5%B8-%ED%98%95%EC%8B%9D%EC%9D%98-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%95%A9%EC%B3%90%EB%B3%B4%EC%9E%90-Resume-ResumeFile</guid>
            <pubDate>Sun, 14 Mar 2021 14:30:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/0860fdb7-bb5c-4caa-aaa0-e124883fc064/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.14.57.png" alt=""></p>
<p>프로젝트를 진행하다보니
서로 다른 <code>querySet</code>을 합쳐야 하는 순간이 왔다.</p>
<p>바로 <code>Resume</code> 형식과 <code>ResumeFile</code>의 테이블 결과값을 합쳐야 하는 것!</p>
<h4 id="왜">왜???</h4>
<p><img src="https://images.velog.io/images/code_sign/post/95ea5fd8-cc81-4ef8-bf87-98d3d8dd3982/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.26.08.png" alt="">
지원하기도 그렇고, 이력서 탭을 클릭해서도 그렇고...
모든 이력서가 합쳐진 상태로 날짜순으로 정렬되어 보이게 된다.
그럴려면? 둘의 <code>querySet</code>을 합쳐서 <code>order_by</code>를 해줘야겠다고 생각이 들었다!</p>
<h2 id="코드-보기-👀">코드 보기 👀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/ef287099-87fc-434b-852f-eae6dd5eff34/image.png" alt=""></p>
<p>위의 코드를 보면 <code>resumes</code> 변수와 <code>resume_file</code> 변수에 <code>values</code>를 사용해 특정 부분만 골라내는것을 볼 수 있다.</p>
<p>나는 <code>union</code>을 사용해서 합쳐주었는데, 서로의 형식이 다르면 합쳐지지 않기 떄문에 특정 부분만 골라서 합쳐주었다.</p>
<p>그리고 <code>for</code>문 안에 있는 <code>introduce</code>와 <code>file_url</code>을 보면 해당 값이 있으면 해당 값을 불러오고, 아니면 빈 스트링을 지정해두어 <code>Frontend</code>가 값을 받아 분기처리로 파일형식인지 아닌지를 판별 할 수 있게 하였다.</p>
<hr>
<h3 id="미래의-나-보고-있나ㅋㅋㅋㅋㅋ">미래의 나... 보고 있나??ㅋㅋㅋㅋㅋ</h3>
<p>사실 이 코드가 맞는 코드인지는 잘 모르겠지만..
미래의 내가 이 코드를 보며 &quot;멍청이!&quot;라고 욕한다면 그만큼 성장했다는 뜻이니..
미래의 뿌듯함을 위해 여기에 박제한다...ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[원티드 클론 사이트] prefetch/select - related 적용하기! (PostingListView)]]></title>
            <link>https://velog.io/@code_sign/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%A1%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-prefetchselect-related-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-PostingListView</link>
            <guid>https://velog.io/@code_sign/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%A1%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-prefetchselect-related-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-PostingListView</guid>
            <pubDate>Sun, 14 Mar 2021 14:18:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/ee8cb128-bfac-49d1-89da-7f69cb534226/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.14.57.png" alt=""></p>
<p>오늘은 나를 수없이 괴롭힌 친구를 리뷰하는 시간이다..
이 친구는 여러 시리즈가 있지만.. 이건 그 첫번쨰 시간이다!</p>
<p><code>prefetch/select - related</code>는 무엇일까??
우리가 흔히 <code>filter</code>를 사용하여 쓰는 것을 좀 더 빠르게 작동해 줄 수 있는 기능을 제공한다. 어떻게? <code>DB</code> HIT(DB에 접근하는 행위)를 줄임으로 인해서!</p>
<p>더 자세한 사항은 곧 블로깅을 마련하여 설명하도록 하고 어떻게 적용했는지 살펴보겠다!</p>
<h3 id="들러야-하는-db-table이-많다">들러야 하는 DB Table이 많다....</h3>
<p>일단 <code>Posting</code>을 뽑아야 한다.
근데 들러야 하는 <code>DB</code> <code>Table</code>이 너무 많다!!</p>
<p>나열해 볼까...?</p>
<ul>
<li>CompanyDetail</li>
<li>Company</li>
<li>State</li>
<li>County</li>
<li>CompanyImage</li>
<li>CompanyTag</li>
<li>JobCategory</li>
<li>TagDetail</li>
</ul>
<p>등등...</p>
<p>그럼 이것들을 연결해서 한번에 쫙<del>~</del> 뽑아보겠다!!</p>
<p><img src="https://images.velog.io/images/code_sign/post/b94ea39e-b9ff-4960-9ebd-2d6bb2d72a3b/image.png" alt=""></p>
<p>이렇게 정리해줬다!</p>
<p><code>query</code>가 뭐냐구??
지금은 대충 </p>
<pre><code class="language-python">Posting.object</code></pre>
<p>이렇게 기억을 해두자! 더 자세한건 나중에 나를 진짜 괴롭혔던 코드로 돌아오겠다.....🔥🔥🔥</p>
<h3 id="진짜-줄었어-db-hit">진짜 줄었어? DB HIT???</h3>
<p><img src="https://images.velog.io/images/code_sign/post/87715517-22d7-4e92-9923-b36afbe75f4a/%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-03-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.39.03.png" alt=""><img src="https://images.velog.io/images/code_sign/post/f317c3fb-eccb-4ed6-ba70-192fb5e54247/%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-03-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.39.19.png" alt=""></p>
<p>위와같이 비교했을떄,
200줄 -&gt; 44줄이 되는 혁명적인 코드가 되었다!!</p>
<p>WOW!!</p>
<p>진짜 한줄이라도 줄면 다행인건데 이렇게 확?!
좋았어!! 
<code>prefetch/select - related</code> 너네, 내 동료가 되어라! 😎</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[원티드 클론 사이트]  우리가 이제 매일 볼 원티드를 내손으로 만들기!🙌 - 후기]]></title>
            <link>https://velog.io/@code_sign/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%A1%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9A%B0%EB%A6%AC%EA%B0%80-%EC%9D%B4%EC%A0%9C-%EB%A7%A4%EC%9D%BC-%EB%B3%BC-%EC%9B%90%ED%8B%B0%EB%93%9C%EB%A5%BC-%EB%82%B4%EC%86%90%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@code_sign/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%A1%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9A%B0%EB%A6%AC%EA%B0%80-%EC%9D%B4%EC%A0%9C-%EB%A7%A4%EC%9D%BC-%EB%B3%BC-%EC%9B%90%ED%8B%B0%EB%93%9C%EB%A5%BC-%EB%82%B4%EC%86%90%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 14 Mar 2021 14:04:39 GMT</pubDate>
            <description><![CDATA[<p><code>WECODE</code>에서의 2번쨰 프로젝트가 마무리가 되었다.</p>
<p>2번째 프로젝트는 이래저래 사건도 많고 <code>PM</code>이된 내가 처음 이끄는 프로젝트여서 긴장도 걱정도 되지만 잘 헤쳐나가기로 다짐했었다!
하지만 새롭게 적용한 기술들이 많아서 중간에 다른 블로깅을 할 시간이 없었다🥲</p>
<p>후기를 먼저 올리지만...
기회가 된다면 이 프로젝트에서 적용했던 부분도 블로깅으로 남겨두고 싶다!</p>
<h2 id="원티드-우리는-원트어스😆">원티드? 우리는 원트어스!!😆</h2>
<p><code>wanted</code> 클론 사이트인 우리 사이트를 이름은 <code>wantus</code>로 정했다.</p>
<p>팀원은 <code>Frontend</code> 3명, <code>Backend</code> 3명으로 이루어져 진행했고,
<code>Agile</code> 방식을 적극 활용하여 주마다 <code>Sprint Meeting</code>를 진행하여 한주간 어디까지 달릴지 설정했고, 매일 아침 <code>Stand-up Meeting</code>을 하여 어제 하루동안 한 일, 오늘 하루동안 할 일, 그리고 작업을 막는 블로커를 나누면서 소통을 하였다.</p>
<p><img src="https://images.velog.io/images/code_sign/post/6f43b2c3-09dd-48b2-b083-8a8d820c2ac2/image.png" alt=""></p>
<p>또한 <code>Notion</code>을 적극 활용하여 팀원들간의 <code>data key</code>값을 맞추었고,
회의 내용 또한 공유하며 소통하려고 애썼다.</p>
<p><img src="https://images.velog.io/images/code_sign/post/e0739a14-177f-48ec-b611-1e272169cdb0/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.28.54.png" alt="">
<img src="https://images.velog.io/images/code_sign/post/4de9e4c2-c934-4786-906e-79019dce97f0/%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-03-09%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.03.55.png" alt=""></p>
<h3 id="db-설정-이번에는-29개☠️">DB 설정! 이번에는 29개...☠️</h3>
<p><img src="https://images.velog.io/images/code_sign/post/90e2a3af-c7c1-49cf-8530-8d248583e785/image.png" alt=""></p>
<p>이번에는 테이블이 정말 복잡했다... (1차 프로젝트가 간단한거일수도..)
그 개수는 무려 29개!
심지어 우리는 한정적으로 구현을 하는 것에도 그 방대한 양에 놀랐고,
그 복잡한 화살표 관계를 따져보는것도 우리의 작업속도를 방해하는 블로커 중 하나였다..</p>
<p>(<a href="https://aquerytool.com:443/aquerymain/index/?rurl=fe88a79f-a8bb-416c-b852-1191877e82a5">AqueryTool로 보러가기!</a> pw:lgirvo)</p>
<h3 id="구현한-범위">구현한 범위</h3>
<p><img src="https://images.velog.io/images/code_sign/post/cabd32c0-f74e-4088-97d9-5024904775d2/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.36.45.png" alt=""></p>
<p>우리는 위와 같은 페이지로 구현을 하기로 했다.
아무래도 2주간의 짧은 시간동안 구현을 해야하기에 모든 페이지를 자세히 다루기는 어려웠던 부분이었다😂</p>
<p>하지만,
짧은 시간에 비해 우리는 정말 많이 배웠고, 소통했고, 잘했다고 생각한다!</p>
<h3 id="그대로-따라하는-것이-아닌-기획까지-추가👍">그대로 따라하는 것이 아닌 기획까지 추가👍</h3>
<p>우리는 기존의 사이트를 보면서 의아했던 점이 있었다.
바로 <code>좋아요</code>를 한 채용공고와 <code>북마크</code>를 한 채용공고의 <code>UI</code>가 같다는 것!</p>
<p>굳이 이렇게 같을 필요가 있었을까?</p>
<blockquote>
<p>북마크는 더 자세한 정보를 알고 싶어서 북마크를 한 것인데.. 그러기엔 한눈에 전달하는 정보가 너무 단순했다. 그래서 기존 정보에 더해 어떤 직무의 직군의 마감일, 태그들도 함께 보여줬다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/code_sign/post/752ffc01-5223-45d7-9995-af04e4d70292/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.31.40.png" alt=""></p>
<h3 id="backend의-새로운-기능">Backend의 새로운 기능??</h3>
<p>여러가지가 있어 하나씩 차근차근 설명을 하도록 하겠다!</p>
<ul>
<li><p>Unit Test
모든 <code>View</code>에는 <code>unittest</code>가 필수적으로 적용되었다. 그 전까지는 <code>httpie</code>를 이용해서 진행하였는데, 비용문제로 가장 작은 단위인 <code>unittest</code>를 이용한다는 말을 듣고 잘 적용하려고 애썼다.
<img src="https://images.velog.io/images/code_sign/post/d65a88b4-bd22-424a-8a86-d74ef69e48ad/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.43.27.png" alt="">이건 무려 1700줄...</p>
</li>
<li><p>prefetch, select related
채용 리스트를 맡아서 진행할 때, 많은 <code>DB</code>를 hit하는 이슈를 해결하기 위해 사용했었다. 결국 200줄에 달하는 <code>query문</code>이 44줄로 줄어들게 되었다!
<img src="https://images.velog.io/images/code_sign/post/19bd71a5-2ea1-4f9d-ad58-aad810b240bb/%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-03-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.39.03.png" alt=""><img src="https://images.velog.io/images/code_sign/post/fbe8255c-fd09-4b76-9885-7cf3fb358a9a/%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-03-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.39.19.png" alt=""></p>
</li>
<li><p>소셜로그인
카카오 <code>API</code>중 하나인 소셜로그인을 구현했다.</p>
</li>
<li><p>paginator
원티드의 채용리스트는 무한스크롤이 되어 있다. 해당 기능을 따라하기 위해서 <code>paginator</code>를 사용했다.
<img src="https://images.velog.io/images/code_sign/post/dc2d4b0d-56aa-4431-88d5-e1f04ffba58b/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.48.16.png" alt=""></p>
</li>
<li><p>AWS</p>
<ul>
<li>EC2
<code>RDS</code>를 연결하기 위해 꼭 필요했고, 배포를 해보고 싶어서 도전하게 되었다.</li>
<li>RDS
배포를 위해 이번에 새롭게 적용하여 올려보았다.</li>
<li>S3
우리의 핵심 구현중 하나인 파일 이력서를 올리는데 반드시 필요한 기능이였다!</li>
</ul>
</li>
</ul>
<h2 id="후기-😎">후기 😎</h2>
<p>이번 프로젝트에서 PM을 맡아서 진행하게 되었는데, 처음에는 그 무게가 그렇게 크게 느껴지지는 않았다. 
처음에는 말이다... 처.음.에.는.ㅋㅋㅋㅋㅋㅋㅋㅋㅋ😂</p>
<p>프로젝트를 진행할수록 멘탈이 무너져도 그것을 티내지 않아야 했고,
누구보다 성실히 임해야했고, 팀원들을 배려해야 했다.</p>
<p>뭔가 욕심을 내면 안될꺼 같았고, 뭔가를 해줘야 할 것 같았다. 
(간식이라던지.. 간식이라던지... 간식...)</p>
<p>물론 위의 것들을 완벽히 이행했다는 소리는 당연히 아니다....
오히려 다른 팀원분들보다 못한것도 있다. 하지만 그 부담감과 무게감이 팀원이었을때와 다르다는것은 확실히 느꼈었고, 그것이 나한테 영향을 준것도 분명한 사실이었다.</p>
<p>우리는 코드카타처럼 총 3명의 백엔드끼리 모여 많이 해봤던 기능들은 모여서 함께 구축했다. (네이게이터, 드라이버) 그 후에는 각자 안해본 기능들을 맡아서 서로 공유하면서 짰었는데, 후반으로 가니 각자 할께 바빠 코드들을 잘 보지 못한 것 같아 아쉽다...😭</p>
<p>특히 나의 경우엔 채용 리스트의 다중 필터 기능들을 구현하는데 어려움을 겪었다.
<code>DB</code> 테이블의 지옥에 빠지기도 했고, 팀원간의 소통이 잘 되지 않아 새로운 데이터를 <code>view</code>에 추가하다 보니 <code>unittest</code>도 새로 짜고.. <code>merge</code>받는데 한세월이고...</p>
<p>돌이켜 보면 배움이고 희극인데
왜 그 당시에는 그렇게 비극이고 자괴감의 연속이었는지 모르겠다....
이렇게 끝났으니 할 수 잇는 말이겠지??ㅋㅋㅋㅋㅋㅋㅋㅋㅋ</p>
<p>이 자리를 빌어 우리팀원들에게 참 고맙다고 말하고 싶다.
부족한 PM이었는데, 나를 믿고 다들 각자의 자리에서 최선을 다해주었다.
덕분에 좋은 결과를 얻었고 좋은 마음과 꺠달음을 얻을 수 있었다.</p>
<p>그리고 이 힘든 기간을 보낸 나에게도...
&quot;참 잘 버텼고, 버틴만큼 성장했고, 성장한 만큼 너의 미래는 밝다!!&quot;
라고 말해주고 싶다 😁✌️</p>
<p><img src="https://images.velog.io/images/code_sign/post/f436180a-3460-45ec-9e33-d3c97746a612/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.01.17.png" alt=""></p>
<blockquote>
<p>내가 무엇이 부족하고 무엇을 채워야 하는지 알게 되는 시간이었습니다. 부족한 PM 밑에서 고생 많으셨습니다 여러분!!</p>
</blockquote>
<p>그리고 이제 곧 취업전선에 뛰어들 동기분들에게 아래의 말을 전한다!</p>
<p><img src="https://images.velog.io/images/code_sign/post/fa343d5e-54bc-49c7-9b94-026ed7f9eaec/%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-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.01.52.png" alt=""></p>
<p><img src="https://images.velog.io/images/code_sign/post/40e80077-0295-438c-af0b-0ba131a597c0/iOS%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20(2).jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[WECODE] 너도 나도 오늘도 시켜먹은 배민의 배민문방구 클론🙌]]></title>
            <link>https://velog.io/@code_sign/WECODE-%EB%84%88%EB%8F%84-%EB%82%98%EB%8F%84-%EC%98%A4%EB%8A%98%EB%8F%84-%EC%8B%9C%EC%BC%9C%EB%A8%B9%EC%9D%80-%EB%B0%B0%EB%AF%BC%EC%9D%98-%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%ED%81%B4%EB%A1%A0</link>
            <guid>https://velog.io/@code_sign/WECODE-%EB%84%88%EB%8F%84-%EB%82%98%EB%8F%84-%EC%98%A4%EB%8A%98%EB%8F%84-%EC%8B%9C%EC%BC%9C%EB%A8%B9%EC%9D%80-%EB%B0%B0%EB%AF%BC%EC%9D%98-%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%ED%81%B4%EB%A1%A0</guid>
            <pubDate>Fri, 05 Mar 2021 18:36:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/8db1400d-5b96-41bd-a927-e3714b933349/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt=""></p>
<p><code>WECODE</code>에서의 첫번째 프로젝트가 끝이 났다.
<strong>첫 프로젝트였던 만큼 어려웠던 점도 아쉬웠던 점도 있는것 같다.</strong>
우리팀, 그리고 <strong>나의 2주간의 대장정(?)을 여기에 남긴다!</strong></p>
<ul>
<li><a href="https://www.youtube.com/watch?v=FHCWxWemcg4&amp;ab_channel=wecode">완성된 사이트 구현영상 보러 가기!</a></li>
<li><a href="https://www.notion.so/Project-technical-documentation-fecc5c24866d4536affc56df6b82c483">기술문서 보러 가기!</a></li>
<li><a href="https://aquerytool.com/aquerymain/index/?rurl=f0cadad2-6e0e-4fb8-acd2-693c65e993cf&amp;">모델링 보러 가기! 비밀번호:818ycs</a></li>
<li><a href="https://github.com/wecode-bootcamp-korea/17-1st-200store-backend">git-hub 보러 가기!</a></li>
</ul>
<h2 id="사용-했던-기술-스택">사용 했던 기술 스택</h2>
<ul>
<li>Python<ul>
<li>python shell</li>
</ul>
</li>
<li>Django<ul>
<li>ORM</li>
<li>json</li>
<li>http method</li>
<li>Views, Models</li>
</ul>
</li>
<li>MySql</li>
<li>RESLful</li>
<li>bcrypt, pyjwt</li>
<li>Vim, VScode</li>
<li>httpie</li>
<li>minicomda</li>
<li>slack, git hub, trello</li>
</ul>
<h1 id="agile">Agile</h1>
<p><img src="https://images.velog.io/images/code_sign/post/81d583ba-c3fa-4f46-8ceb-f747f3183693/agile.png" alt=""></p>
<blockquote>
<p>우리는 철저히 <code>Agile</code>방식을 사용하여 시작을 하였다.
밑에서 천천히 어떤 방식을 적용하여 시작했는지 적어가겠다!</p>
</blockquote>
<h2 id="초기-세팅">초기 세팅</h2>
<p>우리는 <code>Frontend</code>는 <code>CRA</code>로 초기세팅을, <code>Backend</code>는 <code>django</code>를 활용한 초기세팅을 진행했다.</p>
<p><code>Django</code>와 <code>React</code>로 처음하는 프로젝트라 그런지 초기세팅조차 쉽지 않았다.
<code>React는 ESLint</code>와 <code>Pretire</code> 에러의 늪에서 헤어나오느라 허덕였고,
<code>Django</code> 또한 <code>miniconda</code>, <code>mysql</code>, <code>my_settings.py</code> 설정 등등에 힘겨웠다.</p>
<p><code>Git-hub</code>를 설정할때는 <code>.gitignore</code>의 존재를 잊고 있다가 뒤늦게 발견해서 <code>repository</code>를 하나 날려버리는 헤프닝도 발생했었다.ㅋㅋㅋㅋㅋㅋㅋ😂😂😂😂😂</p>
<p><code>slack</code>과 <code>trello</code>, <code>git-hub</code> <strong>repository</strong>로 커뮤니케이션을 했다.
끊임없는 회의를 하기보단 <code>trello</code>를 보며 <strong>project flow를 파악하려 노력</strong>했고, 코드공유 또한 <code>git-hub</code>를 통해 이루어졌다.</p>
<h2 id="goal-setting">Goal Setting</h2>
<blockquote>
<p><strong>매주 월요일에 스트린트를 지정하여 한주간 달려야 할 지점</strong>을 정했고, <strong>매일 오전 10시 30분에 스탭드업 미팅을 해서 하루의 목표도 설정</strong>했다.</p>
</blockquote>
<p>우리의 프로젝트는 <strong>총 2주에 걸쳐 진행</strong>되었다.
작업 진행 방향성과 우선순위는
<code>Frontend</code>의 <code>UI</code>가 나오는 순서대로 <code>View</code>를 뽑아내서 맞춰가는 방향으로 설정했다.</p>
<h2 id="지옥의-modeling의-1주차">지옥의 Modeling의 1주차...</h2>
<p>1주차에는 필수구현에 집중했다.</p>
<ul>
<li>Main</li>
<li>SignUp</li>
<li>Login</li>
<li>Product List, Detail</li>
<li>Cart</li>
<li>Payment
이상 7가지 <code>UI</code>와 <code>View</code>를 뽑기로 설정했고, 실제로도 잘 구현되었다.</li>
</ul>
<p>그리고.... 
잘 구현됐다는 이야기는 <code>Frontend</code>에만 해당되는 이야기다😂😂😂</p>
<h3 id="backend의-modeling">Backend의 Modeling...?</h3>
<blockquote>
<p>아니,
정말,
이래도 되나 싶을정도로,
모델링이 오래 걸려도 되나 싶었다.
(왜 자꾸 수정 할 것이 트어나으느거야....)</p>
</blockquote>
<p><strong>단순히 모델링을 하는데 오래걸렸다는 이야기는 아니다.</strong>
팀원들과 회의를 하며 모댈링을 했을때는 <strong>완성까지 모든 힘을 쏟아부어 3-4시간만에 완성</strong>이 되기도 했다.
그래서 의자에 힘없이 늘어져 있었는데 우리 프론트 팀원분이
<strong>&quot;우리 팀 백엔드분들만 노는것 같아요.&quot;라며 말씀</strong>을 하셨다ㅋㅋㅋㅋㅋㅋㅋ
(지금까지 공부하다가 잠깐 쉴때 엄마가 보더니 혼냈을때.. 그런 느낌이었다...☠️☠️)</p>
<p>근데 직접 데이터를 넣고 <code>view</code>를 짜다 보니</p>
<p>&quot;어...? 이거 왜 없지?&quot;
&quot;어? 이건 또 왜 unique/null=True가 아니지?&quot;
&quot;이러면 이것을 참조하는 테이블이 하나 더 필요한데...?&quot;</p>
<p>하는 의문들과 함께 <strong>완성했다고 생각했던 모델링의 무한수정이 펼쳐졌다.</strong>
언제까지?
다음주 화요일까지...</p>
<p>물론 다른 <code>view</code>들도 나왔었지만, 가뜩이나 <code>csv</code>파일도 늦게 만드느라 <code>models.py</code>수정하고 <code>DB</code>날리고 <code>makemigration</code>, <code>migate</code> 다시하고..</p>
<p><strong>딜레이의 연속이었던것 같다.</strong></p>
<h2 id="그래도-점점-완성되어가는-2주차">그래도 점점 완성되어가는 2주차!</h2>
<p><img src="https://media.vlpt.us/images/sayxyoung/post/ce7b9ff5-fd6f-41cc-bdf0-0f12ea651db1/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-02-28%20%EC%98%A4%ED%9B%84%209.49.18.png" alt=""></p>
<p>어쨋든 시간은 흐르고...
점점 모습을 갖추며 완성이 되어가고 있었다.</p>
<h3 id="어려웠던-부분이-있다면">어려웠던 부분이 있다면?</h3>
<p>단연컨데 <code>OrderListView</code>라고 말할 수 있을 것 같다.
이게 딱 찝어서 뷰만 그렇다고 할수는 없고 그 시스템을 이해하는것이 어려웠다..</p>
<p><a href="https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EA%B3%A0%EA%B0%B1%EB%8B%98...-%EA%B5%AC%EB%A7%A4%ED%99%95%EC%A0%95-%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94...-OrderListView">자세한 내용은 이 블로깅을 참조...</a></p>
<h3 id="마음의-부담이-점점-커졌다☠️">마음의 부담이 점점 커졌다☠️</h3>
<p>프로젝트를 진행할수록 마음의 부담이 커져갔었다.
힘들어하던 도중에 이런 생각이 들었다.</p>
<p>&quot;즐기면서 할 수 없을까? 난 왜 이렇게 힘들게 코딩을 하려 하지?&quot;</p>
<p>그 순간부터 무언가를 내려놓고 시작했다.
프로젝트에 대한 마음과 노력을 내려놓은 것이 아닌 내 부담감을 내려놓았던 것 같다.
그런뒤부터 지금까지 부담없이 &quot;재밌게!&quot; 잘 코딩을 하고 있다ㅎㅎㅎ</p>
<hr>
<h2 id="후기">후기</h2>
<p><img src="https://media.vlpt.us/images/sayxyoung/post/c96fac00-08fa-40a2-89fe-77a4406aa35a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-02-26%20%EC%98%A4%ED%9B%84%208.19.07.png" alt=""></p>
<p>처음 <code>WECODE</code>를 왔을때만 해도 
&quot;나는 한번 코딩을 배웠었는데, 너무 의미없는 시간이 아닐까...&quot;
생각을 했었다.</p>
<p>그치만,
1차 프로젝트를 하고 난 뒤에 확실히 &quot;아니다&quot;라고 말할 수 있다.</p>
<p>팀원들과 소통하는 커뮤니테이션,
나 스스로 코드를 돌아보는 코드리뷰,
멘토님들이 지적한것들을 다시 짜보는 리팩토링,
그리고 다른 동기들과 부딪히며 얻는 긍정적인 모든 것들이 너무나 소중하다.</p>
<p>난 2주간 부족했지만 <code>WECODE</code>에 있었던 어떤 시간보다 제일 많이 성장한 시간이라고 생각한다.</p>
<p>나는 완벽주의자다.
그래서 그런지 나의 성향에 우리 팀원들이 많이 힘들지 않았을지 많이 미안하다.
그리고 이런 나에게 너무 잘한다며 무한 칭찬을 패시브로 장착하며 같이 달려온 팀원들과 동기들에게 너무 감사하다!😭</p>
<p>개발자는 끊임없이 자기 개발을 하고, 도태되면 안된다고 하던데
끊임없는 구글링과 마인드 컨트롤을 하며 달린 이 2주간은 정말 그랬던것 같다.
지금 프로젝트가 끝난 이 시점에도 여기서 도태되지 않고 어제보다 나은 내가 되며 나아가고 싶다.</p>
<p>그렇게 힘차게 나아가다 뒤를 돌아봤을때 이 글을 보며 흐뭇해하는 내가 되어 있길 소망하며 오늘도 JUST DO IT!</p>
<p><img src="https://media.vlpt.us/images/sayxyoung/post/92122881-8113-44c6-8245-d2109cfd435f/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-02-28%20%EC%98%A4%ED%9B%84%2011.11.49.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] Best! New! Sale! MainView.py😎]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-Best-New-Sale-MainView.py</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-Best-New-Sale-MainView.py</guid>
            <pubDate>Fri, 05 Mar 2021 18:09:09 GMT</pubDate>
            <description><![CDATA[<p>배민문방구를 들어가면 제일 처음 보이는 메인페이지에 대해서 리뷰해볼 시간이다!</p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/058ccc28-3aa0-4533-8299-7e149595e4c5/Mar-06-2021%2002-56-41.gif" alt=""></p>
<p>메인페이지를 보면
<code>잘나가요</code>, <code>새로 나왔어요</code>, <code>지금은 할인 중</code>이라고 나눠져 있고, 각각 4, 8, 8개의 상품으로 이루어져 있는것을 알 수 있다.</p>
<p>이것들을 객체에 담아 넘기면 되겠다!! 라고 생각했다.</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/e7777e56-7e86-4f73-9270-8b1cb764b654/image.png" alt=""></p>
<p><code>compare_date</code>는 날짜를 비교하기 위해 필요하다.</p>
<p><code>check_best_list</code>는 베스트인 상품들의 배열이다.
베스트 상품은 전체 상품 중에 제일 잘 팔린 상품들의 20개다.</p>
<p>각각의 4, 8, 8개의 상품을 얻어야 하는데 이것은 상수로 지정하여 유지보수가 편할 수 있도록 설정하였다.</p>
<p>각각의 쿼리를 필터링하는 조건과 방법은 다르지만, 다 비슷비슷하게 작성되었다.
<code>is_new</code>는 <code>create_at</code>을 기준으로 한달 이내의 제품만 <code>True</code>가 되게 하였고, <code>is_best</code>는 해당 제품이 위에서 구한 <code>best_list</code>에 <code>in</code>되어 있는지 검사하였다.
모든 제품의 <code>sale</code>값은 0이 <code>default</code>인데, <code>is_sale</code>은 0보다 크면 <code>True</code>가 나오게 하여 각각의 항목에 대하여 나눠주었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] 끝이 없는 모델링.. 그 끝을 맺다ㅋㅋㅋㅋ]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EB%81%9D%EC%9D%B4-%EC%97%86%EB%8A%94-%EB%AA%A8%EB%8D%B8%EB%A7%81..-%EA%B7%B8-%EB%81%9D%EC%9D%84-%EB%A7%BA%EB%8B%A4%E3%85%8B%E3%85%8B%E3%85%8B%E3%85%8B</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EB%81%9D%EC%9D%B4-%EC%97%86%EB%8A%94-%EB%AA%A8%EB%8D%B8%EB%A7%81..-%EA%B7%B8-%EB%81%9D%EC%9D%84-%EB%A7%BA%EB%8B%A4%E3%85%8B%E3%85%8B%E3%85%8B%E3%85%8B</guid>
            <pubDate>Thu, 04 Mar 2021 10:03:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/f02dfda0-bfd5-4b18-a5c3-c52225616448/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt=""></p>
<p><img src="https://images.velog.io/images/code_sign/post/d01af36a-ccf1-4439-8c03-adaac7cfd9d6/%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-03-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.56.34.png" alt=""></p>
<p>드디어 그 끝을 맺은 <code>DB</code>!
Aquery를 이용해서 완성을 했다...</p>
<h2 id="db-모델링-과정">DB 모델링 과정</h2>
<p>우리의 DB 완성이 오래 걸린것은 아니다.
처음 DB는 3시간만에 나오기도 했었는데 그것의 수정의 수정의 수정의 수정의....</p>
<h3 id="무엇이-오래-걸렸는지">무엇이 오래 걸렸는지...</h3>
<ol>
<li><code>ForeignKey</code>의 관계가 너무 복잡..<ul>
<li><code>user</code>와 <code>product</code>의 관계가 너무 많이 물려 있었다...</li>
<li><code>related_name</code> 지옥.. </li>
</ul>
</li>
<li>제약조건의 수정수정<ul>
<li>진짜 처음에는 <code>account</code>에 <code>unique</code>도 주지 않고 있었다ㅋㅋㅋㅋㅋㅋ</li>
<li>생각보다 <code>null=True</code>, <code>default=</code>가 많이 있었다.</li>
</ul>
</li>
<li>논리적인 문제!<ul>
<li>이 컬럼이 이 테이블에 있어도 되는 것인지,</li>
<li>이렇게 해서 이 데이터를 구할 수 있지만 이 테이블에 그냥 넣어주는게 어떤지 등에 대한 문제들</li>
</ul>
</li>
<li>그냥 우리의 실수<ul>
<li>사실 이게 대부분...ㅋㅋㅋㅋㅋㅋㅋ</li>
</ul>
</li>
</ol>
<h3 id="느낀점">느낀점..</h3>
<p>진짜 다음에 모델링을 하게 되면 <strong>제약조건만은 꼼꼼히 따져서 하고싶다.</strong>
<strong>빼먹는 실수 없기, 깔끔하게 짜기</strong> 꼭 기억!! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] URL안 바뀌는 menu tab 만들기!]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-URL%EC%95%88-%EB%B0%94%EB%80%8C%EB%8A%94-menu-tab-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-URL%EC%95%88-%EB%B0%94%EB%80%8C%EB%8A%94-menu-tab-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 03 Mar 2021 03:38:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/4a14237b-34e3-4db1-8d96-b8ff4906d43d/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt="">
어쩌다보니 <code>react</code>가 욕심나서 <code>my page</code> 공통 <code>component</code>를 만들게 되었다ㅋㅋㅋㅋ</p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/21056b8f-60da-43b1-bba0-2ad612b49739/Mar-03-2021%2001-31-46.gif" alt=""></p>
<p>실제 사이트를 보면 해당 마이페이지에는 3부분으로 나눌 수 있게 되있다.</p>
<ul>
<li>Aside</li>
<li>Header</li>
<li>Article</li>
</ul>
<p>나는 그중에서 <code>Aside</code>, <code>Header</code>를 공통 컴포넌트로 만들고,
<code>Article</code>은 <code>menu tab</code>형식으로 url은 안바뀌지만 컴포넌트는 계속 바뀌는 형식으로 만드려고 한다.</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/02074267-a7f4-4372-b0e4-21de2417ae10/image.png" alt=""></p>
<h3 id="clickhandler">clickHandler()</h3>
<p><code>clickHandler()</code>는 해당 카테고리를 클릭했을때 실행된다. 각 카테고리는 <code>key</code>값으로 고유한 <code>id</code>를 가지고 있기 때문에 구분해서 나타낼 수 있다.</p>
<h3 id="mapping_obj">MAPPING_OBJ</h3>
<p>고유한 <code>id</code>값으로 <code>MAPPING_OBJ</code>에 <code>index</code>로 접근을 한다.
<code>setState</code>로 <code>currentId</code>로 바꿔주기 때문에 바뀔때마다 <code>Component</code>만 바꿀 수 있다.</p>
<p><code>Component</code> 각각에는 <code>render</code> 될때 <code>fetch</code>로 필요한 데이터를 받기 떄문에 독립적으로 실행될 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] Nav에서 조정하는데 전혀 상관없는 Product에서 리스트 받기?]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-Nav%EC%97%90%EC%84%9C-%EC%A1%B0%EC%A0%95%ED%95%98%EB%8A%94%EB%8D%B0-%EC%A0%84%ED%98%80-%EC%83%81%EA%B4%80%EC%97%86%EB%8A%94-Product%EC%97%90%EC%84%9C-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%B0%9B%EA%B8%B0</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-Nav%EC%97%90%EC%84%9C-%EC%A1%B0%EC%A0%95%ED%95%98%EB%8A%94%EB%8D%B0-%EC%A0%84%ED%98%80-%EC%83%81%EA%B4%80%EC%97%86%EB%8A%94-Product%EC%97%90%EC%84%9C-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%B0%9B%EA%B8%B0</guid>
            <pubDate>Tue, 02 Mar 2021 16:28:14 GMT</pubDate>
            <description><![CDATA[<p>어쩌다 보니 <code>Frontend</code>의 <code>react</code>까지 하게 되었다.
이것은 각각의 <code>Component</code>로 되어 있는 상태에서 <code>Category tab</code>을 이동하기 위한... 발악을 남겨보려 한다.</p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/1eed1768-50c9-4ebc-b370-bd2eb9ec141b/Mar-03-2021%2001-04-18.gif" alt=""></p>
<p>위와 같이 카테고리 탭을 누르면 <code>query parameter</code>로 전달이 되고 <code>fetch</code>가 되어야 할 것 같다.</p>
<p>근데 카테고리 자체가 <code>component</code>이며 아래의 product list도 <code>component</code>이다.
이 둘을 어떻게 연결시켜서 <code>productList</code>를 받을 수 있을까...</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/15effbd8-2440-48f7-b1c7-011175460ee5/image.png" alt=""></p>
<p>어떻게 해야할지 멘붕의 연속이었다.
뭔가 어거지로 껴 맞춰서 한 느낌이 없잖아 있지만..
과거의 나를 보며 웃을 미래의 나에게 보내는 블로깅이다....ㅋㅋㅋㅋㅋㅋ</p>
<h3 id="navjs에서는-url만-바꿔주기">Nav.js에서는 url만 바꿔주기!</h3>
<p>각 카테고리별로 누르게 되면 <code>menuChange()</code> 이벤트가 발생한다.
파라미터로는 <code>id</code>를 받는데 이 <code>id</code>란 각 카테고리의 <code>한글이름</code>이다.</p>
<p>따라서 이 <code>menuChange()</code>가 실행되면 
<strong>/product?category=문구</strong> 같은 형식이 된다.</p>
<h3 id="productlistjs">ProductList.js!!</h3>
<p><code>ProductList.js</code>에서는 바뀐 url를 기준으로 진짜 <code>fetch</code>를 보내 <code>productList</code>를 받는다.</p>
<p>이 <code>productList</code>는 <code>state</code>중 하나로 설정하여 바뀌면 <code>reRender</code>가 되게 한다.
<code>getProductList()</code>를 만들어서 현재 주소에 대한 리스트를 받는다.</p>
<h4 id="componentdidmount">componentDidMount()</h4>
<p>처음 카테고리를 선택해서 실행하게 되면 해당 이름이 고정된다.
예) 전체 누르면 <code>category=&#39;전체&#39;</code></p>
<h4 id="componentdidupdate">componentDidUpdate()</h4>
<p>처음 카테고리를 누른 상태에서 다른 카테고리로 가면 <code>fetch</code>를 실행하는 로직이 없기에 변화가 없다.</p>
<p>그래서 <code>componentDidUpdate</code>를 만들어서 현재 <code>category</code>값과 다르다면 <code>getProductList()</code>를 다시 실행하고 <code>setState</code>를 현재 <code>category</code>값으로 변경해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] 제일 복잡한 마이페이지 메인 어서오고~ MyPageMainView]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EC%A0%9C%EC%9D%BC-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EB%A7%88%EC%9D%B4%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A9%94%EC%9D%B8-%EC%96%B4%EC%84%9C%EC%98%A4%EA%B3%A0-MyPageMainView</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EC%A0%9C%EC%9D%BC-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EB%A7%88%EC%9D%B4%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A9%94%EC%9D%B8-%EC%96%B4%EC%84%9C%EC%98%A4%EA%B3%A0-MyPageMainView</guid>
            <pubDate>Tue, 02 Mar 2021 15:58:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/3a447c1d-aebb-4a14-b59c-4827de979383/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt=""></p>
<p>이번에 볼 코드는 MyPage중에서도 메인이다.
비록 우리 프로젝트에서는 시간관계상 구현을 하지 못한 부분이지만,
<code>View</code>로는 구현을 해놨었다!</p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/288ce054-7ca1-44fa-9016-afc3040aa1f3/Mar-03-2021%2000-39-51.gif" alt=""></p>
<p>마이페이지 메인에는 보여줘야 할 부분이 많은것 같다.</p>
<ol>
<li>사용자 이름, 회원등급</li>
<li>쿠폰, 적립금</li>
<li>진행 중인 주문(<code>order_status</code>, <code>product_status</code>)</li>
<li>최근 주문 정보</li>
<li>최근 본 상품</li>
</ol>
<p>하지만 여기서 우리는 최근 주문 정보는 생략하고 나머지를 구현하기 결정했고,
그것을 제외한 것을 다 객체 <code>key/value</code>로 보내줘야 할 것 같다!</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/aa1d353a-83cc-40b5-a9cc-c34c20e0813e/image.png" alt=""></p>
<h3 id="my-page-header">my page header</h3>
<p>이 부분은 유저의 이름, 등급, 포인트, 쿠폰이 들어가는데
각각의 테이블이 존재해서 해당 테이블에 접근해서 <code>count()</code>, <code>first()</code>, <code>request.user</code>를 이용하여 이름과 등급을 구해주었다.</p>
<h3 id="order-status">order status</h3>
<p>이것도 간소화하여 진행을 하였는데,
입금대기와 같은 상태들만 나타내서 보여주기 하였다.</p>
<p>하지만 그 과정은 절대 쉽지 않았는데...</p>
<p><code>order_status</code>별로 카운팅을 하는 <code>ORM</code>을 짜는것이 쉽지 않았다.</p>
<p>나는 <code>SQL문</code>이 더 익숙해서 먼저 <code>SQL문</code>으로 짜보고 난뒤
<code>group_by()</code>와 <code>annotate()</code>, <code>count()</code>로 구현을 했다.</p>
<h3 id="recently-view">recently view</h3>
<p>어차피 이 공간에는 상위 4개만 들어가기 때문에 4라는 숫자를 상수로 지정해서 사용했다.</p>
<p>생성된 날짜순으로 <code>order_by()</code>사용했고,
<code>distinct()</code>를 사용해서 중복값을 제거하고 나타내주었다.
(동일한 상품이 나오면 안되니까!)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] 고갱님... 구매확정 해주세요... OrderListView]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EA%B3%A0%EA%B0%B1%EB%8B%98...-%EA%B5%AC%EB%A7%A4%ED%99%95%EC%A0%95-%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94...-OrderListView</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EA%B3%A0%EA%B0%B1%EB%8B%98...-%EA%B5%AC%EB%A7%A4%ED%99%95%EC%A0%95-%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94...-OrderListView</guid>
            <pubDate>Mon, 01 Mar 2021 03:08:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/d49d3b0e-cc07-4de3-b610-6308da8e0460/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt=""></p>
<p>이제 프로젝트의 끝 마무리가 다가온다.
오늘은 저번에 이어서 <strong>주문된 상품에 대하여 구매확정/배송중/입금완료 등과 같은 <code>order_status</code>를 담고, 각 상품에 대한 취소/반품/환불/구매확정의 상태를 말해주는 <code>order_product_status</code>를 담고 있는 <code>order_list</code>를 리뷰</strong>해 보겠다.</p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/58bacb2d-3fce-402e-9e8f-b75cd38b5881/Mar-01-2021%2011-58-01.gif" alt=""> </p>
<p>저번과 마찬가지로 물품을 구매하지 않아서 어떻게 로직이 구성되어 있는지 알 수 없었다.
그래서 생각으로 이렇게 되어 있지 않을까... 하며 로직을 짰다.</p>
<p>우선 나는 아래의 것들에 유의하며 코딩을 했다.</p>
<ul>
<li>입금대기/입금완료/배송중/배송완료의 <code>order_status</code>가 있다.</li>
<li>배송완료가 된 주문들에 한해서만 취소/환불/교환/구매확정을 할 수 있다. 이것은 <code>product_status</code>이다.</li>
<li>구매확정을 하면 해당 <code>status</code> 값을 변경해준다. (PATCH)</li>
<li>변경해주고 <code>review</code>를 쓸 수 있게 하고 등록하게 한다.</li>
<li>쓴 리뷰는 바로 이동하여 볼 수 있게 한다.</li>
</ul>
<p>하지만 내 코드는 시간의 부족상 취소/환불/교환 같은 <code>status</code>를 바꿔주는 로직은 작성하지 못했다...😂</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/c1cb9928-ab61-4674-ab4f-f47b775c90d5/image.png" alt=""></p>
<h3 id="get은-저번시간의-get_order_list">GET은 저번시간의 get_order_list!</h3>
<p><code>GET method</code>는 저번과 같다.</p>
<h3 id="post가-아닌-patch">POST가 아닌 PATCH?</h3>
<p>좀 더 RESTful한 방법이 뭘까 고민했다.
<code>PUT</code>과 <code>PATCH</code>가 생긴 후론 <code>POST</code>는 생성에 집중되는 것 같다.
그래서 단순히 <code>status</code>를 변경해주는 것은 <code>PATCH</code>로 했다.</p>
<p>이번 코드에서는 <code>status=4</code>로 변경하게 했는데.. 이 부분이 참 아쉽다.
4번은 구매확정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] 별점 달려면 상품을 사야지? ReviewView]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EB%B3%84%EC%A0%90-%EB%8B%AC%EB%A0%A4%EB%A9%B4-%EC%83%81%ED%92%88%EC%9D%84-%EC%82%AC%EC%95%BC%EC%A7%80-ReviewView</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EB%B3%84%EC%A0%90-%EB%8B%AC%EB%A0%A4%EB%A9%B4-%EC%83%81%ED%92%88%EC%9D%84-%EC%82%AC%EC%95%BC%EC%A7%80-ReviewView</guid>
            <pubDate>Sun, 28 Feb 2021 13:49:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/7dc195f8-694e-4e83-8fc3-7f5c80c37eb3/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt=""></p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/901c6055-c25e-46d7-9444-41abcf37555d/Feb-28-2021%2022-33-33.gif" alt=""></p>
<p>리뷰는 상품을 사야만 쓸 수 있어서 이번 코드는 내 머리속으로 구현을 해 보았다!</p>
<p>일단,
<code>별점</code>이 있고, <code>제목</code>이 있고, <code>내용</code>이 있다.
<code>아이디</code>를 받고 <code>create_at</code>이 있는것 같다.</p>
<p>상품을 구매하고 별점을 쓰게 하려면, 일단 다음의 순서가 필요할 것 같다.</p>
<ol>
<li>상품을 구매한다.</li>
<li>구매확정을 한다.</li>
<li>구매확정이 된 주문에 한해서 리뷰를 쓰게 한다.
(<code>review</code>와 <code>order</code>를 이어주는 <code>matching_review</code>테이블을 만들어서 동시에 <code>create</code>해준다.)</li>
<li>이미 <code>matching_review</code>에 연결된 <code>review</code>가 있다면 리뷰를 못쓰게 한다.</li>
</ol>
<p>이것을 바탕으로 <code>POST</code>를 중심으로 코드를 짜보도록 한다.</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/e3a2e905-b828-46bf-a834-a4db8fca3ec1/image.png" alt=""></p>
<h3 id="get은-그냥-뿌려">GET은 그냥 뿌려!</h3>
<p><code>request.user</code>를 통해 <code>user_id</code>값을 받고 그것을 <code>list comprehension</code>을 통해 <code>Json</code>으로 보내준다.</p>
<h3 id="자-천천히-해보자-post">자... 천천히 해보자 POST</h3>
<p>일단 <code>matching_review</code>테이블에 <code>product_id</code>와 <code>order_id</code>를 가지고 있는 데이터가 있는지 확인한 후 없다면 <code>review</code>를 쓰게 한다.</p>
<h4 id="잠깐-transaction-왜">잠깐, Transaction?! 왜????</h4>
<p>두가지 상황을 막기 위해서다.</p>
<ol>
<li><code>review</code>에 글을 썼는데, <code>matching_review</code>에 안쓰였다면, <code>review</code>를 또 쓸 수 있게 한다.</li>
<li><code>review</code>를 안썬느데 <code>matching_review</code>에 데이터가 있다면 <code>review</code>를 쓰지도 못한다.</li>
</ol>
<p>그레서 두 테이블에 모두 데이터가 정상적으로 등록이 될때만 데이터가 등록되도록 설정을 한다.</p>
<h4 id="get_order_list">get_order_list?</h4>
<p><img src="https://images.velog.io/images/code_sign/post/6aebe6f3-2d0e-48ab-9ef6-e7fae51041a4/image.png" alt=""></p>
<p>리뷰를 보여주는 목록은 상품 디테일 페이지에서도 보여줄 수 있지만,
<code>My Page</code>에서도 연결시켜 줄 수 있기에 코드의 재사용을 줄이려 함수로 선언하고 사용했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[배민문방구] 찜목록을 만들고 싶어! ProductLikeView]]></title>
            <link>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EC%B0%9C%EB%AA%A9%EB%A1%9D%EC%9D%84-%EB%A7%8C%EB%93%A4%EA%B3%A0-%EC%8B%B6%EC%96%B4-ProductLikeView</link>
            <guid>https://velog.io/@code_sign/%EB%B0%B0%EB%AF%BC%EB%AC%B8%EB%B0%A9%EA%B5%AC-%EC%B0%9C%EB%AA%A9%EB%A1%9D%EC%9D%84-%EB%A7%8C%EB%93%A4%EA%B3%A0-%EC%8B%B6%EC%96%B4-ProductLikeView</guid>
            <pubDate>Sun, 28 Feb 2021 13:15:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/8275010e-c707-4f5b-a025-0abbbcda5fa8/%E1%84%87%E1%85%A2%E1%84%86%E1%85%B5%E1%86%AB%E1%84%86%E1%85%AE%E1%86%AB%E1%84%87%E1%85%A1%E1%86%BC%E1%84%80%E1%85%AE.png" alt=""></p>
<h2 id="머리속으로-그려보기☀️">머리속으로 그려보기☀️</h2>
<p><img src="https://images.velog.io/images/code_sign/post/38d5cfae-68e6-4c59-81d9-47e033d981c9/Feb-28-2021%2022-03-15.gif" alt=""></p>
<p>배민의 경우에는 좀 독특한 방식의 찜하기를 지원하고 있다.
위에서처럼 하트를 누르는 동시에 찜리스트 목록으로 이동한다.</p>
<p>그리고 마치 생김새도 장바구니의 하위 호환처럼 생겼다.
(내가 생각한 찜목록과 전혀 다르다!)</p>
<p>이것을 구현하려면,
<strong>또 <code>RESTful</code>하게 하려면</strong>, <strong><code>GET</code>과 <code>POST</code>를 한번씩</strong> 해야하는건지,
아니면 <strong><code>POST</code>/<code>GET</code>에서 다른 것의 역할까지 해야하는지 많은 고민</strong>을 했다.</p>
<p>*<em>결국 <code>Frontend</code>에서 두번 요청하는 것으로 *</em>하였다.</p>
<h2 id="실제-코드-짜기🚀">실제 코드 짜기🚀</h2>
<p><img src="https://images.velog.io/images/code_sign/post/0419b922-00c1-4481-bc7d-10724a94058a/image.png" alt=""></p>
<p>일단 찜 기능은 회원을 타겟으로 한 기능이기에 <code>login-decorator</code>기능을 활용했다.</p>
<h3 id="my-page에서-볼-수-있는-get">My Page에서 볼 수 있는 GET</h3>
<p>일단 로직자체는 간단하다.
로그인을 성공하면 <code>login-decorator</code>에서 <code>request.user</code>에 <code>payload</code>에 담긴 정보를 담아준다. (유저 id)</p>
<p>그것을 바탕으로 <code>productlike_set</code>을 활용하여 모든것을 가져온다.
(<code>user</code>와 <code>productlike</code>는 M2M 관계다.)</p>
<h3 id="하트를-눌렀을때-delete_or_create">하트를 눌렀을때 delete_or_create</h3>
<p>찜을 처음하는 상품이라면 당연히 <code>create</code>를 하지만, 이미 찜한 상품이라면?!
그럴땐 <code>언팔</code>의 기능처럼 찜을 취소해야 할 것이다.
그래서 이미 있는 상품에 대해선 <code>delete</code>를 시켜준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WET_4 | [django] 두 앙숙이 만났다... offset-naive, offset-aware]]></title>
            <link>https://velog.io/@code_sign/WET4</link>
            <guid>https://velog.io/@code_sign/WET4</guid>
            <pubDate>Sun, 21 Feb 2021 13:59:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/8f8211b2-b977-4b81-8a85-66b69b1fffa8/WET.jpg" alt=""></p>
<h2 id="상황-🧑🏻💻">상황 🧑🏻‍💻</h2>
<p><img src="https://images.velog.io/images/code_sign/post/3aeacdfb-46fd-41f0-a0ee-d13750f9c64d/image.png" alt=""></p>
<p>프로젝트를 진행하던 도중 만난 에러🚫🚫🚫
<code>Frontend</code>가 <code>new</code>라는 이미지를 붙여주는 조건부 랜더링을 위해,
<code>MainView</code>에서 오늘 날짜와 <code>product</code>의 <code>create_at</code>의 날짜를 비교하여 나타내주어야 했다.</p>
<h2 id="🚨오류🚨">🚨오류🚨</h2>
<p><code>datetime.today()</code>과 <code>create_at</code>을 비교하는 <code>isNew()</code>함수를 실행하니 다음과 같은 에러가 나왔다.
<img src="https://images.velog.io/images/code_sign/post/516a579b-e01f-460b-b46e-c60775d9b095/image.png" alt=""></p>
<h2 id="💡해결💡">💡해결💡</h2>
<p>구글링을 통해 알아보니 결국은 이 문제다.
<code>offset-naive</code>타입과 <code>offset-aware</code>타입이 같지 않아서 연산을 할 수 없다....?</p>
<p><img src="https://i.ytimg.com/vi/ypoFO4f80lw/mqdefault.jpg" alt=""></p>
<p>그러니까..
<code>offset-naive</code>에는 날짜와 시간 정보만 담겨 있다.
근데 <code>offset-aware</code>은 날짜와 시간정보는 물론, 어디 지역에서 생성한 날짜 데이터라서 <strong>GMT+9라는 지역 정보까지 저장</strong>된다는 것이다.</p>
<p>실제로 <code>django</code>에서는 <code>offset-naive</code> 사용을 지양하고 <code>offset-aware</code>만을 사용하길 권장하고 있다.</p>
<p>그래서 나는 아래와 같이 해결하였다.
<img src="https://images.velog.io/images/code_sign/post/8f0b62fc-acfb-4839-98f5-3079db9938f0/image.png" alt=""></p>
<h2 id="error를-해결하고나서-느낌-💣">Error를 해결하고나서 느낌 💣</h2>
<p>오늘도 또 한차례 성공했구나.. 싶었다.
근데 이게 바쁜 프로젝트 중에 발생을 하여 귀중한 시간을 까먹으니 참 답답했다....</p>
<p>나와 같은 상황이 발생되지 않게 아래와 같이 <code>slack</code>에도 동기들과 공유도 하였다...❗️ 😎</p>
<p><img src="https://images.velog.io/images/code_sign/post/4a226f68-4039-4c40-8e70-ac9f366d86ec/%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-02-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.35.15.png" alt=""></p>
<p>이 글에 유입된 모든 분들도 저로 인해 시간을 아끼셨으면 좋겠다...!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[WECODE] 1st Project - 배민 문방구 START🚀]]></title>
            <link>https://velog.io/@code_sign/WECODE-1st-Project-%EB%B0%B0%EB%AF%BC-%EB%AC%B8%EB%B0%A9%EA%B5%AC-START</link>
            <guid>https://velog.io/@code_sign/WECODE-1st-Project-%EB%B0%B0%EB%AF%BC-%EB%AC%B8%EB%B0%A9%EA%B5%AC-START</guid>
            <pubDate>Sun, 21 Feb 2021 13:32:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/code_sign/post/aef5f347-536b-4ff4-a31d-090868b0fd7b/%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-02-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.59.50.png" alt=""></p>
<p><strong>WECODE의 2달차가 시작</strong>되었다!
그리고 내 팀은 <a href="https://store.baemin.com/">배민문방구</a>를 클론하는 걸로 정해졌다. </p>
<p>그래서 이름은? <strong>이백문방구!</strong>
(http status 200길만 걷자 해서 지어진 이름ㅋㅋㅋㅋ😁)</p>
<h2 id="project를-하며-가지는-개인적인-목표🚀">project를 하며 가지는 개인적인 목표🚀</h2>
<h4 id="backend">Backend</h4>
<ul>
<li><strong>[Modeling]</strong><ul>
<li>M2M 방식의 through, related_name을 이해 및 활용</li>
<li>foreignKey로 연결된 관계를 이해하고 CRUD 적용</li>
</ul>
</li>
<li><strong>[View]</strong><ul>
<li>다양한 CRUD 메소드 활용(__gt, only(), order_by(), distinct() 등...)</li>
<li>RESTful 방식을 활용한 http 활용</li>
<li>Query parameter 방식 이해 및 활용</li>
<li>Path parameter 방식 이해 및 활용</li>
<li>json 방식의 이해 및 활용</li>
<li>list-comprehension 방식 이해 및 활용</li>
<li>다양한 ORM method 이해 및 활용</li>
</ul>
</li>
<li><strong>[CSV]</strong><ul>
<li>csv 파일을 이용한 database data inserting</li>
</ul>
</li>
</ul>
<h4 id="frontend">Frontend</h4>
<ul>
<li><strong>[React]</strong><ul>
<li>class component 적용</li>
<li>call-back 함수를 이해 및 활용</li>
<li>state, props 개념 이해 및 활용</li>
<li>mock data 이해</li>
<li>fetch를 통한 통신 써보기</li>
</ul>
</li>
<li><strong>[SCSS]</strong><ul>
<li>nesting 이해 및 활용</li>
</ul>
</li>
<li><strong>[Flex]</strong><ul>
<li>다양한 속성들 활용</li>
</ul>
</li>
</ul>
<h4 id="공통">공통</h4>
<ul>
<li>git-hub의 익숙해지기</li>
<li>git-hub 컨벤션에 따라 commit, push 하기</li>
<li>trello를 통해 분담시스템 적응하기</li>
<li>asile 방식으로 사이트 구현하기</li>
</ul>
<h3 id="내가-맡은-부분은-fullstack">내가 맡은 부분은~? FullStack!</h3>
<p>사실은 <code>Backend</code>지만,
나는 사실 <strong>설연휴때 <code>react</code>를 공부</strong>했다!(욕심쟁이...ㅋㅋㅋㅋ)</p>
<p>그래서 이번 프로젝트에서 두 영역다 맡아서 진행하고 있다.
내 <span style="background-color:#FBF3DB"> 개인적인 욕심으로 인해 다른 팀원분들이 피해를 받지 않게 하는 것도 이번 프로젝트의 목표 중 하나</span>이다!</p>
<p>더 자세한 사항은 <a href="https://www.notion.so/ccddc9e2857c492a8c838be6edeecfd4">기술문서</a>에서 확인해주세요~ (PM희영님 감사합니다~)</p>
]]></description>
        </item>
    </channel>
</rss>