Whiteship's Note


AspectJ를 이용한 코드젠과 프레임워크

모하니?/Coding : 2009.06.08 20:54


오늘은 도메인과 DAO쪽에만 AOP를 적용하는 AspectJ 파일을 만들어보았습니다. ROO를 참고하면서 말이죠. ROO와 다른 점은 프레임워크 코드를 이용한다는 거죠. (ROO는 제품 코드에서 ROO 코드는 하나도 이용하지 않는 완전한 non-intrusive 내지 transparent 코드젠 기술을 제공합니다.) 이런 식으로 새로운 형태의 OSAF도 만들어 낼 수도 있겠습니다. 하지만.. 할지 말지는 고민을 해봐야겠네요.

그 고민에 대한 시작으로, 아직은 충분한 예제를 못 만들었지만, 일단 여기까지 AspectJ를 이용한 프레임워크를 만들면서 느낌점을 정리해봐야겠습니다.

1. 자동완성 기능 사용 못 합.

이전 글처럼, AspectJ로 (메서드를 추가하거나 클래스 또는 인터페이스 상속을 추가하여) 어떤 클래스에 추가적인 기능들을 줬지만, 막상 이클립스에서 해당 클래스를 써먹을 때 코드 자동 완성을 사용할 수 없다는 점입니다. 원래 해당 클래스가 가지고 있던 멤버는 당연히 자동 완성이 되지만, AspectJ로 주입한 기능들은 참조가 되지 않습니다. 이 점은 AJDT에서 개선해주면 가능할지 싶은데... STS 최신 버전에선 어떨지 모르겠네요. 아무튼.. 이게 안 된다면.. 아.. 불편해..

2. 대체 뭐하는 녀석이람?

위 얘기랑 이어지는 이야기일 수도 있는데 해당 클래스가 하는 일이 숨겨져(?) 있다보니, 대체 어떤 일을 하는 지 눈치 채기가 쉽지 않습니다. 작명을 잘 해줘야겠죠.

3. 핵심 로직은 눈에 확 들어올 듯.

AJ 파일로 빼내는 로직들은 대부분 공통적인 내용일 겁니다. CRUD가 대부분이고 ROO의 경우에는 finder도 제공해주겠죠. 즉 감춰져 있는 부분이 무엇인가를 명확히 인지하고 있다면, 그 뒤에는 핵심 로직만 작성하면 될테고 코드에서 확 들어나게 되어 있겠죠. 이렇게 되면 2번에서 대체 뭐하는 녀석인가?라고 고민하는 시간도 줄어들테지요.

4. 코드 네비게이션 불편.

역시나 AJDT가 개선해 주길 바라지만, 현재로서는 AspectJ로 추가한 메서드나 필드로 Ctrl + 클릭으로 이동하는 것이 안 됩니다. 툴 측면에서 보면 1번과 비슷한 불편사항으로 볼 수 있겠습니다.

5. 성능?

AspectJ를 사용해서 컴파일 시점에 위빙을 하면 런타임 시에 성능 문제는 거의 없겠지만, 이 컴파일 작업이 매번 테스트를 돌릴 때 마다 일어나기 때문에 일반적인 테스트를 돌리는 것 보다는 조금 오래 걸리는 것이 사실입니다. 하지만 뭐 그정도 차이는 무시할만 하더군요.

오늘의 결론..

툴 지원이 조금만 더 보완된다면, AspectJ를 활용한 코드젠과 프레임워크를 활용하여 좀 더 깔끔하고 유연한 코딩을 즐길 수 있을 것으로 예상 됩니다. 코드 자동 완성과 네비게이션이 불편한 지금도 만약 AspectJ로 추가한 코드에 접근 할 필요가 없다는 가정을 한다면, 해볼 만 하다고 생각합니다.

Roo처럼 콘솔까지 제공하고, 변경 사항을 트래킹하여 롤백한다거나 코드젠 이후에 직접 코드를 수정해도 유기적으로 반영해주는 기능을 구현하긴 힘들겠지만, 단순한 코드젠으로 AspectJ를 생성하고 이 AspectJ가 (OSAF 같은) 프레임워크 코드를 이용하도록 한다면, 기존의 프레임워크를 한 단계 업그레이드 할 수 있는 방안이 되지 않을까 생각합니다.

ps: 흠.. 일주일을 쉬고 왔더니 머리가 빙빙 도네요. 색시한테 9까지 간다고 했는데, 9시에 출발하겠네.. 쏘리 쏘리 쏘리 쏘리~
top

Write a comment.


[AspectJ] Extension and Implementation

AOP : 2009.06.08 20:16


http://www.eclipse.org/aspectj/doc/released/progguide/semantics-declare.html#extension-and-implementation

    declare parents: EmpDao extends GenericDao<Emp, EmpParams>;
    declare parents: EmpDaoImpl extends HibernateGenericDao<Emp, EmpParams>;
    declare @type: EmpDaoImpl: @org.springframework.stereotype.Repository;

EmpDao 클래스가 GenericDao 클래스를 상속 받도록 설정.
EmpDaoImpl 클래스가 HibernateGenericDao 클래스를 상속 받도록 설정.
EmpDaoImpl 클래스에 @Repository 애노테이션 추가.

문법이 복잡해 보였는데 막상 사용해보니 간단 간단 하네요.

public interface EmpDao {

}

public class EmpDaoImpl implements EmpDao {

}

이런 기초적인 코드만 존재하지만..

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-datasource.xml"})
@Transactional
public class EmpDaoImplTest {

    @Autowired
    EmpDaoImpl daoImpl;

    @Test
    public void daoInterface() throws Exception {
        assertNotNull(daoImpl);
        daoImpl = new EmpDaoImpl();
        GenericDao<Emp, EmpParams> gdao = daoImpl;
        HibernateGenericDao<Emp, EmpParams> hgdao = daoImpl;
    }

    @Test
    public void crud() throws Exception {
        Emp emp = new Emp();
        daoImpl.add(emp);
        daoImpl.flush();
        assertEquals(1, daoImpl.getAll().size());
    }

}

이런 테스트를 돌릴 수 있다는거...



top

Write a comment.


[AspectJ] privileged aspect

AOP : 2009.06.08 17:24


public class Emp {

    private String name;

    private String email;

}

이런 클래스가 있습니다. 이게 전부입니다.

public class EmpTest {

    @Test
    public void javaBean() throws Exception {
        Emp emp = new Emp();
        emp.setName("keesun");
        assertEquals("keesun", emp.getName());
        emp.setEmail("keesun@email.com");
    }

}

이런 테스트가 돌아갈까요? 훗.. 그럴리가요. 있지도 않은 메서드(게터, 세터)를 마구 썼는데 될리가 없죠. 그러나..  잘 돌아갑니다.


어떻게 된걸까요? privileged aspect를 사용하면 타겟의 private 또는 protected 멤버에도 접근할 수 있습니다.

http://www.eclipse.org/aspectj/doc/released/progguide/semantics-aspects.html#aspect-declaration

스프링 AOP로 이런 일을 하려면 Introduction을 사용 해야겠는데.. 그게 참.. 그리 쉽지 않았던 기억이 납니다. 하지만 AspectJ로는 간단하네요~

privileged aspect EmpAspect {

    //JavaBean
    public String smdis.model.Emp.getName() {
        return this.name;
    }

    public void smdis.model.Emp.setName(String name) {
        this.name = name;
    }

    public String smdis.model.Emp.getEmail() {
        return this.email;
    }

    public void smdis.model.Emp.setEmail(String email) {
        this.email = email;
    }

}

이렇게 추가할 메서드를 넣어주고 마치 자기가 가지고 있는 변수처럼 사용하면 됩니다.
top

  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.06.08 18:02 PERM. MOD/DEL REPLY

    Spring ROO 도 AspectJ의 privileged Aspect을 사용해서 mixin을 만들었죠. :)
    근데 M1 릴리즈 직전에 스테판이 한 얘기가, 나눠놓은거 합친다는거 였는데,
    M1 사용해볼 시간이 없어서 어떻게 됐는지 모르겠네요.
    전에 나눠 놓았던거 합쳐졌나요??? @_@?
    그당시 그거 옵션으로 mixin 여러개로 쪼갤지 말지 결정할수 있게 해주면
    안 되냐고 얘기는 했었는데... 뭐 제 의견이 반영됐을리는 없겠고... :D

    암튼 AspectJ 쓰면 쓸수록 정말 맘에 드는 녀석입니다.
    물론 어플 덩치가 커지면서 관리해야할 Aspect 들이 늘어나면 쬐끔 주의를 해야겠죠.
    거기다가 AJDT가 Eclipse의 일반 Java Editor보다는 좀 기능면에서 딸리는거 같구요.
    STS 2.1.0M2의 AJDT 지원이 훨씬 좋아졌다는데... 제가 쓰는 plug-in 설치가
    안되는 바람에 못 쓰고, 아직 2.0.0 쓰고 있네요... ㅠ_ㅠ

    AspectJ5는 annotation을 쓰면 Java 5 이상 컴파일러로 컴파일도 되고
    POJO를 바로 Aspect으로 만들수 있어서 좋긴한데,
    privileged Aspect은 만들수가 없다는게 좀 안타깝죠.

    그나저나 여행 후유증으로 늘어진다고 하셨는데, 전혀 아닌거 같습니다. :)

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.06.08 18:16 신고 PERM MOD/DEL

    아니요. M1에서도 여전히 여러개 aj 파일로 나눠져 있어요. 흠.. 옵션을 사용하지 않아서 그런가.. 옵션이 뭔지 잘 몰라서 그런걸 수도 있겠네요.

    AspectJ에 대해 잘 아시는군요~ @_@

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.06.10 20:07 PERM. MOD/DEL REPLY

    절대 잘 아는건 아니구요...^^;;;
    그냥 좋아하는거라서요. 사실 저는 AOP도 꽤 늦게 알게 됐는데,
    늦게배운 도둑질이 날새는줄 모른다고 참 재밌더라구요. :)
    그래도 필요한 부분에만 쓰다보니 조금 만지는 수준이죠 뭐... :)

    아직 나눠져 있네요. :D
    그때 제가 Real Separation of Concerns 라고 칭찬을 막 해서 그랬...을리는 절대 없고...^^;
    아무래도 출시 직전이다보니 새로 바꾸는거보다 안전하게 가는걸 택한 모양인거 같습니다.
    (순전히 추측...ㅡ_ㅡ;;; )

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.06.10 22:06 신고 PERM MOD/DEL

    오호 그렇군요. 저는 예전에 Hello World 예제만 몇 번 돌려보다가 요즘 들어서 쬐끔 만져봤는데, 아주 재밌네요. 스프링 AOP보다 편한 것 같다는 느낌도 들구요. 멋진 프로젝트 같아요.ㅋㅋ

Write a comment.


콜 오브 듀티(COD) Modern Warfare 2 어여 나와라~

모하니?/Watching : 2009.06.08 08:34




캬... 게임을 정말 예술로 만드네요~

'모하니? > Watching' 카테고리의 다른 글

[WCG 2009] 요즘 하고 있었군요.  (4) 2009.11.13
초고속 로보트 손  (0) 2009.09.15
허경영의 콜미  (0) 2009.08.13
한국의 비양심  (0) 2009.07.24
러시아의 양심  (4) 2009.07.24
콜 오브 듀티(COD) Modern Warfare 2 어여 나와라~  (0) 2009.06.08
프랑스도 멋진 나라구나..  (6) 2009.05.25
핀란드 멋진 나라네요.  (11) 2009.05.21
못살겠다 대한민국  (7) 2009.04.17
한국에도 이런 개그가 통할까?  (0) 2009.01.15
http://www.parleys.com 멋진 싸이트  (2) 2008.09.27
top

Write a comment.