공통관심사항은 소프트웨어에서 여러 부분에서 반복적으로 발생하는 비즈니스 로직이 아닌, 보안, 로깅, 예외 처리와 같은 부가적인 관심사를 의미합니다.
이러한 관심사들은 애플리케이션의 여러 모듈과 계층을 가로지르며 존재하며, 코드의 다양한 부분에서 중복되어 나타날 수 있습니다.
공통관심사항을 해결하지 않으면 코드의 가독성과 유지보수성이 저하될 수 있습니다.
예를 들어, 로깅은 공통관심사항의 한 예입니다. 모든 메서드에서 로그를 남기는 코드를 중복으로 작성해야 할 수 있으며, 이로 인해 코드가 복잡해지고 변경이 어려워집니다.
AOP는 공통관심사항을 효과적으로 다루기 위한 프로그래밍 패러다임 중 하나입니다.
AOP는 코드의 주요 로직에서 공통관심사항을 분리하여 모듈화하고, 이러한 관심사항을 필요한 곳에서 주입(인젝션)하여 중복 코드를 줄이고 유지보수성을 향상시킵니다.
다음은 Java 언어를 사용하여 AOP를 이해하는 간단한 코드 예제입니다. Spring Framework의 AOP 모듈을 사용한 예제입니다.
// Aspect 클래스: 공통관심사항을 정의한 클래스
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethodExecution() {
System.out.println("메서드 실행 전 로깅");
}
}
// 비즈니스 로직 클래스
import org.springframework.stereotype.Service;
@Service
public class MyService {
public void doSomething() {
System.out.println("비즈니스 로직 수행");
}
}
// 메인 애플리케이션 클래스
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = context.getBean(MyService.class);
myService.doSomething(); // AOP에 의해 메서드 실행 전 로깅이 자동으로 수행됨
context.close();
}
}
이 코드 예제에서 LoggingAspect는 공통관심사항으로서 메서드 실행 전에 로그를 출력하도록 정의되었습니다.
AOP를 사용하여 @Before 어노테이션으로 해당 관심사항을 적용하고, AspectJ 표현식을 사용하여 어떤 메서드에 적용할지를 정의했습니다.
결과적으로 MyService 클래스의 doSomething 메서드를 호출할 때 AOP에 의해 메서드 실행 전 로깅이 자동으로 수행됩니다.