[Book Review] 스프링5 프로그래밍 입문 Ch04 ~ 06

Noah·2022년 2월 2일
0

책을 읽고 중요한 부분만 정리한 글이므로 글의 흐름이 원활하지 않습니다.

Chapter 04 의존 자동 주입

  • 의존 대상을 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체를 주입해주는 기능이다.

  • 의존을 주입할 대상에 @Autowired 애노테이션을 붙이기만 하면 된다.

  • 필드에 @Autowired 애노테이션이 붙어 있으면 스프링이 해당 타입의 빈 객체를 찾아서 필드에 할당한다.

  • @Autowired 애노테이션은 메서드에도 붙일 수 있다. 이때 메서드 파라미터 타입에 해당하는 빈 객체를 찾아 인자로 주입한다.

  • @Autowired 애노테이션을 적용한 대상에 일치하는 빈이 없는 경우 해당 빈이 존재하지 않는다는 에러가 발생한다.

  • 반대로 빈이 두 개 이상이면 두 개의 빈을 발견했다는 에러가 발생한다.

  • 자동 주입을 하려면 해당 타입을 가진 빈이 어떤 빈인지 정확하게 한정할 수 있어야 한다.

  • @Qualifier 애노테이션을 사용하면 자동 주입 대상 빈을 한정할 수 있다.

  • @Qualifier 애노테이션은 두 위치에서 사용 가능하다. 첫 번째는 빈 설정 메서드이다. 두 번째는 해당 빈 객체에서 @Autowired 애노테이션에서 자동 주입할 빈을 한정할 때 사용한다.

  • @Qualifier 애노테이션의 값으로 준 문자열이 해당 빈의 한정 값이 된다.

  • 만약 @Qualifier 애노테이션이 없으면 빈의 이름을 한정자로 지정한다.

  • @Autowired 애노테이션도 @Qualifier 애노테이션이 없으면 필드나 파라미터 이름을 한정자로 사용한다.

  • @Autowired 애노테이션은 기본적으로 @Autowired 애노테이션을 붙인 타입에 해당하는 빈이 존재하지 않으면 익셉션을 발생한다.

  • 따라서 자동 주입할 대상이 필수가 아닌 경우 @Autowired 애노테이션의 required 속성을 false로 지정하면 된다. false로 지정하면 매칭되는 빈이 없어도 익셉션이 발생하지 않으며 자동 주입을 수행하지 않는다.

  • 스프링 5 버전부터는 의존 주입 대상에 자바 8의 Optional을 사용해도 된다.

@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
	if (formatterOpt.isPresent()) {
		this.dateTimeFormatter = formatterOpt.get();
	} else {
		this.dateTimeFormatter = null;
    }
}
  • @Autowired 애노테이션을 붙인 세터 메서드에서 @Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면 자동 주입할 빈이 존재하면 해당 빈을 인자로 전달하고, 존재하지 않으면 인자로 null을 전달한다.

  • @Autowired 애노테이션의 required 속성을 false로 할 때와 차이점은 자동 주입할 빈이 존재하지 않아도 메서드가 호출된다는 점이다.


Chapter 05 컴포넌트 스캔

  • 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있으므로 컴포넌트 스캔 기능을 사용하면 설정 코드가 크게 줄어든다.

  • 스프링이 검색해서 빈으로 등록할 수 있으려면 클래스에 @Component 애노테이션을 붙여야 한다. 해당 애노테이션에 값을 주면 빈으로 등록할 때 사용할 이름이 결정된다.

  • @Component 애노테이션을 붙인 클래스를 스캔해서 스프링 빈으로 등록하려면 설정 클래스에 @ComponentScan 애노테이션을 적용해야 한다. 이때 basePackages 속성은 스캔 대상 패키지 목록을 지정한다.

  • @Component 애노테이션을 붙일 때 속성값을 주지 않으면 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용한다.

  • @ComponentScan 애노테이션에서 excludeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에서 제외할 수 있다.

  • 기본 스캔 대상은 다음과 같다. @Component, @Controller, @Service, @Repository, @Aspect, @Configuration 등이 붙은 클래스


Chapter 06 빈 라이프사이클과 범위

  • 스프링 컨테이너가 초기화될 때 빈 객체의 생성, 의존 주입, 초기화가 일어나고 컨테이너가 종료될 때 빈 객체의 소멸이 일어난다. 즉 스프링 컨테이너의 라이프 사이클에 따라 빈 객체도 자연스럽게 생성과 소멸이 일어난다.

  • 스프링 컨테이너를 초기화할 때 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존을 설정한다. 의존 자동 주입을 통한 의존 설정이 이 시점에 수행된다. 스프링 컨테이너를 종료하면 스프링 컨테이너는 빈 객체의 소멸을 처리한다.

  • 빈 객체가 InitializingBean 인터페이스를 구현하면 스프링 컨테이너는 초기화 과정에서 빈 객체의 afterPropertiesSet() 메서드를 실행한다. 또한 DisposableBean 인터페이스를 구현한 경우 소멸 과정에서 빈 객체의 destroy() 메서드를 실행한다.

  • 초기화와 소멸 과정이 필요한 예로 데이터베이스 커넥션 풀이 있다. 커넥션 풀을 위한 빈 객체는 초기화 과정에서 데이터베이스 연결을 생성한다. 또한 빈 객체를 소멸할 때 데이터베이스 연결을 끊어야 한다.

  • 외부에서 제공받은 클래스를 스프링 빈 객체로 설정하고 싶을 때도 있다. 이 경우 스프링 설정에서 직접 메서드를 지정할 수 있다. @Bean 어노테이션의 initMethod 속성과 destroyMethod 속성에 초기화와 소멸 과정에서 사용할 메서드 이름을 지정해주면 된다.

  • 특정 빈을 프로토타입 범위로 지정하려면 @Scope 애노테이션 값으로 "prototype" 지정하면 된다. 다만 프로토타입 범위를 갖는 빈은 완전한 라이프 사이클을 따르지 않는다는 점에 주의해야 한다.

profile
개발 공부는 🌳 구조다…

0개의 댓글