Spring Boot 의존성 주입

남영민·2021년 4월 9일
0

SpringBoot

목록 보기
3/4

의존성 주입을 위한 어노테이션들을 정리해보겠습니다.

빈(Bean)

Spring IoC 컨테이너가 관리하는 자바 객체

빈 등록 방법

  1. @ComponentScan과 @Component 사용

    @ComponentScan

    • @Component어노테이션 및 이를 상속하는 @Service, @Repository, @Controller 어노테이션이 붙은 Class들을 자동으로 Scan하여 Bean으로 등록해주는 역할

    @Component

    • 실제로 찾아서 빈으로 등록할 클래스
    • @Compenent("hello")와 같은 방식으로 이름 붙여주기 가능
  2. 빈 설정 파일에 직접 빈을 등록

    • 클래스에 @Configuration 어노테이션을 붙임
    • 그 안에 @Bean 어노테이션을 사용하여 직접 빈을 정의
@Configuration
# 빈으로 등록하고자 하는 객체를 반환하는 Method를 만들고, @Bean 어노테이션을 붙여 줌
# 아래와 같이 이름을 지정해줄 수도 있고, 지정하지 않으면 메소드 명을 CamelCase로 변경한 것이 이름이 됨
public class SampleConfig {
	@Bean(name="testarray")
    public ArrayList<String> array() {
    	return new ArrayList<String>();
    	}
}

@Autowired로 빈 사용

각 상황의 타입에 맞도록 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입해 주며
생성자 주입, 필드 주입, 수정자 주입의 3가지 방법이 있습니다.
순환참조 방지, 오류 방지 등의 이유로 생성자 주입이 가장 권장되는 방식입니다.

  • @Autowired(required=false) 설정으로 의존성 주입 필수 여부 선택 가능
  • 생성자에서 의존성을 주입받는 경우 @Autowired 어노테이션 생략 가능(생성자가 2개 이상인 경우는 붙여줘야 함)
  • 대상이 되는 객체가 여러개 일 경우 @Primary나 @Qualifier를 활용하여 선택적으로 의존성 주입 가능
  1. 생성자 주입 방식
@Component
public class Encoder {
	
    // final로 선언이 가능하며 불변성을 보장해줍니다.
    private final EncodingService encodingService;
    
    // 단일 생성자인 경우 @Autowired 어노테이션 생략 가능합니다.
    public Encoder(@Qualifier("urlEncodingService") EncodingService encodingService) {
    	this.encodingService = encodingService;
    }
}
  1. 필드 주입 방식
  • final 선언 불가
  • 간단하지만 권장되지 않음
@Component
public class Encoder {
	
    @Autowired
    private EncodingService encodingService;
}
  1. 수정자 주입 방식
  • 수정자(setter)를 이용한 주입 방식
@Component
public class Encoder {

	private EncodingService encodingService;
	
    @Autowired
    public void setEncodingService(EncodingService encodingService){
    	this.encodingService = encodingService;
    }
}

@RequiredArgsConstructor로 빈 사용

  • @Autowired 없이 의존성 주입 가능
  • final필드나 @NonNull이 붙은 필드에 생성자를 생성
  • 생성자 주입 방식
// 생성자 주입 방식
@Component
public class Encoder {
	
    private final EncodingService encodingService;
    
    public Encoder(EncodingService encodingService) {
    	this.EncodingService = encodingService;
    }
}

// 위와 같은 생성자 주입 방식을 @RequiredArgsConstructor를 사용하여 생성자 생성 생략 가능

@RequiredArgsConstructor
@Component
public class Encoder {
	
    private final EncodingService encodingService;
    
}

참고

profile
성장하는 개발자

0개의 댓글