# add/models.py
from sqlalchemy import Column, Integer, String, Text
from . import Base
class Review(Base):
__tablename__ = "reviews"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(100), nullable=False)
content = Column(Text, nullable=False)
rating = Column(Integer, nullable=False)
# services/service.py
from app import SessionLocal
from app.models import Review
def create_review(title, content, rating):
"""리뷰 생성"""
db = SessionLocal()
review = Review(title=title, content=content, rating=rating)
db.add(review)
db.commit()
return review
def get_review_by_id(review_id):
"""ID로 리뷰 조회"""
db = SessionLocal()
return db.query(Review).get(review_id)
review_id : 그냥 변수 이름일뿐 다른 이름이여도 가능 review = Review(title=title, content=content, rating=rating).get()이 Review 클래스의 primary key(id)를 기준으로 조회하기 때문에 get(review_id) 라고 하면 review_id 값이 id 컬럼에 자동으로 매칭되는 것처럼 보이는 것review_bp = Blueprint("review", __name__) : Blueprint 생성
@app.route로 등록하지 않고,# __init__.py
from flask import Flask
from .routes.review import review_bp
def create_app():
app = Flask(__name__)
app.register_blueprint(review_bp) # 등록
return app
Blueprint는 단독으로 실행되는 게 아니라, Flask 앱에 등록해야 합니다.
@review_bp.route(...) 들이 app에 포함review_bp = Blueprint("review", __name__)
# route.py
@review_bp.route("/new", methods=["GET", "POST"])
def new_review():
if request.method == "POST":
title = request.form["title"]
content = request.form["content"]
rating = request.form["rating"]
create_review(title, content, rating)
return redirect(url_for("review.index"))
return render_template("new.html")
@review_bp.route("/new", methods=["GET", "POST"])if request.method == "POST":title = request.form["title"]content = request.form["content"]rating = request.form["rating"]<form> 데이터에서 name="title", name="content", name="rating" 값을 꺼내옴 create_review(title, content, rating)return redirect(url_for("review.index"))redirect() : 그 URL로 브라우저를 돌려보내는 역할url_for() : 뷰 함수 이름을 기준으로 URL을 만들어주는 Flask 함수url_for("review.index") : 해당 뷰 함수의 실제 URL을 자동으로 찾아줌return render_template("new.html") review_bp = Blueprint("review", __name__)
@review_bp.route("/")
def index():
"""리뷰 목록 + 평균 별점"""
reviews = get_all_reviews()
avg_rating = round(
sum([r.rating for r in reviews]) / len(reviews), 1
) if reviews else 0
return render_template("index.html", reviews=reviews, avg_rating=avg_rating)
@review_bp.route("/new", methods=["GET", "POST"])
def new_review():
"""새 리뷰 작성"""
if request.method == "POST":
title = request.form["title"]
content = request.form["content"]
rating = request.form["rating"]ㅇ
create_review(title, content, rating)
return redirect(url_for("review.index"))
return render_template("new.html")
request.form[...]으로 값을 꺼냄redirect(url_for("review.index")) : 브라우저가 자동으로 / 로 이동하고 나서 index함수 실행



