Web Programming/Spring

의존성 관리

myHyem 2019. 7. 6. 19:57

Spring의 의존성 관리 방법에 대해 이야기해 보겠습니다.

 

Spring은 IoC ( 제어의 역행 )을 지원하여 객체의 생성과 의존관계를 컨테이너가 자동으로 관리합니다.

이 IoC는 두 가지 형태로 지원됩니다.

출처 : https://limmmee.tistory.com/13

  • 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