Circular Dependency (순환의존관계)
A → B
참조,B → A
참조와 같은 상황이 발생하는 경우 순환 의존관계가 형성되면서BeanCurrentlyInCreationException
예외가 발생할 수 있다.
- 예외가 발생하면 ApplicaitonContext가 실행되지 않는다.
Component Scan
- 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능.
- Configuration 클래스에서 직접 객체를 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있다.
- 스프링은 자동으로 등록해야 할 Bean을 어떻게 찾을까? : Stereotype 애노테이션을 이용하면 스캔대상을 지정할 수 있다
- Stereotype : UML 다이어그램에서 온 개념. 모든 Bean을 동일시 하지 않고 용도에 맞게 분류한 것.
@Component
,@Controller
,@Service
,@Configuration
,@Repository
등이 있다.- Spring 2.0 에서
@Repository
이 처음 등장했고, Spring 2.5 부터 범용적으로 사용되기 시작 - 즉
@Component
로 컴포넌트를 지정해줄 수 있지만, 더 sepecific한 annotation을 통해 지정해줄 수도 있는 것이다.
- 직접 코드 작성을 통해 Component Scan 기능을 사용해보자 (실습)
Autowired
- Spring에서는 Autowired를 이용해 의존관계를 자동적으로 주입시킬 수 있다.
- 자동으로 의존관계를 형성해주는 기능을 자동주입 또는 Autowiring 이라고 한다.
- 생성자 기반 의존관계 주입 / 필터 기반의 Autowired / Setter 기반의 Autowired 중 무엇을 사용해야 할까?
- Spring 공식 문서에서는 생성자 기반 의존관계 주입을 권장한다.
- 초기화시에 필요한 모든 의존관계가 형성되기 때문에 안전(NullPointerException 걱정 X)
- 잘못된 패턴(하나의 생성자가 지나치게 많은 객체를 혼자서 모두 생성하고 있는 등)을 찾을 수 있게 해줌
- 테스트를 쉽게 해준다 : 생성자를 통해 mock 객체를 쉽게 전달할 수 있다.
- 불변성을 확보해준다 : 생성자에 의해 객체를 생성하면 final keyword를 사용할 수 있기 때문에
@Primary
: 동일한 Class의 Bean 사이에서 가장 높은 우선순위를 가질 수 있게 해주는 Annotation
@Qualifier
: Bean의 용도를 직접 naming 해둘 수 있는 AnnotationBeanFactoryAnnotationUtils.qualifiedBeanOfType()
을 이용해 특정 name의 Bean을 호출할 수 있다. / But 이렇게 직접 찾아가야 하는 상황을 만들지 않는 것이 가장 좋다.- 보통 동일한 클래스에서 파생된 Bean 간에 충돌이 나는 경우 이런 것들을 사용해야 한다.
- 다양한 Bean들을 특정 용도에 따라 그룹지어 그룹별 definition을 configuration 파일에 작성해야 하는 경우가 있다.
- Configuration 패키지를 만들고 그 안에서 Configurations 들을 잔뜩 생성한 다음, Root Configuration 파일에서 basePackages method 를 이용해 작성해 둔 Configurations 들을 불러오면 된다.
- 사실
@SpringBootApplication
Annotation 안에 Component Scanner가 모두 구현되어 있기 때문에, 요즘은 Configuration 파일을 일일이 작성해주는 대신 Annotation 하나만 달아주곤 한다.
Beans Scope
- Bean Scope란, Bean이 어떤 범위로 만들어지는지에 대한 개념이다.
- 지금까지 Bean Definition은 XML 파일로 작성할수도 있었고, Java 코드에서
@Bean
Annotation을 이용해 작성할수도 있었다. - 스프링에게 어떻게 객체를 만들어야하는지를 알려주는것이 바로 Bean Definition 이었다.
- 하나의 Bean Definition에 의해 단 하나의 객체만 생성될수도 있고, 여러개의 객체가 생성될수도 있다.
- 이렇게 Bean에 의해서 생성될 수 있는 객체의 규모, 범위 등을 Bean Scope 라고 한다.
- 기본적으로는 싱글톤 Scope을 가진다.
- 하나의 객체를 계속 쓰는게 아니라, 매번 새로운 객체를 생성하서 사용하고 싶은 경우
- Prototype Scope으로 변경해주면 된다.
- 그러나 이렇게 사용하면 비효율적이고, 동일한 Repository를 사용할수도 없으므로 웬만하면 Singleton으로 작성해주는 것이 좋다.

- Singletom 및 Prototype Bean Scope의 사용을 직접 코드로 살펴보자. (실습)
Java 코드에서 계속 등장하는
MassageFormat.format
은 무엇인가? 어떤 용도로 사용하나?Bean LifeCycle Callbacks
- Spring Application Context는 객체의 생성과 소멸, 즉 객체의 생명주기(LifeCycle)를 관리한다.
- Spring 컨테이너 조차도 LifeCycle을 가진다. (생성이 되었으면 소멸도 됨)
- 객체는 (생성자 주입시기에)new로 생성되었는데, 그럼 소멸은 어떻게 해줘야 하는가?
applicationContext.close()
를 이용하면 applicationContext가 소멸된다.- 이 때 컨테이너에 등록되었던 모든 Bean이 소멸된다.
- 그리고 이 때 소멸에 대한 CallBack들이 동작한다.
Bean 생성 생명주기 콜백 순서
@PostConstruct
Annotation이 적용된 메소드 호출
- Bean이 InitializingBean 인터페이스 구현시
afterPropertiesSet
호출
@Bean
Annotation의 initMethod에 설정한 메소드 호출
Bean 소멸 생명주기 콜백 순서
@PreDestory
Annotation이 적용된 메소드 호출
- Bean이 DisposableBean 인터페이스 구현시 destroy 호출
@Bean
Annotation의 destroyMethod에 설정한 메소드(cleanup 또는 close 작업 등) 호출
Circular Dependency (순환의존관계)
A → B
참조,B → A
참조와 같은 상황이 발생하는 경우 순환 의존관계가 형성되면서BeanCurrentlyInCreationException
예외가 발생할 수 있다.
- 예외가 발생하면 ApplicaitonContext가 실행되지 않는다.
Component Scan
- 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능.
- Configuration 클래스에서 직접 객체를 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있다.
- 스프링은 자동으로 등록해야 할 Bean을 어떻게 찾을까? : Stereotype 애노테이션을 이용하면 스캔대상을 지정할 수 있다
- Stereotype : UML 다이어그램에서 온 개념. 모든 Bean을 동일시 하지 않고 용도에 맞게 분류한 것.
@Component
,@Controller
,@Service
,@Configuration
,@Repository
등이 있다.- Spring 2.0 에서
@Repository
이 처음 등장했고, Spring 2.5 부터 범용적으로 사용되기 시작 - 즉
@Component
로 컴포넌트를 지정해줄 수 있지만, 더 sepecific한 annotation을 통해 지정해줄 수도 있는 것이다.
- 직접 코드 작성을 통해 Component Scan 기능을 사용해보자 (실습)
Autowired
- Spring에서는 Autowired를 이용해 의존관계를 자동적으로 주입시킬 수 있다.
- 자동으로 의존관계를 형성해주는 기능을 자동주입 또는 Autowiring 이라고 한다.
- 생성자 기반 의존관계 주입 / 필터 기반의 Autowired / Setter 기반의 Autowired 중 무엇을 사용해야 할까?
- Spring 공식 문서에서는 생성자 기반 의존관계 주입을 권장한다.
- 초기화시에 필요한 모든 의존관계가 형성되기 때문에 안전(NullPointerException 걱정 X)
- 잘못된 패턴(하나의 생성자가 지나치게 많은 객체를 혼자서 모두 생성하고 있는 등)을 찾을 수 있게 해줌
- 테스트를 쉽게 해준다 : 생성자를 통해 mock 객체를 쉽게 전달할 수 있다.
- 불변성을 확보해준다 : 생성자에 의해 객체를 생성하면 final keyword를 사용할 수 있기 때문에
@Primary
: 동일한 Class의 Bean 사이에서 가장 높은 우선순위를 가질 수 있게 해주는 Annotation
@Qualifier
: Bean의 용도를 직접 naming 해둘 수 있는 AnnotationBeanFactoryAnnotationUtils.qualifiedBeanOfType()
을 이용해 특정 name의 Bean을 호출할 수 있다. / But 이렇게 직접 찾아가야 하는 상황을 만들지 않는 것이 가장 좋다.- 보통 동일한 클래스에서 파생된 Bean 간에 충돌이 나는 경우 이런 것들을 사용해야 한다.
- 다양한 Bean들을 특정 용도에 따라 그룹지어 그룹별 definition을 configuration 파일에 작성해야 하는 경우가 있다.
- Configuration 패키지를 만들고 그 안에서 Configurations 들을 잔뜩 생성한 다음, Root Configuration 파일에서 basePackages method 를 이용해 작성해 둔 Configurations 들을 불러오면 된다.
- 사실
@SpringBootApplication
Annotation 안에 Component Scanner가 모두 구현되어 있기 때문에, 요즘은 Configuration 파일을 일일이 작성해주는 대신 Annotation 하나만 달아주곤 한다.
Beans Scope
- Bean Scope란, Bean이 어떤 범위로 만들어지는지에 대한 개념이다.
- 지금까지 Bean Definition은 XML 파일로 작성할수도 있었고, Java 코드에서
@Bean
Annotation을 이용해 작성할수도 있었다. - 스프링에게 어떻게 객체를 만들어야하는지를 알려주는것이 바로 Bean Definition 이었다.
- 하나의 Bean Definition에 의해 단 하나의 객체만 생성될수도 있고, 여러개의 객체가 생성될수도 있다.
- 이렇게 Bean에 의해서 생성될 수 있는 객체의 규모, 범위 등을 Bean Scope 라고 한다.
- 기본적으로는 싱글톤 Scope을 가진다.
- 하나의 객체를 계속 쓰는게 아니라, 매번 새로운 객체를 생성하서 사용하고 싶은 경우
- Prototype Scope으로 변경해주면 된다.
- 그러나 이렇게 사용하면 비효율적이고, 동일한 Repository를 사용할수도 없으므로 웬만하면 Singleton으로 작성해주는 것이 좋다.

- Singletom 및 Prototype Bean Scope의 사용을 직접 코드로 살펴보자. (실습)
Java 코드에서 계속 등장하는
MassageFormat.format
은 무엇인가? 어떤 용도로 사용하나?Bean LifeCycle Callbacks
- Spring Application Context는 객체의 생성과 소멸, 즉 객체의 생명주기(LifeCycle)를 관리한다.
- Spring 컨테이너 조차도 LifeCycle을 가진다. (생성이 되었으면 소멸도 됨)
- 객체는 (생성자 주입시기에)new로 생성되었는데, 그럼 소멸은 어떻게 해줘야 하는가?
applicationContext.close()
를 이용하면 applicationContext가 소멸된다.- 이 때 컨테이너에 등록되었던 모든 Bean이 소멸된다.
- 그리고 이 때 소멸에 대한 CallBack들이 동작한다.
Bean 생성 생명주기 콜백 순서
@PostConstruct
Annotation이 적용된 메소드 호출
- Bean이 InitializingBean 인터페이스 구현시
afterPropertiesSet
호출
@Bean
Annotation의 initMethod에 설정한 메소드 호출
Bean 소멸 생명주기 콜백 순서
@PreDestory
Annotation이 적용된 메소드 호출
- Bean이 DisposableBean 인터페이스 구현시 destroy 호출
@Bean
Annotation의 destroyMethod에 설정한 메소드(cleanup 또는 close 작업 등) 호출