2021-08-19 강의록_AOP

AOP

  • 횡단 관심사 = cross-concerns = Aspect
    비즈니스로직을 가로로 배열하고, 이 비즈니스 로직을 횡단하면서
  • 핵심 로직은 아니지만 시스템 로직의 완전성을 위해 반드시 써야하는 기능들

Aspect : 추상명사로, 횡단 관심사를 의미 (logging, 보안, 트랜잭션 등)
Advice : 횡단관심사를 구현한 객체.
Target : 핵심로직을 가지고 있는 객체 (비즈니스 로직을 수행하고, advice를 적용할 객체).
실제 advice가 적용되는 대상은, target객체의 메소드이다. (필드x)
Join Point : Advice가 적용될 Target 객체의 메소드. advice가 실제 적용될 지점들로, 여러개가 될 수 있다.
Point Cut : 타겟 객체의 여러 join point 중, 특정 join point에 Advice를 결합하는 행위.
광범위하게 설정할수도, 지엽적으로 설정할 수도 있다.
패키지 단위로 하거나, 접근제한자로 하거나, 등등..
Proxy 객체 : Target객체 + Advice
(프록시 = 대리인)

겉으로 봤을 땐, proxy와 target객체가 동일하게 보임.
타겟객체를 대신해서 무언가 수행함. 타겟객체에 직접 접근할 수 없고, 프록시를 통해 접근해야 함.


실제 개발하는 관심사(=Aspect) 코드

Before Advice
After Returning Advice
After Throwing Advice
After Advice
Around Advice

인터셉터의 메소드처럼,
타겟객체의 메소드가 실행되기 전, 후, 실행중 오류 발생시, 실행 정상종료 후 등
어드바이스를 어느 시점에 적용할건지 나눈 것.


어드바이스는 어떤 결과를 return하는 메소드들이 아님.
따라서 대부분 void이다.


트랜잭션 처리

Spring AOP 기능을 이용해서 트랜잭션 처리를 해주려면,
1. @Transactional 어노테이션 사용.
2. root-context.xml에 설정태그 2개 추가

  • 트랜잭션 관리자 빈(Bean) 등록
    spring-jdbc dependency 필요 => spring-tx dependency도 함께 추가
  • 트랜잭션 처리를 위한 특수한 태그 등록

Database Transaction의 종류 (2가지)

  1. Local Transaction (TX)
    하나의 Connection으로 한 개 이상의 DML작업을 수행할 때,
    이 DML작업들을 원자성(All or Nothing)으로 처리.
//하나의 Connection 얻음
Connection conn = dataSource.getConnection();

try{
	PreparedStatement pstmt1 = conn.preparedSQL(dml_sql);
	PreparedStatement pstmt2 = conn.preparedSQL(dml_sql);
	PreparedStatement pstmt3 = conn.preparedSQL(dml_sql);
	PreparedStatement pstmt4 = conn.preparedSQL(dml_sql);

	pstmt1.executeUpdate();
	pstmt2.executeUpdate();
	pstmt3.executeUpdate();
	pstmt4.executeUpdate();

	conn.commit();
} catch(Exception e){

	conn.rollback();
}//try-catch
  1. Global Transaction (XA = 분산 트랜잭션)
    2개 이상의 Connection으로, 여러 DML작업을 수행하고
    이 작업들을 하나의 트랜잭션으로 관리.
    절대 commit 또는 rollback으로 처리할 수 없다.
    두 개 이상의 커넥션으로 수행된 여러 dml작업을, 하나의 트랜잭션으로 관리하려면
    반드시 트랜잭션 관리자(Transaction Manager) 가 필요 --> Bean으로 등록
    트랜잭션 관리자는 X/Open XA 규약에 따라 만듦.
//아래와 같이 commit할 수 없다. 
// (만약 중간의 conn에서 커넥션이 끊어지거나 하는 오류가 발생하면?)
conn1.commit();
conn2.commit();
...
conn100.commit();
2단계 커밋/롤백(2-phase 커밋/롤백) 수행
: 1단계 - 각 커넥션에 물어봄(모든 커넥션이 OK)
: 2단계 - 모두 커밋 or 모두 롤백 수행

좋은 웹페이지 즐겨찾기