[스프링 프레임워크] 제어 역전(IoC), 의존성 주입(DI), 관점 지향 프로그래밍(AOP)

도경원's avatar
Aug 23, 2025
[스프링 프레임워크] 제어 역전(IoC), 의존성 주입(DI), 관점 지향 프로그래밍(AOP)

1. 제어 역전(IoC)

일반적인 자바 개발의 경우 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용한다. 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이다.
(IoC; Inversion of Control)을 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 스프링 컨테이너 또는 IoC 컨테이너에 위임한다. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 의존성 주입(DI; Dependency Injection), 관점 지향 프로그래밍(AOP; Aspect-Oriented Programming)등이 가능해진다.

일반적 자바 코드에서의 객체 사용법

@RestController public class NoDIController { private MyService service = new MyServiceImpl(); @GetMapping("/no-di/hello") public String getHello() { return service.getHello(); } }

2. 의존성 주입(DI)

제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
스프링에서 의존성을 주입받는 방법 3가지
  • 생성자를 통한 의존성 주입
  • 필드 객체 선언을 통한 의존성 주입
  • 세터(setter) 메서드를 통한 의존성 주입
스프링에서는 @Autowired 라는 애너테이션(annotation)을 통해 의존성을 주입할 수 있다.

생성자를 통한 의존성 주입

@RestController public class DIController { MyService myService; @Autowired public DIController(MyService myService) { this.myService = myService; } @GetMapping("/di/hello") public String getHello() { return myService.getHello(); } }

필드 객체 선언을 통한 의존성 주입

RestController public class FieldInjectionController { @Autowired private MyService myService; }

세터 메서드를 통한 의존성 주입

@RestController public class SetterInjectionController { MyService myService; @Autowired public void setMyService(MyService myService) { this.myService = myService; } }

3. 관점 지향 프로그래밍(AOP)

관점 지향 프로그래밍(AOP; Aspect-Oriented Programming)은 스프링의 아주 중요한 특징이다. OOP 객체지향 프로그래밍의 대체 개념이 아니다. AOP는 OOP를 더 잘 사용하도록 돕는 개념으로 보자.
AOP는 관점을 기준으로 묶어 개발하는 방식이다. 여기서 ‘관점’은 ‘핵심 기능’, ‘부가 기능’으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.

클라이언트로부터 상품 정보 등록 요청을 받아 DB에 저장하고, 그 상품 정보를 조회하는 비즈니스 로직을 구현할 때의 핵심 기능과 부가 기능

  • 핵심 기능 : 상품 정보 DB 저장, 저장된 상품 정보 데이터를 보여주는 코드
  • 부가 기능 : 핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드
notion image
notion image
이처럼 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 한다.

AOP를 구현하는 방법 3가지

  • 컴파일 과정에 삽입하는 방식
  • 바이트 코드를 메모리에 로드하는 과정에 삽입하는 방식
  • 프락시 패턴을 이용한 방식
위 3가지 방법중 스프링은 디자인 패턴 중 하나인 프록시 패턴을 통해 AOP 기능을 제공한다.
 
Share article

Gyeongwon's blog