취미로 음악을 하는 개발자

[Spring] 의존 객체 자동 주입 본문

공대인/Spring[Boot]

[Spring] 의존 객체 자동 주입

영월특별시 2019. 5. 22. 21:54
728x90

// 의존 객체 자동 주입

: Spring 설정 파일에서 의존 객체를 주입할 때 <constructor-arg> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 Spring 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능



- 변경 전 xml



- 변경 후 xml


beans 태그에 들어갈 코드들은 외우기보다 복사 붙여넣기로 필요할 때마다 끌어오는 것이 더 효율적이다.

변경 후 xml에 나타나 있듯이 <context:annotation-config />를 선언하면 주입을 하기위해 필요했던 태그 <constructor-arg>를 사용하지 않아도 된다.


- 단, 동일한 객체가 2개 이상인 경우 Spring 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 예외처리를 발생시킨다.


// 윗 코드처럼 설정 후 실행했을 때의 Log 중 일부

-> 적절한 Bean 객체를 찾지 못했지만 3개를 발견했다. 그래도 3개 중에 어떤 것을 가져오는지 모르겠다.



// 의존 객체 선택 방법

1) <qualifier> 태그 사용

: qualifier 태그 안의 value값을 자동으로 주입해야할 클래스에 똑같이 Qualifier 태그로 선언해준다. 



2) 객체의 이름과 같은 id값 사용

: 주입해야할 클래스에 선언된 필드 값과 동일하게 id를 지정해준다.



- 단, 개발자 입장에서도 혼동이 올 수 있으므로 1) 의 방법을 쓰는 것이 더 좋다.



* 의존 객체 주입 체크

의존 객체가 없을 때, 예외처리가 안나오는 방법은 Autowired 속성 중 required 가 있는데 그것을 false

-> 의존 객체가 있으면 주입하고 없으면 주입하지 않는다.


- 하지만 bean객체에 자동 주입을 설정 안했는데 Autowired를 선언해주는 경우가 있을까?



1) Autowired

: Autowired로 선언된 생성자나 메소드, 필드 등이 사용될 때 매개변수로 받는 타입과 일치하는 것을 찾아서 자동으로 주입.

생성자에서 쓸 때는 상관없지만 메소드나 필드에 쓸 때에는 기본 생성자를 선언해주어야한다.

-> 객체가 생성되어야 Autowired로 선언된 것들이 실행될 수 있고 기본 생성자 없이 파라미터를 이용한 생성자만 있다면 이 경우에는 Autowired로 선언한 생성자가 아니므로 매개변수의 타입을 찾지 못해서 에러가 뜨게 된다.



2) Resource

: Resource로 선언된 메소드, 필드 등이 사용될 때 매개변수와 같은 이름을 가진 것을 찾아서 자동으로 주입, 생성자는 Resource 선언 불가

Autowired와 같이 기본 생성자를 명시해주어야 함



3) Inject

: Autowired와 거의 비슷하지만 required 속성을 지원하지 않는다는 차이가 있다.



- Autowired와 비교해보면 Autowiredxml 파일에 원하는 <bean> 태그에 <qualifier> 태그를 넣어야하지만 Inject의 경우는 지정할 클래스에서만 선언하면 되므로 좀 더 직관적으로 볼 수 있다는 장점이 있다.

Comments