[ STUDY ]/Spring Boot

IOC / DI / AOP

김강니 2024. 11. 19. 21:46

 IOC(Inversion of Control)

"제어의 역전" 즉, 객체나 메소드의 생명주기를 개발자가 관리하는 것이 아닌 외부(프레임워크)에서 결정하는 것이다.

 

개발자는 객체를 직접 생성하지 않고 필요한 객체를 프레임 워크에 요청하면 프레임워크가 알아서 생성하고 메모리에 올려서 관리한다.

 

//IOC 없음
public class OrderService {
    private PaymentService paymentService = new PaymentService(); // 직접 생성
}

//IOC 사용
public class OrderService {
    @Autowired
    private PaymentService paymentService; // 스프링이 주입
}

 

 

 DI(Dependency Injection)

DI는 객체가 의존하고 있는 다른 객체를 직접 생성하지 않고, 외부에서 주입받는 방식이다.

 

DI는 IOC를 구현하는 방법 중 하나로, 객체 간의 의존성을 프레임워크(스프링)가 주입해준다.

즉, 스프링이 만들어서 메모리에 올려놓은 객체를 다른 클래스에서 사용하는 것이다.

  • 의존성을 주입받기 때문에 유연성과 재사용성이 증가한다.
  • 객체 간의 결합도가 낮아져 유지보수가 쉬워진다.
  • 주입 방식에는 생성자 주입, Setter주입, 필드 주입이 있다
//생성자 주입
//객체를 생성할 때 의존성을 생성자 파라미터로 전달한다.
public class OrderService {
    private PaymentService paymentService;

    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

//Setter 주입
//객체를 생성 후 Setter메서드를 통해 의존성을 주입한다.
public class OrderService {
    private PaymentService paymentService;

    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

//필드 주입
//@Autowired어노테이션을 사용해 필드에 직접 주입힌다.
public class OrderService {
    @Autowired
    private PaymentService paymentService;
}

 

비교 및 정리

 

 

 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)

AOP는 프로그램의 핵심 로직과 별개로 반복적으로 사용하는 부가적인 기능(로깅, 보안, 트랜잭션 등)을 분리해서 관리하는 방식이다.

이 기능들을 Aspect라는 모듈로 만들어서 핵심 로직에 영향을 주지 않으면서도 쉽게 적용할 수 있도록 한다.

 

💡 AOP에서 사용하는 주요 용어

  1. Aspect
    - 부가 기능을 모듈화한 것 (예: 로깅, 트랜잭션 관리).
  2. Join Point
    -
    부가 기능을 적용할 수 있는 지점 (메서드 실행, 객체 생성 등).
  3. Advice
    - Aspect에서 실제 실행되는 코드. 부가 기능의 구체적인 동작.
    - Before Advice: 핵심 로직 실행 전에 실행.
    - After Advice: 핵심 로직 실행 후 실행.
    - Around Advice: 핵심 로직 실행 전후에 실행.
  4. Pointcut
    Advice를 적용할 구체적인 위치 (예: 특정 클래스의 특정 메서드).