# 관점지향 프로그래밍
- AOP (Aspect Oriented Programming) 의 약자로,
- 메소드 안의 주기능과 보조 기능을 분리한 뒤 선택적으로 메소드에 적용해서 사용하는 방식을 뜻한다.
- 반복되는 공통 기능을 독립적으로 분리하여 쉽게 재사용할 수 있도록 하는데 목적을 둔다.
- 클래스의 메소드마다 기능을 구현하지 않고 한 곳의 장소에 모아 관리하므로 코드의 가독성이 좋아진다.
관련 용어
용어 | 의미 |
Aspect | - 로깅이나 보안 등 구현하고자하는 공통적인 보조 기능 - 기능을 뜻하는 추상적인 개념으로서, 기능의 코드에 해당하는 어드바이스와 - 적용 지점을 가르키는 조인 포인트로 구성되어있다. |
Advice | - 메소드 호출을 기준으로 여러 지점에서 동작한다. - aspect의 구현체 (클래스)로 보조 기능에 해당하는 코드를 담는 하나의 독립된 클래스를 뜻한다. - 어드바이스 내에서 구현된 메소드는 조인 포인트와 포인트 컷으로 적용되는 시점과 영역을 지정할 수 있다. |
JoinPoint | - 어드바이스가 적용되는 지점을 의미한다. - 어드바이스 내에서는 메소드에 어노테이션을 사용하여 적용 지점을 지정한다. (1) before : 메소드가 동작하기 전 동작 (2) after : 메소드의 동작이 종료된 후 동작 (3) after-returning : 메소드가 성공적으로 완료되어 리턴된 뒤 동작 (4) after-throwing : 메소드 동작 중 예외가 발생하면 동작한다. # around - 메소드의 동작 전과 후에 동작한다. - 타 어노테이션과 다르게 반드시 joinpoint를 파라미터로 받아야한다. - joinpoint객체의 proceed메소드를 통해서 메소드의 리턴 값을 받을 수 있다. |
PointCut | - 어드바이스가 적용되는 대상을 지정한다. - 포인트컷 정규식을 사용하여 - excution(리턴타입 패키지경로.클래스명.메소드명(매개 변수)) 의 방식으로 지정할 수 있다. # 포인트컷 정규표현식 (1) 접근제한자 - public, private등의 타입을 선택할 수 있으며 *으로 전체를 지정할 수 있다. - 접근제한자는 표현식에서 생략할 수 있다. - !void등의 방식으로 해당 타입을 제외한 나머지 타입을 포함하여 처리할 수 있다. (2) 패키지명 - COM.KOREA.SERVICE : 해당 패키지 경로까지만 지정 - COM.KOREA.SERVICE.. : 해당 패키지 경로의 하위 패키지까지 전부 지정 - COM.KOREA.SER..CE : 해당 패키지 경로 내 SER으로 시작하여 CE로 끝나는 패키지 선택 (3) 클래스명 - TestService : 해당 명칭의 클래스 선택 - *Service : 클래스명이 SERVICE로 끝나는 클래스 선택 - Test* : 클래스명이 TEST로 시작하는 클래스 선택 - TestService+ : 해당 클래스에서 파생된 모든 자식 클래스 혹은 인터페이스 선택 (4) 메소드 - * : 모든 메소드 선택 - 클래스명과 마찬가지로 앞 뒤로 *를 붙여 사용할 수 있다. - 메소드 타입은 매개변수 타입과 함께 표현식을 반드시 사용해야한다. (5) 매개변수 - (..) : 타입과 갯수 상관없이 모든 매개 변수를 가지는 메소드 선택 - (*) : 타입 상관없이 한가지의 매개 변수를 가지는 메소드 선택 - (org.springframework.ui.model) : 매개변수 model을 가지는 메소드 선택 *특정 매개변수를 지정하는 경우 반드시 전체 패키지 경로가 있어야한다. - (String, ..) : 한 개 이상의 파라미터를 가지되 첫 매개변수가 String타입인 메소드 - (Integer, *) : 첫번쨰 파라미터가 Integer타입인 두가지의 파라미터를 가지는 메소드 |
Target | - 어드바이스가 적용되는 클래스를 뜻한다. |
Weaving | - 보조 기능 (advice)을 주기능에 적용하는 것을 뜻한다. |
[참고] 시그니처 관련 메소드
메소드 | 기능 |
# JoinPoint | |
getTarget | 클라이언트가 호출한 클래스의 메소드를 포함하는 Object객체 반환 |
getTargs | 클라이언트가 호출한 클래스의 메소드의 인자를 Object타입의 배열로 반환 |
getSignature | 시그니처 (메소드명, 명칭, 매개변수 정보) 객체 반환 |
# Signature | |
getName | 클라이언트가 호출한 메소드 명칭 |
toLongString | 클라이언트가 호출한 메소드의 리턴 타입, 명칭, 매개변수를 전체 패키지 경로 반환 |
toShortString | 클라이언트가 호출한 메소드의 시그니처를 축약하여 문자열로 반환 |
'Web > Spring' 카테고리의 다른 글
[Spring] Mybatis (0) | 2025.01.09 |
---|---|
[Spring] Restful API (0) | 2025.01.09 |
[Spring] 어노테이션 (0) | 2025.01.09 |
[Spring] MVC 디자인 패턴 (0) | 2025.01.09 |
[Spring] 의존성 주입 (0) | 2025.01.09 |