WIL

#3

evagrim 2022. 10. 9. 13:23

 

 

DI와 IoC 그리고 Bean

 

 

DI (dependency injection)

 

 

인터페이스가 요구하는 명세를 구현한 클레스라면 어떤 클레스가 와도 결합이 가능한 점을 이용해

코드 작성부의 객체 간의 생성과 결합을 모두 외부 또는 수정이 용이한 곳으로 집중해 변경시마다 일일히

코드를 수정해야 하는 수고로움과 낭비를 줄이고 손쉽게 모듈(클레스)간의 변경,해제,결합,생성이 가능하게 한다

annotation의 경우 MVC Model2을 참조해 내부적으로 계층이 나뉘어져 있으며 멤버객체의 선언부, 생성자, setter 메소드 등에 annotation을 붙일 수 있다. component annotation을 지정해주면 해당 인터페이스가 Scan 범위로 정의하는 Path의 하위 annotation 들은 자동으로 scan 범위에 포함되기 때문에 annotation만으로 설정 파일이 없이도 DI를 할 수 있다

 

(최근에는 Spring Boot에서 @SpringBootApplication으로 해당 어노테이션이 main부에 통합되어 사용된다)

 

 

 

 

AOP (Aspect Oriented Programming)



로그출력, 쓰레드 처리 속도나 예외처리 확인 같은 사용자가 아닌 개발자나 운영자가 필요로 하는 메인 서비스 외적인 측면의 코드들을 외부로 나누는 개념이다

기존에는 클래스 내부의 서비스 메소드 안에서 실행되야할 메인 기능의 위 아래에, 개발자나 운영자가 확인하고 싶은 내용을 구현하는 코드를 작성해, 확인하고 싶을 때는 주석을 해제하고 사용한 뒤, 사용이 끝난 뒤에는 다시 주석을 해두는 방법을 사용했다고 한다

기존 Java에서 AOP를 구현하려면 Proxy 객체를 이용해 구현하려는 방식에 따라 인터페이스의 하위 객체들을 가져다 쓰면 된다

Spring에서도 AOP 구현을 도와주는 라이브러리들이 있는데, AOP를 위한 Cross-cutting 클레스 몇개를 한번만 작성(로그확인, 소요시간확인 코드 등)해두면 DI와 맞물려 원본 클레스의 소스를 하나도 건드리지 않고 AOP 구현을 원하는 객체에 모듈처럼 삽입하고 빼는 형식으로 쉽게 사용할 수 있게된다

 

 

 

 

Bean

 

 

IoC 컨테이너에 등록되는 자바 객체를 이르는 말로 인스턴스화 되는 참조변수의 constructor에서 포인터가 생성된 하나의 메모리 주소만을 참조하는 싱글톤 패턴을 따른다

(쓸모없는 객체화를 방지하고 메모리가 낭비되는 것을 막을 수 있다)

 

 

 

 

부연 설명 (Legacy)

 

 

<Spring framework 사용의 핵심 >

Dependency Injection 기능과 Transaction Management 기능

jdbc의 기능만으로는 서비스 메소드로 나누어 놓은 connection을 공용으로 관리할 수가 없다
(기업형 application에서는 사용자가 많아질수록 필연적으로 서비스 함수 요청이 많아지고 그때마다 호출된 jdbc의 connection이 많아지면 transaction의 관리가 불가능하기 때문에 spring의 transaction management 기능을 사용한다)


<Spring의 기본 덕목>


MVC model 처리할 때는 DI(dependency injection)
Transaction 처리할 때는 AOP
인증과 권한 처리할 때는 Servlet Filter


<느슨한 결합력과 인터페이스 그리고 DI>

java 객체지향에서 배우는 내용
인터페이스로 실제 필요에 의해 생성되는 서비스 객체의 이름을 감추고, 외부설정 파일(XML, Annotation) 등을 사용해 사용되는 서비스 객체를 모듈화 시킨다. 그렇게 오버라이드로 인한 소스 수정을 억제하면서 객체간의 결합력을 낮춰 모듈간의 재사용성(컴파일이 완료된 bin(.jar)파일로의 전환)을 용이하게 한다. 

ex)
인터페이스 참조변수 = new (implement 인터페이스 된 서비스객체(feat. 외부설정에 따라 달라지는))
- 외부설정만 수정하면 소스 수정 없이 상속 받아 오버라이드하여 사용할 수 있게된다

Spring의 DI(의존성주입=부품조립)은 이 "느슨한 결합력과 인터페이스"를 위한 작업을 도와준다
-인터페이스 결합시 필요한 설정 파일을 제공해주고, 객체를 결합시켜주는 역할을 한다(객체 생성 & 조립)


<DI>

결합력을 낮춰야 하기 때문에 객체 간에는 composition has a(생성자에서 다른 객체를 생성)하는 방식 보다 setter를 사용하는 association has a 방식을 사용하며 이 클래스 내부의 부품 클래스를 DI에서는 dependency라고 한다)

injection 종류

setter를 이용한 setter injection
B b = new B();
A a = new A();
a.setB(b)
ex. 조립컴

construction을 이용한 construction injection
B b = new B();
A a = new A(b);
ex. 브랜드컴

위의 과정을 Spring의 DI가 대신해준다
DI = 종속성(의존성)주입 = 부품을 조립해준다


<IoC 컨테이너>

위의 부품(dependency)을 저장하고 조립해주는데 필요한 컨테이너다

XML, Annotation 등으로 필요한 목록을 작성해서 지시서를 만들면 주문받은 부품을 담을 그릇이 필요한데

그 부품들을 저장해서 담는 그릇이며 조립까지 해주는데, 기존의 import(큰 객체를 생성하면 필요한 작은 객체들까지 생성자에 의해 알아서 생성되는 방식)가 아닌 Inversion of Control(제어의역전)으로 조각 부품부터 만들어 큰 부품으로 조립해준다고 해서 IoC 컨테이너라 한다