개발 공부
Spring - DI, IoC, AOP 개념 본문
DI(Dependency Injection)
프로그램은 객체들의 조립이다.
객체를 연결할 때는 'Composition(일체형) has a'와 'Association(조립형) has a' 방법이 있다.
Composition(일체형)의 예 -
A->B->... 의 순서로 (생성 후)연결된다.
class A{
B b;
A(){
this.b = new B();
}
}
A a = new A(); //A를 생성할 때 B가 생성된다.
Association(조립형)의 예 -
...->B->A 의 순서로 연결된다.
class A{
B b;
A(){
}
setB(B){
this.b = B;
}
}
B b = new B();
A a = new A();
a.setB(b); //B가 먼저 생성되고 그 뒤에 A에 조립(inject)된다.
DI라고 하는 것은 조립형의 방법으로 객체를 조립하는 것이다.
Spring이 지원하는 DI 기능을 통해 소스코드 외부에서 객체를 생성하고 조립할 수 있고 이는 객체 간의 결합도를 낮출 수 있다. 결합도가 낮아지면 프로그램 수정이 용이하고 구성이 깔끔해지고 확장성도 높아진다.
IoC(Inversion of Control) Container
IoC는 DI에서 일어나는 조립의 방향이 기존의 A->B->... 순이 아닌 ...->B->A 순으로 역전된 것을 의미한다. Spring에서는 이렇게 조립된 객체들을 IoC 컨테이너에 넣어놓고 관리한다.
IoC 컨테이너에 준비된 객체들을 소스코드에서 사용할 때는 Application Context 를 사용한다. 객체를 찾아오는 방법, 경로에 따라 다른 모듈을 이용한다.
Application Context :
-ClassPathXmlApplicationContext
-FileSystemXmlApplicationContext
-XmlWebApplicationContext
-AnnotationConfigApplicationContext
AOP(Aspect Oriented Programming)
기존 OOP는 사용자의 요구와 업무 관점(Core Concern)에서 개발이 진행되어 왔다.
AOP는 사용자의 요구에서 개발자, 관리자의 업무 처리(Cross-cutting Concern)로 관점을 틀어 개발하는 방법론이다.
Core Concern -> Cross-cutting Concern
여기서 Cross-cutting Concern은 원래의 개발이
주업무A -> 주업무B -> 주업무C
순으로 이루어 졌다면 이와 수직으로 각각의 주업무를 둘러싸는 개발자, 관리자가 부수적으로 필요한 보조 업무에 관점을 두는데서 유례됐다.
[보조업무X]주업무A[보조업무X] -> [보조업무X]주업무B[보조업무X] -> [보조업무X]주업무C[보조업무X]
이러한 개발자, 관리자의 업무에는 아래와 같은 것들이 있다.
- 로그처리
- 보안처리
- 트랜잭션 처리
Spring은 AOP를 위해 Proxy를 이용한다.
Proxy는 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장하여 클라이언트의 요청을 받고 대리하여 업무를 처리하는 대리자 역할을 한다. 함수호출자는 주요업무가 아닌 보조업무를 Proxy에게 맡기고, Proxy는 내부적으로 보조업무를 처리한다. 이렇게 함으로써, 주 업무코드는 필요에 따라 보조업무를 처리하는 해당 Proxy만 추가/제거하면 된다.
Spring AOP에서는 Advice를 통해 보조업무가 실행될 위치를 지정할 수 있다.
Advice의 위치:
- Before
- After returning
- After throwing
- Around
주업무에 보조업무가 결합되는 것을 Weaving(뜨게질하다)라고 하는데 이때 주업무와 보조업무가 맞닿는 점을 Join Point라고 한다.
Join Point를 잘라서 특정 부분의 업무에만 Weaving하게 할 수 있는데 이것을 Point Cut이라고 한다.
Spring AOP에서는 이 Advice와 Point Cut을 좀 더 간략하게 설정할 수 있는 Advisor를 제공한다.
https://www.youtube.com/watch?v=XtXHIDnzS9c&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T
'웹개발 (자바, 스프링, React) > 자바 개념' 카테고리의 다른 글
자바EE, Spring (0) | 2020.06.18 |
---|---|
애플릿, NPAPI (플러그인, 넷스케이프, 모질라) (0) | 2020.06.18 |
java servlet filter (0) | 2018.09.12 |
자바 기본 reachable and unreachable object (0) | 2018.06.21 |
자바 연습문제 1번. JVM - Heap Memory (0) | 2018.06.21 |