@Autowired 애노테이션은 자동으로 주입할 빈 객체가 존재하지 않으면 익셉션을 발생시킨다. 그런데 그냥 null인 상태로의 처리 로직도 존재한다면 굳이 자동으로 주입할 빈이 없다고해서 익셉션을 발생시킬 필요가 없다. 아래 코드는 주입할 빈이 있으면 있는대로 처리하고, 없으면 없는대로 처리한다.

public class MemberPrinter { 
 
    private DateTimeFormatter dateTimeFormatter; 
     
    public void print(Member member) { 
        if (dataTimeFormatter == null) { 
            System.out.printf("회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%tF\n", 
                                member.getId(), 
                                member.getEmail(), 
                                member.getName(), 
                                member.getRegisterDateTime()); 
        } else { 
            System.out.printf("회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%s\n", 
                                member.getId(), 
                                member.getEmail(), 
                                member.getName(), 
                                dateTimeFormatter.format(member.getRegisterDateTime())); 
        } 
    } 
    
    @Autowired(required = false) // 자동 주입할 빈 객체가 존재하지 않아도 익셉션을 발생시키지 않는다. 
    public void setDateFormatter(DateTimeFormatter dateTimeFormatter) { 
        this.dateTimeFormatter = dateTimeFormatter; 
    } 
} 

 

@Autowired(required = false)로 설정함으로써, 자동으로 주입할 빈이 없다면 해당 메서드를 실행하지 않음으로써 익셉션을 방지한다. 그런데 주입할 빈이 없다해도 메서드는 실행시키고 싶은 경우가 있을 수 있다. 그럴 땐 @Nullable 애노테이션을 사용한다.

public class MemberPrinter { 
    private DateTimeFormatter dateTimeFormatter; 
    
    public void print(Member member) { 
        // ...생략
    } 
    
    @Autowired 
    public void setDateFormatter(@Nullable DateTimeFormatter dateTimeFormatter) { 
        this.dateTimeFormatter = dateTimeFormatter; 
    } 
} 

 

setter의 매개변수 앞에 @Nullable 애노테이션을 붙임으로써, 주입할 빈이 없어도 해당 메서드가 실행은 되게끔 설정할 수 있다.