Tagged

AspectJ

A collection of 29 posts

AspectJ

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

이전 글 AspectJ를 이용한 코드젠과 프레임워크에 이어지는 글로 현재는 Service과 Controller까지도 적용을 마치고 실행 후 잘 돌아가는 모습을 살펴보습니다. 지금은 웹 쪽을 REST 스타일로 고칠겸, 새 프로젝트로 깔끔하게 정리하고, 새로 디자인한 것까지 모두 합치고 있습니다. (역시 적당한 단계별로 해야지 한꺼번에 하려니깐 정신없고 오래 걸리는 듯합니다.) 1. AJ 내에서 코드 젠을

AspectJ

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

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

@DeclareError

AspectJ의 @DeclareError를 사용해서 컴파일 시점에 아키텍처 에러 검증하자.

참조: http://www.parleys.com/display/PARLEYS/Home#slide=1;title=Spring%20Architectures;talk=20676612 위 발표자료 내용 주에 아주 잼나는 코드를 건졌습니다. 지난 번 KSUG에서 발표한 내용과 겹치는데 아래 코드는 그때 제가 보여드린 코드보다 좀 더 좋은 것 같아서 가져왔습니다. @Aspectpublic class SystemArchitecture {  @Pointcut(“execution(* configurator.*.*(..))”

AspectJ

AspectJ와의 연동을 고려한다면, 포인트컷을 최소화 해야합니다.

무슨 이야기냐면, 최소 권한 원칙인가… 그런거랑 비슷한겁니다. 바로 예제를 보면서 살펴보죠. @Aspect public class HibernateExceptionToDataAccessException {     @Pointcut(“@within(org.springframework.stereotype.Repository)”)     public void accountHibernateExceptionInDao(){}     @AfterThrowing(pointcut=”accountHibernateExceptionInDao()”, throwing=”e”)     public void translateHibernateException(HibernateException e){  

AspectJ

AspectJ로 final method에도 위빙하기

소스 코드는 이전과 동일합니다. 그 상태에서 프록젝트에 AspectJ Nature를 추가해줍니다. 그런 다음에 프로젝트 클린을 하여 기존의 클래스파일을 비우고 다시 컴파일하게 합니다.(Alt + P, N, 엔터) 지금, 저는 아무런 .aj 파일도 만들지 않았습니다. 그냥 이전에 만들어둔 Spring @AOP를 사용하고 있을 뿐입니다. @Aspectpublic class FinalHelloAspect {     @Before(“execution(* org.opensprout.

AspectJ

TSE 2006(Applying Domain Design in the Enterprise with AspectJ)

AspectJ In Action의 저자답게 AspectJ로 DDD를 돕는 여러가지 방법을 설명해줬습니다. • Overview of Domain-driven design• Aspects for crosscutting infrastructure• Aspects for fine-grained DI• Aspects for domain logic• Aspects for enforcing DDD bestpractices• Proceeding towards DDD 이런 순서대로 발표가 진행됐는데, 토비님께서 마소에 기고하셨던 내용과 비슷한 내용들이 초반에 언급되었고 그 뒤로는 AspectJ를 사용하여

AspectJ

휴.. Spring AOP와 AspectJ 연동 성공

이전 글의 예상이 맞았습니다. AspectJ 파일(aj 확장자)을 ajc라는 것으로 컴파일을 해야 하는데 이 녀석을 Eclipse에서는 어떻게 컴파일 할 지 모르기 때문에 컴파일을 못해서 class 파일이 없으니까 결국 Spring 컨테이너는 class 파일이 없어서 AspectJ로 작성한 Aspect를 못 읽어 들이고 에러를 내고 만 것이였습니다. 해결책은 ajc 사용해서 컴파일 해도 되겠지만.

AspectJ

Aspect-Oriented Programming with Spring AOP and AspectJ

Interface 21의 아드리안이 발표한 PPT인것 같습니다. 구글에서 “spring aop aspectj”로 검색했더니 나왔습니다. 굉장히 멋진 발표였을 것 같은데 중간 중간 데모를 못보는 것이 너무 아쉽습니다. Spring AOP에서 AsepctJ와 연동하는 부분이 막혀서 구글링을 하던 중이였는데 AspectJ의 aj 파일을 컴파일 해서 class 파일로 만들어야 할 것 같습니다. 안그러면 Spring 컨테이너에서

advice

Advice parameters

예전에 공부할 때 여기를 공부하다가 멈췄었네요.Advice parameters 1 (2)드디어 따라잡았습니다. 흐흣. 1. Access to the current JoinPoint 해당 Advice가 끼어드는 joinpoint에 대한 정보를 얻어 올 수 있습니다. @Around 어드바이스를 제외한 다른 어드바이스들의 첫번째 파라미터로 JoinPoint 를 만들어 주면 됩니다.     @Before(“aop.newStyle.aspect.CinemaAspect.sellTicketPointcut(

AspectJ

6.2. @AspectJ support

@AspectJ 는 Java 5에 추가된 어노테이션을 사용하여 aspect를 정의하는 스타일을 말하며 이것은 AspectJ 라이브러리를 사용하여 AspectJ 5와 동일한 방법으로 aspect와 pointcut을 정의할 수 있습니다. 하지만 Spring AOP를 사용하여 실행하기 때문에 AspectJ의 weaver나 complier는 사용하지 않아도 됩니다. 그것들을 사용하면 AspectJ의 모든 기능을 사용할 수 있습니다.6.2.1. Enabling @AspectJ Support

@Around

@Around 어드바이스 예제

이전까지 사용했던 @Before와 @AfterReturning 대신 @Around 어드바이스 하나로 기존에 했던 인사말들을 모두 처리할 수 있습니다. 더불어 리턴값도 변경할 수 있으며 대상 메소드의 실행 여부도 결정할 수 있습니다. 제약조건은 어드바이스의 메소드 첫번째 인자로 ProceedingJoinPoint 가 와야 하며 실제로는 이 인터페이스를 구현한 MethodInvocationProceedingJoinPoint 이녀석의 객체가 넘어옵니다.     @Around(“aop.newStyle.

@AfterReturning

@AfterReturning 어드바이스 만들기

제일 간단한 @AfterrReturning 어드바이스는 다음과 같습니다.     @AfterReturning(“aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()”)    public void thanksAdvice(){        System.out.println(“감사합니다. 다음에 또 오세요.”);    } @AfterReturning 어드바이스는 대상 메소드의 리턴값을 받아 올 수 있습니다. @AfterReturning의 속성인 returning을 사용하면 됩니다.

AspectJ

@Pointcut Designator

@AspectJ의 Pointcut 살펴보기 1 @AspectJ의 Pointcut 살펴보기 2 이전 글에서 정리를 했지만 좀 더 간단하게 정리 하겠습니다. pointcut 종류에 따라 표현식이 조금씩 다르지만 크게 세분류로 나눌 수 있습니다. execution(method signature), call(method signature) target(type signature), this(type signature), agrs(type signature) @target(annotation name), @args(annotation name), @within(

AspectJ

@Aspect 붙은 클래스끼리는 상속이 안 됩니다.

이전 글을 작성하다가 문든 들은 생각(@Aspect 가 붙은 클래스들끼리 상속을 하면 포인트컷과 어드바이스를 상속할 수 있는가?)을 실험해봤습니다. //CinamaAspect@Aspectpublic class CinemaAspect {     @Pointcut(“execution(* sellTicket(..))”)    public void sellTicketPointcut() {    }     @Before(“aop.newStyle.aspect.ChildAspect.sellTicketPointcut()”)    public

AspectJ

6.1. Introduction

선언적 트랜잭선 관리(declarative transaction management)와 같이 EJB를 대체할 만한 선언적인 엔터프라이즈 서비스를 제공하기 위해 사용하며, 이것으로 OOP를 보완 하기 위해 사용자 정의 apect를 만들어 사용할 때 유용합니다. 6.1.1. AOP concepts Aspect : 여러 객체를 관통하는 cross-concern을 구현한 것.Join Point : 프로그램이 실행되는 동안의 여러 시점들.. 그 중에서