본문 바로가기
SPRING/개념

[ 개념 ] 스프링 AOP 프록시(proxy)란? 예제 장점 단점

by hak0205 2023. 3. 1.
반응형

AOP 프록시(proxy)란

Spring AOP에서 프록시(proxy)는 메소드 호출을 객체로 가로 채고 어드바이스로 알려진 추가 동작을 해당 호출에 적용하는 중개자입니다. 프록시는 런타임에 Spring 프레임워크에 의해 생성되며 응용 프로그램 코드의 실제 개체 대신 사용됩니다.  프록시는 메서드가 aspect에 정의된 pointcut 식과 일치하는지 확인하여 메소드 호출을 가로챕니다. 메소드가 일치하면 프록시는 실제 메소드 호출 전후에 정의된 어드바이스를 적용합니다.

 

어드바이스란 무엇이고 종류를 알고 싶다면 클릭해 주세요 :) 


프록시는 프록시 대상 개체의 유형에 따라 JDK 동적 프록시 또는 CGLIB 프록시를 사용하여 생성할 수 있습니다. JDK 동적 프록시는 대상 개체가 하나 이상의 인터페이스를 구현할 때 사용되는 반면 CGLIB 프록시는 대상 개체가 인터페이스를 구현하지 않을 때 사용됩니다.

 

장점

Spring AOP에서 프록시 사용하면 장점은 무엇일까요?

 

첫째, 원래 객체나 이를 사용하는 코드를 수정하지 않고 객체에 어드바이스를 적용할 수 있기 때문에 응용 프로그램 코드가 느슨하게 결합된 상태를 유지할 수 있습니다. 이렇게 하면 응용 프로그램 코드를 수정하지 않고도 개체에 적용된 어드바이스를 쉽게 변경할 수 있습니다.

 

둘째, 개발자들은 각각의 개별 객체에서 코드를 반복할 필요 없이 응용 프로그램의 여러 객체에 적용할 수 있는 재사용 가능한 코드를 작성할 수 있습니다. 이렇게 하면 코드 중복을 줄이고 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.

예제

예제를 통해 AOP 프록시(proxy) 좀 더 쉽게 이해해 보세요!

public interface UserService {
    void save(User user);
}

@Service
public class UserServiceImpl implements UserService {
    public void save(User user) {
        System.out.println("Saving user: " + user.getName());
    }
}

@Aspect
@Component
public class UserServiceLoggingAspect {
    @Before("execution(* com.example.myapp.UserService.save(..)) && args(user)")
    public void logUserSave(User user) {
        System.out.println("Saving user: " + user.getName());
    }
}

// Usage in application code
@Autowired
private UserService userService;

User user = new User("John");
userService.save(user);

 

이 예에서는 인터페이스 UserService 및 구현 UserServiceImp를 정의했습니다. 또한 UserService.save() 메서드 호출을 UserService.save() 메서드에 기록하는 UserServiceLoggingAspect를 정의했습니다.

 

응용 프로그램 코드가 userService.save(user)를 호출하면 Spring AOP는 UserServiceImppl에 대한 프록시를 생성하고 메서드 호출을 가로채게 됩니다. 그런 다음 프록시는 UserServiceLoggingAspect에 정의된 어드바이스를 적용하고 대상 개체에서 save() 메서드를 실제로 호출하기 전에 메서드 호출을 기록합니다.

 

이렇게 프록시를 사용함으로써 스프링 AOP는 원래 대상 객체나 그것을 사용하는 응용 프로그램 코드를 수정하지 않고 메서드 호출에 어드바이스를 적용할 수 있습니다.

 

즉, 프록시를 통해서 응용 프로그램이 느슨하게 결합된 상태를 유지할 수 있으며 응용 프로그램 코드를 수정하지 않고도 대상 개체에 적용된 어드바이스를 쉽게 변경할 수 있습니다.

 

감사합니다.

 
반응형

댓글