인프런 김영한 강의 정리/스프링 핵심원리 기본편

스프링 핵심 원리 기본편 - 의존관계 자동 주입(2)|옵션처리

백엔드 개발자 - 젤리곰 2024. 5. 4. 11:03
728x90

주입할 스프링 빈이 없어도 동작해야 할 때가 있다.

그래서 오늘 포스팅 주제는 '의존성 주입 옵션 처리'이다.

 

1. 자동 주입 대상을 옵션으로 처리하는 방법 3가지

  • required = false
  • @Nullable
  • Optional<T>

 

public class AutoWiredTest {

    @Test
    void AutoWiredOption(){
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
    }

    static  class TestBean {
        //빈으로 등록되지 않은 Member를 주입하는 테스트
        @Autowired(required = false)
        public void setNoBean1(Member noBean1){
            System.out.println("noBean1 = " + noBean1);
        }
        
        @Autowired
        public void setNoBean2(@Nullable Member noBean2){
            System.out.println("noBean2 = " + noBean2);
        }
        
        @Autowired
        public void setNoBean3(Optional<Member> noBean3){
            System.out.println("noBean3 = " + noBean3);
        }
    }

 

1. required = false 

@Autowired의 기본옵션이 (required = true)다.

아무 옵션없이 빈으로 등록되지 않은걸 주입하려고 하면 에러가 터진다.

required = false로 등록하면 에러가 터지진 않지만 메서드 호출 자체가 안된다.

 

그래서 위 테스트 코드르 실행해보면 아래와 같이 noBean1을 로그에서 볼 수 없다..!

 

2. @Nullable

생성자 자동 주입을 할 때, 특정 필드에만 @Nullable을 사용할 수도 있다.

 

✅예시코드

  @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, @Nullable DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

 

원래 할인정책(discountPolicy)이 null이면 안되지만, 예시로 @Nullable 어노테이션을 붙여봤다.

이런 경우, 할인정책이 null이어도 생성자 자동주입시 오류가 나지 않는다.

 

3. Optional<T>

Optional<T>는 Java8에서 나온 문법이다.

값이 있을 수도 있고, 없을 수도 있는 객체 T를 감싸는 래퍼 클래스로, null 처리를 더 깔끔하게 처리하고 오류를 방지하기 위한 문법이다.

 

스프링 컨테이너에 해당 타입 'T'의 빈이 존재하면 Optional.of(빈 인스턴스)로 표현되고

객체가 비어있는 경우, Optional.empty를 반환한다.

 

728x90