<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Hoontae.log</title>
        <link>https://velog.io/</link>
        <description>💻 STUDY RECORD</description>
        <lastBuildDate>Sun, 07 Nov 2021 16:23:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Hoontae.log</title>
            <url>https://images.velog.io/images/kim-hoontae/profile/742a33d2-647d-4f8a-848d-c355879aea16/KakaoTalk_20210705_234457152.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Hoontae.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kim-hoontae" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[wanted X wecode]]></title>
            <link>https://velog.io/@kim-hoontae/wanted-X-wecode</link>
            <guid>https://velog.io/@kim-hoontae/wanted-X-wecode</guid>
            <pubDate>Sun, 07 Nov 2021 16:23:37 GMT</pubDate>
            <description><![CDATA[<h1 id="나는-왜-개발자가-되기로-결심한-계기과정">나는 왜 개발자가 되기로 결심한 계기/과정</h1>
<p>전 직장에 입사를 하였을 때 새로운 전산 프로그램의 배포 날짜와 겹쳐 입사를 하게 되었다. 기존의 있던 전산프로그램보다 편의성에서는 높았지만 첫 배포이기에 기존에 직원들이 편리하게 사용하던 기능들은 없었다. 그렇게 개발자와 사용자의 입장에서 지속적인 피드백이 오갔고 불편사항들이 개선되어 편의성 있는 프로그램으로 변화가 되는 과정을 지켜보았다. 개발자라는 직업과 처음으로 의사소통을 해봤고 컴퓨터라는 기계로 정말 많은 것을 할 수 있다는 것에 대해서 큰 흥미가 생겼다. 정말 많은 것을 만들 수 있으며 잘 만든 서비스 하나로 삶의 편의성이 달라질수 있다는 것을 보고 나도 할 수 있을까? 하고싶다! 나도 누군가에게 편의성을 줄 수 있는 프로그램을 만들어보고싶다라는 생각이 가장 크게 다가왔고 개발자는 모든 순간이 도전이라는 생각을 하게 되었고 계속 변화하는 시대에 맞게 성장을 해야한다는점에서 크게 매료되어 개발자가 되기로 하였다.</p>
<h1 id="내가-위코드-x-원티드-프리온보딩에-참여하게-된-동기이유">내가 위코드 x 원티드 프리온보딩에 참여하게 된 동기/이유</h1>
<p>3개월의 위코드 과정이 끝나고 취업과 CS공부를 겸하면서 시간을 보내고 있었다. 함께하던 개발에서 혼자 시작하게 된 이후 배워야할 일이 무궁무진하게 펼쳐진 개발자의 길에서 방향성이 혼란스러워질때쯤 협업에 대한 목마름이 있었다. 혼자보다는 함께 하는것이 즐겁고 시작과 과정이 어렵지만 결과가 좋지 않더라도 과정이 즐겁고 행복하면 만족스럽고 함께 하면 소통을 통해 더 배울수 있는 부분이 있기에 또 더욱 함께 이 길을 같이 걸어가기로 다짐한 사람들과 이야기를 나누고 싶었기에 참여하게 되었다.</p>
<h1 id="나는-앞으로-어떤-개발자가-되고-싶은가">나는 앞으로 어떤 개발자가 되고 싶은가?</h1>
<p>소통을 통해서 함께 성장하는 개발자가 되고 싶다. 사람마다 개발하는 스타일이 다르고 성격도 모두 다르다. 하지만 많은 생각이 합쳐져 수많은 갈림길 속에서 하나씩 선택해 나가며 불필요한 방향은 배재하고 쭉쭉 나아가 그렇게 최종목적지에 도달하는게 개발이라고 생각한다. 분명 혼자 개발을 잘 할 수 있다. 하지만 그 잘하는 개발자도 분명 함께 했을때 더 큰 영향력과 시너지를 발산 할 수 있다고 생각한다. 함께 성장하면서 같은 목적지에 도착 할 수 있는 그런 개발자가 목표이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ASSIGNMENT 1.  후기 ]]></title>
            <link>https://velog.io/@kim-hoontae/ASSIGNMENT-1.-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@kim-hoontae/ASSIGNMENT-1.-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Wed, 03 Nov 2021 10:46:50 GMT</pubDate>
            <description><![CDATA[<h1 id="원티드-프리온보딩-시작">원티드 프리온보딩 시작</h1>
<p>개발자로써의 커리어 전환을 위하여 위코드 3개월 과정을 끝내고 한달간 생각을 정리하고 부족한게 무엇인지 정리하는 시간을 갖던중 원티드와 위코드가 콜라보하여 프리온보딩 과정을 준비하고 있기에 함께 시작하는 개발자들과의 커뮤니케이션 및 협업을 다시 경험하고 싶었기에 준비를 하고 시작하게 되었습니다.</p>
<h2 id="assignment">ASSIGNMENT</h2>
<p>팀원 6명 중 사용한 프레임워크가 같은 3명씩 나눠서 진행하였습니다. 처음 경험하는 NoSQL인 mongoDB를 사용함에 있어 자신이 없었지만 백번 생각하는것보다 한번 시도해보는게 더욱 큰 경험이 될 수 있다는 것을 알게 되었고 모두가 처음 경험하는 것들에 있어서 지식을 공유했고 각자 하고자하는 파트를 나눠 좋은 방법을 서로 공유하며 진행을 하였고 먼저 끝낸 팀원이 마무리 하지 못한 팀원을 서로 도와가면서 다같이 할 수 있었습니다. 
한달간의 과정중 일주일에 2번의 팀과제가 있다는 말을 듣고 처음을 경험해보니 생각보다 시간적 여유가 없었지만 같은 목표를 가지고 협업하여 진행하는 과제는 혼자서는 알기 힘들었던 부분을 채워주는점이 있었고 개발에 좀 더 집중하고 여러가지를 시도 해볼수 있었기에 많은 경험을 할 수 있을거라는 기대감을 가지게 되었습니다.</p>
<h2 id="앞으로의-각오">앞으로의 각오</h2>
<p>아직 8번 중 1번의 과제를 했을 뿐이었는데 여유를 가지고 하기 보다는 시간에 쫒겼던 느낌이 강하게 다가와서 시간활용에 대하여 다시 생각해볼 수 있는 계기가 되었고 시작이 반이라는 말처럼 한달간 많이 배우고 성장할 수 있다고 믿고 있습니다. 할 수 있는것에 최선을 다하며 부족한 점을 채워주는 그런 개발자로 잘 마무리 해보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.23 MongoDB? django 연동]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.23-MongoDB</link>
            <guid>https://velog.io/@kim-hoontae/TIL.23-MongoDB</guid>
            <pubDate>Wed, 03 Nov 2021 10:25:54 GMT</pubDate>
            <description><![CDATA[<h1 id="nosql-mongodb">NoSQL? MongoDB</h1>
<p>처음 과제를 하게 되었을 때 필수 요구 사항이 NoSQL중 하나인 mongoDB를 사용하는것 이었습니다. 관계형데이터베이스인 RDBMS의 종류인 MySQL과 mariaDB만 사용경험이 있어 처음에는 당황했지만 사용하기로 한 프레임워크인 django에 mongoDB를 연결하는 방법으로 진행하였습니다.</p>
<h2 id="db연동">DB연동</h2>
<p>터미널을 통해 db 설치하고 django의 settings.py 에 데이터베이스를 변경해주고 마이그레이트를 통해 db를 연동하였습니다.</p>
<pre><code class="language-python">DATABASES = {
    &#39;default&#39;: {
        &#39;ENGINE&#39;: &#39;djongo&#39;,
        &#39;NAME&#39;: &#39;db_name&#39;,
        &#39;HOST&#39;: &#39;localhost&#39;,
        &#39;PORT&#39;: 27017,
    }
}</code></pre>
<h2 id="간단한-명령어">간단한 명령어</h2>
<pre><code>- 시작
mongo

- db확인
show dbs

- db사용 , db생성
use db명

- collection 생성
db.createCollection(&quot;[COLLECTION_NAME]&quot;)

- collection 목록 확인, mysql로 치면 table이라고 생각하면됨
show collections

- collection안에 데이터 생성, json 형식, Document생성
db.cllection_name.insert({&quot;name&quot;:test&quot;,&quot;email&quot;:&quot;test@gmail.com&quot;})

- Document 삭제
db.person.remove({&quot;name&quot;:&quot;test&quot;})

- collection 데이터 확인
db.collection_name.find()

- collection 삭제
db.collection_name.drop()

- db 삭제 
db.dropDatabase_name()
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.22 MySQL CASE]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.22-MySQL-CASE</link>
            <guid>https://velog.io/@kim-hoontae/TIL.22-MySQL-CASE</guid>
            <pubDate>Sun, 31 Oct 2021 14:49:52 GMT</pubDate>
            <description><![CDATA[<h1 id="case-문">CASE 문</h1>
<pre><code>CASE WHEN 조건식1 THEN 식1
     WHEN 조건식2 THEN 식2
     ELSE 식3
END</code></pre><ul>
<li>NULL값은 RDBMS에 갖추어져 있는 기존의 연산자나 함수만으로는 처리할 수 없다.</li>
<li>WHEN 절에는 참과 거짓을 반환하는 조건식을 기술한다.</li>
<li>참이되는 경우는 THEN 절에 적용한 식이 처리된다.</li>
<li>ELSE절의 경우 어느 것에도 참에 해당하지 못할 경우 적용된다.</li>
<li>ELSE는 생략이 가능하며 생략시 &#39;ELSE NULL&#39;로 간주하여 ELSE 값들은 NULL이된다.<h1 id="null-값을-0으로-변환하기">NULL 값을 0으로 변환하기</h1>
<pre><code>SELECT upper_code, CASE WHEN upper_code IS NULL THEN 0 ELSE upper_code END &quot;upper_code(null=0)&quot; FROM options;</code></pre><ul>
<li>upper_code 가 IS NULL 일 경우 0을 반환하고 아닌경우(ELSE) upper_code의 값을 반환<h2 id="coalesce">COALESCE</h2>
<pre><code>SELECT upper_code, COALESCE(upper_code,0) FROM options;</code></pre></li>
<li>COALESCE 함수를 사용하면 간편하게 NULL을 변환할 수 있다.</li>
<li>NULL이 아닌 경우 가장 앞에 있는 인수의 값을 반환</li>
<li>앞에 있는 인수가 NULL일 경우 뒤에 값을 반환하여 0이 반환된다.<h1 id="또-다른-case문">또 다른 CASE문</h1>
```</li>
</ul>
<ol>
<li>검색 CASE
SELECT upper_code AS &#39;상위코드&#39;, 
CASE WHEN upper_code=0 THEN &#39;면허&#39; 
WHNE upper_code=1 THEN &#39;언어&#39; 
ELSE &#39;그외&#39; 
END AS &#39;코드&#39; from options;<pre><code></code></pre></li>
<li>단순 CASE
SELECT upper_code AS &#39;상위코드&#39;, 
CASE upper_code 
WHEN 0 THEN &#39;면허&#39; 
WHNE 1 THEN &#39;언어&#39; 
ELSE &#39;그외&#39; 
END AS &#39;코드&#39; from options;
```</li>
</ol>
<ul>
<li><code>검색</code> CASE의 경우 WHEN 뒤에 &#39;조건식&#39; THEN 뒤에 &#39;식&#39;</li>
<li><code>단순</code> CASE의 경우 WHEN 뒤에 &#39;식&#39; THEN 뒤에 &#39;식&#39;</li>
<li>숫자로 이루어진 코드를 알아보기 더 쉽게 문자열로 변환하는 경우 CASE문을 사용</li>
<li>디코드는 문자화 시키는것 1 = &#39;언어&#39;</li>
<li>인코드는 수치화 시키는것 &#39;언어&#39; = 1</li>
</ul>
</li>
</ul>
<h1 id="case-사용시-주의사항">CASE 사용시 주의사항</h1>
<ul>
<li>SELECT , WHERE, ORDER BY 구에서 사용할 수 있다.</li>
<li>ELSE를 생략할 경우 NULL이 되기에 지정하는 편이 낫다.</li>
</ul>
<h1 id="when에-null-지정하기">WHEN에 NULL 지정하기</h1>
<pre><code>1. 검색 CASE (사용O)
SELECT upper_code AS &#39;상위코드&#39;, 
CASE WHEN upper_code=0 THEN &#39;면허&#39; 
     WHEN upper_code=1 THEN &#39;언어&#39; 
     WHEN upper_code IS NULL THEN &#39;데이터 없음&#39;
ELSE END AS &#39;코드&#39; from options;</code></pre><pre><code>2. 단순 CASE (사용X)
SELECT upper_code AS &#39;상위코드&#39;, 
CASE upper_code 
WHEN 0 THEN &#39;면허&#39; 
WHEN 1 THEN &#39;언어&#39;
WHEN NULL THEN &#39;데이터 없음&#39;
ELSE END AS &#39;코드&#39; from options;</code></pre><ul>
<li>단순 CASE의 경우 upper_code=0, upper_code=1, upper_code=NULL 형식으로 처리됨  </li>
<li>따라서 비교연산자로 a = NULL은 참이 되지 않기에 단순 CASE에서 사용 불가</li>
<li>검색 CASE로 사용가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 21 MySQL 문자열, 날짜 연산]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.-21-MySQL-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%A0%EC%A7%9C-%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@kim-hoontae/TIL.-21-MySQL-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%A0%EC%A7%9C-%EC%97%B0%EC%82%B0</guid>
            <pubDate>Fri, 22 Oct 2021 07:35:26 GMT</pubDate>
            <description><![CDATA[<h1 id="문자열-연산">문자열 연산</h1>
<ul>
<li>&#39; + &#39; = SQL Server</li>
<li>&#39; || &#39; = Oracle, DB2, PostgreSQL</li>
<li>CONCAT = MySQL</li>
</ul>
<h2 id="1-concat">1. CONCAT</h2>
<pre><code>SELECT CONCAT(name,price) FROM products;</code></pre><p>상품의 이름과 가격의 문자열 결합
이름은 문자형, 가격은 숫자형이지만 문자열 결합이 가능하며 결합하게되면 문자형으로 변경된다.</p>
<h2 id="2-substring-함수">2. SUBSTRING 함수</h2>
<pre><code>날짜로 예를 들어 년도를 추출 할 때 1번째부터 4개의 문자를 추출
SUBSTRING(&#39;19940430&#39;,1,4) -&gt; &#39;1994&#39;
월을 추출 5번째부터 2개 추출
SUBSTRING(&#39;19940430&#39;,5,2) -&gt; &#39;04&#39;
일을 추출 7번째부터 2개 추출
SUBSTRING(&#39;19940430&#39;,7,2) -&gt; &#39;30&#39;</code></pre><h2 id="3-trim-함수">3. TRIM 함수</h2>
<p>문자열의 스페이스가 있는 경우 스페이스를 제거해주는 함수</p>
<pre><code>TRIM(&#39;hoontae     &#39;) -&gt; &#39;hoontae&#39;</code></pre><h1 id="날짜-연산">날짜 연산</h1>
<h2 id="시스템-날짜-확인">시스템 날짜 확인</h2>
<pre><code>SELECT CURRENT_TIMESTAMP;</code></pre><p>함수이지만 따로 인수가 필요없는 특수한 함수</p>
<ul>
<li>FROM 구를 사용하지않아도 되지만 Oracle의 경우는 FROM구를 작성해주어야한다.<h2 id="날짜의-덧셈과-뺄셈">날짜의 덧셈과 뺄셈</h2>
<pre><code>SELECT CURRENT_DATE + INTERVAL 1 DAY;</code></pre>숫자의 경우 -1로 하면 전날 날짜를 표시하거나 &#39; + &#39;를 &#39; - &#39;로 바꾼다.</li>
</ul>
<h2 id="지정한-날로-부터-사이의-기간">지정한 날로 부터 사이의 기간</h2>
<pre><code>SELECT DATEDIFF(&#39;2021-10-22&#39;,&#39;1994-04-30&#39;);</code></pre><p>앞 날짜와 뒷 날짜를 선택하여주고 그 사이의 몇일의 차이가 나는지 알 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.20 MySQL 수치연산]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.20-%EC%88%98%EC%B9%98-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@kim-hoontae/TIL.20-%EC%88%98%EC%B9%98-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%B0%EC%82%B0</guid>
            <pubDate>Thu, 21 Oct 2021 06:47:18 GMT</pubDate>
            <description><![CDATA[<h1 id="수치연산">수치연산</h1>
<h2 id="1-select-구로-연산">1. SELECT 구로 연산</h2>
<pre><code>SELECT * ,price * stock FROM products;</code></pre><p>가격과 재고량의 곱한 값</p>
<h2 id="2-컬럼명-임시변경">2. 컬럼명 임시변경</h2>
<pre><code>1. SELECT * ,price * stock AS total FROM products;
2. SELECT * ,price * stock total FROM products;
3. SELECT * ,price * stock &quot;총합&quot; FROM products;</code></pre><ul>
<li>AS뒤에 변경할 명칭 작성가능하며 AS를 생략 가능하다.</li>
<li>한글을 사용할 때에는 &quot; &quot;(큰 따옴표)를 사용해야한다. </li>
<li>&#39; , &#39; 로 구분하여 복수의 식을 지정 가능, 각각 명칭을 부여할 수 있고 중복명칭도 가능하고 에러가 발생하지 않지만 프로그래밍 언어에선 문제가 발생할 수 있기에 다르게 지정한다.</li>
<li>&quot; &quot; 는 데이터베이스 객체명, &#39; &#39;은 문자열 상수인 점을 인지하고 사용해야한다.</li>
<li>SELECT나 FROM 같은 예약어에는 &quot; &quot;을 꼭 붙여준다.</li>
</ul>
<h2 id="3-where-구로-연산">3. WHERE 구로 연산</h2>
<pre><code>1. SELECT * ,price * stock AS total FROM products WHERE price * stock &gt; 1000000; O
2. SELECT * ,price * stock AS total FROM products WHERE total &gt; 1000000; X</code></pre><p>총 합이 100만원 이상일 경우만 검색
WHERE구의 경우 SELECT구 보다 먼저 실행되기 때문에 변경된 명칭 &quot;total&quot;을 사용 할 수 없다.</p>
<h2 id="4-null-값-연산">4. NULL 값 연산</h2>
<p>보통 프로그래밍 언어에서는 NULL값은 유효한 값이 없으므로 같이 연산한 값이 나오지만
SQL에서는 NULL값은 0으로 처리가 되지않으므로 NULL이된다.</p>
<h2 id="5-order-by구에서-연산">5. ORDER BY구에서 연산</h2>
<pre><code>1. SELECT * ,price * stock AS total FROM products ORDER BY price * stock DESC;
2. SELECT * ,price * stock AS total FROM products ORDER BY total DESC;</code></pre><p>ORDER BY구에서도 연산하여 정렬 할 수 있습니다.
SELECT 구보다 ORDER BY구가 나중에 진행되기 때문에 WHERE구와는 다르게 &quot;total&quot;이라는 변경된 명칭을 사용 할 수 있습니다.</p>
<blockquote>
<p>WHERE -&gt; SELECT -&gt; ORDER BY 순서로 진행 된다.</p>
</blockquote>
<h2 id="6-함수-mod">6. 함수 MOD</h2>
<p>10 % 3 = 1
MOD(10,1) = 1
MOD는 MySQL이나 Oracle 등에서 사용할 수 있는 함수로 % 나머지 연산자와 비슷하다.</p>
<h2 id="7-round-함수">7. ROUND 함수</h2>
<pre><code>1. SELECT price, ROUND(price) FROM products;
2. SELECT price, ROUND(price,1) FROM products;</code></pre><ul>
<li>소수점을 반올림 해주는 함수이다.</li>
<li>반올림할 소수점 앞과 뒤의 자릿수를 지정할 수 있다. -1, 0, 1을 예로들면</li>
<li>-1은 소수점 앞 첫번째 자리</li>
<li>0은 소수점 뒷 첫번째 자리</li>
<li>1은 소수점 뒤 두번째 자리</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.19 MySQL 정렬]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.19-MySQL-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@kim-hoontae/TIL.19-MySQL-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Wed, 20 Oct 2021 14:52:29 GMT</pubDate>
            <description><![CDATA[<h1 id="order-by-정렬">ORDER BY 정렬</h1>
<h2 id="1-where-뒤에-order-by-지정">1. WHERE 뒤에 ORDER BY 지정</h2>
<pre><code>SELECT * FROM user WHERE age &gt; 21 ORDER BY age;</code></pre><p>21살 보다 많은 나이 순서로 정렬</p>
<h2 id="2-from-뒤에-order-by-지정">2. FROM 뒤에 ORDER BY 지정</h2>
<pre><code>SELECT * FROM user ORDER BY age;</code></pre><h2 id="3-내림차순-desc">3. 내림차순 DESC</h2>
<pre><code>SELECT * FROM user ORDER BY age DESC;</code></pre><h2 id="4-오름차순-asc">4. 오름차순 ASC</h2>
<pre><code>SELECT * FROM user ORDER BY age ASC;</code></pre><p>오름차순은 자동으로 정렬되기때문에 사용하지 않아도되고 ASC를 사용해도된다.
그러므로 ORDER BY의 기본 정렬은 오름차순이다.</p>
<h2 id="5-대소관계">5. 대소관계</h2>
<ul>
<li>숫자형과 문자형으로 나눌수 있다.</li>
<li>숫자형의 경우 1, 2, 3 ~ 100 순으로 크기가 커지는데로 나눌 수 있다.</li>
<li>문자형의 숫자일 경우 1,2,10,11 이 아닌 1, 10, 11, 2 순으로 정렬된다.(<strong>주의!!!</strong>)</li>
<li>문자형의 경우 한글은 자음 ㄱ,ㄴ,ㄷ ~ ㅎ, 모음 ㅏ,ㅑ,ㅓ ~ ㅣ 순서로 정렬</li>
<li>문자형 영어는 알파벳 순서 a,b,c ~ z 순서로 정렬</li>
</ul>
<h2 id="order-by는-테이블에-영향을-주지-않는다">ORDER BY는 테이블에 영향을 주지 않는다!!!</h2>
<p>SELECT문으로 데이터를 검색하는 명령이기때문에 테이블을 변경하지는 않는다.</p>
<h1 id="복수의-열을-정렬">복수의 열을 정렬</h1>
<h2 id="1-조건이-있을-경우-where문-사용-가능하다">1. 조건이 있을 경우 WHERE문 사용 가능하다.</h2>
<pre><code>SELECT * FROM user WHERE age &gt; 21 ORDER BY height[ASC,DESC] , weight[ASC,DESC];</code></pre><p>키와 몸무게 2개의 컬럼이 있다고 가정한다.</p>
<h2 id="2-2개-이상의-열컬럼중-1개의-컬럼만-지정">2. 2개 이상의 열(컬럼)중 1개의 컬럼만 지정</h2>
<pre><code>SELECT * FROM user ORDER BY height;</code></pre><p>키만 정렬이 되고 몸무게는 따로 정렬이 되지 않는다.</p>
<h2 id="3-2개의-컬럼을-지정">3. 2개의 컬럼을 지정</h2>
<pre><code>SELECT * FROM user ORDER BY height,weight;</code></pre><p>키와 몸무게 모두 정렬된다. 키를 기준으로 먼저 정렬하고 몸무게가 정렬</p>
<h2 id="4-컴럼의-위치-변경">4. 컴럼의 위치 변경</h2>
<pre><code>SELECT * FROM user ORDER BY weight,height;</code></pre><p>몸무게를 기준으로 먼저 정렬한다음 키가 정렬된다.</p>
<h2 id="5-desc를-사용하여-내림차순-정렬">5. DESC를 사용하여 내림차순 정렬</h2>
<pre><code>SELECT * FROM user ORDER BY height ASC,weight DESC;</code></pre><p>키를 먼저 오름차순으로 정렬하고 몸무게는 내림차순으로 정렬</p>
<h2 id="6-null-값-정렬">6. NULL 값 정렬</h2>
<p>MySQL에서는 NULL 값을 가장 작은 값으로 취급 ASC에서 가장 먼저 DESC에서 가장 나중에 표시된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.18 MySQL 패턴 매칭 검색]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.18-MySQL-%ED%8C%A8%ED%84%B4-%EB%A7%A4%EC%B9%AD-%EA%B2%80%EC%83%89</link>
            <guid>https://velog.io/@kim-hoontae/TIL.18-MySQL-%ED%8C%A8%ED%84%B4-%EB%A7%A4%EC%B9%AD-%EA%B2%80%EC%83%89</guid>
            <pubDate>Tue, 19 Oct 2021 14:26:15 GMT</pubDate>
            <description><![CDATA[<h1 id="like-패턴">LIKE 패턴</h1>
<blockquote>
<p>WHERE 열(컬럼) LIKE &#39;패턴&#39;;</p>
</blockquote>
<p>패턴을 정의할 때 사용할 수 있는 메타문자</p>
<ul>
<li><strong>&#39; % &#39;</strong>는 임의의 문자열을 의미 </li>
<li><strong>&#39; _ &#39;</strong>는 임의의 문자하나를 의미</li>
</ul>
<h2 id="1-전방일치">1. 전방일치</h2>
<pre><code>SELECT * FROM products WHERE description LIKE &#39;text%&#39;;</code></pre><p>&#39;text&#39;라는 문자열로 시작되는 행만을 검색</p>
<h2 id="2-중간일치">2. 중간일치</h2>
<pre><code>SELECT * FROM products WHERE description LIKE &#39;%text%&#39;;</code></pre><p>&#39;text&#39;라는 문자열이 포함된 모든 행을 검색</p>
<blockquote>
<p>% 는 임의의 문자열과 매치하며, 빈문자열도 매치함
그렇기에 문자열의 앞과 뒤에 문자열이 없어도 검색함</p>
</blockquote>
<h2 id="3-후방일치">3. 후방일치</h2>
<pre><code>SELECT * FROM products WHERE description LIKE &#39;%text&#39;;</code></pre><p>&#39;text&#39;라는 문자열로 끝나는 행만을 검색</p>
<h1 id="검색하기">%검색하기</h1>
<blockquote>
<p>WHERE 열(컬럼) LIKE &#39;%%%&#39;;</p>
</blockquote>
<p>&#39; \ &#39;이스케이프를 사용 하여 메타문자가 아닌 일반문자로 의미하게 할 수 있다.</p>
<h1 id="-의-이스케이프사용">&#39; 의 이스케이프사용</h1>
<p>&#39; it&#39;s &#39;의 같은 경우 &#39; it&#39;&#39;s &#39; 로 &#39;를 2개를 사용하여 이스케이프 할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.17 MySQL 조건조합]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.17-MySQL-%EC%A1%B0%EA%B1%B4%EC%A1%B0%ED%95%A9</link>
            <guid>https://velog.io/@kim-hoontae/TIL.17-MySQL-%EC%A1%B0%EA%B1%B4%EC%A1%B0%ED%95%A9</guid>
            <pubDate>Wed, 13 Oct 2021 14:55:54 GMT</pubDate>
            <description><![CDATA[<h1 id="논리연산자의-종류">논리연산자의 종류</h1>
<ul>
<li><strong>AND</strong></li>
<li><strong>OR</strong></li>
<li><strong>NOT</strong></li>
</ul>
<h1 id="and">AND</h1>
<p>복수의 조건을 조합할 경우 사용, 좌우에 항목이 필요한 이항 연산자</p>
<pre><code>SELECT * FROM products WHERE a&lt;&gt;0 AND b&lt;&gt;0;</code></pre><blockquote>
<p>a열과 b열 모두 0이 아닌 행 검색</p>
</blockquote>
<pre><code>SELECT * FROM products WHERE a=0 AND b=0;</code></pre><blockquote>
<p>a열과 b열 모두 0인 행 검색</p>
</blockquote>
<h1 id="or">OR</h1>
<p>어느 한쪽이 참이되면 조건식은 참이 된다.</p>
<pre><code>SELECT * FROM products WHERE a&lt;&gt;0 OR b&lt;&gt;0;</code></pre><blockquote>
<p>a열이 0이 아니거나 b열이 0이 아닌 행 검색</p>
</blockquote>
<pre><code>SELECT * FROM products WHERE a=0 OR b=0;</code></pre><blockquote>
<p>a열이 0이거나 b열이 0인 행 검색</p>
</blockquote>
<p>and, or 같은 경우 공부하는 파이썬의 언어와 사용하는 부분에서 똑같았다.</p>
<h1 id="and-or-사용시-주의할-점">AND, OR 사용시 주의할 점</h1>
<pre><code>SELECT * FROM products WHERE id=1 or 2;</code></pre><p>이 경우 상수 &#39;2&#39;의 경우 논리 연산으로 항상 참이 되기 때문에 모든 행을 반환하게 된다.</p>
<pre><code>SELECT * FROM products WHERE id=1 OR id=2;</code></pre><p>이렇게 조건식을 입력해야만 id가 1이거나 2인 값을 을 불러와. 1, 2행 모두 반환한다.</p>
<h2 id="and와-or-조합하여-사용">AND와 OR 조합하여 사용</h2>
<p>a,b에 데이터가 0, 1, 2 가 있다고 가정해보자</p>
<pre><code>SELECT * FROM products WHERE a&lt;&gt;0 AND b&lt;&gt;0; 를 
SELECT * FROM products WHERE a=1 OR a=2 AND b=1 OR b=2; 변경</code></pre><p>잠깐 보면 똑같은 행을 반환 할 것 같지만 그렇지 않다.
연산자에는 우선순위가 있기 때문이다.
AND 가 OR 보다 우선순위가 있기때문에</p>
<pre><code>SELECT * FROM products WHERE a=1 OR (a=2 AND b=1) OR b=2;</code></pre><p>이러한 형태로 진행된다고 생각하면된다.</p>
<p>그렇기 때문에 AND와 OR 을 조합해서 사용할 경우 OR조건에 괄호를 묶어서 사용해야한다.</p>
<pre><code>SELECT * FROM products WHERE (a=1 OR a=2) AND (b=1 OR b=2);</code></pre><h1 id="not으로-조합">NOT으로 조합</h1>
<p>오른쪽에만 항목을 지정하는 &#39;단항 연산자&#39; 오른쪽에 지정한 조건식의 반대 값을 반환한다.</p>
<pre><code>SELECT * FROM products WHERE NOT(a&lt;&gt;0 OR b&lt;&gt;0);</code></pre><p>a열이 0이 아니거나 b열이 0이 아닌 행을 제외한 나머지 행 검색</p>
<p>벤 다이어그램으로 치면 두 원을 제외한 나머지 배경이 값이라고 생각하면 이해하기쉽다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.16 MySQL 검색]]></title>
            <link>https://velog.io/@kim-hoontae/MySQL-%EA%B2%80%EC%83%89</link>
            <guid>https://velog.io/@kim-hoontae/MySQL-%EA%B2%80%EC%83%89</guid>
            <pubDate>Tue, 12 Oct 2021 15:30:00 GMT</pubDate>
            <description><![CDATA[<h1 id="select-구에서-열-지정">SELECT 구에서 열 지정</h1>
<pre><code>SELECT id, name FROM users;</code></pre><p>자신이 테이블의 필요한 열만 지정할 경우 &#39; , &#39;를 이용하여 필요한 여러개의 열을 지정할 수 있다.</p>
<h1 id="where-구에서-행-지정">WHERE 구에서 행 지정</h1>
<pre><code>SELECT * FROM users WHERE id = 7;
SELECT * FROM users WHERE id &lt; 7;
SELECT id, name FROM users WHERE name = &#39;김철수&#39;;</code></pre><ul>
<li>select 구 뒤에 열을 지정하고 where구로 행을 지정 할 수 있다. </li>
<li>where 구에서 지정한 값이 없는 경우에는 아무것도 반환하지 않는다.</li>
<li>id = 7같은 경우 연산자를 사용할 수 있다. &#39;&lt;&gt;&#39;를 사용할 경우 그 값을 제외한 나머지를 불러온다.</li>
<li>김철수 같이 문자열 인 경우 (&#39; &#39;)를 사용해야한다.</li>
<li>날짜시간의 경우에도 (&#39; &#39;)를 사용한다. 그리고 날짜의 경우 연월일은 (-)으로 구분하고 시간은(:)으로 구분한다.<h3 id="where-구에-사용-가능한-연산자">WHERE 구에 사용 가능한 연산자</h3>
</li>
<li><strong>&#39; = &#39;</strong></li>
<li><strong>&#39; &lt;&gt; &#39;</strong></li>
<li><strong>&#39; &lt; &#39;</strong> </li>
<li><strong>&#39; &gt; &#39;</strong></li>
<li><strong>&#39; &gt;= &#39;</strong></li>
<li><strong>&#39; &lt;= &#39;</strong></li>
</ul>
<h1 id="null값-검색">NULL값 검색</h1>
<pre><code>SELECT * FROM users WHERE phone_number = NULL; X
SELECT * FROM users WHERE phone_number IS NULL; O

SELECT * FROM users WHERE phone_number IS NOT NULL;</code></pre><ul>
<li>NULL 값을 검색할 때는 = 연산자가 아닌 IS NULL을 사용해야한다.</li>
<li>NULL 값이 아닌 값을 검색 할 때는 IS NOT NULL을 사용한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.15 Network의 구조, 데이터 단위]]></title>
            <link>https://velog.io/@kim-hoontae/Network</link>
            <guid>https://velog.io/@kim-hoontae/Network</guid>
            <pubDate>Mon, 11 Oct 2021 09:31:38 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터-네트워크란">컴퓨터 네트워크란?</h1>
<blockquote>
<p>두 대 이상의 컴퓨터로 연결되어 정보(<strong>데이터전송, 웹사이트 열람,메일</strong>)를 주고 받을 수 있는 상태</p>
</blockquote>
<ul>
<li>네트워크는 꼭 컴퓨터에만 해당되는것은 아니며 <code>사람과 사람, 도로와 철도, 물류</code>등 다양하다.</li>
<li><strong>인터넷</strong>은 작은 네트워크 부터 큰 네트워크를 연결하는 거대한 네트워크이다.</li>
</ul>
<h1 id="패킷이란">패킷이란?</h1>
<blockquote>
<ul>
<li>네트워크를 통해 전송되는 데이터의 작은 조각</li>
</ul>
</blockquote>
<ul>
<li><p>큰 데이터도 작게 나누어 보내는게 규칙 </p>
<ul>
<li><code>대역폭</code>을 너무 많이 차지하기 때문이다.</li>
</ul>
</li>
<li><p>용량이 큰 데이터를 전송할 때는 패킷으로 분할하여 전송하지만 패킷의 전송속도가 모두 다르고 제각각 순서가 다르게 목적지에 도착한다. 이럴 때 데이터의 모습을 원래대로 되돌려야하는 작업을 해야하기 때문에 송신측에서는 패킷에 순서대로 번호를 부여하여 전송하고 수신측에서 번호에 맞게 정렬하여 원래의 데이터를 보유 할 수 있게 된다.</p>
</li>
</ul>
<h3 id="대역폭이란">대역폭이란?</h3>
<blockquote>
<p>네트워크에서 이용가능한 최대 전송 속도로 정보를 전송할 수 있는 단위 시간당 전송량</p>
</blockquote>
<h1 id="bit-byte">bit, byte</h1>
<blockquote>
<ul>
<li>컴퓨터는 <code>0</code>과 <code>1</code>밖에 이해하지 못한다.</li>
</ul>
</blockquote>
<ul>
<li>0과 1의 정보를 정보를 나타내는 최소단위를 <code>bit</code>라고 한다.</li>
<li>8개의 bit가 모이면 <code>byte</code>라고 부른다.<ul>
<li>8bit = 1byte</li>
</ul>
</li>
</ul>
<h3 id="문자코드character-code">문자코드(character code)</h3>
<p>ASCII 코드 - 알파벳, 기호, 숫자 등을 다를 수 있는 기본적인 문자 코드 
참조 - <a href="https://ko.wikipedia.org/wiki/ASCII">https://ko.wikipedia.org/wiki/ASCII</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL.14 Django-cleanup]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.14-Django-cleanup</link>
            <guid>https://velog.io/@kim-hoontae/TIL.14-Django-cleanup</guid>
            <pubDate>Wed, 06 Oct 2021 04:46:13 GMT</pubDate>
            <description><![CDATA[<h1 id="이미지파일-자동-삭제">이미지파일 자동 삭제</h1>
<blockquote>
<p>django 모델링 중 imagefield를 사용 할 일이 있어서 사용하던중 저장을 하기위해 설정한 경로에 이미지파일들이 삭제를 해도 변화가 되지 않아 업데이트시나 삭제시 자동으로 삭제가 되기위해서 코드를 작성하던중 구글링을 하여 찾은 좋은 djnago package가 있어서 기록하려고한다.</p>
</blockquote>
<h2 id="imagefield-모델링-및-경로-설정">Imagefield 모델링 및 경로 설정</h2>
<ul>
<li>모델링<pre><code class="language-python">class ImageFile(models.Model):
  maker = models.ForeignKey(&#39;Maker&#39;, on_delete=models.CASCADE)
  image = models.ImageField(upload_to=&#39;image&#39;, null=True, blank=True, default=&#39;default.jpg&#39;)</code></pre>
<code>upload_to</code>의 경우 아래 media의 경로 안에 새로운 image라는 디렉토리가 생성되며 그 안에 저장된다.
<code>default</code>를 설정한 경우 django-cleanup 패키지의 경우 기존의 이미지 파일이 변경되면 자동으로 삭제가 되기 때문에 
default 이미지를 사용하는 경우는 설정을 해둬야 파일이 삭제가 되지않고 사용할 default 이미지파일의 경우 <code>media</code> 디렉토리 안에 저장해두면 된다.</li>
<li>settings.py에 추가<pre><code class="language-python">MEDIA_ROOT = os.path.join(BASE_DIR, &#39;media&#39;)
MEDIA_URL = &#39;/media/&#39;</code></pre>
</li>
<li>메인 urls.py에 추가<pre><code class="language-python">from django.urls import path,include
from django.conf import settings
from django.conf.urls.static import static
</code></pre>
</li>
</ul>
<p>urlpatterns = [
    #path(&#39;images&#39;, include(&#39;images.urls&#39;)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)</p>
<pre><code>## Django-cleanup
* package install
`pip install django-cleanup`

* settings.py 추가
```python
INSTALLED_APPS = (
    ...,
    &#39;django_cleanup.apps.CleanupConfig&#39;,
)</code></pre><p>위와 같은 간단한 방법으로 이미지파일을 자동으로 업데이트 및 삭제 할 수 있습니다.</p>
<p>더욱 자세한 사항은 아래에서 확인 할 수 있습니다.
<a href="https://pypi.org/project/django-cleanup/">https://pypi.org/project/django-cleanup/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django의 흐름알기 (model)]]></title>
            <link>https://velog.io/@kim-hoontae/Django%EC%9D%98-%ED%9D%90%EB%A6%84%EC%95%8C%EA%B8%B0-model</link>
            <guid>https://velog.io/@kim-hoontae/Django%EC%9D%98-%ED%9D%90%EB%A6%84%EC%95%8C%EA%B8%B0-model</guid>
            <pubDate>Wed, 06 Oct 2021 04:06:25 GMT</pubDate>
            <description><![CDATA[<h2 id="모델-만들기">모델 만들기</h2>
<blockquote>
<p>model은 메타데이터를 가진 데이터베이스의 구조 를 말한다.
저장하는 데이터의 필수적인 필드들과 동작들을 포함한다. *DRY원칙에 따라서 데이터 모델을 한곳나타낸다.</p>
</blockquote>
<ul>
<li>DRY원칙 : 고유한 데이터는 단 한 번, 한 곳에만 존재하는것</li>
</ul>
<pre><code class="language-python">polls/models.py
-----------------------------------------------------
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField(&#39;date published&#39;)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)</code></pre>
<p>설문 조사를 만드는 프로그램으로 </p>
<p>질문 모델과 선택 모델을 나눠서 질문에 관한 답변은 모두 다를 수 있기 때문에 선택 모델이 질문 모델을 참조하게 설정하였다.</p>
<p><code>ex) 공부하던 중 포스팅한줄 알았던 내용이 임시글에 있어서 뒤늦게 포스팅하게 되었는데 잘 확인하고 챙겨야겠다.</code> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 13 AWS EC2, RDS 사용]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.-13-AWS-EC2-RDS-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@kim-hoontae/TIL.-13-AWS-EC2-RDS-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Mon, 16 Aug 2021 12:20:51 GMT</pubDate>
            <description><![CDATA[<h1 id="aws-rds-mysql로-이동하기">AWS RDS Mysql로 이동하기</h1>
<p>기존 로컬 mysql에 있는 데이터베이스를 AWS RDS mysql로 이동하기 위해서는 mysql데이터 베이스를 파일화 시켜서 옮길 수 있는 <code>mysqldump</code>라는 명령어를 사용해 보았습니다.</p>
<h2 id="1-mysql-db-가져오기">1. mysql db 가져오기</h2>
<blockquote>
<p>mysqldump -u root(사용자아이디) -p <code>데이터베이스명</code> &gt; <code>파일.sql</code></p>
</blockquote>
<h2 id="2-aws-mysql로-옮기기">2. AWS mysql로 옮기기</h2>
<blockquote>
<p>mysql -h <code>RDS 엔드포인트</code> -u root(사용자아이디) -p <code>데이터베이스명</code> &lt; <code>파일.sql</code></p>
</blockquote>
<h1 id="ec2-rds사용-연결-순서">EC2, RDS사용 연결 순서</h1>
<blockquote>
<ul>
<li>터미널에 ssh 접속 
ssh -i 파일명.pem ubuntu@퍼블릭 ip주소</li>
</ul>
</blockquote>
<ul>
<li>미니콘다 설치 (ubuntu이기에 linux로 설치!) 기존설치했을때와 동일<ol>
<li>wget <a href="https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh">https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh</a></li>
</ol>
</li>
</ul>
<ol start="2">
<li>chmod +x Miniconda3-py39_4.9.2-Linux-x86_64.sh</li>
<li>source .bashrc  source</li>
<li>가상환경 생성 후 접속하기</li>
</ol>
<ul>
<li>sudo apt-get update</li>
<li>sudo apt-get upgrade</li>
<li>sudo apt-get install gcc</li>
<li>sudo apt-get install libmysqlclient-dev</li>
<li>클론할 사이트 가져오기
git clone <a href="https://github.com/wecode-bootcamp-korea/23-1st-ggugit-backend">https://github.com/wecode-bootcamp-korea/23-1st-ggugit-backend</a></li>
<li>requirements.txt 설치</li>
</ul>
<ol>
<li>cat requirements.txt</li>
<li>pip install -r requirements.txt </li>
<li>pip freeze</li>
</ol>
<ul>
<li>setting.py에 <code>ALLOWED_HOSTS</code>에 <code>퍼블릭ip주소, 퍼블릭ip:8000</code> 추가</li>
<li>my_settings.py 생성, 기존 내용 복사 붙여넣기 후 <code>PASSWORD, HOST:엔드포인트</code>로 변경</li>
<li>python manage.py runserver 0:8000 동작 후 확인</li>
<li>postman으로 퍼블릭ip 주소 입력 후 테스트</li>
</ul>
<h2 id="gunicorn">gunicorn</h2>
<p>장고에서 쓰는 <code>manage.py runserver</code> 명령어는 단일스레드로 동작하여 개발 및 테스트로는 적당하지만 request가 많을 수 있는 운영환경에서는 적합하지 않을 수 있어서 멀티스레드를 지원하는 <code>gunicorn</code> 설치하여 배포해보자.</p>
<blockquote>
<p>gunicorn 설치 - <code>pip install gunicorn</code> 
안된다면 - <code>sudo apt-get install gunicorn</code>
gunicorn  명령어 (꼭 가상환경에서 사용)</p>
</blockquote>
<ul>
<li>백그라운드 사용 x
<code>gunicorn --bind=0.0.0.0:8000 데이터베이스명.wsgi</code></li>
<li>백그라운드 사용 o
<code>nohup gunicorn --bind=0.0.0.0:8000 데이터베이스명.wsgi &amp;</code>
<img src="https://images.velog.io/images/kim-hoontae/post/295c02ec-a362-45ce-b90a-09b527e608d7/%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-08-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.14.40.png" alt=""></li>
<li>사용확인
<code>ps -ef | grep python</code></li>
<li>연결끊기
<code>kill PID</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[1차 Project (최종 회고) GGUGIT]]></title>
            <link>https://velog.io/@kim-hoontae/1%EC%B0%A8-Project-%EC%B5%9C%EC%A2%85-%ED%9A%8C%EA%B3%A0-GGUGIT</link>
            <guid>https://velog.io/@kim-hoontae/1%EC%B0%A8-Project-%EC%B5%9C%EC%A2%85-%ED%9A%8C%EA%B3%A0-GGUGIT</guid>
            <pubDate>Mon, 16 Aug 2021 04:39:41 GMT</pubDate>
            <description><![CDATA[<h1 id="1차-프로젝트-ggugit">1차 프로젝트 GGUGIT</h1>
<p>!youtube[ZnIrQX6EUK8]</p>
<blockquote>
<p>팀명 : <strong>GGUGIT</strong>
클론 사이트 : <strong>COOKIT</strong> (<a href="https://www.cjcookit.com">https://www.cjcookit.com</a>)
프로젝트 기간 : 8/2 ~ 8/13 (2주)
프론트 엔드 : 김동우, 이지선, 황문실 <a href="https://github.com/wecode-bootcamp-korea/23-1st-ggugit-frontend">github-ggugit-frontend</a>
백엔드 : 김훈태, 장이주 <a href="https://github.com/wecode-bootcamp-korea/23-1st-ggugit-backend">github-ggugit-backend</a></p>
</blockquote>
<h2 id="우리팀의-sprint-routine">우리팀의 Sprint Routine</h2>
<blockquote>
<p>모두 각자 할 수 있는 선에서 최대한 열심히 진행해주었고 따로 지켜지지않은 사항은 없었다. 대부분 trello를 잘 활용하여 컨디션 , 전날 진행 사항, 금일 진행사항을 따로 메모해두었기에 진행사항을 알기 쉬웠다.</p>
</blockquote>
<h3 id="trello">Trello</h3>
<ul>
<li>티켓활용을 제외한 꾸깃의 trello 활용 참고자료에는 프론트와 백이 함께 맞춰가야하는 사항들이 있다.
<img src="https://images.velog.io/images/kim-hoontae/post/24a3ce8c-5ca3-4978-9817-b413d9a5c576/%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-08-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.42.21.png" alt=""></li>
<li>회의 메모장
<img src="https://images.velog.io/images/kim-hoontae/post/41e2e847-eb8a-49fe-adc6-e04d044dca69/%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-08-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.41.09.png" alt=""></li>
<li>개인 컨디션
<img src="https://images.velog.io/images/kim-hoontae/post/af11b57e-d628-4004-a399-9efe93faae34/%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-08-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.42.53.png" alt=""><h3 id="backend-구현-사항">Backend 구현 사항</h3>
각자 구현한 사항은 이모티콘으로 표현하겠습니다. (나 = 🤪, 이주님 = 🤠)<blockquote>
<p>구현한 기능 🥳</p>
</blockquote>
</li>
<li>회원가입/로그인 - 🤪</li>
<li>메뉴리스트 - 🤠</li>
<li>메뉴 상세페이지 - 🤪</li>
<li>장바구니 - 🤠,🤪</li>
<li>검색 - 🤠
우리팀 백엔드에서는 하나의 기능을 구현함에 있어 따로 만들기 보다는 반반 나눠서 기능을 구현했는데 이 방식이 하나의 기능에 깊게 파고들지 못하였다는 생각도 있지만 내가 구현한 기능이 아니면 모를 수 있는 사항들을 함께 만들어서 각자 구현한 기능들의 부족한 점에 대한 피드백을 빠르게 주고 받을 수 있는 장점도 있었습니다. 결론적으로 서로가 그 과정이 만족스럽다고 느껴서 성공적이라고 표현할 수 있는 선택이었습니다.</li>
</ul>
<blockquote>
<p>아쉽게 구현하지 못한 기능 🤔</p>
</blockquote>
<ul>
<li>결제</li>
<li>리뷰</li>
<li>찜하기</li>
</ul>
<h2 id="모델링을-위한-erd">모델링을 위한 ERD</h2>
<p><img src="https://images.velog.io/images/kim-hoontae/post/825322f7-163f-41e0-acb2-6791fef714a2/%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-08-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.52.44.png" alt="">녹색 부분이 대부분 추가 구현 사항이었는데 다 구현하지 못한 아쉬운 느낌이 있어 2차 프로젝트에는 꼭 해보고싶은 사항이다.💪</p>
<h2 id="기억에-남는-코드">기억에 남는 코드</h2>
<p><a href="https://velog.io/@kim-hoontae/TIL.-10-getorcreate">get_or_create</a> 
이미 블로그에 작성을 하여서 링크를 따로 남겨놨습니다. 아무래도 가장 아쉬웠던건 더욱 많은 코드를 활용하지 못했던 부분이고 2차 프로젝트에서는 더욱 많이 활용해봄으로써 팀에 더욱 도움이 되는 팀원이 되도록 노력해야겠습니다. 그리고 이번프로젝트에서 사용되었던 코드들을 리펙토링해서 블로그를 작성 할 예정입니다.</p>
<h1 id="2주간의-ggugit-project-후기">2주간의 GGUGIT Project 후기</h1>
<img src="https://images.velog.io/images/kim-hoontae/post/8556a88c-453e-4698-858b-192f66f40d54/Image%20from%20iOS.jpg" height="100px" width="300px">

<h3 id="팀에서-나의-역할">팀에서 나의 역할?</h3>
<p>스스로 생각해서 말하라고 하면 <code>&#39;분위기 메이커&#39;</code>라고 말하고싶다. 스스로 정말 힘들어도 티를 내고싶지 않았다. 프로젝트의 중간이 접어들었을때 많은 팀원들이 힘들어하는 것이 보였고 무엇인가 도움이 되고싶었다. 하지만 기술적으로 도움을 드릴 수 있는 부분이 없었고 어둡고 지친분위기를 와해시키고자 즐거운 분위기를 만들려고 노력하고 이야기도 많이 나누려고 했다. 하지만 중간에 드는 생각은 내가 오히려 집중하는 분들을 집중못하게 하는 것이 아닌가? 라는 고민도 많이 했다. 하지만 다들 즐겁게 받아주셨다. 나중에 다른팀 동기분들과의 이야기를 나눌때 &quot;나는 그저 팀 분위기 메이커를 한다.&quot;라고 말했을때 어느 동기분께서 정말 중요한 역할을 하고 있네요. 라는 말을 해주셨고 팀원분들도 함께해서 즐거웠다는 말을 해주셔서 이 장점을 계속 살려야겠다고 생각했다.</p>
<h3 id="나의-보완할-점">나의 보완할 점</h3>
<p>아무래도 프로젝트를 진행함에 있어서 가장 크게 느낀점은 기초의 부족함이었다. 하나의 기능을 구현함에 있어서 활용해보지 않은 기능들의 코드를 작성하려고하면 머리가 먼저 굳어버리는 현상이 자주 나타났다. 아무래도 한번 할 때 최적의 방법을 찾으려고만 하는 탓도 있는것같다. 리펙토링이란 것에 대하여 인지하지 못하였고 그렇다고 최적의 코드를 작성한것도 아닌 그저 내가 이해한 범위내에서만 코드를 작성하였고 둘러 봤을때는 더 다양한 방법으로 코드를 작성하는 동기분들이 계셨다. 비교하지않으려 했고 오히려 배우려고 했다. 이해가 되지 않을 때는 물어보고 내껏으로 만들려고 했다. 하지만 생각한것처럼 여유가 있지는 않았고 결코 활용하지 못하였다. 그래서 차근차근 아쉬운점들을 리펙토링해 나가서 진짜 내것을 만들 예정이다.</p>
<h3 id="team-project로-얻은-것">Team Project로 얻은 것</h3>
<p>과연 내가 잘할 수 있을까? 라는 물음에 23기 동기분들 모두가 프로젝트를 시작하였다.
결과적으로 목표로 정한 모든 기능들을 다 이루지는 못하였다. 그렇다고 실패한 것이 아니다. 결론적으로 보면 성공이라고 할 수 있다. 필수 구현 사항들은 다 이루었기 때문이다. 그렇다고 필수 구현 사항을 못했어도 실패는 아니다. 도전을 했고 이루어낸 부분들이 있었다면 충분히 성공했다고 생각한다. 내가 프로젝트 전에 가지고 있었던 생각은 &#39;잘할 수 있을까?&#39; 였지만 결과가 나왔을때 <code>&#39;나는 포기하지 않고 잘해냈다!&#39;</code>라는 표현을 할 수 있었다. 분명 스스로 부족함도 많이 느꼈었지만 프로젝트하면서 부족한 점들을 더욱 잘 찾을 수 있었다고 생각한다. 나 혼자서는 분명 하지 못했을 부분들이 너무 많았다. 팀프로젝트롤 통해 부족한점을 깨닳았고 내가 앞으로 나아가야할 방향성에 대해 알려준 소중한 첫번째 프로젝트 그 과정을 함께한 꾸깃팀 결과물에 연연하지 않고 우리만의 속도로 나가자고 해주었던 모든 팀들에게 다시 한번 정말 감사하다고 말씀드리고싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 12 RESTful API]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.-11-RESTful-API</link>
            <guid>https://velog.io/@kim-hoontae/TIL.-11-RESTful-API</guid>
            <pubDate>Sun, 15 Aug 2021 06:09:37 GMT</pubDate>
            <description><![CDATA[<h1 id="rest란">REST란?</h1>
<blockquote>
<p><code>REpresentational State Transfer</code>
웹에 존재하는 모든 자원을 http URL로 표현하여 자원에 대한 주소를 지정하는 방법론, 또는 규칙입니다. 즉 자원을 어떻게 한다를 구조적으로 깔끔하게 표현한것</p>
</blockquote>
<h3 id="restful-api-장점">RESTful API 장점</h3>
<p>그 자체만으로 API의 목적이 무엇인지 알기 쉽다.</p>
<h3 id="restful-api-단점">RESTful API 단점</h3>
<p>표준 규약이 없어서 실제 많이 사용되지만 비효율적이거나 비생산적인 패턴을 작성할 수 있다.</p>
<h3 id="restful-api-설계-규칙">RESTful API 설계 규칙</h3>
<blockquote>
<ul>
<li>URI의 정보는 명확하게 표현한다. 리소스는 명사로 표현</li>
</ul>
</blockquote>
<ul>
<li>리소스의 HTTP method는 <code>(POST, GET, PUT, PATCH, DELETE)</code> 로 표현한다.
1) URI에 HTTP method가 들어가면안된다. <code>ex) GET delete/users/1</code>
2) URI에 동사가 포함되면 안된다.<code>ex) POST insert/users/1, GET users/show/1</code> </li>
<li>파일의 경우 확장자를 표현시키지 않는다. <code>jpg,png,gif</code> 등등 
<code>ex)GET users/1/profile-photo.jpg</code></li>
<li>URI가 길어지는 경우 <code>_</code> 가 아닌 <code>-</code>를 사용한다. 
<code>ex)GET users/1/profile-photo</code>(O), <code>GET users/1/profile_photo</code>(X)</li>
<li>마지막에  <code>/</code> 를 사용하지 않는다. <code>ex) GET delete/users/1/</code></li>
<li>URI 경로에 대문자 사용을 피한다.
<img src="https://images.velog.io/images/kim-hoontae/post/16127fd9-6407-4c90-b6ad-e0b483a8264b/%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-08-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.34.26.png" alt=""></li>
</ul>
<h1 id="path-parameter-query-parameter">Path parameter, Query parameter</h1>
<h2 id="path-parameter">Path parameter</h2>
<p><code>GET,DELETE,PUT,PATCH,</code>등 method를 활용하여 요청한 하나의 데이터를 가지고 올 때 사용한다.
<code>EX)GET users/1, DELETE users/2/profile-photo</code></p>
<h2 id="query-parameter">Query parameter</h2>
<p><code>filtering(분류)</code>, <code>sorting(정렬)</code>, <code>searching(검색)</code>할 때 사용한다.
또한 <code>pagination(한 페이지에 몇개의 상품이 나오게 하는지 표시할때 사용한다.)-(offset,limit)</code> 페이지를 나눌때도 사용</p>
<h2 id="없는-정보를-요청-할-경우">없는 정보를 요청 할 경우</h2>
<ul>
<li>Path parameter <code>GET /users/1</code> - 404 NOT FOUND 없는 정보라는 에러발생 </li>
<li>Query parameter <code>GET /users?id=1</code> - 에러가 발생하지 않고 빈리스트를 가지고 옴</li>
</ul>
<p>각 상황에 맞게 활용하여 적용시켜주면 데이터를 요청하고 응답 시 편리하다.</p>
<h2 id="알고-있으면-좋은-status-내용">알고 있으면 좋은 Status 내용</h2>
<p><img src="https://images.velog.io/images/kim-hoontae/post/a10b01d5-896b-47f7-98cc-407f8b61d369/%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-08-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.51.40.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 11 AWS]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.-11-AWS</link>
            <guid>https://velog.io/@kim-hoontae/TIL.-11-AWS</guid>
            <pubDate>Sat, 14 Aug 2021 15:06:19 GMT</pubDate>
            <description><![CDATA[<h1 id="aws란">AWS란?</h1>
<blockquote>
<p>Amazon Web Service의 줄임말로 간단하게 클라우드 서비스로 유저가 따로 결제할 필요없이 AWS상에서 클릭 몇 번으로 서버를 만들고 사용할 수 있다.
백엔드 개발자는 정확하게 알아야하는 부분 중 하나이기에 꼭 알고 넘어가자!</p>
</blockquote>
<h2 id="aws-사용-전-알고-있어야-할-기능-용어-정리">AWS 사용 전 알고 있어야 할 기능 용어 정리</h2>
<h3 id="ec2-elastic-compute-cloud">EC2 (Elastic Compute Cloud)</h3>
<blockquote>
<p>AWS 상에서 몇 분 안에 구동 가능한 가상 서버, 서버에 API를 배포한다.
다양한 옵션이 있으며 사양이 좋을 수록 비싸다.</p>
</blockquote>
<h3 id="security-group">Security Group</h3>
<blockquote>
<p>EC2 네트워크의 가상 방어벽 역활을 한다고 생각하면된다.</p>
</blockquote>
<h3 id="vpc-virtual-private-cloud">VPC (Virtual Private Cloud)</h3>
<blockquote>
<p>AWS 네트워크 망안의 사용자 전용 사설 네트워크 </p>
</blockquote>
<h3 id="rds-relational-database-service">RDS (Relational Database Service)</h3>
<blockquote>
<p>클라우드에서 DB를 관리 한다. 사용자가 직접 DB를 설치해서 설정하고 관리하지 않아도 된다.
사용자가 직접 DB를 설치하고 운영하는 것보다 비용적인 측면에서도 더 저렴하다.</p>
</blockquote>
<h3 id="elb-elastic-load-balancing--laod-balancer">ELB (Elastic Load Balancing) , Laod Balancer</h3>
<blockquote>
<p>서버로 들어오는 여러가지의 요청을 골고루 나눠서 전달, 요청이 많을 때 하나의 서버에서 다 처리를 하기 힘들기 때문에 http요청들을 서버에 분산해주는 형태로 시스템이 구성된다.</p>
</blockquote>
<h3 id="route-53">Route 53</h3>
<blockquote>
<p>AWS의 도메인 네임 시스템(Domain Name System, DNS)서비스
API시스템을 실제 도메인과 열결해주는 기능이다.</p>
</blockquote>
<h3 id="aws-s3-simple-storage-service">AWS S3 (Simple Storage Service)</h3>
<blockquote>
<p>간단하게 파일업로드를 하고 공유하는 서비스이다.
파일마다 고유의 주소를 부여하기때문에 S3에 저장된 파일들을 웹상에서 쉽게 읽어들일 수 있고 주로 사이트상의 이미지들을 저장하고 사이트에서 읽어들여 렌더링 해주는데 사용한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 10 get_or_create]]></title>
            <link>https://velog.io/@kim-hoontae/TIL.-10-getorcreate</link>
            <guid>https://velog.io/@kim-hoontae/TIL.-10-getorcreate</guid>
            <pubDate>Sat, 14 Aug 2021 09:18:55 GMT</pubDate>
            <description><![CDATA[<h1 id="get_or_create-메서드">get_or_create 메서드</h1>
<p>프로젝트기간 장바구니 추가를 구현 하는 상황에서 <code>create</code> 메서드를 사용하여 추가하였는데 멘토분께서 <code>get_or_create</code>를 공부하여 사용해보라는 리뷰를 달아주셨다.
get_or_create는 <code>object,created</code>로 이루어져있고 <code>object</code>는 꺼내려 하는 인자이고  <code>created</code>는 <code>True, False</code>로 이루어져있어서 db에없어 생성이되었다면 True로 기존에 데이터가 있다면 추가되지않고 Falsed이다. 하지만 장바구니에 기존데이터가 있으면 그대로 추가되는 조건을 걸었다.</p>
<h2 id="메서드-이해-x">메서드 이해 X</h2>
<p><img src="https://images.velog.io/images/kim-hoontae/post/dae735a7-0ad6-488a-a392-aa105a21fd07/%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-08-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.01.04.png" alt=""></p>
<p>위 cart라는 object에 db를 추가하기 위해서 product, user, quauntity를 키워드를 입력하였다. 그리고 <code>postman</code>으로 테스트를 하였을 때 새롭게 추가하고자하는 값을 db에 create했을 때 db에 추가가 되었고 한번 더 추가를 했을때도 무리 없이 추가가되었다. 하지만 3번째 추가를 할 때, <code>ADD_SUCCESS</code>가 아닌 <code>SUCCESS</code>라는 메세지가 나와서 뭔가 잘못됬다는것을 느꼈다. 그리고 db를 확인하니 아래와 같이 추가되는것이아닌 새로운 db가 생성되어있었다.
<code>*추가시키고자 한 값 : product = 17, user = 1, quantity = 1</code> 
<img src="https://images.velog.io/images/kim-hoontae/post/09e6c4e3-a273-4e55-9aed-eae70b277ab7/%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-08-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.02.05.png" alt=""></p>
<h2 id="메서드-이해-o">메서드 이해 O</h2>
<p>무엇이 잘못된건지 고민하다가 <code>quantity</code>를 키워드로 걸면 안된다는 생각이 들었다.
추가하고자 하는 값이 없을때 새로운 db를 추가 하였고 추가된 quantity의 값이 있을때 기존값에 더하여 추가가 되었다. 하지만 quantity가 2가 되었고 1을 추가하려했지만 기존 db에 위 이미지를 보면 <code>quantity = 1, product_id = 17, user_id = 1</code> 이라는 db가 없었기에 새롭게 추가가 된 것 이었다.</p>
<p><img src="https://images.velog.io/images/kim-hoontae/post/8321d11c-b4f5-49ed-aaa3-d2093655156b/%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-08-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.00.17.png" alt=""></p>
<p>코드를 다시 수정하였고 더 공부한 결과 <code>defalts</code>값을 설정 할 수 있다는 것을 알게되었다. 값을 설정할 수 있다는 것을 몰랐더라면 모델링을 수정해야했기에 번거로움이 있을 뻔 하여서 다행이었다. defalts값을 설정할때 quantity가 기존 db의 quantity 값을 를 참조하게하여 <code>stock</code>이 있는 한 추가되게 코드를 수정하였다.</p>
<p>하지만 코드를 수정하여 값을 추가하였을때 여러 에러메세지가 나왔고 그중 <code>return 2</code> 라는 리턴하는 값이 두개라는 듯한 에러 메세지가 나와서 위 이미지의 2개의 중복되는값의 db가 있기에 에러가 발생한 듯한 느낌이와서 하나의 db를 delete한 결과 quantity가 추가되는 것에 대한 에러는 발생하지않고 잘 진행된다는 것을 알 수 있게 되었다. 이번을 계기로 여러가지 메서드를 사용하기 위해서는 정확한 조건이 무엇인지 어떻게 사용되는지 파악하고 이용해야한다는 걸 다시 한 번 깨닳게 되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1차 Project  (1주차 회고)]]></title>
            <link>https://velog.io/@kim-hoontae/Project-.-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@kim-hoontae/Project-.-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 08 Aug 2021 14:46:33 GMT</pubDate>
            <description><![CDATA[<h1 id="프로젝트전의-걱정반-기대반">프로젝트전의 걱정반 기대반</h1>
<p>겉으로는 안그래보여도 나는 항상 걱정이 많다. 자신을 남들과 비교하지 않으려고 해도 준비가 많이 부족한 상태로 위코드에 오게되어 계속 비교만했고 스스로 부족하다는걸 알기에 잠도 덜 자고 조금씩 따라잡아 보려고 했는데 쉽지가 않았다. 오히려 시간이 지날수록 기본이 부족한게 더욱 티가 났고 다른분들과 더욱 멀어져만 가는 기분이 들었다. 그리고 프로젝트를 할 때 내가 과연 도움이될까?라는 생각이 머리를 지배했다.</p>
<h1 id="프로젝트의-시작-나의-마음가짐">프로젝트의 시작, 나의 마음가짐!</h1>
<p>&#39;내가 지금 잘 하고 있는건가?&#39; &#39;응 잘하고있어 꾸준히만 하자!&#39; &#39;근데 너무 무모한 도전이 아니었을까?&#39; &#39;아니야 도전하기로한거 잘할 수 있을꺼야!&#39; 라는 많은 생각이 머리를 지배했지만 못해도 포기는 하지말자라는 결론이 나왔다. 그렇게 긍정적인 생각을 가지고 우리 프로젝트 팀인 &#39;꾸깃&#39;분들과 만나게 되었다. 이야기를 많이 해본 분들이 없었고 한 번도 이야기를 하지 않았거나 인사만 하시는분들이랑 같은 팀이되어 처음에는 걱정이 많았다. 하지만 모여서 잠깐 이야기를 했을 뿐인데 그냥 너무 좋은분들이랑 한팀이 되어 마음이 편해졌고 미약하게나마 꼭 도움이 되는 존재가 되고 싶었다.</p>
<h1 id="1주차-스프린트">1주차 스프린트</h1>
<p>프로젝트를 시작하기 전 프론트 분들과 해야 할 진행사항들을 이야기 하면서 머리가 하얘지는 순간이 몇 번 찾아왔었다. 백엔드를 공부하지만 스스로에게 완벽하다 할 수 없었고 프론트 분들과 이야기를 하면서도 그들의 플로우를 알 수 없었기에 걱정이 앞장을 섰다. 아무래도 1차 프로젝트의 목적이 기능구현도 중요하지만 커뮤니케이션에 더 중점이 있는 것 같다고 생각이 되었다.</p>
<blockquote>
<p> 백엔드 1주차 목표 : 모델링, 초기세팅, 회원가입, 로그인, 메뉴리스트, 메뉴 상세페이지, 장바구니</p>
</blockquote>
<p>백엔드에서는 가장 처음 모델링을 해야했다. 초반까지는 어느정도 이해가 되는 선에서 백엔드 파트너인 이주님과 ERD를 작성해 나갔다. 생각보다 오래걸렸고 몇번의 수정과 멘토 연우님의 도움끝에 2틀째에 마무리가 되었고 각자 맡은 기능을 구현하고자 했다.</p>
<h1 id="나의-진행사항">나의 진행사항</h1>
<blockquote>
<p>초기세팅, 회원가입, 로그인, 메뉴 상세페이지, 장바구니(DELETE, UPDATE)</p>
</blockquote>
<p>전반적으로 새롭게 구현해본 페이지는 메뉴 상세페이지밖에 없었다. 아무래도 스스로에게 자신이 없었고 복습을 해보자는 생각으로 django초기세팅, 로그인, 회원가입 기능을 구현했다. 메뉴 상세페이지를 새롭게 구현해 보았고 장바구니 기능도 나누어서 진행했지만 아직도 update 부분은 완벽하게 구현하지 못했다.</p>
<h1 id="만족한점-아쉬운점">만족한점, 아쉬운점</h1>
<h2 id="--만족한점">- 만족한점</h2>
<ol>
<li>포기하지 않고 1주일을 마무리한점</li>
<li>git 활용을 잘못하여 많은 시간을 허비하였지만 그 덕에 git에 대해 더욱 깊이 알 수 있었다.<h2 id="--아쉬운점">- 아쉬운점</h2>
</li>
<li>멘토분의 설명을 이해하지못하여 파트너인 이주님까지 헷갈리게해서 시간을 낭비하게 한 점이 정말 죄송했고 피해주지 말자는 다짐을 벌써 실패한것 같다. </li>
<li>QuerySet과 model method의 이해가 전반적으로 많이 부족했던게 느껴졌다. 어느정도 알고 있다고 생각했지만 활용을 할 줄을 몰라 기능 하나 하나 구현하는데 너무 많은 시간을 소비하였다. </li>
<li>기능별로 담당을 나누었지만 메뉴리스트의 필터링하는 부분에서 내가 구현 해보지 못한점이다. 사실 내가 담당했으면 지금 이시간 까지도 안끝났을 수 있지만 Query parameters에 대해 블로그를 작성해야겠다.</li>
</ol>
<h1 id="2주차의-다짐과-마무리">2주차의 다짐과 마무리</h1>
<p>계속 다른 팀과 비교하지 않고 우리만의 발걸음으로 나아가면 된다고 생각했다. 하지만 나만 그렇게 생각하면 어떻게 하지? 라고 생각했을때 나뿐만 아니라 각자 모두가 서로의 입장에서 힘들어하는 것을 알게되었다. 부족한 나지만 그래도 모두에게 힘이되고 싶었다. LOVE면담을 통해 깨닳은것은 팀프로젝트를 하면서 해야하는것이 개발만 하는것이 아니었다. 분명 우리팀 모두가 개발을 잘하고 모두가 소통이 잘되면 우리는 여기에 없었을 것이다. 팀이라는건 분명히 다함께 가는것이라 생각한다. 우리가 프론트엔드에서 개발 속도가 빨라서 백엔드에서 데이터를 줄수 없어도 혹은 백엔드의 개발 속도가 빨라 프론트에서 구현할 화면이 없어도 우리가 함께한 그 순간이 팀프로젝트의 완성이다. 스스로 부족하다 생각해도 계속 할 수 밖에 없고 어짜피 포기 안할것이기에 할 수 있는데 까지 할 생각이다. 함께하는 프론트엔드분들에게 감사하고 항상 든든한 파트너 이주님께 정말 감사합니다. 2주차 스프린트 우리 &#39;꾸깃&#39; 쫙 펴져서 기분좋고 행복한 시간이 될 수 있도록 화이팅입니다.!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django 회원가입 & 로그인]]></title>
            <link>https://velog.io/@kim-hoontae/Westagram-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EB%A1%9C%EA%B7%B8%EC%9D%B8</link>
            <guid>https://velog.io/@kim-hoontae/Westagram-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EB%A1%9C%EA%B7%B8%EC%9D%B8</guid>
            <pubDate>Sat, 31 Jul 2021 17:36:03 GMT</pubDate>
            <description><![CDATA[<h1 id="model-작성하기">Model 작성하기</h1>
<pre><code class="language-python"># models.py
from django.db import models

class User(models.Model):
    name         = models.CharField(max_length=45)
    email        = models.CharField(max_length=300)
    password     = models.CharField(max_length=400)
    phone_number = models.CharField(max_length=45)
    birthday     = models.DateField()

    class Meta:
        db_table = &#39;users&#39;</code></pre>
<p>이메일과 패스워드는 문자와 숫자를 다사용하기에 <code>CharField</code>를 적용하였고 최대길이를 넉넉하게 설정하였다. 이메일은 그렇다쳐도 패스워드의 최대길이를 길게 한 이유는 나중에 암호화 시킬 경우 문자열의 길이가 길어지기 때문이다.
전화번호의 경우 <code>IntegerField</code>를 설정할 경우 <code>0</code>이 맨 앞에 오게되면 <code>010</code>의 경우 <code>10</code> 으로 표시되어 <code>0</code>의 숫자가 나오지 않기 때문에 <code>CharField</code>를 적용하였고 생일의 경우 날짜에 맞는 필드가 있기에 <code>DateField</code>를 적용시켰다.</p>
<h1 id="view-작성하기">View 작성하기</h1>
<h2 id="1-signup">1) SignUp</h2>
<pre><code class="language-python"># views.py
class SignupView(View):
    def post(self, request):
        try:
            data            = json.loads(request.body)
            password        = data[&#39;password&#39;]
            hashed_password = bcrypt.hashpw(password.encode(&#39;utf-8&#39;),bcrypt.gensalt()).decode(&#39;utf-8&#39;)

         # 이메일의 형식에 맞게 적용하는지 확인
            if not re.search(r&#39;^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w+[.]?\w{2,3}$&#39;,(data[&#39;email&#39;])):
                return JsonResponse({&#39;message&#39;:&#39;INVALID_EMAIL_FORMAT&#39;}, status=400)
         # 비밀번호 8자리 이상 숫자와 특수문자 사용
            if not re.search(r&#39;[A-Za-z0-9!@##$%^&amp;+=]{8,25}&#39;,(data[&#39;password&#39;])):
                return JsonResponse({&#39;message&#39;:&#39;CHARACTER_SHORT&#39;}, status=400)
     # 중복된 이메일이 있는지 확인
            if User.objects.filter(email=data[&#39;email&#39;]).exists():
                return JsonResponse({&#39;massage&#39;:&#39;INVALID_EMAIL&#39;}, status=400)

            User.objects.create(
                name         = data[&#39;name&#39;],
                email        = data[&#39;email&#39;],
                password     = hashed_password,
                phone_number = data[&#39;phone_number&#39;],
                birthday     = data[&#39;birthday&#39;],
            )
            return JsonResponse({&#39;message&#39;:&#39;SUCCESS&#39;}, status=201)
        except KeyError: # 키값의 오타가 있을 경우에 키에러를 발생하게함
            return JsonResponse({&#39;message&#39;:&#39;KEY_ERROR&#39;}, status=400)</code></pre>
<p><code>hashed_password</code>는 <code>bcrypt</code>라는 라이브러리를 사용하여 암호해주었다는 변수를 주었고 마지막 <code>decode(&#39;utf-8&#39;)</code>를 사용한 것은 <code>DB</code>에 저장이 될 때는 <code>string</code> 타입으로 저장이 되어야하기 때문이다.
아직 정규 표현식은 정확하게 이해하지 못하여 구글링을 하여 사용되는 방식을 카피해왔다. 정규표현식의 경우 더욱 공부해야할 것 중 하나로 계획할 것이다. 정규표현식의 <code>re</code>를 사용하여 적용시킬때는<code>match</code>와 <code>search</code>가 있는데 두 방식의 차이점은 <code>match</code>의 경우 문자열의 처음부터 정규식과 매치되는지 조사하고 <code>search</code>의 경우 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. 아직 정확히 이해를 하지못한 정규식을 사용하였기에 <code>search</code>를 사용하였다.
둘의 같은점은 정규식에 적합하면 <code>match</code>객체를 돌려주고 그렇지 않으면 <code>None</code>을 돌려준다.
난 위의 코드에서 <code>if not</code>으로 정규식표현에 부합하지않으면 예외처리된 메세지가 반환되게 설정을 하였다.</p>
<h3 id="회원가입성공">회원가입성공</h3>
<img src="https://images.velog.io/images/kim-hoontae/post/9cb80c32-90ca-46ea-9dbb-ff032b875fd7/%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-08-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.30.48.png"  width="50%" height="30">

<h3 id="이메일형식이-맞지-않을때">이메일형식이 맞지 않을때</h3>
<img src="https://images.velog.io/images/kim-hoontae/post/191e3a9b-2773-4cfc-a56d-e44fe543d004/%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-08-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.30.39.png" width="50%" height="30">

<h3 id="비밀번호가-형식에-맞지않을때">비밀번호가 형식에 맞지않을때</h3>
<img src="https://images.velog.io/images/kim-hoontae/post/ddd9d14b-2348-4bf4-891e-6ee6133835b2/%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-08-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.31.18.png" width="50%" height="30">

<h3 id="중복된-이메일이-있을때">중복된 이메일이 있을때</h3>
<img src="https://images.velog.io/images/kim-hoontae/post/752a5892-44eb-4a99-9a6e-81018f592b5d/%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-08-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.49.19.png" width="50%" height="30">

<h2 id="2-login">2) Login</h2>
<pre><code class="language-python">class LoginView(View):
    def post(self, request):
        try: 
            data = json.loads(request.body)
        #로그인시 회원가입된 이메일이 없는경우
            if not User.objects.filter(email=data[&#39;email&#39;]).exists():
                return JsonResponse({&#39;message&#39;:&#39;INVALID_USER&#39;}, status=401)
        #존재하는 이메일이면 가져오기
            user = User.objects.get(email = data[&#39;email&#39;])
        #암호화된 비밀번호를 다시 부호화하여 회원가입된 이메일의 비밀번호와 맞는지 확인          
            if not bcrypt.checkpw(data[&#39;password&#39;].encode(&#39;utf-8&#39;), user.password.encode(&#39;utf-8&#39;)):
                return JsonResponse({&#39;message&#39;:&#39;INVALID_USER&#39;}, status=401) 
    #회원가입된 이메일과 패스워드가 맞다면 토큰을 발행
            access_token = jwt.encode({&#39;id&#39; : user.id}, SECRET_KEY, algorithm = &#39;HS256&#39;)
            return JsonResponse({&#39;token&#39; : access_token}, status=200)
        except KeyError:
            return JsonResponse({&#39;message&#39;:&#39;KEY_ERROR&#39;}, status=400)</code></pre>
<p><code>http</code>는 단기기억능력을 가지고있는데 이를 보안하기위해 로그인을 했을시 계속 로그인 하지않기 위해 로그인되었다는 증표인 <code>토큰</code>을 부여한다. 토큰의 생성은 <code>Json Web Token</code> 즉 약어로 <code>jwt</code>라는 라이브러리를 사용한다. 각 유저의 중복되지 않는 고유번호인 <code>id</code>를 부여해서 사용한다. 로그인 상태에서만 가능한 기능들이 있다. 예를들어 게시물을 올린다던가 댓글을 남긴다거나 수정하고 삭제하나하는 경우 로그인이 된상태에서만 가능하다 이럴때는 로그인이 되었다는 증표인 <code>토큰</code>이 필요한다. 개발을하여 기능을 만들때마다 코드를 작성해주기에는 번거롭거나 실수로 작성을 못하는경우가 있기에 <code>데코레이터!!!</code>라는 기능을 사용하면된다. <code>데코레이터</code>는 따로 블로그를 작성을 할 예정이다.</p>
<h3 id="로그인에-성공하여-토큰이-발행됨">로그인에 성공하여 토큰이 발행됨</h3>
<p><img src="https://images.velog.io/images/kim-hoontae/post/36aebacc-08ed-48d4-b219-e5ee25b1e771/%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-08-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%202.15.53.png" alt=""></p>
<h3 id="키값인-password를-잘못입력하였을때-발생한-keyerror">키값인 password를 잘못입력하였을때 발생한 keyerror</h3>
<img src="https://images.velog.io/images/kim-hoontae/post/06472625-0dcb-4588-bd57-7a77313ed435/%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-08-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%202.17.48.png" width="50%" height="30">

]]></description>
        </item>
    </channel>
</rss>