<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Log to grow</title>
    <link>https://killu.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 13:50:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>kkkrrr</managingEditor>
    <image>
      <title>Log to grow</title>
      <url>https://tistory1.daumcdn.net/tistory/2906551/attach/902eb888760f492985c8742392955959</url>
      <link>https://killu.tistory.com</link>
    </image>
    <item>
      <title>[Django] nginx, uwsgi 이용하여 배포하기 (aws ec2, rds)</title>
      <link>https://killu.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래 시리즈를 직접 해보며 안되는 부분을 수정하며 작성한 글입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;aws에서 EC2와 RDS 인스턴스를 생성했다는 가정하에 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nachwon.github.io/django-deploy-1-aws/&quot;&gt;nachwon.github.io/django-deploy-1-aws/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610264029777&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Deploy] Django 프로젝트 배포하기 - 1. AWS&quot; data-og-description=&quot;AWS EC2에 장고 프로젝트 올리기&quot; data-og-host=&quot;nachwon.github.io&quot; data-og-source-url=&quot;https://nachwon.github.io/django-deploy-1-aws/&quot; data-og-url=&quot;https://nachwon.github.io/django-deploy-1-aws/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSKHVH/hyIS6ilJTF/kUpLKfj5g9k9tIC7DEJot1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/cH3hbv/hyIS8HcfVt/RsdtPUVYGYwDLFzmbmkoqk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://nachwon.github.io/django-deploy-1-aws/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nachwon.github.io/django-deploy-1-aws/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSKHVH/hyIS6ilJTF/kUpLKfj5g9k9tIC7DEJot1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/cH3hbv/hyIS8HcfVt/RsdtPUVYGYwDLFzmbmkoqk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Deploy] Django 프로젝트 배포하기 - 1. AWS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS EC2에 장고 프로젝트 올리기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nachwon.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;pyenv 설치 &amp;amp; 가상환경 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. pyenv 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.1 필요한 패키지 우선 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 apt를 업데이트 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apt는 (Advanced Package Tool) 리눅스에서 추가적인 패키지를 설치하고 제거하는 역할을 하는 툴입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626330941281&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pyenv에 필요한 패키지를 우선 설치해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626330522832&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git libedit-dev python&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.2 pyenv 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 클론합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626330562739&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/pyenv/pyenv.git ~/.pyenv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수도 설정해줍니다&lt;/p&gt;
&lt;pre id=&quot;code_1626330658350&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ echo 'export PYENV_ROOT=&quot;$HOME/.pyenv&quot;' &amp;gt;&amp;gt; ~/.bash_profile
$ echo 'export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.bash_profile
$ echo 'eval &quot;$(pyenv init -)&quot;' &amp;gt;&amp;gt; ~/.bash_profile
$ source ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.3 pyenv-update 설치&lt;/p&gt;
&lt;pre id=&quot;code_1626331084471&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone git://github.com/pyenv/pyenv-update.git ~/.pyenv/plugins/pyenv-update

pyenv update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.4 pyenv-virtualenv 설치&lt;/p&gt;
&lt;pre id=&quot;code_1626331124124&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수도 설정해주세요.&lt;/p&gt;
&lt;pre id=&quot;code_1626331192241&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'eval &quot;$(pyenv virtualenv-init -)&quot;' &amp;gt;&amp;gt; ~/.bash_profile

source ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 가상환경 설치&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1610168540126&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# python 3.6.9 버전 설치 =&amp;gt; ubuntu에 설치된 버전과 같게 해주세요
pyenv install 3.6.9 
# production이라는 이름의 가상환경 설치
pyenv virtualenv 3.6.9 production&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상환경 실행&lt;/p&gt;
&lt;pre id=&quot;code_1610168560443&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv shell production&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;git 저장소에서 장고 프로젝트 클론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트 클론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;srv 폴더를 만들어주고, 권한을 부여합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626340452737&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir ~/srv

sudo chown -R ubuntu:ubuntu ~/srv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;srv 폴더 안에 프로젝트를 클론합니다&lt;/p&gt;
&lt;pre id=&quot;code_1626331547909&quot; class=&quot;python&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone &amp;lt;저장소 주소&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. pip 설치&lt;/p&gt;
&lt;pre id=&quot;code_1626331713865&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install python3-pip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;가상환경에 requirements 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requirements.txt가 있는 폴더로 이동하여 필요한 패키지를 설치해주세요&lt;/p&gt;
&lt;pre id=&quot;code_1610168587906&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;*** mysqlclient 설치중 오류&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626331935124&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    Complete output from command python setup.py egg_info:
    /bin/sh: 1: mysql_config: not found
    /bin/sh: 1: mariadb_config: not found
    /bin/sh: 1: mysql_config: not found
    Traceback (most recent call last):
      File &quot;&amp;lt;string&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
      File &quot;/tmp/pip-build-077uf8wx/mysqlclient/setup.py&quot;, line 15, in &amp;lt;module&amp;gt;
        metadata, options = get_config()
      File &quot;/tmp/pip-build-077uf8wx/mysqlclient/setup_posix.py&quot;, line 70, in get_config
        libs = mysql_config(&quot;libs&quot;)
      File &quot;/tmp/pip-build-077uf8wx/mysqlclient/setup_posix.py&quot;, line 31, in mysql_config
        raise OSError(&quot;{} not found&quot;.format(_mysql_config_path))
    OSError: mysql_config not found
    mysql_config --version
    mariadb_config --version
    mysql_config --libs

    ----------------------------------------
Command &quot;python setup.py egg_info&quot; failed with error code 1 in /tmp/pip-build-077uf8wx/mysqlclient/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 필요한 패키지 설치&lt;/p&gt;
&lt;pre id=&quot;code_1610168651380&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install libmysqlclient-dev
sudo apt install default-libmysqlclient-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;** grpcio 설치 중 멈춤 현상&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 업데이트&lt;/p&gt;
&lt;pre id=&quot;code_1626332263676&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install --upgrade pip
pip3 install --upgrade setuptools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개발 서버 구동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. secrets.json 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;secrets.json은 레포에 올라가있지 않으므로 수동으로 만들어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626332496972&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vim secrets.json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. DB Migrate&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626334554558&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 manage.py migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 개발 서버 구동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트번호 앞에 0:을 붙여주어야 외부에 공개한다는 뜻입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626332649600&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py runserver 0:8000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;** 이 때, mysql과 연결할 수 없다는 오류가 발생한다면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626332560704&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django.db.utils.OperationalError: (2002, &quot;Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지 해결책이 있습니다. 1) 개발 서버 구동을 위해 ubuntu에 mysql을 설치하는 방법, 2) aws rds를 연결해주는 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 우분투에 설치된 파이썬 버전이 맞지 않아 생기는 문제일수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. 우분투에 설치된 파이썬 3.6, 가상환경 파이썬 3.8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 한글 깨짐이 발생한다면&lt;/p&gt;
&lt;pre id=&quot;code_1626335515353&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/default/locale

(i 누르고 맨 아래에 다음 내용 저장)

LC_CTYPE=&quot;en_US.UTF-8&quot;
LC_ALL=&quot;en_US.UTF-8&quot;
LANG=&quot;en_US.UTF-8&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Django 프로젝트 개발 환경 분리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. setting 파일 분리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings.py파일을 아래와 같은 형태로 분리합니다. 기존에 있던 settings.py의 내용을 base.py에 복사 후 붙여넣습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610168795319&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;settings/
├── __init__.py
├── base.py
├── dev.py
└── prod.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;dev와 prod의 세팅을 분리하기 위함이며 공통적인 부분은 base에 작성하여 dev와 prod에서 import 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1610168848787&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from .base import * #dev.py와 prod.py의 최상단&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dev.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1610169142015&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from .base import *

DEBUG = True

ALLOWED_HOSTS = ['*']


DATABASES = {
    'default': {
        &quot;ENGINE&quot;: &quot;django.db.backends.mysql&quot;,
        &quot;NAME&quot;: &quot;&quot;,
        &quot;USER&quot;: &quot;&quot;,
        &quot;PASSWORD&quot;: &quot;&quot;,
        &quot;HOST&quot;: &quot;localhost&quot;,
        &quot;PORT&quot;: &quot;3306&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;prod.py&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러를 추적하기 위해 sentry를 세팅해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 DB setting은 secrets.json 파일에 저장 후 불러옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610169191831&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
from .base import *

import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

DEBUG = False  # important

sentry_sdk.init(
    dsn=&quot;&quot;,
    integrations=[DjangoIntegration()],

    send_default_pii=True
)


# ALLOWED_HOSTS = secrets['ALLOWED_HOST']
ALLOWED_HOSTS = ['*']


DATABASES = secrets['DB_SETTINGS']

WSGI_APPLICATION = 'config.uwsgi.application'

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;__init__.py&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dev환경과 prod 환경을 선택합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610169085610&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from .prod import *&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.2 manage.py / wsgi.py&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 세팅 파일을 위해 manage.py의 내용을 변경해주고, wsgi의 세팅파일을 prod.py로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;manage.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1610169009761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/usr/bin/env python
import os
import sys

if __name__ == &quot;__main__&quot;:
    os.environ.setdefault(&quot;DJANGO_SETTINGS_MODULE&quot;, &quot;config.settings&quot;)

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;wsgi.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1610169029900&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
os.environ.setdefault(&quot;DJANGO_SETTINGS_MODULE&quot;, &quot;config.settings.prod&quot;)

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;uwsgi&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 배포한 서버는 개발 서버로 배포한 것은 실제 웹서버로 사용할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 사용할 웹서버는 nginx이며, 이 nginx(웹서버)와 django(웹 앱)을 연결해줄 인터페이스가 필요한데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 바로 wsgi(Web Server Gateway Interface)다. 우리는 uwsgi라는 wsgi를 설치하여 사용할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 설치 전 필요한 패키지를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1610175650327&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install libpcre3

sudo apt-get install libpcre3-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- uwsgi 설치&lt;/p&gt;
&lt;pre id=&quot;code_1610175530604&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install uwsgi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;** uwsgi command not found&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626337415228&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install uwsgi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uwsgi가 성공적으로 설치됐다면 uwsgi로 서버를 열 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 경로는 manage.py가 있는 경로이다.&lt;/p&gt;
&lt;pre id=&quot;code_1610175740131&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uwsgi  --http :8000 --home &amp;lt;가상환경 경로&amp;gt; --chdir  &amp;lt;프로젝트 경로&amp;gt; -w &amp;lt;wsgi 파일이 있는 폴더 경로&amp;gt;.wsgi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ini 파일로 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어로 uwsgi를 실행하는 것이 번거로우므로 ini파일을 정의하여 이 파일을 통해 uwsgi를 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 디렉토리에 .config 폴더를 만들고 그 안에 uwsgi 폴더를 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 uwsgi 폴더 안에 mysite.ini 파일을 만듭니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610262813474&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[uwsgi]
chdir = home/ubuntu/srv/&amp;lt;루트 디렉토리&amp;gt;/&amp;lt;프로젝트 디렉토리&amp;gt;
module = config.wsgi:application
home = /home/ubuntu/&amp;lt;가상환경 경로&amp;gt;

uid = deploy
gid = deploy

http = :8080

enable-threads = true
master = true
vacuum = true
pidfile = /tmp/mysite.pid
logto = /var/log/uwsgi/mysite/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래쪽을 보면 log를 남길 경로를 설정했으므로 로그가 저장될 폴더를 만들어준다.&lt;/p&gt;
&lt;pre id=&quot;code_1610262882509&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir -p /var/log/uwsgi/mysite&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래 명령어로 uwsgi를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1610260813266&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo /home/ubuntu/srv/clique-server/&amp;lt;가상환경 경로&amp;gt;/uwsgi -i /home/ubuntu/srv/&amp;lt;루트 디렉토리&amp;gt;/.config/uwsgi/mysite.ini&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 로그파일은 아래 명령어로 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610262951678&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo cat /var/log/uwsgi/mysite/&amp;lt;로그파일명&amp;gt;.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. nginx&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지금까지 uwsgi를 실행하여 uwsgi가 django로 사용자의 요청을 전달하게 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 마지막으로 nginx를 구성하여 사용자의 요청을 nginx 웹서버가 받아 uwsgi로 전달하게 하면 완성입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부터는 아래 링크에 나온대로 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nachwon.github.io/django-deploy-3-nginx/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;nachwon.github.io/django-deploy-3-nginx/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BE/Django</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/66</guid>
      <comments>https://killu.tistory.com/66#entry66comment</comments>
      <pubDate>Sun, 10 Jan 2021 16:37:13 +0900</pubDate>
    </item>
    <item>
      <title>[Django &amp;amp; Docker] 로컬호스트에 mysql 띄우기 (docker-compose.yml)</title>
      <link>https://killu.tistory.com/65</link>
      <description>&lt;p&gt;** 도커 이용하여 django 웹서버 로컬에 띄우기&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://killu.tistory.com/60&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;killu.tistory.com/60&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610013775128&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Django &amp;amp; Docker]  docker-compose로 로컬 서버 띄우기&quot; data-og-description=&quot;** 로컬에 Docker가 설치되어 있다고 가정합니다. 1. Dockerfile 생성 Dockerfile이란 Docker image를 빌드하는데 필요한 명령어들을 모아놓은 파일입니다. docker build 명령어를 실행하면 docker는 Dockerfile..&quot; data-og-host=&quot;killu.tistory.com&quot; data-og-source-url=&quot;https://killu.tistory.com/60&quot; data-og-url=&quot;https://killu.tistory.com/60&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gYsac/hyIQTimdYe/bQvyq5A3VppOMNMpIeQC1K/img.png?width=360&amp;amp;height=140&amp;amp;face=0_0_360_140,https://scrap.kakaocdn.net/dn/UGUxg/hyIQ1tU5lR/8SJ8bhcRPZGAnVLVzcbWR0/img.png?width=360&amp;amp;height=140&amp;amp;face=0_0_360_140,https://scrap.kakaocdn.net/dn/1HNRy/hyIQQ0eNS0/eruUyE6BMcPGtIYHnHQGZK/img.png?width=2022&amp;amp;height=1398&amp;amp;face=0_0_2022_1398&quot;&gt;&lt;a href=&quot;https://killu.tistory.com/60&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://killu.tistory.com/60&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gYsac/hyIQTimdYe/bQvyq5A3VppOMNMpIeQC1K/img.png?width=360&amp;amp;height=140&amp;amp;face=0_0_360_140,https://scrap.kakaocdn.net/dn/UGUxg/hyIQ1tU5lR/8SJ8bhcRPZGAnVLVzcbWR0/img.png?width=360&amp;amp;height=140&amp;amp;face=0_0_360_140,https://scrap.kakaocdn.net/dn/1HNRy/hyIQQ0eNS0/eruUyE6BMcPGtIYHnHQGZK/img.png?width=2022&amp;amp;height=1398&amp;amp;face=0_0_2022_1398');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Django &amp;amp; Docker] docker-compose로 로컬 서버 띄우기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;** 로컬에 Docker가 설치되어 있다고 가정합니다. 1. Dockerfile 생성 Dockerfile이란 Docker image를 빌드하는데 필요한 명령어들을 모아놓은 파일입니다. docker build 명령어를 실행하면 docker는 Dockerfile..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;killu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. docker-compose.yml&lt;/h2&gt;
&lt;p&gt;mysql을 연동하기 위해 docker-compose.yml에 mysql 컨테이너를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1610013986198&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3' # docker compose verison
services: # docker compose가 실행할 서비스 목
  backend: # 서비스
    build:
      context: . # 현재 폴더를 빌드할 폴더로 선택
      dockerfile: Dockerfile
    ports:
      - 8000:8000
    volumes:
      - .:/app # . (현재 로컬 폴더)의 모든 파일과 /app을 링크하여 모든 파일 변경사항 반영
    depends_on: 
      - mysql_db

  mysql_db:
    image: mysql:8.0
    ports:
      - &quot;33066:3306&quot;
    environment:
      MYSQL_DATABASE: mysql_db # 해당 이름을 가진 db가 localhost에 생성됨
      MYSQL_USER: kkirru # db가 생성될 때 유저도 같이 생성
      MYSQL_PASSWORD: gusdngusdn 
      MYSQL_ROOT_PASSWORD: gusdngusdn # root 유저의 패스워드
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - .dbdata:/var/lib/mysql # db data가 저장 될 경로&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 도커 빌드&lt;/h2&gt;
&lt;p&gt;아래 명령어를 차례로 입력하면 mysql 이미지를 pull해서 빌드한다.&lt;/p&gt;
&lt;pre id=&quot;code_1610014009417&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose build
docker-compose up&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 아래와 같이 연결 정보를 입력하면 연결된다.&lt;/p&gt;
&lt;p&gt;포트 번호를 docker-compose.yml에 명시한대로 입력하는 것을 잊지 말아야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwfwdg/btqSLGJI8C5/mdB9Tk2yTa3i2OrCu9JmEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwfwdg/btqSLGJI8C5/mdB9Tk2yTa3i2OrCu9JmEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwfwdg/btqSLGJI8C5/mdB9Tk2yTa3i2OrCu9JmEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwfwdg%2FbtqSLGJI8C5%2FmdB9Tk2yTa3i2OrCu9JmEk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;** Public Key Retrieval is not allowed&lt;/h2&gt;
&lt;p&gt;만약 연결을 시도 했을 때 위와 같은 에러가 발생한다면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;useSSL과 &lt;span&gt;allowPublicKeyRetrieval 속성을 true로 설정해주면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50379839/connection-java-mysql-public-key-retrieval-is-not-allowed&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow.com/questions/50379839/connection-java-mysql-public-key-retrieval-is-not-allowed&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/65</guid>
      <comments>https://killu.tistory.com/65#entry65comment</comments>
      <pubDate>Thu, 7 Jan 2021 19:11:01 +0900</pubDate>
    </item>
    <item>
      <title>[aws] rds 생성할 때 알아야할 것들</title>
      <link>https://killu.tistory.com/64</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 유저 이름과 비밀번호&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4JYG/btqSKM4sdbY/vrkvP5rlSNNtmfkNpcx5d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4JYG/btqSKM4sdbY/vrkvP5rlSNNtmfkNpcx5d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4JYG/btqSKM4sdbY/vrkvP5rlSNNtmfkNpcx5d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4JYG%2FbtqSKM4sdbY%2FvrkvP5rlSNNtmfkNpcx5d1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Public Access&lt;/h2&gt;
&lt;p&gt;Connectivity 섹션에 Public access 항목이 있습니다.&lt;/p&gt;
&lt;p&gt;기본 값이 No로 되어 있는데 No로 설정 시 외부에서 이 rds에 접근할 수 없습니다.&lt;/p&gt;
&lt;p&gt;즉, 서버에 연결할 수도 없으며 DB 툴로 접속할 수도 없습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQR29q/btqSNmc995A/mqoGENmquAMAQYmfXztk9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQR29q/btqSNmc995A/mqoGENmquAMAQYmfXztk9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQR29q/btqSNmc995A/mqoGENmquAMAQYmfXztk9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQR29q%2FbtqSNmc995A%2FmqoGENmquAMAQYmfXztk9K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>BE/aws</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/64</guid>
      <comments>https://killu.tistory.com/64#entry64comment</comments>
      <pubDate>Thu, 7 Jan 2021 18:04:13 +0900</pubDate>
    </item>
    <item>
      <title>[aws] ec2 인스턴스 생성할 때 알아야할 것들</title>
      <link>https://killu.tistory.com/62</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Storage size&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;8GB가 기본으로 입력되어 있지만 30GB까지 프리 티어로 이용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byvwYi/btqSTJEnNXA/FIkEfkCyKLznUxyEnKnSE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byvwYi/btqSTJEnNXA/FIkEfkCyKLznUxyEnKnSE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byvwYi/btqSTJEnNXA/FIkEfkCyKLznUxyEnKnSE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyvwYi%2FbtqSTJEnNXA%2FFIkEfkCyKLznUxyEnKnSE0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 태그&lt;/h2&gt;
&lt;p&gt;태그에 이름을 미리 입력해두는게 좋다.&lt;/p&gt;
&lt;p&gt;그래야 인스턴스가 여러 개 생겼을 때 혼동되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AEX17/btqSELYOP1Z/IFGI9eZIMjlkJfmcdQpiAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AEX17/btqSELYOP1Z/IFGI9eZIMjlkJfmcdQpiAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AEX17/btqSELYOP1Z/IFGI9eZIMjlkJfmcdQpiAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAEX17%2FbtqSELYOP1Z%2FIFGI9eZIMjlkJfmcdQpiAK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 보안 그룹&lt;/h2&gt;
&lt;p&gt;기본적으로 80포트와 8000포트를 열어둔다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;22번 포트&lt;/b&gt;의 경우 아래 그림에서는 모두에게 열어두었지만&lt;/p&gt;
&lt;p&gt;중요한 인스턴스라면 특정 IP(회사, 집 등)에게만 열어두는게 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2551&quot; data-origin-height=&quot;634&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s1Zkt/btqSLHVm4j1/wcwXFRBqKRwdrappTVj8v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s1Zkt/btqSLHVm4j1/wcwXFRBqKRwdrappTVj8v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s1Zkt/btqSLHVm4j1/wcwXFRBqKRwdrappTVj8v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs1Zkt%2FbtqSLHVm4j1%2FwcwXFRBqKRwdrappTVj8v1%2Fimg.png&quot; data-origin-width=&quot;2551&quot; data-origin-height=&quot;634&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 키페어&lt;/h2&gt;
&lt;p&gt;인스턴스를 생성하고 나면 key pair를 설정하게 되는데,&lt;/p&gt;
&lt;p&gt;새롭게 생성한 키페어라면 &lt;u&gt;&lt;b&gt;반드시&lt;/b&gt;&lt;/u&gt;&amp;nbsp;안전한 곳에 보관해두어야 한다.&lt;/p&gt;
&lt;p&gt;이 키페어는 다시 발급받을 수 없고, 외부에 노출되면 제 3자가 서버에 접속할 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BE/aws</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/62</guid>
      <comments>https://killu.tistory.com/62#entry62comment</comments>
      <pubDate>Wed, 6 Jan 2021 23:55:37 +0900</pubDate>
    </item>
    <item>
      <title>[Django &amp;amp; Docer] 도커 컴포즈 (Docker compose)</title>
      <link>https://killu.tistory.com/61</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7eKbS/btqSGiN4IhK/GChO7HyddA8grgDJZlwpZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7eKbS/btqSGiN4IhK/GChO7HyddA8grgDJZlwpZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7eKbS/btqSGiN4IhK/GChO7HyddA8grgDJZlwpZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7eKbS%2FbtqSGiN4IhK%2FGChO7HyddA8grgDJZlwpZK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 도커 컴포즈 (docker compose)&lt;/p&gt;
&lt;p&gt;docker compose는 docker image를 쉽게 실행할 수 있게 도와주는 도구입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로젝트를 구성하다보면 서버, DB 등 다양한 서비스를 실행해야 하고, 이를 도커 이미지에서 쉽게 실행할 수 있게 해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. docker-compose.yml&lt;/p&gt;
&lt;p&gt;도커 컴포즈를 사용하기 위해 프로젝트의 루트 디렉토리에 yml 파일을 생성해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- version&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;docker-compose.yml 파일 가장 상단에는 사용할 docker-compose 버전을 입력해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1609812442527&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- services&lt;/p&gt;
&lt;p&gt;그리고 프로젝트를 구성하는 서비스들을 명시해주면 됩니다.&lt;/p&gt;
&lt;p&gt;app이라는 이름을 가진 Django 애플리케이션을 정의하면 아래와 같이 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1609812563836&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'

services:
  app:&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 docker-compose가 실행될 컨텍스트를 현재 디렉토리로 설정해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609812671719&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'

services:
 app:
   build:
     context: .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- ports&lt;/p&gt;
&lt;p&gt;사용할 포트를 명시해줍니다. 여기서는 8000번 포트를 사용하도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 때, 첫 번째 오는 8000은 호스트(여기에서는 로컬)의 포트이고, 두 번째 오는 8000은 도커 컨테이너의 포트입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609813006675&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'

services:
 app:
   build:
     context: .
   ports:
     - &quot;8000:8000&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- volumes&lt;/p&gt;
&lt;p&gt;도커는 우리가 프로젝트 코드를 수정하면 도커 이미지를 재시작하지 않고 이를 도커 이미지에 반영시킵니다.&lt;/p&gt;
&lt;p&gt;이를 위해 로컬 소스코드 디렉토리와 도커 이미지의 소스코드 디렉토리를 매핑해주어야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609813103386&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'

services:
 app:
   build:
     context: .
   ports:
     - &quot;8000:8000&quot;
   volumes:
     - ./app:/app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- command&lt;/p&gt;
&lt;p&gt;마지막으로, 서버를 실행시킬 명령어를 입력해줍니다.&lt;/p&gt;
&lt;p&gt;'&amp;gt;' 기호는 다음 줄로 넘어가는 것을 의미합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609813158368&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'

services:
 app:
   build:
     context: .
   ports:
     - &quot;8000:8000&quot;
   volumes:
     - ./app:/app
   command: &amp;gt; 
     sh -c &quot;python manage.py runserver 0.0.0.0:8000&quot; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기서 주의할 점은 서버를 실행시킬 때의 포트가 위에서 명시한 도커 컨테이너의 포트와 일치해야한다는 점입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 빌드&lt;/p&gt;
&lt;p&gt;이제 docker-compose를 이용하여 빌드를 해볼 차례입니다.&lt;/p&gt;
&lt;p&gt;터미널에 'docker-compose build'를 입력하면 아래와 같이 빌드가 성공적으로 이루어진 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh9pfc/btqSxCUlza0/TKQFll0hLr6KMBq6UnfOv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh9pfc/btqSxCUlza0/TKQFll0hLr6KMBq6UnfOv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh9pfc/btqSxCUlza0/TKQFll0hLr6KMBq6UnfOv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh9pfc%2FbtqSxCUlza0%2FTKQFll0hLr6KMBq6UnfOv1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/61</guid>
      <comments>https://killu.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 5 Jan 2021 11:26:23 +0900</pubDate>
    </item>
    <item>
      <title>[Django &amp;amp; Docker]  docker-compose로 로컬 서버 띄우기</title>
      <link>https://killu.tistory.com/60</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcHWxZ/btqSDuVKjBF/FDrLXOT6CVtn8moTZdggkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcHWxZ/btqSDuVKjBF/FDrLXOT6CVtn8moTZdggkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcHWxZ/btqSDuVKjBF/FDrLXOT6CVtn8moTZdggkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcHWxZ%2FbtqSDuVKjBF%2FFDrLXOT6CVtn8moTZdggkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;** 로컬에 Docker가 설치되어 있다고 가정합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. Dockerfile 생성&lt;/p&gt;
&lt;p&gt;Dockerfile이란 Docker image를 빌드하는데 필요한 명령어들을 모아놓은 파일입니다.&lt;/p&gt;
&lt;p&gt;docker build 명령어를 실행하면 docker는 Dockerfile의 명령어를 실행하여 이미지를 빌드합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- Dockerfile은 확장자 없이 루트 디렉토리에 생성합니다. vscode에서 생성하면 귀여운 아이콘이 따라옵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PdeKn/btqSGjMVho1/AKKZ6YZtpRhSeqzRv0llE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PdeKn/btqSGjMVho1/AKKZ6YZtpRhSeqzRv0llE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PdeKn/btqSGjMVho1/AKKZ6YZtpRhSeqzRv0llE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPdeKn%2FbtqSGjMVho1%2FAKKZ6YZtpRhSeqzRv0llE1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- tag&lt;/p&gt;
&lt;p&gt;Dockerfile의 가장 위에는 어떤 이미지를 가져올 것인지를 태그로 명시합니다.&lt;/p&gt;
&lt;p&gt;여기에서는 python:3.7 태그를 사용하겠습니다.&lt;/p&gt;
&lt;p&gt;더 많은 태그는 &lt;a href=&quot;https://hub.docker.com/_/python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;hub.docker.com/_/python&lt;/a&gt;&amp;nbsp;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609810860456&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- maintainer&lt;/p&gt;
&lt;p&gt;선택사항이지만 maintainer가 누군지 명시할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609810988390&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7
MAINTAINER hyeonwoo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- ENV&lt;/p&gt;
&lt;p&gt;ENV 명령어를 이용하여 이미지에 필요한 환경변수를 설정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;여기에서는 &lt;span&gt;PYTHONUNBUFFERD를 1로 설정하여 python이 unbuffered mode로 실행되도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;unbuffered mode에서는 output을 버퍼에 저장하지 않고 바로 출력합니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1609811236678&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7-alpine
MAINTAINER hyeonwoo

# set unbuffered mode
ENV PYTHONUNBUFFERD 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- app 폴더를 working directory로 설정&lt;/p&gt;
&lt;p&gt;도커 컨테이너 내부에서 working directory로 /app을 사용할 수 있게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610007385542&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7-alpine
MAINTAINER hyeonwoo

ENV PYTHONUNBUFFERD 1

WORKDIR /app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Copy requirements.txt&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이제 생성한 이미지에 필요한 모듈과 패키지를 설치할 차례입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Django에서는 requirements.txt 파일에 명시되어 있으므로 이를 도커 이미지에 복사해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1609811311294&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7-alpine
MAINTAINER hyeonwoo

ENV PYTHONUNBUFFERD 1

WORKDIR /app

# copy requirements to docker image
COPY requirements.txt /app/requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 복사한 requirements.txt파일을 이용하여 패키지들을 설치해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609811395765&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7-alpine
MAINTAINER hyeonwoo

ENV PYTHONUNBUFFERD 1


COPY ./requirements.txt /requirements.txt
# install requirements to docker image
RUN pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 소스코드&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 프로젝트 소스코드를 도커 이미지에 복사할 차례입니다.&lt;/p&gt;
&lt;p&gt;현재 디렉토리(.)를 /app 디렉토리에 복사해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1609811431689&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7-alpine
MAINTAINER hyeonwoo

ENV PYTHONUNBUFFERD 1


COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

# copy source code
COPY . /app &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- runserver 커맨드&lt;/p&gt;
&lt;p&gt;마지막으로 로컬서버를 실행시킬 커맨드를 입력해줍니다.&lt;/p&gt;
&lt;p&gt;도커 컨테이너 내부 포트는 8000번으로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610007529625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.7-alpine
MAINTAINER hyeonwoo

ENV PYTHONUNBUFFERD 1


COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

COPY . /app 

# runserver
CMD python manage.py runserver 0.0.0.0:8000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. docker-compose.yml 파일&lt;/p&gt;
&lt;p&gt;docker-compose.yml 파일을 Dockerfile과 같은 루트 디렉토리에 생성합니다.&lt;/p&gt;
&lt;p&gt;그리고 최상단에 아래와 같이 작성합니다.&lt;/p&gt;
&lt;p&gt;docker-compose 버전은 3으로 하고, service들을 포함할 services 를 입력해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610007622836&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'
services: 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 웹 서버&lt;/p&gt;
&lt;p&gt;첫 번째로 웹 서버용 컨테이너를 만들겠습니다.&lt;/p&gt;
&lt;p&gt;서비스 이름은 'backend'로 하고, 아래에는 빌드에 관한 정보를 써줍니다.&lt;/p&gt;
&lt;p&gt;context에는 현재 디렉토리를 입력하여 현재 디렉토리를 빌드할 것을 알려주고, Dockerfile의 이름을 명시해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610007749438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3' 
services: 
  backend: 
    build:
      context: . 
      dockerfile: Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 포트와 볼륨을 명시해줍니다.&lt;/p&gt;
&lt;p&gt;ports: 에서 첫번째 8000은 외부에 열어놓는 포트이고, 두 번째 8000은 Dockerfile에서 runserver 뒤에 입력한 도커 컨테이너 내부 포트입니다.&lt;/p&gt;
&lt;p&gt;volumes 에는 로컬 디렉토리와 도커 컨테이너에 저장될 경로를 차례로 써줍니다.&lt;/p&gt;
&lt;p&gt;로컬 디렉토리(.) 내의 파일이 변경될 때마다 이를 /app에 업데이트합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610007833855&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'
services: 
  backend:
    build:
      context: . 
      dockerfile: Dockerfile
    ports:
      - 8000:8000
    volumes:
      - .:/app 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. docker-compose로 서비스 실행&lt;/p&gt;
&lt;p&gt;Dockerfile과 docker-compose.yml 작성을 마쳤다면 서버를 실행해볼 차례입니다.&lt;/p&gt;
&lt;p&gt;터미널에 아래 두 명령어를 차례로 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1610007998944&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose build
docker-compose up&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래와 같이 로컬 서버가 실행되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LpPe4/btqSXiGWUDi/3vubjnzWNMpEJL2MGQboo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LpPe4/btqSXiGWUDi/3vubjnzWNMpEJL2MGQboo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LpPe4/btqSXiGWUDi/3vubjnzWNMpEJL2MGQboo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLpPe4%2FbtqSXiGWUDi%2F3vubjnzWNMpEJL2MGQboo1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>BE/Django</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/60</guid>
      <comments>https://killu.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 5 Jan 2021 11:02:04 +0900</pubDate>
    </item>
    <item>
      <title>[Django] 시작하기 (가상환경, 프로젝트 생성)</title>
      <link>https://killu.tistory.com/55</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;426&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmfER3/btqRoRlx0M1/BWzzrbsHWDfD9jPxXOz5P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmfER3/btqRoRlx0M1/BWzzrbsHWDfD9jPxXOz5P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmfER3/btqRoRlx0M1/BWzzrbsHWDfD9jPxXOz5P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmfER3%2FbtqRoRlx0M1%2FBWzzrbsHWDfD9jPxXOz5P1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;426&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 가상환경 (Virtual envirionment)&lt;/h3&gt;
&lt;p&gt;한 컴퓨터에서 여러 프로젝트를 진행하기 위해서는 필요한 패키지나 환경 설정이 다를 수 있으므로 프로젝트마다 다른 가상환경으로 시작해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 가상환경 생성&lt;/p&gt;
&lt;pre id=&quot;code_1608966965201&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m venv &amp;lt;가상환경 이름&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 가상환경 실행하기&lt;/p&gt;
&lt;p&gt;가상환경을 생성하고 실행하기 위해 bin 폴더 안에 있는 activate 파일을 source 명령어를 통해 실행해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1608967042760&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source &amp;lt;가상환경 이름&amp;gt;/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 가상환경 종료하기&lt;/p&gt;
&lt;p&gt;종료시에는 아래 명령어를 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1609312459687&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 가상환경에 django 설치&lt;/h3&gt;
&lt;p&gt;- 설치된 package list 확인하기&lt;/p&gt;
&lt;pre id=&quot;code_1608967208732&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 명령어를 통해 지금 가상환경에 설치된 패키지를 확인할 수 있다. 처음 가상환경을 생성했다면 아래와 같이 나타날 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1608967254532&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Package    Version
---------- -------
pip        19.2.3 
setuptools 41.2.0 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- django 설치하기&lt;/p&gt;
&lt;pre id=&quot;code_1608967293201&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;특정 버전을 설치하고 싶다면 아래와 같이 명시한다.&lt;/p&gt;
&lt;pre id=&quot;code_1608967389288&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django==3.1.4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Project 생성&lt;/h3&gt;
&lt;p&gt;- startproject&lt;/p&gt;
&lt;p&gt;가상환경에&amp;nbsp; django를 잘 생성했다면 프로젝트를 아래 명령어로 생성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1608967541955&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django-admin startproject &amp;lt;프로젝트 이름&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 서버 실행해보기&lt;/p&gt;
&lt;p&gt;프로젝트가 만들어졌다면 로컬에서 서버를 실행시켜 볼 수 있다.&lt;/p&gt;
&lt;p&gt;생성된 프로젝트 폴더로 이동한 후 로컬 서버를 실행시키는 아래 명령어를 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1608967787232&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py runserver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;브라우저에서 http://127.0.0.1:8000/ 로 접속해보면 아래와 같은 화면을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;648&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcIw1s/btqRptYZIfe/4q2t2aSwzbkpGzTkSWADk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcIw1s/btqRptYZIfe/4q2t2aSwzbkpGzTkSWADk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcIw1s/btqRptYZIfe/4q2t2aSwzbkpGzTkSWADk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcIw1s%2FbtqRptYZIfe%2F4q2t2aSwzbkpGzTkSWADk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;648&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BE/Django</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/55</guid>
      <comments>https://killu.tistory.com/55#entry55comment</comments>
      <pubDate>Sat, 26 Dec 2020 16:38:35 +0900</pubDate>
    </item>
    <item>
      <title>[mysql] mysql 로컬 서버 실행 오류로 접속이 안될 때</title>
      <link>https://killu.tistory.com/54</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;550&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SqXBi/btqTfB1OkFe/2ZvepRjtn0vtpm3Lktp5F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SqXBi/btqTfB1OkFe/2ZvepRjtn0vtpm3Lktp5F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SqXBi/btqTfB1OkFe/2ZvepRjtn0vtpm3Lktp5F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSqXBi%2FbtqTfB1OkFe%2F2ZvepRjtn0vtpm3Lktp5F0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;550&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p&gt;mysql이 실헹되지 않은 채 연결을 시도하면 생기는 에러이다.&lt;/p&gt;
&lt;p&gt;mysql이 비정상적으로 종료되었거나 컴퓨터를 재부팅하면 mysql을 다시 실행해주어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. mysql server 실행&lt;/h2&gt;
&lt;p&gt;터미널에서 아래 명령어를 실행하여 mysql server를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1610430214353&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql.server start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;성공적으로 실행되었다면 아래와 같은 메세지가 나온다.&lt;/p&gt;
&lt;pre id=&quot;code_1610430230939&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Starting MySQL
 SUCCESS!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. mysql.server start가 실행되지 않는 경우&lt;/h2&gt;
&lt;p&gt;이 경우 mysql이 설치된 디렉토리에서 mysqld_safe 유닉스 실행 파일을 실행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- mysql 경로&lt;/h3&gt;
&lt;p&gt;맥환경이고 Homebrew로 mysql을 설치했다면 아래 경로에 mysql이 설치되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1605925719167&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/usr/local/mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- mysql 시작&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mysqld_safe는 /usr/local/mysql/bin 폴더에 있고, 아래 명령어로 실행할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605925773385&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysqld_safe --user=mysql &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;명령어의 끝에 &amp;amp;을 붙여야 터미널을 계속 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mysql이 정상적으로 실행되어 루트 로그인이 된 모습!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1q8tv/btqNWFATsLv/A1AMAWtpofepWS0jhSm6CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1q8tv/btqNWFATsLv/A1AMAWtpofepWS0jhSm6CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1q8tv/btqNWFATsLv/A1AMAWtpofepWS0jhSm6CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1q8tv%2FbtqNWFATsLv%2FA1AMAWtpofepWS0jhSm6CK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>BE/rdb</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/54</guid>
      <comments>https://killu.tistory.com/54#entry54comment</comments>
      <pubDate>Sat, 21 Nov 2020 11:33:13 +0900</pubDate>
    </item>
    <item>
      <title>[rdbms]  7가지 꼭 지켜야할 네이밍 규칙 (naming convention)</title>
      <link>https://killu.tistory.com/52</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dala1M/btqM2GV8m7B/X3XhKfK0xu0lrBNQsUQ6pK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dala1M/btqM2GV8m7B/X3XhKfK0xu0lrBNQsUQ6pK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dala1M/btqM2GV8m7B/X3XhKfK0xu0lrBNQsUQ6pK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdala1M%2FbtqM2GV8m7B%2FX3XhKfK0xu0lrBNQsUQ6pK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공통&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 이름은 snake case를 따른다.&lt;/h3&gt;
&lt;p&gt;- snake case란 모든 글자를 소문자로 하고, 언더스코어(_)로 단어를 구분해주는 방법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1605340861222&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) userLogin, Name (X) --&amp;gt;  user_login, name (O)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. prefix와 postfix는 사용하지 않는다. (옛날 방식)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1605340871026&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) user_TB (X)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테이블 관련&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 테이블의 이름은 복수가 아닌 단수로 쓴다.&lt;/h3&gt;
&lt;pre id=&quot;code_1605340879922&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) members (X) -&amp;gt; member (O)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 가능하면 단어를 줄여쓰지 않는다. &lt;span style=&quot;color: #333333;&quot;&gt;(no abbreviation)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1605340884715&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) mid_ma (X) --&amp;gt; middle_name (O)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;속성 관련&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. 테이블이 하나의 Primary Key를 가진다면 그 속성의 이름은 id로 한다.&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1605340888909&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) user_id (X) -&amp;gt; id&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. Foreign Key는 테이블 이름과 속성 이름을 더해 정한다.&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1605340892729&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) user 테이블의 id -&amp;gt; user_id&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. index와 constraint는 descriptive하게 작성한다.&lt;/h3&gt;
&lt;p&gt;- 예를 들어 index의 경우 테이블명, 속성명, 인덱스 유형이 포함되어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1605340897166&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex) user_ix (X) -&amp;gt; user_ix_email_lower&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BE/rdb</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/52</guid>
      <comments>https://killu.tistory.com/52#entry52comment</comments>
      <pubDate>Tue, 10 Nov 2020 15:56:46 +0900</pubDate>
    </item>
    <item>
      <title>[rdbms] DB schema 설계시 주의할 점 2가지(확장성, 정규화)</title>
      <link>https://killu.tistory.com/51</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWj5mN/btqM38w7BuK/NB9pBlEVTGYx6joNLjrII1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWj5mN/btqM38w7BuK/NB9pBlEVTGYx6joNLjrII1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWj5mN/btqM38w7BuK/NB9pBlEVTGYx6joNLjrII1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWj5mN%2FbtqM38w7BuK%2FNB9pBlEVTGYx6joNLjrII1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;300&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DB를 설계할 때 쉽게 실수할 수 있는 부분이 2가지 있다.&lt;/p&gt;
&lt;p&gt;바로 확장성을 고려하지 않는 것과 정규화를 하지 않는 것이다.&lt;/p&gt;
&lt;p&gt;이 경우, 데이터의 구조가 변했을 때 쉽게 설계를 수정할 수 없고, 중복 레코드를 발생시킨다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 확장성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 Primary key에 의미를 부여하지 말자.&lt;/h3&gt;
&lt;p&gt;primary key는 just index로서의 역할만할 뿐, 의미를 부여하는 순간 확장성이 무너진다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 NULL을 허용해야 하는지 고려하자.&lt;/h3&gt;
&lt;p&gt;- 반드시 속성의 값이 존재해야 하는지 꼭 고려해야 한다.&lt;/p&gt;
&lt;p&gt;ex) 학교에서의 특수반 -&amp;gt; 특수반은 모든 학년이 포함될 수 있으므로 학년 ID(FK)가 NULL일 수 있음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;student_id (PK)&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;student_name&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;grade (FK)&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;class&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;김철수&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;박영희&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;바둑이&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;특수반&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- NULL은 수집되지 못한 데이터를 뜻하기도 한다.&lt;/p&gt;
&lt;p&gt;만약 어떤 속성에 NULL을 허용하지 않았다면, 이 속성이 수집되지 않았을 때 표현할 수 있는 방법이 없다.&lt;/p&gt;
&lt;p&gt;이 경우 수집되지 않은 데이터에 대한 처리를 위해 가능성이 있다면 반드시 NULL을 허용해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 고정관념으로 column을 생략하지 말자.&lt;/h3&gt;
&lt;p&gt;위와 똑같은 예제로 설명할 수 있다.&lt;br /&gt;어차피 반은 1,2,3반이니 class 속성을 int로 정의하고 class_name을 생략한다고 하면 특수반을 고려할 수 없다.&lt;/p&gt;
&lt;p&gt;또한, 어떤 학교는 반에 이름을 붙여 표시한다면 (우반, 열반) 이 경우 표현할 수 없다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;student_id (PK)&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;student_name&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;grade (FK)&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;class_id(FK)&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;class_name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;김철수&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;박영희&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;바둑이&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;특수반&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 정규화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 속성은 반드시 하나의 값을 가져야 한다. (제 1 정규화)&lt;/h3&gt;
&lt;p&gt;- 정규화 되지 않은 table&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 270px;&quot;&gt;user_id&lt;/td&gt;
&lt;td style=&quot;width: 269px;&quot;&gt;user_name&lt;/td&gt;
&lt;td style=&quot;width: 269px;&quot;&gt;device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 270px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 269px;&quot;&gt;김철수&lt;/td&gt;
&lt;td style=&quot;width: 269px;&quot;&gt;아이폰 12, 갤럭시s20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;device 칼럼에 두 개의 값이 포함되어 있으므로 정규화에 어긋난다.&lt;/p&gt;
&lt;p&gt;따라서, 두 개의 테이블로 나눠 정규화한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- user 테이블&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.6512%; height: 55px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50.1163%; height: 19px;&quot;&gt;user_id&lt;/td&gt;
&lt;td style=&quot;width: 49.7674%; height: 19px;&quot;&gt;user_name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50.1163%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 49.7674%; height: 17px;&quot;&gt;김철수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;- device 테이블&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.8837%; height: 57px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.1776%; height: 19px;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;width: 33.1776%; height: 19px;&quot;&gt;user_id&lt;/td&gt;
&lt;td style=&quot;width: 33.4112%; height: 19px;&quot;&gt;device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.1776%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.1776%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.4112%; height: 19px;&quot;&gt;아이폰 12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.1776%; height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.1776%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.4112%; height: 19px;&quot;&gt;갤럭시s 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BE/rdb</category>
      <author>kkkrrr</author>
      <guid isPermaLink="true">https://killu.tistory.com/51</guid>
      <comments>https://killu.tistory.com/51#entry51comment</comments>
      <pubDate>Sun, 8 Nov 2020 10:06:32 +0900</pubDate>
    </item>
  </channel>
</rss>