참고 : 객체지향을 넘어 관점지향으로 AOP

핵심 관심 : Major Concern (예 :: 게시판에 글쓰기, 글 보기, 글 삭제, 글 수정, …)
횡단 관심 : Cross-Cutting Concern(예 :: 로깅, 인증, 예외처리, …)

기존의 코드 : 핵심 관심과 횡당 관심이 결합되어 있는 형태. => 유지보수 어려움.(중복 발생, 지저분함, 생산성 저하, 재사용 힘듬, 변화 힘듬)
[#M_ more.. | less.. |
public class AccountTransfer extends AbstractAccountModule {
Logger logger = MyLogger.getLog(“accountTransfer”);
TransactionManager txManager = new MyDBTransactionManager(TxDefinition.Default);
PersistentHelper persistentHelper = new MyPersistentHelper(Account.class,
DBConst.DBConnectionInfo);
Authentication auth = new LDAPAuthentication();
ErrorHandler errorHandler = MyHandlerFactory.getErrorHandler();

public void transafer(Accouno fromAcc, Account toAcc, int amount) {
 logger.begin(“transfer”);
 if (auth.checkLoginedUser() == false) {
  throw new NotLoginedUserAccessException();
 }
 if (auth.checkAuthorization() == false) {
  throw new AuthorizationFailException();
 }
 persistentHelper.connectDB();
 txManager.beginTransaction();
 try {
  loadAccount(fromAcc);
  loadAccount(toAcc);
  lockingAccount(fromAcc);
  lockingAccount(toAcc);
  // core concern code —————————

  if (fromAcc.hasEnoughMoney(amount) == false) {


  throw new AccountException(“not enough money”);


  }


  fromAcc.withdraw(amount);


  toAcc.credit(amount);

  // core concern code —————————
  unlockingAccount(fromAcc);
  unlockingAccount(toAcc);
  saveAccount(fromAcc);
  saveAccount(toAcc);
  txManager.commit();
 }
 catch(TransasferException e) {
  txManager.rollback();
  errorHandler.saveAppException(e);
  errorHandler.sendErrorNotificationToManager();
  logger.exception(e);
  throw new BakingRuntimeException(e);
 }
 catch(PersistentException e) {
  logger.exception(e);
  errorHandler.sendErrorNotificationToDBA();
  throw new BakingRuntimeException(e);
 }
 finally {
  txManager.close();
  connectDB.close();
 }
 logger.end(“transfer”);
 }

}
출처 : 객체지향을 넘어 관점지향으로 AOP
_M#]AOP 적용하는 코드 : 핵심 관심과 횡단 관심이 분리 되어 깔끔함.
[#M_ more.. | less.. | public class AccountTransfer extends AbstractAccountModule {
public void transafer(Accouno fromAcc, Account toAcc, int amount) {
 if (fromAcc.hasEnoughMoney(amount) == false) {
  throw new AccountException(“not enough money”);
 }
 fromAcc.withdraw(amount);
 toAcc.credit(amount);
}

}
출처 : 객체지향을 넘어 관점지향으로 AOP
_M#]

Code : 핵심 관심을 구현한 것.
Advice : 횡단 관심을 구현한 것.
Joinpoint : Advice가 Code에 끼어 들 수 있는 순간들.
Pointcut : Joinpoint 중에 서 실제 Advice가 Code에 끼어드는 순간.
Aspect : Advice + Pointcut.
weaving : Code에 Aspect를 적용하는 과정.
bl103.bmp출처 : 객체지향을 넘어 관점지향으로 AOP

AOP를 적용하지 않으면~
leakage of concern = 집중력 부족한 코드 = 유지보수 어려운 코드 = 안 좋은 코드