[java] 자바에서 MS-SQL DB 접속 및 데이터 처리 (with Mybatis)
Hello. #{Somebody}
마이바티스 MSSQL 데이터 가져오기
안녕하세요!😎
오늘은 답답한 SELECT 쿼리 날리는 대신, 마이바티스라는 멋진 친구를 이용해서 MSSQL DB에서 데이터를 가져오는 방법을 알아보려고 합니다. 😉

"왜 굳이 마이바티스를 써야 하냐고?"
혹시 순수한 JDBC 코드로 DB 연결하고 쿼리 날리고 결과 매핑하는 거 해보셨나요?
아마 몇 번 하다 보면 '아이고, 의미 없다!' 싶을 거예요.
반복되는 코드도 많고, SQL 쿼리랑 자바 코드가 섞여서 보기도 힘들고요. 😭
마이바티스는 이런 우리들의 고충을 싹 해결해 주는 아주 똑똑한 녀석이에요.
SQL 쿼리를 XML이나 어노테이션으로 분리해서 관리할 수 있게 해주고,
쿼리 결과도 우리가 원하는 자바 객체로 알아서 척척 변환해 줍니다.

1단계: 프로젝트에 마이바티스랑 MSSQL 관련 라이브러리 추가하기
일단 우리 프로젝트가 마이바티스를 쓸 수 있도록 준비를 해야겠죠? Maven이나 Gradle 같은 빌드 도구를 사용하고 있다면, 해당 설정 파일에 아래 의존성을 추가해 주세요.
Maven (pom.xml)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version> </dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.2.0.jre11</version> </dependency>
Gradle (build.gradle)
implementation 'org.mybatis:mybatis:3.5.11' // 최신 버전을 확인하고 넣어주세요
implementation 'com.microsoft.sqlserver:mssql-jdbc:12.2.0.jre11' // 사용하는 Java 버전에 맞는 최신 버전을 확인해주세요
의존성을 추가했으면, 프로젝트를 업데이트해서 라이브러리들을 다운로드 받아주세요!
2단계: 마이바티스 설정 파일 만들기 (mybatis-config.xml)
마이바티스가 어떻게 DB에 접속하고, 어떤 SQL 맵퍼 파일을 읽어야 하는지 등을 설정하는 아주 중요한 파일이에요.
보통 src/main/resources 폴더 밑에 mybatis-config.xml이라는 이름으로 만들어줍니다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=yourDatabaseName"/>
<property name="username" value="yourUsername"/>
<property name="password" value="yourPassword"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/> </mappers>
</configuration>
- <environments>: 여러 DB 환경 설정을 정의할 수 있어요. default 속성으로 기본 환경을 지정합니다.
- <environment>: 실제 DB 연결 정보를 설정하는 곳이에요.
- <transactionManager type="JDBC"/>: 트랜잭션 관리를 JDBC에게 맡기겠다는 설정입니다.
- <dataSource type="POOLED"/>: 커넥션 풀링을 사용하는 데이터 소스를 설정합니다.
- <property>: DB 연결에 필요한 정보 (드라이버 클래스, URL, 사용자 이름, 비밀번호)를 설정합니다. url 속성에는 실제 MSSQL 서버 주소, 포트, 데이터베이스 이름을 정확하게 넣어주셔야 해요!
- <mappers>: SQL 쿼리가 담긴 맵퍼 파일들을 등록하는 곳이에요. <mapper resource> 태그를 이용해서 맵퍼 파일의 경로를 지정합니다.
⚠️ 주의할 점: DB 연결 정보 (url, username, password)는 절대로 코드에 직접 하드코딩하지 마세요!
설정 파일이나 환경 변수 등을 이용해서 관리하는 것이 보안상 훨씬 안전합니다.
3단계: SQL 맵퍼 파일 만들기 (UserMapper.xml)
이제 실제로 SQL 쿼리를 작성할 차례예요. src/main/resources 폴더 밑에 com/example/mapper (이건 예시이고, 실제 패키지 구조에 맞게 만들어주세요) 폴더를 만들고, UserMapper.xml 파일을 생성해 볼게요.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectAllUsers" resultType="com.example.dto.User">
SELECT id, name, email
FROM users
</select>
<select id="selectUserById" parameterType="int" resultType="com.example.dto.User">
SELECT id, name, email
FROM users
WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.dto.User">
INSERT INTO users (name, email)
VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="com.example.dto.User">
UPDATE users
SET name = #{name}, email = #{email}
WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM users
WHERE id = #{id}
</delete>
</mapper>
- <mapper namespace>: 이 맵퍼 파일과 연결될 자바 인터페이스의 풀 패키지 명을 적어줍니다. 필수는 아니지만, 나중에 인터페이스를 이용하면 코드가 더 깔끔해져요.
- <select>, <insert>, <update>, <delete>: 각각 SELECT, INSERT, UPDATE, DELETE 쿼리를 정의하는 태그예요.
- id: 각 쿼리를 식별하는 고유한 이름입니다. 나중에 자바 코드에서 이 id를 이용해서 쿼리를 실행해요.
- parameterType: 쿼리에 전달될 파라미터의 타입을 지정합니다. 기본 자료형이나 우리가 만든 DTO (Data Transfer Object) 클래스 등을 사용할 수 있어요. #{} 안에 파라미터 이름을 적으면 마이바티스가 알아서 값을 매핑해 줍니다.
- resultType: SELECT 쿼리의 결과를 매핑할 자바 객체의 타입을 지정합니다. DB 컬럼명과 DTO 클래스의 필드명이 같으면 자동으로 매핑해 줘요.
4단계: SQL 맵퍼 인터페이스 만들기 (UserMapper.java)
맵퍼 XML 파일과 연결될 자바 인터페이스를 만들어줍니다. 이 인터페이스를 통해서 우리가 작성한 SQL 쿼리를 호출할 수 있어요. src/main/java/com/example/mapper 폴더에 UserMapper.java 파일을 생성해 볼게요.
package com.example.mapper;
import com.example.dto.User;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
List<User> selectAllUsers();
User selectUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
- 인터페이스의 메서드 이름과 맵퍼 XML 파일의 <select>, <insert> 등의 id 속성 값이 같아야 마이바티스가 서로 연결해 줄 수 있어요.
- 메서드의 파라미터 타입과 반환 타입도 맵퍼 XML 파일의 parameterType과 resultType에 맞춰줘야 합니다.
- @Param 어노테이션을 사용하면 XML 파일에서 파라미터 이름을 명시적으로 사용할 수 있어요. 예를 들어, @Param("userId") int id 라고 하면 XML에서 #{userId}로 접근할 수 있습니다.
5단계: 마이바티스 설정 로딩 및 SqlSession 사용하기
이제 실제로 마이바티스를 이용해서 DB에서 데이터를 가져오는 코드를 작성해 볼까요?
import com.example.dto.User;
import com.example.mapper.UserMapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession 얻기 (try-with-resources 구문을 사용하여 자동으로 close 되도록 처리)
try (SqlSession session = sqlSessionFactory.openSession()) {
// 방법 1: 맵퍼 인터페이스 이용
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> allUsers = userMapper.selectAllUsers();
System.out.println("모든 사용자: " + allUsers);
User user = userMapper.selectUserById(1);
System.out.println("ID 1번 사용자: " + user);
// 방법 2: SqlSession 직접 이용 (맵퍼 namespace와 id를 조합)
User newUser = new User();
newUser.setName("새로운 사용자");
newUser.setEmail("new@example.com");
session.insert("com.example.mapper.UserMapper.insertUser", newUser);
session.commit(); // INSERT, UPDATE, DELETE 작업 후에는 반드시 commit()을 호출해야 변경사항이 DB에 반영됩니다.
List<User> updatedUsers = session.selectList("com.example.mapper.UserMapper.selectAllUsers");
System.out.println("업데이트된 사용자 목록: " + updatedUsers);
// ... 나머지 CRUD 작업도 동일한 방식으로 수행 가능 ...
}
}
}
- Resources.getResourceAsStream("mybatis-config.xml"): 설정 파일을 읽어옵니다.
- new SqlSessionFactoryBuilder().build(inputStream): 읽어온 설정 파일을 바탕으로 SqlSessionFactory 객체를 생성합니다. 이 객체는 DB와의 연결을 관리하는 핵심적인 역할을 합니다.
- sqlSessionFactory.openSession(): SqlSession 객체를 얻습니다. SqlSession은 실제 DB와 상호작용하는 역할을 합니다. try-with-resources 구문을 사용해서 세션을 자동으로 닫아주는 것이 좋습니다.
- session.getMapper(UserMapper.class): 우리가 만든 UserMapper 인터페이스의 구현체를 얻습니다. 이 객체를 이용해서 편리하게 SQL 쿼리를 실행할 수 있습니다.
- session.selectList(), session.selectOne(), session.insert(), session.update(), session.delete(): SqlSession 객체를 직접 이용해서 SQL 쿼리를 실행할 수도 있습니다. 이때는 맵퍼 XML 파일의 namespace와 id를 조합해서 쿼리를 지정합니다.
- session.commit(): INSERT, UPDATE, DELETE 쿼리 실행 후에는 반드시 commit() 메서드를 호출해야 변경사항이 DB에 실제로 반영됩니다. SELECT 쿼리는 commit()이 필요 없습니다.
마지막으로, 몇 가지 더 주의할 점 📌
- SQL Injection 방지: 쿼리를 작성할 때 사용자로부터 입력받는 값을 그대로 SQL 쿼리에 포함시키면 SQL Injection 공격에 취약해질 수 있습니다. 마이바티스는 #{}를 사용해서 파라미터를 바인딩하므로, 대부분의 경우 SQL Injection을 자동으로 방지해 줍니다. 하지만 ${}를 사용하는 경우에는 직접적인 문자열 치환이 일어나므로, 사용에 신중해야 합니다.
- Result Map 활용: DB 컬럼명과 DTO 필드명이 다르거나, 복잡한 조인 쿼리의 결과를 매핑해야 할 경우에는 <resultMap> 태그를 이용해서 명시적으로 매핑 규칙을 정의할 수 있습니다.
- 동적 SQL: <if>, <choose>, <when>, <otherwise>, <where>, <set>, <foreach> 등의 태그를 이용해서 조건에 따라 동적으로 SQL 쿼리를 생성할 수 있습니다.
- 로그 설정: 마이바티스 설정 파일에서 로그 설정을 추가하면 실행되는 SQL 쿼리나 결과를 확인할 수 있어서 디버깅에 도움이 됩니다.
그럼 즐거운 개발 되세요!🚀😉
Bye. #{Somebody}