글 작성자: 개발섭

의존 객체 자동주입

이전의 방법은 은근히 골치가 아픈게 직접 넣어줘야하는 귀찮음이 존재합니다. 

<property>나 <constructor-arg>를 직접 일일히 쳐줘야하는데, 굳이 그런 방법을 취하는 것이 아닌, Spring이 자동으로 알아서 넣는 방식을 사용하는 것이죠.

 

그럼 어떤 방식으로 자동 주입을 할까요?

 

@Annotation기능을 통해서 자동으로 주입하는 방식을 취합니다.

 

두가지 방식으로 넣을 수 있는데,

 

@Autowired와 @Resource을 넣는 방식으로 작동합니다.

 

@Autowired

주입하려는 객체의 타입이 일치하는지를 보고 객체를 자동 주입합니다.

 

사용할 수 있는 것은 생성자, 메소드, 변수를 통해서 객체 타입이 일치하는지를 보고 집어 넣을 수 있습니다.

 

이런식으로 constructor태그가 없더라도, 

 

@Autowired만 있으면 Wa라는 객체를 자동으로 넣어주고, 정상적으로 작동하게 됩니다.

위의 private객체를 직접 만들지 않아도 정상작동하고 위에서 말한 것 처럼 변수의 autowired를 적용시킬 수 도 있습니다. 

단,  변수에 집어넣는 경우 default 생성자가 필요합니다. 없는 경우 error를 발생시킵니다.

@Resource 

리소스 태그의 경우 무조건 method나 변수명에서만 사용가능합니다. 

이 태그의 경우 객체의 이름이 같은 경우에 객체를 자동 주입하는 방식입니다. 단, 생성자에는 사용이 불가합니다.

이러다보니 method나 변수명에서 사용하다보면, 자동으로 default 생성자 명시를 해줘야합니다. 

 

의존 객체를 자동으로 주입할 수 없는 경우

문제는 의존객체가 이름이 같은 게 여러가지인 경우 이름이 동일하기때문에 Spring입장에서는 무슨 객체를 넣어야할지 의문이 생깁니다.

그때 exception이 발생하면서 정상적으로 작동하지 않는경우가 발생하는데, 

 

이때 우리는 <qualifier value="이름"> 태그를 통해서 이것을 사용하라고 강제할 수 있습니다. 

 

직접 java 파일에 어노테이션을 두개 넣으므로서 자동주입을 강제할 수 있다.

@autowired밑에 @qualifier("이름") 형식으로 자동주입을 강제할 수 있다.

 

단, 이름이 완전히 일치하는경우는 같은 객체가 여러가지 있더라도, qualifier없이도 자동 주입이 가능하다. (물론 이경우는 이름이 완전 같다는 조건하에)

 

@inject

이 어노테이션은 @autowired와 비슷하게 의존 객체를 자동 주입을 할 수 있다. 단, @autowired의 경우 required라고 해서 이 객체가 있는지 확인하는 작업을 해주는 명령어를 지원한다면 inject은 required를 쓸 수 없다.

 

즉, 그렇기 때문에 bean객체가 있는지 없는지를 required특성이 없기때문에 일단 주입하고 문제가 생기면 exception을 발생시킨다.

 

@inject의 주입시 이름이 동시에 겹치는 경우

@named("")을 통해서 이름이 같은 것을 확인하고 그것을 맞는지 확인받는 과정을 거친다.