< 스프링의 IoC >
빈 : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
스프링 빈 : 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트
빈 팩토리 : 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
애플리케이션 컨텍스트
- IoC 방식을 따라 만들어진 일종의 빈 팩토리
- 빈 팩토리보다 좀 더 확장한 것
빈 팩토리와 애플리케이션 컨텍스트는 동일하다고 생각하면 된다.
- 빈 팩토리는 빈을 생성하고 관계를 설정하는 IoC의기본 기능에 초점을 맞춘것
- 애플리케이션 컨텍스트는 애플리케이션 전반에 걸쳐
모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미가 좀 더 부각된 것
@Configuration
- 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식시키는 어노테이션
- 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
@Bean
- 오브젝트를 생성하고 초기화해서 돌려주는 어노테이션
- 오브젝트 생성을 담당하는 IoC용 메서드라는 표시
IoC 컨테이너 = 애플리케이션 컨텍스트 = 스프링 컨테이너 = 빈 팩토리
< 스프링 IoC의 용어정리 >
빈 (Bean)
- 스프링이 IoC 방식으로 관리하는 오브젝트
- 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만 빈이라 부름
빈 팩토리 (Bean factory)
- 스프링의 IoC를 담당하는 핵심 컨테이너
- 빈을 등록,생성,조회하고 돌려주고, 그외에 부가적인 빈을 관리하는 기능 담당
- 보통 빈 팩토리를 바로 사용하지 않고, 이를 확장한 애플리케이션 컨텍스트를 이용
애플리케이션 컨텍스트 (application context)
- 빈 팩토리를 확장한 IoC 컨테이너
- 빈 팩토리는 빈의 생성과 제어의 관점
- 애플리케이션 컨텍스트는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기 하는 것
설정정보/ 설정 메타정보 (configuration metadata)
- 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보
컨테이너 또는 Ioc 컨테이너
- IoC방식으로 빈을 관리한다는 의미에서
애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC컨테이너 라고 한다.
< 싱글톤 레지스트리와 오브젝트 스코프 >
- 스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.
싱글톤 패턴
- 어떤 클래스를 애플리케이션 내에서 제한된 인스턴스 개수, 이름처럼 주로 하나만 존재하도록 강제하는 패턴
- 단일 오브젝트만 존재해야 하고, 이를 애플리케이션의 여러 곳에서 공유하는 경우에 사용
단점
- private 생성자를 갖고 있어서 상속불가
- 테스트가 힘들다
- 서버환경에 따라 싱글톤이 하나만 만들어 지는것을 보장하지 못한다.
- static 메서드를 이용하기 때문에 전역상태로 사용될수 있다.
아무 객체나 쉽게 접근하고 수정할 수있기에 객체지향프로그램에서는 권장되지 않는 모델
싱글톤 레지스트리
- 싱글톤 패턴의 단점 때문에 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공
- static 메서드와 private 생성자를 사용하는 비정상적인 클래스가 아니라
평범한 자바 클래스를 싱글톤으로 활용하게 해줌
- public 생성자를 가질수 있어서 테스트환경에서도 자유롭게 오브젝트를 생성해서 사용할 수 있다.
- 싱글톤 패턴과 달리 스프링이 지지하는
객체지향적인 설계 방식과 원칙, 디자인패턴(싱글톤패턴제외)등을 적용하는 데 아무런 제약이 없다.
< 의존관계 주입(DI) >
DI (Dependency Infection)
- 스프링 IoC 기능의 대표적인 동작원리
- 의존관계 주입은 의존 오브젝트(실제 사용대상인 오브젝트) 와
그것을 사용할 주체, 보통 클라이언트라고 부르는 오브젝트를 런타임 시에 연결한 작업을 말한다.
정리하면 의존관계 주입이란 세가지 조건을 충족하는 작업을 말한다.
1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다.
그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
3. 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.
DataSource 인터페이스
자바에서 DB커넥션을 가져오는 오브젝트의기능을 추상화해서
비슷한 용도로 사용할 수 있게 만들어진 인터페이스
< 정리 >
관심사의 분리, 리펙토링
- 책임이 다른 코드를 분리해서 두개의 클래스로 만듬
전략패턴
- 바뀔수 있는 클래스는 인터페이스로 구현하고, 다른 클래스는 인터페이스를 통해서만 접근하도록 함
개방 폐쇄 원칙
- 자신의 책임자체가 변경되는 경우 외에는 불필요한 변화가 발생하지 않도록 막고,
자신이 사용하는 외부 오브젝트의 기능은 자유롭게 확장,변경 할 수 있도록 만듬
낮은 결합도, 높은 응집도
- 한쪽의 기능 변화가 다른쪽의 변경을 요구하지 않아도 되고(낮은 결합도)
- 자신의 책임과 관심사에만 순수하게 집중(높은 응집도)
제어의 역전/IoC
- 오브젝트가 생성되고, 다른 오브젝트와 관계를 맺는 작업의 제어권을 별도의 오브젝트 팩토리를 만들어 넘김
- 오브젝트 팩토리의 기능을 일반화한 IoC 컨테이너로 넘겨서
오브젝트가 자신이 사용할 대상의 생성이나 선택에 관한 책임으로부터 자유롭게 함
싱글톤 레지스트리
- 싱글톤 패턴의 단점을 극복할 수 있도록 설계된 컨테이너를 활용
DI
- 클래스와 인터페이스 사이의 느슨관 의존관계만 만들어놓고,
런타임시에 실제 사용할 구체적인 의존 오브젝트를 제3자의 도움으로 주입
'책 > 토비 스프링 2020' 카테고리의 다른 글
(토비의 스프링) 3. 템플릿 (0) | 2019.12.19 |
---|---|
(토비의 스프링) 2. 테스트 (JUnit) (0) | 2019.12.19 |
(토비의 스프링) 1. 오브젝트와 의존관계 (DAO의 분리와 확장) (0) | 2019.12.18 |
[2017] 7. 스프링 핵심 기술의 응용 (0) | 2018.01.12 |
[2017] 6. AOP (0) | 2018.01.04 |