<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>UserDonghu's Note</title>
    <link>https://userdonghu.tistory.com/</link>
    <description>락스타가 되고싶다</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 14:38:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>UserDonghu</managingEditor>
    <image>
      <title>UserDonghu's Note</title>
      <url>https://tistory1.daumcdn.net/tistory/6578048/attach/dfd6df8415524cf5a626bcfc9f09bb2b</url>
      <link>https://userdonghu.tistory.com</link>
    </image>
    <item>
      <title>NCP 서버 포트 열어서 다른 버전의 추가 Django 올리기</title>
      <link>https://userdonghu.tistory.com/entry/NCP-%EC%84%9C%EB%B2%84-%ED%8F%AC%ED%8A%B8-%EC%97%B4%EC%96%B4%EC%84%9C-Django-%EC%98%AC%EB%A6%AC%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;s&gt;상황 : 운영중인 서버에 포트를 열어서 다른 버전의 Django를 runserver로 올리고 운영중인 서버에는 영향이 없게 하고싶었다. (비추) (이렇게 하면 안됨)&lt;/s&gt;&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;&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;운영중인 서버와 DB를 분리해야하기 때문에 새로운 Database를 만들어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용중인 NCP의 Cloud DB for MySQL 서비스에는 DB root 계정이 존재하지않아서 콘솔에서 Database를 생성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 DB 선택 -&amp;gt; DB 관리 &amp;rarr; DB server 상세보기 &amp;rarr; Database 생성&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 8080포트를 열어서 그 포트로 접속하면 다른 버전의 백엔드 API가 호출되게 하고싶으니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NCP Server ACG 설정에서 Inbound 규칙에 허용 포트 8080 추가.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gunicorn 연결 안하고 그냥 runserver로 돌릴거기 때문에 서버 nginx 설정에서 8080 포트로 들어오면 runserver 기본 포트인 로컬:8000번으로 프록시 설정하기.&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;/etc/nginx/conf.d 에 추가&lt;/p&gt;
&lt;pre id=&quot;code_1739670989270&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server {
listen 8080;
server_name 주소;
server_tokens off;

location / {
    proxy_pass         &amp;lt;http://127.0.0.1:8000&amp;gt;;
    proxy_redirect     off;
    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;
    }
    
}&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;systemctl restart nginx 로 재시동&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;runserver을 유지시켜줘야하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;screen을 사용해서 runserver --noreload&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;noreload : 코드 변경을 감지해도 서버 자동 재시작 안하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl + a + d 로 screen을 나와서 screen -ls 로 확인. screen -r '세션명' 으로 다시 접속가능&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Load Balancer에서 8080포트로 오는 연결을 막아놨었다.&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;NCP console -&amp;gt; Load Balancer에서 해당 서버 8080포트로 보내는 Target Group 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Load Balancer 리스너 설정에서 8080 포트 추가, Target Group 에 새로 만든 8080 Target Group 추가.&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;&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;Django settings.py 에 CSRF_TRUSTED_ORIGINS와 ALLOW HOST 에 URL:8080 포트추가하는거 잊지 않기.&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 해당 서버 8080포트로 접속을 했을때 정상적으로 다른 버전의 Django 페이지로 연결 된다.&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;</description>
      <category>AWS</category>
      <category>NCP</category>
      <category>포트</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/104</guid>
      <comments>https://userdonghu.tistory.com/entry/NCP-%EC%84%9C%EB%B2%84-%ED%8F%AC%ED%8A%B8-%EC%97%B4%EC%96%B4%EC%84%9C-Django-%EC%98%AC%EB%A6%AC%EA%B8%B0#entry104comment</comments>
      <pubDate>Sun, 16 Feb 2025 11:05:17 +0900</pubDate>
    </item>
    <item>
      <title>Django apscheduler SQLAlchemy Connection timed out 오류</title>
      <link>https://userdonghu.tistory.com/entry/Django-apscheduler-SQLAlchemy-Connection-timed-out-%EC%98%A4%EB%A5%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Django 서버에서 스케쥴링을 할 일이 있어서 SQLAlchemy 라이브러리를 통해 사용중인 MySQL DB에 job을 저장해서 scheduler를 사용하고있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739360229966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from django.conf import settings

class SchedulerManager:
    _instance = None

    @classmethod
    def get_scheduler(cls):
        if cls._instance is None:
            db_settings = settings.DATABASES['default']
            db_url = f&quot;mysql+pymysql://{db_settings['USER']}:{db_settings['PASSWORD']}@{db_settings['HOST']}:{db_settings['PORT']}/{db_settings['NAME']}&quot;
            jobstores = {
                'default': SQLAlchemyJobStore(url=db_url)
            }
            cls._instance = BackgroundScheduler(jobstores=jobstores, timezone=&quot;Asia/Seoul&quot;)
            cls._instance.start()
        return cls._instance&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scheduler.py 파일을 만들어서 이런식으로 Django setting파일에서 설정해둔 DB 정보를 가져와서 jobstores설정을 해줬는데, jobstores설정을 안해줬을때 서버를 끄거나 재시동하면 기존에 스케쥴링 해둔 task &amp;amp; job들이 모두 없어지는거에 비해서 설정을 해두면 DB에 저장을 해둬서 재시동해도 재시간이되면 동작을 하고, DB에 접속해서 쿼리문으로 앞으로 실행될 예정인 작업들도 볼수있어서 좋았다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그런데 분명 테스트를 할때는 잘 실행되던 작업들이 밤만 되면 오류가 나서 실행이 안되는 문제가 발생했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 작업을 스케쥴링 해둔 함수들에 변수로 들어가는 인스턴스가 문제를 일으키는줄 알았는데, 로그 파일에 오류를 확인해보니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, &quot;MySQL server has gone away (TimeoutError(110, 'Connection timed out'))&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 에러가 떠있었다.&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;분명 MySQL에 잘 연결돼서 쿼리문으로 예정된 작업까지 확인했는데 이게 무슨 오류지..? 하고 생각했었는데 알고보니 MySQL 서버가 긴 시간동안 사용되지 않아서 연결이 끊어진것이었다.&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;b&gt;첫번째는 MySQL 설정의 my.cnf 파일에서 wait_timeout과 interactive_timeout 이 몇초로 설정되어있는지를 확인해야한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739360861518&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[mysqld]
wait_timeout = 28800
interactive_timeout = 28800&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;&lt;b&gt;두번째는 Scheduler의 SQLAlchemy 설정에서 pool_recycle, pool_pre_ping을 수정하는것이다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739361081390&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from django.conf import settings

class SchedulerManager:
    _instance = None

    @classmethod 
    def get_scheduler(cls):
        if cls._instance is None:
            db_settings = settings.DATABASES['default']
            db_url = (
                f&quot;mysql+pymysql://{db_settings['USER']}:{db_settings['PASSWORD']}&quot;
                f&quot;@{db_settings['HOST']}:{db_settings['PORT']}/{db_settings['NAME']}&quot;
                &quot;?charset=utf8mb4&quot;
            )

            jobstores = {
                'default': SQLAlchemyJobStore(
                    url=db_url,
                    engine_options={
                        'pool_size': 20, # 기본적으로 유지할 DB 갯수
                        'max_overflow': 10, # pool_size를 넘어서는 요청이 왔을때 추가로 허용하는 최대 연결 갯수
                        'pool_timeout': 60, # 사용 가능한 연결이 없을때 최대 60초 대기. 이 시간 지나면 Timeout에러
                        'pool_recycle': 3600, # 오래된 연결을 재설정하는 시간(초). 1시간마다 재연결
                        'pool_pre_ping': True, # 쿼리 실행전 연결이 유효한지 검사
                    }
                )
            }

            cls._instance = BackgroundScheduler(
                jobstores=jobstores, 
                timezone=&quot;Asia/Seoul&quot;,
                job_defaults={
                    'coalesce': True, # Job이 여러 번 스킵된 경우, 마지막 한 번만 실행할지 여부
                    'max_instances': 3, # 동시에 실행할수있는 Job 갯수
                    'misfire_grace_time': 60 # Job이 실행시간보다 늦게 실행될때, 허용할 최대 지연시간. 60초 지나면 실행 안하고 건너뜀.
                }
            )
            cls._instance.start()&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;이렇게 여러 설정들을 추가해주면 오류없이 더 쾌적하게 Django에서 스케쥴러를 사용할수있다.&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;</description>
      <category>Django</category>
      <category>apscheduler</category>
      <category>Django</category>
      <category>MySQL</category>
      <category>SQLAlchemy</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/103</guid>
      <comments>https://userdonghu.tistory.com/entry/Django-apscheduler-SQLAlchemy-Connection-timed-out-%EC%98%A4%EB%A5%98#entry103comment</comments>
      <pubDate>Wed, 12 Feb 2025 21:03:11 +0900</pubDate>
    </item>
    <item>
      <title>Django collectstatic S3 파일 업로드 안되는 오류 (Django static파일 S3 연결하기)</title>
      <link>https://userdonghu.tistory.com/entry/Django-collectstatic-S3-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%95%88%EB%90%98%EB%8A%94-%EC%98%A4%EB%A5%98-Django-static%ED%8C%8C%EC%9D%BC-S3-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버 배포를 할때 static파일들을 AWS S3에 보관을 하고싶거나 해야만 할때 (zappa로 배포) Django는 boto3와 django-storages를 사용한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경에서 설치&lt;/p&gt;
&lt;pre id=&quot;code_1735553764863&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install boto3 django-storages&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;S3 버킷을 생성하고 적절하게 정책 부여 후(정책은 연결하고 해도 됨) AWS키 받아서 환경변수 설정&lt;/p&gt;
&lt;pre id=&quot;code_1735553831703&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AWS_ACCESS_KEY_ID='' # 발급받은 키
AWS_SECRET_ACCESS_KEY='' # 발급받은 키
AWS_STORAGE_BUCKET_NAME='' # 내가 만든 버킷 이름
AWS_S3_REGION_NAME='' # 버킷 지역&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;settings.py에 환경변수 등록해주고 STATIC 설정&lt;/p&gt;
&lt;pre id=&quot;code_1735554328527&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com' # S3 커스텀 도메인 설정

STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/' # 정적 파일 저장될 url 설정
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' # django 프로젝트 기본 파일 저장소를 S3를 사용하겠다
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' # boto3 SDK로 정적 파일은 S3를 사용하겠다

STATIC_ROOT = BASE_DIR / 'staticfiles' # 정적 파일을 모았다가 S3로 업로드 할 위치 설정

INSTALLED_APPS = [
     ...
    'storages', # 추가
     ...
]&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;collectstatic으로 정적파일 업로드&lt;/p&gt;
&lt;pre id=&quot;code_1735554468621&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py collectstatic&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;S3 버킷에 정적파일 제대로 업로드 됐는지 확인&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 S3 연결이 되어야하는데, STATIC_ROOT에 정적파일을 모으기만 하고 S3 버킷에는 계속 파일 업로드가 안되는 문제가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 다른 프로젝트에서 정상작동하는데 왜 안되는거지 하면서 온갖 쌩쑈를 다 하면서 문제점을 찾다가 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 Django 버전을 최신 버전을 사용중이었다..&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;Django 4.2 버전 이후로는 settings.py 쓰는 법이 달라진다&lt;/p&gt;
&lt;pre id=&quot;code_1735555024762&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# 얘네 둘 대신에 아래 처럼 써야함

STORAGES = {
    'default': {
        'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
    },
    'staticfiles': {
        'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
    },
}&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;수정하고 다시 collectstatic&lt;/p&gt;
&lt;pre id=&quot;code_1735555089596&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py collectstatic&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;하니까 귀신같이 S3 버킷에 정적파일이 정상적으로 업로드 되었다.&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;</description>
      <category>Django</category>
      <category>aws</category>
      <category>collectstatic</category>
      <category>Django</category>
      <category>s3</category>
      <category>zappa</category>
      <category>정적파일</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/102</guid>
      <comments>https://userdonghu.tistory.com/entry/Django-collectstatic-S3-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%95%88%EB%90%98%EB%8A%94-%EC%98%A4%EB%A5%98-Django-static%ED%8C%8C%EC%9D%BC-S3-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0#entry102comment</comments>
      <pubDate>Mon, 30 Dec 2024 19:40:42 +0900</pubDate>
    </item>
    <item>
      <title>Zappa로 AWS Lambda를 사용해서 Django 서버리스 배포하기</title>
      <link>https://userdonghu.tistory.com/entry/Zappa%EB%A1%9C-AWS-Lambda%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-Django-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Lambda 서비스를 이용하면 로드 밸런싱, 오토 스케일링등을 크게 신경 안쓰고 쉽게 서버를 배포할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 키 발급&lt;/p&gt;
&lt;pre class=&quot;python&quot; style=&quot;background-color: #f7f7f7; color: #4d4d4c; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;export AWS_ACCESS_KEY_ID='new_access_key_id' # 현재 셀의 환경변수 설정
export AWS_SECRET_ACCESS_KEY='new_secret_access_key_id' # 현재 셀의 환경변수 설정&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;가상환경(venv)에서 zappa 설치&lt;/p&gt;
&lt;pre id=&quot;code_1735552050834&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install zappa&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;zappa 초기 설정&lt;/p&gt;
&lt;pre id=&quot;code_1735552332655&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zappa init

# zappa 환경 이름 설정 (기본 dev)

# lambda 함수와 관련된 파일들을 관리할 zappa S3 버킷 이름 설정 (기본 랜덤값, 기본 해도 상관없음)

# Django settings.py의 경로 설정 (Django에서 쓸 settings.py 경로 입력 ex)myproject.settings)

# 글로벌적 서비스를 위해 모든 사용 가능한 리전에서 배포할건지 설정 (N 추천)&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;만들어진 zappa_settings.json 수정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws_region이랑 서버에서 사용할 env key값 넣기&lt;/p&gt;
&lt;pre id=&quot;code_1735552798591&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;dev&quot;: {
        &quot;django_settings&quot;: &quot;myproject.settings&quot;,
        &quot;aws_region&quot;: &quot;ap-northeast-2&quot;, # 배포할 리전 꼭 설정
        &quot;exclude&quot;: [
            &quot;boto3&quot;,
            &quot;dateutil&quot;,
            &quot;botocore&quot;,
            &quot;s3transfer&quot;,
            &quot;concurrent&quot;
        ],
        &quot;profile_name&quot;: null,
        &quot;project_name&quot;: &quot;myproject&quot;,
        &quot;runtime&quot;: &quot;python3.12&quot;,
        &quot;s3_bucket&quot;: &quot;zappa-asdfasdf&quot;,
        &quot;environment_variables&quot;: { # env key는 이렇게 넣음
            &quot;SECRET_KEY&quot;: &quot;&quot;,
            &quot;AWS_ACCESS_KEY_ID&quot;: &quot;&quot;,
            &quot;AWS_SECRET_ACCESS_KEY&quot;: &quot;&quot;,
            &quot;AWS_STORAGE_BUCKET_NAME&quot;: &quot;&quot;,
            &quot;AWS_S3_REGION_NAME&quot;: &quot;&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;환경 변수는 settings.py에서 이런식으로 가져오면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1735553025665&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')&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;Zappa 배포&lt;/p&gt;
&lt;pre id=&quot;code_1735553120118&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zappa deploy 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;/p&gt;
&lt;pre id=&quot;code_1735553163335&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zappa update 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;/p&gt;
&lt;pre id=&quot;code_1735553189299&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zappa undeploy 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;settings.py ALLOWED_HOSTS 에 내 배포 주소 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735555406700&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALLOWED_HOSTS = ['asdfasdf.execute-api.ap-northeast-2.amazonaws.com']&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS IAM 키 &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;permission&lt;span&gt; error &lt;/span&gt;&lt;/span&gt;주의. lambda 함수 권한이 있어야 함&lt;/p&gt;</description>
      <category>Django</category>
      <category>aws</category>
      <category>Django</category>
      <category>lambda</category>
      <category>zappa</category>
      <category>배포</category>
      <category>서버리스</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/101</guid>
      <comments>https://userdonghu.tistory.com/entry/Zappa%EB%A1%9C-AWS-Lambda%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-Django-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0#entry101comment</comments>
      <pubDate>Mon, 30 Dec 2024 19:09:30 +0900</pubDate>
    </item>
    <item>
      <title>미래에서 기다릴게, &amp;lt;시간을 달리는 소녀&amp;gt;</title>
      <link>https://userdonghu.tistory.com/entry/%EB%AF%B8%EB%9E%98%EC%97%90%EC%84%9C-%EA%B8%B0%EB%8B%A4%EB%A6%B4%EA%B2%8C-%EC%8B%9C%EA%B0%84%EC%9D%84-%EB%8B%AC%EB%A6%AC%EB%8A%94-%EC%86%8C%EB%85%80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV8XuG/btsHzIWD8PM/8GW5nySi1KjK8waNJiMYC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV8XuG/btsHzIWD8PM/8GW5nySi1KjK8waNJiMYC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV8XuG/btsHzIWD8PM/8GW5nySi1KjK8waNJiMYC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV8XuG%2FbtsHzIWD8PM%2F8GW5nySi1KjK8waNJiMYC1%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;First time, Last time, Every time&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;잠시라도 같이 있음을 기뻐하고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;애처롭기까지 만한 사랑을 할 수 있음에 감사하고&lt;/span&gt;&lt;/span&gt;&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;span&gt;&lt;span&gt;주기만 하는 사랑이라 지치지 말고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;더 많이 줄 수 없음을 아파하고&lt;/span&gt;&lt;/span&gt;&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;span&gt;&lt;span&gt;남과 함께 즐거워한다고 질투하지 않고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;그의 기쁨이라 여겨 함께 기뻐할 줄 알고&lt;/span&gt;&lt;/span&gt;&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;span&gt;&lt;span&gt;깨끗한 사랑으로 오래 기억할 수 있는 나&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&quot;당신을 그렇게 사랑합니다.&quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 장면에서 키스를 하지않고 포옹을 하는것조차 청춘이구나 어울린다 잘.&lt;/p&gt;</description>
      <category>나의 일상</category>
      <category>시간을 달리는 소녀</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/100</guid>
      <comments>https://userdonghu.tistory.com/entry/%EB%AF%B8%EB%9E%98%EC%97%90%EC%84%9C-%EA%B8%B0%EB%8B%A4%EB%A6%B4%EA%B2%8C-%EC%8B%9C%EA%B0%84%EC%9D%84-%EB%8B%AC%EB%A6%AC%EB%8A%94-%EC%86%8C%EB%85%80#entry100comment</comments>
      <pubDate>Thu, 23 May 2024 01:15:12 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;멀끔한 나&amp;quot;의 23SS 우영미 코튼 백로고 셔츠</title>
      <link>https://userdonghu.tistory.com/entry/%EB%A9%80%EB%81%94%ED%95%9C-%EB%82%98%EC%9D%98-23SS-%EC%9A%B0%EC%98%81%EB%AF%B8-%EC%BD%94%ED%8A%BC-%EB%B0%B1%EB%A1%9C%EA%B3%A0-%EC%85%94%EC%B8%A0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN11cr/btsEu7moykH/i6d1T0BFdy7o6Tm86H4n5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN11cr/btsEu7moykH/i6d1T0BFdy7o6Tm86H4n5k/img.png&quot; data-alt=&quot;색깔 이쁘긴해&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN11cr/btsEu7moykH/i6d1T0BFdy7o6Tm86H4n5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN11cr%2FbtsEu7moykH%2Fi6d1T0BFdy7o6Tm86H4n5k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;697&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;970&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;색깔 이쁘긴해&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년이 와버리고 반오십이 되어버린 나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간만에 너무 이쁜 옷을 선물받아서 스타일 변화를 꾀한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0105.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfi4DD/btsEtm5qlwU/zdMNbo8uHfz3ezZN3Ok4lk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfi4DD/btsEtm5qlwU/zdMNbo8uHfz3ezZN3Ok4lk/img.jpg&quot; data-alt=&quot;앞에는 요런 느낌 가슴에 자수가 포인트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfi4DD/btsEtm5qlwU/zdMNbo8uHfz3ezZN3Ok4lk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfi4DD%2FbtsEtm5qlwU%2FzdMNbo8uHfz3ezZN3Ok4lk%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;955&quot; data-filename=&quot;IMG_0105.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앞에는 요런 느낌 가슴에 자수가 포인트&lt;/figcaption&gt;
&lt;/figure&gt;
&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0106.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RVj75/btsEvdfCuqJ/fFkKhO9TEPjynQAmQbDon1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RVj75/btsEvdfCuqJ/fFkKhO9TEPjynQAmQbDon1/img.jpg&quot; data-alt=&quot; 뒤에 턱 살짝 잡혀있는게 이쁜듯&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RVj75/btsEvdfCuqJ/fFkKhO9TEPjynQAmQbDon1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRVj75%2FbtsEvdfCuqJ%2FfFkKhO9TEPjynQAmQbDon1%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;988&quot; data-filename=&quot;IMG_0106.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; 뒤에 턱 살짝 잡혀있는게 이쁜듯&lt;/figcaption&gt;
&lt;/figure&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0107.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHhzfN/btsEysQnr9P/D0knpXUkoBrKmsZBMMkum0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHhzfN/btsEysQnr9P/D0knpXUkoBrKmsZBMMkum0/img.jpg&quot; data-alt=&quot;50사이즈가 105라는데 워낙 오버해서 그거보다 좀 더 큰듯?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHhzfN/btsEysQnr9P/D0knpXUkoBrKmsZBMMkum0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHhzfN%2FbtsEysQnr9P%2FD0knpXUkoBrKmsZBMMkum0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;562&quot; data-filename=&quot;IMG_0107.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;50사이즈가 105라는데 워낙 오버해서 그거보다 좀 더 큰듯?&lt;/figcaption&gt;
&lt;/figure&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0109.jpeg&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhXZdv/btsEyaWHFeO/kj2bdkmECFUKMXUH37AzC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhXZdv/btsEyaWHFeO/kj2bdkmECFUKMXUH37AzC0/img.jpg&quot; data-alt=&quot;요런 너낌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhXZdv/btsEyaWHFeO/kj2bdkmECFUKMXUH37AzC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhXZdv%2FbtsEyaWHFeO%2Fkj2bdkmECFUKMXUH37AzC0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;1011&quot; data-filename=&quot;IMG_0109.jpeg&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요런 너낌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>나의 일상</category>
      <category>셔츠</category>
      <category>우영미</category>
      <category>코튼</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/99</guid>
      <comments>https://userdonghu.tistory.com/entry/%EB%A9%80%EB%81%94%ED%95%9C-%EB%82%98%EC%9D%98-23SS-%EC%9A%B0%EC%98%81%EB%AF%B8-%EC%BD%94%ED%8A%BC-%EB%B0%B1%EB%A1%9C%EA%B3%A0-%EC%85%94%EC%B8%A0#entry99comment</comments>
      <pubDate>Tue, 6 Feb 2024 22:48:25 +0900</pubDate>
    </item>
    <item>
      <title>Django 프로젝트(3) -   School Talks</title>
      <link>https://userdonghu.tistory.com/entry/Django-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82-%F0%9F%93%96-School-Talks</link>
      <description>&lt;h1&gt;&lt;a href=&quot;https://github.com/EstSoftOrmi3FinalProject&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/EstSoftOrmi3FinalProject&lt;/a&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1704262340295&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;EstSoftOrmi3FinalProject&quot; data-og-description=&quot;EstSoftOrmi3FinalProject has 2 repositories available. Follow their code on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/EstSoftOrmi3FinalProject&quot; data-og-url=&quot;https://github.com/EstSoftOrmi3FinalProject&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/50OGP/hyUXWnLwbz/PhkoC64VatkboFMRsk1J2k/img.png?width=136&amp;amp;height=136&amp;amp;face=0_0_136_136&quot;&gt;&lt;a href=&quot;https://github.com/EstSoftOrmi3FinalProject&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/EstSoftOrmi3FinalProject&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/50OGP/hyUXWnLwbz/PhkoC64VatkboFMRsk1J2k/img.png?width=136&amp;amp;height=136&amp;amp;face=0_0_136_136');&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;EstSoftOrmi3FinalProject&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;EstSoftOrmi3FinalProject has 2 repositories available. Follow their code on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1&gt; [School Talks] DRF를 활용한 입시정보 커뮤니티 서비스&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/5fe3d797-5b4d-42e3-bca7-49baef1ffeaf&quot; alt=&quot;logo&quot; /&gt;&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 목표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고등학생들의 입시정보 및 생활정보 공유 서비스&lt;/li&gt;
&lt;li&gt;대입에 대한 입시정보를 찾고, 일상생활을 공유하며 공감대를 형성하는 서비스&lt;/li&gt;
&lt;li&gt;공부하다 지친 학생들이 편히 찾을 수 있는 커뮤니티&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입, 로그인, 프로필 기능&lt;/li&gt;
&lt;li&gt;커뮤니티 게시판 기능(입시게시판, 자유게시판 2개)&lt;/li&gt;
&lt;li&gt;AI 티칭 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선택 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실시간 익명 채팅 기능&lt;/li&gt;
&lt;li&gt;문의 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 팀 구성&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;김정원&lt;/th&gt;
&lt;th&gt;김동후&lt;/th&gt;
&lt;th&gt;김찬양&lt;/th&gt;
&lt;th&gt;황진경&lt;/th&gt;
&lt;th&gt;김창수&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/997263e3-618a-4c3c-b9bf-1c4f319bb64a&quot; width=&quot;150%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/d2fd4777-ff32-4187-b31c-162463a1745f&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/76a07dc7-63d1-4106-8653-797474e3b6f5&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/75780140/d6ca16e7-71d7-43ef-91b0-ac2768fc6eb6&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/7d0593c2-7ec4-4715-8c6b-b08e57db5d33&quot; width=&quot;70%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;- Study, Qna, Chat BE &amp;amp; FE&lt;br /&gt;- Accounts FE 연결&lt;br /&gt;- 전체 프론트 효율 개선&lt;br /&gt;- 배포 및 CI/CD 진행&lt;br /&gt;- 문서작업&lt;/td&gt;
&lt;td&gt;- AIchat 메인 담당 BE &amp;amp; FE&lt;br /&gt;- 문서작업&lt;/td&gt;
&lt;td&gt;- Post 메인 담당 BE &amp;amp; FE&lt;br /&gt;- 전체 프론트 코드 효율 개선&lt;br /&gt;- 문서작업&lt;/td&gt;
&lt;td&gt;- Chat, AIChat 서브: 구현방법조사 및 FE수정&lt;br /&gt;- 문서작업&lt;/td&gt;
&lt;td&gt;- Accounts 메인 담당 BE&lt;br /&gt;- 문서작업&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.4 플로우차트&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/bcaa29f8-27d8-493d-b413-ce281b53d6e3&quot; alt=&quot;플로우차트&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨2. 요구사항 명세와 기능 명세&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/0ebcbaef-bd88-43d7-9237-6c52331ebe03&quot; alt=&quot;001&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 요구사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원 관련 기능&lt;/li&gt;
&lt;li&gt;기능 최소 3가지 이상 구현 (회원 기능 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;선택 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;필수 결과물
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 구조(ERD)&lt;/li&gt;
&lt;li&gt;API 명세서(마크업, 노션, swagger&amp;hellip; 등)&lt;/li&gt;
&lt;li&gt;발표 자료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;평가 지표
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기술성: 마이크로식과 CBV의 적절한 사용, Django 라이브러리들의 적절한 사용&lt;/li&gt;
&lt;li&gt;DB설계: 데이터베이스 설계, DB 복잡도, 적절성에 따라 구현&lt;/li&gt;
&lt;li&gt;배포: nginx, gunicorn, django 등 연계하여 배포&lt;/li&gt;
&lt;li&gt;설계와 구현: 설계와 구현 복잡도(요구사항 작성, 와이어프레임 등 기간 내 설계한 요소들이 모두 구현이 되어 있는지 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 3. 개발 환경 및 배포 URL&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 개발 환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FE:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/HTML5-E34F26.svg?style=for-the-badge&amp;amp;logo=html5&amp;amp;logoColor=white&quot; alt=&quot;HTML5&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/CSS3-1572B6.svg?style=for-the-badge&amp;amp;logo=css3&amp;amp;logoColor=white&quot; alt=&quot;CSS3&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/JavaScript-F7DF1E.svg?style=for-the-badge&amp;amp;logo=javascript&amp;amp;logoColor=black&quot; alt=&quot;JavaScript&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;BE:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3776AB.svg?style=for-the-badge&amp;amp;logo=python&amp;amp;logoColor=white&quot; alt=&quot;Python&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/Django-092E20.svg?style=for-the-badge&amp;amp;logo=django&amp;amp;logoColor=white&quot; alt=&quot;Django&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Deployment:&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/GitHub-100000.svg?style=for-the-badge&amp;amp;logo=github&amp;amp;logoColor=white&quot; alt=&quot;GitHub&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://aws.amazon.com/lightsail/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/AWS-Lightsail-FF9900.svg?style=for-the-badge&amp;amp;logo=amazon-aws&quot; alt=&quot;AWS Lightsail&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://ubuntu.com/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Ubuntu-E95420.svg?style=for-the-badge&amp;amp;logo=ubuntu&amp;amp;logoColor=white&quot; alt=&quot;Ubuntu&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://gunicorn.org/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Gunicorn-green.svg?style=for-the-badge&amp;amp;logo=gunicorn&quot; alt=&quot;Gunicorn&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://nginx.org/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Nginx-blue.svg?style=for-the-badge&amp;amp;logo=nginx&amp;amp;logoColor=white&quot; alt=&quot;Nginx&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.sqlite.org/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/DB-SQLite-003B57.svg?style=for-the-badge&amp;amp;logo=sqlite&quot; alt=&quot;DB SQLite&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/Netlify-00C7B7.svg?style=for-the-badge&amp;amp;logo=netlify&amp;amp;logoColor=white&quot; alt=&quot;Netlify&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 배포 URL&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BE : &lt;a href=&quot;https://schooltalks.maxworld7070.net/&quot;&gt;https://schooltalks.maxworld7070.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FE : &lt;a href=&quot;https://schooltalks77.netlify.app/&quot;&gt;https://schooltalks77.netlify.app/&lt;/a&gt; (도메인주소 : &lt;a href=&quot;https://englishmax.xyz&quot;&gt;https://englishmax.xyz&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;aws과금으로 현재 서버 중단 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 CI/CD 구축 배포&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BE Github Action 자동 배포&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/31dbf6c9-b795-42a8-b4d3-e75dc1d1dd6d&quot; alt=&quot;스크린샷 2023-12-25 오후 6 23 26&quot; width=&quot;1195&quot; /&gt;&lt;/li&gt;
&lt;li&gt;FE Netlify 자동 배포&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/50db0517-7d74-4fcc-a21a-e9993337a6df&quot; alt=&quot;스크린샷 2023-12-22 오후 11 18 21&quot; width=&quot;1048&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 4. URL 설계 &amp;amp; API 명세 및 사용 외부라이브러리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 URL 설계 &amp;amp; API 명세&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스웨거 문서(API 명세) : API 기능과 사용 방법을 명확히 전달 하기 위한 Swegger drf-yasg 사용하여 문서화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://schooltalks.maxworld7070.net/schema/swagger-ui/&quot;&gt;https://schooltalks.maxworld7070.net/schema/swagger-ui/&lt;/a&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;엔드포인트&lt;/th&gt;
&lt;th&gt;HTTP 메서드&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;앱&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/accounts/signup/&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;새로운 User를 만들어주는 역할 (회원가입)&lt;/td&gt;
&lt;td&gt;Accounts&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/accounts/token/&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;인증 토큰 생성 (로그인)&lt;/td&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/accounts/token/refresh/&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;토큰 갱신&lt;/td&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/accounts/token/verify/&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;토큰 유효성 검사&lt;/td&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/accounts/user/&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;특정 사용자의 프로필 조회 (프로필 보기)&lt;/td&gt;
&lt;td&gt;User Profile&lt;/td&gt;
&lt;td&gt;   &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/aichat/&lt;/td&gt;
&lt;td&gt;GET, POST, DELETE&lt;/td&gt;
&lt;td&gt;AI와 채팅 (채팅 보기, 채팅 보내기, 전체 채팅 삭제)&lt;/td&gt;
&lt;td&gt;AI Chat&lt;/td&gt;
&lt;td&gt;   &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/chat/api/chat-messages/&lt;/td&gt;
&lt;td&gt;GET, POST&lt;/td&gt;
&lt;td&gt;채팅 메시지 조회 및 생성&lt;/td&gt;
&lt;td&gt;Chat&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/post/&lt;/td&gt;
&lt;td&gt;GET, POST&lt;/td&gt;
&lt;td&gt;글 목록 조회 및 글 작성&lt;/td&gt;
&lt;td&gt;Posts&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/post/{id}/&lt;/td&gt;
&lt;td&gt;GET, PUT, PATCH, DELETE&lt;/td&gt;
&lt;td&gt;특정 글 조회, 수정, 삭제&lt;/td&gt;
&lt;td&gt;Posts&lt;/td&gt;
&lt;td&gt;   &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/post/{post_id}/comment/{id}/&lt;/td&gt;
&lt;td&gt;DELETE, PUT, PATCH&lt;/td&gt;
&lt;td&gt;특정 댓글 삭제, 수정&lt;/td&gt;
&lt;td&gt;Comments&lt;/td&gt;
&lt;td&gt;   &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/qna/inquiry/&lt;/td&gt;
&lt;td&gt;GET, POST&lt;/td&gt;
&lt;td&gt;문의 사항 조회 및 생성&lt;/td&gt;
&lt;td&gt;QnA&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/qna/inquiry/{id}/&lt;/td&gt;
&lt;td&gt;GET, PUT, PATCH, DELETE&lt;/td&gt;
&lt;td&gt;특정 문의 사항 조회, 수정, 삭제&lt;/td&gt;
&lt;td&gt;QnA&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/study/{id}/&lt;/td&gt;
&lt;td&gt;GET, DELETE, PUT&lt;/td&gt;
&lt;td&gt;특정 게시물 조회, 삭제, 수정&lt;/td&gt;
&lt;td&gt;Study&lt;/td&gt;
&lt;td&gt;   &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  : 로그인 권한&lt;/li&gt;
&lt;li&gt;  : 작성자 권한&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 사용 외부라이브러리&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;라이브러리&lt;/th&gt;
&lt;th&gt;버전&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;djangorestframework&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.14.0&lt;/td&gt;
&lt;td&gt;RESTful API 구축을 위한 강력한 툴킷을 Django에 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;djangorestframework-simplejwt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.3.1&lt;/td&gt;
&lt;td&gt;JWT 인증을 Django Rest Framework에 쉽게 통합할 수 있게 해주는 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;drf-spectacular&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.26.5&lt;/td&gt;
&lt;td&gt;DRF 스키마 생성 및 문서화를 위한 확장으로, API 문서화 작업을 간소화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;channels[daphne]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~4.0.0&lt;/td&gt;
&lt;td&gt;비동기 웹소켓 처리 및 실시간 기능 구현의 지원을 위한 Django 확장으로, Daphne 서버를 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;redis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;!=4.4.0&lt;/td&gt;
&lt;td&gt;Redis 서버와의 통신을 위한 클라이언트 라이브러리, Channels의 백엔드로도 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;faker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21.0.0&lt;/td&gt;
&lt;td&gt;목업 데이터 생성, 데이터베이스의 부하 테스트 등 다양한 상황에서 유용하게 사용 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;python-dotenv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.0.0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; 파일에서 환경 변수를 로드하여 Django 설정에 사용할 수 있게 해주는 도구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.5.0&lt;/td&gt;
&lt;td&gt;OpenAI API를 사용하기 위한 공식 클라이언트 라이브러리, GPT-3 등의 AI 모델을 활용할 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 5. 프로젝트 구조와 개발 일정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 프로젝트 구조&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;# SCHOOLTALKS-BACKEND
├──   .github
├──   accounts
├──   aichat
├──   chat
├──   media
├──   post
├──   project
├──   qna
├──   study
├──   venv
├──   .env
├──   .gitignore
├──   db.sqlite3
├──   manage.py
├──   README.md
└──   requirements.txt

# SCHOOLTALKS-FRONTEND
├──   .vscode
├──   assets
│   ├──   css
│   ├──   fonts
│   ├──   images
│   ├──   js
│   └──   mail
├──   chat
├──   gpt
├──   post
├──   study
├──   header.html
├──   index.html
├──   license.txt
├──   login.html
├──   profile.html
├──   qna.html
├──   README.md
└──   register.html
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;7개의 앱과 1개의 프로젝트로 구성&lt;/li&gt;
&lt;li&gt;assets와 html 폴더로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 개발 일정(WBS)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/fd1869f3-60b9-457e-a813-e5c256d7f90d&quot; alt=&quot;4545443&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발일정은 GitHub Projects Tool로 작성&lt;/li&gt;
&lt;li&gt;배포일정은 앞당겨 여유있게 문서작업을 진행&lt;/li&gt;
&lt;li&gt;발표전날은 여유있게 프로젝트 복기와 코드 팀스터디를 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 6. 데이터베이스 모델링(ERD)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/95cf6f8a-b668-41a3-991f-27901be9983e&quot; alt=&quot;모델&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습 게시물 테이블:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다대일 관계: 하나의 게시물은 여러 댓글(Study Comment)과 좋아요(Study Like)를 받을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일반 게시물 테이블
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다대일 관계: 하나의 게시물은 여러 댓글(Comment)과 좋아요(Like)를 받을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AI 대화 테이블(Conversation): AI 와의 대화 내용. 사용자의 입력(Prompt)와 AI의 답변(Response)를 저장.&lt;/li&gt;
&lt;li&gt;채팅 테이블(Chat): 채팅방 정보 저장. 각 채팅방은 여러 사용자가 참여할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 7. Architecture&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/eb7111aa-c47a-4482-a789-4ac310aa2d9a&quot; alt=&quot;SchooltalksSystem drawio (1)&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프론트엔드: HTML, CSS, JavaScript, Bootstrap으로 구성되며, Netlify를 통해 배포&lt;/li&gt;
&lt;li&gt;백엔드: Python과 Django를 사용하고, SQLite 데이터베이스, Gunicorn WSGI, Nginx 웹 서버와 함께 Ubuntu 시스템에 AWS Lightsail로 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⌨8. 기술성&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/4d428d8d-53e5-42f9-b07a-edc99c029a6d&quot; alt=&quot;슬라이드29&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;용어 정리&lt;/li&gt;
&lt;li&gt;마이크로식 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어 시스템을 작은 독립적인 서비스로 분해하는 접근 방식&lt;/li&gt;
&lt;li&gt;분산 아키텍쳐로 구성&lt;/li&gt;
&lt;li&gt;API 또는 메시징 시스템을 통해 상호통신&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모놀로그식 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 모듈 및 단일 코드 베이스로 구축하는 접근방식&lt;/li&gt;
&lt;li&gt;모든 기능이 하나로 통합되어 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 9. 와이어프레임 / UI&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9.1 와이어프레임&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/f38583cf-038a-4153-b228-aab783940390&quot; alt=&quot;슬라이드1&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;카카오 오븐을 통한 와이어프레임 제작&lt;/li&gt;
&lt;li&gt;게시판, 챗, 로그인 등 메인 기능에 대한 개략적 프레임 작성&lt;/li&gt;
&lt;li&gt;부트스트랩 활용 (출처 : GrayGrids)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9.2 화면 설계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Accounts 앱
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;메인&lt;/td&gt;
&lt;td&gt;로그인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/b3007dc7-d276-40a5-89a7-0662bc3e2280&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/bf097af1-0277-43bd-9425-ea781f4aeac0&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;회원가입&lt;/td&gt;
&lt;td&gt;프로필&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/82467666-0739-4709-9395-e06a3d0bd13f&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/888c39fb-723a-42f6-a178-8cab78f7ee16&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;Post 앱
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;자유게시판&lt;/td&gt;
&lt;td&gt;게시글 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;img/post/list.png&quot; width=&quot;2000px&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;img/post/create.png&quot; width=&quot;2000px&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;게시글 상세페이지&lt;/td&gt;
&lt;td&gt;게시글 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;img/post/read.png&quot; width=&quot;2000px&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;img/post/update.png&quot; width=&quot;2000px&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI Chat 앱
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;시작&lt;/td&gt;
&lt;td&gt;질문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/0161ac0b-0329-4e59-81c9-326711efcf43&quot; width=&quot;2000px&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/b223d6ce-8bf9-4e02-ae3d-b5fd9aba59dc&quot; width=&quot;2000px&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Study 앱
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;입시 정보 게시판&lt;/td&gt;
&lt;td&gt;게시글 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/1946aab9-6946-4271-bb0f-7228b4100ef4&quot; width=&quot;95%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/3f43d550-0e89-4ff7-b276-2e9b1f5e631b&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;게시글 상세페이지&lt;/td&gt;
&lt;td&gt;게시글 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/6c217202-2cc9-4a67-a0ca-4f3cd61ab010&quot; width=&quot;90%&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/75887bd4-8cf9-45ba-bb64-47d431c3bd7e&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;Chat 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;익명실시간챗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/75780140/27e35373-584b-40b9-88ef-399ffbfa8370&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;QNA 앱
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/0b8472a5-983e-47e0-93f0-7fe412a6e450&quot; width=&quot;100%&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 10. 메인 기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  메인 페이지&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/75780140/482c3dfc-84a7-44f5-98b3-5d610137ce63&quot; alt=&quot;Main&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스로 이동하는 아이콘이 반응할 수 있도록 함&lt;/li&gt;
&lt;li&gt;사용자가 바로 이동할 수 있도록 네비게이션바와 배너를 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회원 관리 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  회원가입&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/a6d8f1f7-9e10-419b-bec5-3af6da6d155a&quot; alt=&quot;회원가입&quot; width=&quot;1000&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입 성공시 성공 메시지 생성&lt;/li&gt;
&lt;li&gt;로그인 버튼 클릭 후 로그인 화면으로 이동 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  로그인&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/2c542d9f-7a3b-4419-b7e5-d9eca7d23817&quot; alt=&quot;회원가입&quot; width=&quot;1000&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 성공시 이전 페이지로 리다이렉트 됨&lt;/li&gt;
&lt;li&gt;상단에 로그인 버튼이 사라지고 로그아웃 버튼이 생성됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  로그아웃&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/17e25d06-f4f5-4dfe-9af4-9c77ff9efa62&quot; alt=&quot;회원가입&quot; width=&quot;1000&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그아웃 성공시 로그아웃 버튼이 사라지고 로그인 버튼이 생성됨&lt;/li&gt;
&lt;li&gt;다시 로그인 버튼을 클릭하여 로그인 하거나 회원가입을 할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  프로필&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/142385973/dff99a62-c698-4d98-a06d-13608364a752&quot; alt=&quot;회원가입&quot; width=&quot;1000&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원 가입시 입력 정보를 프로필로 불러옴&lt;/li&gt;
&lt;li&gt;회원 가입시 이미지 정보도 불러 오기 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자유게시판 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  글 작성&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/f1d0247f-0120-4c43-b03a-8acf5dae85b9&quot; alt=&quot;글 작성&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자유게시판에 새로운 글을 작성&lt;/li&gt;
&lt;li&gt;제목과 내용으로 구성되어있으며, 따로 제한없이 자유롭게 글을 쓸 수 있음&lt;/li&gt;
&lt;li&gt;로그인한 사용자만 작성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  글 보기&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/6bc385a2-ece4-4251-bbbd-5b0292929465&quot; alt=&quot;글 보기&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;글 목록이 있음&lt;/li&gt;
&lt;li&gt;글 제목을 클릭하면 상세보기로 들어가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  글 수정&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/06c59547-a8f7-4998-8011-e80ed43a26a9&quot; alt=&quot;글 수정&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자유게시판 글을 수정함&lt;/li&gt;
&lt;li&gt;기존에 작성햇던 내용이 미리 들어가있음&lt;/li&gt;
&lt;li&gt;작성자만 수정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  글 삭제&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/6a395840-3545-4af6-9b6d-284a1c6c697a&quot; alt=&quot;글 삭제&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자유게시판 글을 삭제함&lt;/li&gt;
&lt;li&gt;작성자만 삭제 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  글 검색&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/0d2372df-abf2-4ca6-9e54-06d8b52782e7&quot; alt=&quot;글 검색&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제목, 내용, 제목+내용, 글쓴이 정보로 검색이 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  좋아요&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/cc6158ac-979e-4e28-ba3f-3a811ff387a3&quot; alt=&quot;글 좋아요&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회색일떄 좋아요을 클릭하면 빨갛게 활성화되고 카운트가 1 오름&lt;/li&gt;
&lt;li&gt;빨간색일떄 좋아요를 클릭하면 회색으로 비활성화되고 카운트가 1 내려감&lt;/li&gt;
&lt;li&gt;사용자마다 각기 다른 좋아요 정보가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  댓글 작성&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/b1799d8e-f967-4580-a382-752ce7645c2b&quot; alt=&quot;댓글 작성&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인한 사용자는 글 상세보기에서 최하단에 댓글 작성이 있음&lt;/li&gt;
&lt;li&gt;댓글내용을 적고 작성하면 등록됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  댓글 수정&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/f711be8c-b7b1-4494-9bd9-513d446e266b&quot; alt=&quot;댓글 수정&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;댓글 내용을 수정함&lt;/li&gt;
&lt;li&gt;기존 댓글 내용이 미리 들어가있음&lt;/li&gt;
&lt;li&gt;작성자만 수정 가능함.&lt;/li&gt;
&lt;li&gt;수정시 한번 확인 알람이 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  댓글 삭제&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/8cbda8d7-c42a-4b79-aed4-bb1e9f75c32e&quot; alt=&quot;댓글 삭제&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;댓글을 삭제함&lt;/li&gt;
&lt;li&gt;댓글 작성자만 삭제 가능함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;AI 채팅 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  초기 화면&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/1da60557-15fb-49da-8b87-6b58389c2d1d&quot; alt=&quot;초기 화면&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 채팅을 시작할때, 이전 채팅 내역이 없다면 채팅 예시를 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  채팅&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/ba2ac8c6-b593-4af3-8229-82e48f04a10e&quot; alt=&quot;채팅&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질문을 입력하고 보내기 버튼을 누르면, AI의 말풍선이 생기고 잠시후 답변을 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  채팅 저장&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/856b280a-4602-4079-bbff-34d1e65fc643&quot; alt=&quot;채팅 저장&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저의 질문과 AI의 답변은 DB에 저장됨&lt;/li&gt;
&lt;li&gt;다른 화면에서 AI 채팅방으로 다시 왔을때 이전 채팅 내역을 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  채팅 삭제&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/137512514/b596081b-1ed7-4eef-9d79-87af28b1ac80&quot; alt=&quot;채팅 삭제&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삭제 버튼을 누르면 이전 채팅 내역이 모두 삭제되고 새로운 채팅을 시작함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입시정보게시판 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:pushpin: 게시판 리스트 검색 및 페이지네이션&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/4a2df1ee-49a0-4495-9de2-364c74824d42&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모지형식의 게시판 구현&lt;/li&gt;
&lt;li&gt;페이지네이션 이전 다음 버튼으로 구현&lt;/li&gt;
&lt;li&gt;리스트 검색 기능 제목, 작성자, 내용에 따라 검색 가능&lt;/li&gt;
&lt;li&gt;핵심 주요 정보 게시판이기 때문에 로그인을 해야 CRUD 가능&lt;/li&gt;
&lt;li&gt;기존에 작성한 내용을 미리 볼 수 있음&lt;/li&gt;
&lt;li&gt;더보기를 클릭하면 상세 글로 들어감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:pushpin: 게시글 CRUD&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/71594662-9e8f-4b1a-beac-53d87f9758b5&quot; alt=&quot;2&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시글에는 작성자, 작성일, 조회수, 좋아요, 내용, 이미지, 첨부파일이 포함됨&lt;/li&gt;
&lt;li&gt;게시글은 작성자만 수정, 삭제 가능&lt;/li&gt;
&lt;li&gt;해당 페이지에 접속 시 +1로 View가 올라감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:pushpin: 좋아요 및 댓글 CRUD&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/ea55f917-07b3-4a4f-aaa1-89654a5f1dd6&quot; alt=&quot;3&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋아요 기능 구현
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회색일때 좋아요을 클릭하면 빨갛게 활성화되고 카운트가 1 오름&lt;/li&gt;
&lt;li&gt;빨간색일때 좋아요를 클릭하면 회색으로 비활성화되고 카운트가 1 내려감&lt;/li&gt;
&lt;li&gt;사용자마다 각기 다른 좋아요 정보가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;댓글 CRUD 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인한 사용자는 글 상세보기에서 최하단에 댓글 작성이 있음&lt;/li&gt;
&lt;li&gt;댓글 내용을 작성 수정, 삭제 가능&lt;/li&gt;
&lt;li&gt;작성자만 수정 삭제 가능함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로그인 및 사용자 권한이 있어야 CRUD 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 11. 추가기능&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문의 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Q&amp;amp;A&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/75780140/891c1d87-b649-4ee1-8804-11bda3bfac04&quot; alt=&quot;QNA&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자주 찾는 질문은 배너를 활용하여 게시함&lt;/li&gt;
&lt;li&gt;메일, 카테고리, 문의내용을 통해 문의할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실시간 익명 채팅 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  익명 채팅방&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/75780140/ea10c85f-b623-406a-a556-6d887619df0c&quot; alt=&quot;Chat&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;익명으로 채팅에 참여할 수 있음&lt;/li&gt;
&lt;li&gt;로그인하지 않아도 채팅에 참여할 수 있음&lt;/li&gt;
&lt;li&gt;하단에는 쿠팡파트너스 광고를 넣어 실제 커뮤니티와 비슷하게 수익성도 고려 해 보았음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 12. 에러와 에러 해결&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;김정원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚙ 에러명 : 403 Forbidden&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제점 : 웹 서버(Nginx)를 사용하는 웹 애플리케이션에서 403 Forbidden 오류 발생.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 원인 : Nginx 서버가 기본적으로 www-data 사용자로 실행되어 웹 애플리케이션의 파일에 접근할 때 권한 부족으로 인한 오류.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결 방법 :
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;Nginx의 실행 사용자 변경
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/nginx/nginx.conf 파일을 열어서 Nginx의 실행 사용자를 ubuntu로 변경.&lt;br /&gt;user ubuntu;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/media 디렉토리의 소유자와 그룹을 ubuntu로 변경.&lt;br /&gt;sudo chown -R ubuntu:ubuntu /media&lt;br /&gt;cat /etc/nginx/nginx.conf | grep user&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx 구성 파일 테스트&lt;br /&gt;변경된 구성 파일의 유효성을 검사.&lt;br /&gt;sudo nginx -t&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx 재시작&lt;br /&gt;변경 사항이 적용되도록 Nginx 서버를 재시작.&lt;br /&gt;sudo systemctl restart nginx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 정보&lt;br /&gt;sudo systemctl status nginx 명령으로 Nginx 서버 상태 확인.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;⚙ 에러명 : 404 에러 Not Found


- 문제 원인 :
교안에 따라 location / 위치 설정을 하였지만, 새로운 프로젝트와 url 주소가 맞지 않아서 그냥 location 부분을 '/'로 비워둠
proxy가 url 위치를 찾지 못해서 생기는 문제 


- 해결 방법 :
nginx의 default 값이 잘못 설정되어 다음과 같이 수정하여 해결
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;    location / {
    include proxy_params;
    proxy_pass http://unix:/tmp/gunicorn.sock;
   }&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;
⚙ 에러명 : 400에러 Bad Request


- 문제: 배포 이후 페이지는 찾지만, 보안 관련설정이 올바르지 않아서 뜨는 오류


- 해결 방법:
- ALLOWED_HOST를 임의로 비워둬서 발생했던 오류
- DEBUG = False로 보안상 두기


⚙ 에러명 : 500에러 Internal Server Error


- 문제: 배포 이후 앱 몇 개에서 500에러가 발생


![image](https://github.com/maxkim77/CI/assets/141907655/f4299f8c-7758-46be-ae2e-13840b49f229)


![image](https://github.com/maxkim77/CI/assets/141907655/d9e2bbb6-b0b2-4ec0-a425-250b3e80147e)


- 문제 원인
- ls -a로 폴더 권한을 확인하던 중 정상 작동되던 앱은 migration이 있는데 오류가 뜨는 앱은 migration이 없었음
- migrations이 안되었던 상황 gitignore에 migration을 추가해서 이후에 추가 된 앱들이 migration이 없는 체로 배포가됨


- 해결 방법


![image](https://github.com/maxkim77/CI/assets/141907655/d80c78a2-6ff6-48aa-82ec-bcd437968e00)


- mgirations 폴더를 다시 올리고 makemigrations 및 migrate
- 500 에러는 migrate가 안될 가능성이 있음
- 배포를 위해선 git에 miration 폴더 및 init 도 추가해야 함



⚙  에러명 : NameError

-   문제:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NameError: name 'Post' is not defined SystemCheckError: System check identified some issues: ERRORS: post.Comment.author: (fields.E304) Reverse accessor 'User.comments' for 'post.Comment.author' clashes with reverse accessor for 'study.StudyComment.author'. HINT: Add or change a related_name argument to the definition for 'post.Comment.author' or 'study.StudyComment.author'. post.Comment.author: (fields.E305) Reverse query name for 'post.Comment.author' clashes with reverse query name for 'study.StudyComment.author'. HINT: Add or change a related_name argument to the definition for 'post.Comment.author' or 'study.StudyComment.author'. study.StudyComment.author: (fields.E304) Reverse accessor 'User.comments' for 'study.StudyComment.author' clashes with reverse accessor for 'post.Comment.author'. HINT: Add or change a related_name argument to the definition for 'study.StudyComment.author' or 'post.Comment.author'. study.StudyComment.author: (fields.E305) Reverse query name for 'study.StudyComment.author' clashes with reverse query name for 'post.Comment.author'. HINT: Add or change a related_name argument to the definition for 'study.StudyComment.author' or 'post.Comment.author'.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;
-   문제 원인:

    -   Django 모델에서 역 관계(accessor)와 역 질의(reverse query) 이름이 충돌하는 경우 발생
    -   study 게시판과 post 게시판이 합쳐지면서 비슷한 이름끼리 충돌하여 생긴문제


-   해결 방법:

각 모델의 역 관계 이름을 명시적으로 설정하여 충돌을 해결가능. related_name 매개변수를 사용하여 각 모델의 관계 이름을 고유하게 지정

-   예제:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python Copy code class Comment(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_comments') # 다른 필드들...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class StudyComment(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='study_comments') # 다른 필드들... 변경 후:&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;위와 같이 related_name을 설정한 후, makemigrations 및 migrate 명령을 실행하여 데이터베이스를 업데이트 -&amp;gt; 역 관계 이름 충돌 문제가 해결


### 김찬양
⚙  에러명 : NOT NULL constraint failed

-   문제:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_user.grade&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;
-   문제 원인:

    -   accounts의 커스텀 사용자 앱에서 학년에 작은 양수만 저장시키기 위해 PositiveSmallIntegerField로 작성한것이 문제
    -   해당 필드는 기본적으로 null값을 허용하지 않는것으로 보임

-   해결 방법:

    - 처음엔 기본값을 주려고 했다가, REQUIRED_FIELDS를 사용해 입력받도록 함
    - 기본값을 주기 or null을 허용 or REQUIRED_FIELDS를 사용해 지정해야함

-   예제:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grade = models.PositiveSmallIntegerField(verbose_name=&quot;학년&quot;, null=True)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grade = models.PositiveSmallIntegerField(verbose_name=&quot;학년&quot;, default=1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REQUIRED_FIELDS = [grade]&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;위와 같이 null = True를 해도 에러가 나지 않는다고 판단했기에 추가하여 에러를 해결


### 김동후
⚙  에러명 : OPEN AI Version Issue

-   문제:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can run 'openai migrate' to automatically upgrade your codebase to use the 1.0.0 interface.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alternatively, you can pin your installation to the old version, e.g. &lt;code&gt;pip install openai==0.28&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;
-   문제 원인:

    -   Openai Api를 사용해서 인공지능 답변을 받아오기위한 views.py의 코드가 openai 버전에 맞지 않음
    -   Openai 라이브러리의 버전이 1.~ 버전으로 변경됨에 따라서 인공지능 모델을 생성하는 코드가 변경됨

-   해결 방법:

    - Openai 버전을 강제로 낮춰서 쓰거나 코드를 수정해야 해야 함

-   문제 원인:

    - Openai 버전을 0.27로 낮추어서 사용했으나 pip 버전에 따라서 0.27이 설치되지 않는 문제가 추가로 발생

-   해결 방법:

    - openai migrate를 통해서 모델을 생성 후, OPEN-AI-KEY 가져오는 코드를 최대한 최신 버전의 라이브러리에서 사용해도 문제가 없도록 수정

##  13. 개발하며 알게 된 점 및 느낀점

### 김정원
-  가장 실무와 가까운 협업 프로젝트를 하는 건 처음이고, 특히 컨벤션 맞추는 부분이 어색하고 어려웠지만, 같이 문제를 해결하는 과정이 재미가 있었음.
-  또한 협업을 할 때 깃 환경을 어떻게 활용하는지 배우면서 팀 프로젝트를 진행할 수 있었기 때문에 매우 도움이 되었던 프로젝트임.
-  아직 부족한 점은 많지만 지난 DRF 개인 프로젝트에 비해 프론트서버랑 통신에서 오류잡는 시간이 단축되었고, 또한 CI/CD 구축과 서버 배포 후 오류를 잡는 과정에서 더욱 성장할 수 있었음.

### 김창수
-  개인 프로젝트를 진행할 때와는 다르게 팀 프로젝트는 서로간의 커뮤니케이션이 많이 중요하다는 걸 느낄 수 있었음.
-  부족하여 이해하지 못했던 부분들을 계속 작업을 하면서 조금 더 이해할 수 있었고, 협업하는데 Git이 많은 도움이 된다는걸 느껴 앞으로 더 다양하게 활용하는 방법을 공부할 예정.
-  개인 프로젝트와는 다르게 팀 프로젝트여서 팀원들에게 많은 도움을 받아 혼자 구현하지 못했던 부분들을 해낼 수 있었고 많은 공부가 되었음.

### 김찬양
-  첫 chatGPT DRF 프로젝트에서 토큰에 과하게 시간을 투자해서 아쉬웠던 점이 많앗는데, 이번에는 여럿이서 개발하게 되어 시간이 넉넉했기 때문에 나름 만족할 수 있었던 프로젝트가 되었음.
-  장고에서 꽤 많은 라이브러리를 봤다고 생각했는데 그것보다 더 다양한 라이브러리와 편의 기능이 있다는 것에 매우 놀랐음.
-  협업에 대해 팀원에 대한 참여율이나 컨벤션 등 걱정이 꽤 많았는데, 생각보다 부드럽게 흘러가 좋은 결과물을 낸 것 같음
-  코드를 짜다보니 욕심이 점점 생겨서 차근차근 이것저것 테스트해 보면서 사용하지 못했던 기능 등을 이후에 더 개발해볼 생각.

### 황진경
-  1:1 채팅 개발 경험이 있어 프로젝트 시작과 동시에 채팅을 맡아 팀 프로젝트를 진행하였다. 그러나 첫 DRF 프로젝트였고 오류가 많아 프로젝트 기간 내 완수할 수 없다고 판단되어 포기한 것이 너무 아쉬웠음.
   부족한 점이  많으니 노력해야겠다고 생각함.
-  맡은 임무를 완벽히 수행하지 못해 대부분 서브로 프로젝트를 진행. 그러나 옆에서 팀원들이 개발하는 과정이나 배포하는 과정을 보며 공부할 수 있었고 실제 서비스가 운용이 되니 신기 함.
-  협업을 진행하여 Git을 더 숙달할 수 있는 시간이었음.

### 김동후
-  Git을 실무와 비슷하게 사용하는 법을 익히고 이를 통해서 배움이 늘어가는 것이 눈에 뚜렷하게 보여서 뿌듯했고, 처음 하는 팀 프로젝트이다 보니까 많이 미숙하고 부족한 부분도 있었지만 결과물을 보니 만족스러움
-  Django에 조금 더 익숙해지고 특히 담당한 Open ai API를 사용하는 부분이나 채팅 관련 부분에서 많은 공부가 되어서 단순히 결과물을 위한 프로젝트가 아니라 성장하는 경험이 된거같아 아주 의미 있는 시간이었음.

##  14. 마무리 및 시연 영상


https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/assets/141907655/37a0c6d0-990f-4a94-8265-602bcc16af41

##  15. 참고 사항(로컬환경 실습)

- 깃폴더를 다운로드 후 아래와 같이 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python -m venv venv&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Window: venv/Scripts/activate&lt;br /&gt;Mac, Linux: source venv/bin/activate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.env 파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SECRET_KEY=YOUR_KEY&lt;br /&gt;DEBUG=True&lt;br /&gt;OPENAI_API_KEY=YOUR_KEY&lt;br /&gt;REDIS_HOST=YOUR_HOST&lt;br /&gt;REDIS_PORT=YOUR_PORT&lt;br /&gt;REDIS_PASSWORD=YOUR_PWD&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;
- 테스트용 더미데이터를 만드는 명령어를 추가
- faker 라이브러리를 이용해서, 랜덤한 가상의 데이터가 들어가서 보다 다양한 경우의수에 대한 테스트가 용이
- 현재 가상 사용자(비밀번호는 해싱되지 않은 데이터이므로 변경 필요)와 가상 자유게시판 글이 기능중에 있음

1. 가상 유저 생성방법
    - 기본값은 2명 생성이고, 뒤에 --total (생성할 갯수)를 붙여주면 그만큼 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python manage.py seed-users&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;
2. 가상 자유게시판 데이터 생성방법
    - 이것 역시 기본값은 2명 생성이고, 뒤에 --total (생성할 갯수)를 붙여주면 그만큼 생성
    - 사용자는 현재 가입된 사용자중 한명이 랜덤하게 선택되어 들어 감
```shell
python manage.py fake-post&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 16. 기타&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/wiki/School-Talks-:-Git-Emoji-%EC%BB%A8%EB%B2%A4%EC%85%98&quot;&gt;School Talks 깃이모지 컨벤션&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/EstSoftOrmi3FinalProject/SchoolTalks-Backend/wiki/GitHub-Branch-Convention&quot;&gt;School Talks 깃브랜치 컨벤션&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://drive.google.com/file/d/1h38GegycqC5suVipqaHLt6Q-2R7Op0oj/view?usp=sharing&quot;&gt;School Talks 프레젠테이션&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://docs.google.com/document/d/1jC32aTWhoP1_qiBY3m7ljmuS3aLhRLX2kAGPHFBE1UI/edit?usp=sharing&quot;&gt;School Talks 코드 스터디&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#school-talks-drf%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9E%85%EC%8B%9C%EC%A0%95%EB%B3%B4-%EC%BB%A4%EB%AE%A4%EB%8B%88%ED%8B%B0-%EC%84%9C%EB%B9%84%EC%8A%A4&quot;&gt;맨 위로&lt;/a&gt;&lt;/p&gt;</description>
      <category>Django/DRF</category>
      <category>Django</category>
      <category>drf</category>
      <category>프로젝트</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/98</guid>
      <comments>https://userdonghu.tistory.com/entry/Django-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82-%F0%9F%93%96-School-Talks#entry98comment</comments>
      <pubDate>Wed, 3 Jan 2024 15:12:53 +0900</pubDate>
    </item>
    <item>
      <title>Git &amp;amp; GitHub 심화</title>
      <link>https://userdonghu.tistory.com/entry/Git-GitHub-%EC%8B%AC%ED%99%94</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Branch&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git의 기본 브랜치 : master&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub에서의 기본 브랜치 : main&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;b&gt;브랜치 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch mybranch&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;b&gt;메인에서 파생되는 브랜치 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch mybranch main&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;b&gt;브랜치 이동/변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout mybranch&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;b&gt;코드 이후로 원격 저장소에 mybranch라는 브랜치를 만들어 push&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git push --set-upstream origin mybranch&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;b&gt;브랜치 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git switch mybranch&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;b&gt;브랜치 새로 만들어서 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git switch -c mybranch&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;b&gt;파일을  최근 커밋으로 되돌리기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git restore README.md&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;b&gt;최근 커밋 전으로 되돌리기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout -- README.m&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;b&gt;스테이지에 올린 파일 빼기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git restore --staged README.md&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git reset HEAD README.md&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;b&gt;브랜치 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch -D &amp;lt;브랜치명&amp;gt;&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;b&gt;삭제된 브랜치 복구&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git reflog로 커밋 해시값 가져오고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout -b &amp;lt;브랜치명&amp;gt; &amp;lt;커밋 해시값&amp;gt;&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;b&gt;merge(합병)하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout main&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git merge mybranch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git push origin main&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Fork&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github 레파지토리에 들어가서 Fork를 클릭후 내 레파지토리 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clone -&amp;gt; commit -&amp;gt; push 후 pull request 보내기&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그 외 명령어&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;amend&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 기능을 만들고 커밋을 할 때 누락한 파일을 추가하고 싶을 때 사용&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;b&gt;최신 커밋에 스테이징한 내용 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git commit --amend&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;stash&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 브랜치에서 아직 커밋 하지 못한 파일들이 있는데, 다른 브랜치로 넘어가야 하는 경우 현재 브랜치의 변경사항을 잠시 보관할 때 사용&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;Tracked : git 저장소에서 관리하는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UnTracked : git 저장소에서 관리하지 않는 파일&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;b&gt;수행중인 README.md 파일 작업을 임시 저장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git add README.md&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git stash&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;b&gt;다른 브랜치에서 작업하고 돌아온 후, 가장 최근에 임시 저장한 내용 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git stash pop&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;b&gt;UnTracked 파일을 stash하려면 --all 붙여줘야함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git stash --all&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;reset&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 커밋으로 브랜치를 되돌릴 때 사용&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;git reset --[mode] &amp;lt;커밋 id&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hard : 지정한 커밋 이력 이후 변경사항을 다 버리고 지정한 커밋으로 리셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mixed : 지정한 커밋 이력 이후 변경 사항은 로컬에 unstaged 상태로 유지하고 커밋은 리셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;soft : 지정한 커밋 이력 이후 변경 사항은 로컬에 stage 상태로 유지하고 커밋은 리셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;revert&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정한 커밋의 내용으로 새로운 커밋 생성(히스토리 보존)&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;git revert &amp;lt;커밋 id&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;cherry-pick&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러가지 커밋 중에 내가 원하는 커밋만 가져와서 현재 브랜치에 붙이기&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;git cherry-pick &amp;lt;commit-id&amp;gt;&lt;/p&gt;</description>
      <category>Git</category>
      <category>ammend</category>
      <category>Branch</category>
      <category>fork</category>
      <category>git</category>
      <category>github</category>
      <category>Merge</category>
      <category>Reset</category>
      <category>stash</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/96</guid>
      <comments>https://userdonghu.tistory.com/entry/Git-GitHub-%EC%8B%AC%ED%99%94#entry96comment</comments>
      <pubDate>Wed, 6 Dec 2023 19:00:11 +0900</pubDate>
    </item>
    <item>
      <title>Django 프로젝트(2) -   AI 지식인 서비스</title>
      <link>https://userdonghu.tistory.com/entry/Django-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82-%F0%9F%8E%93-AI-%EC%A7%80%EC%8B%9D%EC%9D%B8-%EC%84%9C%EB%B9%84%EC%8A%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/UserDongHu/ChatGPT_DRF_Project&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701857811776&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - UserDongHu/ChatGPT_DRF_Project&quot; data-og-description=&quot;Contribute to UserDongHu/ChatGPT_DRF_Project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project&quot; data-og-url=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c3QHGZ/hyUIrBaR2K/ckMfe1ha2KCnFHTVPmjBK0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c3QHGZ/hyUIrBaR2K/ckMfe1ha2KCnFHTVPmjBK0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - UserDongHu/ChatGPT_DRF_Project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to UserDongHu/ChatGPT_DRF_Project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h1&gt;Django DRF Project -   AI 지식인 서비스&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI가 답변을 해주는 지식인 서비스 입니다.&lt;/li&gt;
&lt;li&gt;질문을 하면 ChatGPT가 답변을 해줍니다.&lt;/li&gt;
&lt;li&gt;내가 한 질문과 ChatGPT의 답변이 게시물로 생성됩니다.&lt;/li&gt;
&lt;li&gt;다른 사람들의 질문들을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&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 목표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DRF(Django REST Framework)를 이용한 REST API 구현&lt;/li&gt;
&lt;li&gt;ViewSet을 사용해서 CRUD 기능 설계&lt;/li&gt;
&lt;li&gt;Accounts(Login, Logout) 인증 방식 JWT 사용&lt;/li&gt;
&lt;li&gt;ChatGPT API 사용&lt;/li&gt;
&lt;li&gt;AWS에 서버 배포&lt;/li&gt;
&lt;li&gt;HTML + Vanilla JS로 간단한 Front-End 구현&lt;/li&gt;
&lt;li&gt;Netlify로 FE 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입 혹은 로그인 후, 글쓰기를 통해 카테고리를 선택하여 질문을 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;내가 한 질문과 ChatGPT의 답변이 게시물로 생성됩니다.&lt;/li&gt;
&lt;li&gt;메인화면에서 모든 질문들을 볼 수 있습니다.&lt;/li&gt;
&lt;li&gt;상세 게시물에서 조회수와 추천수를 확인 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;게시물에 추천을 누르거나 댓글을 작성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;내가 쓴 게시물과 댓글을 삭제할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Stacks 및 배포 URL&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 Stacks&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Enviroment&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://img.shields.io/badge/GIT-E44C30?style=for-the-badge&amp;amp;logo=git&amp;amp;logoColor=white&quot; alt=&quot;Git&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;![GitHub](https://img.shields.io/badge/GitHub-100000?style=for-the-badge&amp;amp;logo=github&amp;amp;logoColor=white)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/Visual_Studio_Code-0078D4?style=for-the-badge&amp;amp;logo=visual%20studio%20code&amp;amp;logoColor=white&quot; alt=&quot;VSC&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Development&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3776AB?style=for-the-badge&amp;amp;logo=python&amp;amp;logoColor=white&quot; alt=&quot;Python&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;![Django](https://img.shields.io/badge/Django-092E20?style=for-the-badge&amp;amp;logo=django&amp;amp;logoColor=white)



![HTML](https://img.shields.io/badge/HTML5-E34F26?style=for-the-badge&amp;amp;logo=html5&amp;amp;logoColor=white)



![JS](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&amp;amp;logo=JavaScript&amp;amp;logoColor=white)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DataBase&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://img.shields.io/badge/SQLite-07405E?style=for-the-badge&amp;amp;logo=sqlite&amp;amp;logoColor=white&quot; alt=&quot;SQLite&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 배포 URL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stupendous-elf-84bccd.netlify.app/&quot;&gt;https://stupendous-elf-84bccd.netlify.app/&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;- test ID : test
- test PW : mypw1234&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 아키텍처/URL 구조 및 플로우 차트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 아키텍처 구조&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/878a3cbf-5e6b-4412-9d7a-f16393a6e09c&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 URL 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swagger link : &lt;a href=&quot;http://52.78.33.155:8000/api/schema/swagger-ui/&quot;&gt;http://52.78.33.155:8000/api/schema/swagger-ui/&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;accounts&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Views Class&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;accounts&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;'/accounts/join/'&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;회원가입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accounts&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;'/accounts/login/'&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;로그인 / JWT발급&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accounts&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;'/accounts/logout/'&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;로그아웃 / JWT삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accounts&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;'/accounts/profile/'&lt;/td&gt;
&lt;td&gt;ProfileViewSet&lt;/td&gt;
&lt;td&gt;내 프로필&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;blog&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Views Class&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;'/blog/posts/'&lt;/td&gt;
&lt;td&gt;PostViewSet&lt;/td&gt;
&lt;td&gt;게시글 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;'/blog/posts/'&lt;/td&gt;
&lt;td&gt;PostViewSet&lt;/td&gt;
&lt;td&gt;게시글 생성 / ChatGPT API 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/'&lt;/td&gt;
&lt;td&gt;PostViewSet&lt;/td&gt;
&lt;td&gt;게시글 상세보기 / 게시글 조회수 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/'&lt;/td&gt;
&lt;td&gt;PostViewSet&lt;/td&gt;
&lt;td&gt;게시글 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/'&lt;/td&gt;
&lt;td&gt;PostViewSet&lt;/td&gt;
&lt;td&gt;게시글 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/like/'&lt;/td&gt;
&lt;td&gt;PostViewSet&lt;/td&gt;
&lt;td&gt;게시글 좋아요 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/comments/'&lt;/td&gt;
&lt;td&gt;CommentViewSet&lt;/td&gt;
&lt;td&gt;게시물의 댓글 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/comments/'&lt;/td&gt;
&lt;td&gt;CommentViewSet&lt;/td&gt;
&lt;td&gt;게시물의 댓글 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/comments/{comment_id}/'&lt;/td&gt;
&lt;td&gt;CommentViewSet&lt;/td&gt;
&lt;td&gt;게시물의 특정 댓글 보기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/comments/{comment_id}/'&lt;/td&gt;
&lt;td&gt;CommentViewSet&lt;/td&gt;
&lt;td&gt;게시물의 특정 댓글 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blog&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;'/blog/posts/{post_id}/comments/{comment_id}/'&lt;/td&gt;
&lt;td&gt;CommentViewSet&lt;/td&gt;
&lt;td&gt;게시물의 특정 댓글 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 플로우 차트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인페이지&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/76257eef-e2e7-4479-932f-b0ecc0069876&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 상세보기&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/0b677c41-e2fb-42a2-9cdd-a1dfa0e1e3df&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 디렉토리 구조와 개발일정(WBS)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 디렉토리 구조&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;├──  FE
│   ├──  js
│   │   ├──  accounts
│   │   │   ├──  accounts-join.js
│   │   │   ├──  accounts-login.js
│   │   │   ├──  accounts-logout.js
│   │   │   └──  accounts-profile.js
│   │   └──  blog
│   │       ├──  blog-create.js
│   │       └──  blog-main.js
│   └──  templates
│       ├──  accounts
│       │   ├──  join.html
│       │   ├──  login.html
│       │   ├──  logout.html
│       │   └──  profile.html
│       └──  blog
│           ├──  create.html
│           └──  index.html
├──  README.md
├──  accounts
│   ├──  __init__.py
│   ├──  __pycache__
│   ├──  admin.py
│   ├──  apps.py
│   ├──  managers.py
│   ├──  migrations
│   ├──  models.py
│   ├──  serializers.py
│   ├──  tests.py
│   ├──  urls.py
│   └──  views.py
├──  blog
│   ├──  __init__.py
│   ├──  __pycache__
│   ├──  admin.py
│   ├──  apps.py
│   ├──  migrations
│   │   ├──  __init__.py
│   │   └──  __pycache__
│   ├──  models.py
│   ├──  permissions.py
│   ├──  serializers.py
│   ├──  tests.py
│   ├──  urls.py
│   └──  views.py
├──  db.sqlite3
├──  manage.py
├──  media
├──  project
│   ├──  __init__.py
│   ├──  __pycache__
│   ├──  asgi.py
│   ├──  settings.py
│   ├──  urls.py
│   └──  wsgi.py
├──  requirements.txt
└──  static&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 개발일정(WBS)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;gantt
    title ChatGPT DRF Project
    dateFormat  YYYY-MM-DD
    section 기획
        레포지토리 생성 :2023-11-21, 1d
        주제 선정 :2023-11-21, 2d
        WBS :2023-11-22, 1d
        화면 설계 :2023-11-22, 1d
        플로우 차트 설계 :2023-11-22, 2d
        URL 설계 :2023-11-23, 1d
        Model 설계 :2023-11-23, 2d

    section BE 구현
        로그인/로그아웃 :2023-11-23, 1d
        회원가입 :2023-11-23, 1d
        프로필 페이지 : 2023-11-23, 1d
        JWT 인증 :2023-11-23, 2d
        게시물 상세/조회수 :2023-11-24, 1d
        게시물 CRUD :2023-11-24, 1d
        댓글 CRUD :2023-11-24, 1d
        ChatGPT API 연결 :2023-11-24, 1d
        AWS EC2 배포 :2023-11-24, 2d
        Swagger :2023-11-25, 1d

    section FE 구현
        로그인/로그아웃 :2023-11-27, 1d
        회원가입 :2023-11-27, 1d
        프로필 페이지 : 2023-11-27, 1d
        JWT 인증 :2023-11-27, 2d
        게시물 상세 :2023-11-28, 1d
        게시글 CRUD :2023-11-28, 1d
        댓글 CRUD :2023-11-28, 2d
        Netlify 배포 :2023-11-29, 1d&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. ERD&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/3294cfc8-c674-4b8f-b1e8-db1a2f60c584&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. UI&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인/로그아웃&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/4eac7954-6b70-47f0-8abc-bee470fb0740&quot; alt=&quot;로그인로그아웃&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;회원가입&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/f3664588-04a7-4640-9d6d-46d5d27219b7&quot; alt=&quot;회원가입&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;프로필&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/9a3fd915-9e89-4ade-b390-38849252891a&quot; alt=&quot;프로필&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;글쓰기&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/c9ad1032-c951-40e6-885e-b4e45208d16d&quot; alt=&quot;글쓰기&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;좋아요/댓글작성&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/cbff4d10-f2f8-40d7-870e-6678b99de5d2&quot; alt=&quot;좋아요 댓글작성&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;댓글 삭제&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/254ea181-9789-4682-bd09-93d235a53d42&quot; alt=&quot;댓글삭제&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;게시글 삭제&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;img src=&quot;https://github.com/UserDongHu/ChatGPT_DRF_Project/assets/137512514/8ceb1c6c-a3e7-4a7c-960c-405fb9b62e2d&quot; alt=&quot;게시글 삭제&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 발생한 문제와 문제 해결&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제1 : 적절하지않은 Mixin사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황 : 현재 접속한 유저의 프로필 정보를 나타내는 ProfileViewSet을 만들기위해 모델 인스턴스를 리턴해 주는 믹스인 RetrieveModelMixin을 사용했으나 '/accounts/profile/'에서 바로 모델 인스턴스를 리턴해주지 않고 '/accounts/profile/1' 처럼 User모델의 pk값으로 모델 인스턴스를 선택해서 반환을 해주었다.&lt;/li&gt;
&lt;li&gt;원인 : RetrieveModelMixin은 개별 항목 조회를 구현할 때 주로 사용되기 떄문에 현재 접속한 유저의 정보만을 불러오려는 나의 목적에는 알맞지 않는다.&lt;/li&gt;
&lt;li&gt;해결 : Queryset을 리스팅하는 믹스인 ListModelMixin을 사용해서 현재 접속된 유저의 모델만을 리턴하도록 하여 해결했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제2 : 이벤트 리스너의 중첩&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황 : 메인 화면에서 게시글 상세보기를 한번 들어갔다가 다시 메인화면을 나왔다가 할 때 마다 게시물 상세보기에서 댓글 작성 버튼을 눌렀을 때 같은 내용으로 생성되는 댓글의 수가 늘어난다.&lt;/li&gt;
&lt;li&gt;원인 : HTML파일에서 미리 만들어둔 댓글 작성 버튼을 style속성으로 숨겨두기만 했었는데, 게시글 상세보기를 클릭했을 때 댓글 작성 버튼에 이벤트를 추가하도록 JS코드로 구현해서 이벤트 리스너가 계속 중첩이 되는것이었다.&lt;/li&gt;
&lt;li&gt;해결 : 댓글 작성 버튼을 HTML파일에서 미리 만들어두는것이 아닌, 게시글 상세보기를 클릭했을 때 동적으로 생성되도록 JS코드를 수정해서 이벤트 리스너의 중첩을 막았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제3 : HTTPS -&amp;gt; HTTP 통신&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황 : 프론트 배포를 마친 후, 테스트를 하는데 서버에 request를 보내지 못하고 fetch에러가 계속 뜨는 문제가 생겼다.&lt;/li&gt;
&lt;li&gt;원인 : Netlify를 통해서 프론트 엔드 배포를 하였는데 Netlify는 HTTPS를 사용하는 반면 AWS로 배포한 서버는 SSL인증을 받지 않아서 HTTP를 사용해서 HTTPS와 HTTP의 통신을 금지하는 웹 보안 문제로 인해 프론트와 서버간 통신에 어려움이 있었다.&lt;/li&gt;
&lt;li&gt;해결 : 서버를 HTTPS로 바꿀수도 있었지만, Netlify 문서를 찾아보니 리다이렉트 경로를 설정해서 모든 요청을 CDN서버에서 바로 프록시 시키는 방식으로 HTTP서버와 통신을 가능하게 하는 방법이 있어서 이를 통해 해결했다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Django/DRF</category>
      <category>API</category>
      <category>ChatGPT</category>
      <category>Django</category>
      <category>drf</category>
      <category>프로젝트</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/95</guid>
      <comments>https://userdonghu.tistory.com/entry/Django-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82-%F0%9F%8E%93-AI-%EC%A7%80%EC%8B%9D%EC%9D%B8-%EC%84%9C%EB%B9%84%EC%8A%A4#entry95comment</comments>
      <pubDate>Sat, 2 Dec 2023 21:45:09 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;간지나는 나&amp;quot;의 스톤아일랜드 23FW 크링클랩스 롱패딩</title>
      <link>https://userdonghu.tistory.com/entry/%EC%8A%A4%ED%86%A4%EC%95%84%EC%9D%BC%EB%9E%9C%EB%93%9C-23FW-%ED%81%AC%EB%A7%81%ED%81%B4%EB%9E%A9%EC%8A%A4-%EB%A1%B1%ED%8C%A8%EB%94%A9-%EC%82%BC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 겨울에는 꼭 간@지 쌈@뽕 나는 롱패딩 하나 사야지 하고 블랙 프라이데이 해외 직구 정보를 며칠을 봤는데도 맘에 드는게 하나 없어서 그냥 크림에서 샀다. 크림이 제일 쌈 그냥..&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;21, 22, 23FW 시즌들 롱패딩이 생긴게 다 달라서 조금 고민했는데 21은 이쁘긴한데 너무 예전 모델 같고.. 22는 주머니가 치렁치렁이라 안이쁨 23은 너무 무난함..&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;어차피 새거 사서 오래 입을건데 최신 모델 사자해서 23FW를 골랐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 17FW 같은 옛날 모델이 이쁜듯 근데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_8363.jpeg&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;1484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2pdSB/btsBeTc5d4V/PhYKKpsDp0LBTpFOwfmCe1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2pdSB/btsBeTc5d4V/PhYKKpsDp0LBTpFOwfmCe1/img.jpg&quot; data-alt=&quot;크림 수수료 장난하냐? 죽을래?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2pdSB/btsBeTc5d4V/PhYKKpsDp0LBTpFOwfmCe1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2pdSB%2FbtsBeTc5d4V%2FPhYKKpsDp0LBTpFOwfmCe1%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;833&quot; data-filename=&quot;IMG_8363.jpeg&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;1484&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크림 수수료 장난하냐? 죽을래?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_8389.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgGcGC/btsBbQuTc7y/rKABRmMZVP4SbQ1gR9x2iK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgGcGC/btsBbQuTc7y/rKABRmMZVP4SbQ1gR9x2iK/img.jpg&quot; data-alt=&quot;크림에서 짱 큰 박스 옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgGcGC/btsBbQuTc7y/rKABRmMZVP4SbQ1gR9x2iK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgGcGC%2FbtsBbQuTc7y%2FrKABRmMZVP4SbQ1gR9x2iK%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;668&quot; data-filename=&quot;IMG_8389.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크림에서 짱 큰 박스 옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_8390.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DeKAg/btsA9WPsgs2/K8diHOFXKQ29k3pwdIvaKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DeKAg/btsA9WPsgs2/K8diHOFXKQ29k3pwdIvaKK/img.jpg&quot; data-alt=&quot;요망한 와펜과 택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DeKAg/btsA9WPsgs2/K8diHOFXKQ29k3pwdIvaKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDeKAg%2FbtsA9WPsgs2%2FK8diHOFXKQ29k3pwdIvaKK%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;776&quot; data-filename=&quot;IMG_8390.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요망한 와펜과 택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 매장가서 한번 입어봤는데 백화점에서는 230임... 미친 가격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XL랑 XXL 고민했는데 롱패딩은 딱 맞게 입는게 이쁘대서 XL 선택함 (오버핏충 패배)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;105~108 정도 사이즈 되는듯?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_8391.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWTUIs/btsBcSeDpaI/69Iks8cMVg1srq3qQ4sLkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWTUIs/btsBcSeDpaI/69Iks8cMVg1srq3qQ4sLkk/img.jpg&quot; data-alt=&quot;옷걸이도 주네&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWTUIs/btsBcSeDpaI/69Iks8cMVg1srq3qQ4sLkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWTUIs%2FbtsBcSeDpaI%2F69Iks8cMVg1srq3qQ4sLkk%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;751&quot; data-filename=&quot;IMG_8391.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;옷걸이도 주네&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_IMG_8392.jpeg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGdwQy/btsBcbyOKsm/Bb6gtAPEwF1wk8KpewNvC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGdwQy/btsBcbyOKsm/Bb6gtAPEwF1wk8KpewNvC0/img.png&quot; data-alt=&quot;사기꾼들이 쓸까봐 서명넣음 ㅎㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGdwQy/btsBcbyOKsm/Bb6gtAPEwF1wk8KpewNvC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGdwQy%2FbtsBcbyOKsm%2FBb6gtAPEwF1wk8KpewNvC0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;797&quot; data-filename=&quot;edited_IMG_8392.jpeg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사기꾼들이 쓸까봐 서명넣음 ㅎㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_IMG_8394.jpeg&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;1726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxIpmy/btsBgLFk4Bk/FX3kR80JOfCl2UKROk8XK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxIpmy/btsBgLFk4Bk/FX3kR80JOfCl2UKROk8XK1/img.png&quot; data-alt=&quot;183/65/XL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxIpmy/btsBgLFk4Bk/FX3kR80JOfCl2UKROk8XK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxIpmy%2FbtsBgLFk4Bk%2FFX3kR80JOfCl2UKROk8XK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;801&quot; data-filename=&quot;edited_IMG_8394.jpeg&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;1726&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;183/65/XL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유행을 안타는 디자인에 유행을 안타는 색상에 유행을 안타는 브랜드(이미 인식 나락ㅋㅋ)이므로 오래오래 입을 수 있겠네요&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;누가 정장에 구두신고 걸친거를 보고 너무 멋져서 참지 못하고 사버린 스톤아일랜드 23FW 크링클랩스 롱패딩 이었읍니다.&lt;/p&gt;</description>
      <category>나의 일상</category>
      <category>23FW</category>
      <category>롱패딩</category>
      <category>쇼핑</category>
      <category>스톤아일랜드</category>
      <category>크링클랩스</category>
      <author>UserDonghu</author>
      <guid isPermaLink="true">https://userdonghu.tistory.com/94</guid>
      <comments>https://userdonghu.tistory.com/entry/%EC%8A%A4%ED%86%A4%EC%95%84%EC%9D%BC%EB%9E%9C%EB%93%9C-23FW-%ED%81%AC%EB%A7%81%ED%81%B4%EB%9E%A9%EC%8A%A4-%EB%A1%B1%ED%8C%A8%EB%94%A9-%EC%82%BC#entry94comment</comments>
      <pubDate>Fri, 1 Dec 2023 00:06:55 +0900</pubDate>
    </item>
  </channel>
</rss>