본문 바로가기
스프링/핵심 원리

[Spring] 옵션 처리

by drCode 2022. 2. 18.
728x90
반응형

테스트 케이스 중에서 오류가 나는 건이 있다.

MemoryMemberRepository를 컴포넌트로 등록해주고,

AutoAppConfig에서 MemoryMemberRepository를 bean으로 재차 등록해주면 충돌이 나기 때문에 

MemoryMemberRepository를 bean으로 등록한 부분을 주석으로 처리해주면 오류가 사라지는 것을 볼 수 있다.

 

 

 

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

그런데 @Autowired만 사용하면 required 옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다.

 

자동 주입 대상을 옵션으로 처리하는 방법은 다음과 같다.

  • Autowired(required = false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨
  • org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다.
  • Optional<> : 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.

예제로 확인해보자.

 

위 경로에 클래스를 만들어준다 : AutowiredTest

 

package hello.core.autowired;

import hello.core.member.Member;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.lang.Nullable;

import java.util.Optional;

public class AutowiredTest {

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

    static class TestBean {

        @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);
        }
    }
}

 

여기서, setNoBean1의 애노테이션 Autowired에 옵션 required = true이거나 required 옵션이 제외되면

 

위와 같은 오류를 마주하게 된다.

 

그 이유인 즉슨, Member 클래스는 빈으로 등록되지 않았기 때문에 스프링이 읽을 수 없기 때문이다.

 

  • "Member는 스프링 빈이 아니다."
  • setNoBean1() 은 @Autowired(required=false) 이므로 호출 자체가 안된다.

"출력결과"

참고 : @Nullable, Optional은 스프링 전반에 걸쳐서 지원된다. 예를 들어서 생성자 자동 주입에서 특정 필드에만 사용해도 된다.

728x90
반응형

댓글