HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[New] 타일러팀
[New] 타일러팀
/
🎾
김수미
/SpringBoot 강의노트/
DAY3 : Autowired, 컴포넌트스캔 등

DAY3 : Autowired, 컴포넌트스캔 등

Created
Apr 7, 2022 02:28 AM
Tags
📎
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 해둘 수 있는 Annotation
    • BeanFactoryAnnotationUtils.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에 의해 단 하나의 객체만 생성될수도 있고, 여러개의 객체가 생성될수도 있다.
      • →  총 6개의 Bean Scopes
        → 총 6개의 Bean Scopes
    • 이렇게 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 해둘 수 있는 Annotation
    • BeanFactoryAnnotationUtils.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에 의해 단 하나의 객체만 생성될수도 있고, 여러개의 객체가 생성될수도 있다.
      • →  총 6개의 Bean Scopes
        → 총 6개의 Bean Scopes
    • 이렇게 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 작업 등) 호출