[TIL] 0827
✏️ 오늘의 학습
AoP (Aspect Orient Programming)
Aspect Orient Programming 사전적의미는 관점 지향 프로그래밍이다. AoP Aspect는 관점이라는 해석보다는 기능, 관심정도로 해석하는게 더 알맞다. 기능, 관심 지향 프로그래밍은 Cross Cuttiong Concerns 을 해결해주는 기법이라고도 할 수 있다. Cross Cuttiong Concerns은 어플리케이션을 만들다보면 Presentation Layer, Business Layer, Data Access Layer 에서 Loggin / Transaction Management / Security - Cross Cuttiong - 등과 같은 공통으로 고민해야하는 내용을 분리해서 프로그래밍을 만들 수 있게해주는 방식이라고 보면된다.
아래와 같은 코드가 있다고 생각해보자. 이체() 메서드와 계좌확인() 메서드에서 비즈니스 로직을 실행하기 전, 후로 부가적이면서 동일한 코드를 반복하고 있다.
class 계좌이체서비스 {
method 이체() {
a()
비즈니스 로직
b()
}
method 계좌확인() {
a()
비즈니스 로직
b()
}
}
이렇게 흩어져있는 부가적인 코드를 분리를 한 뒤
- 비즈니스 핵심 기능은 비즈니스 핵심기능만 담당하도록 하고
- 부가기능은 부가기능을 담당하는 모듈에서 관리하도록 하면
유지보수 측면에서도, 객체지향 프로그래밍 관점에서 많은 이점을 볼 수 있다.
그럼 부가기능을 어떤식으로 적용할 수 있을까? 그 부분을 AoP를 이용하여 적용할 수 있다.
AoP 적용 방법(Weaving)
- 컴파일 시점 : AOP를 적용하는 프레임워크인 AspectJ 가 소스코드를 컴파일하기전에 공통 구현 코드를 소스에 삽입하는 방식으로 동작한다. 즉 부가기능을 소스에 삽입하는 방식이다.
- 클래스 로딩 시점 : 클래스롤 로딩할 때 바이트코드에 부가기능을 삽입하는 방식이다.
- 런타임 시점 : 스프링에서 제공하는 AOP 방식으로 JDK dynamic proxies를 이용하여 비즈니스 로직을 가지고 있는 클래스를 프락시 객체로 만들어서 부가기능을 동작하게한다.
AoP Proxies
Proxies에는 두가지 방식이 있다.
- JDK dynamic proxies : 인터페이스 기반의 proxies
- CGLib proxies : class 기반의 proxies
AoP 방식
스프링 AoP 방식으로는 xml 기반(현재는 잘 안쓴다고 함) 또는 AspectJ 어노테이션을 이용하는 방식이 있다.
AoP 주요용어
- Target : AoP를 적용할 대상, 즉 핵심 기능을 담고 있는 모듈로서 부가기능(Advice)을 부여할 대상을 뜻한다.
- Join Point : 어플리케이션 실행 중 부가기능을 적용할 수 있는 지점을 의미한다.
- Pointcut : 부가기능를 적용할 타겟의 메서드를 선별하는 표현식이다. execution 으로 시작하고 여러 조인포인트에서 어디에 부가기능을 적용시킬지 나타낸다.
- Aspect : 부가기능 + 포인트컷으로, 실제 부가기능에 대해 작성한 코드이다. 스프링에서는 Aspect를 빈으로 등록하여 사용한다.
- Advice : 타겟의 특정 조인포인트에 제공할 부가 기능이다. @Before, @After, @Around, @After Returning, @After Throwing 어노테이션이 있고 각 어노테이션에 따라 조인포인트가 달라진다.
출처 : https://m.blog.naver.com/dkdldoafotn/221655932482 - Weaving : 타켓의 조인포인트에 부가기능을 적용하는 과정이다. 컴파일 시점 / 클래스 로딩 시점 / 런타임 시점에 적용할 수 있다.
Aop 사용법
AoP를 사용하려면 @EnableAspectJAutoProxy과 빈을 설정해줘야 한다.
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Around("execution(Pointcut)")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("Before method called. {}", joinPoint.getSignature().toString());
Object result = joinPoint.proceed();
logger.info("After method called with result => {}", result);
return result;
}
}
@SpringJUnitConfig
@ActiveProfiles("dev")
public class AopTests {
@Configuration
@ComponentScan(
basePackages = {package}
)
@EnableAspectJAutoProxy
static class Config {
}
}
- within을 이용하는 방식도 있다.
@Pointcut 적용 방식
@Around("execution(Pointcut)")
@Pointcut("execution(matcher)")
public void methodName() {};
@Around("methodName()")
package org.prgrms.kdt.aop;
import org.aspectj.lang.annotation.Pointcut;
public class CommonPointcut {
@Pointcut("execution(* org.prgrms.kdt..*Repository.*(..))")
public void repositoryPublicMethodPointcut() {};
@Pointcut("execution(* org.prgrms.kdt..*Service.*(..))")
public void servicePublicMethodPointcut() {};
@Pointcut("execution(* org.prgrms.kdt..*Repository.save(..))")
public void repositorySaveMethodPointcut() {};
}
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Around("org.prgrms.kdt.aop.CommonPointcut.repositorySaveMethodPointcut()")
public Object log(ProceedingJoinPoint joinPoint) {
...
}
}
🔗 오늘의 알고리즘
leetcode Verify Preorder Serialization of a Binary Tree
🎤 데일리 스터디 발표
08.27.(금) W4D4 SpringBoot Part2 학습 내용 발표 범위
- Embedded DataBase - 효희님
- NamedParameterJdbcTemplate(1) - 동섭님
- NamedParameterJdbcTemplate(2) - 연재님
- NamedParameterJdbcTemplate(3) - 다희님
❓오늘의 궁금증
- 종종 profile 때문에 오류가 난다. 대충 이래서 오류가 나는 것 같다~ 싶어서 이리저리 조금 고치면 된다. profile.. 제대로 알아봐야지......
🎊 오늘의 느낀점
- AoP 들어오면서 난이도가 훅 올라갔다. 개념이 어렵다기보단 개념을 바탕으로 스프링에서 제공해주는것들을 제대로 사용하기 어렵다. 물론 처음이니까 그런거겠지만 어쨌든 어렵다. 반복하고 손으로 익히면서 빨리 내것으로 만들어야지.
Author And Source
이 문제에 관하여([TIL] 0827), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@heehee/TIL-0827저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)