ToasT1ng 기술 블로그

Spring AOP 간단 정리 본문

Spring

Spring AOP 간단 정리

ToasT1ng 2023. 9. 20. 23:19

사용법을 매번 검색하게 돼서 잊지 않으려 기록한다..!

 

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

 

Comments