일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 클린아키텍처
- 스프링핵심원리
- effectivejava
- 자바스크립트
- 오블완
- JavaScript
- Spring
- 이차전지관련주
- 스프링부트
- ElasticSearch
- 이펙티브 자바
- 이펙티브자바
- java
- Effective Java
- k8s
- 카카오 면접
- 엘라스틱서치
- 스프링 핵심원리
- 알고리즘정렬
- 티스토리챌린지
- 알고리즘
- 예제로 배우는 스프링 입문
- 코딩테스트
- Effective Java 3
- Sort
- 김영한
- 스프링
- kubernetes
- 자바
- 카카오
- Today
- Total
Kim-Baek 개발자 이야기
[백기선 - 예제로 배우는 스프링 입문] 스프링 AOP 본문
인프런에서 백기선 님의 [예제로 배우는 스프링 입문] 을 듣고 정리한 내용입니다
AOP 소개
흩어진 코드를 한 곳으로 모아
흩어진 AAAA 와 BBBB
class A {
method a () {
AAAA -> AAA
오늘은 7월 4일 미국 독립 기념일이래요.
BBBB -> BB
}
method b () {
AAAA -> AAA
저는 아침에 운동을 다녀와서 밥먹고 빨래를 했습니다.
BBBB -> BB
}
}
class B {
method c() {
AAAA -> AAA
점심은 이거 찍느라 못먹었는데 저녁엔 제육볶음을 먹고 싶네요.
BBBB -> BB
}
}
흩어져 있는 것을 바꾸려면, 모두 찾아가서 바꿔야하는 문제가 생겨
모아 놓은 AAAA 와 BBBB
class A {
method a () {
오늘은 7월 4일 미국 독립 기념일이래요.
}
method b () {
저는 아침에 운동을 다녀와서 밥먹고 빨래를 했습니다.
}
}
class B {
method c() {
점심은 이거 찍느라 못먹었는데 저녁엔 제육볶음을 먹고 싶네요.
}
}
class AAAABBBB {
method aaaabbb(JoinPoint point) {
AAAA
point.execute()
BBBB
}
}
다양한 AOP 구현 방법
-
컴파일 A.java ----(AOP)---> A.class (AspectJ)
-
바이트코드 조작 A.java -> A.class ---(AOP)---> 메모리 (AspectJ)
-
프록시 패턴 (스프링 AOP)
프록시 패턴
Proxy
There are dozens of ways to utilize the Proxy pattern. Let’s go over the most popular uses. Access control (protection proxy). This is when you want only specific clients to be able to use the service object; for instance, when your objects are crucial par
refactoring.guru
- Cash , CashPerf 예제가 있는데, 기존에 결제를 하는 Cash 클래스는 변화하지 않았다. 하지만 CashPerf 안에서 Cash를 가져다 쓰면서 앞 뒤로 성능을 측정하는 코드가 들어갔다. 그렇게 되면 CashPerf 를 사용함으로 써, 기존의 Cash 코드의 변화 없이 앞 뒤에 새로운 기능이 추가된다.
- @Transactional 을 붙이면 해당 클래스 앞 뒤로 트랜잭션을 설정하는 코드가 들어가게 된다.
AOP 적용 예제
@LogExecutionTime 으로 메소드 처리 시간 로깅하기
@LogExecutionTime 애노테이션 (어디에 적용할지 표시 해두는 용도)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
실제 Aspect (@LogExecutionTime 애노테이션 달린곳에 적용)
@Component
@Aspect
public class LogAspect {
Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around("@annotation(LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object proceed = joinPoint.proceed();
stopWatch.stop();
logger.info(stopWatch.prettyPrint());
return proceed;
}
}
'개발 > Spring' 카테고리의 다른 글
[백기선 - 스프링 프레임워크 핵심 기술] 스프링 소개 (0) | 2020.09.21 |
---|---|
[백기선 - 예제로 배우는 스프링 입문] 스프링PSA (0) | 2020.09.20 |
[백기선 - 예제로 배우는 스프링 입문] 스프링 IoC (0) | 2020.09.20 |
[백기선 - 예제로 배우는 스프링 입문] 프로젝트 살펴보기 ( Pet Clinic ) (0) | 2020.09.20 |
[카카오 면접] 스프링의 예외 처리 (0) | 2020.09.19 |