728x90
반응형
@Autowired
스프링 DI(Dependency Injection)에서 사용되며, Bean 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입됩니다.
필요한 의존 객체의 “타입"에 해당하는 Bean을 찾아 주입한다.
- 생성자 / setter / 필드
기본값이 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면 애플리케이션 구동 실패.
💡 Constructor Dependency Injection
생성자 주입은 생성자에 의존성 주입을 받고자 하는 field를 나열하는 방법으로, 권고되는 방법의 하나 이다.
- 장점
- 필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제함
- Spring 4.3 이상부터는 생성자가 하나인 경우 @Autowired를 사용하지 않아도 됨
- Circular Dependency / 순환 참조 의존성을 알아 차릴 수 있음
- 생성자에 점차 많은 의존성이 추가 될 경우 리팩토링 시점을 감지 할 수 있음
- 의존성 주입 대상 필드를 final로 불편 객체 선언할 수 있음
- 테스트 코드 작성시 생성자를 통해 의존성 주입이 용이함
💡 Field Dependency Injection
member field에 @Autowired annotation을 선언하여 주입받는 방법이다.
- 장점
- 가장 간단한 선언 방식
- (단점이 더 많음)
💡 Setter Dependency Injection
setter 메소드에 @Autowired annotation을 선언하여 주입받는 방법이다.
- 장점
- 의존성이 선택적으로 필요한 경우에 사용
- 생성자에 모든 의존성을 기술하면 과도하게 복잡해질 수 있는 것을 선택적으로 나눠 주입 할 수 있게 부담을 덜어줌
- 생성자 주입 방법과 Setter 주입 방법을 적절하게 상황에 맞게 분배하여 사용
public class ExampleCase{
@Autowired // field
private ChocolateService chocolateService;
@Autowired // setter
public void setChocolateService(ChocolateService chocolateService){
this.chocolateService = chocolateService;
}
@Autowired // construct
public ExampleCase(ChocolateService chocolateService, DrinkService drinkService) {
this.chocolateService = chocolateService;
}
}
@RequiredArgsConstructor
final이 붙거나 @NotNull이 붙은 필드의 생성자를 자동 생성해주는 Lombok 어노테이션
생성자 주입! ( construct Injection )
@Autowired를 사용하여 직접적으로 생성자 주입
@Service
public class BannerServiceImpl implements BannerService {
private BannerRepository bannerRepository;
@Autowired
public BannerServiceImpl(BannerRepository bannerRepository, CommonFileUtils commonFileUtils) {
this.bannerRepository = bannerRepository;
}
...
@RequiredArgsConstructor를 사용하여 자동으로 생성자 주입
@Service
@RequiredArgsConstructor
public class BannerServiceImpl implements BannerService {
private final BannerRepository bannerRepository;
...
728x90
반응형
'🍃SpringFramework > SpringBoot' 카테고리의 다른 글
[SpringBoot] 로그아웃 후 이전 페이지로 이동(뒤로가기) 방지 (8) | 2023.10.20 |
---|---|
[SpringBoot] MultipartFile 업로드/다운로드 하기 (0) | 2023.09.05 |
[SpringBoot] 주요 개념 정리 (0) | 2023.08.20 |
[SpringBoot] NaverAPI - RestaurantProject (0) | 2023.08.20 |
[SpringBoot] 07. Server to Server (0) | 2023.08.20 |