티스토리 뷰
1. AOP(Aspect Oriented Programming)의 개념
- 관점 지향 프로그래밍
- 핵심 기능과 공통 기능을 분리 시켜놓고, 공통 기능을 필요로 하는 시점에서 직접 삽입해 사용하는 방식
- 목적 : OOP(Object Oriented Programming; 객체 지향 프로그래밍)을 좀 더 효율적으로 사용하기 위해 도와주는 개념
자바는 다중 상속이 불가능하므로 다양한 모듈에 상속을 통한 공통 기능 부여가 힘들다.
로그, 권한 체크, 인증, 예외 처리와 같이 필수적이고 반복되는 코드를 공통 기능으로 뺀 후 핵심 기능에 적용하고자 하는 부분에 적용하는 것
2. AOP 개념
(1) 용어
- Aspect(관점) : 공통 기능
- Advice : Aspect가 해야 할 기능 자체
- Joinpoint : Advice를 적용해야 하는 부분 (Ex : 메소드) code와 Advice를 연결해주는 설정 정보
- Pointcut : Joinpoint의 부분으로 실제로 Advice가 적용되는 부분. 클래스명, 메소드명, 정규 표현식 등의 조건을 통해 선택된 일부
- Weaving : Advice, Pointcut을 조합해 핵심 기능에 적용하는 과정. 컴파일시, 클래스 로딩시, 런타임시 세가지 방법에서 Weving 발생 (스프링에서는 런타임 시점에서 weaving)
- Target(핵심 기능) : Advice가 적용될 객체
- Proxy(대행) : Advice를 Target에 적용했을 때 생성되는 객체
(2) 특징
(3) AOP 구현 방법
- proxy를 이용
- 호출부(client) -> Proxy(대행) -> Target(핵심기능)
- XML 스키마 기반의 AOP구현
- AspectJ5에서 정의한 @Aspect 어노테이션 기반의 AOP구현
- POJO 클래스 이용한 AOP 구현
3. xml 방식의 AOP 구현
(1) Advice 종류
- <aop:config> : AOP 정의
- <aop:before> : 메소드 실행 전에 advice 실행
- <aop:after-returning> : 정상적으로 메소드 실행 후 advice 실행
- <aop:after-throwing> : 메소드 실행 중 exception 발생 시 advice 실행
- <aop:after> : 메소드 실행 중 exception이 발생하여도 advice 실행
- <aop:around> : 메소드 실행 전/후 및 exception 발생 시 advice 실행
- <aop:aspect ref="aopname"> : AOP의 대상 객체를 정함
- <aop:pointcut id="xmlPointCut" expression="within(com.javalec.ex.*)"/>
(2) 작업 순서
- 의존 설정 (pom.xml)
<!-- AOP --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver </artifactId> <version>1.7.4</version> </dependency> |
- 공통 기능의 클래스 제작 (Advice 클래스; LogAop.java)
- XML 설정 파일에 Aspect 설정 (applicationCTX.xml)
<aop:config> <aop:aspect id="log" ref="logAop"> <aop:pointcut id="publicM" expression="within(com.javalec.ex.*)" /> <aop:around pointcut-ref="publicM" method="loggerAoP"/> </aop:aspect> </aop:config> |
4. @Aspect를 이용한 AOP 구현
- 의존 설정 (pom.xml)
- @Aspect 어노테이션을 이용한 Aspect 클래스 제작
- XML 파일에 <aop:aspectj-autoproxy /> 설정
Exception |
@Pointcut("execution(public void get*(..))") // public void 인 모든 get 메소드 @Pointcut("execution(* com.javalec.ex.*.*())") // com.javalec.ex 패키지에 파라미터가 없는 모든 메소드 @Pointcut("execution(* com.javalec.ex..*.*())") // com.javalec.ex 패키지와 하위 패키지에 파라미터가 없는 메소드 @Pointcut("execution(* com.javalec.ex.Worker.*())") // com.javalec.ex.Worker 안의 모든 메소드 |
within |
@Pointcut("within(com.javalec.ex.*)") // com.javalec.ex 패키지 안에 있는 모든 메소드 @Pointcut("within(com.javalec.ex..*)") // com.javalec.ex 패키지 및 하위 패키지 안에 있는 모든 메소드 @Pointcut("within(com.javalec.ex.Worker)") // com.javalec.ex.Worker 모든 메소드 |
bean |
@Pointcut("bean(student)") // student 빈에만 적용 @Pointcut("bean(*ker)") // ~ker로 끝나는 빈에만 적용 |
-
참고 : https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/?subscribe
원래 오늘이 시험보는 날인 줄 알았는데 다음주여서 속상하다 (⋟﹏⋞)