<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>__k1j__.log</title>
        <link>https://velog.io/</link>
        <description>에러의 지옥 속 막다른 길 (ง •̀_•́)ง</description>
        <lastBuildDate>Sat, 24 Sep 2022 04:48:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>__k1j__.log</title>
            <url>https://velog.velcdn.com/images/kiwony_/profile/2a5e9637-84ac-435e-bd15-c54215ab8f2e/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. __k1j__.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kiwony_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ec2 인스턴스에 설치했던 데이터베이스 살리기 ]]></title>
            <link>https://velog.io/@kiwony_/%EB%B8%8C%EB%A1%9C%EB%93%9C%EB%B3%B4%EB%93%9C-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</link>
            <guid>https://velog.io/@kiwony_/%EB%B8%8C%EB%A1%9C%EB%93%9C%EB%B3%B4%EB%93%9C-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</guid>
            <pubDate>Sat, 24 Sep 2022 04:48:25 GMT</pubDate>
            <description><![CDATA[<h1 id="브로드보드-db-상황-">브로드보드 db 상황 :</h1>
<p>ec2 인스턴스에 mongodb를 설치하여 브로드보드 웹의 데이터베이스로 사용 중. 웹 서버는 다른 ec2 상에서 사용 중.
그리고 현재 인스턴스 상태검사에서 연결성 검사 실패 오류가 뜨는 문제 발생. </p>
<h1 id="인스턴스에-연결하기">인스턴스에 연결하기</h1>
<h4 id="1-문제">1. 문제</h4>
<blockquote>
<p>브로드보드의 데이터베이스로 사용중이던 ec2 인스턴스에 연결 할 수없는 문제 발생..!</p>
</blockquote>
<ul>
<li>ssh 연결 시 <code>ssh: connect to host 15.164.214.224 port 22: Connection timed out</code> 오류 발생</li>
</ul>
<h4 id="2-사실-수집">2. 사실 수집</h4>
<blockquote>
<p>ec2 인스턴스의 시스템 로그
<img src="https://velog.velcdn.com/images/kiwony_/post/0b196634-7c49-4a8b-9f7a-1e37335dcb3c/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>상태 검사 오류
<img src="https://velog.velcdn.com/images/kiwony_/post/ef63b385-27a7-4640-b442-d69710c712cf/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>ROBO-3T 연결 시 오류
<code>Network is unreachable. Reason: couldn&#39;t connect to server 15.164.214.224:27017, connection attempt failed: NetworkTimeout: Error connecting to 15.164.214.224:27017 :: caused by :: Socket operation timed out</code></p>
</blockquote>
<h4 id="3-원인-찾기">3. 원인 찾기</h4>
<blockquote>
<p><a href="https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-linux-resolve-ssh-connection-errors/">https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-linux-resolve-ssh-connection-errors/</a>
-&gt; 서버에 클라이언트에 응답하지않는 문제</p>
</blockquote>
<ol>
<li>보안그룹에 22범위 추가 되어있음</li>
<li>호스트 있음 </li>
</ol>
<h4 id="4-조치-및-결과">4. 조치 및 결과</h4>
<blockquote>
<ol>
<li>인스턴스 재부팅하기 
변화없다가 시간 지나서 해결!! 5분 정도 기다려야함.</li>
</ol>
</blockquote>
<h1 id="sudo-unable-to-resolve-host-ip-172-31-35-117-resource-temporarily-unavailable">sudo: unable to resolve host ip-172-31-35-117: Resource temporarily unavailable</h1>
<h4 id="1-문제-1">1. 문제</h4>
<blockquote>
</blockquote>
<ul>
<li>필요없는 파일 삭제 시도</li>
<li>mongodb 실행 시도</li>
</ul>
<p>뭘해도 이 오류가 뜨면서 명령어가 하나도 먹질 않는 오류 발생</p>
<h4 id="2-원인-찾기">2. 원인 찾기</h4>
<blockquote>
</blockquote>
<ul>
<li>응용 프로그램이 차지하는 스레드 수가 제한을 초과했기 때문에 발생하는 문제</li>
<li>운 좋게 명령어를 잘못 쳤는데 아래와 같은 오류가 떠서 문제를 알 수 있었음
<code>cannot create temp file for here-document: No space left on device</code></li>
<li>근데 그냥 <code>Resource temporarily unavailable</code> 이것만 검색해도 원인을 알 수 있던 문제..</li>
</ul>
<blockquote>
<p>그리고 안 보이던 것들이 보이기 시작하는데..
<img src="https://velog.velcdn.com/images/kiwony_/post/924213db-1586-4c60-8624-97b93752aedd/image.png" alt="">
99.8% 사용중..</p>
</blockquote>
<h4 id="3-조치-및-결과">3. 조치 및 결과</h4>
<blockquote>
<p>비슷한 문제를 겪은 사람의 글
<a href="https://nunubuff.com/blog/ec2-ami-redash-disc-full/">https://nunubuff.com/blog/ec2-ami-redash-disc-full/</a></p>
</blockquote>
<blockquote>
<p><code>$ sudo du -msh /* | sort -nr</code> 이 명령어로 용량을 가장 많이 사용하고 있는 곳이 어디인지 찾아보니 
<img src="https://velog.velcdn.com/images/kiwony_/post/93b0a109-57fa-4547-8e01-5686e224eaf0/image.png" alt="">
오 봐도 모르겠다 차차 알아봐야겠다.
암튼 var 디렉토리가 4기가나 차지하고 있으니 
/var/log/journal 에 저장된 저널의 용량을 삭제하기로 했다.</p>
</blockquote>
<blockquote>
<p>난 간이 작기 때문에 
3일 이전의 항목을 여러번 삭제 하기로 했다..
<code>sudo journalctl --vacuum-time=3d</code>
한 10번 정도 명령어를 실행한 뒤 reboot를 했다.
결과는 굳! 67.7%로 줄였다. (아래는 도커랑 필요없는 파일도 모두 삭제한 모습이다)
<img src="https://velog.velcdn.com/images/kiwony_/post/cdda745f-8745-4682-91e1-3ac9a444c9b8/image.png" alt="">
mongodb도 정상적으로 실행할 수 있고 브로드보드에서도 정상적으로 데이터들을 확인할 수 있었다.</p>
</blockquote>
<blockquote>
<p>참고한 journalctl 명령어<br><a href="https://linux.just4fun.biz/?Linux%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8A%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%83%BBjournalctl">https://linux.just4fun.biz/?Linux%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8A%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%83%BBjournalctl</a></p>
</blockquote>
<p>참고
<a href="https://intrepidgeeks.com/tutorial/log-in-to-the-linux-server-to-solve-the-problem-of-temporarily-unavailable-resources-increase-the-number-of-user-threads">https://intrepidgeeks.com/tutorial/log-in-to-the-linux-server-to-solve-the-problem-of-temporarily-unavailable-resources-increase-the-number-of-user-threads</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2022]100일 챌린지 목표]]></title>
            <link>https://velog.io/@kiwony_/2022-100%EC%9D%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%AA%A9%ED%91%9C</link>
            <guid>https://velog.io/@kiwony_/2022-100%EC%9D%BC-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%AA%A9%ED%91%9C</guid>
            <pubDate>Fri, 23 Sep 2022 10:17:04 GMT</pubDate>
            <description><![CDATA[<p>✔ 알고리즘과 자료구조 강의 완강
✔ 유데미 파이썬 부트캠프 58일 차까지 학습 (디코에 최소 3일에 한 번 인증하기)
✔ 1일 1 WIL</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로젝트] SNS 개인과제 회고 ]]></title>
            <link>https://velog.io/@kiwony_/%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9sns</link>
            <guid>https://velog.io/@kiwony_/%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9sns</guid>
            <pubDate>Sun, 31 Jul 2022 13:02:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kiwony_/post/a5b9915f-1ea9-477c-afe5-a41296af282c/image.png" alt=""></p>
<p><em><strong>7.20 ~ 7.27 ~ 고도화</strong></em></p>
<p>5일 간의 다섯번째과제, sns 과제가 끝났다.
그동안 팀으로 하던 과제를 이번에는 개인과제로 받았다.
개발환경세팅부터 혼자서 해야했다. 
사실 개인과제였지만 팀원분들의 도움을 많이 받으면서 진행했다. 
마지막까지 감사합니다.</p>
<h1 id="😬-problems-i-faced">😬 Problems I faced</h1>
<blockquote>
<p><strong>첫번째 문제 : 모델링</strong></p>
</blockquote>
<p>가장 먼저 직면한 문제는 모델링이었다. ERD로 모델링의 각을 잡은 후 진행하였으나 기능을 하나씩 구현하다보니 필드를 변경하고 함수를 추가해야하는 문제가 빈번하게 발생했었다. 
해시태그와 좋아요를 ManyToManyField로 변경했다.</p>
<p>좋아요는 IntegerField로 설정한뒤 default로 0으로 설정한 후 증가시켜가면 된다고 생각했는데, 이렇게 되면 좋아요 취소를 구현하는 것이 어려웠다.
request.user가 좋아요 눌렀다면 -1, 누른 적이 없다면 +1 하여 if문으로 구현할 수 있을 줄 알았는데 
팀원분의 조언에 힘입어 ManyToMany로 변경하였다.</p>
<p>해시태그는 CharField에서 입력받은 값을 ,을 기준으로 split하여 구현하려고 했는데, 확장성이 부족하다는 팀원님의 말씀에 ManyToMany로 변경하였다.</p>
<blockquote>
<p><strong>두번째 문제 : 해시태그 필터링</strong></p>
</blockquote>
<p>해시태그를 django-filter로 구현하고 싶었다.
필터링은 간단히 구현할 수 있었다.
문제는 url을 <code>list?hashtags=해시태그이름</code>로 설정하고 싶은데
<code>list?hashtags=해시태그아이디</code> 처럼 해시태그의 아이디값으로 설정되어 골머리를 앓았다.
문제 해결은 stackoverflow에서 질문하여 해결했다.</p>
<p><a href="https://stackoverflow.com/questions/73103673/how-to-customize-showing-query-parameter-with-drf-filtering-manytomanyfield">https://stackoverflow.com/questions/73103673/how-to-customize-showing-query-parameter-with-drf-filtering-manytomanyfield</a></p>
<p>django-filter의 FilterSet을 상속받아 새로운 HashtagFilter를 생성하였다.</p>
<blockquote>
<p><strong>세번째 문제 : 배포</strong></p>
</blockquote>
<p>nginx, mysql, django프로젝트를 docker-compose를 사용하여 배포하였다.
배포에는 성공했지만 static 파일이 적용이 안 되는 문제가 발생하였다.
nginx와 docker-compose파일, settings파일의 static경로를 잘못 설정한 줄 알았으나, 진짜 문제는 port에 있었다. 
ec2 서버도 8000번 포트를 열어놓고 계속 접속하고 있는게 문제였고, 80번 포트로 접속하니 정상적으로 static 파일도 적용이 되었다.</p>
<p>8000번 포트는 gunicorn과 django가 소통하는 포트이고, 
user - ec2 - nginx 는 80포트로 소통한다고 보면 된다.</p>
<h1 id="😊-what-i-learned">😊 What I learned</h1>
<ul>
<li>ManyToManyField를 이해하고 사용할 수 있다.</li>
<li>ManyToManyField의 경우 생성, 수정할 때 어떻게 접근해야하는지에 대해 배웠다.</li>
<li>simple jwt를 사용한 jwt인증방식 로그인을 구현했다.</li>
<li>django-filter에서 FilterSet을 상속받아 filter를 custom 하는 방식에 대해 배웠다.</li>
<li>django서버, gunicorn, nignx 가 어떻게 request, response하는지 배우고 이해했다. </li>
</ul>
<br/>

<h1 id="🤗-ill-try-later">🤗 I&#39;ll try later</h1>
<ul>
<li>django-filter를 사용하지 않고 Q()를 사용하여 정렬, 필터링, 검색을 구현해봐야겠다.</li>
<li>이번에는 프론트엔드 단에서 로그아웃을 처리한다해서 냅뒀지만 다음에는 simple jwt의 blacklist로 로그아웃을 구현해봐야겠다.</li>
<li>network를 생성하여 배포해보고 싶다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로젝트] ideaconcert 기업과제 회고]]></title>
            <link>https://velog.io/@kiwony_/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-ideaconcert-%EA%B8%B0%EC%97%85%EA%B3%BC%EC%A0%9C-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@kiwony_/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-ideaconcert-%EA%B8%B0%EC%97%85%EA%B3%BC%EC%A0%9C-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 31 Jul 2022 04:02:34 GMT</pubDate>
            <description><![CDATA[<p><em><strong>7/18 ~ 7/19</strong></em></p>
<p>엄청 간단한 과제를 받았다. 너무 간단해서 당황스러웠지만 온전히 개인마다 배포를 직접할 수 있는 기회라고 생각하니 좋았다.
물론 이게 프로그램 초반에 주어진 과제였으면 더 좋았겠지만.. ಠ_ಠ</p>
<h1 id="😬-problems-i-faced">😬 Problems I faced</h1>
<blockquote>
<p><strong>문제 : nginx</strong></p>
</blockquote>
<p>nginx.conf 파일을 작성할 때 어려움을 좀 겪었다.
upstream 설정 빼놓기 + dockerfile에서 workdir copy 명령어 누락
에서 에러가 났다.</p>
<h1 id="😊-what-i-learned">😊 What I learned</h1>
<ul>
<li>터미널 상에서 nginx, gunicorn, django를 연결하여 배포하는 것을 처음부터 끝까지 혼자서 도전해봤다. </li>
<li>Elastic IP를 ec2 인스턴스에 연결하는 방법을 배웠다.</li>
</ul>
<h1 id="🤗-ill-try-later">🤗 I&#39;ll try later</h1>
<p>내가 혼자 한 프로젝트를 똑같이 배포해보겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로젝트] payhere 기업과제 회고]]></title>
            <link>https://velog.io/@kiwony_/%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9payhere</link>
            <guid>https://velog.io/@kiwony_/%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9payhere</guid>
            <pubDate>Tue, 19 Jul 2022 20:15:55 GMT</pubDate>
            <description><![CDATA[<p><em><strong>7.4 ~ 7.8</strong></em></p>
<p>5일 간의 첫번째과제, payhere 기업과제가 끝났다.
나는 가계부의 crud를 구현하고, 그에 대한 테스트코드를 작성했다.
브랜치를 사용하여 협업을 하는 것에 익숙해졌다.</p>
<h1 id="😬-problems-i-faced">😬 Problems I faced</h1>
<blockquote>
<p>*<em>첫번째 문제 : Docker 환경에서의 개발 *</em></p>
</blockquote>
<p>협업을 함에 있어 각자의 로컬환경이 다르다보니 도커로 개발환경을 만들어 작업을 진행하는게 좋다는 의견이 나와 모델링과 함께 개발환경도 같이 세팅했다.
그리고 docker-compose 파일에 웹서버와 db를 만들어 동시에 컨테이너를 실행시키는 방식으로 진행을 하였는데, 웹서버를 실행시키는 명령어를 잘못 입력한 부분에서 계속 막혔었다. (web bash를 사용하겠다는 명령어를 입력한 다음에 서버를 실행시켜야했다) 
이렇게 초반에 개발환경 세팅 때 시간이 꽤 지체됐었던 것은 docker에 익숙지 않아서였다고 생각한다. </p>
<p>그리고 마지막으로 도커가 무거워서 내 노트북이 굉장히 느려졌다. 
테스트하는 데도 시간이 오래걸렸다. 빨리 새 노트북을 사고 싶다..</p>
<blockquote>
<p><strong>두번째 문제 : 삭제했던 것을 복구하는 기능</strong></p>
</blockquote>
<p>삭제한 내역은 언제든지 다시 복구 할 수 있어야 한다는 것이 과제의 요구사항 중 하나였다. 이를 함수로 정의하여 delete_flag를 기준으로 toggle형식으로 삭제/복구할 수 있도록 구현하였는데(다른 팀원이 의견을 내신 후 utills.py에 작성하셨다.) 이.. 함수가 적용되는 것을 이해하는 데에 오래걸렸다. </p>
<blockquote>
<p><strong>세번째 문제 : 테스트 코드</strong></p>
</blockquote>
<p>가계부 crud를 테스트하는 코드를 작성하던 중에 
로그인을 한 사용자, 즉 이 프로젝트에서는 token이 발급된 사용자만이 crud를 할 수있다고 생각해서 토큰이 발급되는 부분까지 테스트코드를 짰다. 
근데 이렇게 테스트 코드를 짜면 unit test가 아니라 integration test가 되어버린다. </p>
<h1 id="😊-what-i-learned">😊 What I learned</h1>
<ul>
<li>delete_flag를 설정하여 삭제/복구를 구현하는 로직에 대해 이해했다.</li>
<li>보통 delete는 완전삭제라서 잘 쓰지않는다고 한다. patch로 구현했다. (인스타계정을 삭제해도 한 달 간 다시 복구할 수 있는 것도 이 로직에 의한 것일까) </li>
<li>docker 환경에서 개발하는 방법에 대해 배웠다.</li>
<li>한개의 APIView에서 메소드를 오버라이딩하는 방법을 배웠다. 
한개의 view로 깔끔한 코드를 작성할 수 있었다. </li>
<li>테스트코드를 로그인까지 구현하면서 시간은 오래 걸렸지만, jwt토큰이 작동하는 방식에 대해 이해할 수 있었다.</li>
<li>test와 view의 폴더를 따로 생성하여 협업할 때 느꼈던 불편함을 해결했다.
이때 test 폴더 안에는 <strong>init</strong>.py를 생성해야 테스트가 작동한다.</li>
<li>crud의 테스트 코드를 작성하는 방법에 대해 배웠다. 데이터 setup 부터 성공, 실패 테스트까지</li>
<li>postman으로 회원가입, 로그인, crud api를 실행하고 사용하는 방법에 대해 배웠다.</li>
<li>코드리뷰에 익숙해졌다.</li>
</ul>
<h1 id="🤗-ill-try-later">🤗 I&#39;ll try later</h1>
<p>나중에 도커에서 작업하는 환경을 직접 세팅하여 개발해보고 싶다.
다른 팀원이 작성한 카테고리 view를 분석해야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로젝트]labq 기업과제 회고 ]]></title>
            <link>https://velog.io/@kiwony_/%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9labq</link>
            <guid>https://velog.io/@kiwony_/%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9labq</guid>
            <pubDate>Thu, 14 Jul 2022 04:14:35 GMT</pubDate>
            <description><![CDATA[<p>_<strong>6.29 ~ 7.1</strong>
_
<br/></p>
<p>3일 간의 첫번째과제, labq 기업과제가 끝났다. 
나는 view 테스트 코드를 작성 중
view의 우량계 리스트와 open api의 우량계 리스트가 동일한지 테스트하는 코드를 작성했다.</p>
<h1 id="😬-problems-i-faced">😬 Problems I faced</h1>
<blockquote>
<h4 id="첫번째-problem--test-code">첫번째 problem : Test code</h4>
</blockquote>
<p>테스트코드의 존재를.. 처음 알았다..</p>
<p>먼저 다른 팀원분들께서 openapi를 이용해서 데이터를 가공하는 view를 작성하신 후, 그 view의 테스트 코드를 작성하기로 계획을 짰다. 그래서 다행히!! 시간적 여유가 생겨서 하루반 정도는 테스트코드에 대해서 공부할 수 있었다. </p>
<p>일단 어떤 테스트코드를 짜야하는지 정하는 것부터 어렵게 느껴졌다. 
그래서 같이 테스트코드를 짜는 분께 많은 도움을 받았다.</p>
<p>그리고 전체적인 과제 분석에서도 조금 어려움을 느꼈는데,
data를 어디에 이용할 건지 목적이 불분명해서 특히 그랬다고 생각한다.</p>
<blockquote>
<h4 id="두번째-problem--git">두번째 problem : Git</h4>
</blockquote>
<p>그동안 git을 커밋과 푸시용으로만 사용했기 때문에 pull, rebase 등 협업에 필요한 깃 명령어들을 사용할 줄 몰랐다. 
그리고 github에서 사용하는 issue와 PR등을 처음 접했다.
그래서 과제 시작하기 전, 전체적으로 깃허브를 어떻게 관리할지 정할 때 대화를 따라가기 조금 어려웠다.</p>
<blockquote>
<h4 id="세번째-problem--python-문법">세번째 problem : Python 문법</h4>
</blockquote>
<p>일단 익숙지않은 파이썬 함수들이 많았다.
set(), sort(), 등을 자유롭게 쓸 수 없었고, 딕셔너리와 리스트를 충분히 알고 있다고 생각했는데, 딕셔너리 안에 리스트가 있고, 또 그 안에 딕셔너리가 있는 형태의 데이터를 가지고 놀기에는 많이 부족했다. </p>
<hr>

<h1 id="😊-what-i-learned">😊 What I learned</h1>
<p>일단 위에서 어렵다고 언급한 것들을 모두 배웠다고 볼 수 있다..
그래도 정리하자면</p>
<ul>
<li>git branch를 이용하여 협업하는 것을 배웠다.</li>
<li>PR과 issue를 사용하여 깃허브를 관리하는 법을 배웠다.</li>
<li>git convention의 중요성을 알았다. </li>
<li><blockquote>
<p>이슈번호와 커밋 메세지를 연결하기 위해 커밋메세지에서 #이슈번호~로 작성하였는데, #가 앞에오면 에러가 발생해서 이를 다음 프로젝트부터는 마지막에 쓰는 방식으로 바꾸기로 했다.</p>
</blockquote>
</li>
<li>django의 unit test의 작성법을 배웠다.</li>
<li>python 함수 사용에 익숙하지않다는 것을 알았다. 따로 공부해한다.</li>
</ul>
<ul>
<li>다른 팀원이 짠 view코드에서도 익숙하지 않은 함수가 많았다. 
  sort함수의 lambda, groupby 함수</li>
</ul>
<hr>

<h1 id="🤗-ill-try-later">🤗 I&#39;ll try later</h1>
<p>테스트 코드를 작성해봤으니 view 코드를 직접 작성해보면 좋을 것 같다고 생각한다.
openapi를 사용하여 데이터를 만진 적이 없어 해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[drf] Foreign key 가지고 놀기 ]]></title>
            <link>https://velog.io/@kiwony_/drf-Foreign-key-%EA%B0%80%EC%A7%80%EA%B3%A0-%EB%86%80%EA%B8%B0</link>
            <guid>https://velog.io/@kiwony_/drf-Foreign-key-%EA%B0%80%EC%A7%80%EA%B3%A0-%EB%86%80%EA%B8%B0</guid>
            <pubDate>Mon, 27 Jun 2022 20:36:16 GMT</pubDate>
            <description><![CDATA[<p><strong>Company/models.py</strong></p>
<pre><code class="language-python">class Companys(models.Model):
    company_name = models.CharField(max_length=50)
    types = models.CharField(max_length=50)

    def __str__(self):
        return self.company_name</code></pre>
<hr>

<p><strong>Job/models.py</strong></p>
<pre><code class="language-python">class Job(models.Model):
    company = models.ForeignKey(&#39;Company.Companys&#39;, on_delete=models.CASCADE, null = True, related_name=&quot;company&quot;)
    position = models.CharField(max_length=500, null=False)
    compensation = models.IntegerField(null=False)
    description = models.TextField(null=False)
    skills = models.CharField(max_length=200, null=False)

    def __str__(self):
        return self.company</code></pre>
<hr>

<p><strong>Job/serializers.py</strong></p>
<pre><code class="language-python">class JobSerializer(serializers.ModelSerializer):
    company = serializers.ReadOnlyField(source=&quot;company.company_name&quot;)
    class Meta:
        model = Job
        fields = [&#39;id&#39;,&#39;company&#39;,&#39;position&#39;,&#39;skills&#39;,]</code></pre>
<p>Companys 모델에서 정의한 필드인 company_name만을 readonly로 가져오고 싶다~
Companys 모델은 Job모델에서 Foreignkey로 가지고 있으니,
source로 가져오면 된다.
<code>source=&quot;[Job(자식테이블)에서 foreingkey를 가지고 있는 필드].[Companys(부모테이블)에서 가져오고 싶은 필드]&quot;</code></p>
<p><del>~
nested serializer도 작성하기 ~</del>
작성중 ~~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[drf] modelSerializer]]></title>
            <link>https://velog.io/@kiwony_/django-modelSerializer</link>
            <guid>https://velog.io/@kiwony_/django-modelSerializer</guid>
            <pubDate>Mon, 27 Jun 2022 20:08:48 GMT</pubDate>
            <description><![CDATA[<h2 id="modelserializer">modelserializer</h2>
<blockquote>
<p>The <strong>ModelSerializer class</strong> provides a shortcut that lets you automatically create a Serializer class with fields that correspond to the Model fields.</p>
</blockquote>
<p>modelserializer상속받아 작성했다.
fields를 모두 받을 땐 <code>&#39;__all__&#39;</code>으로 작성하면되고, 
아래와 같이 원하는 fields만 지정할 수도 있다.</p>
<pre><code class="language-python">class JobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job
        fields = [&#39;company&#39;,&#39;position&#39;,&#39;compensation&#39;,&#39;description&#39;,&#39;skills&#39;]
</code></pre>
<hr>

<h2 id="update-메소드-작성">update 메소드 작성</h2>
<p>modelserializer는 create와 update 메소드를 사용 할 수 있는데</p>
<p>이때 update할 때 company 필드는 업데이트를 불가능하게 만들 때는 update 메소드에서 company만 제외하여 메소드를 작성하면 된다.</p>
<pre><code class="language-python">def update(self, instance, validated_data):
        instance.position = validated_data.get(&#39;position&#39;, instance.position)
        instance.compensation = validated_data.get(&#39;compensation&#39;, instance.compensation)
        instance.description = validated_data.get(&#39;description&#39;, instance.description)
        instance.skills = validated_data.get(&#39;skills&#39;, instance.skills)
        return instance</code></pre>
<p><strong><del>~ ~</del> 작성중 <del>~ ~</del></strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[원티드 프리온보딩코스 숏에세이]]></title>
            <link>https://velog.io/@kiwony_/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9%EC%BD%94%EC%8A%A4-%EC%88%8F%EC%97%90%EC%84%B8%EC%9D%B4</link>
            <guid>https://velog.io/@kiwony_/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9%EC%BD%94%EC%8A%A4-%EC%88%8F%EC%97%90%EC%84%B8%EC%9D%B4</guid>
            <pubDate>Sun, 19 Jun 2022 05:57:30 GMT</pubDate>
            <description><![CDATA[<h2 id="프리온보딩-코스에는-참가기업에-지원해야-하는-제도가-있습니다"><strong>프리온보딩 코스에는 참가기업에 지원해야 하는 제도가 있습니다</strong></h2>
<hr>
<hr>

<h3 id="왜-이런-제도가-있는가">왜 이런 제도가 있는가</h3>
<p>프리온코딩코스는 협업과 같은 실무경험에 초점을 두고 진행하는 교육입니다.</p>
<p>지원자는 단순히 강의를 듣고 적용시키는 것을 넘어서 동료들과의 협업을 통해 개발자에게 필요한 자세를 배울 수 있습니다. 또한 실무에서 접할 수 있는 수준의 과제를 계속해서 마주하면서 기술에 대한 역량을 높일 수 있습니다.</p>
<p>기업은 코스를 통해 실무경험에 익숙해진 개발자를 고용함으로써 신입트레이닝 시간을 보다 줄이고면서 실무업무에 투입시킬 수 있는 인재를 얻습니다.</p>
<p>이렇게 기업과 개발자, 서로의 이해관계를 충족시키는 제도이기 때문에 원티드에서 도입하였다고 생각됩니다.</p>
<h3 id="지원하고-싶은-참가-기업">지원하고 싶은 참가 기업</h3>
<p>저는 코이랩스에 지원하고 싶습니다.
코이랩스는 드라마, 예능, K-pop 등 한국 콘텐츠를 활용한 한국어 교육 서비스를 제공하는 기업입니다. 
세계적으로 한류문화가 뻗어나가는 지금, 한국어를 배우고싶어하는 외국인들이 많아졌습니다. 이에 접근성이 높은 콘텐츠를 통해 외국인들이 보다 쉽게 한국어를 학습하는 서비스는 중요하다고 생각됩니다. 
이러한 서비스를 제공하는 코이랩스에 소속되어 한국어교육을 제공하는 일을 하고 싶습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dockerfile작성]]></title>
            <link>https://velog.io/@kiwony_/Dockerfile%EC%9E%91%EC%84%B1</link>
            <guid>https://velog.io/@kiwony_/Dockerfile%EC%9E%91%EC%84%B1</guid>
            <pubDate>Sat, 04 Jun 2022 11:38:50 GMT</pubDate>
            <description><![CDATA[<h2 id="1-dockerfile의-기본-명령어-">1. *<em>Dockerfile의 기본 명령어 *</em></h2>
<p><a href="https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/#dockerfile-%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4">https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/#dockerfile-%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SITE_ID = ]]></title>
            <link>https://velog.io/@kiwony_/SITEID</link>
            <guid>https://velog.io/@kiwony_/SITEID</guid>
            <pubDate>Sat, 14 May 2022 13:21:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>STIE_ID 에 관한 문서 
<a href="https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-SITE_ID">https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-SITE_ID</a></p>
</blockquote>
<p><a href="https://stackoverflow.com/questions/25468676/django-sites-model-what-is-and-why-is-site-id-1">https://stackoverflow.com/questions/25468676/django-sites-model-what-is-and-why-is-site-id-1</a></p>
<p>DB browser for SQLite에서 프로젝트 데이터베이스의  django site 테이블모습이다. 내가 장고관리자페이지에서 기존에 있던 domain인 example.com과 이전에 추가했었던 다른 domain들을 삭제 했었기 때문에 site의 id가 4부터 시작하고 있는 것을 볼 수 있다.
이 때는 settings.py에서 SITE_ID=4로 바꿔주어야 정상 작동한다.</p>
<p><img src="https://images.velog.io/images/kiwony_/post/2bb37083-879a-4611-b327-f9e9fe76d8f1/image.png" alt=""></p>
<p>추가한 redirect_uri의 모습</p>
<p><img src="https://images.velog.io/images/kiwony_/post/c06d0874-a9a5-4a95-8b84-c466bceaf461/image.png" alt=""></p>
<p>장고관리자 socialaccount에서 추가한 사이트 목록
<img src="https://images.velog.io/images/kiwony_/post/95d2b05c-fe1a-4d68-856d-499e9f5463b0/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[aws s3 ]]></title>
            <link>https://velog.io/@kiwony_/aws-s3</link>
            <guid>https://velog.io/@kiwony_/aws-s3</guid>
            <pubDate>Thu, 21 Apr 2022 07:31:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kiwony_/post/0685178a-15d1-494b-ab40-4949a48e8051/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kiwony_/post/85d4a9c6-116b-46c4-8b03-598741430d79/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker]portainer설치, 오류해결]]></title>
            <link>https://velog.io/@kiwony_/Dockerportainer-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@kiwony_/Dockerportainer-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Thu, 24 Mar 2022 08:53:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>문서 <a href="https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux#introduction">https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux#introduction</a></p>
</blockquote>
<h1 id="1-portainer가-db를-저장하기-위해-사용할-volume-만들기">1. portainer가 db를 저장하기 위해 사용할 volume 만들기</h1>
<pre><code class="language-bash">sudo docker volume create portainer_data</code></pre>
<br/>

<h1 id="2-portainer-설치">2. portainer 설치</h1>
<p>-p 9000:9000 옵션이
Docker 에서 사용하는 포트 9000번과 Docker가 설치된 호스트 포트 9000 번과 매칭 시키는 옵션이다.
이로써 외부에서도 9000 포트를 통해 Portainer 관리 페이지에 접근할 수 있게 된다.</p>
<pre><code class="language-bash">sudo docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.11.1</code></pre>
<h1 id="3-설치된-portainer-확인">3. 설치된 portainer 확인</h1>
<pre><code class="language-bash">sudo docker ps
또는
sudo docker container ls</code></pre>
<p><img src="https://images.velog.io/images/kiwony_/post/58dd870f-6162-4c8a-86f0-c582feb90bf7/image.png" alt=""></p>
<h1 id="4-aws에서-ec2서버의-포트-열기">4. aws에서 ec2서버의 포트 열기</h1>
<p>9000번 포트 </p>
<h3 id="client-sent-an-http-request-to-an-https-server-오류">client sent an HTTP request to an HTTPS server 오류</h3>
<p>[퍼블릭ip]:9443으로 접속했었을 때의 오류 </p>
<p>9000포트 새로 열었더니 해결. 
대신 새로 열었으니까 이미지도 두 개, 컨테이너도  두 개..</p>
<h1 id="5-create-user">5. create user</h1>
<h1 id="6-connect-docker">6. connect docker</h1>
<p><img src="https://images.velog.io/images/kiwony_/post/f125a3af-6464-4645-a77a-01d167304d30/image.png" alt=""></p>
<h1 id="7-swarm-초기화">7. swarm 초기화</h1>
<pre><code class="language-bash">sudo docker swarm init </code></pre>
<h1 id="8-portainerio에서-swarm과-secrets-카테고리가-생긴-것을-확인할-수-있음">8. portainer.io에서 swarm과 secrets 카테고리가 생긴 것을 확인할 수 있음.</h1>
<blockquote>
</blockquote>
<p>출처 :
<a href="https://help.iwinv.kr/manual/read.html?idx=548">https://help.iwinv.kr/manual/read.html?idx=548</a>
작정하고 장고</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker 설치(ubuntu),제거, 오류해결]]></title>
            <link>https://velog.io/@kiwony_/Docker-%EC%84%A4%EC%B9%98ubuntu</link>
            <guid>https://velog.io/@kiwony_/Docker-%EC%84%A4%EC%B9%98ubuntu</guid>
            <pubDate>Tue, 22 Mar 2022 18:27:40 GMT</pubDate>
            <description><![CDATA[<h1 id="1-aws-ec2-server-대여">1. AWS ec2 server 대여</h1>
<p><img src="https://images.velog.io/images/kiwony_/post/7159743d-1499-4053-8ff5-6d9e7b4d7b5a/image.png" alt="">
keypair를 다운 받은 후 프로젝트의 BASE_DIR 아래에 둔다.</p>
<h1 id="2-server-연결">2. server 연결</h1>
<p>gitbash에서 해당 프로젝트 파일로 이동한 다음 명령어로 서버에 접속</p>
<pre><code class="language-bash">ssh -i [keypair 이름] ubuntu@[ec2의 퍼블릭아이피]</code></pre>
<h1 id="3-ubuntu에-docker-설치">3. ubuntu에 docker 설치</h1>
<blockquote>
<p>문서 <a href="https://docs.docker.com/engine/install/ubuntu/">https://docs.docker.com/engine/install/ubuntu/</a></p>
</blockquote>
<p><img src="https://images.velog.io/images/kiwony_/post/5b1cc59e-fa1b-4fcb-97a0-e860d5f84406/image.png" alt=""></p>
<h2 id="근데-여기서">!!!!근데 여기서</h2>
<p>도커의 GPG key를 입력하라고 하는데 이런 경고가 뜬다. 
<strong>warning: unsafe ownership on homedir &#39;/home/ubuntu/.gnupg&#39;</strong>
<img src="https://images.velog.io/images/kiwony_/post/09514c5b-baa0-4381-a938-8ec7349fb989/image.png" alt="">
처음 설치할 때는 그냥 무시하고 덮어쓴다고 했었는데 두번째로 설치할 때는 아래 명령어를 입력했다.</p>
<blockquote>
<pre><code class="language-bash">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></pre>
</blockquote>
<pre><code>
![](https://images.velog.io/images/kiwony_/post/dfc66047-ed1b-485f-8965-4bb3dce34719/image.png)

## **Package &#39;docker-ce&#39; has no installation candidate** 
다른 서버에서 설치할 때 위와 같은 에러가 떴는데 
해결방법은 
&gt; https://boying-blog.tistory.com/82 에서 참고했다

# 4. 설치 확인

도커 버전 확인하기

```bash
docker --version</code></pre><h1 id="5-docker-제거">5. docker 제거</h1>
<blockquote>
<p><a href="https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine">https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 참고사이트]]></title>
            <link>https://velog.io/@kiwony_/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%B0%B8%EA%B3%A0%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@kiwony_/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%B0%B8%EA%B3%A0%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Tue, 22 Mar 2022 11:46:44 GMT</pubDate>
            <description><![CDATA[<h1 id="리눅스-명령어">리눅스 명령어</h1>
<p><a href="https://akdl911215.tistory.com/201">https://akdl911215.tistory.com/201</a></p>
<h1 id="portainer-삭제-시">portainer 삭제 시</h1>
<p><a href="https://linuxize.com/post/how-to-remove-docker-images-containers-volumes-and-networks/">https://linuxize.com/post/how-to-remove-docker-images-containers-volumes-and-networks/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[django] 환경변수 설정-env 파일]]></title>
            <link>https://velog.io/@kiwony_/django-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-env-%ED%8C%8C%EC%9D%BC</link>
            <guid>https://velog.io/@kiwony_/django-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-env-%ED%8C%8C%EC%9D%BC</guid>
            <pubDate>Sat, 19 Mar 2022 21:52:18 GMT</pubDate>
            <description><![CDATA[<p>공식문서 <a href="https://django-environ.readthedocs.io/en/latest/">https://django-environ.readthedocs.io/en/latest/</a></p>
<ol>
<li><p><strong>django-environ</strong> 설치 (environ으로 설치XX)</p>
</li>
<li><p>BASE_DIR는 굳이 바꾸지않아도 됨</p>
</li>
</ol>
<p><img src="https://images.velog.io/images/kiwony_/post/711826be-62fe-4aed-8ec7-77c1e4d28a4b/image.png" alt=""></p>
<ol start="3">
<li><p>.env파일 생성 후 아래와 같이 작성
 <strong>주의</strong> SECRET_KEY=시크릿키 작성 시 띄어쓰기 금지..</p>
<p><img src="https://images.velog.io/images/kiwony_/post/57643975-bdec-48c2-b456-b793f93c577a/%ED%99%94%EB%A9%B4%20%EC%BA%A1%EC%B2%98%202022-03-20%20065045.png" alt=""></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python]줄바꿈]]></title>
            <link>https://velog.io/@kiwony_/python%EC%A4%84%EB%B0%94%EA%BF%88</link>
            <guid>https://velog.io/@kiwony_/python%EC%A4%84%EB%B0%94%EA%BF%88</guid>
            <pubDate>Tue, 15 Mar 2022 14:36:16 GMT</pubDate>
            <description><![CDATA[<p>한번에 출력하면서 줄을 바꾸고 싶을 때</p>
<pre><code class="language-python">print(1,y,7,9, sep=&quot;\n&quot;)
print(&quot;1\ny\n7\n9&quot;)

#출력
#1
#y
#7
#9</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] split(), map(), range()]]></title>
            <link>https://velog.io/@kiwony_/python-split</link>
            <guid>https://velog.io/@kiwony_/python-split</guid>
            <pubDate>Mon, 14 Mar 2022 14:31:09 GMT</pubDate>
            <description><![CDATA[<h1 id="문자열-나눌-때-쓰는-함수-split">문자열 나눌 때 쓰는 함수 split()</h1>
<blockquote>
</blockquote>
<h4 id="공백-기준-split">공백 기준 split</h4>
<pre><code class="language-python">a = &quot;hello world&quot;
a.split()</code></pre>
<br/>
> 
#### 특정값을 기준으로 split
```python
a = "v,n,e,w,u"
a.split(",")
```

<blockquote>
</blockquote>
<h4 id="입력한-값을-나누고-싶을-때">입력한 값을 나누고 싶을 때</h4>
<pre><code class="language-python">input().split()</code></pre>
<br/>
> 
#### 입력한 값을 나누어 각각 변수에 담고 싶을 때
```python
a, b = input().split()
```

<h1 id="map">map()</h1>
<p>map 함수는 첫 번째 인자인 함수에 두번째 인자의 자료형을 한번씩 집어넣어서 함수를 수행한다.</p>
<p><em>반복가능한 자료형 : tuple, list etc</em>
<br/></p>
<blockquote>
<p>*<em>map (적용시킬 함수, 반복가능한 자료형)        *</em><br><br/></p>
</blockquote>
<pre><code class="language-python">def addition(n):
    return n + n
numbers = (1, 2, 3, 4)
result = map(addition, numbers)
print(list(result))</code></pre>
<br/>
>
적용시킬 addition함수는 (인자 값 + 인자 값)으로 정의되어있다.
그 addition 함수에 tuple형태의 number를 하나씩 넣으면서 map함수를 실행한다.





<p>사이트
<a href="https://www.geeksforgeeks.org/python-map-function">https://www.geeksforgeeks.org/python-map-function</a></p>
<h1 id="range">range()</h1>
<p>range(start, stop, step)</p>
<blockquote>
</blockquote>
<pre><code class="language-python">range(a)        # 0 ~ a-1
range(a,b)        # a ~ b-1
range(a,b,c)    # a ~ b-1 까지의 숫자 중에서 c의 간격으로 </code></pre>
<blockquote>
<p>n부터 1까지 차례로 출력</p>
</blockquote>
<pre><code class="language-python">n = int(input())
for i in range(n,0,-1):
    print(i)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[django][error]
django.db.migrations.exceptions.InconsistentMigrationHistory]]></title>
            <link>https://velog.io/@kiwony_/djangoerrordjango.db.migrations.exceptions.InconsistentMigrationHistory</link>
            <guid>https://velog.io/@kiwony_/djangoerrordjango.db.migrations.exceptions.InconsistentMigrationHistory</guid>
            <pubDate>Wed, 09 Mar 2022 18:17:22 GMT</pubDate>
            <description><![CDATA[<p>allauth를 이용해서 django 카카오 로그인을 구현하는 과정에서 
migration을 해도 아래의 오류가 계속 뜨는 문제가 발생했다.</p>
<p>내가 socialaccount앱을 migrate한 후에
django.contrib.sites 프레임워크를 makemigration - migrate 해서 생긴 오류이다.
순서가 잘못됐었던 것 같다.</p>
<blockquote>
</blockquote>
<p>django.db.migrations.exceptions.InconsistentMigrationHistory: Migration socialaccount.0001_initial is applied before its dependency sites.0001_initial on database &#39;default&#39;.</p>
<p>초기화랑 merge를 해도 똑같은 오류가 떠서 아래 블로그를 참고하여 해결했다.</p>
<p><a href="https://www.jgahn.com/archive/post/40/">https://www.jgahn.com/archive/post/40/</a></p>
<p>socialaccount.0001_initial이 sites.0001_initial보다 먼저 적용되서 생긴 문제인 것 같으니, socialaccountapp을 주석 처리한 후 sites를 migrate한 다음, 주석풀고,
전부 makemigration, migrate 하니 해결되었다! </p>
<p><img src="https://images.velog.io/images/kiwony_/post/24010382-2aa1-4b58-82e7-cd19ff1af83a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체(Object)]]></title>
            <link>https://velog.io/@kiwony_/%EA%B0%9D%EC%B2%B4Object</link>
            <guid>https://velog.io/@kiwony_/%EA%B0%9D%EC%B2%B4Object</guid>
            <pubDate>Sat, 05 Mar 2022 18:28:56 GMT</pubDate>
            <description><![CDATA[<h4 id="객체object">객체(object)</h4>
<p>속성(properties)와 메서드(methods)을 모아 놓은 것. </p>
<h4 id="객체-지향-프로그래밍object-oriented-programming">객체 지향 프로그래밍(object oriented programming)</h4>
<p>모델을 만들어 그 모델이 어떤 역할을 가지고 어떻게 행동해야 하는지 정의하여 알아서 상호작용할 수 있도록 만드는 것.</p>
<h4 id="모델에서는-객체이다">모델에서는 객체이다.</h4>
<p>class로 객체를 정의하며, </p>
<pre><code class="language-python">class Project(models.Model):

    title = models.CharField(max_length=10, null= False)
    image = models.ImageField(upload_to=&quot;project/&quot; , null = False)

    description = models.TextField(max_length=100, null=True)

    create_at = models.DateField(auto_now =True, null = False)
#메서드
    def __str__(self):
        return f&quot;{self.pk} : {self.title}&quot;</code></pre>
]]></description>
        </item>
    </channel>
</rss>