ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Transaction / AOP
    Java/Spring 2018. 8. 27. 17:13
    반응형

    Transaction - 데이터 처리

    정상적으로 데이터가 처리 되면 Commit - 유지
     Error가 발생되면 Rollback  - 취소


    AOP - 공통코드를 동작시키위한 기술

    Aspect Oriented Programming - 관점 지향 프로그래밍

    Spring AOP로 Transaction을 처리한다.

    weaving - Compile된 여러개의 .class 파일을 하나의 클래스로 묶어서 처리하는 기술

    마치 하나의 코드처럼 움직인다.


    Service Logic / Business Logic 실행 시 Exception이 발생할 때, DataBase에 변경 사항 RollBack이 필요하다.


    AOP는 Point-cut과 Advisor로 구성되어 동작한다.

    Point-cut : 특정 패키지, 클래스, 메소드 지정

    Advisor : 특정 상황 지정


    * 특정 상황

    before - method나 class 실행 전

    after - 실행 후 (  예외발생하던, 정상처리되던 )

    after-throwing - 예외 발생시

    after-returning - 정상 처리시

    around - 모든 범위


    Transaction, Logging 등 다양하게 사용된다.


    spring-aop라는 dependency는 이미 존재한다.


    추가로 org.aspectj의 aspectjweaver dependency를 추가한다.


    <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.1</version>
    </dependency>


    rootContext.xml -> NameSpaces -> tx, aop를 체크한다.


    상황에 따라 Rollback, Commit을 수행할 Transaction Manager를 설정한다.


    * rootContext.xml


    <!-- 공통기능 Rollback, Commit 빈 생성 --> , After-throwing 기준
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />    
    </bean>

    <!-- Rollback, Commit 대상 메소드 지정 -->
    <tx:advice id="transactionAdvisor" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="read*" read-only="true" /> -> fine* Method에서 Error가 실행되는 Method는 rollback한-
    -> 읽기전용, SQL Injection을 방지하기위해 데이터에 안전하게 접근한다.
    <tx:method name="create*" rollback-for="RuntimeException" /> -> RunTimeException 발생시 rollback
    <tx:method name="regist*" rollback-for="RuntimeException" />
    <tx:method name="update*" rollback-for="RuntimeException" />
    <tx:method name="delete*" rollback-for="RuntimeException" />
    </tx:attributes>
    </tx:advice>

    <!-- Transaction( Commit, Rollback ) 대상 클래스 지정 -->
    <aop:config>
    - 패지키명 앞에 띠어쓰기 꼭 해야된다.
    <aop:pointcut expression="execution( * com.ktds..service.*ServiceImpl.*(..) )"
    id="transactionPointcut"/>
    <aop:advisor advice-ref="transactionAdvisor"
    pointcut-ref="transactionPointcut" /> point-cut이나 advisor는 한개의 method만 지정가능하다.
    </aop:config>



    @Contoroller에는 Transaction이 적용되지 않는다.


    BoardServiceImpl에서 강제로 예외를 발생 시켜서 Rollback이 되는지 테스트한다.



    @Override
    public boolean createBoard(BoardVO boardVO, MemberVO memberVO) {
    // 업로드를 했다면
    boolean isUploadFile = boardVO.getOriginFileName() != null;
    int point = 10;
    if ( isUploadFile ) {
    point += 10;
    }
    //      MemberVO loginMemberVO = memberDao.selectOneMember(memberVO);
    // db
    this.memberDao.updatePoint(memberVO.getEmail(), point);
    // session
    int memberPoint = memberVO.getPoint();
    memberPoint += point;
    memberVO.setPoint(point);
    예외 발생구간
    boolean isSuccess = this.boardDao.insertBoard(boardVO) > 0; // -> Rollback
    Integer.parseInt("ABC"); // NumberFormatException, -> Rollback
    return this.boardDao.insertBoard(boardVO) > 0;
    }


    반응형

    댓글

Designed by Tistory.