Tomcat MariaDB 연동은 WAS가 데이터베이스에서 읽어 온 동적 데이터를 웹 화면에 띄우기 위한 단계다. 앞서 구성한 WEB-WAS 구조(Apache 또는 NginX + Tomcat)에 데이터베이스 계층을 더해 WEB-WAS-DB 3-Tier를 완성하는 작업이라고 보면 된다. 이 글은 RHEL 8에서 MariaDB 10.6을 설치하고, MariaDB 사용자·DB를 만든 뒤, MariaDB JDBC 드라이버를 톰캣에 배치해 JSP·JNDI DataSource 양쪽 방식으로 접속을 확인하는 과정까지 정리한다.
시작 전에 WEB-WAS 연동이 끝나 있어야 한다. Apache-Tomcat 연동 또는 NginX-Tomcat 연동 중 어느 방식이든 상관없다. WAS인 Tomcat과 DB가 연동되어 웹에 데이터가 나타나게 하는 것이 목표다.
전체 흐름 한눈에 보기
Tomcat MariaDB 연동은 아래 순서로 진행한다. 각 단계를 차례대로 따라가면 된다.
- 준비 — MariaDB 설치 + JDBC 드라이버(mariadb-java-client.jar) 확보
- MariaDB 사용자·DB 생성 — 테스트 DB·테이블과 접속 계정·권한
- 드라이버 배치 — jar를
$CATALINA_HOME/lib에 복사 - Tomcat DataSource 설정 — context.xml의 JNDI
<Resource> - web.xml 참조 —
<resource-ref>로 DataSource 선언 - 연동 테스트 — JSP에서 접속 확인
1. 준비: MariaDB 설치와 드라이버
MariaDB 저장소 설정과 설치
MariaDB 공식 사이트의 안내대로 yum 저장소를 등록한다. /etc/yum.repos.d/MariaDB.repo 파일을 만들고 사용할 버전(여기서는 10.6)의 baseurl을 넣는다.
cd /etc/yum.repos.d
vi MariaDB.repo
# MariaDB.repo 내용
[mariadb]
name = MariaDB
baseurl = https://rpm.mariadb.org/10.6/rhel/$releasever/$basearch
gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1
module_hotfixes = 1
저장소 캐시를 갱신하고 MariaDB 서버를 설치한 뒤, 서비스를 기동·자동 시작 등록한다.
# 저장소 갱신
yum clean all
yum repolist all
# 설치
yum -y install MariaDB-server MariaDB-client
# 서비스 기동 + 자동 시작
systemctl start mariadb
systemctl enable mariadb
systemctl status mariadb
기본 보안 설정
설치 후 mariadb-secure-installation으로 기본 보안 설정을 진행한다. 이 작업은 DB가 기동 중인 상태에서 실행해야 한다. root 비밀번호 설정, 익명 사용자 제거, 원격 root 로그인 차단, 테스트 DB 제거를 순서대로 적용한다.
mariadb-secure-installation # 명령 실행
Enter current password for root (enter for none): (엔터)
OK, successfully used password, moving on...
Switch to unix_socket authentication [Y/n] y
Enabled successfully!
Reloading privilege tables.. ... Success!
Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Remove anonymous users? [Y/n] y ... Success!
Disallow root login remotely? [Y/n] y ... Success!
Remove test database and access to it? [Y/n] y
- Dropping test database... ... Success!
- Removing privileges on test database... ... Success!
Reload privilege tables now? [Y/n] y ... Success!
설정이 끝났으면 MariaDB에 접속해 status로 서버 상태를 확인한다.
mysql -u root -p
mariadb -u root -p # 이렇게 접속해도 된다
MariaDB [(none)]> status
--------------
mariadb Ver 15.1 Distrib 10.6.15-MariaDB, for Linux (x86_64) using readline 5.1
Current user: root@localhost
Server version: 10.6.15-MariaDB MariaDB Server
Connection: Localhost via UNIX socket
Uptime: 57 min 13 sec
MariaDB JDBC 드라이버 받기
Tomcat이 MariaDB에 접속하려면 자바용 JDBC 드라이버인 MariaDB Connector/J(mariadb-java-client-x.y.z.jar)가 필요하다. 아래 공식 페이지에서 jar 파일을 내려받는다. 드라이버 클래스명은 org.mariadb.jdbc.Driver이고, MySQL 데이터베이스에도 그대로 쓸 수 있다.
- 공식 다운로드: https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector
- 설치 가이드: MariaDB Connector/J 설치 문서
2. MariaDB 사용자·DB 생성
연동을 확인할 테스트 DB(test1)와 테이블(table1)을 만들고 샘플 데이터를 넣는다. 그리고 Tomcat이 접속할 때 쓸 전용 계정을 만들어 해당 DB 권한만 부여한다.
mysql -u root -p
Enter password: (root 암호 입력)
# DB 생성
MariaDB [(none)]> CREATE DATABASE test1 CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.001 sec)
# Tomcat 접속 전용 계정 생성 + test1 DB에만 권한 부여
MariaDB [(none)]> CREATE USER 'tomcat'@'localhost' IDENTIFIED BY 'StrongPass!23';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON test1.* TO 'tomcat'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
# 생성한 DB로 이동 후 테이블 생성 + 데이터 입력
MariaDB [(none)]> USE test1;
Database changed
MariaDB [test1]> CREATE TABLE table1 (id VARCHAR(20) PRIMARY KEY, pw VARCHAR(20));
Query OK, 0 rows affected (0.031 sec)
MariaDB [test1]> INSERT INTO table1 (id, pw) VALUES ('admin', 'admin123');
Query OK, 1 row affected (0.001 sec)
MariaDB [test1]> SELECT * FROM table1;
+-------+----------+
| id | pw |
+-------+----------+
| admin | admin123 |
+-------+----------+
실습 환경에서는 root 계정에 'root'@'%' 형태로 전체 권한을 주고 진행해도 동작은 한다. 다만 운영 환경에서는 위처럼 접속 전용 계정 + 해당 DB만 권한이 원칙이다. 외부(다른 서버)에서 접속해야 하면 계정 호스트를 '%'나 특정 IP로 지정하고, /etc/my.cnf.d/server.cnf의 bind-address를 0.0.0.0으로 열어 3306 포트를 방화벽에서 허용해야 한다.
# 외부 접속이 필요할 때만
# /etc/my.cnf.d/server.cnf → [mysqld] 섹션
bind-address = 0.0.0.0
# 방화벽에서 3306 허용
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
3. JDBC 드라이버를 Tomcat에 배치
받은 jar 파일을 $CATALINA_HOME/lib(톰캣 설치 경로의 lib 디렉터리)에 복사한다. 멀티 인스턴스 구성이라면 각 인스턴스의 lib에 모두 넣어 준다. 드라이버는 특정 웹 애플리케이션(WEB-INF/lib)이 아니라 톰캣 공용 lib에 있어야 컨테이너가 DataSource를 생성할 때 드라이버를 찾을 수 있다.
# jar 파일 복사 (버전은 받은 파일명에 맞춘다)
cp -arp mariadb-java-client-2.7.10.jar /home/tomcat1/apache-tomcat-10.1.16/lib
cp -arp mariadb-java-client-2.7.10.jar /home/tomcat2/apache-tomcat-10.1.16/lib
4. Tomcat DataSource(JNDI) 설정
접속 정보를 JSP 안에 매번 적는 대신, 톰캣이 커넥션 풀을 관리하도록 JNDI DataSource를 설정하는 것이 정석이다. context.xml에 <Resource>를 추가한다. 애플리케이션 단위로 적용하려면 해당 앱의 META-INF/context.xml에, 톰캣 전역으로 적용하려면 $CATALINA_HOME/conf/context.xml에 넣으면 된다.
<!-- context.xml -->
<Context>
<Resource name="jdbc/test1"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mariadb://localhost:3306/test1"
username="tomcat"
password="StrongPass!23"
maxTotal="100"
maxIdle="30"
maxWaitMillis="10000" />
</Context>
각 속성의 의미는 다음과 같다.
| 속성 | 의미 |
|---|---|
| name | JNDI 이름. web.xml의 res-ref-name과 일치해야 함 |
| auth | Container — 컨테이너(톰캣)가 인증을 관리 |
| type | javax.sql.DataSource — DataSource 타입 고정 |
| driverClassName | MariaDB 드라이버 클래스 org.mariadb.jdbc.Driver |
| url | 접속 URL jdbc:mariadb://호스트:3306/DB명 |
| username / password | 앞서 만든 접속 계정·비밀번호 |
| maxTotal | 커넥션 풀 최대 연결 수 |
| maxIdle | 유휴 상태로 유지할 최대 연결 수 |
| maxWaitMillis | 연결 대기 최대 시간(ms) |
전역 리소스로 등록하고 여러 앱이 참조하게 하려면 server.xml의 <GlobalNamingResources>에 같은 <Resource>를 넣고, context.xml에서는 <ResourceLink>로 연결하는 방식도 있다. 단일 앱이라면 위의 context.xml 방식이 가장 단순하다.
5. web.xml에서 DataSource 참조
애플리케이션이 위 리소스를 사용하겠다고 WEB-INF/web.xml에 선언한다. res-ref-name 값은 context.xml의 Resource name과 정확히 같아야 한다. 이름이 어긋나면 드라이버가 정상 배치돼 있어도 JNDI 조회(lookup)에 실패한다.
<!-- WEB-INF/web.xml -->
<resource-ref>
<description>MariaDB test1 DataSource</description>
<res-ref-name>jdbc/test1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
6. 연동 테스트 (JSP)
방법 A — JNDI DataSource로 조회
설정한 DataSource를 lookup해서 커넥션을 얻고, table1을 조회하는 JSP다. 톰캣의 webapps/ROOT/index.jsp에 작성하면 된다. 표준 JNDI 경로는 java:comp/env/ + 리소스 이름이다.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="javax.naming.*, javax.sql.DataSource, java.sql.*" %>
<html><head><title>DB Test</title></head><body>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test1");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, pw FROM table1");
out.println("<h1>MariaDB 연결 성공</h1><ul>");
while (rs.next()) {
out.println("<li>" + rs.getString("id") + " / " + rs.getString("pw") + "</li>");
}
out.println("</ul>");
rs.close(); stmt.close(); conn.close();
%>
</body></html>
방법 B — DriverManager로 직접 접속(간단 확인용)
DataSource 설정 없이 드라이버 배치만으로 빠르게 확인하고 싶다면 DriverManager로 직접 접속해도 된다. 다만 접속 정보가 코드에 노출되고 커넥션 풀을 못 쓰므로, 실제 서비스에는 방법 A를 권장한다.
<%@ page import="java.sql.DriverManager, java.sql.Connection" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html><head><title>Test</title></head><body>
<%
String url = "jdbc:mariadb://localhost:3306/test1"; // 앞에서 만든 DB명
String id = "tomcat"; // 접속 계정
String pw = "StrongPass!23"; // 계정 암호
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, id, pw);
out.println("<h1>MariaDB DB 연결 성공</h1>");
conn.close();
%>
</body></html>
톰캣을 재기동하고 브라우저로 접속해 아래처럼 “MariaDB DB 연결 성공” 화면이 뜨면 연동이 완료된 것이다.

자주 막히는 지점 — 트러블슈팅
- Cannot load driver class: org.mariadb.jdbc.Driver — jar가
WEB-INF/lib에만 있고$CATALINA_HOME/lib에 없을 때 자주 난다. DataSource를 컨테이너가 만들므로 드라이버는 톰캣 공용 lib에 두고, 복사 후 톰캣을 재기동한다. - Name [jdbc/test1] is not bound / NameNotFoundException — context.xml의
Resource name과 web.xml의res-ref-name이 다르거나, lookup 경로에서java:comp/env/접두어가 빠진 경우다. - Access denied for user — DB 계정·비밀번호 오타이거나, 외부 접속인데 계정 호스트(
'tomcat'@'localhost'vs'%')가 맞지 않는 경우다.GRANT후FLUSH PRIVILEGES를 잊지 않는다. - Connection refused / 외부에서 접속 불가 — MariaDB
bind-address가127.0.0.1로 잠겨 있거나 3306 포트가 방화벽에 막혀 있는 경우다.
자주 묻는 질문
JSP에 직접 접속 코드를 쓰면 안 되나?
동작은 한다(방법 B). 다만 접속 정보가 소스에 노출되고 요청마다 새 커넥션을 맺어 성능이 떨어진다. 운영에서는 JNDI DataSource(방법 A)로 커넥션 풀을 쓰는 것이 표준이다.
MySQL용 드라이버를 그대로 써도 되나?
MariaDB Connector/J는 MariaDB와 MySQL 양쪽에 호환되므로 MariaDB용 드라이버를 쓰면 된다. 이때 driverClassName은 org.mariadb.jdbc.Driver, URL은 jdbc:mariadb://... 형식을 사용한다.
정리
Tomcat MariaDB 연동은 ① MariaDB 설치·보안 설정, ② 접속 계정·DB 생성, ③ JDBC 드라이버(jar)를 $CATALINA_HOME/lib에 배치, ④ context.xml의 JNDI <Resource>와 web.xml의 <resource-ref> 설정, ⑤ JSP로 접속 확인의 순서로 끝난다. 핵심은 드라이버를 톰캣 공용 lib에 두고, context.xml과 web.xml의 리소스 이름을 일치시키는 것이다. 이것으로 WEB-WAS-DB까지 이어지는 3-Tier의 기본 형태가 완성된다. 같은 구조를 클라우드 위에 ALB·NLB로 확장하는 방법은 AWS에서 WEB-WAS 연동하기 글에서 이어서 볼 수 있다.



💬 댓글 0