삽질기록 — 회원가입 Api 작성 (Restful API, Flask, ORM)

Youngwoo Lee
4 min readOct 6, 2020

--

시작하기 전에, 이 포스트에는 백엔드 전문가가 본다면 어색한 부분이 있을 것입니다. 백엔드 관련 포스트는 공유하고자 하는 부분도 물론 있으나, 기록이 우선이기 때문에 해당 부분을 둥글게 알려 주신다면 감사히 참고하도록 하겠습니다.

— — —

저번 포스팅에 이어서 API를 작성하려고 한다. ORM 적용 과정은 아래 포스팅에 자세하게 남겼으니, 궁금하다면 확인하길 바란다.

프론트만 해왔기 때문에 API를 만드는 과정은 생소했다. 시작하기 전에 이것저것들을 찾아보다가, 그냥 무작정 내가 원하는 것들을 적기로 했다.

  1. 파일들을 객체나 기능에 따라서 나누고 싶다.
  2. Restful API로 만들고 싶다.
  3. ORM으로 작성하고 싶다.

1번을 설명하자면, 저번 포스팅에서는 app.py에 모든 라우트가 들어가 있었다. 이렇게 해도 괜찮은데, 프로젝트가 커진다면 모든것이 섞여있기 때문에 불편해질 것 같았다.

이를 위해서 api, models, util 폴더로 나눴다.

migrations 폴더는 추후 마이그레이트를 할 때 생기는 폴더이다.

패키지로 생성하는 방법이 있는 것 같은데, 그것에 대해서 아직 잘 모르기 때문에, 우선 기본적인 디렉토리로 생성했다.

2번 Restful API는, API를 만들면서 규칙이 필요했다. 프론트엔드에서 API 통신에 사용했던 Restful API로 만들기로 했다.

Restful Api에 대해서는 아래 포스팅을 확인하길 바란다.

각각 필요한 라이브러리를 적어 보자.

  1. flask
  2. flask_restful
  3. flask_sqlalchemy
  4. configparser
  5. flask_migrate

라이브러리를 다운 받았다면, app.py를 보자.

저번 포스팅 (ORM 적용)과 비슷한 모습이다. 다른 점은, app.py 파일에 모든 라우트를 다 적어 주지 않고, initailize_routes하기만 했다.

routes 파일에는 라우팅 설정만 해 주었다.

이제 api 작성한 것을 보자.

post를 작성해 주었다. 사용자에게서 입력 받은 내용의 username으로 DB 조회 후, 사용자가 없을 경우에 새로 만들도록 하였다. (filter_by는 WHERE로 생각하면 될 듯하다.)

이게 무슨 코드지? 싶은 분들은 지난 포스팅(ORM 적용)을 확인하길 바란다.

generate_pwd가 궁금할 텐데, 이는 user 모델 클래스에 함수로 추가해 줬다.

user 모델을 확인해 보자.

bcrypt는 비밀번호를 해쉬로 변환해 주는 (?) 라이브러리다. DB에 비밀번호만 저장할 경우 보안에 위험하니, 필수로 사용하도록 하자.

generate_pwd는 사용자의 비밀번호 값을 utf-8로 인코딩하고 해쉬 값을 생성한 뒤 다시 utf-8로 디코딩 한다. 인코딩, 디코딩을 왜 했는지 기억이 안 나는데 (망할 기억력) 아마 에러가 났던 듯하다.

check_pwd는 암호화되어 저장된 해시와 입력 받은 password를 비교한다. 동일할 경우 참을 반환한다. 이는 login에 쓰일 것이다.

이제 테이블을 생성할 것이다. 터미널에 입력해 주자.

$ flask db init
$ flask db migrate
$ flask db upgrade

이유는 모르겠으나, venv (가상환경) 에서 해 주는 것이 좋다고 한다. 궁금하다면 직접 찾아보길 바란다. (원래 사람은 뻔뻔한 법)

특별한 에러가 없을 경우 정상적으로 테이블이 만들어질 것이다.

flask run 하여 flask 앱을 실행해 보자.

postman으로 users에 post를 날리면 잘 되는 것을 확인할 수 있을 것이다.

회원가입 API 작성 완료! 이제 로그인을 작성하면 된다…

(사담) 사람은 초심을 잃는 법이라고 하나, 너무 빨리 잃은 듯 하다. ㅜ 지난 주에 적으려고 했던 포스트를 이제서야 적는다… 그래도 매달 잊지 않고 포스팅을 하는 것에 의의를 두려고 한다…

--

--