AOP란 ?
관점 지향 프로그래밍이다.
관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부과관점으로 나누어서 보고
그 관점을 기준으로 모듈화(어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것) 하겟다는 것이다.
즉, 개발 로직과 비즈니스 로직을 분리하여 관리하는 것이 Spring 개념이다.
즉 공통 관심사항과 핵심 관심 사항(코어코드)를 분리하여 반복된 작업을 줄이는 Spring 개념이다.
쉽게 설명하자면 100개의 함수가 처리해야 할 공콩 기능들을 분리해 별도의 Bean으로 관리하는 컨셉이다.
AOP는 흩어진 관심사를 모듈화 할 수 있는 프로그래밍 기법이다.
위와 같이 클래스 A,B,C에서 공통적으로 나타나는 색깔은 중복된 메소드, 코드, 필드 등이다.
예를 들어 빨간색 블럭을 수정해야 한다고 하면 A,B 두곳을 수정해야한다.
이는 SOLID 원칙을 위배하여 유지보수를 어렵게 한다.
이런식으로 소스코드상에서 계속 반복해서 사용되는 부분들을 흩어진 관심사 라고 한다.
AOP에서 각 관점을 기준으로 로직을 모듈화 한다는 것은 흩어진 관심사를 모듈화 하겠다는 의미이다.
위의 그림의 색상 블럭 처럼 모듈화 시켜놓고 어디에 적용시킬 것인지만 정의해주면 되는 것이다.
이때 모듈화 시켜놓은 블럭을 Aspect라고 한다.
- AOP의 장점
높은 재사용성 : 중복된 코드를 최대한 제외하여 기능이 필요할때만 호출하여 쓰기 때문에 재사용성이 높다.
깔끔한 코드 : 공통 관심 사항을 별도로 분리하여 관리하기 때문에 깔끔하다.
Aspect | 흩어진 관심사를 모듈화 하는 것 |
Target | Aspect를 적용하는 곳 (클래스, 메소드 등) |
Advice | 실질적으로 어떤일을 해야 할 지에 관한것, 실질적인 부가 기능을 담은 구현체 |
Join Point | Advice가 적용될 위치 혹은 끼어들 시점/ 메소드 진입 시점/ 생성자 호출 시점/ 필드에서 꺼내올 시점 등 끼어들 시점을 의미. 참고로 스프링에서 JoinPoint는 언제나 메소드의 실행 시점을 의미한다. |
Point Cut | Join Point의 상세 스펙을 정의한것. 구체적으로 Advice가 실행될 시점을 정함 |
이때 Point Cut 에는 다양한 명시자를 이용 할 수 있다.
execution | Advice를 적용할 메서드를 명시할때 사용 |
within | 특정 타입에 속하는 메소드를 JoinPoint로 설정되도록 명시할 때 사용 |
bean | 스프링 빈을 이용하여 JoinPoint를 설정할때 사용 |
execution
execution( [수식어] 리턴타입 [클레스이름].이름(파라미터) )
-수식어 : public, private 등 (생략가능)
-클레스이름 및 이름 : 클레스이름과 메서드 이름 명시(클레스이름은 풀 패키지명으로 명시)
-파라미터 : 메서드의 파라미터 명시
- ' * ' : 모든값을 표현
- ' .. ' : 0개이상을 의미
(예)
exeution(public Integer com.korea.aop.*.*(*))
: com.korea.aop 패키지에 있고, 파라미터가 1개인 모든 메소드
execution(* com.korea..*.get*(..))
: com.korea 패키지 및 하위 패키지에 속해있고, 이름이 get으로 시작하는 파라미터가 0개 이상인 모든 메소드
execution(* com.korea.aop..*Service.*(..))
: com.korea.aop 패키지 및 하위 패키지에 속해 있고 이름이 Service로 끝나는 인터페이스의 파라미터가 0개이상인 모든 메소드
within
예
within(com.korea.aop.SomeService)
: com.korea.aop.SomeService 인터페이스의 모든 메소드
within(com.korea.aop.*)
:com.korea.aop의 모든 메소드
wothin(com.korea.aop..*)
:com.korea.aop 패키지 및 하위 패키지의 모든 메소드
bean
예
bean(nameBean)
: 이름이 nameBean인 빈의 모든 메소드
bean(na*)
: 빈의 이름이 na로 시작하는 빈의 모든 메소드
스프링 AOP
- 스프링에서 제공하는 스프링 AOP는 프록시 기반의 AOP 구현체이다.
- 프록시 객체를 사용하는 것은 접근 제어 및 부가 기능을 추가하기 위해서 이다.
- 스프링 AOP는 스프링 Bean에만 적용 할 수 있다.
- 모든 AOP 기능을 제공하는 것이 목적이 아닌 중복코드, 프록시 클래스 작성의 번거로움 등 흔한 문제를 해결하기 위한 솔루션을 제공하는 것이 목적이다.
- 스프링 AOP는 순수 자바로 구현되었기 때문에 특별한 컴파일 과정이 필요하지 않다.
스프링은 4가지 형태의 핸들러를 제공
스프링에서는 핸들러를 어드바이스(Advice)라는 개념으로 사용
'KH > Spring' 카테고리의 다른 글
[Spring] redirect 객체 전달 : RedirectAttributes (0) | 2022.12.01 |
---|---|
[Spring] @SessionAttributes 와 @ModelAttribute (0) | 2022.11.30 |
[Spring] @Component와 Bean의 차이 (0) | 2022.11.28 |
[Spring] 암호화_MD5 , SHA-256 (0) | 2022.11.25 |
[Spring] @Autowired, @Resource, @Inject 어노테이션의 차이점 (0) | 2022.11.24 |