본문 바로가기

Spring Framwork

비트캠프 - 2020.03.16 Spring Framework (5) - DI(의존성 주입)

# 의존관계 자동 설정

: 의존하는 빈 객체의 타입이나 이름을 이용하여 의존객체를 자동으로 설정할 수 잇는 기능으로 4가지 방식을 제공한다.

: autowire 속성을 이용한다.

 

 

- byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정한다.

- byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정한다.

- constructor : 생성자 파라미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달한다.

- autodetect : Constructor 방식을 먼저 적용하고, 적용할 수 없을 경우 byType방식을 적용하여 빈객체를 설정한다.

 

 

# 빈 객체 범위 (scope)

: 기본적으로 컨테이너에 한 개의 빈 객체를 생성한다.

: 빈의 범위를 설정할 수 있는 방법을 제공한다.

: scope 속성을 이용한다.

 

- singleton : 컨테이너에 한 개의 빈 객체만 생성한다.(default)

- prototype : 빈을 요청할 때마다 빈 객체를 생성한다.

- request : HTTP 요청마다 빈 객체를 생성한다.(WebApplicationContext에서만 적용)

- session : HTTP 세션마다 빈 객체를 생성한다.(WebApplicationContext에서만 적용)

- global-session : 글로벌 HTTP 세션에 대한 빈 객체를 생성한다. 포트릸을 지원하는 컨텍스트에만 적용 가능하다.

 

 

# 스프링 컨테이너(Spring Container)

- BeanFactory : 빈 객체를 관리하고 각 빈 객체 간의 의존 관계를 설정해 주는 가장 단순한 컨테이너

* 대표적인 구현 클래스 : XmlBeanFactory

- ApplicationContext : BeanFactory 인터페이스를 상속받은 하위 인터페이스

* 대표적인 구현 클래스 : ClassPathXmlApplicationContext

 

 

# 빈 라이프 사이클(Bean Life Cycle)

: 스프링 컨테이너에 저장되는 빈 객체는 최소한 생성, 초기화, 소멸의 라이프 사이클을 갖게 된다.

: 스플링은 빈 객체의 생성, 초기화, 소멸뿐만 아니라 추가적인 단계를 제공하고 있으며 이를 통해 라이프 사이클에 따른 빈 객체의 상태를 정교하게 제어할 수 있다.

 

* lazy-init="true"

: 이 속성은 빈의 scope가 singleton일 경우에 사용할 수 있다.

: 기본적으로 빈은 ApplicationContext 생성시 singleton 객체들을 로딩하게 되지만 lazy-init을 true로 바꾸면 명시적인 객체를 참조할 때 생성하게 된다.

 

1. 빈의 인스턴스화(생성자 호출)

2. 필드값 설정

3. setBeanName() 메서드 호출

- BeanNameAware 인터페이스르 구현하고 있을 경우

4. setBeanFactory() 메서드 호출

- BeanFactoryAware 인터페이스를 구현하고 있을 경우

5. BeanPostProcessor의 postProcessBeforeInitializtion() 메서드 호출

- BeanFactory에 BeanPostProcessor 클래스가 관련되어 있을 경우

6. afterPropertiesSet() 메서드 호출

- InitializationBean 인터페이스를 구현하고 있을 경우

7. Custom 초기화 메서드 호출 (init-method)

- Custom 초기화 메서드가 정의되어 있을 경우

8. BeanPostProcessor의 postProcessAfterInitialization() 메서드 호출

- BeanFactory에 BeanPostProcessor 클래스가 관련되어 있을 경우

9. 빈 사용

 

//// 컨테이너가 종료할 때에는 다음 순서로 메서드가 호출된다.

1. destroy() 메서드 호출

- DisposableBean 인터페이스를 구현하고 있을 경우

2. Custom Destroy 메서드 호출 (destroy-method)

 

 


# Annotation(어노테이션)

 

@Required

- 속성 또는 setter메서드에 사용가능 (멤버 변수, setXxx())

- 필수 속성이 되게 함

 

@Autowired

- 속성, 생성자, setter메서드에 사용가능 (멤버 변수, setXxx(), ConstructMethod)

- 타입에 의존하는 객체를 삽입해 준다. (ByName, ByType, constructor, autodetect)

 

@Qualifier

- @Autowired와 같이 사용

- 같은 타입의 빈 객체들이 있을 경우 특정 빈을 사용하도록 함

 

@Resource

- 필요한 자원을 자동으로 연결시켜줌

- 빈 객체의 타입이나 이름을 이용하여 의존객체를 자동으로 설정할 수 잇는 기능으로 4가지 방식을 제공한다.

: autowire 속성을 이용한다.

 

 

- byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정한다.

- byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정한다.

- constructor : 생성자 파라미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달한다.

- autodetect : Constructor 방식을 먼저 적용하고, 적용할 수 없을 경우 byType방식을 적용하여 빈객체를 설정한다.

 

 

 

# 빈 객체 범위 (scope)

: 기본적으로 컨테이너에 한 개의 빈 객체를 생성한다.

: 빈의 범위를 설정할 수 있는 방법을 제공한다.

: scope 속성을 이용한다.

 

- singleton : 컨테이너에 한 개의 빈 객체만 생성한다.(default)

- prototype : 빈을 요청할 때마다 빈 객체를 생성한다.

- request : HTTP 요청마다 빈 객체를 생성한다.(WebApplicationContext에서만 적용)

- session : HTTP 세션마다 빈 객체를 생성한다.(WebApplicationContext에서만 적용)

- global-session : 글로벌 HTTP 세션에 대한 빈 객체를 생성한다. 포트릸을 지원하는 컨텍스트에만 적용 가능하다.

 

 

 

# 스프링 컨테이너(Spring Container)

 

- BeanFactory : 빈 객체를 관리하고 각 빈 객체 간의 의존 관계를 설정해 주는 가장 단순한 컨테이너

* 대표적인 구현 클래스 : XmlBeanFactory

 

- ApplicationContext : BeanFactory 인터페이스를 상속받은 하위 인터페이스

* 대표적인 구현 클래스 : ClassPathXmlApplicationContext

 

 

# 빈 라이프 사이클(Bean Life Cycle)

: 스프링 컨테이너에 저장되는 빈 객체는 최소한 생성, 초기화, 소멸의 라이프 사이클을 갖게 된다.

: 스플링은 빈 객체의 생성, 초기화, 소멸뿐만 아니라 추가적인 단계를 제공하고 있으며 이를 통해 라이프 사이클에 따른 빈 객체의 상태를 정교하게 제어할 수 있다.

 

 

* lazy-init="true"

: 이 속성은 빈의 scope가 singleton일 경우에 사용할 수 있다.

: 기본적으로 빈은 ApplicationContext 생성시 singleton 객체들을 로딩하게 되지만 lazy-init을 true로 바꾸면 명시적인 객체를 참조할 때 생성하게 된다.

 

 

1. 빈의 인스턴스화(생성자 호출)

2. 필드값 설정

3. setBeanName() 메서드 호출

- BeanNameAware 인터페이스르 구현하고 있을 경우

4. setBeanFactory() 메서드 호출

- BeanFactoryAware 인터페이스를 구현하고 있을 경우

5. BeanPostProcessor의 postProcessBeforeInitializtion() 메서드 호출

- BeanFactory에 BeanPostProcessor 클래스가 관련되어 있을 경우

6. afterPropertiesSet() 메서드 호출

- InitializationBean 인터페이스를 구현하고 있을 경우

7. Custom 초기화 메서드 호출 (init-method)

- Custom 초기화 메서드가 정의되어 있을 경우

8. BeanPostProcessor의 postProcessAfterInitialization() 메서드 호출

- BeanFactory에 BeanPostProcessor 클래스가 관련되어 있을 경우

9. 빈 사용

 

 

//// 컨테이너가 종료할 때에는 다음 순서로 메서드가 호출된다.

1. destroy() 메서드 호출

- DisposableBean 인터페이스를 구현하고 있을 경우

2. Custom Destroy 메서드 호출 (destroy-method)

 

 

 

 

# Annotation(어노테이션)

 

@Required

- 속성 또는 setter메서드에 사용가능 (멤버 변수, setXxx())

- 필수 속성이 되게 함

 

@Autowired

- 속성, 생성자, setter메서드에 사용가능 (멤버 변수, setXxx(), ConstructMethod)

- 타입에 의존하는 객체를 삽입해 준다. (ByName, BㅇyType, constructor, autodetect)

 

@Qualifier

- @Autowired와 같이 사용

- 같은 타입의 빈 객체들이 있을 경우 특정 빈을 사용하도록 함

 

@Resource

- 필요한 자원을 자동으로 연결시켜줌

- name 속성이 없으면 타입으로 연결해준다.

 

@PostConstruct

- InitializationBean 인터페이스의 afterPropertiesSet() 메서드

- custom의 init-method

 

@PreDestroy

- DisposableBean 인터페이스의 destroy() 메서드

- custom의 destroy-method

 

@Component

- 자동으로 빈으로 등록되게 함

- 빈의 이름은 첫 문자만 소문자이고 나머지느 클래스 이름과 동일

- 빈의 이름을 지정해 주려면 @Component("myFoo");

- @Scope("prototype")으로 빈의 범위를 지정할 수 있음

- @Service

- @Controller

 

@Configuration

- 클래스에 선언

 

@ImportResource

- 클래스에 선언

- xml 설정 정보를 사용할 때

- @ImportResource("classpath:/article-repository.xml");

 

@Import

- 클래스에 선언

- @Configuration 클래스에서 다수의 @Configuration 클래스를 묶을 수 있음

- @import({ArticleServiceConfig.class, ArticleRepositoryConfig.class})

 

@Bean

- 새로운 빈 객체를 제공할 때 사용

- 메서드 리턴 유형의 빈이 자동으로 만들어짐

- 적용된 메서드의 이름을 빈의 식별 값으로 사용

- name 속성으로 빈의 이름을 수정할 수 있음

- autowire 속성을 사용해 자동 연관 처리가 가능

- initMethod 속성으로 라이프사이클 처리 가능

- @Bean 아래 @Scope(value="prototype") 으로 빈의 범위 지정 가능