1. AOP 란?
AOP(Aspect-Oriented Programming)는 관점 지향 프로그래밍으로, 핵심 비즈니스 로직과 부가 기능을 분리하여 모듈화하는 프로그래밍 패러다임입니다. 객체 지향 프로그래밍을 보완하는 프래그래밍 방식이라고 보셔도 좋습니다.
2. AOP 가 필요한 이유?
- 코드의 중복을 제거한다.
- 비지니스 로직과 부가 기능의 명확한 분리가 가능한다.
- 중복 코드 사용량이 줄어듬으로 유지보수성이 향상된다.
- 재사용성이 증가한다.
3. AOP 주요 개념
- Aspect
비지니스 로직이 아닌 공통 관심사를 모듈화 한 단위.
@Aspect @Component public class LoggingAspect { private static final Logger log = LoggerFactory.getLogger(LoggingAspect.class); @Around("execution(* com.example.service.*.*(..))") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); Object result = joinPoint.proceed(); long end = System.currentTimeMillis(); log.info("Method {} executed in {} ms", joinPoint.getSignature(), (end - start)); return result; } }
- Join Point
실제 Advice가 적용될 수 있는 위치
@Service public class UserService { // 메서드 실행 시점이 Join Point public User getUser(Long id) { return userRepository.findById(id); } }
- Pointcut
Join Point의 상세한 스펙을 정의한 것, Advice를 적용할 특정 Join Point를 필터링하는 표현식.
@Aspect @Component public class TransactionAspect { // Pointcut 정의 @Pointcut("execution(* com.example.service.*.*(..))") public void serviceLayer() {} @Around("serviceLayer()") public Object transaction(ProceedingJoinPoint joinPoint) throws Throwable { // 트랜잭션 로직 } }
- Advice
실제 부가 기능 구현체
@Aspect @Component public class SecurityAspect { @Before("execution(* com.example.secure.*.*(..))") public void checkSecurity(JoinPoint joinPoint) { // 보안 체크 로직 } }
4. AOP 사용시 주의사항
- Proxy 기반임으로 약간의 오버헤드가 발생한다.
- 너무 많은 Aspect 사용 시 성능 저하가 발생한다.
- 성능과 관련됨으로 JoinPoint 선택에 신중한 고려가 필요하다.
5. AOP 추천 사용 패턴
Aspect 클래스를 별도로 만들고. 그 파일 안에는 마치 Interface처럼 Pointcut만 나열해서 관리.
실제 구현체가 있는 Advice를 binding해서 정리하면 관리 복잡성이 줄어든다.
6. 잡다한 ..
객체지향에서 모듈 단위는 클래스
관점지향에서 모듈단위는 관점
관점은 여러 클래스에 걸쳐 공통으로 실행되는 기능을 모듈로 분리한 것임으로
관점 지향 사용하면 의존으로 발생하는 복잡도를 낮출 수 있음.
클래스 밖에서 관점의 기능이 실행되므로 서로 완전히 분리된 형태다 이를 관심의 분리(separation of concerns)라 한다.
비지니스의 기능들은 핵심 기능이며 이를 핵심 관심사라 한다.
비기능적 요구사항들은 핵심 관심사와 그 목적이 다르다. 로깅 인증/인가 트랜젝션 등의 공통로직(횡단 관심사)이다.
이렇게 각 관심이 다르므로 코드상에서도 각자 관심을 분리해야 한다는 것이 AOP의 주 목적이다.
하지만 각각의 관심이 달라 코드상으로 분리되어 있더라도 실행될 때는 필요한 곳에 필요한 기능이 추가 되어야 한다.
대표적인 스프링 aop 예제는 트랜잭션 관리 캐시 추상화 등이다
개발자 입장에서는 관심이 완전히 분리되어 어떻게 트랜잭션을 관리하고 캐시하는지 알 수 없다.
대상객체(TARGET OBJECT) : 공통 모듈을 적용할 대상
관점(ASPECT) : AOP 로 작성한 공통 모듈과 적용될 위치 정보의 조합
어드바이스(ADVICE) : 애플리케이션의 공통 로직이 작성된 모듈
관점과 어드바이스의 차이는 어드바이스가 적용될 위치 정보인 포인트 컷의 유무
포인트컷(POINT CUT) : 어드바이스를 적용할 위치를 선정하는 설정.
조인포인트(JOIN POINT) : 어드바이스가 적용된 위치. 포인트컷은 조인 포인트를 선정하는 것을 의미하고 어드바이스가 적용된 부분을 조인 포인트라 한다.
위빙(WEAVING) 조인 포인트에 실행할 코드인 어드바이스를 끼워 넣는 과정을 위빙이라 한다.