본문 바로가기
🍃SpringFramework/SpringBoot

[SpringBoot] @Annotation 정리

by inbeom 2023. 8. 20.
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
반응형