1. AOP 용어 정리
참고 : 객체지향을 넘어 관점지향으로 AOP
핵심 관심 : Major Concern (예 :: 게시판에 글쓰기, 글 보기, 글 삭제, 글 수정, ...)
횡단 관심 : Cross-Cutting 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#]
[#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
Advice : 횡단 관심을 구현한 것.
Joinpoint : Advice가 Code에 끼어 들 수 있는 순간들.
Pointcut : Joinpoint 중에 서 실제 Advice가 Code에 끼어드는 순간.
Aspect : Advice + Pointcut.
weaving : Code에 Aspect를 적용하는 과정.
bl103.bmp출처 : 객체지향을 넘어 관점지향으로 AOP
AOP를 적용하지 않으면~
leakage of concern = 집중력 부족한 코드 = 유지보수 어려운 코드 = 안 좋은 코드
leakage of concern = 집중력 부족한 코드 = 유지보수 어려운 코드 = 안 좋은 코드