https://www.youtube.com/watch?v=Hm0w_9ngDpM
우아한테크코스 제이님의 AOP 테코톡을 정리해 봤습니다.
AOP는 Aspect-Oriented-Programming의 약자로
관점 지향 프로그래밍이라는 뜻입니다.
이름만 봐서는, OOP(객체 지향 프로그래밍)과
대치될 것 같은 이름이지만 그렇지 않습니다.
AOP는 OOP를 보완한 일종의 패러다임입니다.
📝 개요
⦁ 회사 상사에게 부탁을 받은 자이는 기능을 개발합니다.
⦁ 잘 개발하고 싱글벙글 출근을 하게 됩니다. 😀
⦁ 자이는 퇴사를 결심하게 됩니다. 회사에 메서드가 1억 개였기 때문이죠 😂
농담이고 자이는 1억 개의 메서드에 작업을 하는 중에 이상한 점을 발견합니다.
⦁ 사실상 이 코드에서 핵심적인 내용은 비즈니스 로직 1줄아닌가?
핵심 로직 말고 부가기능이 들어간 것 같은데? 라는 생각을 하게 됩니다.
⦁ 부가 기능? (인프라 로직)
사실 서비스에서 필요한 내용은 비즈니스 로직이라는 핵심 기능만 수행할 수 있으면 됩니다.
그 외에 시간을 잰다든지 권한을 체크한다든지 트랜잭션을 건다든지 하는 것은 모두 일종의
인프라 로직이라고 불립니다.
⦁ 힁단 관심사 (cores-cutting concern)
비즈니스 로직을 수행하는 데 있어서 부가 기능이 되는 인프라 로직의 중복이
힁단으로 나타나기 때문이 이것을 힁단 관심사라고 부릅니다.
✔ 즉, AOP 관점 지향 프로그래밍이란 힁단 관심에 따라 프로그래밍 한다고 생각하면 편합니다.
📝 AOP 용어
⦁ Target
✔ 어떤 대상에 부가 기능을 부여할 것인가
⦁ Advice
✔ 어떤 부가 기능?
⦁ @Before (이전) : 어드바이스 타겟 메서드가 호출되기 전에 어드바이스 기능을 수행
⦁ @After(이후) : 타겟 메서드의 결과에 상관없이 완료되면 어드바이스 기능을 수행
⦁ @AfterReturning(정상적 반환 이후) : 어드바이스 타겟 메서드가 성공적으로 리턴 후에 기능을 수행
⦁ @AfterThrowing(예외 발생 이후) : 어드바이스 타겟 메서드 수행 중 예외를 던지면 기능을 수행
⦁ @Around (이전) : 어드바이스가 타겟 메서드를 감싸서 호출 전과 후에 기능을 수행
⦁ Join point
✔ 어디에 적용할 것인가? ( 메서드, 필드, 객체, 생성자 등 )
스프링은 메서드만 사용할 수 있습니다.
⦁ Point cut
✔ 실제 advice가 적용 될 지점, Spring AOP에서는 advicce가 적용될 메서드를 선정
📝 AOP의 구현 방법
⦁ 컴파일
.java -> .class 파일로 컴파일 하는 시점에 해당하는 aspect 들을 끼워 넣어준다.
⦁ 클래스 로드 시
.class 파일을 클래스 로더가 메모리 상에 올릴 때 AOP를 적용시키는 방식
⦁ 프록시 패턴 ( Spring AOP에서 사용 )
어떤 타겟 클래스를 부가 기능을 제공하는 프록시로 감싸서 실행하는 방식
스프링은 IOC와 DI를 기반으로 하기 때문에 가능한 방식입니다.
📝 Spring AOP & Aspect J
📑 Docs
⦁ 이게 뭔가요?
✔ Spring AOP와 AspectJ는 Java에서 유명한 AOP 프레임 워크입니다.
Spring AOP는 개발자가 마주한 공통적인 문제를 해결하고자 Spring IoC를 통한
간단한 AOP 구현이 목적입니다.
즉, 완전한 AOP를 의도한 것이 아니며 Spring Container에 의해 관리되는
Beans에만 적용 가능합니다.
위에서 Join point에 메서드만 사용 가능했던 이유도 이와 같습니다.
반면, AspectJ는 완전한 AOP를 제공하는 것이 목적이기 때문에
Spring AOP보다 강력하지만 복잡합니다. (약 8배~35배 가까이 빠르다고 하네요.)
그동안 공통된 동작들을 함수로 만들어서 사용했습니다.
코드의 중복을 최소화하고 간결해지는 것이 OOP의 장점 중 하나였습니다.
AOP도 결국 본질은 OOP와 다르지 않습니다.
프로그래밍 패러다임을 제대로 이해하고 사용하는 것이
개발자에게 있어서 삶의 질을 향상시키는
수단이라는 생각이 들었습니다. 😂
공부 화이팅! 🔥
참고 문헌 :
https://logical-code.tistory.com/118
https://www.youtube.com/watch?v=Hm0w_9ngDpM
https://engkimbs.tistory.com/746
'Back-End > Spring' 카테고리의 다른 글
[Spring Boot] 스프링부트 JVM 충돌 해결방법 (Java Runtime Environment (JRE), 인텔리제이) (0) | 2023.07.26 |
---|---|
[Spring] 자바 스프링 Bean Scope 정리, 싱글톤 패턴 (singleton, prototype) (0) | 2022.10.28 |
[Spring] 자바 스프링 한글 깨짐 해결 (filter) (0) | 2022.10.27 |
[Spring] 자바 스프링 프로퍼티(properties) 파일 데이터 가져오기 (0) | 2022.10.27 |
[Spring] DI(의존성 주입) @Configuration @Bean 어노테이션 사용방법 (0) | 2022.10.26 |