티스토리 뷰
IoC (Inversion of Control) 와 DI(Dependency Injection)
- "제어의 역전" 즉 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다 라는 뜻이다.
- 컨테이너 역할을 해주는 프레임워크에게 제어하는 권한을 넘겨서 개발자의 코드가 신경 써야 할것을 줄이는 전략이다.
- IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
- POJO의 생성, 초기화 서비스, 소멸에 대한 권한을 가진다.
- 개발자가들이 직접 POJO를 생성 할 수 있지만 컨테이너에게 맡긴다.
DL (Dependency Lookup) : 의존성 검색
- 저장소에저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는 것
DI (Dependency Injection) : 의존성 주입
- 각 클래스간의 의존관계를 빈 설정정보르 바탕으로 컨테이너가 자동으로 연결 해주는 것]
DL사용시 컨테이너에 종속성이 증가하여 주로 DI를 사용한다.
DI의 유형
1) Setter Injection : Setter 메서드를 이용한 의존성 삽입
- 의존성을 입력 받는 setter 메서드를 마들고 이를 통해 의존성을 주입한다.
2) Constructor Injection
- 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
3) Method Injection
- 의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입한다.
다형성 Polymorphism = Poly(다양한) + Morphism(변형, 변신)
객체를생성할때 다형성에 의거해서 아래와 같이 생성을 하면
Printer p1 = new StringPrinter();
Printer p2 = new ConsolePrinter();
부모클래스타입 변수 = new 자식 클래스의타입();
위와 같은 형식으로 으로 코드를 작성하면 아래와 같은 뜻을 내포한다.
-> StringPrinter 클래스는 Printer 타입이다.
-> ConsolePrinter 클래스는 Printer 타입이다.
- 이게 바로 java에서 말하는 다형성이다.
- 타입은 Printer 타입이지만 다양한 StringPrinter, ConsolePrinter 변형이 가능하다.
- 구현체는 언제든지 바뀔수 있기 때문에 인터페이스만 바라보게끔 하는 방식
Setter Injection의 <property> tag
- Setter method를 통해 의존관계가 있는 Bean을 주입하려면 <property> tag의 ref 속성을 사용 할 수있다.
- Setter method를 통해 Bean의 레퍼런스가 아니라 단순 값을 주입하려고 할 때는 <property>tag의 value 속성을 사용한다.
ref -> Bean id를 이용하여 주입할 Bean을 찾는다.
value -> 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용한다.
public class Hello { String name; Printer printer; public Hello() {}; public void setName(String name) { this.name = name; } public void setPrinter(Printer printer) { this.printer = printer; } }
위의 소스를 xml로 빈설정을 해주면 아래와 같다.
<bean id="Hello" class="source.Hello">
<property name="name" values="Spring" /> // setName Method
<property name="printer" ref="printer" /> // setPrinter Method
</bean>
<bean id="printer" class="source.StringPrinter" />
보기 쉽게 각각의 키워드가 의미하는 바를 소스와 xml에서 찾을 수 있도록 하이라이팅해봤다.
Constructor Injection의 <constructor-arg> tag
- Constructor를 통해 의존관계가 있는 Bean을 주입하려면 <constructor-arg> tag를 사용할 수 있다.
- Constructor 주입방식은 생성장의 파라미터를 이요하기 때문에 한번에 여러개의 객체를 주입할 수 있다.
public class Hello { String name; Printer printer; public Hello() {}; public Hello(String name, Printer printer) { this.name = name; this.printer = printer; } }
1) Constructor-arg index지정하여 파라메터를 넘겨주는 경우
<bean id="hello" class="source.Hello">
<constructor-arg index="0" value="Spring"/>
<constructor-arg index="1" ref="printer" />
</bean>
2) Constructor-arg Paramater name 지정하여 넘겨주는 경우
<bean id="hello" class="source.Hello">
<constructor-arg name="name" value="Spring"/>
<constructor-arg name="printer" ref="printer" />
</bean>
Collection Type의 값 Injection
- Spring은 List, Set, Map, Properties와 같은 Collection Framework 타입을 XML로 작성해서 프로퍼티에 주입하는 방법을 제공한다.
1) 프로퍼티가 Set과 List일 경우
<bean id="hello" class="source.Hello">
<property name="names">
<list>
<values>Spring</values>
<values>IoC</values>
<values>DI</values>
</list>
</property>
</bean>
- Set으로 설정할경우 list를 set으로 설정하면 된다.
2) Map 타입 : <map>과 <entry> tag를 사용
<bean id="hello" class="source.Hello">
<property name="names">
<list>
<entry key="Kim" values="30"/>
<entry key="Lee" values="35"/>
<entry key="Ahn" values="40"/>
</list>
</property>
</bean>
Spring DI Container의 개념
- Spring DI Container가 관리한는 객체를 빈(Bean)이라고 하고, 이 빈(Bean)들을 관리한다는 의미로 컨테이너를 빈 팩토리라고 부른다.
- 객체를 생성과 객체 사이의 런타임(run-time) 관계를 DI 관점에서 볼 때는 컨테이너를 BeanFactory라고 한다.
- Bean Factory에서 여러 가지 컨테이너 기능을 추가하여 애플리케이션 컨텍스트라고 부른다.
* POJO(Plain Old Java Object)
-> JVM으로만 동작하는 객체를 POJO라한다. 일반 Java Class 객체를 뜻한다.
* Bean
-> 스프링이 IoC방식으로 관리ㄷ는 객체라는 뜻, 스프링이 직접생성과 제어를 담당하는 객체를 Bean이라고 부른다.
* Bean Factory
-> 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
-> Bean을 등록 생성 조회 반환하는 기능을 담당함
-> 보통 BeanFacotry를 바로 사용하지 않고 ApplicationContext를 주로 이용한다.
* ApplicationContext
-> BeanFactory를 확장한 IoC 컨테이너이다.
-> Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다.
-> Spring에서는 ApplicationContext를 BeanFactory보다 더 많이 사용된다.
-> Spring의 각종 부가 서비스를 추가로 제공한다.
-> Spring이 제공하는 ApplicationContext 구현 클래스가 여러가지 종류가 제공된다.
* Configuration Metadata
-> ApplicationContext 또는 BeanFactory가 IoC를 적용하기위해 사용하는 메타정보를 말한다.
-> 설정 메타정보는 IoC컨테이너에 의해 관리되는 Bean 객체를 생성하고 구성할 때 상용된다.
-> xml로 작성한 bean정보가 metadata에 해당된다.
'JAVA > SPRING FRAMEWORK' 카테고리의 다른 글
[Spring Boot] Tomcat에 war 배포시 404 Error (SpringBootServletInitializer) (4) | 2019.06.07 |
---|---|
[Spring Boot] 스프링 부트에서 CORS 전역 설정하기 (0) | 2019.04.21 |
[Spring] JUnit의 어노테이션과 메소드 (0) | 2018.09.10 |
- Total
- Today
- Yesterday
- 데스큐어
- JNI
- 구글 클라우드 플랫폼
- 대항해시대 런처
- vite.js
- 위대한 쇼맨 ost
- 다클 코드
- EACCES: permission denied
- OSI 7Layer
- 위대한 쇼맨
- 폴더선택다이얼로그
- 대항해시대
- JNI SIGNITURE
- 정보처리기사 2018 2회
- 대항해시대 다클
- HTTPie
- 위대한 쇼맨 후기
- 대항해시대 넷마블 런처
- Linux
- lxd
- 빈파일
- JNI INVOKE
- 대항해시대 로그인
- 정보처리기사 실기 후기
- React.js
- 정처기 실기
- 다클 빈
- 대항해시대 다음 런처
- 합격 후기
- JNI 시그니처
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |