-- 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 다녀오는 시간 체크도 가능하겠죠?
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 9월' 카테고리의 다른 글
22.09.22 - [ Spring ] 파일 업로드 (1) | 2022.09.30 |
---|---|
22.09.21 - [ 12차 시험! - 통합 구현 ] (0) | 2022.09.29 |
22.09.19 - [ Spring ] lombok, controlllerAdvice, logger (0) | 2022.09.28 |
22.09.16 - [ Spring ] DelegatingFilterproxy ,proxy, interceptor (0) | 2022.09.28 |
22.09.15 - [ Spring ] 암호화 처리, 리다이렉트 방법 (0) | 2022.09.21 |