앱의 기능을 조직화하는 방법, 블루프린트(Blueprints)와 뷰(Views)

플라스크 튜토리얼의 세 번째 단계인 Blueprints and Views에서는 사용자의 요청에 응답하는 비즈니스 로직(View)을 어떻게 작성하고, 이를 깔끔하게 그룹화(Blueprint)하는지 배웁니다. 이번 페이지에서는 특히 서비스의 핵심인 인증(Authentication) 기능을 구현합니다.




1. 블루프린트(Blueprint)란?

프로젝트 규모가 커지면 모든 기능을 한 파일에 담기 어렵습니다. 블루프린트는 연관된 뷰(View)들을 하나의 그룹으로 묶어주는 '설계도' 역할을 합니다.

  • flaskr/auth.py: 인증 관련 기능(회원가입, 로그인 등)을 담는 블루프린트 파일을 생성합니다.
  • url_prefix: url_prefix='/auth'라고 설정하면, 이 블루프린트에 속한 모든 주소 앞에 자동으로 /auth가 붙습니다. (예: /auth/register)



2. 주요 뷰(View) 함수 구현

블루프린트 안에서 실제 작동하는 함수들을 작성합니다. 각 함수는 특정 URL과 연결되어 데이터를 처리합니다.

  • 회원가입 (Register): 사용자가 입력한 usernamepassword를 검증하고, 비밀번호를 해시(Hash) 처리하여 안전하게 데이터베이스에 저장합니다.
  • 로그인 (Login): 입력된 정보를 DB와 비교합니다. 성공 시 session이라는 안전한 쿠키에 사용자의 ID를 저장하여, 이후 페이지 이동 시에도 로그인 상태를 유지하게 합니다.
  • 로그아웃 (Logout): 세션에 저장된 정보를 삭제하여 로그인 상태를 해제합니다.



3. 인증 시스템의 핵심 기능들

단순히 페이지를 보여주는 것 외에, 보안과 편의성을 위한 기능들이 포함됩니다.

기능 명령어/데코레이터 설명
사전 로드 @bp.before_app_request 어떤 페이지에 접속하든, 뷰 함수가 실행되기 전에 로그인된 사용자 정보를 DB에서 가져와 g.user에 담아줍니다.
로그인 필수 제한 login_required 글쓰기처럼 로그인이 필요한 기능에 이 데코레이터를 붙이면, 로그인하지 않은 사용자를 자동으로 로그인 페이지로 보냅니다.
URL 생성 url_for() 실제 주소(예: /auth/login) 대신 함수 이름(auth.login)을 사용하여 주소를 생성합니다. 나중에 주소가 바뀌어도 코드 수정을 최소화할 수 있습니다.



4. 앱에 블루프린트 등록하기

작성한 auth.py의 블루프린트를 애플리케이션 팩토리가 인식할 수 있도록 flaskr/__init__.py에 등록해야 합니다.

# flaskr/__init__.py 내부
from . import auth
app.register_blueprint(auth.bp)



실무 팁: 보안 수칙

이 튜토리얼에서 강조하는 보안의 핵심은 "비밀번호를 그대로 저장하지 말 것"입니다.

  • generate_password_hash: 비밀번호를 알아볼 수 없는 문자로 변환합니다.
  • check_password_hash: 로그인 시 입력값과 변환된 값을 안전하게 비교합니다.



Official Flask Tutorial: Blueprints and Views
블루프린트를 사용하면 프로젝트의 구조가 훨씬 체계적으로 변합니다. 특히 g 객체와 session의 차이점을 명확히 이해해두면 상태 관리가 훨씬 쉬워집니다.