2020. 7. 23. 23:14ㆍSpring/Spring
1. 의존성 관리
1) 의존성 관계
객체와 객체의 결합 관계이다. 하나의 클래스에서 다른 클래스의 변수를 사용할 경우, 의존성 관계가 성립된다. 의존성 관리 방법으로는 Dependency Lookup, Dependency Injection이 있다.
/src/main/java/
SonySpeaker.java, SamsungTV.java
2) Dependency Lookup
클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식이다. 실제 개발 과정에서는 사용하지 않는다.
3) Dependency Injection
객체 사이의 의존 관계를 스프링 설정 파일에 등록된 정보대로 컨테이너가 처리해준다. 설정 파일의 정보대로 처리해주기 때문에 의존성 변경 시 코드를 수정하는게 아닌 설정 파일을 수정하는 것만으로 변경할 수 있다. Dependency Injection에는 Constructor Injection, Setter Injection이 존재한다.
1. 생성자 주입
SonySpeaker 클래스와 SamsungTV 클래스에서는 쓸데 없이 두 개의 객체(volumeUp, volumeDown)가 생성이 되며 SonySpeaker가 아닌 다른 브랜드의 스피커로 변경 시 번거로움이 존재한다. 이러한 문제를 의존성 주입으로 해결할 수 있다.
SamsungTV 클래스 <bean> 등록 설정에서 <constructor-arg> 엘리먼트와 함께 생성자 인자로 전달될 id를 ref 속성에 참조한다. 이렇게 SamsungTV 객체를 생성할 때, 두번째 생성자가 실행이 된다.
/src/main/java/
applicationContext.xml, SamsungTV.java
만약 생성자에 전달될 인자가 두 개 이상일 경우, 한번에 전달해주어야 한다. 설정 파일에는 고정된 문자열이나 정수 같은 기본형 데이터일 때 value 속성을 <constructor-arg> 엘리먼트에서 사용하여 인자로 전달해준다. 동일한 인자 수를 지닌 생성자가 여러개 있을 경우, <constructor-arg> 엘리먼트에서 index 속성을 이용하여 넘어가는 각 인자에 매핑되어 전달할 수 있다. (index는 0 부터 시작)
/src/main/java/
applicationContext.xml, SamsungTV.java
마지막으로 다른 브랜드의 스피커를 사용할 수 있기 때문에 최상위 부모로 사용할 인터페이스를 추가한다. 여기서 설정 파일의 속성값만 변경하면 쉽게 SamsungTV에서 AppleSpeaker를 사용할 수 있도록 변경할 수 있다.
/src/main/java/
applicationContext.xml, Speaker.java, SonySpeaker.java, AppleSpeaker.java, SamsungTV.java
2. Setter 주입
호출되는 시점은 <bean> 객체 생성 직후에 Setter 메서드가 호출된다. Setter를 사용하기 위해서는 <property> 엘리먼트를 사용하며, name 속성을 이용하여 실행할 Setter 메서드 이름을 지정한다. (setSpeaker : speaker)
/src/main/java/
applicationContext.xml, SamsungTV.java
Setter 주입할 때 'p 네임스페이스'를 이용하면 좀 더 효율적으로 의존성 주입을 처리할 수 있다. 'p 네임스페이스'는 별도의 schemaLocation이 없기 때문에 네임스페이스만 선언하고 사용이 가능하다.
/src/main/java/
applicationContext.xml
[참고] 스프링 퀵 스타트
[참고] yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
'Spring > Spring' 카테고리의 다른 글
[Spring] 어노테이션 설정, 의존성 주입 설정 (0) | 2020.07.24 |
---|---|
[Spring] 컬렉션 객체 설정 (0) | 2020.07.24 |
[Spring] 스프링 컨테이너 및 설정 파일 (0) | 2020.07.23 |
[Spring] 스프링 시작하기 (2) (0) | 2020.07.23 |