dmswo 2025. 1. 8. 12:58

영화 예매하기 기능을 구현하겠다.

제일 복잡하고 중요한 기능이므로 구현 순서를 적겠다.

 

1. movie_id 입력받기

 

1-1. 로그인할 때 member_id를 받아와서 member_id를 출력한다.

1-2. 상영 예정 영화의 movie_id, movie_title, 영화 포스터를 출력하고 이 값을 movie_id를 입력 받는 함수에 넘겨준다. (입력받은 값이 존재하는 값인지 확인하기 위함)

1-3. 출력된 movie_id를 보고 예매할 영화의 movie_id를 입력한다. 이 때 존재하지 않거나 유효하지 않은 입력(예를 들어 숫자를 입력해야 하는데 문자를 입력)을 하면 제대로 입력할 때까지 이 과정을 반복한다.

 

2. screening_date_id 입력받기

 

2-1.  movie_id를 제대로 입력했다면 해당 movie_id를 가진 영화의 screening_date_id, screening_date를 출력하고 이 값을 screening_date_id를 입력 받는 함수에 넘겨준다 (입력받은 값이 존재하는 값인지 확인하기 위함).

2-2. 출력된 상영 일정을 보고 예매할 영화의 정보를 클릭한다. 그리고 선택된 정보의 screening_date_id를 저장한다.

 

3. seat_id 입력받기

3-1. screening_date_id도 제대로 입력받았다면 해당 movie_id, screening_date_id에 맞는 theater_id total_seat를 출력한다. (특정 영화, 특정 상영 일자에 맞는 상영관은 하나 밖에 없으므로 따로 입력을 받지 않고 바로 출력한다.)

3-2. 해당 screening_date_id에 맞는 theater seat_id seat_assignment true일 때(예매 가능할 때)만 출력한다.

이 정보를 출력함으로써 예매할 특정 영화, 상영일정, 상영관에 맞는 seat_id를 쉽게 알 수 있다.

3-3. 출력된 seat_id를 보고 예매할 영화의 seat_id를 클릭한다. 그리고 선택된 seat_id를 저장한다.

 

4. 결제 수단 입력받기

4-1. 결제 수단으로 Credit Card / Debit Card / Cash 중에 1개를 클릭한다.

가격은 예약을 한번 하므로 8000원이다.

 

5. 예약 정보 업데이트

입력받은 정보를 바탕으로 예약을 하기 위해 transaction을 시작한다. 우선 지금까지 구한 정보들로 영화예매 정보(price, pay_method, screening_date_id, theater_id, seat_id, movie_id, member_id)insert한다. 그리고 예매를 했으니 예매한 좌석의 seat_assignmentfalseupdate 해주면서 다른 사람이 예매할 수 없도록 한다. 마지막으로 예매한 영화 정보를 바탕으로 예매한 reservation_id를 출력하고 transaction을 종료한다. 그리고 transaction을 수행하던 중 오류가 발생했다면 원상복구 시켜주는 rollback을 수행한다.

 

이제 순서대로 구현하겠다.

1. movie_id 입력받기

 

1-1. 로그인할 때 member_id를 받아와서 member_id를 출력한다.

영화 예매 시 member_id가 필요하므로 추가했다.

models.py
routes.py
user_function.html

name과 member_id 값이 잘 넘어왔는 지 영화 예매 창에서 출력해보겠다. 

[에러1]처럼 구현했더니 출력이 잘 안되었다.

에러1

print문은 [수정1]처럼 작성해야한다.

Flask의 return 문에서는 HTML을 반환하거나 템플릿을 렌더링해야 한다.

return name, str(member_id)로 작성된 코드에서 Flask는 하나의 문자열 또는 HTML 문서를 기대하지만, 두 개의 값을 반환하려 하니 제대로 동작하지 않았던 것이다.

수정
name, member_id 출력

html 파일로 출력

 

 

 

1-2. 상영 예정 영화의 movie_id movie_title, 포스터를 출력하고 이 값을 movie_id를 입력 받는 함수에 넘겨준다. (입력받은 값이 존재하는 값인지 확인하기 위함)

 

상영 예정 영화의 movie_id movie_title, 포스터 출력  -> models.py에 함수구현

def print_movie():
    con = get_db_connection()
    cursor = con.cursor()
    print("상영 예정 영화의 movie_id, movie_title, 영화 포스터를을 출력 합니다. ")
    cursor.execute("select distinct m.movie_id, m.movie_title, poster_url "
                   "from movie m ,screeningschedule s "
                   "where m.movie_id = s.movie_id and screening_date >= current_date")
    result = cursor.fetchall()
    con.close()
    return result

 

result 값을 확인라는 중에 오류 발생

오류1. 자꾸 5000번 포트가 사용중이라고 뜬다.

오류1

오류1 해결. 포트 5000번을 사용하는 프로세스를 찾아서 종료시켰더니 해결되었다.

오류1 해결

 

오류2. print_movie에서 받아온 영화 정보를 html 파일로 출력하고 싶은데 안나옴

[오류2-1]처럼 print 문을 통해 확인해보니 [오류2-2]처럼 영화 정보가 출력되었다. -> print_movie 함수는 문제 없음

오류2-1
오류2-2

오류2 해결. 인자를 다른 이름으로 설정했었다.

빨간상자 부분에 result1 = result1 이라해서 오류가 났다. 

인자를 movies로 받음
movies 로 넘겨주도록 수정

 

이제 잘 출력된다.

 

 

 

상영 예정 영화의 movie_id movie_title, 포스터를 출력했고 이제 이 값을 movie_id를 입력 받는 함수에 넘겨준다. (입력받은 값이 존재하는 값인지 확인하기 위함)

 

→ 1-3에서 valid_movie_id 함수에서 구현

 

 

1-3. 출력된 movie_id를 보고 예매할 영화의 movie_id를 입력한다. 이 때 존재하지 않거나 유효하지 않은 입력(예를 들어 숫자를 입력해야 하는데 문자를 입력)을 하면 제대로 입력할 때까지 이 과정을 반복한다.

 

<오류> routes.py

오류코드

 GET 요청을 허용해서 오류 해결

수정된 코드

    @app.route("/movies/book/<name>/<int:member_id>", methods=['GET', 'POST'])
    def book_movie(name, member_id):
        result1 = print_movie()

        if request.method == "POST":
            movie_id = request.form.get('movie_id')
            if not movie_id:
                message = "Movie ID is required!"
            else:
                try:
                    movie_id = int(movie_id)
                    if valid_movie_id(movie_id, result1):
                        message = f"You selected movie_id {movie_id}."
                    else:
                        message = "Invalid movie ID. Please enter a valid movie ID."
                except ValueError:
                    message = "Invalid input. Please enter a valid integer for movie ID."
        else:
            message = None

        return render_template('user/book_movie_4.html', name=name, member_id=member_id, movies=result1, message=message)

 

models.py

def valid_movie_id(movie_id, result):
    # 영화 ID가 유효한지 체크하는 함수
    if any(movie_id == r[0] for r in result):
        return True
    return False

 

book_movie_4.html 일부분

 

<결과화면>