spring
di
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Programming
Table of Contents
서론. 소개 #
본 글은 자바 개발에 편의를 제공하는 오픈소스 애플리케이션 프레임워크인 스프링의 기술 중 하나인 DI(Dependency Injection)에 대해서 알아보고 이해를 돕기 위한 글이다. 먼저 스프링에 대해서 간략하게 알아보고 이후 DI 개념과 예제를 알아보도록 한다.
본론. 스프링의 개념 #
그림1 로드 존슨의 저서 Expert One-on-One J2EE Design and Development
출처:http://jangsunjin.tistory.com/166
스프링 프레임워크는 로드 존슨이 자신의 저서인 Expert One-on-One J2EE Design and Development에 작성한 코드를 기반으로 최초 버전을 만들게 되었고 이전의 엔터프라이즈 애플리케이션 개발의 어려움을 해소하고 '자바 개발 간소화'를 위해 핵심이 되는 요소는 다음과 같다.
그림2 스프링의 핵심기술
출처:https://scroogy.atlassian.net/wiki/spaces/SPRING/pages/1114310
- POJO (Plain Old Java Object)
- IoC/DI (Inversion Of Control/Dependency Injection)
- AOP (Aspect Oriented Programming)
- PSA (Potable Service Abstraction)
그렇다면 핵심기술 중 DI의 개념은 무엇인지 살펴보도록 한다.
Spring DI (Dependency Injection) #
DI, 의존성 주입은 예를 들어 먼저 설명하면
public class A{
private B b;
A(){
b=new B();
}
}
B라는 클래스에서 C라는 클래스를 만들고 A클래스에서 C클래스를 사용해야 할 경우 코드를 수정해야 하기 때문에 확장성이 떨어진다.
new를 통한 의존성 주입 말고 setter를 이용해 의존성을 주입하는 것도 가능하다.
public class Factory{
private B electric;
public void setElectric(B electric){
this.electric = electric;
}
}
전체객체와 부분객체 사이에는 집합관계와 구성관계로 구분할 수 있다.
집합관계: 부분이 전체와 다른 생명 주기를 가질 수 있다.
구성관계: 부분은 전체와 같은 생명 주기를 가진다.
그림3 Dependency Injection
출처:http://private.tistory.com/39
스프링 프레임워크는 다른 객체들이 사용하고 사용할 수 있는 클래스를 컨테이너와 같은 형태로 이러한 기능을 제공합니다. 정리해보면 A라는 객체에서 B와 C객체를 사용(의존)할 때 A객체에서 직접 생성을 하는 것이 아닌 외부(IOC 컨테이너)에서 생성된 B, C객체를 주입시켜 setter 또는 생성자(new;확장성이 떨어진다)를 통해 사용할 수 있다. 이러한 과정에서 객체를 주입하는 과정을 DI라고 할 수 있겠다.
스프링은 XML 설정을 통해 의존성 주입을 쉽게 할 수 있는 방법을 제공하는 데 이는 참고할 수 있는 사진과 코드를 보면서 살펴보도록 하자. public class MyClass{ Home home; // Home이라는 객체가 있다고 가정 private String homeName; private String homeAddr; private String homeNumber; private String homeHost;
public void homeNameInfo(String homeName){
home.homeName(homeName);
}
public void homeAddrInfo(String homeAddr){
home.homeAddr(homeAddr);
}
public void homeNumberInfo(String homeNumber){
home.homeNumber(homeNumber);
}
public void homeHostInfo(String homeHost){
home.homeHost=homeHost;
}
public void setHome(Home home){
this.home=home;
}
-----------------------------------------------------
Home클래스에서
public void homeNameInfo(String homeName){
System.out.println("집이름은 "+homeName+" 입니다.")
}
public void homeAddrInfo(String homeAddr){
System.out.println("집주소는 "+homeAddr+" 입니다.")
}
public void homeNumberInfo(String homeNumber){
System.out.println("집 전화번호는 "+homeNumber+" 입니다.")
}
public void homeHostInfo(String homeHost){
System.out.println("집 주인은 "+homeHost+" 입니다.")
}
이렇게 되어있다고 할 때 xml에서
<!-- Home 클래스를 id를 지정하여 bean(객체) 생성-->
<bean id="home" class="Home 클래스 경로"/>
<!-- "MyClass 클래스 경로"클래스를 id를 지정하여 bean(객체) 생성-->
<bean id="myClass" class="MyClass 클래스 경로">
<!-- 위의 클래스 있는 필드들의 값을 설정해줌 -->
<!-- 첫 번째 property(필드) -->
<property name="home">
<!--처음 생성한 bean(객체)인 home를 참조하도록 설정 참조한다. -->
<ref bean="home"/>
</property>
<!-- myClass 필드의 이름과 값을 설정 -->
<property name="homeName" value="한남더힐" />
<property name="homeAddr" value="용산구 한남동" />
<property name="homeNumber" value="02-0000-0000" />
<property name="homeHost" value="홍길동" />
</bean>
이를 실행하게 된다면 결과는
집 이름은 한남더힐 입니다.
집 주소는 용산구 한남동 입니다.
집 전화번호는 02-0000-0000 입니다.
집 주인은 홍길동 입니다.
가 나오게 된다. 이는 외부에서 객체를 생성하여 사용할 객체에 주입후 사용하는 방법입니다. 이처럼 사용하게 된다면 homeName이나 homeAddr의 정보가 바뀐다면 XML 설정파일에서 정보만 바꿔주면 되기 때문에 확장성이 좋아지게 된다.
이렇게 spring/di 의존성에 대해서 간략하게 알아보았다.