일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ubuntu
- ubuntu docker
- FluentdTail
- aws sns
- 만들면서배우는클린아키텍처
- openjdk-8-jdk
- Spring boot
- aws sqs
- efk
- cv
- 로깅시스템
- docker
- 회고록
- FluentdElasticsearch
- root password
- docker설치
- 이력서페이지
- 클린아키텍처
- 2024년
- mac docker
- spring sleuth
- spring_cv
- Spring
- interface default
- 로그관제시스템
- 헥사고날아키텍처
- Fluentd Aggregator
- 이력서
- ubuntu20.04LTS
- 포트앤어댑터아키텍처
- Today
- Total
ToasT1ng 기술 블로그
Spring AOP 간단 정리 본문
사용법을 매번 검색하게 돼서 잊지 않으려 기록한다..!
AOP
Aspect Oriented Programming의 약자로, 중심적 관심사와 횡단적 관심사를 분리해 유지보수성을 높여준다.
중심적 관심사는 비즈니스 로직을 생각하면 되고, 횡단적 관심사은 여기에 뒤따르는 부수적인 로직들로 생각하면 쉽다.
예를 들어 DB의 CRUD를 코드로 구현한다고 할 때,
중심적 관심사가 CRUD에 관한 로직들이라고 한다면
횡단적 관심사는 DB Connection 을 열고 닫고 하는 코드 부분에 해당한다.
public class Dao {
public List<VO> getAll() {
Connection connection = null;
PreparedStatement statement = null;
ResultSet result = null;
List<VO> voList = new ArrayList<VO>();
try {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
//// 중심적 관심사 ////
String query = " SELECT * FROM SOMETABLE ";
statement = connection.prepareStatement(query);
result = statement.executeQuery();
while ( result.next() ) {
voList.add(new VO(result.getInt("ID")););
}
//// 중심적 관심사 ////
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
if (result != null) {
try {
result.close();
} catch (SQLException e) {}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {}
}
}
return voList;
}
}
CRUD를 구현하는 각기 다른 파일에서 똑같은 DB에 접근해 똑같은 방식으로 Connection을 열고 닫아야한다면 매 파일마다 똑같은 코드가 중복된다.
사용방식에 조금이라도 변경점이 생긴다면 모든 파일을 변경해야한다.
휴먼에러율이 상당히 높으며 유지보수성 측면에서 최악이다!
AOP를 통해 이런 부분을 해소할 수 있다.
고유 용어
- Advice : 횡단적 관심사의 메소드 구현. 로그 출력 & 트랜잭션 제어 등등
- Aspect : Advice를 정리한 클래스.
- JoinPoint : Advice를 중심적 관심사에 적용하는 타이밍. ( 메서드 실행 전/후 등)
- Pointcut : Advice를 삽입할 수 있는 위치. ( 메서드 이름 등으로 정의 )
- Target : Advice가 도입되는 대상.
Advice의 5가지 종류
- @Before : 중심적 관심사가 실행되기 이전에 횡단적 관심사를 실행
- @AfterReturning : 중심적 관심사가 정상적으로 종료된 후 횡단적 관심사를 실행
- @AfterThrowing : 중심적 관심사에서 예외가 던져진 후 횡단적 관심사를 실행
- @After : 중심적 관심사 실행 후 횡단적 관심사를 실행 (예외 상관없이)
- @Around : 중심적 관심사 전/후에 횡단적 관심사를 실행
Pointcut 식
와일드카드
- * : 임의의 문자열 or 임의의 패키지 한 계층 or 메서드의 한 인수
- .. : 0개 이상의 패키지 or 0개 이상의 인수
- + : 클래스와 서브 클래스 및 구현 클래스 모두
구현 예시
@Before("execution(* net.jane.*Service.get*(..))")
public void beforeAdvice(JointPoint jointPoint) {}
net.jane 아래 클래스명이 Service로 끝나는 모든 클래스의 get으로 시작되는 모든 메소드에 대해 메소드 실행 전에 시행
@After("execution(VO net.jane.*Dao.*(..))")
public void afterAdvice(JointPoint jointPoint) {}
net.jane 아래 클래스명이 Dao로 끝나는 모든 클래스의 반환값이 VO인 모든 메소드에 대해 메소드 실행 후에 시행
@After("execution(* net.jane..*.*(*,*))")
public void around(ProceedingJointPoint jointPoint) throws Throwable{}
net.jane 이하 모든 하위 패키지의 모든 클래스의 인수가 2개인 모든 메소드에 대해 메소드 실행 전/후에 시행
출처
스프링 프레임워크 첫걸음 - 예스24
세상에서 가장 친절한 스프링 프레임워크 입문서! 스프링 프레임워크는 전 세계적으로 가장 널리 사용되는 오픈소스 자바 애플리케이션 프레임워크다. 이 책에서는 스프링 프레임워크를 처음
www.yes24.com
'Spring' 카테고리의 다른 글
[Spring Sleuth] AWS SNS 쓰레드에 Trace ID 넣어주기 (0) | 2023.02.22 |
---|---|
[Spring] 3. 이력서 페이지 만들기 ( Docker ) (0) | 2022.05.19 |
[Spring] 2. 이력서 페이지 만들기 ( Settings & Https 설정 ) (0) | 2022.03.15 |
[Spring] 1. 이력서 페이지 만들기 ( MySQL DB 사용 ) (0) | 2022.02.19 |
[Spring] 0. 이력서 페이지 만들기 ( 프론트엔드 ) (0) | 2022.02.01 |