MyBatis란?
데이터의 입력, 조회, 수정, 삭제(CRUD)를 보다 편하게 하기위해 xml로 구조화한 Mapper 설정파일을 통해서 JDBC를 구현한 영속성 프레임워크
기존에 JDBC를 통해 구현했던 상당 부분의 코드와 파라미터 설정 및 결과 매핑 xml 설정을 통해 쉽게 구현할 수 있다
MyBatis 동작 흐름
MyBatis 내부 동작구조
DB연결하기
HiKariCP(Hikari Connection Pool)란?
DBConfig
package edu.kh.demo.common.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
/* @Configuration 어노테이션
* - 서버 실행 시 자동으로 객체로 만들어져
* 내부에 작성된 메서드를 모두 실행하게함
*
* @Bean 어노테이션
* - 메서드 수행 결과로 반환 객체들을 bean으로 등록함
* + 메서드 내부 코드 == bean 설정 코드
*
* @PropertySource : properties 파일의 내용을 이용하겠다는 어노테이션
*/
@Configuration
@PropertySource("classpath:/config.properties")
public class DBConfig {
@Autowired
private ApplicationContext applicationContext;
// @Bean
// - 개발자가 수동으로 bean을 등록하는 어노테이션
// - @Bean 어노테이션이 작성된 메서드에서 반환된 객체는
// Spring Container가 관리함(IOC)
@Bean
// @ConfigurationProperties(prefix = "spring.datasource.hikari")
// properties 파일의 내용을 이용해서 생성되는 bean을 설정하는 어노테이션
// prefix를 지정하여 spring.datasource.hikari으로 시작하는 설정을 모두 적용
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource(HikariConfig config) {
DataSource dataSource = new HikariDataSource(config);
return dataSource;
}
////////////////////////////Mybatis 설정 추가 ////////////////////////////
// SqlSessionFactory : SqlSession을 만드는 객체
@Bean
public SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
// 매퍼 파일이 모여있는 경로 지정
sessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**.xml"));
// 별칭을 지정해야하는 DTO가 모여있는 패키지 지정
// -> 해당 패키지에 있는 모든 클래스가 클래스명으로 별칭이 지정됨
sessionFactoryBean.setTypeAliasesPackage("edu.kh.demo");
// 별칭 지정 전 -> edu.kh.demo.dto.User 라고 작성
// 별칭 지정 후 -> User 라고만 작성
// 마이바티스 설정 파일 경로 지정
sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
// SqlSession 객체 반환
return sessionFactoryBean.getObject();
}
// SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 처리
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sessionFactory) {
return new SqlSessionTemplate(sessionFactory);
}
// DataSourceTransactionManager : 트랜잭션 매니저
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
UserController
package edu.kh.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import edu.kh.demo.service.UserService;
import edu.kh.demo.service.UserServieceImpl;
@Controller // Controller 역할 명시 및 + bean 등록
@RequestMapping("user") // /user로 시작하는 요청 매핑
public class UserController {
// 필드
// 서비스 객체 DI(의존성 주입)
@Autowired
private UserService service;
/** 사용자 번호를 입력받아 일치하는 사용자의 이름조회
* @param userNo : 제출된 파라미터 중 key값이 "userNo"인 값
* @param model : Spring에서 사용하는 데이터 전달용 객체(request scope)
* @return
*/
@GetMapping("test1")
public String selectUserName(
@RequestParam("userNo") int userNo,
Model model
) {
// 사용자 이름조회 서비스 호출 후 결과 반환받기
String userName = service.selectUserName(userNo);
// 조회 결과를 model에 추가
model.addAttribute("userName", userName);
// classpath:/templates/user/searchName.html 요청 위임하기
return "user/searchName";
}
}
TestMapper
package edu.kh.demo.mapper;
import org.apache.ibatis.annotations.Mapper;
/* @Mapper
* - 마이바티스 mapper와 연결된 인터페이스임을 명시
* - 자동으로 해당 인터페이스를 상속받은 클래스를 만들어
* Bean으로 등록함
*/
@Mapper
public interface TestMapper {
/** 사용자 이름조회
* @param userNo
* @return userName
*/
String selectUserName(int userNo);
// -> 해당 메서드가 호출된 경우
// 연결되어져있는 mapper.xml파일에서
// id 속성 값이
// 메서드명과 같은 sql 태그가 수행된다!
}
package edu.kh.demo.service;
public interface UserService {
/** 사용자 이름 조회
* @param userNo
* @return userName
*/
String selectUserName(int userNo);
}
package edu.kh.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.kh.demo.mapper.TestMapper;
// @Service
// - Service 역할(비즈니스 로직)임 명시
// - Bean 등록( == Spring이 관리하는 객체 == IOC )
@Service
public class UserServieceImpl implements UserService{
/* @Autowired
* - 등록된 Bean 중에서
* 자료형이 같은 Bean을 얻어와 필드에 대입
* == DI(의존성 주입)
*/
@Autowired
private TestMapper mapper;
// 사용자 이름 조회
@Override
public String selectUserName(int userNo) {
return mapper.selectUserName(userNo);
}
}