본문 바로가기
Spring

MyBatis

by yang sing 2023. 6. 4.

지난 포스팅에서는 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/

https://devncj.tistory.com/48

 

mybatis – MyBatis 3 | Introduction

What is MyBatis? MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use

mybatis.org