새소식

반응형
Java/Spring

Mybatis 의 Mapper 인터페이스 Bean 등록 방법

  • -
반응형

본인은 Spring 에서 Mybatis 를 사용하기 위해서 Mapper 인터페이스를 생성하고 .xml 파일을 생성하여

쿼리문을 호출했다.

 

이때 필요한 Mapper 인터페이스를 사용하기 위한 Bean 등록 방법을 알아보자

 

총 3가지가 있다.

1. @Mapper 어노테이션 개별 사용

2. @MapperScan 어노테이션을 사용한 모든 Mapper 파일 패키지 설정

3. xml 을 사용했을 경우 SqlSessionFactoryBean 의 setMapperLocations() 함수 사용

 

1. @Mapper 어노테이션 사용

@Mapper 어노테이션은 각 Mapper 인터페이스에 직접 붙여 Bean 으로 등록한다.

모든 Mapper 인터페이스에 붙이기에는 효율성이 떨어지므로 아래 설명할 @MapperScan 어노테이션을 사용한다.

 

package com.obo.mapper;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TestMapper {
	int testCount();
}

 

 

2. @MapperScan 어노테이션 사용

지정한 패키지의 모든 Mapper 를 자동으로 Bean 등록 해준다.

사용방법은 아래와 같다.

특별한 설정이 필요하지 않을경우 주석처리된 것처럼 패키지만 문자열로 설정해주면 된다.

 

@MapperScan 어노테이션이 설정한 패키지의 경로내 Mapper 인터페이스들을 Bean 으로 등록해준다.

@Configuration
@MapperScan(basePackages = "com.obo.mapper")
// @MapperScan("com.obo.mapper")
public class DBConfig {
	....
}

 

 

3. xml 사용 시 SqlSessionFactoryBean 의 setMapperLocations 함수 사용

XML 기반 SQL Mapper 파일들과 매핑되는 Mapper 인터페이스가 있을 경우 xml 의 경로를 설정해줘야 한다.

SqlSessionFactoryBean 을 통해 setMapperLocations 로 xml 경로를 설정해주면

@Mapper 어노테이션이나 @MapperScan 설정을 하지 않고 Bean 으로 등록되어 있지 않은 Mapper 인터페이스들을

MyBatis 가 프록시 객체를 생성해서 인터페이스들과 연결한다.

 

 

@Configuration
//@MapperScan(basePackages = "com.obo.mapper")
public class DBConfig {
	
	@Bean
	@ConfigurationProperties(prefix = "spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		return new HikariConfig();
	}

	@Bean
	public HikariDataSource dataSource(HikariConfig hikariConfig) {
		return new HikariDataSource(hikariConfig);
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(HikariDataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();		
		bean.setDataSource(dataSource);
		bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/obo/mapper/xml/**/*.xml"));
		return bean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

 

 

결론

구성 요소 필요 여부 현재 사용 여부 설명
@MapperScan ❌ (선택) 편의성용, 현재 필요 없음
@Mapper ❌ (XML 기반이면) 현재 없어도 문제 없음
setMapperLocations ✅ (XML 기반 필수) 핵심 설정 포인트
SqlSessionFactoryBean 핵심 역할
HikariCP 데이터베이스 커넥션 풀 역할

 

 

 

그래서 언제 @MapperScan 이 필요할까?

XML 을 사용하지 않고 Mapper 인터페이스 + @Mapper  + 어노테이션 기반 SQL(@Select, @Insert) 을 사용할 때 적합하다.

또한 자동으로 Bean 등록을 간편하게 하고 싶을때 사용하면 된다.

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.