본문 바로가기
개발 공부 중!/Spring

[스프링5 입문] Chap 04. 의존 자동 주입

by 김evelyn 2024. 1. 5.

 

📚 @Autowired 애노테이션

 + 이 애노테이션을 필드나 세터 메서드에 붙이면 스프링은 타입이 일치하는 빈 객체를 찾아서 주입한다.

public class ChangePasswordService {

// @Autowired를 붙이면 설정 클래스에서 의존 주입할 필요 X
@Autowired
private MemberDao memberDao;

...

}
// AppCtx.java는 설정 클래스이다.
// @Autowired를 붙였으므로 AppCtx 클래스의 @Bean 설정 메서드에서 의존을 주입하는 코드를 삭제하면 된다. 
// (주석 처리한 부분)

publid AppCtx {
    @Bean
    public ChangePasswordService changePwdSvc() {
            ChangePasswordService pwdSvc = new ChangePasswordService();
    //        pwdSvc.setMemberDao(memberDao());
            return pwdSvc;
        }
 ...
 }

 

 

📚 @Qualifier 애노테이션

  • 자동 주입 가능한 빈이 두 개 이상이면 자동 주입할 빈을 지정할 수 있는 방법이 필요한데 이 때 사용한다.
  • 이 애노테이션을 사용하면 자동 주입 대상 빈을 한정할 수 있다.
  • @Qualifier를 넣어주는 두 위치 
    1. @Bean 애노테이션을 붙인 빈 설정 메서드
    2. 해당 값을 파라미터로 받는 메서드

아래 코드 예시를 확인하자!

1. @Bean 애노테이션을 붙인 설정 메서드

// 저렇게 memberPrinter1과 2로 만들어 @Qualifier 애노테이션 없이 실행시키면 
// 해당 타입에 대한 빈을 두 개 발견했다는 에러 메세지가 뜬다. 
// 자동 주입을 위해서는 해당 타입을 가진 빈이 어떤 빈인지 정확하게 한정할 수 있어야 한다. 

    @Bean
    @Qualifier("printer")
    public MemberPrinter memberPrinter1() {
        return new MemberPrinter();
    }
    @Bean
    public MemberPrinter memberPrinter2() {
            return new MemberPrinter();
    }

 

2. 해당 값을 파라미터로 받는 메서드

@Autowired
@Qualifier("printer")
public void setMemberPrinter(MemberPrinter printer) {
    this.printer =printer;
}

 


📚 필수 여부 지정하는 방법

 

1. @Autowired(required = false)

@Autowired(required = false)

public void setDateTimeFormatter(DateTimeFormatter dateTimeFormatter) {
    this.dateTimeFormatter =dateTimeFormatter;
}

required = false로 지정하면 매칭되는 빈이 없어도 익셉션이 발생하지 않으며 자동 주입을 수행하지 않는다.

위 코드에서는 DateTimeFormatter 타입의 빈이 존재하지 않으면 익셉션을 발생하지 않고 setDateTimeFormatter() 메서드를 실행하지 않는다. 

 

2. Optional 

@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
    if (formatterOpt.isPresent()) {
        this.dateTimeFormatter =formatterOpt.get();
    } else {
        this.dateTimeFormatter = null;
    }
}

 

3. @Nullable 애노테이션

@Autowired
public void setDateFormatter(@Nullable DateTimeFormatter dateTimeFormatter) {
    this.dateTimeFormatter = dateTimeFormatter;
}

@Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면,

스프링 컨테이너는 세터 메서드를 호출할 때 자동 주입할 빈이 존재하면 -> 해당 빈을 인자로 전달,

존재하지 않으면 -> 인자로 null을 전달한다.

 

 

일치하는 빈이 없으면 할당 자체를 하지 않는 @Autowired(required=false)와 달리 @Nullable 애노테이션을 사용하면 일치하는 빈이 없을 때 null 값을 할당한다. Optional 타입은 매칭되는 빈이 없으면 값이 없는 Optional을 할당한다.


@Autowired 애노테이션을 사용했다면 설정 클래스에서 객체를 주입하기보다는 스프링이 제공하는 자동 주입 기능을 사용하는 것이 좋다. (자동 주입과 수동 주입이 섞여 있으면 익셉션 원인을 찾기 어렵다. 일관되게 사용해야 이런 문제를 줄일 수 있다.)

 

 


 

예제 코드는 아래 깃허브에서 확인 가능합니다!

https://github.com/EvelynKimm/SpringSelfStudy

 

GitHub - EvelynKimm/SpringSelfStudy: 💻 혼자 Spring 공부하는 Repository

💻 혼자 Spring 공부하는 Repository . Contribute to EvelynKimm/SpringSelfStudy development by creating an account on GitHub.

github.com