일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 리액트
- mybatis
- Spring
- 다형성
- Middleware
- Sort()
- DB
- 오류
- push함수
- 추상클래스
- 생성자
- git
- 자바스크립트
- React
- 코딩테스트
- js
- 삼항연산자
- Oracle
- 깃허브
- java
- app.use
- 콘솔게임
- dart
- 자바
- qqOperater
- 배열
- int와 integer
- Pug
- Node.js
- 네임드생성자
- Today
- Total
평행코드
<Spring> AOP (Aspect Orientied Programing) 본문
AOP (Aspect Orientied Programing) → 관점지향프로그래밍
→ 공통의 관심사(서브기능)를 저장하는 aspect 클래스를 생성
Aspect클래스 선언하기
-pointcut : 타겟이 되는 메소드를 지정 → 패턴으로 지정(표현식)
-advisor : 실행할 시점을 설정 → 실행할 메소드에 선언
→ Before, After, Around(전후), AfterReturing, AfterThrowing
AOP적용하기
1. xml 방식
spring bean configuration.xml에 aop namespace를 추가
<aop:config>
<aop:aspect bean등록>
<aop:pointcut 표현식 아이디 설정>
<aop:before 또는 <aop:after> 또는 <aop:around> …
실행할메소드지정, 적용할 pointcut등록

execution 사용방법
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
여기서 사용한 방식 execution(* com.xyz.service.AccountService.*(..))
aop-context.xml파일을 새로 생성해 주었으면
web.xml에 <param-value>에 추가해주기!

2. 어노테이션방식
- aspect클래스 선언부에 @Component, @Aspect 어노테이션을 설정
(@Component 어노테이션을 이용하면 Bean Configuration 파일에 Bean을 따로 등록하지 않아도 사용할 수 있다.)
- 클래스 내부에 @Pointcut어노테이션을 선언한 메소드를 설정
- @Before 또는 @After 또는 @Around 또는 @AfterReturing …
실행할 메소드 선언부에 설정
- 어노테이션을 처리할 수 있게 springbeanconfiguration.xml에
<aop:aspectj-autoproxy>태그를 선언해줘야함.
maven dependency에 aspectjweaver모듈을 추가
AOP방식의 장점 & 언제사용하는지?
기존 코드를 뜯어고치지않고도 새로 메소드(기능)를 추가할 수 있다!!
기록을남길때도 유용하게 사용할 수 있고, 어떤 사람이 이 데이터를 수정, 삭제했는지 알 수 있도록 할 수 있다.
ex) 보안로직, 캐싱처리, 로그남길때 …
아래는 @Aspect 로 StopWatch 를 사용한 예시이다
StopWatch 사용하기
@Component
@Aspect
@Slf4j
public class AnnoLoggerAspect {
@Around("within(com.bs.spring..dao.*)")
public Object daotest(ProceedingJoinPoint pj)
throws Throwable{
// 전, 후 로직을 한번에 설정할 수 있음.
// 지역변수를 전, 후 로직에서 공유할 수 있다.
// 전, 후를 구분하는 구분자는 ProceedingJoinPoint클래스가 제공하는
// proceed()메소드 호출이다. -> 반환 오브젝트
// 전 : proceed()메소드를 호출하기 전 로직
// 후 : proceed()메소드를 호출한 후 로직
log.debug("===== around before log =====");
StopWatch watch = new StopWatch();
watch.start();
Object obj = pj.proceed();
log.debug("===== around after log =====");
watch.stop();
log.debug("실행 시간 : " + watch.getTotalTimeMillis()+"ms");
return obj;
}
}
'Spring' 카테고리의 다른 글
Spring boot (0) | 2023.12.19 |
---|---|
<Spring> Security (0) | 2023.12.14 |
<Spring> 트랜잭션처리하기 (0) | 2023.12.13 |
<Spring> 인터셉터(Interceptor) (0) | 2023.12.11 |
<Spring> bean validator 구현하는 방법 (1) | 2023.12.11 |