개요
일반적으로 게임 서버는 웹 서버와는 다르게 Stateful하게 동작합니다. 이럴 땐 어떻게 JDBC, Timeout 설정을 가져가야 할까요?
JDBC 이해하기
DataAccess 계층
- DataAccess 계층은 서버 애플리케이션 내에서 Repository 패턴 혹은 DAO 패턴을 통해 구현된 구현체를 의미합니다.
- 일반적으로 직접 SQL을 호출하는 방식보단 Persistence Framework(SQL 매퍼 방식의 MyBatis, JDBCTemplate 혹은 Hibernate 같은 ORM)을 사용해 데이터베이스를 다루는 것이 일반적입니다.

JDBC 구현 계층
- JDBC의 구현 계층은 아래 두 가지로 나뉩니다.
- DBMS 벤더에서 정의한 네트워크 프로토콜을 사용해 DB와 통신(물리적 연결 생성)하는 JDBC Driver
- JDBC 드라이버를 통해 생성된 연결을 관리(풀링)하는 DataSource
- 단순한 DriverManager에서 발전된 형태로 커넥션 풀링을 통한 효율성과 편리한 DB 연결을 보장합니다.
- JDBC 구현 계층의 DB 연결 및 관리 프로세스는 아래와 같습니다.

Timeout 이해하기
- JDBC Driver는 아까 벤더사의 네트워크 프로토콜을 통해 연결을 생성한다고 이야기했습니다. 이 때 사용되는 네트워크 프로토콜은 일반적으로 TCP/IP입니다. 즉 TCP 소켓을 통해 DB와 통신한다는 거죠.
- JDBC Driver는 TCP 소켓을 통해 네트워크 통신을 하기 때문에 TCP Socket Timeout에 대한 문제는 JDBC Driver에도 똑같이 적용됩니다.
- 소켓 통신에서 발생하는 타임아웃의 종류에는 Connection Timeout과 Socket Timeout이 존재합니다.
- Connection Timeout은 앤드포인트 사이에서 연결을 맺으려고 할 때 소요되는 시간의 임계치를 초과한 경우입니다. 말 그대로 커넥션을 맺기까지 어느정도까지 최대로 허용할 것인지를 정하고 이를 초과할 때 발생하는 것이죠.
- Socket Timeout은 Connection Timeout이 발생하지 않고 정상적으로 커넥션이 연결된 이후 발생합니다. 연결된 앤드포인트 사이에서 데이터를 주고 받을 때 개별 패킷이 전달될 때 소요되는 시간의 임계치를 초과한 경우입니다.
- Java 소켓에서는 Write Timeout을 제공하지 않습니다. 따라서 Java 소켓 통신에서의 Socket Timeout은 Read Timeout만을 의미합니다.