본문 바로가기

Spring

Autowire 알아보기 - 1

Autowire 어노테이션은 의존성 주입을 위해 자주 사용하게 되는데, 제대로 알고 사용하기 위해 한번 알아보겠습니다.

@Autowired
- Autowire의 required의 기본 값은 true( 의존성 주입에 실패하면 애플리케이션 구동이 실패한다.)

아래와 같이 BookService에서 Autowired를 생성자를 통해 진행하는 상황이라고 가정합니다. 만약 BookRepository가 빈으로 등록되지 않았을 경우 당연히 에러를 반환합니다. -> 당연한 생각이죠?

그런데 생성자가 아니라 setter를 통해 의존성 주입을 하는 상황이라고 가정해보겠습니다. 이건 왜 실패하는 걸까요? 

첫 번째 예시의 생성자를 통한 의존성 주입은 빈을 만들기 위한 과정에서 빈에 필요한 다른 의존성인 bookRepository를 찾지 못했기 때문에 해당하는 빈이 없어서 실패했다는 것을 직관적으로 알 수 있습니다. 그러나 두번째 예시와 같은 setter를 통한 의존성 주입은 BookService를 만들 수 있어야 하는 게 아닌가요?라는 의문점을 가지실 수 있습니다.

맞습니다. 만들 수 있어야해요. 인스턴스 자체는 BookRepsotiroy 없이도 만들 수 있는 게 맞지만, Autowired를 선언했기 때문에 빈을 생성하면서 의존성 주입을 시도하게 됩니다.

그래서 만약 이런 의존성이 없어도 된다라는 판단을 했다면 Autowired의 required를 아래와 같이 false로 설정해서 만들 수 있습니다. Autowired의 required의 기본 값은 true이기 때문에 이와 같은 상황이 발생한 것입니다. 

그리고 Autowire는 생성자, 세터이외에 필드에도 선언할 수 있습니다. 여기도 위와 동일하게 false를 지정할 수 있습니다. 생성자를 이용한 의존성 주입과는 약간 다른 면이 있는 거를 발견하셨나요? 생성자를 사용한 의존성 주입은 빈을 만들 때 개입을 해서 생성자로 받아야 되는 타입의 빈이 없으면 무조건 인스턴스를 만들지 못하고 BookService로 등록할 수 없습니다. 그러나 세터나 필드를 통한 인젝션은 BookService가 해당하는 의존성 없이도 빈으로 등록되게 할 수 있습니다.

 

'Spring' 카테고리의 다른 글

스프링의 핵심 원리 - 1 (객체지향에서의 다형성)  (0) 2021.01.07
Autowire 알아보기 - 2  (0) 2020.09.27
AOP를 활용한 Logging 구현  (1) 2020.08.09
Spring Web Layer 알아보기  (0) 2020.07.12
SpringBoot - ExceptionHandler  (1) 2020.07.05