AOP (Aspect Oriented Programming)
AOP란
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 한다.
로직을 작성할 때 그 로직이 핵심적인 기능인지, 부가적인 기능인지 관점에 따라서 다양한 기능을 분리하여 모듈화 하는
프로그래밍 패러다임이다.
내가 프로젝트에서 작성했었던 서비스를 하나 가져와보겠다.
public void delete(String accessToken, long boardId) {
if(isWriter(accessToken, boardId)){
// 에러 발생
}
boardRepository.deleteById(boardId);
...
}
public void update(String accessToken, long boardId) {
if(isWriter(accessToken, boardId)){
// 에러 발생
}
// 게시글 수정 로직~~
...
}
위와 같이 게시글 삭제, 수정 시에는 로그인 한 사람이 작성자인지 확인을 하는 과정이 필요했다.
그러나 서비스단에서 작성해야하는 것은 비즈니스로직 그 자체이다.
위에 예시에서는 글을 삭제하고, 글을 수정하는 것이다.
그 외의 권한을 확인하거나, 성능 체크, 로깅을 하는 등의 부가기능은 인프라 로직이라고한다.
이런 인프라 로직은 한 영역에서만 나타나는게 아니라 애플리케이션 전체 영역에서 나타날 수 있다.
인프라 로직이 서비스단에 작성되면 몇몇 단점이 생기게 되는데
1. 위의 예시 처럼 중복된 코드가 작성 될 수 있다.
2. 비즈니스 로직 사이에 인프라 로직이 껴있게 되면 비즈니스 로직을 이해하기 어려워진다.
인프라 로직(위의 예시에선 권한체크, 성능체크, 로깅)은 AOP관점에서 가로로 중복되는 관심사이기 때문에 횡단 관심사(Cross cutting concern)이라고 부른다.
AOP 용어
- Aspect : 흩어져있는 공통 관심사를 모듈화한 것
- Target : 어떤 대상에 부가기능을 부여할 것인가, Asepect를 적용할 곳
- Advice : 실질적으로 어떤 부가기능이 작동하는지 작성하는 것
- JoinPoint : 어디에 Advice가 적용될 것인가. (메서드 실행시점, 객체를 생성할 때, 생성자 호출할 때...등)
(**Spring AOP에서는 메서드가 실행될 때만으로 한정된다.) - PointCut : 실제 Advice가 적용될 곳 (JoinPoint의 정규표현식이라고 한다. JoinPoint가 PointCut에 일치할 때 마다 Advice가 실행된다.)
Type | 설명 |
Before | 조인포인트 실행 이전에 실행, 일반적으로 리턴타입 void |
After returning | 조인포인트 완료후 실행 (ex. 메서드가 예외없이 실행될 때) |
After Throwing | 메서드가 예외를 던지는 경우 실행 |
After (finally) | 조인포인트의 동작과 관계없이 실행 |
Around | 메서드 호출 전후에 수행(조인포인트 실행 여부 선택, 반환 값 변환, 예외 변환, try~catch~finally 구문 처리 가능 등), 가장 강력한 어드바이스이다. |
Spring AOP와 AspectJ
AspectJ는 자바언어용 AOP확장 기능이다.
Spring AOP | AspectJ | |
목적 | 간단한 AOP 기능 제공 | 완벽한 AOP 기능 제공 |
구현 | 순수 JAVA로만 구현 가능 | 추가 도구(자바 프로그램)을 통해 구현 |
weaving | 런타임 시에만 가능 | 런타임은 불가능하지만 컴파일, 컴파일 전, 로드 시점에 가능 |
join point | 메서드 레벨만 지원 | 필드, 생성자, 메서드 등 다양하게 지원 |
대상 | Spring Container에 의해 관리되는 Bean에만 가능 | 모든 객체를 대상으로 가능 |
[참고 블로그 : https://www.youtube.com/watch?v=Hm0w_9ngDpM]
[참고 블로그 : https://logical-code.tistory.com/118]
Spring AOP와 AspectJ 비교하기
Thanks to @ㅅㅈㅎ 님 덕분에 3-5 첫번째 문장의 오타를 수정했습니다. 감사합니다! (더 간편합니다다. ⇢ 더 간편합니다.) @김성수 님 덕분에 3-2. Weaving의 오타를 수정했습니다. 감사합니다! (컴파일
logical-code.tistory.com
'공부 일지 > 프로그래밍 언어' 카테고리의 다른 글
Querydsl 알아보기 (0) | 2023.04.11 |
---|---|
[JAVA] 예외 처리 (0) | 2023.03.29 |
[JAVA] 가비지 컬렉션(Garbage Collection) (3) | 2023.03.17 |
[JAVA] 스트림(Stream) (0) | 2023.01.15 |
[JAVA] 람다식(Lambda Expression) (0) | 2023.01.12 |