[Spring] MyBatis ์‹œ์ž‘ํ•˜๊ธฐ

[์›๋ณธ ๋งํฌ]

๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” iBatis๋ž€ ๋…€์„์˜ ํ›„์‹ ์œผ๋กœ,
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ณด์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

๋Œ€์„ธ๋Š” JPA์ธ๋“ฏ ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ด๊ฒƒ๋„ ๋งŽ์ด ์“ฐ์ด๋Š” ์ค‘์ด๋‹ค.

๋จผ์ € ์„ธํŒ…๋ถ€ํ„ฐ ํ•˜์ž.
๋ฉ”์ด๋ธ์—์„  pom.xml์„ ์—ด์–ด์„œ, ๋Œ€์ถฉ ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅํ„ฐ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค. ๋‚œ jar์„ ๋ฐ›์•„์„œ ์ง‘์–ด๋„ฃ์—ˆ๋‹ค.

๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๊ฐ€ ์„ค์ •๋œ ์ƒํƒœ์—์„œ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ์ž์ฒด๊ฐ€ ์•ˆ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šคํ”„๋ง๋ถ€ํŠธ ์„ค์ •ํŒŒ์ผ์„ ์—ด์–ด์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๋™์ •๋ณด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

mysql์˜ test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๋™ํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ์‚ฌ์šฉ์ž๋ช…๊ณผ ํŒจ์Šค์›Œ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค๋ช…์ด๋‹ค.

๊ทธ๋Ÿฌ๊ณ ๋‚˜์„  ์„ค์ •ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.
๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ SqlSession์ด๋ž€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ทธ๊ฑธ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฑฐ๋‹ค.

package com.example.mybatis.configuration;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mybatis.repository")
public class MyBatisConfiguration
{
    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
    {
        var sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);

        //์ฟผ๋ฆฌ๊ฐ€ ์ •์˜๋œ xml ํŒŒ์ผ๋“ค์˜ ์œ„์น˜ ์ง€์ •
        sqlSessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")
        );

        return sqlSessionFactoryBean.getObject();
    }
}


๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธํ•  ํ…Œ์ด๋ธ”์€ ์ด๋ ‡๊ฒŒ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

๋‚ด์šฉ๋ฌผ์€ ์ด๋ ‡๊ณ .

์ด์ œ ์ €๊ฑธ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งค์นญํ•ด๋ณด์ž.
๊ฐ ํ–‰(Row) ๊ฐ’์„ ํ‘œํ˜„ํ•  ํƒ€์ž…์ด๋‹ค.

๊ฐ ํ•„๋“œ์˜ ์ด๋ฆ„์€ ์‹ค์ œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋งž์ถฐ์ค˜์•ผ ํ•œ๋‹ค.
๋งž์ถ”์ง€ ์•Š์•„๋„ ์—๋Ÿฌ๋Š” ์•ˆ ๋‚˜์ง€๋งŒ, ๊ฐ’์„ ๋ชป ๊ฐ€์ ธ์˜จ๋‹ค.

์ด๋ฒˆ์—” ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •์˜ํ•œ๋‹ค.
@Mapper๋งŒ ๋ถ™์ด๋ฉด ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค xml๊ณผ ๋งคํ•‘๋˜๋Š” ๋นˆ์ฆˆ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค.

Name ๊ฐ’๋“ค์„ ์ „๋ถ€ ๊ฒ€์ƒ‰ํ•ด์„œ ๊ฐ€์ ธ์˜ฌ selectAllName์„ ์„ ์–ธํ–ˆ๋‹ค.
๋ฐ˜ํ™˜ํƒ€์ž…์€ ๋‹น์—ฐํžˆ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์•„๋†“๊ณ .

๊ตฌํ˜„์€ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๊ฐ€ ์•Œ์•„์„œ ํ•ด์ค€๋‹ค.

์ž ๊ทธ๋Ÿผ xml์„ ํ†ตํ•ด ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•ด๋ณด์ž.
์•„๊นŒ Configuration์—์„œ ์ง€์ •ํ•œ ์œ„์น˜์—๋‹ค๊ฐ€, 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.mybatis.repository.NameMapper">
    <select id="selectAllName" resultType="com.example.mybatis.model.Name">
        SELECT * FROM NameTable
    </select>
</mapper>

mapper์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—” ๋ฐฉ๊ธˆ ๋งŒ๋“ , ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง‘์–ด๋„ฃ์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  select ํƒœ๊ทธ์˜ id๋Š” ๋งคํผ ๋‚ด์— ์ •์˜ํ–ˆ๋˜ ๋ฉ”์„œ๋“œ์™€ ์ด๋ฆ„์„ ๋งž์ถฐ์ฃผ๊ณ , ๋ฐ˜ํ™˜๋  ํƒ€์ž…๋„ ์ง€์ •ํ•ด์ค€๋‹ค.
๋‚ด๋ถ€์—๋Š” ์‹คํ–‰๋  ์ฟผ๋ฆฌ๋ฅผ ์จ์ค€๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๋‹ค ์งฐ๋‹ค. ๋Œ๋ ค๋ณด์ž.
์•„๊นŒ ๋งŒ๋“  ๋งคํผ ๋นˆ์ฆˆ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ฒ€์ƒ‰์„ ์‹œ๋„ํ–ˆ๋‹ค.

์ž˜ ๋Œ์•„๊ฐ„๋‹ค.