- AOP (Aspect Oriented Programming) 를 통해 부가기능을 모듈화
- '부가기능'은 '핵심기능'과는 관점(Aspect), 관심이 다름
- 따라서 '핵심기능'과 분리해서 '부가기능' 중심으로 설계, 구현 가능
더보기
AOP(Aspect-Oriented Programming)은 소프트웨어 개발에서 모듈성과 관점 분리를 지원하기 위한 프로그래밍 패러다임입니다. AOP는 핵심 로직과 횡단 관심사(Cross-cutting Concerns)를 분리하여 개발하는 방법을 제공합니다.
횡단 관심사란, 여러 모듈에서 공통으로 발생하는 기능 또는 요구사항을 말합니다. 예를 들어, 로깅, 트랜잭션 관리, 보안 등이 횡단 관심사에 해당합니다. 이러한 횡단 관심사는 여러 모듈에 흩어져 있어 코드 중복과 유지보수의 어려움을 초래할 수 있습니다.
AOP는 이러한 횡단 관심사를 핵심 로직과 분리하여 관리합니다. 핵심 로직은 프로그램의 주요 기능을 담당하는 부분이며, 횡단 관심사는 부가적인 기능을 제공합니다. AOP는 이러한 횡단 관심사를 모듈화하여 한 곳에서 관리하고, 핵심 로직에 영향을 주지 않으면서 필요한 시점에 적용할 수 있도록 해줍니다.
AOP의 주요 개념은 다음과 같습니다:
- Aspect(관점):
횡단 관심사를 모듈화한 것을 말합니다. 로깅, 트랜잭션 관리, 보안 등이 Aspect의 예시입니다.
Aspect는 어드바이스와 포인트컷으로 구성됩니다. - Join point(조인 포인트):
프로그램 실행 중에 Aspect가 적용될 수 있는 특정한 시점을 말합니다. 메서드 호출, 예외 발생 등이 조인 포인트의 예시입니다. - Advice(어드바이스):
조인 포인트에서 수행되는 횡단 관심사의 구체적인 구현을 말합니다.
@Before, @After, @Around 등의 어노테이션을 사용하여 어드바이스를 정의할 수 있습니다. - Pointcut(포인트컷):
어드바이스가 적용될 조인 포인트를 선택하는 방식을 말합니다.
표현식이나 패턴을 사용하여 포인트컷을 정의할 수 있습니다. - Weaving(위빙):
Aspect를 핵심 로직에 적용하는 과정을 말합니다. 컴파일 시점, 클래스 로딩 시점, 실행 시점 등에 위빙이 수행될 수 있습니다.
AOP의 장점과 활용 예시를 살펴보겠습니다:
장점:
- 모듈성과 재사용성: 횡단 관심사가 분리되어 모듈화되기 때문에 코드 중복을 줄이고 재사용성을 높일 수 있습니다.
- 관점 분리: 핵심 로직과 횡단 관심사가 분리되어 코드를 읽고 이해하기 쉽습니다. 이로 인해 코드의 가독성과 유지보수성이 향상됩니다.
- 유연성과 확장성: 횡단 관심사를 독립적으로 변경하거나 추가할 수 있어 유연한 시스템 구조를 구성할 수 있습니다.
- 중복 코드 제거: 횡단 관심사를 하나의 모듈로 관리하므로 중복된 코드를 제거할 수 있습니다.
AOP의 활용 예시:
- 로깅: 핵심 로직에서 발생하는 이벤트를 로그로 남기는 작업을 횡단 관심사로 분리할 수 있습니다. 예를 들어, 메서드 실행 전후에 로그를 출력하는 어드바이스를 작성하여 로깅을 자동화할 수 있습니다.
- 트랜잭션 관리: 데이터베이스 작업과 같은 트랜잭션 처리를 횡단 관심사로 분리하여 중복 코드를 제거하고, 트랜잭션의 시작과 종료를 자동으로 처리할 수 있습니다.
- 보안: 인증 및 권한 검사와 같은 보안 관련 작업을 횡단 관심사로 분리하여 애플리케이션 전반에 걸쳐 일관된 보안 기능을 제공할 수 있습니다.
- 성능 모니터링: 핵심 로직의 실행 시간을 측정하거나 메서드 호출 횟수를 기록하는 등의 작업을 횡단 관심사로 분리하여 애플리케이션의 성능을 모니터링할 수 있습니다.
이 외에도 AOP는 다양한 도메인에서 유용하게 활용될 수 있습니다. Spring Framework와 같은 프레임워크에서 AOP를 지원하고 있으며, 자바의 어노테이션을 이용한 AOP 설정이 일반적으로 사용됩니다.
- 스프링 AOP 어노테이션
- @Aspect:
- @Aspect 어노테이션은 스프링 빈 (Bean) 클래스에만 적용되며, 해당 클래스가 Aspect 역할을 수행함을 나타냅니다.
- Aspect는 어드바이스와 포인트컷을 포함한 AOP 구성 요소들을 정의하고 관리하는 역할을 합니다.
- Aspect 클래스는 보통 @Component 어노테이션과 함께 사용되어 스프링 컨테이너에 등록됩니다.
- 어드바이스 종류:
- 어드바이스는 AOP에서 실행될 시점을 지정하는 역할을 합니다.
- @Around, @Before, @After, @AfterReturning, @AfterThrowing 등이 있습니다.
- @Around: '핵심기능' 수행 전과 후 (@Before + @After)
- @Before: '핵심기능' 호출 전 (ex. Client 의 입력값 Validation 수행)
- @After: '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)
- @AfterReturning: '핵심기능' 호출 성공 시 (함수의 Return 값 사용 가능)
- @AfterThrowing: '핵심기능' 호출 실패 시. 즉, 예외 (Exception) 가 발생한 경우만 동작 (ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)
- 포인트컷:
- 포인트컷은 AOP에서 어드바이스가 실행될 장소를 지정하는 역할을 합니다.
- 포인트컷 표현식을 사용하여 메서드, 클래스, 패키지 등을 지정할 수 있습니다.
- 포인트컷 표현식은 execution() 패턴을 사용하여 지정됩니다.
- execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?) 형식을 따릅니다.
- modifiers-pattern은 접근 제한자를 지정(public, private, *)하며,
return-type-pattern은 반환 타입을 지정(void, String, List<String>, *)합니다. - declaring-type-pattern은 클래스를 지정(com.sparta.springcore.controller.* - controller 패키지의 모든 클래스에 적용, com.sparta.springcore.controller.. - controller 패키지 및 하위 패키지의 모든 클래스에 적용)하고, method-name-pattern은 메서드 이름을 지정합니다.
- param-pattern은 메서드의 파라미터를 지정합니다. (*)는 1개의 인수를 의미하고, (..)은 0개 이상의 인수를 의미합니다.
더보기
- () - 인수 없음
- (*) - 인수 1개 (타입 상관없음)
- (..) - 인수 0~N개 (타입 상관없음)
- @Pointcut 어노테이션을 사용하여 포인트컷을 정의하고 재사용할 수 있습니다. 또한, 여러 개의 포인트컷을 결합할 수 있습니다.
'Spring' 카테고리의 다른 글
AOP, Interceptor, Filter (0) | 2023.06.06 |
---|---|
TestCode, TDD, BDD, Junit, Mokito (0) | 2023.05.29 |
Transaction, Primary, Replica (0) | 2023.05.29 |
스프링 프레임워크(Spring Framework), 생성자 주입, Singletone Bean (0) | 2023.05.25 |
스프링 3계층 아키텍처, Annotation(@) (0) | 2023.05.25 |