programming코딩

Start Python #5 Backend Program 만들기 – DBModel

DBModel 을 만드는 컨셉을 설명하는 글이고 Database는 mysql을 사용하겠습니다.

library는 Chapter #4 library import 에서 install했던 pymysql을 사용합니다.

제 글을 보셨다면 이제 아셨겠지만 단순히 문법이나 library 사용법 설명을 목적으로 하지는 않습니다.

DBModel에 대해서 추상화를 하여 재사용이 가능하도록 하였고 여기에 맞추어 구현을 진행합니다.

Chapter #3 Class 에서 언급했던 Class Diagram에서 DBConnection과 DBModel에 대한 부분이 되겠습니다.

Database 설명을 위한 Class Diagram 예제

Full code는 github에 repository에 있으며 commit d3194d3 을 기준으로 설명합니다.

pymysql 설치

pip install pymysql

pip3 install pymysql

DB 생성

mysql script를 만들어두고 database와 table을 만들도록 해놨습니다.

DBConnection

DBConnection은 mysql database에 연결하고 cursor를 받도록 합니다.

  1. import pymysql 을 합니다.
  2. Database Connection을 갖도록 합니다. public이기 때문에 외부에서 접근이 가능합니다.
  3. Database Connect를 합니다. pymysql의 interface입니다. 여기서 config.get()을 사용함을 보실 수 있습니다. 코드에 저의 DB 접근 정보를 남기면 안되기 때문에 Config를 관리할 수 있는 Singleton pattern을 적용한 Class를 만들었습니다. default는 app/,config 에 값을 저장하도록 하고 있습니다. readme.md를 참조해주세요.
  4. cursor를 가져와 저장해둡니다.

DBModel

metaclass=ABCMeta를 상속 받았다는 것은 Chapter #3 Class 에서 설명해듯이 Abstract Class임을 의미합니다.

즉, DBModel은 단독으로 구현이 되는게 아니라 Database Table을 이용하여 CURD (Create, Update, Retrieve, Delete)를 하기 위한 Data Model을 추상화한 Class인것입니다.

그렇다보니 method들이 세분화되어 정의가 되어 있음을 알 수 있습니다.

번호별로 그림 아래에 설명합니다.

DBModel 자체 구현 코드
  1. DBModel은 Abstract Class입니다.
  2. DBConnection을 Class 생성시 인자로 받아옵니다.
  3. pymysql에서 DB처리를 하기 위한 Method들입니다. CURD 처리하는데에는 execute, fetchall, commit 정도 사용하면 됩니다.
  4. 이 부분이 오늘 설명하고자 하는데 있어 가장 중요한 부분입니다. __query, __fetch 와 같은 method는 private method로 외부에서는 접근이 불가합니다. 반면 clear, create, delete, read는 각 Database Table에 따라서 달라진 처리를 해야 하므로 abstract method로 만들었습니다. 즉, DBModel은 Database Table을 바탕으로 하는 Data Model을 위한 Class입니다.
  5. WinNumberRepository Class는 DBModel을 상속 받은 Class로 Database의 ‘win_numbers’ Table에 대한 CURD를 할 수 있는 역할을 할 수 있게됩니다.
  6. App에서 DBConnection을 만들고 DBModel을 상속 받은 Data Repository를 생성하였습니다.

마치며

pymysql을 사용하여 Database를 활용하는 것을 설명하는 것보다 DBModel을 디자인하여 향후 모든 Database Table에서 사용할 수 있는 Class를 만드는 것을 설명하였습니다.

저는 앞으로 여러 프로그램에서 사용할 Data Mode을 만드는데 있어 활용하기 위해 만들었습니다.

Full code는 github에 repository에 있습니다.

사실상 로또당첨번호를 관리하는 코드는 완성되었습니다.

뭘 했다고 벌써라는 생각이 드시죠? ^^

다음 Chapter는 이를 활용하면서 test 하는 test code 예제와 함께 설명하겠습니다.

Leave a Reply