-
2. AOP(Aspect Oriented Programming)웹개발/SpringBoot 2020. 4. 10. 01:29
스프링은 IOC / AOP / PSA 3가지의 개념을 트라이 앵글 개념이라 부른다.
관점 지향적 프로그래밍 AOP 정의
Spring의 핵심 개념중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춰준다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 하는 것이다.
AOP (Aspect-Oriented Programming) 란 단어를 번역하면 관점(관심) 지향 프로그래밍으로 되는데. 이 관점(관심)이란 단어가 잘 와닿지 않아 AOP를 이해하는데 있어 더 어려움을 일으킨다고 생각하였다. 쉽게 얘기하여 프로젝트를 바라보는 관점을 바꾸어 보자는 말이다.핵심 기능 관점에서 3개의 클래스는 공통 사항이없지만,
부가 기능 관점에서 3개의 클래스는 before 과 after이라는 메소드가 중복되는 것을 볼 수 있다.
AOP는 여기서부터 시작된다.
기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을때 공통된 요소를 추출하자는 것이다.
이때 가로(횡단) 영역의 공통된 부분을 잘라냈다고 하여, AOP를 크로스 컷팅(Cross-Cutting) 이라고 불리기도 한다.- OOP : 비지니스 로직의 모듈화
- 모듈화의 핵심 단위는 비지니스 로직
- AOP : 인프라 혹은 부가기능의 모듈화
- 대표적 예 : 로깅, 트랜잭션, 보안 등
- 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
AOP라고 해서 전에 없던 새로운 개념이 등장한것이 아니다. 결국은 공통된 기능을 재사용하는 기법이다.
OOP에선 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용합니다. 하지만 전체 어플리케이션에서 여기저기에서 사용되는 부가기능들을 상속이나 위임으로 처리하기에는 깔끔하게 모듈화가 어렵다.
그래서 이 문제를 해결하기 위해 AOP가 등장하게 된다.
AOP의 장점- 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다는 점
- 다른 서비스 모듈들이 본인의 목적에만 충실하고 그외 사항들은 신경쓰지 않아도 된다는 점
* 흩어진 코드를 한곳으로 모은다
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 } }
첫번째 예제문제를 해결하기 위해 AAAA와 BBBB를 한곳에 모은다. 이게 AOP 이다.
예시)
AOP 에서 사용하는 @Transactional StopWatch 가 중복되어 있다 이것은 AOP가 아니다 !! StopWatch를 없애면서도 시간을 측정할 수 있게 하는 것이 AOP 이다.
AOP 구현방법
- 컴파일 A.java ---(AOP)---> A.class : 코드엔 없지만 컴파일 시에 StopWatch를 넣어준다 (AspectJ)
- 바이트코드조작 A.java -> A.class : A.class(기계어)를 클래스 로더가 읽어온다.클래스를 로딩하는 시점에 메모리에서 StopWatch코드를 넣어준다. 메모리에 올라가는 클래스가 실제 로컬머신에 있던 클래스와 달라진다. (AspectJ)
- 프록시 패턴 ( 스프링 AOP ) https://refactoring.guru/design-patterns/proxy
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
1. 프록시 패턴
Paymemt 기능 구현해 보기
1. Payment Interface 생성
2. Payment를 사용하는 클라이언트 코드 Store 클래스 작성
3. Payment구현체를 상속 받아 사용하는 신용카드 클래스 작성
4. Payment구현체를 상속 받아 사용하는 현금 클래스 작성
Store에서는 계속해서 Payment 구현체만 사용하지만 Payment에서 CreditCard 클래스를 사용시에 Cash를 사용할지 CaeditCard를 사용할지 알아서 판단한다.
2. StopWatch기능 구현해보기
CreditCard 클래스만 수정하기
StopWatch 인스턴스를 추가하고 cash.pay로 결제 테스트 코드 결과 Store 클래스와 Cash 클래스 , Payment 인터페이스 모두 StopWatch기능이 없지만 CrediCard 에서 구현한 StopWatch기능으로 Cash의 성능을 측정 할 수 있었다. CrediCard라는 프록시를 만들었고 클라이언트코드 Store이 프록시CrediCard를 사용하게 끔 만들었기 때문에 Cash의 코드를 건드리지 않고 성능측정이 된다.
3. 실제 스프링에서 AOP 적용 해보기
@LogExecutionTime으로 메소드 처리 시간 로깅하기
어노테이션 만들기
어노테이션 만들기 - Target = 어느곳에서 해당 어노테이션을 사용할 것 인가 ? 함수
- Retention = 이 어노테이션 정보를 언제 까지 유지 할 것 인가? 런타임 까지
Aspect클래스 생성
위의 어노테이션을 실행할 Aspect 클래스 - @Around를 사용함으로써 joinPoint를 받을 수 있다. joinPoint는 @LogExecutionTime어노테이션이 붙어있는 메소드를 타겟으로 한다.
- Object proceed = joinPoint.proceed(); 해당 타겟을 실행한다.
- 코드 앞뒤로 stopWatch로 실행시간을 측정하여 로그를 출력한다.
@Around("@annotation(LogExecutionTime)") 위의 내용을 LogExecutionTime 어노테이션 주변에 적용한다
reference
https://jojoldu.tistory.com/71
AOP 정리 (3)
AOP란? Spring의 핵심 개념중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춰준다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원하는 것입니다. AOP (Aspect-Oriented Programming)..
jojoldu.tistory.com
https://www.inflearn.com/course/spring_revised_edition/lecture/19742
예제로 배우는 스프링 입문 (개정판) - 인프런
이 강좌는 스프링 프레임워크에 입문하는 분들을 위한 강좌입니다.Spring - PetClinic이라는 스프링 공식 예제 프로젝트의 코드를 보며, 다음의 스프링의 핵심 기능을 쉽고 빠르게 이해할 수 있습니다. 초급 웹 개발 서버 프레임워크 및 라이브러리 Java Spring 온라인 강의 스프링 입문 개정판
www.inflearn.com
'웹개발 > SpringBoot' 카테고리의 다른 글
3. 스프링 PSA (0) 2020.04.28 1. IOC(Inversion of Controll) / DI(Depengency Injection) / Bean (0) 2020.04.05 내장 웹 서버 응용 ( 톰켓 말고 다른 서버 사용하기) (0) 2020.04.03 내장 웹 서버 이해 (0) 2020.04.03 - OOP : 비지니스 로직의 모듈화