Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/9월

22.09.20 - [ Spring ] tx(트랜잭션), AOP(관점지향프로그래밍)

giggs 2022. 9. 29. 10:29

 

 

-- INDEX --

 

 

1. 트랜잭션 - tx 2. 트랜잭션 설정 3. AOP 4. AOP 설정 5. AOP 사용법
하나의
논리적 단위
spring-tx
<tx :annotatio-driven />
transactionManager
@transactional
관점지향
프로그래밍
springAOP
AspectJrt
Aspectweaver
<aop: aspect-autoproxy />
<component-scan>
시점관련

타겟관련

 

 

 

 


 

 

 

 

1. 트랜잭션 - tx

  • 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
  • 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

 

 

1-1 : 트랜잭션 테스트 상황 설정

  • A->B 로 송금하는 상황
  • 보내는 금액만 입력받아서 송금작업 처리
  • A는 마이너스 , B는 플러스되는 상황
  • 플러스하는 쪽에서 에러 발생하게 해 주고 송금 작업해보기
  • A 계좌에서는 마이너스 작업이 되었는데
  • 에러가 나서 B 계좌에서는 플러스가 되지 않았다.
  • 이런 상황에서 rollback을 해주도록 하려면
  • 마이너스와 플러스 작업이 하나의 작업으로 처리되게 해 주려면
  • 하나의 트랜잭션으로 처리되게 해 주려면
  • 어떻게 해야 할까?

 

 

 

이 작업( = 마이너스, 플러스 - 2가지 작업 )

안에서 무엇인가 문제가 발생하면 롤백했으면 좋겠다.

 

 

 

 

 

 

내가 직접 할 수 없으니 스프링에게 해달라고 해야 한다..

 

 

 

 

 

 

 


 

 

 

2. 트랜잭션 설정하기

 

 

 

 

1. pom.xml 에 <dependency> –  라이브러리 등록

2. servlet-context.xml에 가서 트랜잭션 어노테이션 활성화

3. root-context.xml에 가서 bean 등록

( db관련정보는 root 바구니에 해놨으니까 )

 

 

 


 

 

2-1 : spring-tx 라이브러리 등록

  • pom.xml 에서 작업
  • spring-tx 라이브러리 등록

 

 

 


 

 

2-2 : @Transactional 어노테이션 활성화 작업

  • servlet-context에서 작업
  • <tx: annotation-driven />

 

 

 


 

2-3 : 트랜잭션 관리 bean 등록 - ( id 고정 )

  • 클래스는 - DataSourceTransactionManager
  • 특정 id로 지정해주어야 한다. = transactionManager
  • id로 작업이 이루어져서 트랜잭션 관리가 된다.
  • property로 dataSource 필요 - ( BasicDataSource )

 

 

 

 

트랜잭션 매니저는 커넥션을 직접 다뤄야 하므로

property로 위에서 만들어 준 BasicDataSource넣어주어야한다.

 

 

 

 


 

 

 

2-4 : @Transactional 어노테이션 달아주면 된다.

  • 하나의 단위로 작업이 처리되어야 하는 곳에 어노테이션 달아주기

 

 


 

 

2-5 : 트랜잭션 정리

 

  • @Transaction 어노테이션만 달아주면 작동한다.
  • 이것을 작동하게 해 주기 위해서는
  • 라이브러리 등록하고 – 어노테이션 활성화하고 - 빈 등록해주어야 한다.
  • @Transaction 달아주면 앞뒤로 try / catch { rollback } 이런 작업 추가되는 것이다.
  • 더 디테일하게 다루고 싶으면 옵션 알아보면 된다.
  • rollbackFor = 현재 상황
  • noRollbackFor = 이런 예외가 발생하면 그 예외에 대해서는 롤백을 진행하지 않게 해 주는 경우에 사용

 

 

 

 


 

 

 

 

3. AOP란?

  • Aspect Oriented Programming – 관점 지향 프로그래밍
  • 프록시 (Proxy)
  • 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping) 오브젝트
  • 호출자 (클라이언트)에서 타겟을 호출하게 되면 타겟이 아닌 타겟을 감싸고 있는 프록시가 호출되어,
  • 타겟 메소드 실행전에 선처리, 타겟 메소드 실행 후, 후처리를 실행시키도록 구성되어있다.
  •  
  • 이러한 proxy의 기능을 – 특정한 부분에 일괄되게 적용되게 해주는 것이 AOP

 

 

 

 

 

 

복잡한 것은 스프링이 해준다. 우리가 공부해야 할 것은 사용법이다.  

 

1.  대상 지정 관련 사용법

- 타겟 지정 가능함 ( 클래스, 패키지, 메서드 등 다양하게 가능 )

 

 

2.  시점 지정 관련 사용 법

- 코드를 끼워 넣을 수 있음 ( , , 전후 동시에, 에러발생시, 에러 없을 때, 무조건 등 다양하게 가능)

 

 

 

 

 

 


 

 

 

 

4.  AOP 설정하기

  • 새로운 기술을 사용하려면 설정 먼저 해주자

 

 

 

4-1 : <dependency> 3개의 라이브러리 등록 </dependency>

  • spring-aop
  • AspectJRT(이미존재한다)
  • AspectJ weaver

 

 

 


 

 

4-2 : AspectJ rt – 버전확인 - property 변수값 변경 

  • 스프링에 이미 설치되어있던 AspectJ rt의 버전확인 
  • 사용할 버전에 맞춰서 변수 값 변경 - 사용하는 곳에서 변경되도록

 

 

 

 

 


 

 

4-3 : @Aspect 등록과 scan 설정

  • @Aspect 어노테이션 탐지되도록  root-context에 설정 추가

 

 


 

 

1. 어노테이션 탐지되도록 설정해주기 aop:aspectj-autoproxy

 

2. 컴포넌트 스캔 경로는 com.kh.app13

include-filter의 경로는 - @Aspect 달아줄 예정인 MyAspect 클래스 경로

 

 

 

 

 


 

 

 

 

5. AOP 사용해보기

  • @EnableAspectJAutoProxy 추가해주고
  • @Component 추가해주고
  • @Aspect 추가해주고
  •  메서드에  언제 할 건지(시점) + 누구한테 할 건지(타깃) 지정 필요

 

 

 

# 시점 관련 #

 


 

 

# 타겟 관련 #

 

 

 


 

 

 

 

5-1 : 시점 관련 테스트

 

 

 

 

1. @Before 

 

 


 

 

2. @After

 

 


 

 

3. @AfterReturning

  • after랑 똑같은 시점인데 - 타겟에서 예외가 없을때만 동작한다.

 

 


 

 

4. @AfterThrowing 

  • after랑 똑같은 시점인데 - 타겟에서 예외가 있을때만 동작한다.

 


 

 

5. @Around

  • ProceedingjoinPoint 객체를 사용하여 타겟 실행 전, 후 모두 처리 가능
  • ProceedingjoinPoint jp 객체 사용 – 이것을 실제 동작하는 타겟이라고 보면 된다.

 

 

 

 

jp.proceed()로 타겟의 메소드를 실행시키는 경우에는 

# 어떤 리턴 타입이 올지 모르니 메서드 리턴 타입을Object로 해주고 #

# 어떤 메서드가 실행될지 모르는 상황에서 반드시 예외처리 작업 필요하다 #

 

 

 

 

 

 


 

 

 

5-2 : 타겟 관련 테스트 

 

 

 

1. target

  • 클래스와 인터페이스 모두 지정 가능 

 

 

 


 

 

2. within

  • 클래스, 패키지 가능
  • 인터페이스에 대해서는 적용 안됨.

 

 


 

 

3. execution

  • 특정 클래스의 특정 메서드 지정 가능
  • 리턴타입, 파라미터타입 다양하게 지정 가능

 

 

 


 

4. AOP 활용 팁

  • #AOP 잘 활용한다면 @Transactional 어노테이션 없어도 사용할 수 있겠죠?
  • #예외처리도 할 수 있겠죠?
  • #dao 다녀오는 시간 체크도 가능하겠죠?