Java Spring - 개념 공부 2

김재현·2022년 7월 20일
0

Programmers

목록 보기
3/28
post-custom-banner

Component Scan

  • 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능.
    직접 구성파일에 @Bean을 붙여 빈을 만들어 사용했지만, 관리할 빈이 많아지면 번거로워진다.
    @Component Scan을 이용하면 설정 클래스에 빈으로 직접 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있다.

  • 스프링은 자동으로 등록된 빈을 어떻게 찾을까?
    -> Stereotype 어노테이션을 이용해 스캔대상을 지정할 수 있음.

  • Stereotype?
    스테레오타입을 번역하면 고정관념인데, 사실 이 용어는 UML에서 온 것으로 볼 수 있음.
    UML 다이어그램을 확장시켜주는 도구로서 특정 요소를 상황이나 도메인에 맞게 분류해주는 것.
    컴포넌트 스캔 참조

Component Scan

  • basePackage : 문자열로 여러 개의 패키지를 넣어서, 그 문자열에 해당하는 패키지를 기준으로 탐색.
  • basePackageClasses : 클래스가 속한 패키지를 기준으로 탐색.
  • excludeFilters
    특정 패키지를 제외.
    ".Filter() 형식으로 사용.
  • includeFilters
    특정 패키지를 포함.
    다양한 필터들

Autowired

  • 생성자를 통해 주입하지 않고 자동으로 의존관계 형성.
  • 필드에 줄 수 있고, 세터에 주는 것도 가능.
  • 생성자가 두 개 이상일 경우 스프링은 빈을 생성할 생성자를 선택하지 못한다.
    스프링에 자동으로 주입이되는 생성자 메서드에 Autowired에 달아줘야 한다.
    하나일 때는 자동으로 붙는다.
  • 자동으로 주입 가능한 동일한 빈이 두 개 있다면 오류가 남.
    @Primary붙여주면 우선으로 등록할 수 있다.
    @Qualifier을 사용해서 용도를 구분해 줄 수 있다.

필요한 이유

  • 초기화 시 필요한 모든 의존관계가 형성되기 때문에 안전하다.
    필요한 의존관계가 생성자에서 필수로 제시되어야 한다면, 객체 생성 시 필요한 모든 의존관계를 주입받았다고 확신할 수 있다. 나중에 참여하는 필드가 없어서 null point exception이 발생할 일이 없다.
    필드가 나중에 setter해야 된다면, 그래서 필드가 없다면, optional타입으로 지정하면 됨.
  • 잘못된 패턴을 찾을 수 있게 도와준다.
    수많은 의존관계를 갖고있는 생성자라면, 엄청 많은 파라미터가 있다.
    많은 파라미터를 갖는 클래스는 수많은 책임을 갖고 있기에, 관심사 분리가 필요.
  • 테스트를 쉽게 해준다.
    생성자 주입을 통해서 쉽게 객체 전달, 스프링 도움 없이 쉽게 테스트 가능하다.
    실수로 등록 안된 빈에 의해 null point exception 발생하는 불상사 제거.
  • 불변성을 확보한다.
    불변객체를 만드는 것을 도와주고, final keyword에 의해 한 번 만들어진 의존관계가 변하지 않도록 도와줌.
    상태가 변하지 않는 불변객체가 되고, 멀티 스레드 환경의 셀 세이프티 보장.
    셀 세이프티 보장이 안되면 디버그에 큰 어려움을 갖고, 잠재적 버그를 받을 수도.
    Autowired 참고

Beans Scope(빈 범위)


1. singleton

  • singleton bean은 컨테이너에서 한 번 생성됨.
    • 컨테이너가 사라질 때 bean 역시 같이 사라짐.
    • 생성된 하나의 인스턴스는 single bean cache에 저장되고, 해당 bean에 대한 요청과 참조가 있으면 캐시된 객체를 가져온다.
      하나만 생성되기 떄문에 동일한 것을 참조함.
  • 기본적으로는 singleton으로 정의됨.
  1. prototype
  • prototype bean은 모든 요청에서 새로운 객체를 형성함.
    • prototype bean은 의존성 관계의 bean에 주입될 때 새로운 객체가 생성되어 주입됨.

Beans scope 참고

Bean Lifecycle Callbacks

  • Spring Application Context는 객체 생성과 소멸, 즉 생명주기(Lifecycle) 관리.
  • 스프링 컨테이너도 라이프사이클을 가짐.
  • 생성은 new가 받음, 그렇다면 소멸은?
  • 소멸은 close()라는 메소드가 있음. 디스트로이와 비슷.
    • 컨테이너에 등록된 모든 빈 소멸. 동시에 콜백 작동.

Bean 생성 생명주기 콜백

  1. @PostConstruct 애노테이션이 적용된 메소드 호출.
  2. Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출.
  3. @Bean 애노테이션의 initMethod 에 설정한 메소드 호출.

Baen 소멸 생명주기 콜백

  1. @PreDestory 애노테이션이 적용된 메소드 호출.
  2. Bean이 DisposableBean 인터페이스 구현시 destroy 호출.
  3. @Bean 애노테이션의 destroyMethod 에 설정한 메소드 호출.
post-custom-banner

0개의 댓글