Flask-MySQL REST API DB설계

업데이트:

책으로만 배웠습니다

분명 학부 수업으로 들었었다. 교수님이 좋으신 분이라, 데이터베이스의 처음부터 끝까지 잘 배웠었다. 하지만 역시 직접 해보지 않았더니 이미 다 까먹은지 오래였다.

ERDcloud

ERDcloud라는 도구를 통해 ERD를 그리는 방법으로 DB를 설계했다. ERDcloud는 Web기반이고 팀원들에게 공유하기도 편하다. 추천하는 도구이다.

나와 비슷한 처지의 전공생이라면, 직접 해봐야 생기는 궁금점들이 나와 비슷할 것 같다.

  • ERD 그리는 순서가 어떻게 되더라?
  • 관계 테이블은 언제 만드는 거더라?
  • 무결성에는 어떤 것들이 있더라?
  • 0대1이나 0대다 관계가 이해가 잘 안된다
  • 실제 현업에서 사용하는 데이터베이스 예시가 보고 싶다

프로젝트를 진행하며 받은 조언들

register_date와 last_modified_date

모든 테이블에 추가해야 할만한 컬럼 2가지가 있다. register_date와 last_modified_date이다. 2개는 만드는게 좋다. 모든 테이블마다 이 2개의 컬럼을 만드는게 좋다

서비스가 6개월 - 1년 지나면 데이터가 엄청 쌓인다. 그러면 자연스럽게 꼭 통계 데이터 요청이 들어온다. 회원 가입 수라던지, 정보 요청 건수라던지. 이러한 통계를 위해 미리 만들어 놓자.

또한, default = datetime.utcnow 와 같이 기본값 설정해주는 것 알고있자.

이력관리가 필요한 정보는 별도의 테이블을 생성한다

단순 통계가 아니라 상세한 이력관리가 필요한 정보들이 있다.

예를 들어서 직원의 인사관리 같은건, 언제 입사했고, 언제 승진했고 하는걸 쭉 기록을 해야한다. 이와 같이 이력관리가 필요한건 위 두 컬럼이 아닌, 테이블로 따로 만든다.

ERD는 Entity-Relation Diagram

엔티티와 관계를 나타내야 한다. 엔티티를 정의해서 테이블을 쭉 만들고, 엔티티 간의 관계를 정의한다.

지금 목표가 단편적이여도, 설계는 최대한의 확장성을 고려해야한다

여러 관계가 생길 것이라고 생각하고 설계해야, 나중에 싹 다 바꿀일이 없다.

이는 후에 생각이 바뀌게 되는데…

추후 다대다 관계로 확장가능한 관계는 관계 테이블을 다 만들어 놓자

다대다 관계의 경우에는 helper 테이블 하나를 따로 만드는게 일반적이다.

근데 확장 가능성이 있는 관계의 경우에는, 그냥 싹 다 helper 테이블을 하나씩 만들어주는게 확장성이 좋다는 조언을 들었다. 지금의 개발 목표가 일대다 관계라도, 추후 기능을 확장할 때 다대다 관계가 필요하게 되면 크게 고생할 수 있으니까.

실제로 개발을 하면서 생긴 피드백

조언대로 현재 개발 목표는 일대다 관계이지만, 다대다 관계로의 확장 가능성을 고려해서 helper table을 다 만들었다. 하지만 ORM도 처음이고, Mysql도 거의 처음인 나에겐 효율적으로 쿼리를 작성하는 것이 어려웠다.

결국 확장 가능성보다는 MVP를 제대로 빨리 구현하기로 했다

현재 MVP에서 일대다 관계의 helper 테이블을 다 삭제하고, 다시 그냥 일대다 관계로 수정하였다. 결과적으로 table이 3개가 줄었고, 훨씬 개발이 편해졌다.

그리고, 사실 다대다로 확장하면 DB말고도 서버 비용이나 병목 면에서 많은 문제점이 생길 수 있었다. 개발 초기부터 너무 많은 노력을 하는 것보다, MVP를 완성해서 아이템을 검증하고 헛된 노력을 방지하기로 했다.

기능 확장을 걱정하기 앞서서 솔루션 자체가 쓸모없다고 판단될 수도 있으니까

NoSQL도 고려해볼만 하다

관계성이 하드한 프로젝트가 아니면, 그냥 mongoDB 쓰면 된다고 한다. JSON으로 저장할 수 있어서 이 또한 몹시 편하다.

나의 경우에는 SQLAlchemy를 쓰고 있는데, json으로 편하게 뽑기 위해서 flask-marshmallow라는 serialization 라이브러리를 별도로 사용하고 있다.

ORM을 배워야하는 이유

ORM은 확실히 트렌디한 기술이라고 한다. 그리고 자연스러운 기술 발전의 방향이다.

쿼리로 짜는 코드들은 디버깅도 힘들고, 유지보수가 어렵다. 하지만 ORM으로 짜는 코드는 읽으면 어떤 기능인지 알기가 편하다. 또한 SQL injection같은 것도 기본으로 막아준다.

태그:

카테고리:

업데이트:

댓글남기기