yoursyun

Spring의 사용 본문

program/spring

Spring의 사용

yoursyun 2013. 10. 28. 16:16

Spring의 사용


스프링 개발 환경 설정은 다음의 포스트를 참조한다. http://yoursyun.tistory.com/94


1. 스프링은 Factory Parttern 에 대하여 스프링이 Bean(인스턴스)를 구현한다.
우리가 객체지향개발에서 Class 에 대해 인스턴스화 할때,

ClsHello Bean = new ClsHello();

와 같이 사용을 한다.


이와 같은 강한 결함(의존)관계는 추후에 유지 보수에 많은 어려움을 따르게 하므로,

아래와 같은 사용방법을 추천 하고 있다.

InterFaceHello Bean = new ClsHello(); // 여기서 ClsHello 는 interFaceHello 를 Extends 받는다.

위와 같은 개발 형태의 장점은 Bean (인스턴스) 에 상속받은 다양한 클래스를 입력 함으로써 결합(의존) 관계를 느슨 하게 할 수 있다.


[ example 1 ]
MessageBean[] bean = new MessageBean[3]; // 3 개의 interface 를 생성한다.
bean[0] = new MessageBeanEn();
bean[1] = new MessageBeanKr();
bean[2] = new MessageBeanJp();

for (MessageBean messageBean : bean2) {
    messageBean.sayHello();
}

위와 같은 형태로 개발 할때 잇점은 여러가지가 있으니 인터넷에서 좀더 자세히 검색해 보도록 한다.


Spring 은 example 1 과 같이 사용 하고자 할 때 new XXX() 부분 (클래스 명)을 직접적으로 기술 하지 않음으로써 더욱 의존도를 낮추게 됩니다.

이는 다른 클래스 명으로의 변경을 용이 하게 합니다.


이를 스프링에서는 아래와 같이 구현 합니다.

[ example 2 ]

( 소스코드 )
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("bean.xml"));

MessageBean[] bean = new MessageBean[3]; // 3 개의 interface 를 생성한다.
bean[0] = factory.getBean("MessageBeanEn", MessageBean.class);
bean[1] = factory.getBean("MessageBeanKr", MessageBean.class);
bean[2] = factory.getBean("MessageBeanJp", MessageBean.class);

for (MessageBean messageBean : bean2) {
    messageBean.sayHello();
}

( bean.xml )
<bean id="M
essageBeanEn" class="example.MessageBeanEnglish" />
<bean id="MessageBeanEn" class="example.MessageBeanKorean" />
<bean id="MessageBeanEn" class="example.MessageBeanJapen" />

불행히도 코드가 길어 보이지만, 예를 들어 class명이 변경되었다면. bean.xml 만을 수정 하여 소스 코드를 수정 할 수 있습니다.

2. 스프링 DI (Dependancy Injection)
의존성 주입 이라고 하며, POJO 형태로 ( Setter, Getter Property ) 주입 받도록 개발이 가능 하다.
생성자 주입, 설정 메서드 주입이 있으며, 아래의 예는 설정 메서드를 통한 주입이다.
( 참고 : 인터페이스는 작성 하지 않았다. )

[ example 3 ]

( 소스코드 )
public class A {
    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("bean.xml"));
        MessageBean bean = factory.getBean("MessageBeanEn", MessageBean.class);
    }
}

public class A extends MessageBean {
    private DI diBean; // B Class를 담을 Interface 선언

    // 설정 메서드를 통한 주입
    public void setDiBean(DI diBean){
        this.diBean = diBean;
    }
}

public class B extends DI {
    public void hello() { System.out.println("hello"); }
}
==========================================================================================
( bean.xml )
<bean id="MessageBeanEn" class="example.A">
    <property name="diBean">
        <ref local="diBean" />
    </property>
</bean>

<bean id="diBean
" class="example.B" />


3. ApplicationContext 인터페이스

Spring MVC ( 웹개발 ) 시에도 사용 되며,
이를 통한 이점으로, 메시지국제화, 이벤트처리.. 등등이 있다고 합니다. 이는 따로 연구 해보면 될것 같고,
웹개발시에도 사용 되므로 위 ApplicationContext 인터페이스 사용은 간단하므로, 코드상 차이점만을 보겠습니다.


[ example 4 ]

( 소스코드 )
public class A {
    public static void main(String[] args) {

        // 아래 코드를
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("bean.xml"));
        MessageBean bean = factory.getBean("MessageBeanEn", MessageBean.class);

        // 아래와 같이 변경하여 사용 하면 ApplicationContext interface를 사용하게 된다.
        ApplicationContext factory = new FileSystemXmlApplicationContext("bean.xml");
        MessageBean bean = (MessageBean)factory.getBean("MessageBeanEn");
    }
}


4. @Autowired 어노테이션 사용

"3. ApplicationContext 인터페이스" 의 사용 목적중 하나 입니다.
@Autowired 를 이용하기 위해서는 ApplicationContext 인터페이스 를 사용 해야하며,
@Autowired 를 이용하면, bean.xml 에 있는 다음의 구문을 작성 할 필요가 없습니다.

( bean.xml )

<bean id="MessageBean" class="example.A">
    <!-- DI 선언 삭제 구문 시작 ================ -- >
    <property name="diBean">
        <ref local="diBean" />
    </property>
    
<!-- DI 선언 삭제 구문 끝    ================ -- >
</bean>
( bean.xml 에 추가되어야할 구문)
<context:annotation-config />
<bean id="MessageBean" class="example.A" autowire="byName">
( 선언 추가 확인)
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd

위를 통해 xml 에 DI 를 설정하기위한 번거러움을 피할 수 있다.


5. Spring AOP (Aspect Oriented Programming) 

관점지향프로그래밍은 객체지향을 대신하는게 아닌 보완재 이다.

아주 간단하게 보자면,

A, B, C 라는 클래스의 특정 Method가 실행 되고자 할때, 실행시, 종료시 등의 각 시점별로
D라는 클래스가 공통적으로 생성 Method가 실행 되어져야 할 경우, Spring AOP를 활용하면, 효과적으로

각 클래스에 대한 관심을 공통적으로 부여 할 수 있다. ( A, B 로 분리도 가능 하며, 각 관심사에 따라 사용 할 수 있다. )















반응형