ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] REST API 만들기(7) - Transaction 적용
    Spring Boot/2.4.x - REST API 만들기 2020. 5. 9. 16:51
    반응형

    1. Transaction 란?

    모든 작업이 정상적으로 완료되면 Commit을 실행하고, 작업 처리 중 에러가 발생하면 Rollback하는 방식으로 처리하는 일련의 작업들을 하나의 단위로 묶어서 처리하는 것을 트랜잭션이라고 합니다.

     

    2. Transaction의 기본 원칙

    Atomicity (원자성)

    트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 합니다. (All or Nothing)

    Consistency (일관성)

    트랜잭션이 성공적으로 완료하면 모든 데이터는 일관성을 유지해야 합니다.

    Isolation (독립성, 격리성)

    트랜잭션은 독립적으로 처리되며, 처리되는 중간에 외부에서의 간섭은 없어야 합니다.

    Durablility (영속성, 지속성)

    성공적으로 완료된 트랜잭션의 결과는 영구적으로 지속되어야 한다.

     

    3. Transaction 적용

    스프링에서는 직접 트랜잭션을 처리하지 않고, 선언적으로 트랜잭션을 관리할 수 있습니다. 어노테이션을 이용한 트랜잭션 관리와 설정 정보를 이용한 트랜잭션 관리를 지원합니다. 여기에서는 어노테이션 설정을 이용해서 트랜잭션을 관리하도록 하겠습니다.

     

    3_1. DataSourceConfig.java 수정

    트랜잭션 관리를 하기 위해서는@EnableTransactionManagement 어노테이션을 추가해야 합니다. 그리고 트랜잭션 관리자를 명시적으로 선언하기 위해서는 TransactionManagementConfigurer 인터페이스 상속받아 annotationDrivenTransactionManager() 메소드를 구현해야 합니다. 

     

    DataSourceConfig.java

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    package com.api.board.config;
     
    import javax.sql.DataSource;
     
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.TransactionManagementConfigurer;
     
    import com.zaxxer.hikari.HikariDataSource;
     
    @ComponentScan(basePackages = "com.api.board.service")
    @MapperScan(basePackages = "com.api.board.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
    @Configuration
    public class DataSourceConfig implements TransactionManagementConfigurer {
     
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.hikari")
        public DataSource dataSource() {
            return DataSourceBuilder.create()
                                    .type(HikariDataSource.class)
                                    .build();
        }
     
        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource, ApplicationContext applicationContext) throws Exception {
            
            SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            sessionFactory.setDataSource(dataSource);
            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
            
            return sessionFactory.getObject();
        }
     
        @Bean
        public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
        
        @Bean
        public PlatformTransactionManager transactionManager() {
            return new DataSourceTransactionManager(dataSource());
        }
        
        @Override
        public PlatformTransactionManager annotationDrivenTransactionManager() {
            return transactionManager();
        }
    }
    cs

     

    트랜잭션 구성이 완료되면, @Transaction 어노테이션을 이용해서 트랜잭션을 관리할 수 있습니다. 

     

    소스 코드는 Github Repository - https://github.com/tychejin1218/api-board_v1 (branch : section07) 를 참조하세요.
    Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33

    반응형

    댓글

Designed by Tistory.