Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240709] 가위 바위 보 웹(Flask, DB) 본문

WHAT I LEARN/TIL

[TIL][240709] 가위 바위 보 웹(Flask, DB)

노네임드개발자 2024. 7. 9. 22:44
어떤 문제가 있었나?

협업을 하다보니 작성 코드의 논리가 어긋나버렸다. 코드 작동은 잘 되는데 코드 리뷰를 하자면 비활성화 되어있는 객체가 있거나 중복으로 작성된 코드도 있었다. 예를 들어 flask route가 1개였는데 2개가 되어서 한 동작으로 진행될 코드가 두 동작으로 나뉘어 있다거나, DB에 저장하는 코드가 2가지였다. 


무엇을 시도했나?

조원 한 분이 의문을 제기했고 다같이 코드를 리뷰하면서 어디서부터 꼬인건지 찾기 시작했다. 아직 조원 모두 flask에 대한 이해도가 부족하여 조심스럽게 의견을 나눴고, "코드가 작동하는데 수정하지말고 유지하자",  "그래도 수정해야할 건 하자"라는 의견들이 나왔다. 내 의견은 전자였는데 잘못 건드렸다가 코드가 망가질 수도 있다는 두려움이 있었기 때문이다. 결론적으로 내 의견은 틀린 의견이었다. 조원들은 멋지게 코드를 수정했고 프로젝트를 거의 완료했다.


어떻게 해결됐는가?

문제의 코드는 home 라우트와 play 라우트로 나뉘어져 home을 로딩할 때, 가위 바위 보 입력 받을 때 2가지로 분할이 되어있었다. home 라우트로 통합하여 코드를 다시 작성했다. 이 코드로 승패 결과, 승무패, 승패 결과 테이블을 모두 실행할 수 있었다.

@app.route('/', methods=['GET', 'POST'])
def home():
    user_choice = ""
    com_choice = ""
    result = ""

    if request.method == 'POST':
        user_choice = request.form['user_choice']
        result, com_choice = game(user_choice)

    results = GameResult.query.all()
    wins = GameResult.query.filter_by(result='승').count()
    draws = GameResult.query.filter_by(result='무').count()
    losses = GameResult.query.filter_by(result='패').count()

    return render_template('index.html', results=results, wins=wins, draws=draws, losses=losses, user_choice=user_choice, com_choice=com_choice, result=result)

 


새로 알게 된 점은 무엇인가?

새로운 코드를 작성할 때 route method에 POST만 입력하고 실행시켰더니 오류가 났다. 버튼을 눌러 입력 받는 방식으로 POST가 맞다고 생각했는데 웹 페이지를 처음 로딩할 때는 GET을 이용한다고 한다. 따라서 GET, POST 둘다 작성하는 것이 맞았다.

 

승무패 카운트를 하기 위해서 기존에 썼던 count += 1의 방식으로 문제를 풀려고 했지만 힌트에서 filter_by(), count()를 이용하여 문제를 풀라고 했다.

    results = GameResult.query.all() 
    # 모든 게임 결과를 데이터베이스에서 가져온다
    # GameResult는 데이터베이스 테이블을 나타내는 SQLAlchemy 모델
    # query.all()은 테이블의 모든 행을 반환
    wins = GameResult.query.filter_by(result='승').count()
    # filter_by(result='승').count(): 결과가 승인 행의 개수
    draws = GameResult.query.filter_by(result='무').count()
    losses = GameResult.query.filter_by(result='패').count()

무엇을 느꼈고 내일은 무엇을 할까?

오늘은 프로젝트 마무리 작업에 들어가서 시간을 많이 투자해서 개인 공부할 시간이 별로 없었지만, 얻은 것들이 많은 것 같다. 지난 프로젝트보다 웹개발에 대해서 조금 더 알아가는 시간이었다. 내일은 발표인데 발표자가 발표를 원활하게 할 수 있도록 도와줄 계획이다.