프로그래밍/java

[spring] 스프링 AOP는 언제 사용하지

znvlcm 2023. 4. 27. 16:42

스프링은 DI, AOP이 핵심이다. 

이중 AOP 관점지향프로그래밍이란 무엇일까? 

 

보통 프로그래밍을 할 때 흐름은 기능의 처리 순서이다. 

HTTP 요청을 서블릿이 받아 url 리퀘스트 매핑을 통해 적절한 컨트롤러로 연결해주면 

컨트롤러에서 비지니스로직을 호출하고 결과를 반환해 화면으로 돌려준다. 

 

그런데 때때로 이 처리 순서의 흐름이 아니라 어떤 특정 시점에서 공통된 처리를 해주고 싶을 때가 있다. 

나 같은 경우 로그나 시간을 측정할 때 사용해봤다. 

포인트컷을 지정하면 실행 전후의 로그를 남길 수 있는데

여기서 시작시간과 처리종료시간을 계산하면 처리시간을 구할 수 있다. 

각 처리에 하나하나 로그와 시간을 계산하지 않아도 된다. 

우리에겐 스프링 AOP가 있으니까 

 

스프링 AOP는 스프링 빈을 등록할 때 프록시를 등록해준다. 

포인트 컷으로 AOP대상을 지정해준 AOP클래스를 만들면

대상 빈을 등록할 때 Aspect로 정의해놓은 프록시를 등록해준다. 

핵심기능이라는 알맹이에 부가기능을 위한 껍데기를 씌워주는 것이다. 

 

이처럼 AOP는 각 순서가 있는 기능이 수직으로 흐를 때 어떤 부분에서 일괄적으로 처리할 수 있다

각 핵심로직을 변경하지 않고도 

@Aspect를 정의하는 것만으로 특정 대상의 특정시점의 원하는 기능을 넣을 수 있으니 

편리한 기능이다. 

 

대표적으로 스프링의 트랜젝션이 있다. 

이 트랜젝션은 보통 서비스에 달아두는데 

비지니스 처리도중 예외가 발생하거나 처리가 불필요할 시 

여러개의 테이블의 변경이 일어나도 해당 트랜젝션에 있는 모든 테이블 변경을 롤백해준다. 

이 트랜젝션에 대한 내용은 애노테이션으로 달아두기만해도 

스프링이 정해둔 롤백 커밋등에 대한 트랜젝션 Aspect가 이미 정의되어 있기에 

개발자가 해당 내용을 신경쓰지 않아도 알아서 처리한다. 

 

이처럼 어떤 단계에서 중복된 처리를 적용하고 싶을 때 그 때 AOP를 쓴다.

728x90