본문 바로가기
공부 및 활동/heroku, django

heroku에서 social login 연동하다 발생한 오류

by KChang 2021. 10. 11.

구글, 네이버 소셜 로그인을 구현하던 중 오류가 발생하였다.

social login구현하기 위해, 기존 디렉터리에서

1) settings

사진2사진1

urls.py

allauth

 

이와 같이 추가하고 나서

1) python manage.py migrate --settigs=settings_heroku
2) git push # 완료 후
3) heroku ps:scale web=1 # 서버 실행했을 때
이와같은

at=error code=H10 desc = "App crashed" method=GET path= "/"~ 가 나와서 여러가지 구글링 해본 결과

https://pythonq.com/so/mysql/963944

db삭제

db삭제 하라고 되어있다.

 

 

현재상황을 조금 더 구체적으로 알고싶어

python manage.py migrate --settings=settings_heroku를 실행하니

account와 socialaccount가 없다고 합니다.

그래서 migrations 디렉터리 삭제후, makemigrations 와 migrate를 했을 때

위와 똑같은 상황이 발생합니다.

발생1

 

python manage.py showmigrations을 통해 정말 socialaccount, account가 안들어간건지 확인해보니,

밑과 같이 migrate에 socialaccount와 account가 들어가 있습니다.

KChang@LAPTOP-H1595VAD MINGW64 /d/Computer_Science/School/GraduationWork/gd_backend (master)
$ python manage.py showmigrations
account
 [ ] 0001_initial
 [ ] 0002_email_max_length
admin
 [ ] 0001_initial
 [ ] 0002_logentry_remove_auto_add
 [ ] 0003_logentry_add_action_flag_choices
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length
 [ ] 0011_update_proxy_permissions
 [ ] 0012_alter_user_first_name_max_length
authtoken
 [ ] 0001_initial
 [ ] 0002_auto_20160226_1747
 [ ] 0003_tokenproxy
contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name
gdapp
 [ ] 0001_initial
sessions
 [ ] 0001_initial
sites
 [ ] 0001_initial
 [ ] 0002_alter_domain_unique
social_django
 [ ] 0001_initial (2 squashed migrations)
 [ ] 0002_add_related_name (2 squashed migrations)
 [ ] 0003_alter_email_max_length (2 squashed migrations)
 [ ] 0004_auto_20160423_0400 (2 squashed migrations)
 [ ] 0005_auto_20160727_2333 (1 squashed migrations)
 [ ] 0006_partial
 [ ] 0007_code_timestamp
 [ ] 0008_partial_timestamp
 [ ] 0009_auto_20191118_0520
 [ ] 0010_uid_db_index
socialaccount
 [ ] 0001_initial
 [ ] 0002_token_max_lengths
 [ ] 0003_extra_data_default_dict
(gd2venv)

현재 고민중인게 정말, 기존 cleardb를 삭제하고 새로 만들어야 하는건지 어떠한 오류인지 정말 찾기 힘들었다.

 

해결책

위와 같은 오류가 발생한 원인은 데이터베이스 마이그레이션에서 꼬이는 현상이 발생한 것이다.

위에서 제시 했던 https://pythonq.com/so/mysql/963944 이를 참고하여 DB를 삭제 후, 새로 생성해도 되는 해결책이 있지만 다른 방법을 사용하려고 한다.

 

1. 이번 오류는 ORM 모델로 구성해놓은 것과 매핑이 되지 않은 것 같다.

migrations이 되어있는지 먼저 확인한다.

사진2

에서 보면 settings/installed_apps에 allauth 설정들이 추가되었고 migrations이 한번은 진행됬어야 했다.

installed_apps에서 설정들이 많으면

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'gdapp',
    'social_django',
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    'rest_auth.registration',
    'corsheaders',
]

# Auth Applications
INSTALLED_APPS += [
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
]

이와 같이 분리해야한다.

 

 

기존의 usermodel에서 변경된 점이 있어 확인해보니

blank_LI

blank = True, null = True을 삽입하였지만, gdapp 하위 migrations 디렉터리에 삽입한 내용들이 기록으로 보이지 않았다.

 

현재는 blank = True, null = True가 추가된 모습이지만, 오류가 있을 당시 보이지 않았다.

blank2

 

migrations 이슈 이구나!

보통은 필드를 수정한 후, migrations 할 때 기존에 있는 migration은 그대로 두고, 다음 migration 기록을(필드 수정) 받아 새로 반영한다.

하지만, 이전까지 migrate 업데이트 할 때 migrations을 삭제 후 migrate를 하다보니 001 이니셜만 남게 되는 현상이 발생한다.

현재 상황

migrations 파일을 지우는 것은 정말 좋지 않다.

만약 지울 경우, 꼬여버리는 현상이 발생할 수 있다.

ex) 일간활성사용자 100만인 서비스일 때, 테이블 하나 사고 나면 고객 문의 부서는 문을 닫아야 한다.

 

migrations 오류가 난다? 추적을 해야한다.

보통 모델 변경되었을 때, migrations 폴더나 내용물을 지우지 않고, 그대로 migrations을 해서 변경된 부분만 migrations에 기록을 추가하면 된다.

 

migrations에 새로추가된 예시

002

실제로 django가 알아서 만들어주므로 변경된 부분만 대응해주면 된다.

이럴 경우, django에서 기존 migrations 내용을 참조해서 새로운 migrations을 생성할 것이다.

ex) migrations에 001, 002가 존재할 때

변경 점 003으로 만들고(증분생성) : python manage.py makemigrations

다음, python manage.py migrate를 할 때, (001 과 002 과 003)을 종합해서 migrations을 하게 된다.

django가 알아서 반복 작업하면서 최적 해를 찾아서 처리한다.

 

1번 결론

  • Database에 기록되어 있는 테이블 정보랑 비교해서 변경된 점만 migrations을 해준다. (현재는 db가 엉켜서 문제가 있는 상황이다.)
    • 비교할 때는 django_migrations 테이블을 보며 비교한다. (나중에 공부하기, 뇌수술을 시킬 수 있다?)
  • makemigrations 이후, migrate 하기 이전에 변경된 곳을 확인하며 비교한다.
  • 별개로, 다양하게 해보고 이것저것 하면서 메인을 하나 잡아야 한다. (분야를 선택할 때)
  • migrations을 했는데 제대로 작동하지 않아, 테이블들을 다 drop해서 다시 migrations을 시켜 해결되었다. (질문 위치)

 

2. gitmoji??

오픈소스 깃 커밋 CLI이다.

gitmoji = git + emoji 이다.

  • commit에 이모지 넣는다.
  • 넣은 이모지를 보며 어떤 작업이구나 라는 것을 알 수 있다.
  • package에 정의되어 있다.
  • gitmoji를 사용하는 사람들끼리는 표준이 있다.
  • code도 컨벤션이 있고, commit message에도 컨벤션이 있다.
  • 하나의 이모지를 사용하기 위해, 그 컨베션을 지키기 위해 쓰는 것이다.
  • 규칙성을 주어야 보는 사람도 유추하기 편하다.
  • gitmoji 쓸 때 : 이모지, 행위를 나타내는 단어, 작업내용 형식으로 사용한다.

https://github.com/carloscuesta/gitmoji

npm으로 글로벌을 설치해서 CLI로 쓰면 된다.

또한, gitmoji는 git와 같이 사용한다.

commit message에 관여한다.

git add (파일)
gitmoji -c
git push

만약, log로 gitmoji를 확인할 경우 utf8mb4 인코딩 설정을 해주어야 한다.

 

3. github PR에서

PR의 정의와 목적

PR : Pull Request

  • 서버에 업데이트 되어 있는 내용을 받아와 주세요.
  • 변경된 내용을 작업한 부분에 적용해 달라는 요청이다.
    • 개인 서버에서 개인 local 컴퓨터로 받아오는 것이 목적이라면, 누군가에게 요청할 필요 없이 pull을 하면 된다.
  • 내가 작업한 내용을 원본 저장소에서 받아가서 적용할 때 사용한다.

 

개인적으로 작업할 때

병합하다가 컨플릭이 발생할 때, 원인을 알고 싶을 때 사용하면 좋다.

pull request

base <- head : 오른쪽에 있는 브랜치를 왼쪽에 있는 브랜치로 Pull 요청을 보낸다는 뜻이다.

ex) master가 메인라인이고, 자동배포되는 브랜치일 때

현재 master에서 이슈가 발생하였다.

이것을 해결하기 위해 social-login 브랜치를 생성한 후, 작업내용을 반영한다.

이제 social-login 브랜치에서 작업된 내용을 master에 반영한다.

base : master <- compare : social-login

후, Create pull request를 한다.

이때, 컨플릭이 발생할 경우 (추가)

Conflict 발생 (Conflict 관련 다음 page)

  • 발생시, merge가 되지 않는다.

 

4. 앞으로 해야할 것

login을 구현해야한다.

현재는 naver, kakao, google snippet이 추가되었다.

naver, kakao, google 계정 등록 후 django와 연동하기

 

5. 이외

1) 작업을 할 때는 매번 branch를 만들어 작업해야한다.

  • 만들지 않고 작업하다 충돌날 경우, master에서 서로 컨플릭해결해야 해서 어렵다.
  • 한 개의 작업이 끝나면, merge 후 branch는 정리하는 게 좋다. (issue가 해결되었다는 가정하에)

2) package 같은 거를 고를 때는

  • github이나 pypi, npm 트렌드 확인하고 star 수 많은 거 골라서 쓰는게 좋다.
  • 비교군을 잡아서 구글 트렌드로 검색을 하는 방법도 있다.

3) 이슈가 터졌다.

  • 서버가 접속이 안된다.
  • DB 테이블이 터졌다.
  • blackbox인데 추척하는 경우
    • 다 뜯어봐야하는 경우도 생길 것이다.
    • log 같은 것을 잘 볼줄 알아야 한다. (시스템 로그나 같은 환경에서 테스트)
    • 대부분 HTTP access log -> 시스템 log를 찾는다.

4) DB에 반영할 때

  • 필드 정보를 바꿨는데, 기존 migration을 제거하고 다시 migration을 해서 DB에 반영하면 에러가 터진다.
  • pk키를 null로 두면 안된다.

5) 컨플릭

  • 커밋 되돌리기 했다가 다시 원래 브랜치로 가면 컨플릭이 발생한다.

6) heroku 실행하기

heroku run -a dongagd python manage.py runserver 0.0.0.0:8088 --settings=gdproject.settings_heroku

댓글