-
[Spring] AOP란 무엇인가? (관점지향 프로그래밍)Spring 2024. 7. 21. 16:23
AOP(Aspect Oriented Programming)란?
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것이다.
그렇다면 이 관점(Aspect)을 지향하는 프로그래밍은 무엇일까?
아이를 키우는 육아 방식이나 교육 방식 등은 부모에 따라 제각각이다.
어떤 부모는 아이의 언어 발달을 위해 책을 읽어줄 것이고, 어떤 부모는 동요나 만화를 들려줄 것이다.
이처럼 아이를 키우는 방식은 다를 수 있지만, 공통되는 부분이 존재한다.
부모의 공통된 관심사는 어떤 방식으로 아이를 키우는 것과는 별개로 아프지 않고 잘 자라는 것이다.
AOP는 부모들이 가지고 있는 아이의 건강과 같은 공통 관심사와 마찬가지로
애플리케이션에 필요한 기능 중에서 공통적으로 적용되는 기능에 대한 관심과 관련이 있다.
이를 공통 관심 사항과 핵심 관심 사항으로 구분 짓는다.
공통 관심 사항과 핵심 관심 사항
공통 관심 사항(Cross-cutting concern)
애플리케이션을 개발하면서 공통적으로 사용되는 기능들이 있다.
이러한 공통 기능에 대한 관심사를 바로 공통 관심 사항이라고 한다.
핵심 관심 사항(Core concern)
핵심 관심 사항은 애플리케이션의 공통 기능이 아닌 비즈니스 로직에 대한 관심사로 애플리케이션의 주목적을 달성하기 위한 핵심 로직에 대한 관심 사항을 뜻한다.
공통 관심 사항과 핵심 관심 사항의 예시
상품을 주문하는 프로그램이 있다고 가정한다.
관리자는 고객에게 제공할 상품을 구성하기 위해 상품 등록하는 기능과
고객이 주문하고 싶은 상품을 담고 주문하는 기능은 핵심 관심 사항에 해당된다.
반면에 상품을 주문하는 프로그램에 회원만 접속할 수 있도록 제한하는 등의 보안과 상품을 결제하는 트랜잭션 등은 프로그램의 공통적으로 적용되는 기능이기 때문에 공통 관심 사항에 해당된다.
즉, AOP는 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것으로 생각하면 이해하기 쉽다.
AOP는 흩어진 관심사(Crosscutting Concerns)를 모듈화 할 수 있는 프로그래밍 기법이다.
[그림 1]과 같이 클래스 A, B, C에서 공통적으로 나타나는 색깔 블록은 중복되는 메서드, 필드, 코드 등이다. 이때 예를 들어 클래스 A의 주황색 블록 부분을 수정해야 한다면 클래스 B, C의 주황색 부분도 일일이 찾아 수정해야 한다. 이는 SOLID원칙을 위배하며 유지보수를 어렵게 만든다. 이런 식으로 소스 코드상에서 계속 반복해서 사용되는 부분들을 흩어진 관심사(Crosscutting Concerns)라고 한다.
결국 AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 흩어진 관심사를 모듈화하겠다는 의미다. [그림 1]과 같이 주황색, 파란색, 빨간색 블록처럼 모듈화 시켜놓고 어디에 적용시킬지만 정의해주면 되는 것이다. 이때 모듈화 시켜놓은 블럭을 Aspect라고 한다.
AOP가 필요한 이유
애플리케이션의 핵심 로직과 공통 기능을 분리하는 이유
- 코드의 간결성 유지
- 객체 지향 설계 원칙에 맞는 코드 구현
- 코드의 재사용
- 어플리케이션 전체에 흩어진 공통기능이 하나의 장소에서 관리됨
- 다른 Service 모듈들이 본인의 목적에만 충실하고 그 외 사항들은 신경 쓰지 않아도 됨
AOP 어노테이션
- @Component
- 컴포넌트 어노테이션을 명시해 스프링 컨테이너가 객체 생성하도록 한다. - @Aspect
- 스프링 컨테이너에 AOP 담당 객체임을 알린다. - @Around
- 횡단 관심사항의 대상 지정과 적용 시점을 지정한다. (pointcut, advice)
'Spring' 카테고리의 다른 글
[Spring] 필터(Filter)와 인터셉터(Interceptor) (0) 2024.07.21 @RequiredArgsConstructor란? (0) 2024.04.05 private 메서드에 @Transactional이 적용될까? (0) 2024.04.02 Spring Boot와 AWS로 혼자 구현하는 웹 서비스 - 3장 Spring Boot에서 데이터베이스 다뤄보자 (0) 2022.02.26 Spring Boot와 AWS로 혼자 구현하는 웹 서비스 - 2장 Spring Boot에서 테스트 코드를 작성하자 (1) 2022.02.20