[java] 서블릿과 데이터베이스 트랜잭션 처리

개요

서블릿은 Java 언어를 이용하여 웹 애플리케이션 개발에 사용되는 기술이다. 데이터베이스와의 상호작용은 웹 애플리케이션에서 매우 중요한 부분이다. 특히, 데이터베이스 트랜잭션 처리는 데이터의 일관성과 안전을 보장하기 위해 필수적으로 수행되어야 한다.

이 문서에서는 Java Servlet과 데이터베이스 트랜잭션 처리에 대해 알아보고, 예제 코드를 통해 실제 구현 방법을 살펴본다.

데이터베이스 트랜잭션

데이터베이스 트랜잭션은 데이터베이스에서 수행되는 작업 단위를 의미한다. 여러 개의 쿼리가 하나의 논리적인 작업을 수행하기 위해 함께 묶여있는 것을 말한다.

트랜잭션은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 영속성(Durability)의 ACID 특성을 만족해야 한다. 원자성은 트랜잭션의 모든 작업이 전부 성공하거나 전부 실패하여야 한다는 것을 의미한다. 일관성은 트랜잭션이 수행되기 전과 후에 데이터베이스의 일관성이 유지되어야 한다는 것이다.

서블릿과 트랜잭션 처리

서블릿은 웹 애플리케이션에서 클라이언트 요청에 대한 처리를 담당하는 Java 클래스이다. 서블릿에서 데이터베이스와의 상호작용을 처리하기 위해서는 트랜잭션 처리가 필요하다.

서블릿에서 트랜잭션을 처리하기 위해서는 다음과 같은 단계를 따를 수 있다.

  1. 데이터베이스 연결 설정
  2. 트랜잭션 시작
  3. 데이터베이스 작업 수행
  4. 성공적인 작업 완료시 트랜잭션 커밋, 실패시 롤백
  5. 데이터베이스 연결 종료

이제 실제 예제 코드를 통해 서블릿에서의 트랜잭션 처리 방법을 살펴보자.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class MyServlet extends HttpServlet {
  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 1. 데이터베이스 연결 설정
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
            
            // 2. 트랜잭션 시작
            conn.setAutoCommit(false);
            
            // 3. 데이터베이스 작업 수행
            stmt = conn.createStatement();
            stmt.executeUpdate("INSERT INTO users (name, email) VALUES ('John', 'john@example.com')");
            stmt.executeUpdate("UPDATE users SET email = 'john@example.org' WHERE name = 'John'");
            
            // 4. 트랜잭션 완료
            conn.commit();
        } catch (SQLException e) {
            // 트랜잭션 롤백
            try {
                if (conn != null) {
                    conn.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            // 5. 데이터베이스 연결 종료
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        response.getWriter().println("Transaction completed");
    }
}

위의 예제 코드에서는 getConnection() 메서드를 통해 데이터베이스에 연결을 설정하고, setAutoCommit(false) 메서드를 통해 트랜잭션 시작을 설정한다. 데이터베이스 작업은 executeUpdate() 메서드를 통해 수행되고, 트랜잭션 성공시 commit() 메서드를 호출하여 커밋한다.

만약 트랜잭션 도중에 예외가 발생하면, SQLException이 발생하게 되고 예외 처리 과정에서 rollback() 메서드를 호출하여 롤백한다.

마지막으로, 데이터베이스 연결을 종료하는 과정에서 close() 메서드를 호출하여 연결을 닫는다.

결론

서블릿과 데이터베이스 트랜잭션 처리는 웹 애플리케이션에서 중요한 부분이다. ACID 특성을 만족하는 트랜잭션을 작성하여 데이터의 일관성과 안정성을 보장할 수 있다. 예제 코드를 통해 서블릿에서의 트랜잭션 처리 방법을 알아보았다.

참고 자료