AOP(Aspect Oriented Programming)
- 핵심기능(비지니스 로직)과 공통기능(인프라 로직)의 구현을 분리할 수 있다.
- 공통기능이란 여러 객체에 공통적으로 적용할 수 있는 기능으로 애플리케이션의 여러 지점에 걸쳐있는 기능이다.
- 공통기능을 모듈화함으로써 재사용성을 높여주는 프로그래밍 기법이라고 할 수 있다.
- 대표적으로
인증
, 트랜잭션 관리
, 로깅
등과 같은 인프라 로직을 AOP로 처리한다.
- 스프링은 프록시 기반 AOP를 지원한다.
동작 방식 (Feat.프록시)
- 프록시 객체란 핵심 기능의 실행은 다른 객체에 위임하고, 부가적인 기능을 제공하는 객체
- 스프링 런타임 시점에 대상 객체를 감싸는 프록시를 만든다.
- 프록시는 대상 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에 다시 요청을 반환하여 대상 객체의 핵심 기능을 수행한다.
- 혹은 핵심기능을 먼저 수행할 수 도 있다.
- 기존 코드를 수정하지 않으면서 코드 중복을 제거할 수 있는 장점이 있다.
결론
AOP는 OOP가 미처 해결하지 못한 핵심 기능과 공통기능의 관심사의 분리를 가능하게 해주는 프로그래밍 기법이다. Aspect라는 빈을 만들어서 부가기능과 적용 시점을 정의할 수 있다.
Spring은 런타임 시점에 대상 객체에 대한 프록시 객체를 만들어 대상객체 전/후 요청을 가로채고, Aspect에 정의된 부가기능을 수행한 뒤 요청을 반환하면서 기존의 코드가 수행되게 한다.
스프링 프레임워크가 제공하는 핵심 기능 중 하나인 만큼, 개발의 생산성을 크게 높이고 더욱 모듈화된 코드를 작성할 수 있는 좋은 기법인 것 같다.