본문 바로가기
  • _^**_
무근본 IT 지식 공유/무근본 스프링(Spring Framework)

[무근본 스프링(Spring Framework) 공부] AOP가 대체 뭔데?? 예시 코드로 알려드릴게요

by 크리드로얄워터 2023. 3. 26.
반응형

 

Spring AOP (Aspect-Oriented Programming)은 객체 지향 프로그래밍 패러다임에서 공통적으로 발생하는 기능(로깅, 예외 처리 등)을 분리해서 관리하는 프로그래밍 기법입니다.

 

이를 통해 코드의 재사용성을 높이고, 유지보수성을 개선할 수 있습니다. Spring AOP는 프록시 기반의 AOP를 지원합니다.

핵심 비즈니스 로직을 실행하는 객체를 대신해서 공통 기능을 수행하는 프록시 객체를 생성하고,

이를 통해 핵심 비즈니스 로직에 삽입됩니다.

예를 들어, 아래와 같은 간단한 클래스가 있다고 가정해봅시다.
public class UserService {
    public void saveUser(User user) {
        System.out.println("User " + user.getName() + " saved.");
    }

    public void deleteUser(User user) {
        System.out.println("User " + user.getName() + " deleted.");
    }
}

 

 

이 클래스는 간단한 유저 관리 기능을 수행합니다. 이제 이 클래스에 로깅 기능을 추가하려면, 로깅 코드를 매번 수작업으로 추가해야 합니다.

 

하지만 Spring AOP를 이용하면, 공통 기능을 따로 분리해서 코드의 중복을 피할 수 있습니다.

 

@Aspect
@Component
public class LoggingAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class);

    @Before("execution(* com.example.UserService.*(..))")
    public void logMethodCall(JoinPoint joinPoint) {
        LOGGER.info("Method called: " + joinPoint.getSignature().getName());
    }
}

 

 

위 코드에서 @Aspect는 해당 클래스가 Aspect임을 나타내는 어노테이션입니다.

 

@Before 어노테이션은 해당 메서드가 대상 메서드 실행 전에 실행됨을 나타내며,

 

execution(* com.example.UserService.*(..))는 UserService 클래스의 모든 메서드가 대상임을 나타냅니다.

 

이제 이 로깅 기능이 UserService 클래스의 모든 메서드에서 적용됩니다.

 

이를 확인하기 위해, 아래와 같이 테스트 코드를 작성해봅시다.

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {UserService.class, LoggingAspect.class})
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testSaveUser() {
        User user = new User("Alice");
        userService.saveUser(user);
    }

    @Test
    public void testDeleteUser() {
        User user = new User("Bob");
        userService.deleteUser(user);
    }
}

 

 

 

위 코드에서 @ContextConfiguration 어노테이션은 Spring 애플리케이션 컨텍스트가 필요한 클래스를 지정해주며,

 

@Autowired 어노테이션은 UserService 객체를 자동으로 주입받습니다.

 

이제 테스트 코드를 실행하면, UserService 클래스의 메서드가 실행될 때마다 LoggingAspect 클래스의 logMethodCall 메서드가 실행되며, 로그가 출력됩니다.

 

Spring AOP는 위와 같이 메서드 실행 전/후, 예외 발생 시 등 다양한 시점에서 공통 기능을 삽입할 수 있습니다.

 

또한, 어드바이스(Advice)를 여러 개 사용하여 다양한 공통 기능을 적용할 수도 있습니다.

 

Spring AOP는 XML 설정 파일을 이용해 AOP 설정을 관리할 수도 있지만, J

 

ava 어노테이션을 이용한 설정이 더 간결하고 유지보수하기 쉬우므로, 보통은 Java 어노테이션을 사용합니다.

반응형

댓글