'AOP'에 해당되는 글 2건

  1. 2008/02/12 AOP로 인해 코드가 혼란스럽지 않은가?
  2. 2007/05/15 캐스팅

AOP로 인해 코드가 혼란스럽지 않은가?

자바 2008/02/12 10:27 posted by 낭만검객

순수한 OOP를 추종하는 사람들은 AOP 기술을 그리 달가워하지 않습니다. 대표적인 것이 메소드의 리턴값을 가로채어 다른 값으로 바꾸는 것입니다.

methodA()를 호출했고 디버거에서 분명히 "abc"를 리턴하는 것을 확인했는데 결과 값이 "ABC"라면 코드를 읽는 사람은 답답할 것입니다. 이런 상황은 아마도 다른 사람에게서 코드를 인수했을 때 많이 발생할 듯 합니다.

이런 혼란 때문에 AOP를 쓰더라도 프로그램 로직에 영향을 주지 않는 선까지만 적용하자는 의견이 있습니다. 그런 주장을 하는 사람들이 드는 예로 프로파일링을 위한 메소드 수행 시간 측정, 디버깅 등을 위한 로깅 등이 있습니다.

그렇다면 과연 이렇게 로직에 영향을 주지 않는 곳에만 써야 좋을까요? 아래 트랜잭션을 처리하는 자바 코드가 있습니다.

public void 계좌이체(long 금액) {
    dbCtx.begin();
    try {
        출금(금액);
        송금(금액);
    }
    catch(Exception ex) {
        dbCtx.rollback();
        return;
    }
    dbCtx.commit();

}

대개 이와 같은 코드를 작성합니다. 특히 빨간 코드는 트랜잭션 처리를 위해 들어간 코드입니다. 이것을 스프링 프레임워크의 자바 주해(annotation) 기능을 이용한 AOP를 적용하면 다음과 같이 간결하게 바꿔 쓸 수 있습니다.

@Transactional
public void 계좌이체(long 금액) {
    출금(금액);
    송금(금액);
}

이 코드에는 로직에 관여하는 AOP를 적용했습니다. 하지만 코드를 읽는데 혼란은 거의 없습니다. 이렇게 코드에 명백히 드러난다면, 로직에 관여하는 AOP라도 충분히 쓸만하다고 생각합니다.
 

후배와 나눈 이야기를 정리해서 올려봤습니다.

TAG AOP, 자바

캐스팅

분류없음 2007/05/15 12:24 posted by 낭만검객

아래 코드처럼 인터페이스 Lockable 형 변수 lock에 포조(POJO) 클래스 User를 할당하면 컴파일 할 때 에러가 발생할까요?

public class User {

}
public interface Lockable {

}
User user = …;
Lockable lock = (Lockable) user;

에러가 발생하지 않습니다.

JLS(Java Language Specification)에 따르면, 좌변(Lockable)이 인터페이스이고 우변(User)이 클래스일 때 우변(User)이 final 이 아니고 템플릿 파라미터가 다른 제네릭이 아니라면, 컴파일 시에는 허용한다고 합니다.

우변(User)의 서브 클래스가 좌변을(Lockable)을 구현하면 위 캐스팅은 올바르기 때문입니다.

public class Student extends User implements Lockable {

}
User user = new Student();
Lockable lock = (Lockable) user;

믹스인(Mixin)을 공부하며 덤으로 얻은 지식! ^^