본문 바로가기
공부 일지/프로그래밍 언어

Spring AOP

by Joshbla 2023. 3. 23.

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