ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MyBatis] SqlSessionTemplate, 메퍼 인터페이스
    IT/코딩히스토리_BE 2025. 1. 15. 23:28

    Spring에서 mybatis와 mybatis-spring을 사용할때 SqlSessionTemplate을 사용한다.

     

     


    SqlSessionTemplate

    MyBatis-Spring에서 제공하는 클래스로,
    Spring 환경에서 SqlSession을 안전하고 효과적으로 사용할 수 있도록 래핑한 구현체
    Spring의 트랜잭션 관리와 MyBatis를 통합하여, 스레드 안전성과 자원 관리를 자동화한다.

     

     

    즉, sqlSessionFactory에서 하던
    SqlSession의 열기와 닫기 작업을

    자동 처리하여 자원 누수 방지.
    개발자가 close()를 호출할 필요가 없다. (SqlSessionTemplate만 호출해서 실행하면 된다)

    (또 SqlSessionTemplate은 다중 스레드 환경에서 안전하게 사용할 수 있도록 설계되어있다는데 이건 나중에 테스트..)



    언제 SqlSessionTemplate을 사용하나요?


    1. Spring과 MyBatis 통합 시:MyBatis를 Spring 애플리케이션에서 사용할 때, SqlSessionTemplate은 기본적으로 사용됩니다.Spring의 트랜잭션 관리와 MyBatis를 매끄럽게 통합.

    2. 매퍼 인터페이스 없이 직접 SQL 실행 시:매퍼 인터페이스를 사용하지 않고, 직접 SQL을 실행해야 할 때 SqlSessionTemplate을 활용.

    3. 스레드 안전성이 필요한 경우:SqlSession은 스레드에 안전하지 않지만, SqlSessionTemplate은 스레드 안전성을 보장.

    4. 자원 관리 자동화를 원하는 경우:Spring 컨텍스트에서 자동으로 세션 열고 닫기를 관리.

     

     

    2번의 매퍼 인터페이스란 우리가 마이바티스에서 sql을 모아놓은 xml파일과 맵핑시키려고 만든 

    인터페이스에 @Mapper으로 등록해놓은 것을 말한다.

     

    매퍼 인터페이스는 Mybatis 3.0부터 생긴 것이다. 이걸 쓰면 더 간단해진다.

     

    Spring에서 Mybatis를 사용하는 방식으로는 크게 두가지로 나눌 수 있다.
    1. SqlSessionTemplate - MyBatis3.0 이전

    @Repository
    public class UserDao {
    
        @Autowired
        private SqlSessionTemplate sqlSessionTemplate; //이렇게 주입해서 sql직접 호출해야함
    
        public String findNameById(int id) {
            return sqlSessionTemplate.selectOne("com.example.mapper.UserMapper.findNameById", id);
        }
    }
    @Service
    public class UserService {
    
        @Autowired
        private UserDao userDao;
    
        public String getUserName(int id) {
            return userDao.findNameById(id);
        }
    }


    2. MapperInterface - Mybatis 3.0버전 

    @Mapper //이걸로 빈으로 등록해놓으면 호출시에 내부적으로 session을 사용함
    public interface UserMapper {
        String findNameById(int id); // SQL 쿼리 매핑
    }
    @Service
    public class UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        public String getUserName(int id) {
            return userMapper.findNameById(id);
        }
    }

     

    --> 마이바티스에서 쿼리를 실행할 때 bean으로 생성된 SqlSessionFactory를 통해서 세션을 열어야한다. 
    때문에 메퍼 인터페이스를 사용하지 않는다면 쿼리를 실행하려고 자바에서 접근할 때 SqlSessionFactory를 직접 초기화하고 SqlSession을 열어야하지만,

    메퍼 인터페이스를 호출하면 내부적으로 spring-myBatis가 처리해준다. 

    이때 해당 메퍼 인터페이스는 @Mapper로 등록을 해주어야 하는데
    Spring에서 <mybatis-spring:scan>을 사용하면 해당 경로에 있는 인터페이스들은 메퍼로 인식된다.

    <mybatis-spring:scan base-package="com.test.mapper" />


    이 말이 뭐냐면 원래 mapper인터페이스로 사용하기 위해서는 @Mapper 처럼 해당 인터페이스에 애노테이션으로 등록을 해줘야한다.

    @Mapper
    public interface UserMapper{
    
        Optional<User> findByEmail(String userEmail);
    
    }


    만약 저것이 base-package=" com.test.mapper" 경로 아래 있다면 

    public interface UserMapper{
    
        Optional<User> findByEmail(String userEmail);
    
    }


     이렇게 @Mapper 애노테이션이 없어도 메퍼로 인식된다는 말

     

    즉,

    스프링에서 MyBatis를 사용하는 표준적인 방식

    - 컨트롤러 → 서비스 → 매퍼 인터페이스 → MyBatis XML(마이바티스 3.0 이후)
    이전에는 

    - 컨트롤러  -> 서비스 -> dao인터페이스, dao클래스 -> MyBatis XML

Designed by Tistory.