-
Mybatis란?
- 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 Persistence Framework이다. Mybatis는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다. Mybatis는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
※ Persistence Framework : 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합이다. JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동도 보장한다.
- 특징
- 쉬운 접근성과 코드의 간결함.
- XML 형태로 서술된 JDBC 코드하고 생각해도 될 만큼 JDBC의 모든 기능을 대부분 제공한다.
- 복잡한 JDBC 코드를 걷어내며 깔끔한 소스코드를 유지할 수 있다.
- 수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다.
- SQL문과 프로그래밍 코드를 분리함
- SQL에 변경이 있을 때마다 자바코드를 수정하거나 컴파일하지 않아도 된다.
- 다양한 프로그래밍 언어로 구현이 가능하다.
- 라이브러리
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>※ mybatis-spring-boot-starter 역할
- 존재하는 DataSource 자동감지
- SqlSeessionFactoryBean을 사용해서 해당 데이터소스를 전달하는 SqlSessionFactory의 객체를 생성하고 등록한다.
- SqlSessionFactory을 이용해 SqlSessionTemplate의 객체를 생성하고 등록한다.
- 매퍼들을 자동스캔한 뒤 스캔된 것들을 SqlSessionTemplate에 연결하고 Spring Context에 등록해서 당신의 빈들에 주입할 수 있게 해준다.(@MapperScan)
- @MapperScan은 @Mapper로 등록된 것들을 스캔한다.
- 주요 컴포넌트
- SqlSessionFactoryBuilder 클래스 : build() 메소드를 통해 mybatis-config를 로딩하여 SqlSessionFactory 객체를 생성한다.
- SqlSessionFactory 클래스 : SqlSession 객체에 대한 팩토리 객체다. 이 객체의 openSession() 이라는 메소드를 통해 SqlSession 객체를 얻을 수 있다.
- SqlSession 클래스 : Mapper XML 에 등록된 SQL을 실행하기 위해 API 를 제공
- 실습1
- application.properties 설정
#mysql 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/project?serverTimezone=Asia/Seoul
spring.datasource.username=user
spring.datasource.password=passwd
#mybatis 설정
mybatis.type-aliases-package=com.example.dto
mybatis.mapper-locations=mapper/*.xml- resources/mapper/*.xml (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.dao.HelloWorldMapper">
<select id="selectHelloWorld" resultType="String">
select word from testTable
</select>
</mapper>- Mapper Interface 파일 설정
@Mapper
public interface HelloWorldMapper {
public String selectHelloWorld();
}- Service 파일 설정
@Service
@Transactional
public class HelloWorldService {
@Autowired HelloWorldMapper helloWorldMapper;
public String selectHelloWorld(){
return helloWorldMapper.selectHelloWorld();
}
}- Controller 설정
@RestController
@RequestMapping("/")
public class HelloWorldApiController {
private Logger logger = LoggerFactory.getLogger(HelloWorldApiController.class);
private HelloWorldService helloWorldService;
public HelloWorldApiController(HelloWorldService helloWorldService){
this.helloWorldService = helloWorldService;
}
@GetMapping
public String printHelloWorld() {
logger.info("Hello World");
return helloWorldService.selectHelloWorld();
}
}참고
dog-developers.tistory.com/25?category=850439
mybatis.org/spring/ko/sqlsession.html#SqlSessionTemplate
mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
- 실습2
- pom.xml 라이브러리 추가
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>※ spring-jdbc를 추가하면 @EnableAutoConfiguration 어노테이션을 통해 DataSource에 대한 Bean을 별도로 등록하지 않아도 된다. DataSource의 설정은 application.properties 파일내에서 spring.datasource.* 와 같은 패턴으로 설정이 가능하다. 만약 별도의 DataSource Bean을 등록하면 application.properties 내의 spring.datasource.* 속성은 적용되지 않는다.
- DatabaseConfig 설정
@Configuration
@MapperScan(basePackages="com.example.dao")
@EnableTransactionManagement
public class DatabaseConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource((javax.sql.DataSource) dataSource);
sqlSessionFactory.setTypeAliasesPackage("com.example.dto");
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return sqlSessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
final SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
}※ 위와 같이 DatabaseConfig 파일을 만들면 application.properties에 설정한 TypeAliasesPackage, MapperLocations는 적용되지 않는다.
- dto
public class HelloWorld {
private String word;
public String getWord() { return word; }
public void setWord(String word) { this.word = word; }
}- dao
@Repository
@Mapper
public interface HelloWorldMapper { public HelloWorld selectHelloWorld(); }- helloWorld.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.dao.HelloWorldMapper">
<select id="selectHelloWorld" resultType="HelloWorld">
select word from testTable
</select>
</mapper>- service
@Service
public class HelloWorldService {
private HelloWorldMapper helloWorldMapper;
public HelloWorldService(HelloWorldMapper helloWorldMapper) {
this.helloWorldMapper = helloWorldMapper;
}
public String selectHelloWorld(){
HelloWorld helloWorld = helloWorldMapper.selectHelloWorld();
return helloWorld.getWord();
}
}- Controller
@RestController
@RequestMapping("/")
public class HelloWorldApiController {
private Logger logger = LoggerFactory.getLogger(HelloWorldApiController.class);
private HelloWorldService helloWorldService;
public HelloWorldApiController(HelloWorldService helloWorldService){
this.helloWorldService = helloWorldService;
}
@GetMapping
public String printHelloWorld() {
logger.info("Hello World");
return helloWorldService.selectHelloWorld();
}
}MyBatis 설정파일(DatabaseConfig.class) - 데이터베이스의 접속 주소 정보나 Mapping 파일의 경로 등의 고정된 환경정보를 설정한다. SqlSessionFactoryBuilder - MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성한다. SqlSessionFactory - SqlSession을 생성한다. SqlSession - 핵심적인 역할을 하는 클래스로서 SQL실행이나 트랜잭션 관리를 실행한다.
- SqlSession오브젝트는 Thread-Safe 하지 않으므로 thread마다 필요에 따라 생성한다.mapping 파일(*.xml) - SQL문과 OR Mapping을 설정한다. SqlSessionFactoryBean - MyBatis 설정파일을 바탕으로 SqlSessionFactory를 생성한다.
- Spring Bean으로 등록해야 한다.SqlSessionTemplate - 핵심적인 역할을 하는 클래스로서 SQL실행이나 트랜잭션 관리를 실행한다.
- SqlSession 인터페이스를 구현하며, Thread-Safe한다.
- Spring Bean으로 등록해야 한다.참고
'STUDY > 백엔드' 카테고리의 다른 글
@ControllerAdvice / @RestControllerAdvice (0) 2021.02.03 Bean (0) 2021.01.05 Server Log (0) 2020.12.28 Apache Spring boot(내부 tomcat) 연동 (0) 2020.12.24 TC(Test Case) & JUnit (0) 2020.12.18 - 쉬운 접근성과 코드의 간결함.