여러개의 컴포넌트를 통합할때 의존관계를 주입시켜서 디자인패턴을 효과적으로 사용
오브젝트 간의 의존 관계를 만들어서 객체간의 결합도를 낮춘다.
역전 제어를 뜻하는데 , DI를 사용하면 의존관계를 주입하기때문에, 컴포넌트를 구성하는 인스턴스를 개발자의 소스코드가 아닌, DI container가 처리하기때문이다
IoC: Inversion of Control,
제어의 역전, 소스코드가 아닌 컨테이너가 관리하기때문에 제어 역전
IoC/DI Container: 제일 핵심이 되는 Spring bean을 관리해준다 의존관계 처리,인스턴스 라이프사이클 관리, 객체 생성및 관리
DI를 사용안할때
Class MemberService {
MemberDAO memberDaO = new MemberDAO();
}
new 연산자를 사용해서 객체를 생성, Main이 Service를 생성하고, Service가 DAO를 생성하여 인스턴스 이용
DI를 사용할때 new
해당 클래스에서 이용되는 인스턴스들은 DI 컨테이너에서 의존성을 주입시킴, 생성해준다.
인터페이스 기반의 컴포넌트화
스프링 빈: 스프링 컨테이너가 관리하는 객체
IOC 컨테이너: 스프링빈의 생성, 관계, 조립, 생명주기를 관리한다.
빈의 생성, 빈의 의존 관계 관리등의 DI의 기본 기능을 제공
빈이 많지 않고 경량 컨테이너로 작업할때 활용
일반적인 스프링 컨테이너
Bean Factory 에서 상속 받은 하위 인터페이스 확장된 기능 제공 ex.) AOP
웹 애플리케이션을 위한 context 파일
-2 가지 종류의 WAC.
주입 방식
XML : Xml 파일을 사용해서 Bean 요소 정의
Annotation: @Component 에너테이션이 부여된 클래스를 DI 컨테이너가 Bean으로 자동 등록
Java : @Configuration 애너테이션을 클래스에 , @Bean 을 매서드에 사용해서 Bean등록
constritor-arg 태그 사용해서, ref 속성 이용
property 요소에 name 속성과 ref 속성 이용
------- 생성자 시반 (Constructor) -----------
<bean id="memberService" class="org.tukorea.di.service.MemberServiceImpl"> <constructor-arg ref="memberDAO"/>
</bean>
--------- 설정자 기반( Setter)--------------------
<bean id="memberService" class="org.tukorea.di.service.MemberServiceImpl">
<property name= "memberDAO" ref="memberDAO"/>
</bean>
id : 오브젝트를 유일화 하는 ID
name : 오브젝트 이름
class : 패키지명 과 클래스명
scope : 오브젝트의 스코프 지정
parent : 설정을 물려받을 오브젝트 명
abstract :
XML에서의 Bean 들을 정의 하고 사용하는것이 아닌 소스코드에서 ' @ ' 형테로 표현.
애플리케이션이 클수록 XML 설정이 복잡해진다.
컨테이너가 빈과 다른 빈과의 의존성을 자동으로 연결해준다
@Autowired 설정을 위해 context:annotation-config 설정이 필요하다, componentscan 쓰면 생략가능하다.
컨테이너가 인젝션을 위한 인스턴스를 설정하는 수단
context:component-scan base-package="패키지 이름"
주요 스키마 : ApplicationContext.xml
bean : 빈 설정
context : 빈 검색 어노테이션 설정
util : 프로퍼티 파일 유틸리티 기능
jee : lookup 설정
lang : 스크립트 언어 설정
aop : AOP 설정
tx : 트랜잭션
mvc :spring mvc 설정
XML 파일에 이미 등록된 빈들의 애노테이션 기능을 적용
두 태그로 생략가능
mvc: annotation-driven
context:component-scan
특정 패키지 안에 클래스를 검색해서 빈을 자동으로 찾아서 DI 컨테이너 등록
annotation-config 선언 필요없다.
@Controller : MVC 프레젠테이션 층
@Service : 비즈니스 로직 Service
@Repository : DAO 데이터 엑세스
@Configuration : Bean 정의 JavaConfig
XML 설정이 아닌, 자바 코드로 빈을 설정한다.
다른 라이브러리를 사용하여 DI할때, 소스가지고있지않기 때문에 애노테이션 이용 불가 XML 설정해야 한다.
따라서 XML + 애노테이션 or Java + Annotation
빈 설정 메타 정보를 가지고 클래스 선언
클래스 내의 매서드를 정의하여 새로운 빈객체를 정의할때 사용
------XML방식 ApplicationContext.xml -----
<bean id="DAO" class="persistence.DAOImpl"></bean>
<bean id="Service" class="service.ServiceImpl">
<property name="memberDAO" ref="DAO">
</bean>
--------Java방식 JavaConfig.java----------
@Bean
public DAO memberDao(){
return new MemberDAOImpl();
}
@Bean
pulblic MemberService memberService(){
return new MemberServiceImpl(memberDAO());
}
---------Service Bean 생성------------
memberService = (MemberService)ctx.getBean(MemberService.class);
memberService = (MemberService)ctx.getBean("service");
--------------Application Context 설정 main.java XML----------
ctx = new AnnotationConfigApplicationContext(application.xml)
ctx = new AnnotationConfigApplicationContext(JavaConfig.class)
IntializeBean , DisposableBean 을 활용하여 Interface적으로 빈을 생성과 종류시킨다.
인터페이스 매서드를 실행 시켜서.