본문 바로가기

파이썬으로 로또 1등 도전기

14일차) 로또번호 예측기능을 웹페이지로 확인하기

안녕하세요! 오늘은 여러분과 함께 로또 번호 생성기를 만들어보는 프로젝트를 소개하겠습니다. 이 프로젝트에서는 Python과 Flask를 사용하여 로또 번호를 예측하고 생성하는 방법을 단계별로 설명할 거예요. 자, 그럼 시작해볼까요? 🎉

## 1부: 프로젝트 준비하기

우선 이 프로젝트를 시작하기 전에 필요한 라이브러리를 설치해야 합니다. 다음과 같은 라이브러리가 필요해요:

- **requests**: 웹에서 데이터를 가져오기 위해 사용합니다.
- **pymysql**: MySQL 데이터베이스와 연결하기 위해 필요합니다.
- **Flask**: 웹 애플리케이션을 만들기 위한 프레임워크입니다.

이 라이브러리들을 설치하기 위해 아래의 명령어를 사용하세요:

pip install requests pymysql flask



## 2부: 기본 코드 구조

이제 프로젝트의 기본 코드를 살펴볼까요? 아래는 Python으로 작성된 Flask 웹 애플리케이션의 기본 구조입니다.

import requests
import random
from datetime import datetime
import pymysql  # MySQL 연결을 위한 라이브러리
from flask import Flask, render_template

app = Flask(__name__)

# MySQL 연결을 한 번만 설정하기 위한 전역 변수
connection = None



### 코드 설명
- **라이브러리 임포트**: 필요한 라이브러리들을 불러옵니다.
- **Flask 애플리케이션 생성**: `Flask` 클래스를 사용하여 웹 애플리케이션을 생성합니다.
- **전역 변수**: MySQL 연결을 재사용하기 위해 전역 변수를 설정합니다.

## 3부: 데이터베이스 연결

이제 MySQL 데이터베이스에 연결하는 함수를 만들어볼까요?

def connect_to_db():
    global connection
    if connection is None:
        connection = pymysql.connect(
            host='localhost',
            user='root',
            password='your password',
            database='lotto_db',
        )



### 코드 설명
- **`connect_to_db` 함수**: 데이터베이스에 연결하기 위해 호출됩니다. 연결이 이미 설정되어 있다면 새로 연결하지 않습니다.
- **전역 변수 사용**: 데이터베이스 연결을 전역 변수로 관리하여 여러 번 호출해도 연결을 재사용할 수 있습니다.

## 4부: 로또 규칙 불러오기

이제 데이터베이스에서 로또 규칙을 가져오는 함수를 만들어봅시다.

def get_lotto_rules_from_db():
    connect_to_db()
    try:
        with connection.cursor() as cursor:
            sql = "SELECT id, condition_type, order_sequence, bonus_included, lotto_round, pre_lotto_round FROM lotto_rules WHERE id = 1"
            cursor.execute(sql)
            result = cursor.fetchone()
            if result:
                lotto_rule_id, condition_type, order_sequence, bonus_included, lotto_round, pre_lotto_round = result
                exclude_indices = [int(i) - 1 for i in order_sequence.split(',')]
                exclude_bonus = bonus_included == 1
                lotto_round = int(lotto_round) if lotto_round and lotto_round.isdigit() else None
                pre_lotto_round = int(pre_lotto_round) if pre_lotto_round and pre_lotto_round.isdigit() else None
                
                return lotto_rule_id, condition_type, exclude_indices, exclude_bonus, lotto_round, pre_lotto_round
            else:
                return None, None, None, None, None, None
    finally:
        pass



### 코드 설명
- **`get_lotto_rules_from_db` 함수**: 데이터베이스에서 로또 규칙을 불러옵니다. 
- **결과 처리**: 결과가 있으면 각 규칙을 변수에 저장하고 반환합니다. 없다면 `None`을 반환합니다.

## 5부: 로또 번호 생성

이제 로또 번호를 생성하는 함수를 추가해봅시다!

def generate_lotto_numbers(excluded_numbers):
    all_numbers = set(range(1, 46))
    excluded_set = set(excluded_numbers)
    available_numbers = list(all_numbers - excluded_set)
    lotto_numbers = random.sample(available_numbers, 6)
    return sorted(lotto_numbers)



### 코드 설명
- **`generate_lotto_numbers` 함수**: 1부터 45까지의 번호 중에서 제외할 번호를 제거하고, 무작위로 6개의 번호를 선택합니다.
- **정렬된 결과 반환**: 생성된 번호를 정렬하여 반환합니다.

## 6부: 웹 페이지 구성

마지막으로 웹 페이지를 구성하는 코드를 추가해봅시다.

@app.route('/')
def index():
    lotto_rule_id, condition_type, exclude_indices, exclude_bonus, lotto_round, pre_lotto_round = get_lotto_rules_from_db()
    
    if condition_type and exclude_indices is not None:
        latest_draw_no = get_latest_draw_no()
        excluded_numbers, target_numbers, target_bonus = get_excluded_numbers(latest_draw_no, lotto_round, pre_lotto_round, exclude_indices, exclude_bonus)

        lotto_sets = []
        if excluded_numbers:
            for i in range(10):
                lotto_numbers = generate_lotto_numbers(excluded_numbers)
                insert_lotto_lucky_numbers(latest_draw_no + 1, lotto_numbers, None, 'N')
                lotto_sets.append(lotto_numbers)

        return render_template('index.html', latest_draw_no=latest_draw_no, lucky_draw_no=latest_draw_no + 1, excluded_numbers=excluded_numbers, lotto_sets=lotto_sets)
    else:
        return "로또 원칙을 MySQL에서 불러오지 못했습니다."



### 코드 설명
- **루트 경로 설정**: `@app.route('/')` 데코레이터를 사용하여 기본 URL에 대한 처리 함수를 정의합니다.
- **로또 번호 생성 및 렌더링**: 로또 규칙을 불러오고, 번호를 생성하여 HTML 템플릿에 전달합니다.

## 7부: HTML 템플릿

마지막으로 생성된 로또 번호를 표시할 HTML 템플릿을 만들어볼까요? 아래는 기본적인 HTML 템플릿입니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로또 번호 생성기</title>
</head>
<body>
    <h1>로또 번호 생성기</h1>
    <p>오늘 날짜 기준 최신 로또 회차 번호는: <strong>{{ latest_draw_no }}</strong>회차 입니다.</p>
    
    {% if excluded_numbers %}
        <p>제외할 번호: <strong>{{ excluded_numbers }}</strong></p>
        
        <h2>{{ lucky_draw_no }}회차 예상 로또 번호</h2>
        <ul>
            {% for set in lotto_sets %}
                <li>세트: {{ set }}</li>
            {% endfor %}
        </ul>
    {% else %}
        <p>제외할 번호를 가져올 수 없습니다.</p>
    {% endif %}
</body>
</html>



### 템플릿 설명
- **정보 출력**: 사용자가 볼 수 있는 페이지로, 최신 로또 회차 번호와 생성된 번호 세트를 출력합니다.
- **Jinja2 템플릿 엔진**: Flask와 함께 제공되는 Jinja2를 사용하여 동적으로 데이터를 삽입합니다.

## 8부: 마무리

이렇게 해서 로또 번호 생성기를 만들기 위한 전체 과정을 살펴보았습니다! 여러분도 이 코드를 활용하여 자신만의 로또 번호 예측기를 만들어보세요. 이 프로젝트는 Python과 Flask를 배우기에 좋은 기회가 될 거예요. 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 그럼 다음에 또 만나요! 🎊