티스토리 뷰

Spring

[Spring Boot] MyBatis Java로 세팅하기

snail voyager 2023. 8. 13. 16:41
728x90
반응형

SqlSessionFactory

  • MyBatis에서 SQL 세션을 생성하는 중요한 인터페이스
  • 데이터베이스와의 연결을 설정하고 SQL 문을 실행하는데 사용되는 SQL 세션 객체를 생성
  • SqlSessionFactory를 생성하면 MyBatis의 SqlSession을 생성하고 데이터베이스와의 상호 작용을 수행
  • SqlSession은 SQL 쿼리를 실행하고 결과를 얻을 수 있는 인터페이스
@Configuration
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mappers/*.xml")); // MyBatis Mapper XML 파일 경로
        return sessionFactoryBean.getObject();
    }
}

SqlSessionTemplate

  • Spring과 MyBatis를 통합하여 데이터베이스 작업을 수행하는 편리한 방법을 제공하는 클래스
  • MyBatis의 SqlSession을 더 편리하게 사용할 수 있으며, Spring의 트랜잭션 관리와 연동
  • Spring의 트랜잭션 관리 기능과 함께 사용되는데, 트랜잭션 내에서 데이터베이스 작업을 수행하고 트랜잭션이 커밋되거나 롤백될 때 자동으로 SqlSession을 관리
@Configuration
@EnableTransactionManagement
public class MyBatisTransactionConfig {

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

MapperFactoryBean

  • Mapper 인터페이스를 Spring Bean으로 생성하는 역할
  • Mapper 인터페이스의 라이프사이클을 관리하고 Spring 애플리케이션 컨텍스트에 통합하는 역할
  • @Mapper 주석을 사용하여 Mapper 인터페이스를 선언하면, MyBatis-Spring은 해당 Mapper 인터페이스에 대한 MapperFactoryBean 인스턴스를 자동으로 생성

Mapper 인터페이스

  • Mapper 인터페이스는 MyBatis의 기능을 추상화하고 SQL 작업을 메소드로 정의하는 역할
  • Mapper 인터페이스를 사용하면 SqlSessionTemplate을 명시적으로 사용하지 않아도 됨
@Mapper
public interface MyMapper {

    MyData selectDataById(Long id);

    void insertData(MyData data);

    List<MyData> selectAllData();
}

@Service
public class MyService {

    private final MyMapper myMapper;

    @Autowired
    public MyService(MyMapper myMapper) {
        this.myMapper = myMapper;
    }

    public MyData getDataById(Long id) {
        return myMapper.selectDataById(id);
    }

    public void saveData(MyData data) {
        myMapper.insertData(data);
    }

    public List<MyData> getAllData() {
        return myMapper.selectAllData();
    }

}

mybatis-spring-boot-starter gradle

dependencies {
  implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2")
}

Quick Setup

  • 자동으로 존재하는 DataSource 감지
  • SqlSessionFactoryBean을 사용하여 해당 DataSource를 입력으로 사용하여 SqlSessionFactory의 인스턴스를 생성하고 등록
  • 생성된 SqlSessionFactory를 사용하여 SqlSessionTemplate의 인스턴스를 생성하고 등록
  • Mapper 인터페이스를 자동으로 스캔하고, 이를 SqlSessionTemplate와 연결하여 Spring 컨텍스트에 등록.
    이렇게 등록된 매퍼 인터페이스는 빈으로 주입

DataSource 설정

@Configuration
@EnableTransactionManagement	//트랜잭션 관리를 활성화
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.main")	//yml 설정 값을 Java 객체에 매핑
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().build();
    }
}

MyBatis 설정

@Configuration
@MapperScan(basePackages = "com.exam.db", sqlSessionTemplateRef = "mainSqlSessionTemplate")
// Mapper 인터페이스를 검색하여 자동으로 Bean으로 등록해주는 역할
public class MyBatisConfig {
    @Bean(name = "mainSqlSessionFactory")
    public SqlSessionFactory mainSqlSessionFactory(
            @Qualifier("mainDataSource") DataSource dataSource,
            @Qualifier("mybatisConfigurationCustomizer") org.apache.ibatis.session.Configuration configuration) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:/mapper/*.xml")); // MyBatis Mapper XML 파일 경로
        sessionFactoryBean.setConfiguration(configuration);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "mainSqlSessionTemplate")
    public SqlSessionTemplate mainSqlSessionTemplate(
            @Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name = "mybatisConfigurationCustomizer")
    public org.apache.ibatis.session.Configuration mybatisConfigurationCustomizer() {
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        return configuration;
    }
}

 

http://mybatis.org/spring/index.html

https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

728x90
반응형
반응형
300x250