[DB] 커넥션과 세션
최근 간단한 백엔드 서버를 만들어보면서 DB 커넥션과 세션의 개념을 알게 되어 정리해본다.
1. DB 커넥션
커넥션(Connection) 은 애플리케이션과 DB 간의 통신 채널이다. 애플리케이션과 DB간의 데이터를 주고받기 위해선 반드시 커넥션이 물리적으로 연결되어 있어야 한다.
특징
- 애플리케이션이 시작되면 커넥션이 열려야 한다. 애플리케이션이 종료되면 커넥션이 닫힌다.
- 커넥션을 열고 유지하는 것으로 자원을 소모한다.
- 미리 다수의 커넥션 객체를 만들어놓고, 필요료 할 때마다 커넥션을 재사용 할 수 있다. 이 것을 풀링(Pooling) 이라 한다.
- 하나의 커넥션은 하나의 사용자만 점유할 수 있다.
2. DB 세션
세션(Session) 은 커넥션이 이미 이루어진 이후의 상호작용이다. 특정 사용자 혹은 애플리케이션이 데이터베이스와 상호작용 하는 동안 유지되는 상태, 혹은 Context이다. 세션은 여러 요청과 트랜잭션을 포괄하는 논리적인 작업 단위이다. 이때 하나의 커넥션에는 하나의 세션만 존재할 수 있다.
특징
- 세션은 사용자의 상태 정보를 유지한다. (ex. 로그인 상태, 사용자 정보, 임시 데이터)
- 트랜잭션은 세션 내에서 관리된다. 데이터베이스와 관련된 일련의 작업들이 전부 성공하거나 실패하거나 둘 중 하나여야 하는 원자성(Atomicity) 을 보장한다.
- 세션은 시간이 지나면 자연스럽게 만료될 수 있다. 이 것으로 리소스를 효율적으로 관리한다.
3. 정리
DB 커넥션은 물리적인 연결을 의미하며, 데이터베이스와의 직접적인 통신 채널을 제공한다.
DB 세션은 논리적인 상태를 의미하며, 사용자 혹은 애플리케이션의 상태를 유지한다.
즉 세션은 커넥션에 종속되어 있으며, 커넥션이 종료된다면 세션도 자연히 종료되어야 한다.
4. 커넥션 풀
앞에서 잠깐 등장한 커넥션 풀에 대한 개념 정리이다.
커넥션 풀(Connection Pool) 이란 데이터베이스와의 연결을 효율적으로 관리하기 위한 기술이다. 매번 새로운 통신마다 새로운 커넥션을 생성, 종료하는 것은 성능 면에서 매우 비효율적이다. 그렇기 때문에 커넥션 풀에 미리 일정 숫자의 커넥션 인스턴스를 만들어 두고, 필요할 때마다 재사용한다. 일련의 Flow를 확인해보면…
- 커넥션 풀에 커넥션 객체를 미리 다수 만들어 놓는다. (커넥션1 ~ 커넥션N)
- 사용자의 요청(CRUD)이 들어온다면 커넥션 풀에서 커넥션을 하나 할당한다.
- 하나의 사용자에게 커넥션이 연결됐다면, 이후 요청은 세션을 주입받아 처리한다.
- 요청이 끝난다면 세션을 종료하고 커넥션을 커넥션 풀에 반환한다.
모든 사용자가 요청을 날리는 것이 아니기 때문에 웹의 사용자 숫자 ≠ 커넥션풀의 커넥션 이다.
만약 커넥션 풀 내의 모든 커넥션이 사용중이라면 다음 사용자는 사용중인 커넥션이 반환되기를 기다려야 한다.
5. 동시적인 요청에 대한 처리
커넥션과 세션에 대해 알아보다가 생긴 의문점도 정리해보자.
5.1 하나의 사용자가 동시에 여러 요청을 날리는 경우.
- 상황) 사용자A가 요청1을 수행하기 위해 커넥션풀에서 커넥션1을 할당받고, 세션1을 주입받아 요청을 진행중이다. 이때 커넥션1을 반환하지 않은 상태에서 동시에 요청2을 수행한다면?
- 결과) 하나의 커넥션엔 다수의 세션이 존재할 수 없으므로, 커넥션 풀에 커넥션 객체가 남아있다면 새로운 커넥션을 할당받는다.
5.2 다수의 사용자가 동시에 요청을 날리는 경우.
- 상황) 사용자A가 요청1을 수행하기 위해 커넥션풀에서 커넥션1을 할당받고, 세션1을 주입받아 요청을 진행중이다. 이때 커넥션1을 반환하지 않은 상태이고 커넥션풀에 남은 커넥션 객체가 없을때, 사용자B가 요청을 수행한다면?
- 결과) 하나의 커넥션엔 하나의 사용자만 존재할 수 있다. 즉 커넥션 A가 반환되지 않았다면, 사용자B는 다른 커넥션이 반환될 때 까지 기다려야 한다.