W2AS2L
2023. 6. 22. 19:11
2023. 6. 22. 19:11
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를 구현하는 방법
- 컴파일 시점에 코드에 공통 기능 삽입
- 클래스 로딩 시점에 바이트 코드에 공통 기능 삽입
- 런타임 시점에 프록시 객체를 생성하여 공통 기능 삽입