깔끔한 파이썬 탄탄한 백엔드의 내용을 토대로 프로젝트 초기 세팅 내용을 메모 해 놓기 위한 블로깅
python 코드에서 DB와 연결하기 위해 사용할 수 있는 다양한 라이브러리가 있는데 그 중 SQLAlchemy 라이브러리를 사용하여 파이썬 코드에서 데이터베이스에 연결하여 SQL을 실행시킬 수 있다.
SQLAlchemy 설치
pip3 install sqlalchemy
SQLAlchemy에서 MySQL을 사용하기 위해서는 MySQL용 DBAPI 또한 설치해야 한다. DBAPI는 이름 그대로 DB를 사용하기 위한 API이다.
MySQL용 DBAPI에는 PyMySQL, MySQLdb, MySQL-Connector가 존재한다.
PyMySQL은 python 기반으로 만들어진 라이브러리이며, MySQL-Connector는 C 기반으로 만들어진 라이브러리이다. 따라서 속도면에 있어서 MySQL-Connector가 더 우세하다.
속도와 관련된 이슈가 없는 경우에는 PyMySQL을 사용해도 무방하다.
MySQL-Connector설치
pip3 install mysql-connector-python
설치가 완료 됐다면, SQLAlchemy를 사용하여 데이터베이스에 연결하여 SQL을 실행시켜 데이터베이스로부터 데이터를 읽어 들이거나 생성하거나 할 수 있다.
나는 프로젝트 초기 세팅을 위해 DB 연결을 다음과 같이 진행하였다.
config.py
from sqlalchemy import create_engine
db = {
'user' : 'root',
'password' : 'dnl1vhr2',
'host' : 'brandi.c5my9kjknh3g.us-east-2.rds.amazonaws.com',
'port' : 3306,
'database' : 'brandi'
}
DB_URL = f"mysql+mysqlconnector://{db['user']}:{db['password']}@{db['host']}:{db['port']}/{db['database']}?charset=utf8
DB연결과 관련된 역할을 할 config.py
라는 python file을 하나 생성 한 후 db와 관련 된 설정값을 기입해준다.
그리고 DB_URL
이라는 변수에 위와 같이 fstring
을 사용해준다.
DB_URL
을 사용해 웹사이트에 접속하는 것과 비슷하게 실제 데이터베이스에 접속하는 개념으로 생각하면 된다.
create_engine
함수를 통해 DB_URL
에 명시 된 데이터베이스에 접속한다. create_engine
함수는 Engine
객체를 리턴한다. 연결 된 데이터베이스와 SQL을 Engine
객체를 사용해서 할 수 있다. 여기서는 Engine
객체를 db라는 변수에 저장했다.
이렇게 하면 SQLAlchemy를 사용한 MySQL연동이 완료된다.
app.py
이제 app.py
파일을 수정하여 config.py
파일에서 데이터베이스 설정 정보를 읽어들여 데이터베이스와 연결하도록 해보자. 위에서 사용한대로 sqlalchemy의 create_engine을 사용하여 연결한다.
import config
from flask import Flask
from flask_cors import CORS
from sqlalchemy import create_engine
def create_app(test_config = None):
app = Flask(__name__)
app.debug = True
if test_config is None:
app.config.from_pyfile('config.py')
else:
app.config.update(test_config)
# DB 연결
database = create_engine(app.config['DB_URL'], encoding = 'utf-8', max_overflow = 0)
app.database = database
# CORS 설정
CORS(app, resources={r'*' : {'origins': '*'}})
return app
Python Flask에서 CORS Cross Origin 사용하기
flask layered architecture에 의해 세가지 레이어로 구분짓는데 해당 레이어에 따라서 세팅을 해주면 된다.
presentation layer → view (controller)
business layer → service
persistence layer → model
따라서 위 세가지의 디렉토리를 만들어주자
mkdir model service view
초기 설정이기에 안의 내용은 비어있어도 되지만, __init__.py
를 넣어주어도 된다. 해당 __init__.py
를 넣어주는 것은 패키지로 인식하도록 도와주고, 또한 __all__
메소드를 사용하여 변수를 묶어주는데도 사용된다.
또한 django의 manage.py와 같은 역할을 할 run.py
라는 파일을 생성해주자. (이름은 무엇으로 하든 상관없다.)
run.py
from app import create_app
if __name__ == '__main__':
app = create_app()
app.run(host = 'localhost', port = 5000)
__name__
에 __main__
이 들어있는지 확인해주는 소스이다.
flask 서버를 실행시킬 때 app.py가 실행되니까 __name__
에는 __main__
이 들어가서 app.run()
이 실행되게 된다.
if
문 안에 app.py
에서 만들었던 create_app
함수를 app이라는 변수에 할당해줬다. 따라서 해당 함수가 실행되면서 flask server가 동작하게 된다.
위와 같이 Flask의 초기 세팅을 마칠 수 있다.
성공적으로 세팅이 완료 됐다면 run.py
파일을 실행시켰을 때, 서버가 정상적으로 구동이 되고, 서버가 구동 된 후 localhost:5000으로 접속 했을 때, Not Found가 출력되면 된다. (아무것도 작성하지 않았기 때문에)
DB연동이 제대로 되었는지도 확인해보면 좋을 듯 싶다.