본문 바로가기
GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~

[마이바티스(MyBatis)] 마이바티스와 스프링 연동

by GDNGY 2023. 5. 16.

Chapter 8. 마이바티스와 스프링 연동

마이바티스는 스프링 프레임워크와 잘 연동되며, 이를 통해 개발의 편의성과 유연성을 향상할 수 있습니다. 이 장에서는 마이바티스와 스프링의 연동 방법에 대해 알아보고, 이를 통한 DAO 작성 및 트랜잭션 관리 방법에 대해 다룹니다.

 


 

반응형

 


[Chapter 8. 마이바티스와 스프링 연동]


8.1. 스프링 설정
8.1.1. 스프링 프로젝트 설정
8.1.2. 스프링과 마이바티스 연동 설정

8.2. SqlSessionFactoryBean 설정
8.2.1. SqlSessionFactoryBean의 역할
8.2.2. SqlSessionFactoryBean 설정 방법

8.3. 스프링 DAO 작성
8.3.1. 인터페이스 기반 스프링 DAO
8.3.2. XML 매퍼를 사용한 스프링 DAO
8.3.3. 어노테이션 기반 스프링 DAO

8.4. 트랜잭션 관리 통합
8.4.1. 스프링 트랜잭션 관리 연동 방법
8.4.2. 트랜잭션 관리 설정 예제


8.1. 스프링 설정

스프링 설정은 애플리케이션의 전반적인 동작 방식을 정의합니다. 이러한 설정은 XML 파일, Java Config 클래스 또는 Annotation을 통해 이루어질 수 있습니다. 이 섹션에서는 각 설정 방법에 대해 간략하게 소개하고, 마이바티스 연동 방법을 예제 코드와 함께 설명하겠습니다.

 


 

8.1.1. 스프링 프로젝트 설정

스프링 프로젝트를 설정하기 위해 다음 단계를 따라갈 수 있습니다.

  • 프로젝트 생성: 스프링 프로젝트를 생성하기 위해 IDE(통합 개발 환경)를 사용하거나 Maven, Gradle 등의 빌드 도구를 활용할 수 있습니다. 프로젝트 디렉터리를 생성하고, 필요한 파일과 폴더를 구성합니다.
  • 의존성 추가: 프로젝트에 스프링 의존성을 추가해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 필요한 의존성을 선언하고, Gradle을 사용하는 경우 build.gradle 파일에 의존성을 추가합니다.
  • 스프링 설정 파일 작성: 스프링 설정 파일은 주로 XML 또는 Java Config 형식으로 작성됩니다. XML을 사용하는 경우 applicationContext.xml과 같은 이름으로 파일을 생성하고, Java Config를 사용하는 경우 Java 클래스에 @Configuration 어노테이션을 추가하여 설정 클래스로 지정합니다.
  • 빈(Bean) 등록: 스프링은 IoC(Inversion of Control) 컨테이너로서, 빈을 관리하고 필요한 객체를 생성 및 주입해줍니다. 스프링 설정 파일에서 빈을 등록하기 위해 <bean> 요소를 사용하거나, Java Config에서 @Bean 어노테이션을 활용합니다.
  • 스프링 컨테이너 생성: 스프링 설정 파일을 기반으로 스프링 컨테이너를 생성합니다. 컨테이너는 설정된 빈들을 관리하며, 애플리케이션에서 필요한 빈을 가져와 사용할 수 있습니다.

이러한 단계를 따라가면 스프링 프로젝트의 기본 설정이 완료됩니다.

 

다음은 스프링 프로젝트 설정방식에 따라 애플리케이션의 구조와 동작을 정의하는 방법입니다.

  • XML 기반 설정 : 스프링 초기에는 XML을 통한 설정이 주로 사용되었습니다. XML 설정은 빈(bean) 정의와 같은 애플리케이션 설정 정보를 포함합니다.
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- bean definitions go here -->

</beans>

 

  • Java Config 기반 설정 : XML 파일 없이 순수한 자바 코드만을 이용해서 스프링 설정을 할 수 있습니다. @Configuration 어노테이션을 이용하여 설정 클래스를 정의하고, @Bean 어노테이션을 이용하여 빈을 생성합니다.
@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

 

  • Annotation 기반 설정 : @Component, @Service, @Repository, @Controller 등의 어노테이션을 이용하여 빈을 자동으로 등록하고, @Autowired를 이용하여 의존성 주입을 할 수 있습니다.
@Service
public class MyService {

    private final MyBean myBean;

    @Autowired
    public MyService(MyBean myBean) {
        this.myBean = myBean;
    }
}

 

8.1.2. 스프링과 마이바티스 연동 설정

마이바티스(MyBatis)는 자바 객체와 SQL 문 사이의 자동 매핑을 지원하는 데이터베이스 접근 프레임워크입니다. 스프링과 마이바티스를 연동하여 데이터베이스에 접근하는 방법은 다음과 같습니다.

 

  • 마이바티스 의존성 추가: 스프링 프로젝트의 의존성 관리 파일(pom.xml 또는 build.gradle)에 마이바티스 의존성을 추가합니다. 필요한 의존성은 마이바티스 코어(mybatis-core)와 마이바티스 스프링(MyBatis-Spring)입니다.
  • 데이터베이스 설정: 마이바티스는 데이터베이스 접속 정보를 설정해야 합니다. 스프링 설정 파일에서 데이터베이스 접속 정보를 설정하고, DataSource를 생성하여 빈으로 등록합니다.
  • 마이바티스 설정 파일 작성: 마이바티스 설정 파일은 주로 XML로 작성되며, 데이터베이스 접속 정보와 매퍼(Mapper) 파일의 위치 등을 설정합니다. XML 파일에 <configuration> 요소를 작성하고, 데이터베이스 접속 정보와 매퍼 파일 경로를 설정합니다.
  • 매퍼 인터페이스 작성: 매퍼 인터페이스는 SQL 문과 자바 메서드를 매핑하는 역할을 합니다. 인터페이스를 작성하고, 각 메서드에 SQL 문을 작성합니다. 메서드의 이름과 SQL 문의 id를 일치시켜 매핑합니다.
  • 스프링과 마이바티스 연동 설정: 스프링 설정 파일에서 마이바티스를 스프링과 연동하기 위한 설정을 추가합니다. <bean> 요소를 사용하여 SqlSessionFactoryBean과 MapperFactoryBean을 등록하고, DataSource와 마이바티스 설정 파일 경로를 설정합니다.

위의 단계를 따라가면 스프링과 마이바티스를 연동할 수 있습니다. 

 

스프링과 마이바티스를 연동에서, 먼저 마이바티스를 위한 SqlSessionFactory를 스프링 설정 파일에 정의해야 합니다.

[XML 설정 예제]

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>

 

[Java Config 설정 예제]

@Configuration
public class MyBatisConfig {

    @Autowired
    private DataSource dataSource;

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        return sessionFactory.getObject();
    }
}

 

이러한 설정을 통해 마이바티스와 스프링을 연동할 수 있습니다. 이렇게 설정하면 마이바티스가 제공하는 기능들을 스프링에서 사용할 수 있게 됩니다.

 

이제 스프링과 마이바티스를 활용하여 데이터베이스에 접근하고 SQL을 실행할 수 있습니다.

 


8.2. SqlSessionFactoryBean 설정

SqlSessionFactoryBean은 MyBatis-Spring 통합 라이브러리에서 제공하는 기능으로, 마이바티스의 SqlSessionFactory를 스프링의 FactoryBean 형태로 사용할 수 있게 해 줍니다. 이를 통해 스프링에서 마이바티스를 더욱 쉽게 사용할 수 있습니다.

 


8.2.1. SqlSessionFactoryBean의 역할

SqlSessionFactoryBean은 MyBatis-Spring 통합 라이브러리에서 중요한 역할을 하는 클래스입니다. 이 클래스는 Spring에서 MyBatis를 효율적으로 사용할 수 있도록 돕는 역할을 합니다. 그 역할을 이해하려면 먼저 SqlSessionFactory와 FactoryBean에 대한 이해가 필요합니다.

  • SqlSessionFactory: MyBatis의 핵심 클래스 중 하나입니다. 이 클래스는 데이터베이스와의 모든 SQL 작업을 수행하는 SqlSession 인스턴스를 생성합니다. SqlSessionFactory는 일반적으로 애플리케이션의 생명주기 동안 한 번만 생성되고 여러 SqlSession 인스턴스를 생성하는데 재사용됩니다.
  • FactoryBean: Spring 프레임워크에서 제공하는 인터페이스입니다. 이 인터페이스를 구현하는 빈은 일반 빈이 아니라 실제 생성되는 객체를 만드는 공장 역할을 합니다. FactoryBean이 생성하는 객체는 빈 설정에서 FactoryBean 자체가 아니라 FactoryBean.getObject() 메서드가 반환하는 객체입니다.

이제 SqlSessionFactoryBean의 역할을 더 자세히 알아보겠습니다. SqlSessionFactoryBean은 FactoryBean<SqlSessionFactory>를 구현합니다. 즉, 이 빈은 getObject() 메서드를 호출할 때마다 SqlSessionFactory 인스턴스를 생성하는 역할을 합니다.

 

SqlSessionFactoryBean의 가장 중요한 설정 중 하나는 DataSource입니다. DataSource는 데이터베이스 연결을 제공하는 객체로, SqlSessionFactoryBean은 이 DataSource를 사용하여 SqlSessionFactory를 생성합니다. 따라서 DataSource 설정은 SqlSessionFactoryBean 설정의 핵심 부분입니다.

 

또한 SqlSessionFactoryBean은 MyBatis 설정 파일의 위치와 매퍼 파일의 위치도 설정할 수 있습니다. 이 설정들은 MyBatis가 SQL을 어떻게 처리할지 결정하는 중요한 정보를 제공합니다.

 

요약하면, SqlSessionFactoryBean의 역할은 Spring 환경에서 MyBatis SqlSessionFactory를 생성하고 설정하는 것입니다. 이를 통해 MyBatis와 Spring을 원활하게 연동할 수 있습니다.

 

8.2.2. SqlSessionFactoryBean 설정 방법

SqlSessionFactoryBean을 설정하기 위해서는 먼저 데이터 소스와 마이바티스 설정 파일의 위치를 지정해야 합니다. 데이터 소스는 DB 연결 정보를 담고 있고, 마이바티스 설정 파일은 SQL 매핑 정보를 담고 있습니다. 이 두 가지 정보를 SqlSessionFactoryBean에 제공하면, 스프링은 이 정보를 이용해 SqlSessionFactory를 생성하게 됩니다. 

 

XML 설정 방식

스프링의 applicationContext.xml 파일에서 SqlSessionFactoryBean을 설정하는 방법입니다.

 

[Apache Commons DBCP를 이용한 예제]

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>

 

[HikariCP를 이용한 예제]

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>

 

Java Config 설정 방식

@Configuration 어노테이션을 붙인 Java 클래스에서 SqlSessionFactoryBean을 설정하는 방법입니다.

 

[Apache Commons DBCP를 이용한 예제]

@Configuration
public class MyBatisConfig {

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("username");
        dataSource.setPassword("password");

        return dataSource;
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));

        return sqlSessionFactoryBean;
    }
}

 

[HikariCP를 이용한 예제]

@Configuration
public class MyBatisConfig {

    @Bean
    public DataSource dataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        hikariConfig.setUsername("username");
        hikariConfig.setPassword("password");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);

        return dataSource;
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));

        return sqlSessionFactoryBean;
    }
}

 

이와 같이 설정 방법을 선택하여 사용하면 됩니다. XML 설정 방식은 설정 파일을 별도로 관리할 수 있는 장점이 있으나, Java Config 설정 방식은 코드를 통해 직관적으로 설정을 볼 수 있는 장점이 있습니다. 선택은 개발 환경과 개인의 취향에 따라 달라질 수 있습니다. 

 


8.3. 스프링 DAO 작성

DAO(Data Access Object)는 데이터베이스의 데이터를 접근하는 객체를 의미합니다. 스프링과 마이바티스를 사용하면 DAO를 쉽게 작성하고 관리할 수 있습니다. 여기서는 인터페이스 기반, XML 매퍼 사용, 어노테이션 기반의 세 가지 방법으로 DAO를 작성하는 방법에 대해 설명하겠습니다.

 


8.3.1. 인터페이스 기반 스프링 DAO

인터페이스 기반 스프링 DAO는 인터페이스와 이에 해당하는 SQL 매핑 파일을 통해 DAO를 구현합니다. 인터페이스 메소드와 SQL 매핑 파일의 SQL문은 이름이 일치해야 합니다.


8.3.1.1. 인터페이스 기반 DAO란?

DAO(Data Access Object)는 데이터베이스에 접근하는 로직을 담당하는 객체를 의미합니다. DAO는 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 수행하는 메서드들로 구성되어 있습니다. 

 

인터페이스 기반 DAO란, 인터페이스를 사용하여 DAO를 구현하는 방식을 말합니다. 즉, 데이터베이스에 접근하는 메서드들을 인터페이스에 정의하고, 이 인터페이스를 구현하는 클래스에서 실제 데이터베이스 접근 로직을 작성하는 것입니다.

 

8.3.1.2. 인터페이스 기반 DAO의 장점

인터페이스 기반 DAO의 가장 큰 장점은 유연성입니다. 인터페이스를 사용하면 다양한 구현체를 간편하게 교체할 수 있습니다. 이는 테스트 환경과 실제 환경에서의 DAO 구현체 교체, 다른 데이터베이스로의 마이그레이션 등에 유용합니다.

 

또한, 인터페이스를 사용하면 DAO의 메서드를 명확하게 정의하고, 이를 따르는 코드를 작성함으로써 코드의 가독성과 유지보수성을 향상할 수 있습니다.

 

8.3.1.3. 인터페이스 기반 DAO의 설계

인터페이스 기반 DAO를 설계하는 방법은 간단합니다. 먼저, 데이터베이스에 접근해야 할 기능들을 메서드로 정의한 인터페이스를 작성합니다.

 

예를 들어, 사용자 정보를 관리하는 DAO라면 다음과 같은 인터페이스를 작성할 수 있습니다.

public interface UserDao {
    User getUser(int id);
    List<User> getAllUsers();
    void createUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

 

8.3.1.4. 마이바티스와 스프링의 통합

MyBatis는 SQL 매핑 프레임워크로, 복잡한 SQL, 저장 프로시저 및 고급 매핑을 지원합니다. MyBatis-Spring은 MyBatis와 Spring 프레임워크를 통합하는 라이브러리입니다.

 

이 라이브러리를 사용하면 스프링에서 MyBatis를 더 쉽게 사용할 수 있습니다. 특히, MyBatis-Spring을 사용하면 DAO의 구현 클래스를 작성하지 않고도 MyBatis 매퍼를 스프링 DAO로 사용할 수 있습니다.

 

8.3.1.5. 예제 코드 및 설명

아래 코드는 MyBatis-Spring을 사용하여 인터페이스 기반 DAO를 구현하는 예제입니다.

 

먼저, MyBatis 매퍼 파일(UserMapper.xml)을 작성합니다. 이 파일에는 SQL 쿼리와 그 쿼리를 실행하는 메서드를 매핑하는 정보가 들어갑니다.

<mapper namespace="com.example.dao.UserDao">
    <select id="getUser" resultType="com.example.model.User">
        SELECT * FROM Users WHERE id = #{id}
    </select>
    <!-- 여기에 나머지 CRUD 메서드와 SQL 쿼리를 매핑하는 코드를 추가 -->
</mapper>

 

다음으로, UserDao 인터페이스를 작성합니다. 이 인터페이스는 MyBatis 매퍼 파일에서 정의한 메서드들과 동일한 메서드를 가져야 합니다.

public interface UserDao {
    User getUser(int id);
    // 여기에 나머지 CRUD 메서드를 추가
}

 

마지막으로, 스프링 설정 파일에 UserDao 인터페이스를 DAO 빈으로 등록합니다.

<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.example.dao.UserDao" />
    <!-- 여기에 필요한 나머지 프로퍼티를 설정 -->
</bean>

다음은 @MapperScan 어노테이션을 사용하여 DAO 빈을 등록하는 예제입니다.

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.example.dao") // 여기에 매퍼 인터페이스가 위치한 패키지를 지정합니다.
public class AppConfig {
    // 필요한 추가 설정을 여기에 작성합니다.
}

 

8.3.2. XML 매퍼를 사용한 스프링 DAO

XML 매퍼를 사용하면 SQL 쿼리와 결과 매핑을 XML 파일로 작성할 수 있습니다. 이 방법은 복잡한 SQL 쿼리를 작성하거나 동적 SQL을 사용해야 할 때 유용합니다.

 

8.3.2.1. XML 매퍼란?

XML 매퍼는 마이바티스(MyBatis)에서 제공하는 SQL 매핑 도구입니다. 이를 사용하면 SQL 문을 XML 파일에 작성하고, 이 SQL 문을 DAO의 메서드와 연결시킬 수 있습니다.

 

8.3.2.2. XML 매퍼의 장점

XML 매퍼의 가장 큰 장점은 SQL 문을 코드와 분리하여 관리할 수 있다는 것입니다. 이렇게 함으로써 코드가 깔끔해지고, SQL 문의 수정이나 추가가 용이해집니다. 또한, XML 파일에 SQL 문을 작성함으로써 SQL 문이 어떻게 작성되었는지 쉽게 파악할 수 있습니다.

 

8.3.2.3. XML 매퍼의 설계

XML 매퍼를 설계하는 방법은 간단합니다. 먼저, SQL 문을 작성한 XML 파일을 만듭니다. 이 파일은 일반적으로 DAO 인터페이스와 같은 이름을 갖습니다. 그리고 이 XML 파일에는 DAO 인터페이스의 각 메서드에 해당하는 SQL 문이 포함됩니다.

 

8.3.2.4. 마이바티스와 스프링의 통합 - XML 매퍼 사용

마이바티스는 XML 매퍼와 자바 코드를 연결시켜주는 기능을 제공합니다. 그리고 마이바티스-스프링 통합 라이브러리를 사용하면 이 XML 매퍼를 스프링 DAO로 사용할 수 있습니다.

 

8.3.2.5. 예제 코드 및 설명

XML 매퍼를 사용한 스프링 DAO 구현을 위해, 먼저 UserMapper.xml이라는 XML 매퍼 파일을 작성해 봅시다.

 

<mapper namespace="com.example.dao.UserDao">
    <select id="getUser" resultType="com.example.model.User">
        SELECT * FROM Users WHERE id = #{id}
    </select>
    <!-- 나머지 CRUD 작업에 대한 SQL 문을 여기에 추가합니다. -->
</mapper>

 

이 XML 파일에서, <mapper> 태그의 namespace 속성은 DAO 인터페이스의 풀 네임을 지정합니다. 그리고 <select> 태그는 SQL SELECT 문을 정의하며, 이 태그의 id 속성은 DAO 인터페이스의 메서드 이름을 지정합니다.

 

다음으로 UserDao 인터페이스를 작성합니다. 이 인터페이스는 XML 매퍼 파일에서 정의한 메서드와 동일한 메서드를 가져야 합니다.

public interface UserDao {
    User getUser(int id);
    // 나머지 CRUD 메서드를 여기에 추가합니다.
}

 

마지막으로, 스프링 설정 파일에 UserDao 인터페이스를 DAO 빈으로 등록합니다.

<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.example.dao.UserDao" />
    <!-- 필요한 나머지 프로퍼티를 여기에 설정합니다. -->
</bean>

 

이렇게 하면 UserDao 인터페이스를 구현하는 DAO 빈이 스프링 컨테이너에 등록됩니다. 이 빈은 XML 매퍼 파일에서 정의한 SQL 쿼리를 사용하여 데이터베이스에 접근합니다.

 

자바 기반 설정을 선호한다면, XML 설정 대신 @MapperScan 어노테이션을 사용하여 MyBatis 매퍼 인터페이스를 자동으로 스프링 빈으로 등록할 수 있습니다.

@Configuration
@MapperScan("com.example.dao")
public class AppConfig {
    // 필요한 추가 설정을 여기에 작성합니다.
}

 

8.3.3. 어노테이션 기반 스프링 DAO

어노테이션을 사용하면 XML 매퍼 파일 없이도 SQL 쿼리를 작성할 수 있습니다. 이 방법은 간단한 쿼리를 작성하거나 쿼리의 가독성을 높이고 싶을 때 사용합니다. 

 

8.3.3.1. 어노테이션 기반 스프링 DAO란?

어노테이션 기반 스프링 DAO는 마이바티스(MyBatis)에서 제공하는 어노테이션을 사용하여 DAO 클래스를 구현하는 방법입니다. 이 방법에서는 별도의 XML 파일을 작성할 필요 없이, DAO 인터페이스에 어노테이션을 사용하여 SQL 쿼리를 작성합니다. 

 

8.3.3.2. 어노테이션 기반 스프링 DAO의 장점

어노테이션 기반 스프링 DAO의 주요 장점은 XML 파일을 사용하지 않고 자바 코드 내에서 SQL 쿼리와 매핑을 관리할 수 있다는 것입니다. 이로 인해 코드의 간결성과 유지 관리가 용이해집니다. 

 

8.3.3.3. 마이바티스 어노테이션 사용법

마이바티스에서 제공하는 주요 어노테이션은 다음과 같습니다.

  • @Select: SELECT 쿼리를 정의합니다.
  • @Insert: INSERT 쿼리를 정의합니다.
  • @Update: UPDATE 쿼리를 정의합니다.
  • @Delete: DELETE 쿼리를 정의합니다.

이러한 어노테이션을 DAO 인터페이스의 메서드에 적용하여 SQL 쿼리를 작성합니다.

 

8.3.3.4. 어노테이션 기반 DAO 예제 코드 및 설명

다음은 어노테이션 기반 스프링 DAO를 사용하는 예제입니다.

먼저, UserDao 인터페이스를 작성하고 어노테이션을 사용하여 SQL 쿼리를 정의합니다.

public interface UserDao {
    @Select("SELECT * FROM Users WHERE id = #{id}")
    User getUser(int id);

    // 나머지 CRUD 메서드에 대한 어노테이션을 여기에 추가합니다.
}

 

마지막으로, 스프링 설정 파일에 UserDao 인터페이스를 DAO 빈으로 등록합니다.

<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.example.dao.UserDao" />
    <!-- 필요한 나머지 프로퍼티를 여기에 설정합니다. -->
</bean>

 

자바 기반 설정을 선호한다면, XML 설정 대신 @MapperScan 어노테이션을 사용하여 MyBatis 매퍼 인터페이스를 자동으로 스프링 빈으로 등록할 수 있습니다.

@Configuration
@MapperScan("com.example.dao")
public class AppConfig {
    // 필요한 추가 설정을 여기에 작성합니다.
}

 


8.4. 트랜잭션 관리 통합

스프링 프레임워크는 효과적인 트랜잭션 관리를 위한 여러 메커니즘을 제공합니다. 마이바티스는 이러한 스프링의 트랜잭션 관리 기능을 지원하므로, 마이바티스를 사용하는 애플리케이션에서도 스프링의 트랜잭션 관리 기능을 활용할 수 있습니다. 트랜잭션은 데이터 일관성을 유지하고, 여러 동작이 원자적으로 수행되도록 보장하는 중요한 메커니즘이므로, 이를 효율적으로 관리하는 것은 애플리케이션의 안정성과 성능에 큰 영향을 미칩니다.

 


8.4.1. 스프링 트랜잭션 관리 연동 방법

스프링 트랜잭션 관리를 마이바티스와 연동하려면, PlatformTransactionManager 빈을 스프링 설정에 정의해야 합니다.

 

8.4.1.1. PlatformTransactionManager 빈 설정

이 빈은 스프링이 트랜잭션을 관리하는 방법을 결정합니다. DataSourceTransactionManager는 JDBC 트랜잭션을 처리하는 구현체입니다. DataSourceTransactionManager는 DataSource를 생성자 인자로 받아, 이를 통해 트랜잭션을 관리합니다.

 

[예제]

@Configuration
public class AppConfig {

    @Autowired
    private DataSource dataSource;

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}

 

8.4.1.2. DataSourceTransactionManager와 DataSource

DataSourceTransactionManager는 DataSource에서 커넥션을 얻어와 트랜잭션을 시작하며, 트랜잭션이 종료되면 커넥션을 DataSource에 반환합니다. 이렇게 함으로써, JDBC 트랜잭션의 생명 주기를 DataSource와 연결하여 관리할 수 있습니다.

 

8.4.2. 트랜잭션 관리 설정 예제

스프링의 @Transactional 어노테이션을 사용하면 특정 메소드나 클래스에 트랜잭션 관리를 적용할 수 있습니다. 이 어노테이션을 사용하면 스프링이 메소드 실행 전에 트랜잭션을 시작하고, 메소드 실행 후에 트랜잭션을 커밋하거나 롤백합니다.

 

8.4.2.1. @Transactional 사용

[예제]

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void updateUser(User user) {
        userDao.updateUser(user);
        //...
    }
}

 

이렇게 설정하면 updateUser 메소드는 트랜잭션 내에서 실행됩니다. 메소드 실행 도중 예외가 발생하면 스프링이 트랜잭션을 자동으로 롤백합니다. 이는 데이터의 일관성을 보장하고, 예상치 못한 문제가 발생했을 때 데이터를 안전하게 보호하는데 중요합니다.

 

8.4.2.2. @Transactional의 동작 원리

@Transactional 어노테이션은 스프링 AOP(Aspect Oriented Programming)를 활용하여 동작합니다. 이 어노테이션이 붙은 메소드가 호출되면, 스프링은 먼저 트랜잭션을 시작합니다. 그리고 해당 메소드가 정상적으로 종료되면 트랜잭션을 커밋하고, 예외가 발생하면 롤백합니다. 이렇게 하여 메소드 수행이 원자적인 동작이 되도록 보장하며, 데이터의 일관성을 유지합니다.

 

 

 

2023.05.16 - [GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~] - [마이바티스(MyBatis)] 트랜잭션 관리

 

[마이바티스(MyBatis)] 트랜잭션 관리

Chapter 7. 트랜잭션 관리 데이터베이스 작업을 안전하게 수행하려면 트랜잭션 관리가 필수적입니다. 이 장에서는 트랜잭션의 개념, 중요성 그리고 마이바티스에서 트랜잭션을 어떻게 관리하는지

gdngy.tistory.com

 

반응형

댓글