본문 바로가기
웹 프로그래밍 고급 주제들

2. 데이터베이스와 세션 연결 - 2.1. 기본 개념

by 영바이트 2020. 12. 12.

 

웹 서버에 접속한 사용자에 따라 맞춤형 서비스를 제공하기 위해서 먼저 접속한 사용자가 누구인지 페이지 요청이 올 때 마다 알아야 할 필요가 있다. 이 때 쿠키 혹은 세션을 사용하게된다. 이를 전문 용어로 상태있는 연결(Stateful protocol)이라고 부른다. 즉, 이전 상태가 새로운 연결(요청 및 응답)을 위한 입력으로 사용된다.

 

상태있는 연결을 위해 사용되는 쿠키와 세션은 컴퓨터의 어디에 저장되는 것일까? 기본적으로 컴퓨터의 메모리에 저장된다. 메모리에 저장되어 있는 쿠키와 세션은 필요한 동안 사용되다가 필요가 없어지면 삭제된다. 즉, 보관을 전제로 하지 않는다.

 

사용자의 행동 패턴은 많은 정보를 담고 있다. 몇 시에 주로 웹 서버에 접속해서 어떤 페이지들을 요청하며 얼마만한 시간동안 서비스를 이용하는지에 대한 정보가 사용자의 선호와 밀접하게 관련되어 있기 때문에 개인 맞춤형 마케팅을 위한 자료로써 가치가 있다. 사용자의 웹 서비스 이용 패턴을 세션에 저장할 수 있지만 세션은 메모리에 저장되었다가 더 이상 사용되지 않으면(예, 사용자가 로그 아웃) 삭제된다. 따라서 분석을 위한 데이터를 쌓기 위해서는 세션 정보를 비 휘발성 저장장치, 예를 들면 디스크 등에 저장할 필요가 있다.

 

이번 절과 이어지는 절에서는 세션을 디스크, 더 구체적으로 데이터베이스에 저장하는 방법에 대해서 살펴보고자 한다.

 


가장 간단한 세션은 세션 ID(sid)와 세션 값(val)으로 구성된다.

 

session = {sid, val}

 

세션 정보가 메모리에 저장될 때 그 사본(copy)을 DB에 저장하면 세션 데이터들을 계속해서 쌓아나갈 수 있다. 즉, '세션 정보가 메모리에 저장될 때' DB에 저장하는 동작을 함께 수행하면 세션을 DB에 저장할 수 있다.

 

플라스크 웹 서버가 세션을 다룰 때는 ①세션을 읽고(open_session) → ②세션을 저장하는(save_session) 동작을 반복한다. 플라스크 프레임워크는 세션의 동작을 사용자가 커스터마이징customizing할 수 있는 방법을 제공한다. 세션을 읽고 저장하는데 있어 추가적인 동작을 flask sessions 패키지의 SessionInterface 클래스에 구현할 수 있다. 이와 관련된 내용이 플라스크Flask 문서에 나와있다.

 

flask.palletsprojects.com/en/1.1.x/api/#flask.sessions.SessionInterface

 

API — Flask Documentation (1.1.x)

API This part of the documentation covers all the interfaces of Flask. For parts where Flask depends on external libraries, we document the most important right here and provide links to the canonical documentation. Application Object class flask.Flask(imp

flask.palletsprojects.com

 

플라스크 문서의 내용을 참고로 플라스크의 소스 코드를 살펴보면 open_session( ), save_session( ) 메서드가 아직 구현되어 있지 않다. 이 두 메서드를 재정의하면 앞서 이야기했던 세션을 읽고(open_session) 저장할 때(save_session) 추가적인 동작을 지정할 수 있다. 아래는 플라스크 소스코드 중 open_session( ), save_session( ) 메서드가 포함되어 있는 세션session 부분의 코드다(플라스크 버전 1.1.2 기준으로 각각 284, 292 라인을 보면 된다). 해당 코드가 구현을 기다리고 있다 정도를 살펴보면 된다.

 

github.com/pallets/flask/blob/master/src/flask/sessions.py

 

pallets/flask

The Python micro framework for building web applications. - pallets/flask

github.com

 

세션 테이터를 데이터베이스에 저장하는 흐름을 아래 그림과 같이 정리해 볼 수 있다.

 

세션 데이터를 데이터베이스에 저장하기

 


 

 

다음으로 세션 정보를 DB에 저장해야 하므로 데이터베이스 모델이 필요하다. 즉, 어떤 데이터를 저장하게 될 지 미리 지정해야 한다. 간단하게 세션 ID(sid)와 세션 값(val)이 될텐데 이들의 형태(type)를 지정해주어야 한다.

 

마지막으로 open_session( ), save_session( ) 메서드에서 다룰 세션의 형태도 지정해주어야 한다. 코드로 세션을 다루려하면 세션을 지시하는 실체(객체)가 있어야 하기 때문이다.

 


 

세션 정보를 데이터베이스에 추가로 저장하기 위해서 해야할 일들을 순서대로 정리해보자.

 

①데이터베이스에 저장될 세션 데이터(= 세션의 데이터베이스 모델)를 정의한다.

②프로그램에서 다루게 될 세션(= 세션 클래스)을 정의한다.

③플라스크의 open_session( ), save_session( ) 메서드를 재정의 한다.

 

 

실제 코드를 보기 전 까지는 감이 잘 안 오는 것이 정상이다. 경험해보지 않은 일을 그 누구도 미리 알 수 없기 때문에 당연한 일이다. 이어지는 내용에서 실제 파이썬 코드로 구현하면서 구체적으로 살펴보자.

 

댓글