Flask 기초 | Python 웹 프레임워크 시작하기
이 글의 핵심
Flask 기초의 핵심 개념과 실무 포인트를 정리합니다.
들어가며
”가장 쉬운 Python 웹 프레임워크”
Flask는 간단하고 유연한 마이크로 웹 프레임워크입니다.
실무 활용 사례: 데이터 분석, 웹 개발, 자동화 프로젝트에서 실제로 사용한 패턴과 코드를 바탕으로 정리했습니다. 초보자가 흔히 겪는 오류와 해결법을 포함합니다.
실무에서 느낀 Python의 매력
처음 Python을 배울 때는 “이게 정말 프로그래밍 언어인가?” 싶을 정도로 간결했습니다. C++에서 10줄로 작성하던 코드가 Python에서는 2~3줄로 끝나는 경우가 많았죠. 특히 데이터 분석 프로젝트를 진행하면서 Pandas와 NumPy의 강력함을 체감했습니다. 엑셀로 몇 시간 걸리던 작업이 Python 스크립트로는 몇 초 만에 끝나는 걸 보고 동료들이 놀라워했던 기억이 납니다. 하지만 처음부터 순탄하지만은 않았습니다. 들여쓰기 하나 잘못해서 몇 시간을 헤맨 적도 있고, 가상환경 설정이 꼬여서 프로젝트 전체를 다시 시작한 적도 있습니다. 이런 시행착오를 겪으며 깨달은 건, 환경 설정을 처음부터 제대로 하는 것이 얼마나 중요한지였습니다. 이 글에서는 제가 겪은 실수들을 바탕으로, 여러분이 같은 시행착오를 겪지 않도록 실전 팁을 담았습니다.
1. Flask 시작하기
설치
pip install flask
Hello World
Flask(__name__)는 요청이 들어오면 어느 함수가 응답할지 연결해 주는 소형 공장을 만드는 단계입니다. @app.route('/')는 “주소 /로 오면 아래 함수를 실행해 문자열을 돌려준다”는 표지판을 붙이는 것과 같습니다.
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Flask!"
if __name__ == '__main__':
app.run(debug=True)
# 실행
python app.py
# 브라우저에서 http://localhost:5000 접속
2. 라우팅 (Routing)
기본 라우팅
@app.route('/')
def index():
return "홈페이지"
@app.route('/about')
def about():
return "소개 페이지"
@app.route('/user/<username>')
def user_profile(username):
return f"{username}님의 프로필"
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f"포스트 #{post_id}"
HTTP 메서드
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
return f"로그인 시도: {username}"
return "로그인 페이지"
3. 템플릿 (Jinja2)
템플릿 사용
# app.py
from flask import render_template
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
<!-- templates/user.html -->
<!DOCTYPE html>
<html>
<head>
<title>{{ name }}님의 페이지</title>
</head>
<body>
<h1>안녕하세요, {{ name }}님!</h1>
{% if name == '철수' %}
<p>관리자입니다.</p>
{% else %}
<p>일반 사용자입니다.</p>
{% endif %}
<ul>
{% for i in range(5) %}
<li>항목 {{ i }}</li>
{% endfor %}
</ul>
</body>
</html>
4. 폼 처리
폼 데이터 받기
from flask import request, redirect, url_for
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
name = request.form.get('name')
email = request.form.get('email')
# 데이터 처리
print(f"이름: {name}, 이메일: {email}")
return redirect(url_for('success'))
return ''
<form method="post">
<input type="text" name="name" placeholder="이름">
<input type="email" name="email" placeholder="이메일">
<button type="submit">제출</button>
</form>
''
@app.route('/success')
def success():
return "제출 완료!"
5. JSON API
REST API 만들기
from flask import jsonify, request
users = [
{'id': 1, 'name': '철수', 'age': 25},
{'id': 2, 'name': '영희', 'age': 30}
]
@app.route('/api/users', methods=['GET'])
def get_users():
return jsonify(users)
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = next((u for u in users if u['id'] == user_id), None)
if user:
return jsonify(user)
return jsonify({'error': 'User not found'}), 404
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
new_user = {
'id': len(users) + 1,
'name': data['name'],
'age': data['age']
}
users.append(new_user)
return jsonify(new_user), 201
6. 세션과 쿠키
세션 사용
from flask import session
app.secret_key = 'your-secret-key'
@app.route('/login', methods=['POST'])
def login():
username = request.form['username']
session['username'] = username
return redirect(url_for('dashboard'))
@app.route('/dashboard')
def dashboard():
if 'username' in session:
return f"환영합니다, {session['username']}님!"
return redirect(url_for('login'))
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
실전 예제
간단한 블로그 API
from flask import Flask, jsonify, request
from datetime import datetime
app = Flask(__name__)
posts = []
@app.route('/api/posts', methods=['GET'])
def get_posts():
return jsonify(posts)
@app.route('/api/posts', methods=['POST'])
def create_post():
data = request.get_json()
post = {
'id': len(posts) + 1,
'title': data['title'],
'content': data['content'],
'created_at': datetime.now().isoformat()
}
posts.append(post)
return jsonify(post), 201
@app.route('/api/posts/<int:post_id>', methods=['GET'])
def get_post(post_id):
post = next((p for p in posts if p['id'] == post_id), None)
if post:
return jsonify(post)
return jsonify({'error': 'Not found'}), 404
if __name__ == '__main__':
app.run(debug=True)
내부 동작과 핵심 메커니즘
이 글의 주제는 「Flask 기초 | Python 웹 프레임워크 시작하기」입니다. 여기서는 앞선 설명을 구현·런타임 관점에서 한 번 더 압축합니다. 데이터 흐름과 실패 모드를 기준으로 생각하면, “입력이 어디서 검증되고, 핵심 연산이 어디서 일어나며, 부작용(I/O·네트워크·디스크)이 어디서 터지는가”가 한눈에 드러납니다.
처리 파이프라인(개념도)
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
알고리즘·프로토콜 관점에서의 체크포인트
- 불변 조건(Invariant): 각 단계가 만족해야 하는 조건(예: 버퍼 경계, 프로토콜 상태, 트랜잭션 격리)을 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 동일 입력에 동일 출력이 보장되는 순수한 층과, 시간·네트워크에 의해 달라질 수 있는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화/역직렬화, 문자 인코딩, syscall 횟수, 락 경합처럼 “한 번의 호출이 아니라 누적되는 비용”을 의심 목록에 넣습니다.
프로덕션 운영 패턴
실서비스에서는 기능 구현과 함께 관측·배포·보안·비용이 동시에 요구됩니다. 아래는 팀에서 자주 쓰는 최소 체크리스트입니다.
| 영역 | 운영 관점에서의 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율/지연 분위수, 주요 의존성 타임아웃이 보이는가 |
| 안전성 | 입력 검증·권한·비밀 관리가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등한 연산에만 적용되는가, 서킷 브레이커·백오프가 있는가 |
| 성능 | 캐시 계층·배치 크기·풀링·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리, 마이그레이션 호환성이 문서화되어 있는가 |
운영 환경에서는 “개발자 PC에서는 재현되지 않던 문제”가 시간·부하·데이터 크기 때문에 드러납니다. 따라서 스테이징의 데이터 양·네트워크 지연을 가능한 한 현실에 가깝게 맞추는 것이 중요합니다.
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스 컨디션, 타임아웃, 외부 의존성 불안정 | 최소 재현 스크립트 작성, 분산 트레이스·로그 상관관계 확인 |
| 성능 저하 | N+1 쿼리, 동기 I/O, 잠금 경합, 과도한 직렬화 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 클로저/이벤트 구독 누수, 대용량 객체의 불필요한 복사 | 상한·TTL·스냅샷 비교(힙 덤프/트레이스) |
| 빌드·배포만 실패 | 환경 변수·권한·플랫폼 차이 | CI 로그와 로컬 diff, 컨테이너/런타임 버전 핀(pin) |
권장 디버깅 순서: (1) 최소 재현 만들기 (2) 최근 변경 범위 좁히기 (3) 의존성·환경 변수 차이 확인 (4) 관측 데이터로 가설 검증 (5) 수정 후 회귀·부하 테스트.
정리
핵심 요약
- Flask: 마이크로 웹 프레임워크
- 라우팅: @app.route()
- 템플릿: Jinja2, render_template()
- API: jsonify(), request.get_json()
- 세션: session 딕셔너리
다음 단계
관련 글
자주 묻는 질문 (FAQ)
Q. 이 내용을 실무에서 언제 쓰나요?
A. Everything about Flask 기초 : from basic concepts to practical applications. Master key content quickly with examples. Sta… 실무에서는 위 본문의 예제와 선택 가이드를 참고해 적용하면 됩니다.
Q. 선행으로 읽으면 좋은 글은?
A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. Python 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.
Q. 더 깊이 공부하려면?
A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- Pandas 기초 | Python 데이터 분석 라이브러리 완벽 정리
- Python 예외 처리 | try-except, raise, 커스텀 예외 완벽 정리
- Python REST API | Flask/Django로 API 서버 만들기
이 글에서 다루는 키워드 (관련 검색어)
Python, Flask, 웹개발, 백엔드, REST API, 프레임워크 등으로 검색하시면 이 글이 도움이 됩니다.