๋ง์ด๋ฐํฐ์ค๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ SQL, ์ ์ฅํ๋ก์์ ๊ทธ๋ฆฌ๊ณ ๋ช๊ฐ์ง ๊ณ ๊ธ ๋งคํ์ ์ง์ํ๋ ํผ์์คํด์ค ํ๋ ์์ํฌ์ด๋ค. ๋ง์ด๋ฐํฐ์ค๋ JDBC๋ก ์ฒ๋ฆฌํ๋ ์๋น๋ถ๋ถ์ ์ฝ๋์ ํ๋ผ๋ฏธํฐ ์ค์ ๋ฐ ๊ฒฐ๊ณผ ๋งคํ์ ๋์ ํด์ค๋ค. ๋ง์ด๋ฐํฐ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋์ ์์ํ์ ๊ณผ Map ์ธํฐํ์ด์ค ๊ทธ๋ฆฌ๊ณ ์๋ฐ POJO ๋ฅผ ์ค์ ํด์ ๋งคํํ๊ธฐ ์ํด XML๊ณผ ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์ ์๋ค
์ถ์ฒ
ํผ์์คํดํธ?
๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค. ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ฉด ํจ๊ป ์ฌ๋ผ์ง๋ค. ์ด๋ ๊ฒ ์ผํ์ฉ์ผ๋ก ๋ฒ๋ ค์ง๋ ๋ฐ์ดํฐ๋ค์ ์ ์งํ๋ ค๋ฉด, ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ์ ์ด๋๊ฐ์ ์ ์ฅํด๋์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋์ค์ ๊ฐ์ฒด๊ฐ ๋ค์ ์์ฑ๋์์ ๋ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค. ๋ค์ ๋งํด, ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ์ ์ํ๋ก ๋์๊ฐ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฐ ์์ฑ์ '์์์ฑpersistence'๋ผ๊ณ ํ๋ค.
JDBC
MyBatis
pom.xml์ ์ถ๊ฐ
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
MyBatis์์ ๊ฐ์ฅ ํต์ฌ ๊ฐ์ฒด๋ SQLSessionFactory๊ฐ ๋ง๋๋ SQLSession์ด๋ค. SQLSession์ Connection์ ์์ฑํ๊ฑฐ๋ ์ํ๋ SQL์ ์ด๋ฐํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์จ๋ค.
์ค์
@Configuration
@ComponentScan(basePackages = {"com.coco.controller"})
@MapperScan(basePackages = {"com.coco.mapper"})
public class RootConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/springex?serverTimezone=Asia/Seoul");
config.setUsername("springuser");
config.setPassword("springuser");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
return ds;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
return sqlSessionFactory.getObject();
}
}
์ฌ๊ธฐ๊น์ง ํ๋ฉด ์ฐ๊ฒฐ ๋!
ํ
์คํธ๋ ์์์..
๊ทธ ๋ค์ Mapper๋ฅผ ๋ง๋ ๋ค. Mapper๋ ์ธํฐํ์ด์ค๋ก ์ ์ธํ๋ค.
public interface TimeMapper {
@Select("SELECT now()")
public String getTime();
}
์ด๋ ๊ฒ @Select
์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ฌ ์ ์๋ค.
ํ
์คํธ๋ ๊ฐ๋จํ๋ค.
@Autowired
TimeMapper mapper;
@Test
public void getTime() {
assertNotNull(mapper);
log.info(mapper);
log.info(mapper.getClass().getName());
log.info(mapper.getTime());
}
ํด๋์ค๋ ์๊ณ ์ธํฐํ์ด์ค๋ฐ์ ์๋๋ฐ๋ ํ ์คํธ๋ ์ฑ๊ณตํ๋ค.
INFO : com.coco.mapper.TimeMapperTest - org.apache.ibatis.binding.MapperProxy@3243b914
INFO : com.coco.mapper.TimeMapperTest - com.sun.proxy.$Proxy29 <--์ต๋ช
ํด๋์ค
INFO : com.coco.mapper.TimeMapperTest - 2020-08-21 18:08:47
์คํ๋ง ์ปจํ ์ด๋๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ ์ ํ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ฃผ์ ํ ๊ฒ์ด๋ค.