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 |
댓글