<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>andromeda_galaxy.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요.</description>
        <lastBuildDate>Wed, 31 Jul 2024 14:32:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. andromeda_galaxy.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/andromeda_galaxy" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[MIL3] 7월 회고]]></title>
            <link>https://velog.io/@andromeda_galaxy/MIL3-7%EC%9B%94-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@andromeda_galaxy/MIL3-7%EC%9B%94-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Wed, 31 Jul 2024 14:32:39 GMT</pubDate>
            <description><![CDATA[<p>이번달은 기획을 완료하고 figma를 이용한 프로토타입 제작부터 시작하여 본격적인 개발을 시작하게 되었다. </p>
<p>2달간 학습한 내용으로 막힘없이 개발을 할 수 있을것이라 생각하였지만, 막상 실제로 시작해보니 다양한 문제에 막히기 시작했다. </p>
<p>가장 먼저 만난 맞닥뜨린 문제는 프로젝트 세팅이었다. 맡은 바를 찾아보다가 엉뚱한 세팅을 찾아와 잘못된 세팅을 하기도 하였다. 이후에도 다양한 문제가 생겼지만, 팀원들과 함께 찾아보고 수정하면서 다행히 모두 해결할 수 있었다. </p>
<p>7월 중순에는 중간 점검 발표가 있었다. 중간 발표를 통해 다른 팀들의 프로젝트를 보면서 참고하고 개선할 수 있는 기회가 될 수 있었다.
이후에는 멘토님들의 피드백 시간을 가졌다. 멘토님께서는 우리의 질문에 답해주시고 도움이 될만한 도구, 지식들을 알려주셨다. 또한, 현재까지의 내용을 기반으로 보완할 부분들을 알려주셔서 많은 도움이 되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[상속]]></title>
            <link>https://velog.io/@andromeda_galaxy/%EC%83%81%EC%86%8D</link>
            <guid>https://velog.io/@andromeda_galaxy/%EC%83%81%EC%86%8D</guid>
            <pubDate>Sun, 07 Jul 2024 14:03:03 GMT</pubDate>
            <description><![CDATA[<h2 id="상속">상속</h2>
<ul>
<li>물려주는 클래스(Parent Class, Super class)의 내용(속성과 메소드)을 물려받는 클래스(Child class, sub class)가 가지게 되는 것</li>
</ul>
<pre><code class="language-python">class 부모클래스:
    ...내용...

class 자식클래스(부모클래스):
    ...내용...
</code></pre>
<h3 id="다중상속">다중상속</h3>
<ul>
<li>하나의 자식 클래스가 여러 부모 클래스를 상속받는 것도 가능<pre><code class="language-python">class 부모클래스1:
  ...내용...
</code></pre>
</li>
</ul>
<p>class 부모클래스2:
    ...내용...</p>
<p>class 자식클래스(부모클래스1, 부모클래스2):
    ...내용...</p>
<p>```</p>
<h3 id="다중-상속-문제">다중 상속 문제</h3>
<ul>
<li>클래스 간의 순서 문제가 있을 수 있음</li>
</ul>
<h3 id="mro">mro()</h3>
<ul>
<li>mro() 메소드를 호출하면 어느 클래스의 메소드가 호출될지 확실히 알 수 있음</li>
<li>MRO는 클래스 간의 상속받는 순서에 따라 변함</li>
</ul>
<h3 id="오버라이딩">오버라이딩</h3>
<ul>
<li>자식 클래스에서 겹치는 메소드를 오버라이딩하면 문제를 막을 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[문서화]]></title>
            <link>https://velog.io/@andromeda_galaxy/%EB%AC%B8%EC%84%9C%ED%99%94</link>
            <guid>https://velog.io/@andromeda_galaxy/%EB%AC%B8%EC%84%9C%ED%99%94</guid>
            <pubDate>Sun, 07 Jul 2024 14:02:57 GMT</pubDate>
            <description><![CDATA[<ul>
<li>문서화의 형식에 관해 꼭 지켜야 할 규칙은 없음</li>
<li>But. 흔히 사용하는 포맷은 존재</li>
</ul>
<h3 id="google-docstring">Google Docstring</h3>
<pre><code>&quot;&quot;&quot;유저에서 추천할 영상을 찾아준다
Parameters:
number_of_suggestions (int): 추천하고 싶은 영상 수. 기본값은 5

Returns:
list: 추천할 영상 주소가 담긴 리스트
&quot;&quot;&quot;</code></pre><h3 id="restructuredtext">reStructuredText</h3>
<pre><code>&quot;&quot;&quot;유저에서 추천할 영상을 찾아준다
:param number_of_suggestions: 추천하고 싶은 영상 수. 기본값은 5
:type number_of_suggestions: int

:returns: 추천할 영상 주소가 담긴 리스트
:rtype: list
&quot;&quot;&quot;</code></pre><h3 id="numpyscipy">NumPy/SciPy</h3>
<pre><code>&quot;&quot;&quot;유저에서 추천할 영상을 찾아준다

Parameters
----------
number_of_suggestions: int
  추천하고 싶은 영상 수 (기본값은 5)

Returns
-------
list 
  추천할 영상 주소가 담긴 리스트
&quot;&quot;&quot;</code></pre><p>코드잇에서 자세히 알아보기</p>
<ul>
<li><a href="https://www.codeit.kr/topics/oop-four-pillars/lessons/7985">문서화 스타일</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[스페셜 메소드]]></title>
            <link>https://velog.io/@andromeda_galaxy/%EC%8A%A4%ED%8E%98%EC%85%9C-%EB%A9%94%EC%86%8C%EB%93%9C</link>
            <guid>https://velog.io/@andromeda_galaxy/%EC%8A%A4%ED%8E%98%EC%85%9C-%EB%A9%94%EC%86%8C%EB%93%9C</guid>
            <pubDate>Sun, 07 Jul 2024 14:02:49 GMT</pubDate>
            <description><![CDATA[<h2 id="사칙-연산-메소드">사칙 연산 메소드</h2>
<h3 id="__add__self-other"><code>__add__(self, other)</code></h3>
<ul>
<li>더하기</li>
<li>x + y → <code>x.__add__(y)</code><h3 id="__sub__self-other"><code>__sub__(self, other)</code></h3>
</li>
<li>빼기</li>
<li>x - y → <code>x.__sub__(y)</code><h3 id="__mul__self-other"><code>__mul__(self, other)</code></h3>
</li>
<li>곱하기</li>
<li>x * y → <code>x.__mul__(y)</code><h3 id="__truediv__self-other"><code>__truediv__(self, other)</code></h3>
</li>
<li>나누기</li>
<li>x / y → <code>x.__truediv__(y)</code></li>
</ul>
<h2 id="불린-메소드">불린 메소드</h2>
<h3 id="__bool__self"><code>__bool__(self)</code></h3>
<ul>
<li>불린</li>
<li>bool(x) → <code>x.__bool__()</code></li>
</ul>
<h2 id="컨테이너-메소드">컨테이너 메소드</h2>
<ul>
<li>정해지지 않은 개수의 데이터를 담을 수 있는 객체<h3 id="__len__self"><code>__len__(self)</code></h3>
</li>
<li>길이</li>
<li>len(x) → <code>x.__len__()</code><h3 id="__getitem__self-key"><code>__getitem__(self, key)</code></h3>
</li>
<li>요소 가져오기</li>
<li>x[key] → <code>x.__getitem__(key)</code><h3 id="__setitem__self-key-item"><code>__setitem__(self, key, item)</code></h3>
</li>
<li>요소 설정하기</li>
<li>x[key] = item → <code>x.__setitem__(key, item)</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[클래스 변수]]></title>
            <link>https://velog.io/@andromeda_galaxy/%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@andromeda_galaxy/%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EC%88%98</guid>
            <pubDate>Sun, 07 Jul 2024 14:02:39 GMT</pubDate>
            <description><![CDATA[<h3 id="클래스-변수는-모든-인스턴스들이-공유하는-값">클래스 변수는 모든 인스턴스들이 공유하는 값</h3>
<ul>
<li>클래스뿐만 아니라 인스턴스를 통해서도 읽어올 수 있음</li>
<li>But, 설정하는 건 인스턴스를 통해서 할 수 없음</li>
<li>같은 이름의 클래스 변수와 인스턴스 변수가 둘 다 있으면, 인스턴스 변수가 읽어짐 </li>
</ul>
<h3 id="클래스-메소드를-쓰는-이유">클래스 메소드를 쓰는 이유</h3>
<ul>
<li>인스턴스가 없을 때도 사용해야 되는 메소드<pre><code class="language-python">User.count #유저 수 세기</code></pre>
</li>
<li>유저 수와 같이 인스턴스가 하나도 없더라도 필요한 정보</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MIL2] 6월 회고]]></title>
            <link>https://velog.io/@andromeda_galaxy/MIL2-6%EC%9B%94-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@andromeda_galaxy/MIL2-6%EC%9B%94-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 30 Jun 2024 11:53:54 GMT</pubDate>
            <description><![CDATA[<p> 저번달에 이어 6월에도 코드잇에서 <a href="https://www.codeit.kr/paths/python-fullstack-developer">Python 풀스택 개발자</a> 강의를 수강했다.</p>
<ul>
<li>수강한 강의 목록<ul>
<li><a href="https://www.codeit.kr/topics/django-understanding-models?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">Django 모델 파헤치기</a></li>
<li><a href="https://www.codeit.kr/topics/ui-design-basics">UI 디자인 기초</a></li>
<li><a href="https://www.codeit.kr/topics/figma-core-features?mediumTypedId=U2tpbGxQYXRoOjYzNWI4OTMxYjI1NjVhOWViMDEyYzFkMw%3D%3D">Figma 핵심 기능</a></li>
<li><a href="https://www.codeit.kr/topics/layout-for-ui-design?mediumTypedId=U2tpbGxQYXRoOjYzNWI4OTMxYjI1NjVhOWViMDEyYzFkMw%3D%3D">UI 디자인을 위한 레이아웃</a></li>
<li><a href="https://www.codeit.kr/topics/objects-and-classes?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">객체와 클래스</a></li>
<li><a href="https://www.codeit.kr/topics/oop-four-pillars?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">객체 지향 프로그래밍 4개의 기둥</a></li>
</ul>
</li>
</ul>
<h2 id="6월-소감">6월 소감</h2>
<p>기말고사로 2주간의 휴식기간을 가진 뒤 프로젝트를 위한 2차 팀빌딩을 진행했다. 5월달에는 Django만을 공부했다면, 이번달에는 프로젝트를 위한 UI, Figma도 같이 공부했다. 
UI 디자인 기초, Figma 핵심 기능, UI 디자인을 위한 레이아웃 강의는 핵심적인 기능들을 따라 실습을 하며 학습할 수 있어 쉽게 배울 수 있는 좋은 강의였다.
이전과는 달리 코어타임을 오프라인에서 진행하니 더욱 집중해서 학습할 수 있었던 것 같다. 매주 정해진 목표가 있고, 팀원들과의 정기적인 미팅으로 매주 정해진 목표를 달성하기 위해 더욱 열심히 할 수 있었던 것 같다.</p>
<h2 id="7월-계획">7월 계획</h2>
<p>팀 프로젝트로 진행할 주제는 결정되었지만 해결방안을 팀과 함께 다양한 방면으로 고민해나갈 것이다. 실제 프로젝트를 진행하는 것이 처음이니만큼 다양한 어려움을 만나겠지만 방학이니만큼 더 많은 학습으로 해결해나갈 수 있을것이라 기대한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[migration]]></title>
            <link>https://velog.io/@andromeda_galaxy/migration</link>
            <guid>https://velog.io/@andromeda_galaxy/migration</guid>
            <pubDate>Wed, 26 Jun 2024 12:57:38 GMT</pubDate>
            <description><![CDATA[<h2 id="makemigrations">makemigrations</h2>
<pre><code>python manage.py makemigrations [app_label]</code></pre><ul>
<li>마이그레이션 파일을 만들어 주는 커맨드</li>
<li>지금까지의 마이그레이션을 모두 적용했을 때의 모델 상태와 현재 모델 상태를 비교, 변경점을 파일에 기록</li>
</ul>
<h3 id="예시">예시</h3>
<pre><code class="language-python">from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        (&#39;coplate&#39;, &#39;0001_initial&#39;),
    ]

    operations = [
        migrations.AddField(
            model_name=&#39;user&#39;,
            name=&#39;nickname&#39;,
            field=models.CharField(max_length=15, null=True, unique=True),
        ),
    ]</code></pre>
<ul>
<li>User 모델에 nickname이라는 필드를 추가</li>
</ul>
<h3 id="app_label">[app_label]</h3>
<ul>
<li>app_label에 해당하는 앱의 모델에 대해서만 마이그레이션 파일을 만듬</li>
</ul>
<h4 id="예시-1">예시</h4>
<pre><code>python manage.py makemigrations sample</code></pre><ul>
<li>sample 앱의 모델 변화를 파악하고 마이그레이션 파일을 만듬</li>
</ul>
<h3 id="--name">--name</h3>
<ul>
<li>마이그레이션 파일 이름을 정할 수 있음<h4 id="예시-2">예시</h4>
<pre><code>python manage.py makemigrations --name &quot;example&quot;</code></pre></li>
<li>모델에 대한 변경 사항을 000X_example.py 마이그레이션 파일에 저장</li>
</ul>
<h2 id="migrate">migrate</h2>
<pre><code>python manage.py migrate [app_label] [migration_name]</code></pre><ul>
<li>마이그레이션 파일을 적용</li>
<li>기본적으로는 migrate 커맨드는 아직 프로젝트 내에서 적용되지 않은 모든 마이그레이션 파일을 적용</li>
</ul>
<h3 id="app_label--migration_name">app_label &amp; migration_name</h3>
<pre><code>python manage.py migrate sample</code></pre><ul>
<li>sample 앱 내에서 적용되지 않은 마이그레이션 파일을 적용<pre><code>python manage.py migrate 000x</code></pre></li>
<li>앱 x번 마이그레이션을 적용</li>
<li>만약 앱의 모든 마이그레이션을 취소하고 싶다면 zero를 사용<ul>
<li><code>python manage.py migrate zero</code></li>
</ul>
</li>
</ul>
<h2 id="showmigrations">showmigrations</h2>
<pre><code>python manage.py showmigrations [app_label]</code></pre><ul>
<li>어떤 마이그레이션 파일이 적용된 상태인지 확인<h3 id="app_label-1">app_label</h3>
</li>
<li>app_label에 해당하는 앱만 볼 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MIL1] 5월 회고]]></title>
            <link>https://velog.io/@andromeda_galaxy/MIL1-5%EC%9B%94-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@andromeda_galaxy/MIL1-5%EC%9B%94-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Fri, 31 May 2024 14:09:16 GMT</pubDate>
            <description><![CDATA[<p> 5월 한달간 코드잇에서 <a href="https://www.codeit.kr/paths/python-fullstack-developer">Python 풀스택 개발자</a> 강의를 수강했다.
 강의는 파트별로 5-10분으로 구성된 점이 상당히 좋았다. 파트별로 듣기에 며칠에 걸쳐 나눠 수강하기 좋았으며, 헷갈리거나 잊은 부분을 다시 찾아서 복습하기에도 유용했다. 
 강의에서 자체적으로 제공하는 코드 실행기도 매우 편리했다. 강의를 들으면서 동시에 바로 실습을 진행하고 결과물을 확인할 수 있다는 점이 좋았다.
 매주 정해진 목표가 있고, 팀원들과의 정기적인 미팅으로 매주 정해진 목표를 달성하기 위해 더욱 열심히 할 수 있었던 것 같다.</p>
<ul>
<li>수강한 강의 목록<ul>
<li><a href="https://www.codeit.kr/topics/python-module-and-package?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">파이썬 모듈과 패키지</a></li>
<li><a href="https://www.codeit.kr/topics/getting-started-with-django?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">Django 웹 개발 시작하기</a></li>
<li><a href="https://www.codeit.kr/topics/django-crud?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">Django CRUD</a></li>
<li><a href="https://www.codeit.kr/topics/django-user-system?mediumTypedId=U2tpbGxQYXRoOjYyYzI4MjcwY2I1NWJjMmE5ZWQ4ZDM2Yg%3D%3D">Django 유저 기능 구현하기</a></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Class-Based Views]]></title>
            <link>https://velog.io/@andromeda_galaxy/Class-Based-Views</link>
            <guid>https://velog.io/@andromeda_galaxy/Class-Based-Views</guid>
            <pubDate>Wed, 22 May 2024 11:53:35 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스형-뷰class-based-views">클래스형 뷰(Class-Based Views)</h2>
<ul>
<li>개발자들이 자주 쓸만한 view를 클래스로 만들어 둔 것</li>
<li>장고는 CRUD 각각을 위한 클래스형 뷰를 제공</li>
</ul>
<h3 id="예시">예시</h3>
<pre><code class="language-python"># views.py

from django.views import View

class PostCreateView(View):
    def get(self, request):
        post_form = PostForm()
        return render(request, &#39;posts/post_form.html&#39;, {&#39;form&#39;: post_form})

    def post(self, request):
        post_form = PostForm(request.POST)
        if post_form.is_valid():
            new_post = post_form.save()
            retrn redirect(&#39;post-detail&#39;, post_id=new_post.id)</code></pre>
<h2 id="제네릭-뷰generic-view">제네릭 뷰(Generic View)</h2>
<ul>
<li>개발자들이 자주 쓸만한 view를 하나의 형태로 만들어 둔 것</li>
<li>자주 사용하는 기능이 미리 구현되어 있어 제네릭 뷰를 상속하면 빠르게 제작 가능<h3 id="예시-1">예시</h3>
<pre><code class="language-python"># views.py
</code></pre>
</li>
</ul>
<p>from django.views.generic import CreateView
from django.urls import reverse</p>
<p>class PostCreateView(CreateView):
    model = Post
    form_class = PostForm
    template_name = &#39;posts/post_form.html&#39;</p>
<pre><code>def get_success_url(self):
    return reverse(&#39;post-detail&#39;, kwargs={&#39;post_id&#39;: self.object.id})</code></pre><pre><code>- reverse()
  - 인자로 받은 url name으로 부터 거슬러 올라가서 url을 찾는 함수
```python
# views.py

from django.views.generic import ListView
from django.urls import reverse

class PostListView(ListView):
    model = Post
    form_class = PostForm
    template_name = &#39;posts/post_list.html&#39;
    context_object_name = &#39;posts&#39;
    ordering = [&#39;dt_created&#39;] # 오름차순
    paginate_by = 6
    page_kwarg = &#39;page&#39;</code></pre><h2 id="generic-view-정리">Generic View 정리</h2>
<ul>
<li>제네릭 뷰는 역할에 따라 크게 네 가지로 나누어짐</li>
</ul>
<table>
<thead>
<tr>
<th align="left">종류</th>
<th align="left">뷰</th>
<th align="left">설명</th>
<th align="left">공식문서</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Base Views</td>
<td align="left">TemplateView / RedirectView</td>
<td align="left">템플릿을 랜더해서 결과로 돌려주거나 다른 URL로 리디렉션 하는등의 기본적인 기능을 하는 뷰</td>
<td align="left"><a href="https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/">https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/</a></td>
</tr>
<tr>
<td align="left">Display Views</td>
<td align="left">ListView / DetailView</td>
<td align="left">데이터를 보여주는 기능을 하는 뷰</td>
<td align="left"><a href="https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/">https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/</a></td>
</tr>
<tr>
<td align="left">Edit Views</td>
<td align="left">FormView / CreateView / UpdateView / DeleteView</td>
<td align="left">데이터 생성, 수정, 삭제등의 기능을 하는 뷰</td>
<td align="left"><a href="https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/">https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/</a></td>
</tr>
<tr>
<td align="left">Date Views</td>
<td align="left">YearArchiveView / MonthArchiveView / DayArchiveView / TodayArchiveView</td>
<td align="left">날짜를 중심으로 데이터를 조회하는 기능을 하는 뷰</td>
<td align="left"></td>
</tr>
</tbody></table>
<h2 id="context-정리">Context 정리</h2>
<ul>
<li>View에서 Template으로 전달되어 렌더링시 사용할 수 있는 사전형 데이터 변수</li>
<li>render 함수의 세 번째 파라미터</li>
<li>Django의 Generic 뷰는 이러한 Context를 각각의 기능에 맞게 자동으로 Template에 전달<pre><code class="language-python">def function_view(request):
  return render(request, template_name, context)</code></pre>
</li>
</ul>
<h3 id="모델model-데이터">모델(Model) 데이터</h3>
<ul>
<li>모델(Model) 데이터는 Template에 context로 전달<ul>
<li>하나의 데이터를 다루는 View는 하나의 데이터를 &#39;object&#39;라는 키워드로 전달</li>
<li>여러개의 데이터를 다루는 View는 &#39;object_list&#39;라는 키워드로 전달</li>
<li>같은 데이터를 &#39;model&#39; 클래스 변수에 명시한 Model을 보고 소문자로 변형해 함께 전달</li>
</ul>
</li>
</ul>
<pre><code class="language-python">from django.views.generic import DetailView
from .models import Post

class PostDetailView(DetailView):
    model = Post
    ...</code></pre>
<ul>
<li>DetailView는 하나의 데이터를 다루는 로직을 수행<ul>
<li>model 클래스 변수를 지정하면 자동으로 ‘object’라는 키워드로 데이터베이스에서 조회한 하나의 Post 데이터를 Template에 전달<ul>
<li>Template에서는 템플릿 변수를 사용해서 {{object.title}} 같은 형태로 접근</li>
</ul>
</li>
<li>이 object와 똑같은 데이터를 모델명을 소문자로 쓴 형태인 post로도 Template에 함께 전달</li>
<li>즉, 같은 데이터가 object와 post 두 개의 키워드로 전달</li>
</ul>
</li>
</ul>
<pre><code class="language-python">from django.views.generic import ListView
from .models import Post

class PostListView(ListView):
    model = Post
    ...</code></pre>
<ul>
<li>ListView는 여러 데이터를 다루는 로직을 수행<ul>
<li>model 클래스 변수를 지정하면 자동으로 데이터베이스에서 조회한 Post 데이터 목록을 <code>object_list</code>라는 키워드로 Template에 전달</li>
<li>똑같은 데이터를 model 키워드 변수에 명시된 모델을 참고하여 소문자로 쓴 형태인 <code>&lt;model_name&gt;_list</code> 즉 <code>post_list</code> 키워드로도 context를 전달</li>
<li>Template에서는 object_list와 post_list 두 개의 키워드로 Post 데이터 목록에 접근할 수 있음</li>
</ul>
</li>
</ul>
<h3 id="context_obejct_name">context_obejct_name</h3>
<ul>
<li>모델명을 보고 유추하는 <model_name> 또는 <model_name>_list 같은 이름들을 바꿔주는 것<pre><code class="language-python">from django.views.generic import ListView
from .models import Post
</code></pre>
</li>
</ul>
<p>class PostListView(ListView):
    model = Post
    context_object_name = &#39;posts&#39;
    ...</p>
<p>```</p>
<ul>
<li><code>post_list</code> 가 <code>posts</code>로 변경되어 전달<ul>
<li>Post 데이터목록이 <code>object_list</code>와 <code>posts</code> 두 개의 키워드로 전달</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Pagination]]></title>
            <link>https://velog.io/@andromeda_galaxy/Pagination</link>
            <guid>https://velog.io/@andromeda_galaxy/Pagination</guid>
            <pubDate>Wed, 22 May 2024 11:07:54 GMT</pubDate>
            <description><![CDATA[<h2 id="페이지네이션pagination">페이지네이션(Pagination)</h2>
<ul>
<li>데이터를 일정 길이로 나누어서 전달하는 기능</li>
<li>일반적으로 가지고 있는 데이터가 한 화면에 모두 보여 주기에 너무 많은 경우 사용<ul>
<li>&#39;이전 페이지로 가기&#39; 또는  &#39;다음 페이지로 가기&#39; 등으로 자주 볼 수 있는 기능</li>
</ul>
</li>
</ul>
<h3 id="백엔드">백엔드</h3>
<ul>
<li>페이지 별 데이터를 데이터베이스로부터 가져와서 프론트에게 넘겨야함<h3 id="프론트엔드">프론트엔드</h3>
</li>
<li>받은 데이터 목록과 페이지에 대한 정보를 화면에 표시하도록 만들어야함</li>
</ul>
<h2 id="django의-페이지네이션">Django의 페이지네이션</h2>
<ul>
<li>Paginator를 제공</li>
<li>총 두 개의 파라미터<ul>
<li>각각의 페이지로 나뉘게 될 데이터의 목록</li>
<li>한 페이지에 보여줄 데이터의 수<pre><code class="language-python">from django.core.paginator import Paginator # Django의 Paginator
from .models import Post # 작성한 모델 클래스
</code></pre>
</li>
</ul>
</li>
</ul>
<p>posts = Post.object.all() # 모든 데이터를 가져와서
paginator = Paginator(posts, 6) </p>
<h1 id="첫-번째-파라미터--페이지로-나뉘게-될-데이터의-목록">첫 번째 파라미터 : 페이지로 나뉘게 될 데이터의 목록</h1>
<h1 id="두-번째-파라미터---한-페이지에-보옂루-데이터의-수">두 번째 파라미터 :  한 페이지에 보옂루 데이터의 수</h1>
<pre><code>
### Paginator와 각각의 Page가 가지고 있는 기능

|메소드&amp;속성|설명|예시|
|:---|:---|:---|
|{paginator}.count|paginator가 가지고 있는 데이터의 개수|{paginator}.count|
|{paginator}.num_pages|paginator가 가지고 있는 모든 페이지 수|{paginator}.num_pages|
|{paginator}.page_range|paginator가 가지고 있는 페이지의 범위(range)|{paginator}.page_range|
|{paginator}.page(num)|paginator가 가지고 있는 페이지 중 num번째 페이지 객체|{paginator}.page(1)|
|{page}.has_next()|page객체가 다음 페이지가 있는지 여부|{page}.has_next()|
|{page}.has_previous()|page객체가 이전 페이지가 있는지 여부|{page}.has_previous()|
|{page}.number|page객체의 현재 페이지 번호|{page}.number|
|{page}.next_page_number()|page객체의 다음 페이지 번호|{page}.next_page_number()|
|{page}.previous_page_number()|page객체의 이전 페이지 번호|{page}.previous_page_number()|

### View 작성하기

```python
from django.core.paginator import Paginator

def post_list(request):
    posts = Post.object.all() 
    paginator = Paginator(posts, 8)
    page_number = request.GET.get(&#39;page&#39;)
    page_obj = paginator.page(page_number) # 페이지 번호에 해당하는 페이지를 가져옴
    return render(request, &#39;post_list.html&#39;, {&#39;page_obj&#39;: page_obj})</code></pre><h3 id="template-작성하기">Template 작성하기</h3>
<pre><code class="language-html">...

{% if page_obj.has_previous %} &lt;!-- 만약 현재 페이지의 이전 페이지가 있다면 --&gt;
    &lt;a href=&quot;?page=1&quot;&gt; first&lt;/a&gt;
    &lt;a href=&quot;?page={{ page_obj.previous_page_number }}&quot;&gt;prev&lt;/a&gt; &lt;!-- 이전 페이지 번호 --&gt;
{% endif %}

&lt;span&gt;
    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
    &lt;!-- page_obj.number : 페이지(page_obj)의 번호 --&gt;
    &lt;!-- page_obj.paginator.num_pages : 페이지를 관리하는 Paginator가 가지고 있는 전체 페이지 수 --&gt;
&lt;/span&gt;

{% if page_obj.has_next %} &lt;!-- 만약 현재 페이지의 다음 페이지가 있다면 --&gt;
    &lt;a href=&quot;?page={{ page_obj.next_page_number }}&quot;&gt;next&lt;/a&gt; &lt;!-- 다음 페이지 번호 --&gt;
    &lt;a href=&quot;?page={{ page_obj.paginator.num_pages }}&quot;&gt;last &lt;/a&gt; &lt;!-- 전체 페이지의 개수 = 마지막 페이지 번호 --&gt;
{% endif %}

...</code></pre>
<h3 id="공식문서">공식문서</h3>
<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/topics/pagination/">https://docs.djangoproject.com/en/2.2/topics/pagination/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Form]]></title>
            <link>https://velog.io/@andromeda_galaxy/Form</link>
            <guid>https://velog.io/@andromeda_galaxy/Form</guid>
            <pubDate>Tue, 21 May 2024 13:56:28 GMT</pubDate>
            <description><![CDATA[<h2 id="html-form">HTML Form</h2>
<ul>
<li>웹 페이지에서 사용자의 데이터를 입력받을 수 있는 입력 양식</li>
<li>Form 요소들은 Django에서 제공하는 폼을 사용하면 저절로 생성<pre><code class="language-python">from django import forms
</code></pre>
</li>
</ul>
<p>class <form name>(forms.form):
    <variable name> = forms.<formfield></p>
<pre><code>```python
from django import forms

class &lt;formname&gt;(forms.ModelForm):</code></pre><h3 id="label--input">label &amp; input</h3>
<ul>
<li>폼은 form태그 안에 사용자의 입력을 받는 input태그와 설명을 위한 label태그의 쌍으로 구성<pre><code class="language-html">&lt;form&gt;
  &lt;lable&gt;이름&lt;/lable&gt;
  &lt;input type=&quot;text&quot;&gt;
&lt;/form&gt;</code></pre>
<h3 id="for--id">for &amp; id</h3>
</li>
<li>각각의 input태그와 label태그를 묶어주기 위해서 label태그에는 for 속성, input태그에는 id가 사용<pre><code class="language-html">&lt;form&gt;
  &lt;label for=&quot;title&quot;&gt;제목&lt;/label&gt;
  &lt;input type=&quot;text&quot; id=&quot;title&quot;&gt;
&lt;/form&gt;</code></pre>
</li>
<li>for와 id 속성을 적어주고 싶지 않다면<pre><code class="language-html">&lt;form&gt;
  &lt;label&gt;제목
      &lt;input type=&quot;text&quot;&gt;
  &lt;/label&gt;
&lt;/form&gt;</code></pre>
<h3 id="name">name</h3>
</li>
<li>입력된 데이터를 서버로 전송할 때, 서버에서 각각의 데이터를 구분하기 위한 속성</li>
<li>name 속성이 있는 양식 요소만 값이 서버로 전달<pre><code class="language-html">&lt;form&gt;
  &lt;label for=&quot;title&quot;&gt;제목&lt;/label&gt;
  &lt;input type=&quot;text&quot; id=&quot;title&quot; name=&quot;title&quot;&gt;
&lt;/form&gt;</code></pre>
<h3 id="type">type</h3>
</li>
<li>입력할 값에 따른 유형을 나타내는 속성<ul>
<li>email</li>
<li>password</li>
<li>button</li>
<li>radio</li>
<li>checkbox</li>
<li>date</li>
<li>file</li>
<li>submit</li>
</ul>
</li>
</ul>
<pre><code class="language-html"># example
&lt;label for=&quot;email&quot;&gt;이메일&lt;/label&gt;
&lt;input type=&quot;email&quot; id=&quot;email&quot; name=&quot;email&quot;&gt;</code></pre>
<h2 id="form-속성">form 속성</h2>
<ul>
<li><p>입력된 데이터를 전송할 서버의 URL을 지정하는 action</p>
</li>
<li><p>http 전달 방식을 지정해 주는 method</p>
<pre><code class="language-html">&lt;form action=&quot;register&quot; method=&quot;post&quot;&gt;
  &lt;label for=&quot;name&quot;&gt;이름&lt;/label&gt;
  &lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot;&gt;
  &lt;input type=&quot;submit&quot; value=&quot;제출하기&quot;&gt;
&lt;/form&gt;</code></pre>
<h3 id="get--post">GET &amp; POST</h3>
</li>
<li><p>GET 방식으로 지정하면 유저가 데이터를 입력하고 전송했을 때 URL 뒤에 쿼리 스트링(Query String) 형태로 데이터가 전달</p>
</li>
<li><p>GET은 서버에서 데이터를 가져오는 요청을 보낼 때 사용</p>
<blockquote>
<p><a href="http://www.example.com/case?name=example&amp;age=example">http://www.example.com/case?name=example&amp;age=example</a></p>
</blockquote>
</li>
<li><p>POST 방식은 전송되는 URL에는 표시되지 않고 서버로 전송하는 메세지 안쪽에 데이터를 넣어서 전달</p>
</li>
<li><p>POST는 서버의 데이터를 변경하거나 다른 로직을 수행할 때 사용</p>
<blockquote>
<p><a href="http://www.example.com/case">http://www.example.com/case</a></p>
</blockquote>
</li>
</ul>
<h2 id="django-form-field">Django Form Field</h2>
<ul>
<li>Django 폼(Form)을 작성할 때 가장 중요한 부분이 바로 데이터에 맞는 폼 필드를 작성하는 것</li>
<li>Django는 입력 데이터에 따라 사용할 수 있는 여러 내장 폼 필드를 제공<h3 id="form-field">Form Field</h3>
</li>
</ul>
<table>
<thead>
<tr>
<th align="left">필드</th>
<th align="left">설명</th>
<th align="left">옵션</th>
</tr>
</thead>
<tbody><tr>
<td align="left"></td>
<td align="left"></td>
<td align="left">max_length</td>
</tr>
<tr>
<td align="left">CharField</td>
<td align="left">문자열 입력</td>
<td align="left">min_length</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"></td>
<td align="left">strip</td>
</tr>
<tr>
<td align="left">EmailField</td>
<td align="left">이메일 입력</td>
<td align="left">CharField와 같은 옵션</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">IntegerField</td>
<td align="left">정수 입력</td>
<td align="left">max_value</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"></td>
<td align="left">min_value</td>
</tr>
<tr>
<td align="left">BooleanField</td>
<td align="left">True, False 입력</td>
<td align="left">빈 값일 경우 False</td>
</tr>
<tr>
<td align="left">DateField</td>
<td align="left">날짜 형식을 입력</td>
<td align="left">input_formats</td>
</tr>
<tr>
<td align="left">TimeField</td>
<td align="left">시간 형식을 입력</td>
<td align="left">DateField와 같은 옵션</td>
</tr>
<tr>
<td align="left">DateTimeField</td>
<td align="left">날짜/시간 형식을 입력</td>
<td align="left">DateField와 같은 옵션</td>
</tr>
<tr>
<td align="left">- 공식문서</td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">- <a href="https://docs.djangoproject.com/en/2.2/ref/forms/fields/#built-in-field-classes">https://docs.djangoproject.com/en/2.2/ref/forms/fields/#built-in-field-classes</a></td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">### Form Field Options</td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="left">인수</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left">label</td>
<td align="left">label 항목에 적힐 이름을 지정</td>
</tr>
<tr>
<td align="left">label_suffix</td>
<td align="left">label 다음 콜론(:)이 붙어서 표시되는데 이 값을 변경</td>
</tr>
<tr>
<td align="left">help_text</td>
<td align="left">입력에 도움이 되는 문자열을 입력 필드 밑에 표시</td>
</tr>
<tr>
<td align="left">widget</td>
<td align="left">필드가 사용할 사용자 입력 UI, 즉 위젯을 지정</td>
</tr>
<tr>
<td align="left">- 공식문서</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">- <a href="https://docs.djangoproject.com/en/2.2/ref/forms/fields/#core-field-arguments">https://docs.djangoproject.com/en/2.2/ref/forms/fields/#core-field-arguments</a></td>
<td align="left"></td>
</tr>
</tbody></table>
<h2 id="css-적용">CSS 적용</h2>
<ul>
<li>widgets를 사용<pre><code class="language-python">from django import forms
from .models import Page # 사용할 모델을 가져옵니다.
</code></pre>
</li>
</ul>
<p>class PageForm(forms.ModelForm):</p>
<pre><code>class Meta:
    model = Page # 모델 폼에서 사용할 모델과 필드를 명시합니다.
    fields = [&#39;title&#39;, &#39;content&#39;, &#39;feeling&#39;, &#39;score&#39;, &#39;dt_created&#39;]

    widgets = {&#39;title&#39;: forms.TextInput(attrs={&#39;class&#39;:&#39;title&#39;,
                                                &#39;placeholder&#39;:&#39;제목을 입력하세요&#39;}),
                &#39;content&#39;: forms.Textarea(attrs={&#39;placeholder&#39;: &#39;내용을 입력하세요&#39;})
                }</code></pre><pre><code>
- forms.TextInput(attrs={&#39;class&#39;:&#39;title&#39;})
  - TextInput은 속성으로 class : title을 가지게 됨

```css
# form.css

.title {
    width: 400px;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Django Model API]]></title>
            <link>https://velog.io/@andromeda_galaxy/Django-Model-API</link>
            <guid>https://velog.io/@andromeda_galaxy/Django-Model-API</guid>
            <pubDate>Tue, 21 May 2024 13:11:58 GMT</pubDate>
            <description><![CDATA[<h2 id="django-model-api">Django Model API</h2>
<ul>
<li><p>Django에서 Model을 정의하면 ORM을 통해 데이터베이스와 소통할 수 있는 API를 제공</p>
<h3 id="api란">API란?</h3>
<blockquote>
<p>Application Programming Interface</p>
</blockquote>
</li>
<li><p>어플리케이션에서 시스템의 기능을 제어할 수 있도록 만든 인터페이스</p>
</li>
<li><p>어떤 기능을 쉽게 사용할 수 있도록 만든 체계</p>
<h3 id="queryset">Queryset</h3>
</li>
<li><p>Django Model의 데이터가 담겨있는 목록</p>
</li>
<li><p>파이썬의 리스트와 비슷한 형태</p>
</li>
<li><p>Queryset을 얻기 위해서 &#39;objects&#39;를 이용</p>
<ul>
<li>&#39;Model Manager&#39;</li>
</ul>
</li>
</ul>
<p><code>&lt;model&gt;.objects.all() # &lt;model&gt;의 모든 데이터 Queryset 가져오기</code></p>
<h2 id="queryset-api">Queryset API</h2>
<h3 id="queryset을-반환-하는-api">Queryset을 반환 하는 API</h3>
<ul>
<li>all() : 해당 모델 테이블의 모든 데이터 조회</li>
<li>filter() : 특정 조건에 맞는 모든 데이터 조회</li>
<li>values() : Queryset에 있는 모든 모델 데이터의 정보를 사전형으로 갖는 리스트 반환<h3 id="하나의-데이터-객체를-반환하는-api">하나의 데이터 객체를 반환하는 API</h3>
</li>
<li>get() : 조건에 맞는 하나의 데이터 조회</li>
<li>create() : 하나의 데이터를 생성하고 해당 모델 데이터를 반환</li>
<li>latest() : 주어진 필드 기준으로 가장 최신의 모델 데이터를 반환<h3 id="그-외-api">그 외 API</h3>
</li>
<li>exists() : 연산된 쿼리셋에 데이터가 있다면 True 반환</li>
<li>count() : 쿼리셋의 데이터 개수를 정수로 반환</li>
<li>delete() : 데이터를 삭제할 때 사용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django 배포]]></title>
            <link>https://velog.io/@andromeda_galaxy/Django-%EB%B0%B0%ED%8F%AC</link>
            <guid>https://velog.io/@andromeda_galaxy/Django-%EB%B0%B0%ED%8F%AC</guid>
            <pubDate>Sun, 19 May 2024 04:09:37 GMT</pubDate>
            <description><![CDATA[<h2 id="django-배포-deployment">Django 배포 (Deployment)</h2>
<h3 id="디버그-모드-debug-mode">디버그 모드 (Debug Mode)</h3>
<ul>
<li>기본적으로 Django 프로젝트를 생성하면 settings.py에 디버그 모드가 켜져 있는 상태로 만들어짐<pre><code class="language-python"># settings.py
</code></pre>
</li>
</ul>
<p>...</p>
<h1 id="security-warning-dont-run-with-debug-turned-on-in-production">SECURITY WARNING: don&#39;t run with debug turned on in production!</h1>
<p>DEBUG = True
...</p>
<pre><code>- 보안 이슈로 이어지기 때문에 꼭 디버그 모드를 꺼주어야 함
- 모드를 끄게 되면 실제로 ALLOWED_HOSTS에 있는 호스트(hosts) 외에는 
일체 접속이 차단 되어 더이상 내 컴퓨터에서도 접속이 되지 않음
### 호스트 설정 (Allowed Hosts)
- ALLOWED_HOSTS에 적는 호스트는 Django 프로젝트로 들어오는 요청에 대해 응답을 할 수 있는 호스트 즉, 서버의 주소
- 처음 프로젝트를 생성하면 아래처럼 비어있는 리스트로 생성
```python
# settings.py

...
ALLOWED_HOSTS = []
...</code></pre><ul>
<li>비어있는 호스트이면서 디버그 모드가 켜져 있는 경우에는
[ &#39;localhost&#39;, &#39;127.0.0.1&#39;, &#39;[::1]&#39; ]과 같은 의미가 되어 로컬 호스트(localhost) 즉 내 컴퓨터에서 접속이 가능한 상태</li>
<li>배포할 서버와 내 컴퓨터에 대해 허용해주기 위해 ALLOWED_HOSTS 리스트에 호스트를 추가해주는 것이 필요<h3 id="정적-파일-관리-static-files">정적 파일 관리 (Static Files)</h3>
</li>
<li>흩어져있는 정적 파일들을 하나의 경로로 모두 모아 주어야 하는데 이때 사용하는 명령어가 바로 collectstatic 명령어</li>
<li>collectstatic 명령어는 흩어져 있는 정적 파일을 settings.py에 명시되어 있는 STATIC_ROOT 경로로 복사해서 모아줌<h4 id="static_url과-static_root의-차이">STATIC_URL과 STATIC_ROOT의 차이</h4>
</li>
<li>STATIC_URL은 실제 존재하는 경로가 아니라 웹 페이지에서 사용할 정적 파일에 대한 URL</li>
<li>STATIC_ROOT는 실제 존재하는 경로로 Django 프로젝트에서 사용하는 모든 정적 파일이 이 경로에 존재하며 웹 서버가 정적 파일을 찾기 위해 참조하는 실제 경로<h3 id="소스코드-관리">소스코드 관리</h3>
</li>
<li>버전 관리 시스템을 사용해서 소스코드를 관리하고 원격 서버에 업로드 하는 방법을 권장</li>
<li>Git, SVN, Mercurial 등의 시스템</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CRUD]]></title>
            <link>https://velog.io/@andromeda_galaxy/CRUD</link>
            <guid>https://velog.io/@andromeda_galaxy/CRUD</guid>
            <pubDate>Sun, 19 May 2024 04:03:34 GMT</pubDate>
            <description><![CDATA[<h2 id="crud">CRUD</h2>
<ul>
<li>Django는 Model을 정의하면 ORM을 통해서 데이터베이스에 데이터를 추가하고(Create) 조회하고(Read) 수정하고(Update) 삭제(Delete)할 수 있도록 하는 편리한 기능을 제공</li>
<li>Model의 &#39;objects&#39;를 이용해서 수행<h3 id="데이터-추가하기-create">데이터 추가하기 (Create)</h3>
</li>
<li>데이터를 추가하기 위해서는 import를 이용해서 먼저 사용할 Model을 불러 와야 함<pre><code>from {app_name}.models import {model}</code></pre><h4 id="create">Create</h4>
</li>
<li>Create는 데이터 객체를 생성하고 데이터베이스에 반영하는 과정을 한 번에 할 수 있음<pre><code>data_model = {model}.objects.create( {field_name}=value, ... )
# example
# food = Food.objects.create(price=10000)</code></pre><h4 id="save">save</h4>
</li>
<li>save를 이용하면 데이터 객체를 생성하는 타이밍과 실제로 데이터베이스에 반영하는 과정을 분리할 수 있음<pre><code>data_model = {model}( {field_name}=value, ... )
data_model.save()
# example 
# food = Food(price=10000)
#   food.save()</code></pre><h3 id="데이터-조회하기-read">데이터 조회하기 (Read)</h3>
</li>
<li>데이터를 데이터베이스로 부터 읽어오는 것은 Django Model Manager인 objects를 통해서 할 수 있음<h4 id="모든-데이터-조회">모든 데이터 조회</h4>
</li>
<li>all()을 사용<pre><code>data = {model}.obejcts.all()</code></pre><h4 id="하나의-데이터-조회">하나의 데이터 조회</h4>
</li>
<li>get()을 사용<ul>
<li>get을 사용했을때 조회 결과가 여러개라면 에러<pre><code>data = {model}.objects.get(field=value)</code></pre><h4 id="조건에-맞는-여러-데이터-조회">조건에 맞는 여러 데이터 조회</h4>
</li>
</ul>
</li>
<li>filter()를 사용</li>
<li>해당 필드 조건에 해당하는 모든 데이터를 가져오거나 아래에서 설명하는 조건 키워드를 함께 사용할 수 있음<pre><code>data = {model}.objects.filter(field=value)</code></pre><h4 id="정렬해서-데이터-조회">정렬해서 데이터 조회</h4>
</li>
<li>order_by()를 사용</li>
<li>두 개 이상의 필드를 함께 사용해서 정렬할 수 있으며 &#39;-&#39;를 사용해서 내림차순으로 정렬할 수 있음<pre><code>data = {model}.objects.order_by(&#39;field_1&#39;, &#39;-field_2&#39;)
# field_1을 기준으로 오름차순으로 정렬하고 
# 그 결과를 다시 field_2를 기준으로 내림차순으로 정렬합니다.</code></pre><h4 id="데이터의-개수-세기">데이터의 개수 세기</h4>
</li>
<li>count()를 사용<pre><code>rows = {model}.objects.count()</code></pre><h4 id="특정-조건을-제외한-데이터-조회">특정 조건을 제외한 데이터 조회</h4>
</li>
<li>exclude()를 사용<pre><code>data = {model}.objects.exclude(field=value)
# 특정 field가 value인 데이터를 제외한 모든 데이터를 조회합니다.</code></pre><h4 id="체인으로-연결해서-조회">체인으로 연결해서 조회</h4>
</li>
<li>여러가지 데이터 조회를 체인처럼 연결해서 사용할 수 있음<pre><code>data = {model}.objects.filter(price=10000).order_by(&#39;name&#39;)
# 가격(price)이 10,000원인 데이터를 이름(name)으로 정렬해서 조회합니다.</code></pre><pre><code class="language-data">data = data.order_by(&#39;name&#39;)
# 이렇게 적어도 위와 똑같은 명령을 수행합니다. </code></pre>
<h3 id="조건-키워드">조건 키워드</h3>
</li>
<li><code>{field_name}__{keyword}={condition}</code> 형태로 사용<h4 id="__exact-__iexact"><code>__exact, __iexact</code></h4>
</li>
<li>__exact는 대소문자를 구분해서 조건과 정확히 일치 하는지를 체크</li>
<li>__iexact는 대소문자를 구분 하지 않고 일치하는 지를 체크<h4 id="__contains-__icontains"><code>__contains, __icontains</code></h4>
</li>
<li>지정한 문자열을 포함 하는지를 체크</li>
<li>__icontains는 대소문자를 구분하지 않고 체크<h4 id="__range"><code>__range</code></h4>
</li>
<li>지정한 범위 내에 포함 되는지 체크</li>
<li>파이썬의 range와 비슷<h4 id="공식문서">공식문서</h4>
</li>
<li><a href="https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups">https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups</a><h3 id="데이터-수정하기">데이터 수정하기</h3>
</li>
<li>수정할 데이터 객체를 가져온 다음 원하는 필드를 수정하고 save()를 호출하여 데이터베이스에 반영<h3 id="데이터-삭제하기">데이터 삭제하기</h3>
</li>
<li>데이터를 삭제하기 위해서는 삭제할 데이터 객체를 가져온 다음 delete()를 호출<h3 id="공식문서-1">공식문서</h3>
</li>
<li><a href="https://docs.djangoproject.com/en/2.2/topics/db/queries/">https://docs.djangoproject.com/en/2.2/topics/db/queries/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django의 Model Field]]></title>
            <link>https://velog.io/@andromeda_galaxy/Django%EC%9D%98-Model-Field</link>
            <guid>https://velog.io/@andromeda_galaxy/Django%EC%9D%98-Model-Field</guid>
            <pubDate>Sun, 19 May 2024 03:48:42 GMT</pubDate>
            <description><![CDATA[<h2 id="model-만들기">Model 만들기</h2>
<pre><code class="language-python">from django.db import models

class &lt;model name&gt;(models.Model):
    &lt;variable name&gt; = models.&lt;model field&gt;</code></pre>
<h2 id="model-field">Model Field</h2>
<ul>
<li>Django Model은 대부분의 데이터를 저장할 수 있는 필드(Field)를 지원<h3 id="필드field">필드(Field)</h3>
</li>
<li>필드(Field)는 데이터 테이블에서의 열(column), 즉 데이터의 속성을 의미<h4 id="charfield">CharField</h4>
</li>
<li>class CharField(max_length=None)</li>
<li>제한된 길이의 문자열을 위한 필드<ul>
<li>max_length 필수 인수이며 입력할 최대 길이를 설정<h4 id="integerfield">IntegerField</h4>
</li>
</ul>
</li>
<li>class IntegerField()</li>
<li>정수 값을 위한 필드이며 -2147483648 부터 2147483647 범위를 지원<h4 id="booleanfield">BooleanField</h4>
</li>
<li>class BooleanField()</li>
<li>Boolean 값을 위한 필드<h4 id="datefield">DateField</h4>
</li>
<li>class DateField(auto_now=False, auto_now_add=False)</li>
<li>DateField는 파이썬의 datetime.date 객체 형태로 표시되는 날짜 필드<ul>
<li>auto_now<ul>
<li>true로 설정되면 해당 객체가 변경(save) 될 때마다 자동으로 필드 값을 지금으로 수정</li>
</ul>
</li>
<li>auto_now_add<ul>
<li>모델이 처음 생성될 때 한 번, 자동으로 필드 값을 지금으로 설정</li>
<li>&#39;생성된 시간&#39;을 저장하기 위해 많이 사용<h4 id="datetimefield">DateTimeField</h4>
</li>
</ul>
</li>
</ul>
</li>
<li>class DateTimeField(auto_now=False, auto_now_add=False)</li>
<li>파이썬의 datetime.datetime 객체 형태로 표시되는 날짜 필드</li>
<li>DateField와 인수 옵션은 같음<h4 id="emailfield">EmailField</h4>
</li>
<li>class EmailField(max_length=254)</li>
<li>CharField의 하위 클래스로 문자열이 이용 가능한 이메일 주소인지 EmailValidator를 통해 확인</li>
<li><a href="https://docs.djangoproject.com/en/3.1/ref/validators/#django.core.validators.EmailValidator">https://docs.djangoproject.com/en/3.1/ref/validators/#django.core.validators.EmailValidator</a><h4 id="filefield">FileField</h4>
</li>
<li>class FileField(upload_to=None, max_length=100)</li>
<li>파일 업로드를 위한 필드<ul>
<li>upload_to 업로드될 경로를 지정하는 필드로 Storage.save() 함수로 값이 전달되어 저장</li>
<li><a href="https://docs.djangoproject.com/en/3.1/ref/files/storage/#django.core.files.storage.Storage.save">https://docs.djangoproject.com/en/3.1/ref/files/storage/#django.core.files.storage.Storage.save</a><h4 id="imagefield">ImageField</h4>
</li>
</ul>
</li>
<li>class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100)</li>
<li>FileField를 상속하여 구현되는 파일 업로드를 위한 필드이며 기본적으로 최대 길이가 100인 문자열 형식으로 생성</li>
<li>FileField에서 업로드된 파일이 정상적인 이미지 파일인지 확인하는 과정이 추가된 필드로 이미지 처리를 위한 Pillow 라이브러리가 필수적으로 필요<ul>
<li>height_field &amp; width_field 객체가 저장 될 때 이미지의 높이와 너비값이 자동으로 채워짐</li>
</ul>
</li>
</ul>
<h3 id="옵션option">옵션(Option)</h3>
<ul>
<li>옵션은 모든 필드 타입에 사용할 수 있으며 선택적으로 적용할 수 있음<h4 id="null">null</h4>
</li>
<li>Field.null</li>
<li>기본 값은 False이며 Null 값 허용 여부를 선택<h4 id="blank">blank</h4>
</li>
<li>Field.blank</li>
<li>기본 값은 False이며 True로 설정한 경우 필드 값을 빈 값으로 설정할 수 있음<h4 id="default">default</h4>
</li>
<li>Field.default</li>
<li>필드의 기본값을 설정하는 옵션으로 값 또는 함수가 들어갈 수 있음<h4 id="db_column">db_column</h4>
</li>
<li>Field.db_column</li>
<li>해당 필드에 사용할 데이터베이스 속성 명을 지정</li>
</ul>
<h3 id="공식문서">공식문서</h3>
<ul>
<li><a href="https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default">https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django URL]]></title>
            <link>https://velog.io/@andromeda_galaxy/Django-URL</link>
            <guid>https://velog.io/@andromeda_galaxy/Django-URL</guid>
            <pubDate>Sun, 19 May 2024 03:25:55 GMT</pubDate>
            <description><![CDATA[<h2 id="urlconf-urlspy">URLconf (urls.py)</h2>
<ul>
<li>Django에서 URL을 처리하기 위해서는 URLconf 모듈 즉 urls.py를 작성<pre><code class="language-python"># urls.py
from django.urls import path
from . import views
</code></pre>
</li>
</ul>
<p>urlpatterns = [
    path(&#39;URL&#39;, views.view)
]</p>
<pre><code>
### URL 처리 순서
- 요청이 들어오면 Django는 맨 처음 사용할 URLConf 모듈을 찾음
- 변경하지 않았다면 프로젝트 앱 내 settings.py의 ROOT_URLCONF 설정을 사용
- ROOT_URLconf로 정의된 URLConf 모듈을 보고 urlpatterns 리스트 안쪽의 django.urls.path() 함수를 순서대로 실행
- 요청과 일치하는 URL 패턴이 있다면 django.urls.path() 함수에 따라 view를 호출하거나, 일치하는 URL 패턴 다음의 URL을 하위 URLconf 모듈로 넘김
```python
from django.urls import path
from django.urls import include
from . import views

urlpatterns = [
    path(&#39;music/&#39;, views.player),
    path(&#39;video/&#39;, include(&#39;videoApp.urls&#39;)),
    # URL이 &#39;~/video/lecture/django&#39; 라면
    # videoApp의 URLconf에는 &#39;lecture/django&#39;가 넘어갑니다.
]</code></pre><h3 id="path-함수">path 함수</h3>
<blockquote>
<p>django.urls.path
path(route, view, kwargs=None, name=None)</p>
</blockquote>
<h4 id="route">route</h4>
<ul>
<li>URL 문자열을 인수로 받으며 경로 변수(Path Converter)를 사용하여 URL의 일부를 view의 인수로 보낼 수 있음<h4 id="path-converters">Path converters</h4>
</li>
<li>Django에서 기본으로 제공하는 경로 변환기 이하 경로 변수는 5가지가 있음<ul>
<li>str : 경로 구분 기호(/)를 제외한 모든 문자열과 매칭</li>
<li>int : 0 또는 양의 정수와 매칭</li>
<li>slug : 문자, 숫자, 하이픈(-), 밑줄(_)로 구성된 문자열과 매칭</li>
<li>uuid : 범용 고유 식별자(UUID)와 매칭<ul>
<li><a href="https://ko.wikipedia.org/wiki/%EB%B2%94%EC%9A%A9_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90">https://ko.wikipedia.org/wiki/%EB%B2%94%EC%9A%A9_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90</a></li>
</ul>
</li>
<li>path : 경로 구분 기호(/)를 포함한 모든 문자열과 매칭<h4 id="view">view</h4>
</li>
</ul>
</li>
<li>함수형 view 또는 클래스 기반 view가 들어갈 수 있음</li>
<li>include를 사용해서 다른 URLconf 모듈로 연결할 수도 있음<h4 id="kwargs">kwargs</h4>
</li>
<li>view에 추가 인자를 전달 할 때 사용<h4 id="name">name</h4>
</li>
<li>path 함수가 가지는 URL 패턴에 이름을 붙여 주기 위해 사용</li>
<li>URL을 직접 템플릿에 적지 않게 해주고 URL을 직관적으로 참조할 수 있게 해줌<h3 id="공식문서">공식문서</h3>
</li>
<li><a href="https://docs.djangoproject.com/en/2.2/topics/http/urls/">https://docs.djangoproject.com/en/2.2/topics/http/urls/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Template & View]]></title>
            <link>https://velog.io/@andromeda_galaxy/Template-View</link>
            <guid>https://velog.io/@andromeda_galaxy/Template-View</guid>
            <pubDate>Sun, 19 May 2024 02:56:36 GMT</pubDate>
            <description><![CDATA[<h2 id="template-language">Template Language</h2>
<ul>
<li><p>템플릿 언어 (Template Language)는 Django의 템플릿에서 사용 할 수 있는 특별한 문법</p>
</li>
<li><p>템플릿 변수 / 템플릿 필터 / 템플릿 태그 / 템플릿 코멘트</p>
<h3 id="템플릿-변수-template-variable">템플릿 변수 (Template Variable)</h3>
<blockquote>
<p>{{ variable }}</p>
</blockquote>
</li>
<li><p>템플릿 변수는 템플릿이 렌더될 때 해당 변수가 의미하는 값으로 변환</p>
</li>
<li><p>뷰(View)에서 가공한 데이터를 템플릿으로 넘겨주면 템플릿에서는 템플릿 변수를 사용해 넘겨받은 데이터에 접근</p>
</li>
</ul>
<h3 id="템플릿-필터-template-filter">템플릿 필터 (Template Filter)</h3>
<blockquote>
<p>{{ variable|filter }}</p>
</blockquote>
<ul>
<li>템플릿 변수에 파이프(|)를 쓰고 템플릿 필터를 사용하면 템플릿 변수를 특정 형식으로 변환</li>
</ul>
<h4 id="default">default</h4>
<blockquote>
<p>{{ variable|default:&quot;example&quot; }} </p>
</blockquote>
<ul>
<li>변수가 비어 있거나 False면 example 라는 텍스트로 대체</li>
</ul>
<h4 id="capfirst">capfirst</h4>
<blockquote>
<p>{{ variable|capfirst }}</p>
</blockquote>
<ul>
<li>맨 첫글자를 대문자로 변환</li>
</ul>
<h4 id="random">random</h4>
<blockquote>
<p>{{ variable|random }}</p>
</blockquote>
<ul>
<li>만약 variable이 참조하는 값이 [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;] 인 리스트형이면, 템플릿 변수가 리스트 내의 하나의 원소로 대체</li>
</ul>
<h4 id="upper--lower">upper &amp; lower</h4>
<blockquote>
<p>{{ variable | upper }} , {{ variable | lower }}</p>
</blockquote>
<ul>
<li>템플릿 변수를 대문자(upper) 또는 소문자 (lower)로 변환</li>
</ul>
<h4 id="ljust--rjust">ljust &amp; rjust</h4>
<blockquote>
<p>{{ variable|ljust:&quot;length&quot; }}, {{ variable|rjust:&quot;length&quot; }}</p>
</blockquote>
<ul>
<li>variable이 &quot;example&quot; 일 때 {{ variable|ljust:&quot;10&quot; }} 이라면 <code>&quot;example   &quot;</code></li>
<li>variable이 &quot;example&quot; 일 때 {{ variable|rjust:&quot;10&quot; }} 이라면 <code>&quot;   example&quot;</code></li>
</ul>
<h4 id="공식문서">공식문서</h4>
<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#ref-templates-builtins-filters">https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#ref-templates-builtins-filters</a></li>
</ul>
<h3 id="템플릿-태그-template-tag">템플릿 태그 (Template Tag)</h3>
<blockquote>
<p>{% tag %}</p>
</blockquote>
<ul>
<li>템플릿을 작성할 때 반복문, 조건문 등의 로직을 사용해서 마치 프로그래밍을 하듯 템플릿을 작성</li>
<li>기본적으로 제공하는 태그가 있지만, 개발자가 직접 태그를 정의해서 사용할 수 있음</li>
</ul>
<h4 id="공식문서-1">공식문서</h4>
<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#ref-templates-builtins-tags">https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#ref-templates-builtins-tags</a></li>
</ul>
<h3 id="사용자-정의">사용자 정의</h3>
<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/">https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[render() 함수]]></title>
            <link>https://velog.io/@andromeda_galaxy/render-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@andromeda_galaxy/render-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 19 May 2024 02:02:31 GMT</pubDate>
            <description><![CDATA[<h2 id="render-함수">render() 함수</h2>
<blockquote>
<p>render( request, template_name, context=None, content_type=None, status=None, using=None )</p>
</blockquote>
<ul>
<li>인자로 주어진 템플릿을 사전형(dict) 인자인 context와 결합해서 렌더링을 거친 다음 HttpResponse 객체로 반환하는 함수</li>
<li>인자로 넘겨주는 템플릿과 context 데이터를 합쳐서 HttpResponse 객체로 돌려주는 함수</li>
</ul>
<h3 id="필수인자">필수인자</h3>
<h4 id="request">request</h4>
<ul>
<li>데이터를 요청한 요청 객체를 넘겨줌</li>
<li>요청에 대한 정보에 접근해서 user, session 등 여러 가지 기능을 구현하기 위해<h4 id="template_name">template_name</h4>
</li>
<li>렌더링에 사용할 대상 템플릿을 명시</li>
</ul>
<h3 id="선택-인자">선택 인자</h3>
<h4 id="context">context</h4>
<ul>
<li>템플릿에 추가할 값들이 들어 있는 사전형 인자</li>
<li>기본값은 아무것도 없는 None<h4 id="content_type">content_type</h4>
</li>
<li>결과로 만들어 내는 문서의 유형</li>
<li>기본값은 &#39;text/html&#39; 즉 HTML 웹 페이지<h4 id="status">status</h4>
</li>
<li>상태 코드(Status Code) 값</li>
<li>기본값은 200(성공)<h4 id="using">using</h4>
</li>
<li>템플릿을 렌더하는 템플릿 엔진을 지정할 수 있는 인자</li>
<li>원하는 경우 다른 템플릿 엔진을 사용하여 템플릿을 렌더링할 수 있음</li>
</ul>
<h4 id="공식문서">공식문서</h4>
<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/#django.shortcuts.render">https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/#django.shortcuts.render</a></li>
</ul>
<h3 id="상태코드status-code">상태코드(Status Code)</h3>
<ul>
<li>클라이언트 요청에 대한 처리가 성공했는지 실패했는지에 대해 알려주는 코드</li>
</ul>
<h4 id="1xx-정보-전달">1XX (정보 전달)</h4>
<ul>
<li>100 (진행, Continue)<ul>
<li>요청의 첫 부분을 받아서 다음 요청을 기다리고 있음</li>
<li>이미 요청을 완료했다면 해당 응답을 무시할 수 있음</li>
</ul>
</li>
<li>101 (프로토콜 전환, Switching Protocol)<ul>
<li>클라이언트가 서버에게 프로토콜 전환을 요청했고 서버에서 프로토콜을 변경함<h4 id="2xx-성공">2XX (성공)</h4>
</li>
</ul>
</li>
<li>200 (성공, OK)<ul>
<li>클라이언트의 요청이 성공적으로 처리</li>
</ul>
</li>
<li>201 (작성됨, Created)<ul>
<li>요청이 성공적으로 처리되어 새로운 리소스를 생성</li>
</ul>
</li>
<li>202 (허용됨, Accepted)<ul>
<li>서버가 성공적으로 요청을 받았지만 아직 처리 전인 상태</li>
</ul>
</li>
<li>203 (신뢰할 수 없는 정보, Non-Authoritative Information)<ul>
<li>서버가 성공적으로 요청을 처리했지만 요청에 포함된 정보가 다른 곳에서 수정된 정보</li>
</ul>
</li>
<li>204 (콘텐츠 없음, No Content)<ul>
<li>요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다는 것을 의미</li>
</ul>
</li>
<li>205 (콘텐츠 재설정, Reset Content)<ul>
<li>요청을 성공적으로 처리했고 콘텐츠를 제공하지 않으며 클라이언트가 문서 보기를 재설정할 것을 요구<h4 id="3xx-리다이렉션">3XX (리다이렉션)</h4>
</li>
</ul>
</li>
<li>300 (여러 개의 선택 항목, Multiple Choice)<ul>
<li>요청에 대해 서버가 여러 응답이 가능하며 하나를 선택해야 함을 의미</li>
</ul>
</li>
<li>301 (영구 이동, Moved Permanently)<ul>
<li>요청한 리소스가 새로운 위치로 영구 이동</li>
<li>클라이언트는 자동적으로 새로운 위치로 전달됨</li>
</ul>
</li>
<li>302 (임시 이동, Found)<ul>
<li>요청한 리소스가 일시적으로 이동했음</li>
<li>향후 다시 해당 리소스를 요청할 때도 동일한 주소로 해야함을 의미</li>
</ul>
</li>
<li>304 (수정되지 않음, Not Modified)<ul>
<li>마지막 요청 이후 요청한 리소스는 수정되지 않았음</li>
<li>서버가 콘텐츠를 전달하지 않음</li>
<li>클라이언트는 이전에 전달받은 결과를 계속해서 사용할 수 있음<h4 id="4xx-실패">4XX (실패)</h4>
</li>
</ul>
</li>
<li>400 (잘못된 요청, Bad Request)<ul>
<li>클라이언트의 요청을 서버가 이해할 수 없다는 것을 의미</li>
</ul>
</li>
<li>401 (권한 없음, Unauthorized)<ul>
<li>클라이언트가 해당 요청에 대한 응답을 받기 위해서는 추가적인 인증이 필요하다는 것을 나타냄</li>
</ul>
</li>
<li>402 (결제 필요, Payment Required)<ul>
<li>이 요청을 결제가 필요하다는 것을 의미</li>
<li>현재는 사용되고 있지 않음</li>
</ul>
</li>
<li>403 (금지됨, Forbidden)<ul>
<li>클라이언트가 요청한 리소스에 접근할 권한이 없음</li>
<li>401과 다른 점은 서버는 해당 클라이언트에 대한 정보를 가지고 있음</li>
</ul>
</li>
<li>404 (찾을 수 없음, Not Found)<ul>
<li>클라이언트가 요청한 리소스를 서버가 찾을 수 없다는 것을 의미<h4 id="5xx-서버-오류">5XX (서버 오류)</h4>
</li>
</ul>
</li>
<li>500 (내부 서버 오류, Internal Server Error)<ul>
<li>서버에서 오류가 발생하여 요청한 작업을 수행할 수 없다는 것을 의미</li>
</ul>
</li>
<li>501 (구현되지 않음, Not Implemented)<ul>
<li>클라이언트가 요청한 방법을 서버에서 수행할 수 있는 기능이 없다는 것을 의미</li>
</ul>
</li>
<li>502 (잘못된 게이트웨이, Bad Gateway)<ul>
<li>서버가 요청을 처리하는데 필요한 작업 중 게이트웨이로부터 잘못된 응답을 받았다는 것을 의미</li>
</ul>
</li>
<li>503 (서비스를 사용할 수 없음, Service Unavailable)<ul>
<li>서버가 해당 요청을 처리할 준비가 되지 않았으며 일반적으로는 유지관리를 위해 작동이 중단되거나 과부하가 걸렸을 때를 나타냄</li>
<li>보통 일시<h4 id="추가정보">추가정보</h4>
</li>
</ul>
</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status">https://developer.mozilla.org/en-US/docs/Web/HTTP/Status</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django 구조]]></title>
            <link>https://velog.io/@andromeda_galaxy/Django-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@andromeda_galaxy/Django-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sun, 19 May 2024 01:49:56 GMT</pubDate>
            <description><![CDATA[<h2 id="프로젝트-생성">프로젝트 생성</h2>
<ul>
<li>Django에서 프로젝트 생성<blockquote>
<p>django-admin startproject {프로젝트명}</p>
</blockquote>
</li>
</ul>
<h3 id="django-프로젝트-구조">Django 프로젝트 구조</h3>
<blockquote>
<p><code>{프로젝트명}/</code></p>
<blockquote>
<p><code>manage.py</code>
    <code>{프로젝트명}/</code></p>
<blockquote>
<p><code>__init__.py</code>
        <code>settings.py</code>
        <code>urls.py</code>
        <code>wsgi.py</code></p>
</blockquote>
</blockquote>
</blockquote>
<h4 id="managepy">manage.py</h4>
<ul>
<li>하나의 Django 프로젝트를 생성하면 자동으로 만들어지는 프로젝트 관리를 위한 명령 유틸리티</li>
<li>Django 앱을 만들거나, 데이터베이스 관련 기능을 수행하거나, 개발 서버를 실행</li>
<li>공식문서<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/ref/django-admin/">https://docs.djangoproject.com/en/2.2/ref/django-admin/</a></li>
</ul>
</li>
</ul>
<h4 id="projectapp">ProjectApp</h4>
<ul>
<li>{프로젝트명} 디렉토리는 Django 프로젝트를 위한 여러 파일이 담겨 있는 디렉토리</li>
</ul>
<h4 id="__-init-__py"><code>__ init __.py</code></h4>
<ul>
<li>파일이 포함된 디렉토리를 Python의 패키지로 인식하게끔 하기 위해서 사용</li>
</ul>
<h4 id="urlspy">urls.py</h4>
<ul>
<li>url을 보고 알맞은 로직(View)으로 연결해주는 역할</li>
</ul>
<h4 id="wsgipy">wsgi.py</h4>
<ul>
<li>WSGI는 WebServer Gateway Interface의 약자</li>
<li>웹 서버와 Django 어플리케이션을 연결</li>
<li>참고문서<ul>
<li><a href="https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface">https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface</a></li>
</ul>
</li>
</ul>
<h2 id="앱-생성">앱 생성</h2>
<ul>
<li>Project와 App의 차이점<ul>
<li>웹 서비스 각각의 기능은 앱 단위로 구현</li>
<li>서로 다른 기능을 하는 앱을 여러 개 모아서 하나의 프로젝트 제작</li>
<li>하나의 프로젝트는 여러 개의 앱과 약간의 설정 파일들로 구성</li>
<li>하나의 앱은 여러 개의 프로젝트에서 사용할 수 있음</li>
</ul>
</li>
</ul>
<blockquote>
<p>python manage.py startapp {생성할 App 이름}</p>
</blockquote>
<h3 id="django-앱-구조">Django 앱 구조</h3>
<blockquote>
<p><code>{app_name}/</code></p>
<blockquote>
<p><code>__init__.py</code>
    <code>admin.py</code>
    <code>apps.py</code>
    <code>migrations/</code>
    <code>models.py</code>
    <code>tests.py</code>
    <code>views.py</code></p>
</blockquote>
</blockquote>
<h4 id="adminpy">admin.py</h4>
<ul>
<li>각각의 앱을 Django의 관리자 기능과 연결하거나 관리자 기능에 대해 설정</li>
</ul>
<h4 id="appspy">apps.py</h4>
<ul>
<li>각각의 App마다 추가적인 기능 및 설정을 넣어 주기 위한 파일</li>
<li>공식문서<ul>
<li><a href="https://docs.djangoproject.com/en/2.2/ref/applications">https://docs.djangoproject.com/en/2.2/ref/applications</a></li>
</ul>
</li>
</ul>
<h4 id="migrations-디렉토리">migrations 디렉토리</h4>
<ul>
<li>Django 앱의 데이터 구조에 대한 변경 사항인 migration 파일이 저장되는 <code>디렉토리</code></li>
</ul>
<h4 id="modelspy">models.py</h4>
<ul>
<li>앱에서 사용하는 데이터 구조를 정의하고 데이터베이스와의 소통을 담당</li>
</ul>
<h4 id="testspy">tests.py</h4>
<ul>
<li>앱에 대한 테스트 코드를 작성하는 파일</li>
</ul>
<h4 id="viewspy">views.py</h4>
<ul>
<li>앱에서 어떤 기능을 할지에 대한 메인 로직을 담당하는 파일</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[모듈]]></title>
            <link>https://velog.io/@andromeda_galaxy/%EB%AA%A8%EB%93%88</link>
            <guid>https://velog.io/@andromeda_galaxy/%EB%AA%A8%EB%93%88</guid>
            <pubDate>Wed, 15 May 2024 11:21:37 GMT</pubDate>
            <description><![CDATA[<h2 id="모듈">모듈</h2>
<ul>
<li>모듈(module)이란?<ul>
<li>여러 기능을 모아둔 파이썬 파일</li>
<li>모듈은 파일 이름에서 .py를 빼고 부름</li>
</ul>
</li>
</ul>
<h2 id="import">import</h2>
<ul>
<li>모듈에 저장된 기능을 가져다 쓰기 위해서는 모듈을 임포트(import)<h3 id="import-module">import <code>&lt;module&gt;</code></h3>
</li>
<li>모듈 전체를 임포트</li>
<li>모듈 안에 있는 함수나 변수는 <code>.</code>으로 접근<pre><code class="language-python">import example
print(example.case(n))
print(example.case)</code></pre>
<h3 id="from-module-import-members">from <code>&lt;module&gt;</code> import <code>&lt;member(s)&gt;</code></h3>
</li>
<li>모듈에서 필요한 것들만 임포트</li>
<li>불러온 변수나 함수를 접근할 때 앞에 <code>module.</code>을 붙이지 않음<pre><code class="language-python">from example import case
print(case(n))
print(case)</code></pre>
<h3 id="from-module-import-">from <code>&lt;module&gt;</code> import *</h3>
</li>
<li>모듈에서 모든 걸 임포트</li>
<li>모든 것을 가져오는만큼 불필요한 요소까지 가져올 수 있기에 권장되지 않음<h3 id="키워드-as">키워드 as</h3>
</li>
<li>임포트 문 뒤에 <code>as</code>를 사용하여 이름을 바꿀 수 있음<pre><code class="language-python"># 모듈 이름 변경
import example as ex
print(ex.case(n))
# 함수 이름 변경
from example import case as ca
print(ca(n))</code></pre>
<h2 id="모듈-vs-스크립트">모듈 vs 스크립트</h2>
</li>
<li>스크립트는 실제로 프로그램을 작동시키는 실행 용도의 파일</li>
<li>모듈은 프로그램에 필요한 변수들이나 함수들을 정의한 임포트 용도의 파일</li>
<li>파일 자체에 특별한 차이가 없음<ul>
<li>어떤 파일은 상황에 따라 모듈이 될 수도 있고 스크립트가 될 수 있음<h3 id="__name__"><code>__name__</code></h3>
</li>
</ul>
</li>
<li><code>__name__</code>은 모듈의 이름을 저장해 놓은 변수<ul>
<li>직접 실행하면 <code>__name__</code>은 <code>__main__</code></li>
<li>임포트하면 <code>__name__</code>은 모듈 이름</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>