ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링에서 AOP(Aspect-Oriented Programming)를 사용하여 개발된 부분
    카테고리 없음 2024. 11. 11. 09:45
    728x90
    반응형

    스프링에서 AOP(Aspect-Oriented Programming)를 사용하여 개발된 부분은 주로 횡단 관심사(Cross-Cutting Concern)를 처리하는 기능들입니다. 다음은 스프링에서 AOP를 사용하여 구현된 대표적인 기능들입니다.

     

    Cross-Cutting Concern이란?

    Cross-Cutting Concern(횡단 관심사)은 소프트웨어 개발에서 애플리케이션의 주요 기능과는 별개로, 여러 모듈이나 클래스에 걸쳐 공통적으로 필요한 부가적인 기능을 말합니다. 이 기능들은 비즈니스 로직과는 구분되지만, 애플리케이션 전반에 걸쳐 일관되게 적용되어야 하기 때문에 각 모듈에 중복되어 나타나기 쉽습니다.

    예를 들어볼까요?

    애플리케이션을 개발할 때, 주로 비즈니스 로직이 주요 관심사(Core Concern)가 됩니다. 예를 들어, 은행 애플리케이션에서 송금 기능은 주요 관심사입니다. 그러나 이 주요 로직 외에도 다음과 같은 기능들이 필요한데, 이것들이 바로 횡단 관심사입니다.

    1. 로깅(Logging): 애플리케이션의 상태나 에러를 기록하여 디버깅 및 모니터링할 수 있게 합니다. 예를 들어, 모든 주요 메서드가 호출될 때마다 로그를 남기는 것.
    2. 보안(Security): 사용자 권한을 검사하여 적절한 권한을 가진 사용자만 특정 기능을 사용할 수 있게 합니다.
    3. 트랜잭션 관리(Transaction Management): 데이터 일관성을 위해 트랜잭션을 관리하여, 특정 작업이 성공적으로 완료되지 않으면 롤백하도록 합니다.
    4. 캐싱(Caching): 자주 요청되는 데이터를 캐시에 저장하여 성능을 높입니다.
    5. 예외 처리(Exception Handling): 모든 메서드에서 발생할 수 있는 예외를 일관된 방식으로 처리하여 에러 페이지로 전환하거나, 로그에 기록합니다.

    이러한 기능들은 특정 비즈니스 로직에 종속되지 않고, 여러 모듈에서 공통적으로 필요로 합니다. 이러한 기능들이 여러 곳에서 필요할 경우 코드를 중복해서 작성하게 되는데, 이렇게 되면 코드가 복잡해지고 유지보수가 어려워집니다.

    Cross-Cutting Concern의 문제점

    횡단 관심사를 각 모듈에서 직접 구현할 경우 다음과 같은 문제가 발생합니다.

    • 코드 중복: 여러 모듈에 같은 로직이 반복적으로 작성되면서 코드 중복이 발생합니다.
    • 결합도 증가: 비즈니스 로직과 부가적인 기능들이 밀접하게 결합되어 코드가 복잡해지고, 수정하기 어렵습니다.
    • 유지보수 어려움: 여러 곳에 중복된 코드가 있을 경우, 변경사항이 생기면 모든 모듈을 수정해야 하므로 유지보수가 어려워집니다.

    AOP를 사용한 Cross-Cutting Concern 해결

    AOP는 이러한 횡단 관심사를 중앙에서 모듈화하여 관리할 수 있는 기법을 제공합니다. 즉, 핵심 로직(주요 관심사)과 횡단 관심사(부가 기능)를 분리하여, 횡단 관심사를 독립된 모듈(애스펙트)로 관리합니다.

    예를 들어, AOP를 사용하면 트랜잭션 관리, 로깅, 보안 같은 기능을 별도의 애스펙트로 정의하고, 이 애스펙트를 비즈니스 로직과 분리하여 메서드 호출 전후 또는 특정 시점에 자동으로 적용할 수 있습니다. 이를 통해 코드 중복과 결합도를 줄이고 유지보수성을 크게 향상시킬 수 있습니다.

     

    횡단 관심사의 핵심 의미

    • 비즈니스 로직과는 독립적: 특정 비즈니스 로직을 수행하는 데 필요한 핵심 기능에 종속되지 않습니다. 예를 들어, 보안 검사나 로깅은 실제로 비즈니스 로직을 수행하는 데 필수적인 내용은 아닙니다.
    • 여러 모듈 또는 레이어에서 공통적으로 필요: 횡단 관심사는 애플리케이션의 특정 모듈이나 계층에만 한정되지 않고, 여러 계층에서 공통적으로 필요합니다. 예를 들어, 로깅 기능은 데이터 처리 모듈, 서비스 모듈, 컨트롤러 등 다양한 계층에서 필요할 수 있습니다.

     

    1. 트랜잭션 관리

    • 설명: 트랜잭션은 데이터베이스에서 데이터의 일관성을 유지하기 위해 사용됩니다. 예를 들어, 여러 데이터 변경 작업이 하나의 작업 단위로 처리되어야 할 때 사용됩니다.
    • 스프링에서의 사용: @Transactional 어노테이션을 사용하여 특정 메서드 또는 클래스에 트랜잭션 처리를 적용할 수 있습니다. 스프링은 AOP 프록시를 생성하여 메서드가 호출될 때 트랜잭션을 시작하고, 메서드가 성공적으로 완료되면 커밋하며, 예외가 발생하면 롤백하는 방식으로 트랜잭션을 관리합니다.

    2. 로깅 및 모니터링

    • 설명: 애플리케이션의 특정 메서드가 호출될 때마다 로그를 남기거나, 메서드 실행 시간을 측정하는 등의 모니터링 작업을 수행할 때 AOP가 유용합니다.
    • 스프링에서의 사용: 스프링 AOP를 사용하여 로깅이나 성능 모니터링을 구현할 수 있습니다. 예를 들어, 메서드 실행 전후에 로그를 기록하거나, 메서드의 실행 시간을 측정하여 성능 병목을 파악할 수 있습니다. 이 경우 @Around 또는 @Before, @After 어노테이션을 사용하여 로깅 기능을 추가할 수 있습니다.

    3. 보안 검사

    • 설명: 사용자가 특정 메서드를 호출할 때 권한을 검사하여, 접근이 허용되지 않은 경우 차단할 수 있습니다.
    • 스프링에서의 사용: 스프링 시큐리티(Spring Security)는 AOP를 사용하여 메서드 호출 전에 권한 검사를 수행합니다. @PreAuthorize와 @Secured 어노테이션을 사용하여 특정 권한을 가진 사용자만 접근할 수 있도록 설정할 수 있습니다. 스프링 시큐리티의 권한 관리는 AOP를 통해 구현됩니다.

    4. 캐싱

    • 설명: 특정 메서드의 결과를 캐시에 저장하여, 동일한 요청에 대해 캐시된 데이터를 반환함으로써 성능을 향상시킬 수 있습니다.
    • 스프링에서의 사용: @Cacheable, @CachePut, @CacheEvict 등의 어노테이션을 통해 메서드 결과를 캐시에 저장하거나 캐시에서 제거할 수 있습니다. AOP를 사용하여 메서드 호출 전후에 캐시를 확인하거나 갱신하는 작업이 수행됩니다.

    5. 예외 처리

    • 설명: 특정 메서드에서 발생하는 예외를 공통으로 처리하거나, 예외 발생 시 특정 로직을 실행하는 경우에 AOP를 사용할 수 있습니다.
    • 스프링에서의 사용: AOP를 사용하여 메서드 실행 중 발생하는 예외를 포착하고 처리하는 로직을 추가할 수 있습니다. @AfterThrowing 어노테이션을 사용하여 특정 메서드에서 예외가 발생할 경우, 이를 로그로 기록하거나 별도의 예외 처리 로직을 적용할 수 있습니다.

    6. 데이터 검증

    • 설명: 메서드 실행 전후에 데이터를 검증하는 작업이 필요한 경우, 공통 검증 로직을 AOP로 적용할 수 있습니다.
    • 스프링에서의 사용: AOP를 사용하여 메서드 호출 전에 인자의 유효성을 검사하거나, 반환값을 검증하는 작업을 할 수 있습니다. @Before와 @AfterReturning을 사용하여 입력값과 반환값을 검증하고, 유효하지 않은 경우 예외를 던지거나 알림을 줄 수 있습니다.

    7. 리소스 관리

    • 설명: 파일이나 네트워크 리소스를 열고 닫는 작업과 같이 리소스를 관리하는 공통된 로직을 AOP를 통해 구현할 수 있습니다.
    • 스프링에서의 사용: 특정 메서드 호출 전후에 리소스를 열고 닫는 로직을 추가하여 리소스를 안전하게 관리할 수 있습니다. 예를 들어, 메서드 실행 후 파일이나 네트워크 리소스를 자동으로 닫아주는 로직을 구현할 수 있습니다.
    728x90
    반응형
Designed by Tistory.