DongDD's IT

[Spring] Aspect of Programming(AOP), Resource 본문

프로그래밍/Spring

[Spring] Aspect of Programming(AOP), Resource

DongDD 2019. 3. 20. 20:16


[Spring] Aspec of Programming(AOP), Resource



Aspect Of Programming(AOP)



- Logging 기능 등 비즈니스 로직과 별개인 공통 로직은 여러 코드 내에 동일하게 구현됨

-> 수정이 필요할 경우, 모두 찾아 고쳐야함

- 공통로직(Cross-Cutting Concern - 횡단 관심) - 보안, 로깅, 트랜잭션, 모니터링, 캐싱, 예외처리

-> 이러한 로직을 분리하여 구현 하는 것을 AOP라고 함(공통 기능을 외부에서 삽입)


AOP 개념


1. Aspect

- AOP의 단위(공통 기능)

- 로깅, 보안, 캐싱 등


2. Join point

- Aspect가 실행될 시점(method 단위)

- 특정 method를 뜻함


3. Advice

- 특정 join point에서 실행되는 코드

- 해당 코드가 언제 실행될지 결정

1) Advice 종류

- Before : join point 전에 실행

- After : join point에서 처리 완료 후 실행(예외, 비정상 종료 무시)

- After Returning : join point에서 정상 종료 후 실행

- After Throwing : join point에서 예외 발생 시 실행

- Around : join point 전후에 실행


4. Point cut

- Advice를 적용할 곳들의 표현식


5. Weaving

- 코드의 적절한 지점에 Aspect 적용(default : Runtime)

- 공통 기능이 삽입되는 과정


6. Target

- AOP에 의해 처리 흐름 변화가 생긴 객체


ex) 특정 메소드(Join Point)실행되기 전에 실행되는 코드(Advice)



AspectJ


- AOP framework

- AppConfig나 Spring Application에 @EnableAspectJAutoProxy로 사용(@SpringBootApplication만 써도 사용 가능하긴 함)

- Aspect/advice 정의 annotation, Point cut 표현 언어, 위빙 메커니즘(default : runtime) 제공


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Aspect
@Component
public class LogAspect {
 
    @Before("execution(* com.example.demo.Controller.LogController.*(..))")
    public void beforeLogController(JoinPoint joinPoint) {
        System.out.println("AOP Before LogController");
    }
 
    @After("execution(* com.example.demo.Controller.LogController.*(..))")
    public void afterLogController() {
        System.out.println("AOP After LogController");
    }
 
}
cs


- @AfterReturning(value = "execution(* com.example.demo.Controller.LogController.*(..))", returning = "return") : return 결과를 returning="return"으로 받을 수 있음

- @AfterThrowing(value = "execution(* com.example.demo.Controller.LogController.*(..))", throwing = "e")  : 예외를 throwing="e" 로 받을 수 있음

- JoinPoint를 인자로 받아 대상 객체의 정보를 가져올 수 있음


Point Cut 표현식


1. execution(* com.example.demo.Controller.LogController.*(..))

- execution : 지시자

- * : return 값

- com.example.demo.Controller : package

- LogController : Class

- *(..) : 임의의 인자를 갖는 모든 메소드

- *(*) : 하나의 인자를 갖는 모든 메소드 


2. within 지시자


1
2
3
4
5
6
@Before("within(com.example.demo.Controller.*)")
public void withLogController() {
    System.out.println("within");
}
 
 
cs

- within(class/package 경로)


3. Named Point Cut


1
2
3
4
5
6
7
8
9
10
@Before("pointCut()")
public void withLogController() {
    System.out.println("within");
}
 
@Pointcut("within(com.example.demo.Controller.*)")
public void pointCut() {
}
 
 
cs

- com.example.demo.Controller.* 경로를 within으로 pointcut으로 생성(pointCut())

- pointCut()으로 point cut 지정


AOP 기능


1. 트랜잭션 관리

- @Transcational

- 트랜잭션 관리를 spring framework가 해줌


2. 인가

1) @PreAuthorize("hasRole('user')")

- 해당 메소드 호출 전 인가 조건 만족 확인

2) @PostAuthorize("hasRole('user')")

- 메소드 호출 후 응답하기 전 인가 조건 만족 확인


3. 캐싱

1) @Cacheable("user")

- 메소드 실행 결과를 "user"에 저장

- 이 후, 동일 메소드 실행 시, 저장된 캐시 값을 반환


4. 비동기 처리

1) @Async

- 메소드의 반환 값으로 CompletableFuture<>, DeferredResult<> 설정

- 비동기가 필요한 메소드에 어노테이션 붙이고 반환 값 타입을 맞춰줘야함


5. 재처리

1) @Retryable(maxAttempts = 3)

- 해당 메소드가 원하는 조건에 만족할 때까지 반복(maxAttempts : 최대 수행할 횟수)


Resource


Resource


- 리소스 추상화를 위해 Spring Framework가 제공하는 인터페이스

1) 주요 구현 클래스

1
2
3
4
5
Resource urlResource = new UrlResource("path");
Resource classPathResource = new ClassPathResource("path");
Resource fileSystemResource = new FileSystemResource("path");
 
 
cs


Resource Loader


- Resource 객체를 생성하는 과정을 추상화하기 위해 사용

1
2
3
4
5
6
@Autowired
ResourceLoader resourceLoader;
 
public void getResourceTest(){
    Resource resource1 = resourceLoader.getResource("path");
}
cs


Comments