지난 포스팅에서는 jdbc와 jdbcTemplate에 대해서 간략 하게 다뤄봤다.
이번 포스팅에서는 java 개발에 있어서 가장 흔하게 사용하는 MyBatis를 다뤄보겠다.
MyBatis란.
- MyBatis는 SQL 쿼리와 Store Procedure의 매핑을 지원하는 퍼시스턴스 프레임워크이다.
- 기존에 jdbc나 jdbcTemplate을 사용하는거에 비해 불필요한 중복 코드도 줄어든다.
- Db Connection을 가져오고 PreparedStatement 객체를 생성 후 쿼리를 실행 시켜 ResultSet 객체로 결과값을 받아오는 일련의 JDBC 과정들이 Mybatis를 사용함으로써 더 간결한 코드를 작성 할 수 있다. (해당 과정은 지난 포스팅에서 확인 가능)
- xml을 이용해 쿼리를 작성하여 java 코드와 분리 되어 개발을 할 수 있다.
- MyBatis를 사용하기 위해서는 라이브러리 및 별도의 설정이 필요하다.
MyBatis 설정
1. gradle 라이브러리 설정
- gradle 기준으로 아래와 같은 의존성을 주입한다.
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
implementation 'mysql:mysql-connector-java:8.0.25'
2. java Config 설정
@Configuration
public class MybatisConfig {
@Resource(name = "hikariDataSource")
private DataSource hikariDataSource;
@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(hikariDataSource);
sqlSessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:/config/mybatis-context.xml"));
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean("sqlSessionTemplate")
public SqlSessionTemplate dcsSqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
- sqlSessionFactoryBean.setConfigLocation() : sqlSessionFactoryBean에서 사용할 MyBatis 설정 파일을 지정한다.
- sqlSessionFactoryBean.setMapperLocations() : sqlSessionFactoryBean에서 사용할 SQL 파일을 지정한다.
3. 쿼리 조회
- MyBatis xml 문법은 다음 포스팅에서 알아보도록 하고 이번 포스팅에서는 어떤 식으로 호출이 되는지 확인해보자.
3-1 Mapper Interface 생성
- Mapper Interface는 SQL이 작성되어있는 xml 파일에 특정 쿼리를 호출하기 위한 인터페이스이다.
@Mapper
public interface TestMapper {
List<TestDTO> selectTestQuery(String param);
}
3-2 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.test.mapper.TestMapper">
<select id="selectTestQuery" parameterType="String">
SELECT * FROM test_db WHERE name = #{param}
</select>
</mapper>
3-3 Service.java에서 호출
@Service
public class TestService {
@Autowired
TestMapper testMapper;
public TestDTO findOne(String param) {
return testMapper.selectTestQuery(param);
}
}
마무리
지난 포스팅에서 다뤘던 jdbc와 jdbcTemplate 보다는 초기 설정을 해야할 부분이 많지만 장기적으로 개발을 하는데에 있어서 불필요한 중복 코드를 줄일 수 있으며 java와 SQL 코드의 분리를 통한 코드의 유지보수도 확실히 더 용이한거 같다.
무엇보다 jdbc에서 결과를 받아오는 ResultSet 객체를 통하지 않고 바로 원하는 DTO로 자동 매핑이 되어 결과값을 받아 올 수 있는 부분에서 더 효율적이라고 생각한다.
물론 jdbcTemplate에서도 DTO로 받아오는 방법이 있지만 이건 다음에 따로 포스팅을 남기도록 하겠다.
* 참고
https://mybatis.org/mybatis-3/
'Spring' 카테고리의 다른 글
Object Storage 이미지 출력 (0) | 2023.06.09 |
---|---|
@Asnyc를 이용한 멀티 스레드 (0) | 2023.06.08 |
멀티 스레드 환경을 위한 스레드 풀 (Thread pool) - ThreadPoolTaskExecutor (0) | 2023.06.06 |
멀티 스레드 Runnable (0) | 2023.06.06 |
jdbc와 jdbcTemplate (0) | 2022.10.21 |