일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 운영체제
- system hacking
- pwnable
- 네트워크
- wargame
- 정보보안기사
- 워게임
- Spring Framework
- webhacking.kr
- LOB
- SQL
- 정보처리기사 실기
- Shell code
- 해킹
- System
- OS
- Spring
- Pwnable.kr
- Operating System
- Buffer Overflow
- BOF
- Lord of BOF
- hacking
- Spring MVC
- stack overflow
- Payload
- webhacking
- 웹해킹
- PWN
- 정보보안기사 실기
- Today
- Total
DongDD's IT
[Spring] Aspect of Programming(AOP), Resource 본문
[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 |
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Spring Web Application, Controller, Exception Handler (0) | 2019.04.02 |
---|---|
[Spring] Spring MVC - MVC, IntelliJ 설정, 프로젝트 생성 (0) | 2019.03.28 |
[Spring] Datasource, Spring JDBC, Transaction (0) | 2019.03.27 |
[Spring] Dependency Injection(DI) (0) | 2019.03.18 |
[Spring] Spring Framework 개요 (0) | 2019.03.18 |