스프링 AOP란

Jay_u·2023년 5월 12일
0

Spring

목록 보기
1/3


AOP는 Aspect Oriented Programming 의 약자로 관점 지향 프로그래밍이라고 합니다.

AOP는 각각의 클래스에서 반복되는 메소드, 필드, 코드 등을 모듈화 하여 쉽게 유지보수를 할 수 있도록 하는 개념입니다.

위처럼 클래스를 관통하는 하나의 공통된 부분을 의미하죠.

이때 모듈화 시킨 블록은 Aspect 라고 합니다.




<AOP 관련 용어>

그렇다면 Spring에서 AOP를 왜 사용할까요?

  1. 코드 중복 제거
    AOP를 통해 코드의 공통 부분을 한 곳에서 관리할 수 있습니다.
    예를 들어 로그인 유무를 체크하는 코드는 매 페이지에서 실행할 필요 없이 하나의 부가기능으로 묶을 수 있습니다.
  1. 비지니스 로직과 부가기능(클래스를 관통하는 공통된 메소드, 필드 코드)의 분리
    AOP를 사용해서 비지니스 로직과 부가 기능(로그인 유무 체크, 트랜잭션)을 분리할 수 있으면 이를 통해 유지보수가 용이해집니다.

  2. 모듈의 유연화 실현
    AOP를 통해 모듈화를 진행하면 비지니스 로직과 독립적으로 부가기능을 추가하거나 제거할 수 있습니다. 이러한 모듈화는 시스템의 확장성을 높이며 새로운 요구사항에도 쉽게 대처할 수 있습니다.

  3. 트랜잭션 관리
    트랜잭션을 관리하는 코드 =>하나의 작업에 여러 개의 작업이 묶여 있는 개념
    예를 들어 은행의 송금은 일정한 순서에 맞춰 하나씩 기능이 실행되어야 합니다.
    일련의 과정을 묶어 트랜잭션이라 하는데 AOP를 이용하면 비지니스 로직에 중복해서 트랜잭션 코드를 작성할 필요가 없어집니다!!


스프링에서 AOP 사용법

  1. AOP는 우리가 메인으로 실행해야하는 개별적인 기능들에 앞서서? 혹은 실행 후에 동일하게 실행되는 작업들을 모아놓은 것입니다.

  2. 예를 들면 로그인 유무를 확인하는 기능입니다. 먼저 AOP 패키지를 구성합니다.

  3. 클래스 생성 후 @Aspect, @Component 어노테이션을 붙여줍니다.
    @Aspect는 Aspect Class로 인식하게 해줍니다.
    하지만 @Component 어노테이션을 꼭 써줘야 합니다. 그렇지 않으면 bean으로 인식하지 못합니다.

@Aspect
@Component
public class AOP {

	// Advice 구현
    
    @Pointcut(Join Point 의 상세한 스펙을 정의 => Advice(중복되는 부가기능) 실행시점)
    public void needLogin() {}
	
    @Before(checkLogin()) <= 위에서 정의한 pointcut이 실행되기전에 실행되는 메소드
    public void checkLogin(JoinPoint joinPoint) {
    
    }
}

여기서 @Pointcut() 의 파라미터는 공통적으로 인식되는 메소드를 의미합니다
무슨 의미냐면 로그인전에 loginCheck() 메소드를 통해 로그인 유무를 확인해야 하는 메소드(= Advice를 적용시켜야 할메소드를 의미)를 전부 끌고 와야한다는 것입니다.

어떻게?

공통적인 이름을 부여하는데 이를 AOP PointCut 표현식이라 합니다.

execution, within, bean(스프링 버전 2.5부터 지원) 을 활용합니다.
* 모든 값을 의미
.. 0개 이상을 의미

execution([수식어] 리턴타입 [클래스 이름].이름(파라미터)) 구조로

execution(public com.spring..Controller.requiredLogin_*(..) )")

=>
public
*(모든 반환타입)
com.spring.. (com.spring 및 하위 패키지에 속해 있다는 뜻)
*Controller 는 Controller로 끝나는 인터페이스의
requiredLogin_* 이건 'requiredLogin_'이라는 이름으로 시작하는 메소드 이면서
(..)파라미터가 0개 이상인

메소드를 전부 고른다는 의미입니다.

수식어는 생략가능 하므로

execution( com.spring.aop..())

=> com.spring.aop. com.spring.aop 패키지에 속해 있고(.이 1개)
=> * 아무 인터페이스
=> .* 모든 메소드
=> (*) 파라미터는 1개

execution(public com.spring..Name.Method(..)
=> public 이면서
=> com.spring.aop.. com.spring.aop 패키지 및 하위 패키지에 속해 있고(.이 2개)
=> *Name Name으로 끝나는 인터페이스
=> Method로 시작하는 모든 메소드
=> (
) 파라미터는 0개 이상

이런식으로 작성합니다.

profile
정확한 정보를 전달할려고 노력합니다.

0개의 댓글