Intro

IntelliJ에서 알고리즘/프로젝트 하다가 eclipse로 코드를 뚝딱뚝딱 거리고 있으니 버티질 못하겠습니다. JSP에서 방향키로 커서를 옮길 때 간헐적으로 느려짐 현상이 대체 왜 발생하는 건데...
음, JSP를 복습하는 것에는 딱히 불만은 없습니다. 네이버에서도 Legacy한 코드를 많이 다룬다고 본 거 같기도 하고.
이번 포스트에서는 정말 정말 간단하게 JDBC를 연결해보고 MyBatis로 넘어갈 겁니다.

Java DataBase Connectivity. JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API 입니다. 데이터베이스에서 자료를 쿼리 하거나 업데이트하는 방법을 제공하죠.
연결 테스트만 해볼 것이니 일단 사전 작업부터 들어갑시다. 의존성을 추가합시다.
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.4.0</version>
</dependency>
</dependencies>
DB 연결을 위한 mysql-connector-j와 javax.servlet-api 의존성을 추가했습니다.
참고로 javax.servlet-api 의존성은 ...
Java 서블릿을 사용한 웹 애플리케이션을 개발할 때 javax.servlet.* 패키지의 클래스를 사용하기 위해 필요합니다. 이 라이브러리를 프로젝트에 추가하면 서블릿 API의 표준 기능을 사용할 수 있게 되어, 특정 웹 애플리케이션 서버(WAS)에 종속되지 않고 표준화된 웹 프로그램을 개발할 수 있습니다. 일반적으로 서블릿 API는 WAS에 포함되어 제공되므로, 개발 시에는 javax.servlet-api 라이브러리를 추가하고, 빌드할 때는 포함되지 않도록 provided 스코프를 사용하기도 합니다. 프로젝트에 javax.servlet-api 의존성이 추가되지 않았을 때 javax.servlet.ServletException과 같은 import 오류가 발생합니다. 이 경우 build.gradle이나 pom.xml에 해당 의존성을 추가하여 문제를 해결할 수 있습니다.
라고 합니다.
일단 지금까지는 없어도 문제는 없었습니다.
하지만 터미널에서 mvn clean package와 같은 명령어를 실행할 때 문제가 발생하니 추가하는 걸 권장합니다.
본론
JDBC 연결 테스트
먼저, src/main/java 디렉토리에 DBTestServlet.java를 생성합니다.
HttpServlet Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site. A subclass of HttpServlet must override at least one method, usually one of these: doGet, if the servlet supports HTTP GET requests doPost, for HTTP POST requests doPut, for HTTP PUT requests doDelete, for HTTP DELETE requests init and destroy, to manage resources that are held for the life of the servlet getServletInfo, which the servlet uses to provide information about itself.
그 후, HttpServlet을 상속받을 것인데, 하위 클래스는 반드시 최소 한 개 이상의 메서드를 override 해야 합니다.

doGet 메서드를 오버라이딩 해봅시다.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
@WebServlet("/db-test")
public class DBTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain; charset=UTF-8");
String url = "jdbc:mysql://localhost:3306/testdb"
+ "?serverTimezone=Asia/Seoul"
+ "&characterEncoding=UTF-8"
+ "&useSSL=false";
String user = "user";
String pass = "password";
try (PrintWriter out = resp.getWriter()) {
Class.forName("com.mysql.cj.jdbc.Driver");
try (Connection con = DriverManager.getConnection(url, user, pass);
PreparedStatement ps = con.prepareStatement("SELECT 1");
ResultSet rs = ps.executeQuery()) {
rs.next();
out.println("DB 연결 OK, SELECT 1 결과: " + rs.getInt(1));
}
} catch (Exception e) {
e.printStackTrace();
resp.getWriter().println("DB 연결 실패: " + e.getMessage());
}
}
}
WebServlet 어노테이션으로 /db-test 경로에 매핑하였습니다. 사전에 mysql에 생성해둔 testdb에 접속한 후, 간단한 쿼리를 실행하였습니다. 그 후, /db-test로 들어가보면..

DB 연결에 성공했고, 쿼리 실행도 성공한 결과를 볼 수 있습니다.
MyBatis

마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇 가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해 준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO(Plain Old Java Objects)를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
"SQL Mapper → 객체(class)와 테이블을 Mapping 하는 게 아닌 SQL과 Mapping"
MyBatis는 Query를 직접 작성해야 하는데 그 덕에 복잡한 쿼리에 문제가 없습니다. 직접 쿼리문을 작성하면 되니까요.
하지만 RDB에 종속적이다! 라는 단점도 존재합니다.
JPA의 편리함에 이 녀석을 잊고 살고 있었는데 다시 만나게 됐네요!
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.19</version>
</dependency>
일단 제일 먼저 해야 할 것은 MyBatis 의존성을 추가해 주는 것. 최신 버전으로 들고 왔습니다.
MySQL도 최신 버전으로 재설치를 했기 때문.
그리고 MyBatis를 사용하기 위해서는 2가지의 xml이 필요합니다.
mybatis 환경설정을 담당하는 mybatis-config.xml과 sql 매핑을 담당하는 mapper.xml 파일이죠.
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/HealthMapper.xml"/>
</mappers>
</configuration>
db 연결과 관련된 value들은 따로 properties 파일을 만들어 빼내었습니다.
보안성 + 관리하기 쉽게 만들기 라는 이유도 있지만, & 문자 처리를 이상하게 하길래 그리하였습니다.
HealthMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.madirony.health.HealthMapper">
<select id="ping" resultType="int">
SELECT 1
</select>
</mapper>
꽤 익숙한 쿼리죠? 위에서 JDBC 연결 및 쿼리 테스트할 때, Health Check 용도로 사용한 쿼리입니다.
HealthMapper.java
package com.madirony.health;
public interface HealthMapper {
Integer ping();
}
매퍼 인터페이스까지 같이 만들어줍시다. 위에서 작성한 mapper.xml과 연결되는 인터페이스입니다.
MyBatisTestServlet.java
package com.madirony.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.ibatis.session.SqlSession;
import com.madirony.config.MyBatisUtil;
import com.madirony.health.HealthMapper;
@WebServlet("/mb-test")
public class MyBatisTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain; charset=UTF-8");
try (PrintWriter out = resp.getWriter();
SqlSession s = MyBatisUtil.openSession(true)) {
Integer v = s.getMapper(HealthMapper.class).ping();
out.println("MyBatis OK, SELECT 1 => " + v);
} catch (Exception e) {
resp.setStatus(500);
e.printStackTrace();
resp.getWriter().println("MyBatis 에러: " + e.getMessage());
}
}
}
마지막으로 테스트 서블릿을 작성해서 MyBatisUtil을 통해 DB에 연결하고, 쿼리를 실행해 봅시다.

MyBatis 역시 쿼리 실행에 성공하였습니다!
다음 포스트에서 세션 기반 로그인을 만들어 볼까요-!
P.S.
이클립스에 MyBatis DTD 설정을 편하게 할 수 있는 방법이 있긴한데, 따로 적어두진 않았습니다.
참고로 어떤 기술이든지 모든 해법은 공식 문서에 들어있습니다.
https://mybatis.org/mybatis-3/ko/getting-started.html
마이바티스 3 | 시작하기 – mybatis
mybatis.org
'Study > Java' 카테고리의 다른 글
| [JSP] 게시판 만들기 (0) | 2025.09.10 |
|---|---|
| [JSP] 세션 기반 로그인과 회원가입을 만들어보자 (0) | 2025.09.09 |
| [JSP] JSP와 친해지기 (0) | 2025.09.09 |
| [JSP] Java/JSP 프로젝트를 위한 eclipse 환경 설정 (0) | 2025.09.08 |
| [Java] HashMap의 데이터 관리?! Linked List와 Red-Black Tree의 전환 과정! (7) | 2024.12.01 |