공부/Spring

[Spring] CHAPTER 02 스프링의 DI

JangGiraffe 2016. 2. 17. 17:36

 

DI (의존관계주입, Dependency Injection)

오브젝트가 이용할 오브젝트를 이용하는 것

오브젝트 사이에 의존관계를 만드는 것. 이외에도 생애주기와 관련된 기능이 있다.

ex) main에서 service를 new 로 생성 -> service에서 Dao를 new로 생성했떤 과정을 DI컨테이너가 해주므로 new 연산자가 사라짐.

 

인터페이스와 DI 사용의 장점

클래스 기능 추가, 변경시 다른 클래스에 미치는 영향 범위를 최소화함 → 개발효율 증대와 확장 용이 (부품화의 장점)

DI컨테이너는 클래스를 단 한번 인스턴스로 만들고 필요에 따라 재사용하는 싱글톤을 구현해줌.

 부품화의 특성을 살려 Interface와 함께 구현된 애플리케이션↓

 

어노테이션을 이용한 DI

 스프링은 크게 Bean 정의 파일을 사용한 DI와 어노테이션을 사용한 DI가 있으며 각각 상황에 맞게 쓸 수 있다.

어노테이션을 이용하면 사용이 편리하지만 대규모 개발에서는 Bean 정의 파일을 사용한 DI가 주로 쓰인다. 이유는 밑에서 언급하겠음.

 

@Component와 @Autowired ?

DI컨테이너는 @Autowired가 붙은 인스턴스 변수의 형에 대입할 수 있는 클래스를 @Component가 붙은 클래스에서 찾아내 그 인스턴스를 인젝션함.

private라도 상관없으므로 getter,setter method가 필요하지 않다(어노테이션 기준)

 

@Component의 확장 어노테이션

 왜 확장 어노테이션이 존재하는것인가.....?

 @Controller

 프레젠테이션층 MVC용 어노테이션 추후 6장에서 자세히 언급한데용

 @Service

 비즈니스로직층 service용 어노테이션

 @Repository

 데이터 엑세세스층 용 DAO. 예외를 모두 DataAccessException으로 변환한다.

@Component와 함께 이용하는 @Scope

Scope 뒤에 value 속성을 지정하면 인스턴스화와 삭제를 제어할 수 있다. Scope 생략시 해당클래스는 기본값인 싱글톤이 됨.

ex)Scope value 지정  : @Scope("singleton")

 @Scope의 주요 Value 속성

Singleton 

인스턴스를 싱글톤으로 한다. 

prototype 

이용할 때 마다 인스턴스화 한다. 

request 

Servlet API의 Request 스코프인 동안만 인스턴스가 생존한다. 

session 

Servlet API의 Session 스코프인 동안만 인스턴스가 생존한다. 

 

생애주기 관리

스프링 DI 컨테이너네는 인스턴스의 생성과 삭제 시점에 호출되는 메소드를 설정하기 위한 어노테이션인 @PostConstruct@PreDestory가 있다.

PostConstruct는 DI컨테이너에 의해 인스턴스변수에 뭔가 인젝션된 다음에 초기화하기위해 호출하는데, 생성자에서 호출해주는것과 같다.

PreDestory는 종료처리를 하는 메소드.

 

 

 

Bean 정의파일로 DI

위에서 언급했던 Bean 정의파일을 쓰는 이유는 어노테이션을 이용한 DI는 매우 편리하지만 대규모 개발에서 다양한 프로그래머들이 쓴 어노테이션을 관리하기는 쉽지 않아서이다. 그래서 아키텍트팀 등이 Bean 정의파일을 이용해 DI를 관리한다.

 

BeanFatory

DI컨테이너의 핵심이다. 실행시 건네지는 Bean 정의파일을 바탕으로 인스턴스를 생성하고 인스턴스의 인젝션을 처리한다.

(DI컨테이너로부터 인스턴스를 얻는다는 말은 BeanFactory에서 얻는다는 뜻이다.)

웹 애플리케이션 개발 등에서 개발자가 BeanFactory를 직접 이용 할 일은 별로 없다.

 

Bean 정의파일

XML에 기술하는게 일반적이다. Impl클래스에 어토네이션이 사라지기 때문에 인젝션을 위한 Setter메소드가 필요해진데..

bean태그의 기본적인 사용 예

<beans>

<!-- 클래스 Y에 클래스 X를 Autowired로 인젝션한다 -->

<bean id = "X" class = "패키지.X"/>

<bean id = "Y" class = "패키지.Y" autowire = "byType" />

</beans>

 

bean태그의 속성

id : 오브젝트의 고유 값

name : 오브젝트명 복수이름 정의 가능 ex) name = "jang1,jang2"

class : id의 실체를 지정하는 속성. 패키지명.클래스명 으로 지정

autowire

(no:생략시 기본값이 됨 / byname:지정된 이름의 오브젝트가 인스턴스 변수에 설정됨 / constructor : 생성자를 이용해 인젝션한다. / bytype : 지정된 형의 오브젝트가 인스턴스 변수에 설정됨 / autodetect : bytype 혹은 constructor중 하나를 실행한다.)

 

Application Context

BeanFactory를 확장한것. Bean정의 파일의 읽기, 쓰기, 메시지소스(?) 이벤트처리(?) 등의 기능을 BeanFactory에 추가한 것.

아직이게 뭔지 잘 모르겠다.

웹 어플리케이션은 ContextLoaderListener , Context LoaderServlet 클래스 등에 의해 자동으로 Application Context가 로드됨.

(web.xml에 Bean정의파일과 ContextloaderListener 클래스를 정의한다.)

 

 

반응형