데이터베이스에서 세션(Session)은 클라이언트가 데이터베이스에 연결되어 있는 동안의 논리적인 작업 단위이다. 흔히 연결(Connection)과 혼동하기 쉬운데, 이 둘은 엄연히 다르다.
| Connection | Session | |
|---|---|---|
| 정의 | DB와 Client 간의 물리적 통신 경로 | Client가 연결을 통해 서버에서 작업을 수행하는 동안의 상태 |
| 기능 | 데이터 전송 및 명령 실행 | 상태 정보 유지, 트랜잭션 관리, 세션 변수 등 |
| 시작/종료 | Client가 서버에 접속할 때 설정되고, 작업 완료 시 종료 | 연결이 활성화된 동안 지속되며, 연결 종료 시 세션도 종료 |
| 고유 ID | 일반적으로 물리적 연결에 대한 ID는 없음 | 고유한 세션 ID로 구분 가능 |
| 상태 유지 | Stateless (상태를 기억하지 않음) | 트랜잭션 상태, 사용자 정보 등 상태를 유지 |
| 예시 | TCP/IP 연결 | MySQL 세션, ORM 세션 등 |
import java.sql.*;
public class JdbcSessionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
conn.setAutoCommit(false); // 트랜잭션 시작
String updateSql = "UPDATE users SET name = ? WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(updateSql)) {
pstmt.setString(1, "New Name");
pstmt.setInt(2, 1);
pstmt.executeUpdate();
conn.commit(); // 커밋
} catch (SQLException e) {
conn.rollback(); // 예외 발생 시 롤백
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
import jakarta.persistence.*;
public class JpaSessionExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); // 트랜잭션 시작
User user = em.find(User.class, 1);
user.setName("New Name");
tx.commit(); // 커밋
} catch (Exception e) {
tx.rollback(); // 예외 발생 시 롤백
e.printStackTrace();
} finally {
em.close(); // 세션 종료
emf.close();
}
}
}
Connection 객체가 DB와의 물리적 연결(Connection)을 나타냄
conn.setAutoCommit(false)는 트랜잭션을 시작하는 코드
이 커넥션이 닫히기 전까지 하나의 세션(Session)이 유지됨
이번 정리를 통해 DB에서의 Connection과 Session의 차이점을 명확하게 이해할 수 있었다.
특히 세션이 단순한 연결이 아니라 트랜잭션 관리와 상태 유지를 위한 논리적 단위라는 점이 인상 깊었다.
JDBC와 JPA에서 세션이 어떻게 다르게 사용되는지도 예제를 통해 직접 확인하면서, 앞으로 트랜잭션을 설계할 때 더 신중하게 접근해야겠다는 생각이 들었다.
ORM을 사용할수록 세션 개념이 더 중요해지기 때문에, 이번 개념 정리는 앞으로의 프로젝트에 큰 도움이 될 것 같다.