관심사의 분리
⇒ 공통 로직의 분리, 공통로직을 사용(호출)하는 코드까지 공통로직의 연장선으로 봄
OOP를 더욱더 OOP스럽게 만들어줌
- core concenrn: 핵심 로직
- cross cutting concern: 공통 로직
개요
- 핵심 관심사항과 공통 관심 사항
- 기존 oop에서는 공통 관심사항을 여러 모듈에 적용하는데 있어 중복된 코드를 양상 하는 한계 존재 → 이를 해결하기 위해 AOP 등장
- 공통 관심 사항을 기준으로 프로그래밍함으로써 공통 모듈을 손쉽게 적용할 수 있게 함
- AOP는 관심사의 분리(핵심적인 기능에서 부가적인 기능을 분리한다)
- 분리한 부가 기능을 Aspect라는 독특한 모듈형태로 만들어서 설계하고 개발
- AOP는 부가 기능을 Aspect로 정의하여, 핵심 기능에서 부가기능을 분리함으로써 핵심 기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와줌
AOP 적용 예
- 간단한 메소드의 성능 검사(시간 계산 시)
- 트랜잭션 처리(비즈니스 로직 전후에 설정)
- 비즈니스 로직의 전후에 설정된다.
- 예외 반환
- 아키텍처 검증
AOP 용어
- Target: 핵심 기능을 담고 있는 모듈, target은 부가 기능을 부여할 대상이 됨
- Advice: 어느 시점에 어떤 공통 관심 기능(Aspect)를 적용할 지 정의한 것 (공통 로직)
- JoinPoint: Aspect가 적용될 수 있는 지점, target객체가 구현한 인터페이스의 모든 method는 JoinPoint가 됨 (공통 로직이 접목되는 지점)
- Pointcut: 공통 관심 사항이 적용될 JoinPoint
- Aspect: 여러 객체에서 공통으로 적용되는 공통 관심 사항(transaction, loggin, security)
- (pointcut+advice+cross-cutting concern)
- Advisor=Advice+Pointcut
- Weaving: 핵심 로직에 공통 로직을 엮어주는 작업(핵심 로직 내부에 공통 로직 호출코드 삽입), pointcut을 기반으로 대상을 찾음
- 어떤 advice를 어떤 pointcut(핵심사항)에 적용시킬 것인지에 대한 설정(advisor)
- pointcut에 의해 결정된 target의 joinpoint에 부가 기능을 삽입하는 과정
- aop의 핵심 기능의 코드에 영향을 주지 않으면서 필요한 부가 기능을 추가할 수 있도록 해주는 핵심적인 처리 과정
- 컴파일 타입 weaving: class type 조작⇒ 컴파일 된 클래스에 weaving(호출)되는 코드가 다 존재
- 메모리에 로드되는 바이트 코드를 조작
- run time weaving: 클래스를 이용한 Mapping(핵심 로직)
AOP 설정 태그
<!--핵심로직 빈 등록 -->
<bean id="greetingService" class="com.ssafy.step01.aop.xml.GreetingServiceImpl"></bean>
<!--핵심로직 빈 등록 -->
<bean id="LogAspect" class="com.ssafy.step01.aop.xml.LogAspect" ></bean>
<bean id="timeAspect" class="com.ssafy.step01.aop.xml.PerformanceCheckAspect" ></bean>
<aop:config>
<aop:pointcut expression="execution(void com.ssafy..GreetingService.*Hello(*))" id="helloPointCut"/>
<aop:aspect ref="LogAspect" order="1">
<!-- execution(메소드 선언부) -->
<!-- <aop:before method="beforeLogging" pointcut="execution(* *(..))"/> -->
<!-- <aop:before method="beforeLogging" pointcut="execution(* *(*,..))"/> -->
<aop:before method="beforeLogging" pointcut-ref="helloPointCut"/>
</aop:aspect>
<aop:aspect ref="timeAspect" order="2">
<!--Aspcet빈에서 호출할 method명 지정 -->
<aop:around method="checkTime" pointcut="execution(* *Hello(..))"/>
</aop:aspect>
</aop:config>
Spring Aop 특징
- Proxy기반 AOP지원
- target 객체에 대한 proxy를 만들어 제공
- target을 감싸는 proxy는 실행 시간에 생성
- proxy는 advice를 target객체에 적용하면서 생성되는 객체
2. Proxy가 호출을 가로 챈다(Intercept)
- Target 객체에 대한 호출을 가로챈 다음 Advice의 부가 기능 로직을 수행하고 난 후에 Target의 핵심 기능 로직을 호출한다.Spring은 동적 Proxy를 기반으로 AOP를 구현하므로 method JoinPoint만 지원한다.
- 핵심 기능의 method가 호출되는 런타임 시점에만 부가 기능을 적용할 수 있다.
AOP의 동작 방식
- before: 메소드 실행 중 예외 발생 시 Advice 메소드 동작
- after: 메소드 실행 후 무조건 동작(성공 실패와 상관 x)
- after-thrwoing: 메소드 실행 중 예외 발생 시 Advice 메소드 동작
- after-returning: 성공적으로 리턴 시 Advice 메소드 동작
- around: 실행 전 후 Advice 메소드 동작, return type=Object
JoinPoint Class 구성 요소
- getTarget()
- Object[] getArgs()
- Signature getSignature: 호출되는 메소드 정보
- String getName(): 메소드 이름
어노테이션 활용 시
- 설정 파일
2. 입력 매개변수의 유효성을 따지기 위한 코드
- 비지니스 메소드로 진행하도록(proceed) 하는 메소드가 proceed() 메소드이다.
- 이 메소드를 실행하기 전에 비지니스 메소드 호출 전에 처리할 코드를 수행하도록 하면 된다.
- proceed()를 기준으로 비지니스 메소드 수행 전과 후가 나뉘어 진다. 즉 proceed()가 호출 되기 전에는 비지니스 메소드 호출 전이고 proceed()가 호출된 후에는 비지니스 메소드 호출 후라고 생각하면 된다.
'cs 기술 면접 공부' 카테고리의 다른 글
Spring Transaction (0) | 2023.05.11 |
---|---|
AJAX (0) | 2023.03.20 |
데이터 저장소, JSON (0) | 2023.03.16 |
JavaScript (2) (0) | 2023.03.16 |
Java Script (1) (0) | 2023.03.16 |