Spring의 의존성 관리 방법에 대해 이야기해 보겠습니다.
Spring은 IoC ( 제어의 역행 )을 지원하여 객체의 생성과 의존관계를 컨테이너가 자동으로 관리합니다.
이 IoC는 두 가지 형태로 지원됩니다.
-
Dependency Lookup
컨테이너가 객체를 생성하고 클라이언트가 객체를 요청하여 사용하는 방식을 말합니다.
-
Dependency Injection
객체 사이의 의존관계를 설정 파일에 입력된 정보에 따라 컨테이너가 자동으로 관리해주는 방식을 말합니다.
따라서 의존성 설정을 바꾸고 싶을 때 프로그램 코드를 수정하지 않고 Spring 설정 파일 수정만으로 변경사항을 적용할 수 있어서 유지보수가 향상됩니다.
-
Constructor Injection ( 생성자 인젝션 )
컨테이너가 등록된 클래스를 찾아 객체를 생성할 때 기본적으로 Default 생성자를 호출하는데, 때에 따라서는 매개변수를 가지는 다른 생성자를 호출하도록 설정해야 하는 경우가 있는데 이때 사용할 수 있는 게 Constructor Injection입니다.
1
2
3
4
5
6
7
8
9
|
public class testClass{
private Object object;
private int value;
public testClass(Object object, int value) {
this.object = object;
this.value = value;
}
}
|
1
2
3
4
5
|
<bean id="testClass" class="url.testClass">
<constructor-arg ref="object"></constructor-arg>
<constructor-arg value="value"></constructor-arg>
</bean>
<bean id="object" class="url"></bean>
|
*ref : 매개변수가 bean으로 등록된 다른 객체일 때, id 값을 통해 사용된다.
*value : 고정된 문자열이나 정수 같은 기본형 데이터일 때 사용된다.
위와 같이 Constructor Injection을 설정하면 해당 testClass를 찾아 매개변수가 일치하는 생성자를 찾아서 초기화 작업을 진행합니다.
-
Setter Injection
setter / getter 메서드를 이용하여 의존성 주입을 하는 방법입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class testClass{
private Object object;
private int value;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
|
1
2
3
4
5
|
<bean id="testClass" class="url.testClass">
<property name="object" ref="object"></property>
<property name="value" value="value"></property>
</bean>
<bean id="object" class="url"></bean>
|
name="object" 의경우 해당 class의 setObject를 찾아 초기화를 진행하게 됩니다.
뒤의 ref, value는 위와 동일합니다.
*p 네임스페이스를 활용하면 좀 더 효율적으로 사용할 수 있습니다.
1
2
|
<bean id="testClass" class="url.testClass" p:object-ref="object" p:value="value"/>
<bean id="object" class="url"></bean>
|
어노테이션
( annotation )
위에서 설명한 의존성 관리에 관한 내용을 XML 파일을 직접 수정하지 않고 해당 Class, Method, Value 위에 명시해주면 자동으로 XML 파일을 수정한 것과 같은 효과를 보여주는 기능입니다.
-
컴포넌트 스캔 ( component-scan ) 설정
어노테이션을 사용하려는 범위를 설정하는 과정입니다.
1
|
<context:component-scan base-package="packageName"></context:component-scan>
|
applicationContext.xml 파일에 위와 같이 추가하면
"pakageName" 이라는 텍스트를 가지는 모든 패키지에서 어노테이션을 사용할 수 있게 됩니다.
-
@Component
bean의 관리를 XML 파일을 수정하지 않고 자동으로 관리해주는 어노테이션입니다.
1
2
|
@Component
public class className{}
|
1
|
<bean class="url.className"></bean>
|
위의 @Component는 아래의 XML 코드와 동일한 효과를 지닙니다.
@Component를 마주치면 메모리에 해당 객체가 생성되어있는지를 확인하고 해당 객체를 주입합니다.
다만, 일반적으로는
1
2
|
@Component("id")
public class className{}
|
1
|
<bean id="id" class="url.className"></bean>
|
이런 식으로 id를 명시해주어 사용하지만 해당 객체에 id 가 명시되어 있지 않은 경우 요청하려는 객체의 첫 글자를 소문자로 변경하여 요청하면 됩니다. ( Abc -> abc )
-
@Autowired
이 어노테이션은 생성자나 메서드, 변수 위에 모두 사용할 수 있지만, 대부분은 변수 위에 선언하여 사용합니다.
컨테이너가 이 어노테이션을 발견하면 해당 변수의 '타입 '을 체크하여 같은 타입의 객체를 주입합니다.
1
2
3
4
5
|
@Component
public class className{
@Autowired
private Object obj;
}
|
1
|
<bean class="url.Object"></bean>
|
이와 같이 사용하면 하단에 명시된 객체가 자동으로 주입됩니다.
-
@Qualifier
@Autowired는 '타입 '을 기준으로 객체를 주입하기 때문에
동일 타입의 객체가 여러 개 존재하면 어떤 객체를 사용해야 할지 판단할 수 없어서 오류가 발생합니다.
이를 보완하기 위해 사용할 수 있는 게 @Qualifier입니다.
1
2
3
4
5
6
|
@Component
public class className{
@Autowired
@Qualifier("first")
private Object obj;
}
|
1
2
|
<bean id="first" class="url.Object1"></bean>
<bean id="seccond" class="url.Object2"></bean>
|
위와 같이 사용하면 같은 interface를 상속하여 만든 Object1, Object2 객체 중에
'id ' 가 first 인 객체를 골라 주입하게 됩니다. ( name 도 가능합니다. )
-
@Resource
해당 어노테이션은 'name '을 이용하여 의존성을 주입합니다.
1
2
3
4
5
|
@Component
public class className{
@Resource(name="first")
private Object obj;
}
|
1
2
|
<bean name="first" class="url.Object1"></bean>
<bean name="seccond" class="url.Object2"></bean>
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
위와 같이 사용하며 name 값이 first 인 객체를 찾아서 의존성 주입을 합니다.
'Web Programming > Spring' 카테고리의 다른 글
Model 1 , Model 2, MVC (0) | 2019.11.27 |
---|---|
<bean> 엘리먼트 속성 (0) | 2019.07.06 |
Spring 프레임워크 기본구조 (0) | 2019.06.22 |