DI (Dependency Injection) Spring에서 적용하기
반응형

 

DI (Dependency Injection)

스프링에 들어가기 앞서, 스프링의 기본 원리인 DI에 대해 살펴보자.

보통 클래스로부터 객체 생성, 이때 이 객체(X)가 여러 객체(Y, Z)에 의존관계가 있을때 (Y, Z 객체를 사용할 때)

1) 객체 X가 필요할 때 직접 Y, Z를 생성

2) 외부에서 객체 Y, Z를 생성하고 X객체에서 사용

이때 2번처럼 외부에서 객체를 생성해 넣는 것을 주입(Injection)이라 한다.

따라서 의존성을 주입한다 해서 DI(Dependency Injection)인 것이다.

이런 DI의 장점은 다음과 같다

  • 재사용성 증가
  • 코드 읽기 쉬움, 단순화
  • 더 많은 테스트 코드
  • 종속성 감소 (엮인 관계가 적음 -> 변경시 조금만 바꾸면 됨)

[활용예시 1. setter]

class X{
    Y y;
    public void sety(Y y){
        this.y = y
    }   
}

[활용예시 2. 생성자]

class X{
    Y y;
    public X(Y y){
        this.y = y;
    }
}

이때 주입하는 객체들을(Y, Z...) 부품이라 생각하면, 부품들을 정의해놓은 것이 IOC 컨테이너라 할 수 있다.

스프링에서는 이 객체를 주입하는 외부, IOC 컨테이너를 사용하여 이러한 원리를 바탕으로 프로그래밍한다.

 

DI 실습 (XML 사용)

예시를 통해서 살펴보자. 일단 Example 클래스를 정의한다.

public class Example {
    public String name;
    public Example(String name){
        System.out.println("객체 생성");
        this.name = name;
    }

    public void setName(String name){
        this.name = name;
    }

    public void printName(){
        System.out.println("객체의 이름은 : " +name);
    }
}

이제 XML 파일을 사용하여 클래스들을 내부에 정의해준다.

위치는 src/resources에 만들어준다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id ="example" class="com.birdmissile.demo.Example"> <!-- 변수설정-->
        <property name="name" value="example name"/> <!--필드설정-->
    </bean> 
</beans>

이제 실제로 main 메소드를 실행하여 클래스를 사용해주자.

public static void main(String[] args) {
        String location = "classpath:appCTX.xml"; //xml 파일의 위치
        //xml을 parsing해주는 클래스
        AbstractApplicationContext context = new GenericXmlApplicationContext(location);
        //getBean으로 받아오기
        Example ex = context.getBean("example", Example.class);
        ex.printName();
        context.close();
} 

잘 실행이 된다

 

이때 자바 이외 파일들의 경로에서 classpath: ~ 를 많이 사용한다.
classpath란 컴파일된 class 파일들의 위치 경로이다. 한마디로, 컴파일된 파일의 경로를 달라는 뜻이다.
.classpath에 그 내용이 저장되어 있어서, 기본적으로 target/classes에 저장되는것을 확인할 수 있다.

예로 아래의 경우 src/main/java의 파일을(src)  target/classes 로 컴파일한다는 것을 확인할 수 있다

 

추가적인 프로퍼티 설정 예시들은 다음과 같다. [언제나 클래스에 setter가 정의되어 있어야 한다!!!!!!!]

<bean id ="anotherclass" class="com.birdmissile.demo.AnotherClass"/>

<bean id ="example" class="com.birdmissile.demo.Example"> <!-- 변수설정-->
    <property name="name" value="example name"/> <!--필드설정-->

    <property name ="anotherclass"> <!--다른 빈 객체 사용-->
        <ref bean = "anotherclass"/> <!--물론 위에처럼 미리 정의되어있어야 함-->
    </property>

    <property name ="lists"> <!--리스트 사용-->
        <list>
            <value>리스트1</value> <!--스프링이 알아서 자료형으로 변환해줌-->
            <value>리스트2</value>
        </list>
    </property>
</bean> 

프로퍼티를 설정할 때 생성자가 정의되어 있으면 이런 방식으로 사용할 수 있다.

<bean id ="example" class="com.birdmissile.demo.Example">
    <constructor-arg> <!--순서는 매개변수 순서이다.-->
        <value>새 이름</value>
    </constructor-arg>
</bean>

 

DI 실습 (JAVA 사용)

JAVA를 사용하여 DI설정 역시 가능하다. 이런 식으로 클래스를 정의한 다음

@Configuration    //스프링 설정에 사용한다고 명시해야함.
public class AppConfig {
    @Bean
    public Example example2(){
        Example example2 = new Example();
        example2.setName("example name2");

        return example2;
    }
}

사용시에 GenericXml이 아닌, AnnotationConfig클래스를 이용하면 된다.

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

XML과 JAVA를 함께 쓰고 싶으면 아래와 같이 할 수 있다.

1) XML 파일에 JAVA 파일을 포함시키기 -> 이후 XML로 사용

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!--context추가-->

<context:annotation-config />
<bean class = "com.birdmissile.demo.AppConfig"/>

2) JAVA 파일에 XML 파일을 포함시키기 -> 이후 JAVA로 사용

import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource(value = {"classpath:appCTX.xml"})

 

반응형