서블릿에서 Tomcat 커넥션 풀을 이용한 MariaDB 연동 방법

서블릿에서 Tomcat 커넥션 풀을 이용한 MariaDB 연동 방법

서블릿을 사용하여 데이터베이스와 연동할 때, 매번 연결을 새로 생성하는 것은 성능상 비효율적입니다. 이를 해결하기 위해 커넥션 풀(Connection Pool)을 설정하여 데이터베이스 연결을 재사용할 수 있습니다. 이번 글에서는 Tomcat에서 커넥션 풀을 설정하는 방법과 서블릿에서 이를 활용하는 방법을 알아보겠습니다.

1. Tomcat에서 커넥션 풀 설정하기

Tomcat에서는 데이터베이스와의 연결을 효율적으로 관리하기 위해 context.xml 파일을 수정하여 커넥션 풀을 설정할 수 있습니다. 해당 설정을 Tomcat 전체 또는 특정 애플리케이션에 적용할 수 있습니다.

1.1. Tomcat 전체에 커넥션 풀 설정

Tomcat 서버 전체에 적용하기 위해서는 $CATALINA_BASE/conf/context.xml 파일을 수정하여 다음과 같이 설정을 추가합니다.

<Context>
    <Resource name="jdbc/BlueShareDB" 
              auth="Container" 
              type="javax.sql.DataSource" 
              maxTotal="20" 
              maxIdle="10" 
              maxWaitMillis="-1"
              username="blueshare" 
              password="qwaszx1!" 
              driverClassName="org.mariadb.jdbc.Driver"
              url="jdbc:mariadb://localhost:3307/school"/>
</Context>

1.2. 특정 애플리케이션에 커넥션 풀 설정

특정 애플리케이션에만 적용하고 싶다면, META-INF/context.xml 파일을 생성하여 같은 설정을 추가할 수 있습니다. 이 방법은 개별 애플리케이션에 맞춤형 설정을 적용할 수 있어 유연합니다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="jdbc/BlueShareDB" 
              auth="Container" 
              type="javax.sql.DataSource" 
              maxTotal="20" 
              maxIdle="10" 
              maxWaitMillis="-1"
              username="blueshare" 
              password="qwaszx1!" 
              driverClassName="org.mariadb.jdbc.Driver"
              url="jdbc:mariadb://localhost:3307/school"/>
</Context>
context.xml 설정 적용 예시 화면

2. 속성 값 설명

  • name: JNDI 이름으로, 서블릿에서 lookup 메서드를 통해 이 리소스를 찾을 때 사용됩니다.
  • auth: “Container”로 설정하면 Tomcat에서 이 리소스의 관리를 담당합니다.
  • type: 리소스의 타입을 지정하며, 커넥션 풀에서는 javax.sql.DataSource를 사용합니다.
  • maxTotal: 커넥션 풀에서 사용할 수 있는 최대 연결 수를 설정합니다.
  • maxIdle: 풀에서 유휴 상태로 유지할 수 있는 최대 연결 수를 설정합니다.
  • maxWaitMillis: 연결 요청 시 사용할 수 있는 연결이 없을 때 기다릴 최대 시간(밀리초)을 설정합니다.
  • username: 데이터베이스에 접속할 때 사용할 사용자 이름입니다.
  • password: 데이터베이스 접속 비밀번호입니다.
  • driverClassName: JDBC 드라이버의 클래스 이름을 설정합니다. MariaDB의 경우 org.mariadb.jdbc.Driver를 사용합니다.
  • url: 데이터베이스 연결 URL을 지정하며, 데이터베이스의 호스트, 포트, 데이터베이스 이름을 포함합니다.

3. 서블릿에서 커넥션 풀 사용하기

커넥션 풀 설정이 완료되면 서블릿에서 InitialContextlookup 메서드를 사용하여 데이터베이스 연결을 가져올 수 있습니다.

예제 코드

package com.bluesharehub;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@WebServlet("/connectionPoolExample")
public class ConnectionPoolServlet extends HttpServlet {

    private DataSource dataSource;

    @Override
    public void init() throws ServletException {
        try {
            Context context = new InitialContext();
            dataSource = (DataSource) context.lookup("java:comp/env/jdbc/BlueShareDB");
        } catch (Exception e) {
            throw new ServletException("DB 커넥션 풀을 찾을 수 없습니다.", e);
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        try (PrintWriter out = response.getWriter();
             Connection conn = dataSource.getConnection();
             PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users");
             ResultSet rs = stmt.executeQuery()) {

            out.println("<h1>사용자 목록</h1>");
            out.println("<ul>");
            while (rs.next()) {
                out.println("<li>" + rs.getString("username") + "</li>");
            }
            out.println("</ul>");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

실행 결과

서블릿에서 커넥션 풀 사용 예제 코드 실행 결과 화면

위의 코드를 실행하면 커넥션 풀을 통해 데이터베이스와 연결을 효율적으로 관리할 수 있으며, 사용자 목록이 출력됩니다.

함께 보면 좋은 이전 게시글

위로 스크롤