WAS DB 연결해보기 (JSP)

polyard·2024년 12월 10일

Connection Pool


출처 : https://programmer93.tistory.com/74

보통 Connection 하나당 트랜잭션 하나를 관리합니다.

Connection pool이란 미리 Connection 을 만들어놓고 필요한 애플리케이션에 전달하여 사용하는 방법이고

JDBC Framework 에서 close 가 이루어지면 Connection 을 Connection Pool 에 반납하게 됩니다.

즉, 커넥션을 모두 사용하고 나서 반납할 시점이 올 경우

해당 커넥션을 TCP/IP 통신을 끊는 것이 아니라 다른 요청에도 사용 가능하도록 해당 커넥션을 그대로 커넥션 풀에 반납하는 것입니다.

Connection 과정은 상당히 부담되는 작업입니다.
따라서 서버 자원의 낭비가 발생할 수 있습니다.

DataSource

javax.sql.DataSoure 라는 인터페이스는 Connection Pool을 관리하는 목적으로 사용되는 객체입니다.

이 Datasource 인터페이스는 외부 데이터 저장소에 접근할 수 있도록 해주는 객체나 설정을 의미합니다.

다양한 형태의 데이터를 가져오거나 DB Connection Pool 을 관리할 때 사용합니다.

JDBC

JDBC(Java Database Connectivity)란?

JDBC는 Java에서 데이터베이스(DB)와 연결하기 위한 표준 API입니다.
JDBC를 사용하면 Java 애플리케이션에서 SQL을 실행하여 DB의 데이터를 조회하거나 변경할 수 있습니다.

하지만 기본적인 JDBC 사용 방식에는 단점이 있습니다:

DriverManager.getConnection()을 호출할 때마다 새로운 DB 연결을 생성해야 합니다.
DB 연결(Connection)을 생성하고 닫는 비용이 큽니다.
트래픽이 증가하면 성능 저하 발생합니다.

이러한 문제를 해결하기 위해 등장한 것이 DBCP (Database Connection Pool) 입니다.

DBCP

DBCP는 미리 일정 개수의 DB Connection을 생성해두고 재사용하는 기술입니다.

DBCP 라이브러리 예시

  • HikariCP
  • HandOfQueue
  • Tomcat JDBC Connection Pool

DBCP의 장점은

  • DB 연결 재사용하여 성능을 향상시킵니다.
  • DB 연결 개수 제한이 가능하여 DB 부하를 방지합니다.

즉, 실제 WAS에서 DB를 사용할 때는 JDBC를 직접 사용하기보다는 DBCP를 통해 Connection을 관리하는 것이 일반적입니다.


본격적으로 WAS(tomcat)과 DB(mariaDB) 연결하기

앞에서 이론적인 내용을 살펴봤습니다.

이제 직접 리눅스에서 tomcat과 데이터베이스를 연결해볼거에요.

Podman 컨테이너를 사용할겁니다.
tomcat과 mariadb 컨테이너를 각각 생성해서 같은 podman network에 연결해주고 진행할 거에요.

mariadb-java-client-3.5.0.jar 를 공식홈페이지에서 다운받습니다.

$ wget https://downloads.mariadb.com/Connectors/java/connector-java-3.5.0/mariadb-java-client-3.5.0.jar

우선 context.xml 을 작성합니다.

<Context>
    <Resource auth="Container" 
              name="jdbc/MyDB"
              type="javax.sql.DataSource"
              driverClassName="org.mariadb.jdbc.Driver"
	      url="jdbc:mariadb://temp_data:3306/main" 
              username="dbuser"
              password="1234"   
              initialSize="5"
              maxTotal="30"
              maxIdle="15"
              maxWaitMillis="10000"/>
</Context>
- auth : Container가 기본값이며, Tomcat 자체에서 직접 JNDI 리소스를 관리한다는 의미.
- name : JDBC 이름, 변경 가능
- driverClassName : JDBC 드라이버
- type : 웹에서 이 리소스(ontext.xml 에 작성된 내용)를 사용할 때 DataSource 객체로 리턴됨
- username : 접속계정
- password : 접속할 계정 비밀번호

- initalSize : tomcat 이 시작될 때 미리 5개의 Connection을 생성
- maxTotal : 동시에 사용할 수 있는 최대 커넥션의 개수
- maxIdle : Connection Pool에 반납할 때 최대로 유지될 수 있는 커넥션 개수
- maxWaitMillis : Connection 객체가 없는 경우 대기하는 최대 시간(ms)
  • type 보충
    • 애플리케이션이 javax.naming.InitialContext.lookup() 을 사용해 JNDI에서 가져올 때, DataSource 객체로 반환됨. (애플리케이션에서 JNDI를 통해 DB 연결을 쉽게 가져옴)
    • Tomcat의 JNDI 에서 "jdbc/MyDB" 를 찾으면 DataSource 타입으로 반환됨.
    • context.xml 에서 type=javax.sql.DataSource 가 설정되지 않았다면, lookup() 시 오류가 발생할 수 있음

아래 index.jsp 참고


index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<html>
<body>
    <h1>Results</h1>
        <%
            try {
                javax.naming.Context initContext = new javax.naming.InitialContext();
                javax.sql.DataSource ds = (javax.sql.DataSource) initContext.lookup("java:comp/env/jdbc/MyDB");
                Connection conn = ds.getConnection();
                out.println("DB 연결 성공!");
                conn.close();
            } catch(Exception e) {
                out.print(e.toString());
            }
        %>
    </table>
</body>
</html>

1. initContext의 lookup메서드를 이용해서 "java:comp/env/jdbc/MyDB" 에 
해당하는 객체를 찾아서 ds에 삽입 

2. getConnection메서드를 이용해서 커넥션 풀로부터 커넥션 객체를 얻어내어 
conn변수에 저장

파일들을 저장할 경로입니다.

작성한 파일들의 경로 참고하기
https://velog.io/@hanseulg2/Tomcat-servercontext


/root/ 경로에서 was_DB라는 디렉토리를 생성한 후에 그 안에 파일을 담고 podman run 및 마운트를 진행하였습니다.

mariadb 컨테이너 생성

$ podman run -d --name temp_data --network podnet -p 13306:3306 -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=main -e MYSQL_USER=dbuser -e MYSQL_PASSWORD=1234 docker.io/library/mariadb

tomcat 컨테이너 생성

$ podman run -d --name temp_tomcat -p 18080:8080 -v /root/was_DB/context.xml:/usr/local/tomcat/webapps/myapp/META-INF/context.xml:z -v /root/was_DB/index.jsp:/usr/local/tomcat/webapps/myapp/index.jsp:z -v /root/was_DB/mariadb-java-client-3.5.0.jar:/usr/local/tomcat/lib/mariadb-java-client-3.5.0.jar:z --network podnet docker.io/library/tomcat:latest

tomcat 컨테이너 내부의 경로에 작성한 파일들을 마운트하였습니다.

  • /usr/local/tomcat/webapps/myapp/META-INF/context.xml
  • /usr/local/tomcat/webapps/myapp/index.jsp
  • /usr/local/tomcat/lib/mariadb-java-client-3.5.0.jar

이렇게 3개의 경로를 마운트 해줬습니다.

브라우저에 접속해서 DB 연결을 잘 확인했습니다.

Reference

profile
안녕하세요

0개의 댓글