API를 개발하세요.

김수민·2020년 5월 24일
0

개요

API 서버를 구현 백엔드 과제를 받았다.
아래의 요구사항을 충족 해야한다.

  • 클라이언트(Web, App)에서 사용할 API 서버
  • 회원 가입 및 로그인(인증) 기능
  • MySQL DB 사용
  • 회원과 주문 Table이 있고 각 colum마다 제약 사항
  • Docker 이용
  • Git 이용
  • Python3.7 이상

계획

시간만 투자하면 모든 요구사항을 개발할 수 있을 것 같다.
문제는 투자할 수 있는시간이 한정적이라는 것이다.

또한, 직접 Dokcer 이미지를 빌드하고 AWS서버를 띄우는 작업은 처음이고 DB 설정 및 ORM하는 작업도 너무 오랜만이라 시간이 얼마나 걸리고 완성도가 얼만큼 나올지 감이 잡히지 않았다.

과제 완료를 위한 계획을 세우고 차근차근 개발해 나가기로 했다.

1) Docker 이미지 build
2) AWS EC2 <-> AWS RDS 연결
3) SQLAlchemy Model 설계
4) RESTful API 구현
5) JWT 인증 구현
6) API 문서 작성
7) Docker PUSH
8) GIT PUSH

1) Docker 이미지 build

기존에 Docker를 학습하던 EC2 머신에서 과제를 위한 이미지를 build하는 작업을 먼저 시작했다.
EC2 머신은 Centos이고, 생성하는 이미지는 ubuntu로 하다보니, python - mysql 모듈을 설치하는 과정에서 시행착오가 많았다.

2) EC2 <-> RDS 연결

기존에 MySQL RDS 서버를 띄워 놓은 것을 연결해보려고 하였다.
그러나 알수 없는 이유로 연결이 되지 않아, 새로운 RDS 서버를 띄웠다.
기존 DB를 빠르게 포기하고 새로 연결했으면 됬는데, 오류를 잡겠다고 메달리다가 시간을 많이 소비하였다.

3) SQLAlchemy Model 설계

처음 flask를 학습할 때 SQLAlchemy를 사용해본 경험을 바탕으로 회원과 주문 Model을 생성했다.
직접 SQL을 작성하는 것 보다 ORM을 사용하는 것이, 시간적 측면이나 완성도 측면에서 더 나을 것이라고 생각 했다.

간단한 회원, 주문 Model을 생성하기에는 적합했다.

추후에 query를 생성할 때, join이나 subquery, pagination 처리를 위해 많은 시행 착오를 겪었다.

4) RESTful API 구현

본격적으로 API를 구현 하는 작업은 일요일 저녁이 되어서야 시작했다.
url_path를 'api/v1/'으로 설정하고, 회원가입, 로그인, 로그아웃, 조회 등.. api view함수를 구현 해 나갔다.

RESTful API라는 개념을 실제로 정확하게 구현해본 적은 없어서 http method에 따라 기능을 구현하는 정책을 따르는 것이 다소 어색했다.

API의 응답을 json형태로 정형화된 code와 msg로 return 하기위한 공통 응답객체를 구현하였다.

5) JWT 인증 구현

'인증'을 어떻게 구현할 것인가에 대한 고민이 먼저 들었다.
시간과 경험적 측면에서는 cookie-session기반의 인증을 구현하면 좋을 것 같았지만,
요구 사항 및 적절성 측면에서는 token기반의 인증이 적합하다는 결론을 내렸다.

web에서는 session이 잘 동작하지만 app환경에서는 특히 ios에서는 session을 사용할 때 이슈가 많기 때문이다.

JWT로 access-token과 refresh-token을 구현해본 경험을 바탕으로 token생성 함수를 구현하고, token의 적절성을 판단하는 데코레이터를 구현하였다.

문제는 로그아웃을 어떻게 구현하는가? 였다.
로그아웃을 구현해본 경험이 없기 때문이다.
구글링을 해봐도 access / refresh token 인증 방식에 표준화된 로그아웃 구현 방식은 없는 것 같았다.

즉시 로그아웃 처리를 하는 가장 확실한 방법으로는 클라이언트 환경 즉, 브라우저 cookie나 App이 가지고 있는 token을 삭제하는 것인데, 만약 token이 유출되거나 모종의 이유로 token이 삭제되지 않는다면 로그아웃은 되지 않는다.

클라이언트는 변조된 요청이나 신뢰할 수 없는 요청을 보낼 수 있기 때문에, 서버 사이드에서 확실한 로그아웃 처리를 해줘야한다.

그 방법으로는 로그아웃 요청을 한 유자의 refresh token을 DB에서 삭제하는 것, access token을 black list 테이블에 등록 하는 방법 등이 있다.

6) API 문서 작성

제대로된 API 문서를 작성하는 것도 많은 시간이 필요하다.
다행히 POSTMAN에서 테스트한 API를 문서화 해주는 기능이 있어 이를 활용 하였다.

7) Docker PUSH

완성한 API 서버를 배포하기 위해 Docker Image를 DockerHub에 push하였다.

8) GIT PUSH

최종적으로, 모든 소스를 Git hub에 올렸다.

마무리

모든 요구사항을 충족하지 못하였다.

  • MySQL DB replication : 읽기 / 쓰기 전용 서버로 replication 설정을 하는 것
  • Model 제약 조건 중, '중복이 불가능한 임의의 영문 대문자, 숫자조합, 12자리'의 주문 ID를 생성하라는 조건이 있었다. uuid4()를 사용하면 12자리를 초과하고 random으로 생성하면 중복이 발생한 가능성이 있기 때문에 어느쪽도 완벽한 방식은 아니었다.
profile
python developer

0개의 댓글