DB 연결을 위한 Mybatis 설정
✒️ 2025-05-28 13:29 내용 수정
1. 프로젝트 의존성 설정
- 프로젝트 생성 시 필요한 의존성에 JDBC API, Oracle Driver, MyBatis Framework를 추가한다.
2. MyBatisConfig 설정
- src/main/java 폴더의 com.example.db와 같은 패키지에 mybatis 패키지를 만들고, MyBatisConfig 클래스를 만든다.
- 서버가 DB와 연결 시엔 Connection 자원이 많이 들기에 ConnectionPool을 만들어 필요한 Connection을 미리 만들고, 이를 이용한 후에 반환하는 방식으로 관리한다.
- DBCP 참고.
- Spring Boot에선 Connection Pool 관리에 HikariCP를 사용한다.
- HikariCP : JDBC Connection Pool framework로, org.springframework.boot:spring-boot-starter-jdbc에 포함되어 있다.
package com.example.db.mybatis;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.RequiredArgsConstructor;
@Configuration
@RequiredArgsConstructor
public class MyBatisConfig {
final ApplicationContext applicationContext;
// 외부 설정을 해당 클래스의 필드에 바인딩하기 위한 Annotation
@ConfigurationProperties(prefix="spring.datasource.hikari")
@Bean
public HikariConfig hikariConfig() {
return new HikariConfig();
}
// 유저 네임이나 비밀번호에 대한 설정을 HikariConfig 객체에 넣음
// application.yml에 작성
@Bean
public DataSource dataSource() {
return new HikariDataSource(hikariConfig());
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
// classpath : classes 폴더와 jar 폴더를 순회하면서 발견한 첫번째 파일을 로딩함
// classpath* : classes 폴더와 jar 폴더를 순회하면서 발견한 모든 파일들을 로딩함
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath*:/mapper/*.xml"));
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:/config/config.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
// snake 표현 -> Camel 표현
sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
return sqlSessionFactory;
}
}
- application.yml에 DB 설정을 추가한다.
server:
port: 9091
#JDBC dataSource
spring:
datasource:
hikari:
driver-class-name: oracle.jdbc.OracleDriver
jdbc-url: jdbc:oracle:thin:@localhost:1521:XE
username: hr
password: hr
3. config.xml과 mapper.xml 생성
- src/main/resources 폴더에 config 패키지와 mapper 패키지를 만들고, config 패키지에 config.xml 파일을, mapper 패키지에 mapper.xml 파일을 만든다.
<!-- 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>
</configuration>
<!-- mapper.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.db.mapper.TimeMapper">
<select id="getTime">
SELECT SYSDATE FROM DUAL
</select>
</mapper>
- src/main/java 폴더에 하위 패키지로 mapper 패키지를 만들고, Mapper 인터페이스를 만든다.
- mapper.xml 파일에 있는 SQL 쿼리문을 호출하기 위한 인터페이스로,
@Mapper를 사용하여 Bean으로 등록한다. - 확장성을 위해 Mapper는 인터페이스로 만든다.
- 메소드 명은 mapper.xml에 있는 id와 같은 이름으로 설정해야 한다.
- mapper.xml 파일에 있는 SQL 쿼리문을 호출하기 위한 인터페이스로,
package com.example.db.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TimeMapper { // TimeMapper 클래스의 위치가 mapper 파일에서의 namespace
public String getTime(); // query문과 1대1 매칭
// dao에서 sqlSession("getTime") 형태와 비슷
// 함수 이름이 mapper의 id
}