어 나 갱수.

[Spring] 아직도 스프링의 3요소 모르는 사람?(DI, IOC, AOP) 본문

Spring

[Spring] 아직도 스프링의 3요소 모르는 사람?(DI, IOC, AOP)

김경수 2023. 7. 28. 10:18
728x90

DI(Dependency Injection)

DI(Dependency Injection)이란 스프링이 다름 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로, 객체를 직접 생성하는 게 아니라 외부에서 주입해서 이미 생성한 객체를 사용하는 방식이다.

 

의존관계는 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계 둘을 분리해서 생각해야 한다.

 

DI(의존성 주입)를 통해서 모듈 간의 결함도가 낮아지고 유연성이 높아진다.

 

IoC(Inversion of Control)

Ioc(Inversion of Control)란 "제어의 역전"이라는 의미로, 말 그대로 메서드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. 객체의 의존성을 역전시켜 객체 간의 결함도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편안하게 할 수 있게 한다.

 

Ioc는 제어의 역전이라고 말하며, 간단히 말해 "제어의 흐름을 바꾼다"라고 한다.

이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라고 한다.

 

프레임워크 vs 라이브러리

  • 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크가 맞다.(JUnit)
  • 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리다.

AOP(Aspect-Oriented Programming)

Aspect-Oriented Programming(관점지향프로그래밍) 문제를 바라보는 관점에서 프로그래밍하는 기법이다.

 

애플리케이션 로직은 크게 핵심 기능부가 기능으로 나눌 수 있다.

  • 핵심 기능은 해당 객체가 제공하는 고유의 기능이다. 예를 들어 OrderService의 핵심 기능은 주문 로직이다.
  • 부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능이다. 예를 들어서 로그 추적 로직, 트랜잭션 기능이 있다. 이러한 부가 기능은 단독으로 사용되지 않고, 핵심 기능과 함께 사용된다.

AOP 용어 정리

조인 포인트(Join point)

  • 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점
  • 조인 포인트는 추장적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다.
  • 스프링 AOP는 프락시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점으로 제한된다.

포인트컷(Pointcut)

  • 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
  • 주로 AspectJ 표현식을 사용해서 지정
  • 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능

타깃(Target)

  • 어드바이스를 받는 객체, 포인트컷으로 결정

어드바이스(Advice)

  • 부가 기능
  • 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
  • Around(주변), Before(전), After(후)와 같은 다양한 종류의 어드바이스가 있음

어드바이저(Advisor)

  • 하나의 어드바이스와 하나의 포인트 컷으로 구성
  • 스프링 AOP에서만 사용되는 특별한 용어

위빙(Weavig)

  • 포인트컷으로 결정한 타깃의 조인 포인트에 어드바이스를 적용하는 것
  • AOP적용을 위해 애스펙트를 객체에 연결한 상태
    • 컴파일 타임(AspectJ compiler)
    • 로드 타임
    • 런타임, 스프링 AOP는 런타임, 프록시 방식

Reference

728x90