본문 바로가기
야미스터디/Spring

[Spring] IoC, DI, AOP 📌 - 작성중

by 의정부핵꿀밤 2022. 11. 29.
728x90

IoC (Inversion of Control / 제어의 역전)

  • 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었음을 의미한다
  • 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는 것이 아닌, 주입 받아서 사용하는 방법을 말한다
  • Spring Framework가 IoC 컨테이너 기능을 제공한다
    • IoC 컨테이너 : 객체의 생성을 책임지고 의존성을 관리한다
    • *POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 갖는다
    • 인스턴스의 생명 주기를 개발자가 아닌 컨테이너가 대신 관리해주기 때문에 개발자는 로직에만 집중이 가능하다

 

💡 POJO(Plain Of Java Project) : 객체지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용할 수 있는 방식으로 설계된 오브젝트

 

 

 


 

DI (Dependency Injection / 의존성 주입)

  • 개발자가 의존관계를 설정해놓으면 컨테이너가 자동으로 주입해준다
  • 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하면 된다
  • 객체 레퍼런스를 컨테이너로부터 주입받아서 실행 시에 동적으로 의존관계가 생성된다
  • 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해주는 것이다

 

DI의 장점

  • 코드가 단순해진다
  • 컴포넌트 간의 결합도가 제거된다

 

DI의 유형

  • Setter Injection : 의존성을 입력받는 Setter 메서드를 만들고 이를 통해 의존성을 주입한다
  • Constructor Injection : 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다
  • Method Injection : 의존성을 입력받는 일반 메서드를 만들고 이를 통해 의존성을 주입한다

 

Spring DI 컨테이너

  • Spring DI 컨테이너가 관리하는 객체 -> 빈(Bean)
  • 위의 Bean 들을 관리한다는 의미로 컨테이너를 빈 팩토리(Bean Factory)라 부른다
  • Bean Factory에 여러 가지 컨테이너 기능을 추가하여 Application Context라고 부른다

 

 

 


 

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

  • 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다!
  • 교차 관심사의 분리를 허용하여 모듈성을 높이는 것을 목표로 하는 프로그래밍 패러다임
  • 기존 코드 자체를 수정하지 않고 기존 코드에 추가 동작을 추가하여 부가기능을 수행한다
  • AOP는 OOP로 독립적으로 분리하기 어려운 애플리케이션의 관심사의 분리(기능의 분리), 즉 핵심적인 기능에서 부가적인 기능을 분리한다
  • 분리한 부가 기능을 Aspect라는 독특한 모듈 형태로 만들어서 설계하고 개발하는 방법이다
  • AOP는 부가 기능을 Aspect로 정의하여 핵심 기능에서 부가 기능을 분리하여 핵심 기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 개념이다 -> OOP 보완
    • 핵심 기능 : 업무 로직을 포함하는 기능
    • 부가 기능 : 핵심 기능을 도와주는 부가적인 기능 (ex. 로깅, 보안, DB 연결, 파일 입출력 등..)
  •  

 

 

AOP 주요 개념

  • Aspect
    • Advice + PointCut = Aspect
    • 흩어진 관심사를 모듈화 한 것으로, 주로 부가 기능을 모듈화한다
    • 부가 기능을 정의한 코드 사이에 침투된 부가기능을 독립적인 Aspect로 구분할 수 있다
    • 구분된 부가기능 Aspect를 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있다
  • Target
    • Aspect를 적용하는 곳 (Class, Method 등..)
  • Advice
    • 실질적으로 어떤 일을 해야할 지에 대한 것
    • 실질적인 부가 기능을 담은 구현체
  • JoinPoint
    • Advice가 적용될 위치 또는 끼어들 수 있는 지점
    • 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용이 가능하다
  • PointCut
    • JoinPoint의 상세한 스펙을 정의한 것
    • 'A란 메서드의 진입 시점에 호출할 것' 과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있다
  • Proxy
    • 클라이언트와 타겟 사이에 투명하게 존재하며 부가 기능을 제공하는 오브젝트
    • DI를 통해 타겟 대신 클라이언트에게 주입되며 클라이언트의 메소드 호출을 대신 받아서 타겟에 위임하며 이 과정에서 부가 기능을 부여한다

 

 

 

AOP 적용 방법

  • 컴파일 타임에 적용
    • 컴파일 시점(.java 파일을 .class 파일로 만들 때)에 바이트 코드를 조작하여 조작된(AOP가 적용된) 바이트 코드를 생성한다
  • 로드 타임에 적용
    • 순수하게 컴파일한 뒤, 클래스를 로딩하는 시점에 클래스 정보를 변경(Load Time Weaving)
  • 런타임에 적용
    • 스프링 AOP가 주로 사용하는 방법
    • A클래스 타입의 Bean을 만들 때 A타입의 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작

 

 

Spring AOP의 특징

  • 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가 기능을 추가하기 위해서이다
  • Spring AOP는 Spring Bean에만 적용할 수 있다
  • 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제 (중복 코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 등..) 에 대한 해결책을 지원하는 것이 목적이다
  • Spring AOP는 순수 자바로 구현되었기 때문에 특별한 컴파일 과정이 필요하지 않다

 

 

Spring AOP 구현

1) 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-aop'

 

2) 스프링 Bean으로 등록하기

  • 스프링 AOP는 Bean에서만 동작하기 때문에 @Component 어노테이션 등을 통해 스프링 Bean으로 등록해준 뒤 사용해야 한다
  • @Aspect 어노테이션을 붙이면 해당 클래스 Aspect라는 것을 명시해준다

  • 위의 사진은 메서드의 성능을 측정하기 위해 만든 AOP 커스텀 어노테이션 코드 중 일부이다
  • @Component를 통해 Spring Bean으로 등록해준다
  • @Aspect를 통해 해당 클래스가 Aspect라는 것을 명시해준다
  • @Around를 통해서 Advice를 적용할 범위를 지정해주는데, 위에서는 @LogExecutionTime 어노테이션을 붙인 메서드에 적용하도록 범위를 지정하였다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


참고)

https://engkimbs.tistory.com/746

 

[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP

| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로

engkimbs.tistory.com

https://code-lab1.tistory.com/193

 

[Spring] AOP(Aspect Oriented Programming)란? 스프링 AOP란?

AOP (Aspect Oriented Programming)란? AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그

code-lab1.tistory.com

 

728x90

'야미스터디 > Spring' 카테고리의 다른 글

나는야 다국어 전문가(호소인)! - feat. Locale  (3) 2024.10.28
[💚] Spring Cloud ☁️  (3) 2024.09.06
[Spring] Swagger 📌  (0) 2022.10.06
[Spring] Dispatcher Servlet 📌  (0) 2022.09.20
[Spring] Spring vs EJB 📌  (1) 2022.09.20

댓글