실습_블로그 구현 (Flask-MySQL를 활용)
이번 실습에서는 Flask와 MySQL을 활용하여 간단한 블로그 시스템을 구현합니다. 블로그 시스템은 사용자에게 게시물을 생성, 조회, 수정 및 삭제할 수 있는 기능을 제공합니다. 아래에서는 전체 코드를 제시한 후, 각 프로세스를 단계별로 설명하겠습니다.
프로젝트 구조
my_flask_app/
│
├── app.py # Flask 애플리케이션 설정 및 라우팅
├── posts_routes.py # 게시물 관련 라우트 처리
├── db.yaml # 데이터베이스 연결 정보
└── templates/
├── posts.html # 게시물 리스트 및 작성 폼
└── post.html # 개별 게시물 표시
전체 코드
from flask import Flask
from flask_mysqldb import MySQL
import yaml # pip install pyyaml
from flask_smorest import Api
from posts_routes import create_posts_blueprint
app = Flask(__name__)
# YAML 파일에서 MySQL 설정 로드
db = yaml.load(open('db.yaml'), Loader=yaml.FullLoader)
app.config['MYSQL_HOST'] = db['mysql_host']
app.config['MYSQL_USER'] = db['mysql_user']
app.config['MYSQL_PASSWORD'] = db['mysql_password']
app.config['MYSQL_DB'] = db['mysql_db']
# MySQL 연결 초기화
mysql = MySQL(app)
# Flask-Smorest API 설정
app.config["API_TITLE"] = "My API"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.1.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/swagger-ui"
app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"
api = Api(app)
# 게시물 관련 블루프린트 설정
posts_blp = create_posts_blueprint(mysql)
# 블루프린트 등록
api.register_blueprint(posts_blp)
if __name__ == "__main__":
app.run(debug=True)
각 구성 요소 설명
1. Flask 애플리케이션 초기화
app = Flask(__name__)
- Flask 애플리케이션 객체를 생성합니다. 이 객체는 애플리케이션의 모든 설정과 라우트, 블루프린트 등을 관리합니다.
2. MySQL 데이터베이스 연결 설정
db = yaml.load(open('db.yaml'), Loader=yaml.FullLoader)
app.config['MYSQL_HOST'] = db['mysql_host']
app.config['MYSQL_USER'] = db['mysql_user']
app.config['MYSQL_PASSWORD'] = db['mysql_password']
app.config['MYSQL_DB'] = db['mysql_db']
- db.yaml 파일에서 MySQL 데이터베이스 연결 정보를 로드하여 Flask 애플리케이션에 설정합니다.
- db.yaml에는 MySQL 호스트, 사용자, 비밀번호, 데이터베이스 이름 등이 포함됩니다.
3. MySQL 연결 초기화
mysql = MySQL(app)
- Flask-MySQLdb의 MySQL 객체를 사용하여 Flask 애플리케이션과 MySQL을 연결합니다. mysql 객체를 통해 데이터베이스와의 연결을 관리하고 쿼리를 실행할 수 있습니다.
4. Flask-Smorest API 설정
app.config["API_TITLE"] = "My API"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.1.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/swagger-ui"
app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"
- Flask-Smorest는 Flask 애플리케이션에서 API 문서를 자동으로 생성하는 라이브러리입니다.
- API_TITLE, API_VERSION, OPENAPI_VERSION 등은 Swagger UI와 OpenAPI 스펙을 설정하는 데 사용됩니다.
- OPENAPI_SWAGGER_UI_PATH는 Swagger UI가 로드될 경로를 지정합니다.
5. Api 객체 생성 및 블루프린트 등록
api = Api(app)
posts_blp = create_posts_blueprint(mysql)
api.register_blueprint(posts_blp)
- Flask-Smorest의 Api 객체를 생성하여 API를 초기화합니다.
- create_posts_blueprint(mysql)은 posts_routes.py에서 정의된 블루프린트를 생성하는 함수입니다. 이 함수는 게시물과 관련된 모든 라우트를 포함한 블루프린트를 반환합니다.
- api.register_blueprint(posts_blp)를 사용하여 생성된 블루프린트를 애플리케이션에 등록합니다.
6. 애플리케이션 실행
if __name__ == "__main__":
app.run(debug=True)
- 이 코드는 애플리케이션을 실행합니다. debug=True는 Flask의 디버그 모드를 활성화하여 개발 중에 발생하는 오류를 쉽게 추적할 수 있도록 합니다.
테스트 및 실행
- 애플리케이션을 실행하고 localhost:5000/posts 주소로 접속하여 게시글 CRUD를 해 봅시다.
결론
이 코드는 Flask 애플리케이션을 설정하고, MySQL과 연결하며, Flask-Smorest를 사용하여 API를 구성하는 기본적인 구조를 보여줍니다. create_posts_blueprint 함수가 정의된 posts_routes.py 파일에서 게시물에 관련된 라우트가 처리되며, 이를 통해 API와 데이터베이스를 연결하여 CRUD 기능을 구현할 수 있습니다. Swagger UI를 통해 API를 시각적으로 테스트하고 문서화할 수 있게 됩니다.
해결 방법: MySQLdb.OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)") 오류
이 오류는 주로 MySQL을 Homebrew로 설치한 경우 발생합니다. 오류 메시지는 MySQL이 /tmp/mysql.sock 소켓 파일을 통해 연결을 시도하지만, 실제로 소켓 파일이 다른 경로에 있을 때 발생합니다. 이를 해결하려면 MySQL이 실제로 사용하는 소켓 파일의 위치를 확인하고, 해당 경로를 설정해주어야 합니다.
1. 소켓 위치 확인하기
먼저, MySQL이 사용하는 소켓 파일의 경로를 확인해야 합니다. 터미널에서 아래 명령어를 실행하여 MySQL의 소켓 파일 위치를 확인합니다:
mysqladmin variables | grep socket
이 명령어를 통해 출력되는 결과에서 socket 항목을 찾으면, MySQL이 사용하는 실제 소켓 파일의 경로를 확인할 수 있습니다.
예시:
| socket | /opt/homebrew/var/mysql/mysql.sock |
위와 같이 socket의 위치가 /opt/homebrew/var/mysql/mysql.sock으로 나타날 수 있습니다.
2. db.yaml 파일 수정
db.yaml 파일에 MySQL의 소켓 경로를 추가해야 합니다. 이 경로는 MySQL 서버가 사용하는 소켓 파일의 위치로 설정됩니다.
예시 db.yaml 파일 수정
MYSQL_HOST: "localhost"
MYSQL_USER: "root"
MYSQL_PASSWORD: "oz-password"
MYSQL_DB: "oz"
MYSQL_UNIX_SOCKET: "/opt/homebrew/var/mysql/mysql.sock" # 추가된 부분
- MYSQL_UNIX_SOCKET: MySQL의 소켓 파일 경로를 추가합니다. mysqladmin variables 명령어로 확인한 경로를 입력해주면 됩니다.
3. app.py 파일 수정
Flask 애플리케이션 설정에서 MYSQL_UNIX_SOCKET을 추가합니다. app.py 파일에서 app.config 설정 부분에 소켓 경로를 추가해주어야 합니다.
예시 app.py 파일 수정
app.config["MYSQL_HOST"] = db_info["MYSQL_HOST"]
app.config["MYSQL_USER"] = db_info["MYSQL_USER"]
app.config["MYSQL_PASSWORD"] = db_info["MYSQL_PASSWORD"]
app.config["MYSQL_DB"] = db_info["MYSQL_DB"]
app.config["MYSQL_UNIX_SOCKET"] = db_info["MYSQL_UNIX_SOCKET"] # 소켓 경로 추가
4. 애플리케이션 재시작
위와 같이 설정을 수정한 후, 애플리케이션을 재시작하여 변경된 설정이 적용되도록 합니다.
이제 MySQL과의 연결이 성공적으로 이루어질 것입니다.
요약
- 문제: MySQL이 Homebrew로 설치된 경우, MySQL이 사용하는 소켓 파일의 경로가 기본 경로와 달라서 연결 오류가 발생.
- 해결 방법:
- MySQL의 실제 소켓 경로를 확인한다.
- db.yaml 파일에 소켓 경로(MYSQL_UNIX_SOCKET)를 추가한다.
- app.py에서 소켓 경로 설정을 추가한다.
- 애플리케이션을 재시작하여 설정을 적용한다.