Spring : Autowired

hwanse·2021년 2월 10일
0

Spring

목록 보기
3/4
post-custom-banner

학습 목표

  1. Autowired


Autowired

스프링에서 IoC컨테이너가 관리하고 있는 Bean이라면 자동으로 Bean 객체를 주입해줄 수 있다. @Autowired 애노테이션을 필드 상단에 사용하면 해당 필드는 컨테이너가 객체를 주입해준다.

다음 예시를 보자

BookRepository라는 Bean이 있고 BookService는 BookRepository에 대한 의존성이 엮여있는데, 여기서 해당 필드위에 @Autowired애노테이션을 주는 것만으로도 컨테이너로부터 Bean 주입을 받을 수 있다.

위 테스트 코드에서 BookService와 BookRepository 모두 Bean 주입을 받은 것을 확인할 수 있다.

그런데 한가지 주의할 점이 있다. 다음과 같이 BookRepository가 Bean Component로 등록이 안되어 있고 BookService 클래스에서 BookRepository에 대한 의존성이 여전히 있을 때 Autowired를 사용하게 되면 다음과 같이 된다.

좀 전에 같은 테스트 코드는 실패하는 것을 확인할 수 있다. 에러 문구는 다음과 같다.

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'study.corespring.studyspring.BookRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

ApplicationContext 컨테이너에서 BookService Bean을 생성하면서 BookRepository에 대한 의존성도 엮여있으므로 @Autowired 애노테이션 따라 BookRepository Bean 주입을 해주려했지만 BookRepository 라는 Bean은 컨테이너에 등록된 Bean이 아니기 때문에 해당 오류가 나는 것이다.

로그에서 Autowired(required=true) 라는 문장이 보일 것이다 Autowired는 알겠지만 reuired=true는 뭘까? 사실 Autowired 애노테이션에 required라는 옵션이 있는데 이 required 옵션을 defualt 값이 true이다.

위 사진을 보면 required 라는 옵션이 주어져 있고 default로 true 라는 코드가 보인다. 이것의 의미는 필드, 메소드, 생성자에 Autowired 애노테이션을 주게되면 이 Bean 객체는 반드시 Bean 주입이 필요하다는 의미다. 따라서 이 옵션은 default가 true임에 따라 등록되지도 않은 Bean을 주입하려하니 오류 발생의 원인이 된것이다.

위 처럼 required 옵션을 false로 지정하게되면 이 Bean 주입을 필수가 아니라는 것을 컨테이너에게 알려준것이다.

이제 좀 전의 테스트 코드를 살짝 바꿔 bookService 객체는 Null이 아니고 bookRepository는 required 값을 false로 주었고 BookRepository 빈은 컨테이너에 등록되어 있지 않으니 Null 값이다. 따라서 위 테스트 코드는 통과하게 되는 것을 볼 수 있다.

여기서 한가지 주의할 점이 또 있다. required 옵션을 false를 주어도 먹히지 않는 케이스가 한가지 있다. 위 예시에서는 필드에서 바로 Autowired 애노테이션을 주었지만 생성자에 해당 애노테이션을 주게되면 문제가 된다. 아래 예시를 보자

위와 같이 BookService의 생성자에 Autowired 애노테이션을 주었을 때에는 결과가 어떻게 될까? 위 테스트 코드를 동일하게 실행해보자

테스트 코드가 실패했다. Autowired 애노테이션을 필드, 메소드에 적용했을 때와 생성자에 주었을 때 결과는 다르다. required = false 옵션이 필드, setter 메소드에서의 Autowired면 BookService Bean 주입을 해줄 때 BookRepository는 빈이 없으니 그냥 null인 상태로 BookService Bean만 생성해주면 끝나지만, 생성자에서의 Autowired는 BookService 를 생성하면서 매개변수에 BookRepository에 대한 의존성을 같이 주입하려고 시도하기 때문에 컨테이너에서 에러가 발생하게 된다.

그러면 BookRepository 매개변수가 없는 생성자일 때에는 어떻게 될까?

이 경우에는 해당 테스트 코드가 성공으로 끝났다. 이렇게 Autowired 애노테이션은 생성자에 주었을 때에는 각 상황에 따라 결과가 다르게 나타나게된다.

이렇게 Autowired 애노테이션에 대해서 간략히 알아보았다. 이 주제에서도 필드, setter, 생성자 주입 방식들이 어떤 특징을 가지고 있고 어떤식으로 사용하면 좋을지에 대해서 다른 글에서 중점적으로 다루어 보는 것이 좋을 것 같다.

profile
만사가 귀찮은 ISFP가 쓰는 학습 블로그
post-custom-banner

0개의 댓글