AOP란?

  • AOP는 공통의 관심사를 추상화해 잘 보관하고 있다가 필요한 곳에 동적으로 삽입하며 적용해주는 기술이다. 이로 인해 핵심 로직과 부가 기능을 분리할 수 있고 각각의 기능은 단일 책임을 가진 코드를 유지할 수 있다.

핵심 로직과 부가 기능이 같이 있다면

  • 두 가지 책임을 가지므로 하나의 책임에 인한 코드 수정은 다른 코드에 side effect가 발생할 수 있다.
  • 두 가지 기능이 접목되어 있어 테스트 코드를 작성하려 할 때도 두가지 기능을 다 고려 해야한다.
  • 비즈니스 로직이 복잡하거나 부가 기능이 추가될수록 유지보수 하기가 어려워진다.
  • 유지보수와 비슷한 맥락으로 기능을 확장하거나 다른 전략으로 기능을 변경하기도 어려워 진다.

AOP를 적용한다면?

  • 코드에는 핵심 로직만 남기고 부가 기능은 별도로 추상화하여 주입 받는 방식으로 리팩토링 할 수 있을 것이다.
  • //대표적인 AOP 방식이 @Transactional 적용 @Transactional public void upgradeLevels() throws Exception { List<User> users = userDao.getAll(); for (User user : users) { if (canUpgradeLevel(user)) { upgradeLevel(user); } } this.transactionManager.commit(status); }

코드를 분리하면 어떤 점이 좋을까?

  • 메서드 또는 클래스는 한 책임을 가질 수 있는 코드를 작성할 수 있고 응집도 높은 코드를 작성할 수 있다.
  • 테스트 코드 또한 비즈니스 로직에 대한 테스트 케이스만 작성하면 된다.
  • 유지보수 측면에서도 비즈니스 로직 수정시에 부가 기능에 대한 side effect는 찾아 볼 수 없게 된다.

프록시란?

  • 자신의 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것(대리인 ,대리자)
  • 사용 목적에 따라
    • 클라이언트가 타깃에 접근하는 방법을 제어하기 위해
      • 프록시 패턴
    • 타깃에 부가적인 기능을 부여 해주기 위
      • 데코레이터 패턴

AOP 용어 정리

  • Target Object
    • 부가 기능을 부여할 대상
  • Aspect
    • AOP의 기본 모듈. 그 자체로 애플리케이션의 핵심 기능을 담고있진 않지만 애플리케이션을 구성하는 중요한 한가지 요소, 부가될 기능을 정의한 Advice와 어드바이스를 어디에 적용할지 결정하는 Pointcut을 함께 가짐
  • Advice
    • 타깃에게 제공할 부가 기능을 담은 모듈. 타깃이 필요없는 순수한 부가 기능. Aspect가 무엇을 언제 할지를 정의하고 있음
  • Join point
    • 프로그램의 실행 내부에서 Advice가 적용될 수 있는 위치
  • Pointcut
    • Advice에 적용할 Joinpoint를 선별하는 작업 또는 그 기능을 정의한 모듈

AOP를 구현하는 방법

  • 컴파일 시점에 코드에 공통 기능 삽입
  • 클래스 로딩 시점에 바이트 코드에 공통 기능 삽입
  • 런타임 시점에 프록시 객체를 생성하여 공통 기능 삽입
    • Spring에서 사용하는 방법

'Computer science > Spring' 카테고리의 다른 글

Stereo Type  (0) 2023.06.22
Spring Security  (0) 2023.06.21
@Controlleradvice,@ExceptionHandler  (0) 2023.06.21
@Transactional  (0) 2023.06.15
영속성 컨텍스트  (0) 2023.06.15

+ Recent posts