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객체가 동일하게 보임.
타겟객체를 대신해서 무언가 수행함. 타겟객체에 직접 접근할 수 없고, 프록시를 통해 접근해야 함.
Before Advice
After Returning Advice
After Throwing Advice
After Advice
Around Advice
인터셉터의 메소드처럼,
타겟객체의 메소드가 실행되기 전, 후, 실행중 오류 발생시, 실행 정상종료 후 등
어드바이스를 어느 시점에 적용할건지 나눈 것.
어드바이스는 어떤 결과를 return하는 메소드들이 아님.
따라서 대부분 void이다.
Spring AOP 기능을 이용해서 트랜잭션 처리를 해주려면,
1. @Transactional
어노테이션 사용.
2. root-context.xml에 설정태그 2개 추가
//하나의 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
//아래와 같이 commit할 수 없다.
// (만약 중간의 conn에서 커넥션이 끊어지거나 하는 오류가 발생하면?)
conn1.commit();
conn2.commit();
...
conn100.commit();
2단계 커밋/롤백(2-phase 커밋/롤백) 수행
: 1단계 - 각 커넥션에 물어봄(모든 커넥션이 OK)
: 2단계 - 모두 커밋 or 모두 롤백 수행