Spring 공부 정리 -3. 의존성 주입(2)
의존 객체 자동주입
이전의 방법은 은근히 골치가 아픈게 직접 넣어줘야하는 귀찮음이 존재합니다.
<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("")을 통해서 이름이 같은 것을 확인하고 그것을 맞는지 확인받는 과정을 거친다.
'Spring' 카테고리의 다른 글
Spring Boot에서 XML을 추가하는 경우 발생하는 문제점과 해결방안 (0) | 2020.03.07 |
---|---|
Spring Boot와 React를 연동하여 개발환경을 만들어보자 (35) | 2020.03.02 |
[Spring boot] 공공데이터 포털 service key is not registered error 해결 방안 (0) | 2020.02.11 |
Spring 공부 정리 -2. 의존성 주입(1) (0) | 2019.07.25 |
Spring 공부 정리 -1. 프로젝트 생성과 특징 (0) | 2019.07.24 |