본문 바로가기

IT

Flask - 애플리케이션(메모앱) 만들어보기 #3

오늘두 저번시간에 이어 플라스크로 메모앱을 만드는 시간 갖도록 할께요

 

저번시간에는 MySQL에서의 데이터베이스 연동 및 모델 정의까지 확인해보았어요

 

오늘은 CRUD 기능을 간단히 구현토록 해보겠습니다.

 

1. CRUD 기능 구현

CRUD는 Create(생성), Read(조회), Update(수정), Delete(삭제)의 약자로 이러한 데이터베이스 기능들을 메모앱 에플리케이션에 적용하여 코드를 작성해보겠습니다.

 

from flask import Flask, render_template, request, jsonify, abort
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# Database 설정
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:password@localhost/my_memo_app'
db = SQLAlchemy(app)

# 데이터 모델 정의
class Memo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.String(1000), nullable=False)

    def __repr__(self):
        return f'<Memo {self.title}>'

# 기존 라우트
@app.route('/')
def home():
    return render_template('index.html')


@app.route('/about')
def about():
    return '이것은 간단하게 메모를 할 수 있는 기능의 앱입니다.'

# 데이터베이스 생성
with app.app_context():
    db.create_all()

# 메모 생성
@app.route('/memos/create', methods=['POST'])
def create_memo():
    title = request.json['title']
    content = request.json['content']
    new_memo = Memo(title=title, content=content)
    db.session.add(new_memo)
    db.session.commit()
    return jsonify({'message': 'Memo created'}), 201

# 메모 조회
@app.route('/memos', methods=['GET'])
def list_memos():
    memos = Memo.query.all()
    return jsonify([{'id': memo.id, 'title': memo.title, 'content': memo.content} for memo in memos]), 200

# 메모 업데이트
@app.route('/memos/update/<int:id>', methods=['PUT'])
def update_memo(id):
    memo = Memo.query.filter_by(id=id).first()
    if memo:
        memo.title = request.json['title']
        memo.conent = request.json['content']
        db.session.commit()
        return jsonify({'message': 'Memo updated'}), 200
    else:
        abort(404, description="Memo not found")

# 메모 삭제
@app.route('/memos/delete/<int:id>', methods=['DELETE'])        
def delete_memo(id):
    memo = Memo.query.filter_by(id=id).first()
    if memo:
        db.session.delete(memo)
        db.session.commit()
        return jsonify({'message': 'Memo deleted'}), 200
    else:
        abort(404, description="Memo not found")

 

위 코드에 사용된 jsonify()와 abort() 함수는 플라스크 웹 프레임워크에서 자주 사용되는 기능들입니다.

이들은 각각 JSON 응답을 생성하고 HTTP 에러를 처리하는 데 사용합니다.

 

jsonify() 함수는 파이썬 데이터 구조를 JSON 형식으로 변환해서, 이를 클라이언트에게 응답해주는 역할을 합니다.

플라스크에서 JSON 응답을 반환할 때 주로 사용되며 데이터를 쉽게 클라이언트와 주고받을 수 있게 해줍니다.

예를 들어 jsonify({'message': 'Memo created'})는 파이썬 딕셔너리 {'message': 'Memo created'}를 JSON 형식으로 변환하고, 이를 클라이언트에게 응답으로 보냅니다. 200은 HTTP 상태 코드중 하나로, 성공적인 요청을 의미합니다.

jsonify() 함수는 기본적으로 200 OK 상태 코드를 반환하지만, 필요에 따라 다른 상태 코드로 지정할 수 있습니다.

 

abort() 함수는 HTTP 에러를 발생시키는 데 사용됩니다. 예를 들면, 요청된 리소스가 존재하지 않으면 404 Not Found 에러를 발생시키기 위해 사용될 수 있습니다. abort(404, description='Memo not found)는 404 Not Found 상태 코드와 함께 "Memo not found"라는 에러 설명을 반환합니다. 이 함수는 주로 요청 처리 중 문제가 발생했을 때 에러 응답을 즉시 반환하는 데 사용됩니다.

 

 

2. CRUD 테스트

 

위에서 작성한 코드로 이제 테스트를 해보겠습니다.

● Create(생성) 테스트 
먼저 새로운 메모를 생성해보겠습니다. 여기서 제목은 "First Test"라는 제목과 "This is First Test Content"라는 내용을 가진 메모를 만들겠습니다.

 

테스트는 curl 명령으로 아래와 같이 진행하였습니다.

 

그후 MySQL Command 명령어로 조회를 해보니 바로 들어가 있습니다.

 

 

● Read(읽기) 테스트 

그렇다면 메모 조회로 웹브라우저로 테스트 하니 json 응답을 하는 걸 보실 수 있습니다.

 

● Update(수정) 테스트 

이번엔 기존에 작성한 타이틀과 컨텐츠를 각각 First Test → Update Test, This is First Test Content This is Update Test 로 바꾸는 걸 테스트 해볼께요

 

마찬가지로 MySQL Command 명령어로 조회하면 바뀌어 있구요

 

웹사이트 조회도 업데이트 반영된걸 확인할 수 있습니다.

 

 

● DELETE(삭제) 테스트 

마지막으로 삭제가 제대로 되는지 삭제 테스트를 해볼께요

 

MySQL Command 명령어로 조회해보면 아래와 같아요

 

웹사이트 조회도 해보면 아무것도 데이터가 없는 것을 확인할 수 있네요. [ ] 괄호만 덩그러니 보이네요

 

 

 

감사합니다. 다음에 또 만나요