본문 바로가기
Back-End/Spring Framework

[Spring 초급]

by 언니팬더 2015. 12. 29.

스프링이란 ?

= 애플리케이션 프레임워크 : 어떤 어플리케이션에도 적용이 가능하다. 

= 복잡한 절차를 요구하는 Enterprise Java Bean에 비해 사용이 간단한 경량 컨테이너,


sample1. 일반적 Java Bean 사용

 일반적인 java프로그램으로 으로 만들어진 간단한 프로그램

HelloApp.java

1
2
3
4
5
6
public class HelloApp {
    public static void main(String[] args) {
        MessageBean bean = new MessageBean();
        bean.sayHello("Spring");
    }
}



MessageBean.java

1
2
3
4
5
public class MessageBean {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
}





실행 결과


HelloApp Class <=====> MessageBean Class

객체가 서로 강한 결합으로 묶여 있다. 


MessageBean클래스의 인스턴스를 new를 이용해 직접 생성한 후 sayHello()매서드를 호출 

= HelloApp클래스가 MessageBean클래스의 구현에 강하게 의존하게 된다(강한 결합)

= 클래스간 결합이 강해져 의존하고 있는 클래스에 변경이 생기면, 코드를 수정해야 하는 범위가 넓어질 가능성이 높아진다. 

ex> MessageBean클래스가 아닌 다른 클래스로 변경하게 되면 

     그 클래스 안에 sayhello()매서드가 구현되고 있다는 보장이 없다.


결론 : 인스턴스를 통해 이용하는 쪽과 이용당하는 쪽의 의존성을 약하게 만들어야 한다. 


sample2. 인터페이스 사용

 클래스 간 의존성을 약하게 만들기 위해 인터페이스를 사용

HelloApp.java

1
2
3
4
5
6
public class HelloApp {
    public static void main(String[] args) {
        MessageBean bean = new MessageBeanKr();
        bean.sayHello("Spring");
    }
}

cs


MessageBean.java 
1
2
3
public interface MessageBean {
    public void sayHello(String name);
}
cs

MessageBeanEn.java

1
2
3
4
5
public class MessageBeanEn implements MessageBean {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
}
cs

MessageBeanKr.java

1
2
3
4
5
public class MessageBeanKr implements MessageBean {
    public void sayHello(String name) {
        System.out.println("안녕하세요, " + name + " 씨 .");
    }
}
cs

실행 결과



HelloApp Class <=====> MessageBean Interface(MessageBean 클래스를 Interfacefh qkRna)

> MessageMeanEn Class

> MessageMeanKr Class

객체가 서로 약한 결학으로 연결된다. 



sample3. 스프링 사용

HelloApp.java

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
 
public class HelloApp {
 
    public static void main(String[] args) {
 
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
        MessageBean bean = factory.getBean("messageBean", MessageBean.class);
        bean.sayHello("Spring");
    }
}
cs

MessageBean.java
1
2
3
public interface MessageBean {
    public void sayHello(String name);
}
cs

MessageBeanEn.java

1
2
3
4
5
public class MessageBeanEn implements MessageBean {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
}
cs

MessageBeanKr.java

1
2
3
4
5
public class MessageBeanKr implements MessageBean {
    public void sayHello(String name) {
        System.out.println("안녕하세요, " + name + " 씨 .");
    }
}
cs

실행 결과


HelloApp Class <===[Spring]==> MessageBean Interface

> MessageMeanEn Class

> MessageMeanKr Class

객체가 서로 약한 결학으로 연결된다. 


스프링 사용시 장점
애플리케이션에서 필요한 클래스를 준비하는 일반적인 방법
프로그램에서 필요한 클래스를 준비한다.
그 클래스의 역활에 관한 코드를 작성하기 전에 필요한 인스턴스를 준비하는 코드를 짜야함

But 

스프링을 사용하게 되면 인스턴스를 준비하는 역할을 스프링이 맡는다. : 인스턴스 준비 코드를 작성할 필요가 없다. 
new을 사용해 인스턴스를 생성하거나, 디자인 패턴을 이용해 인스턴스를 취득하는 코드를 만들지 않아도 된다. 

new를 사용할 때  : 구상 클래스 이름을 직접 코드에 기술한다. 

기술하지 않으면 실제 사용하는 클래스를 몰라도 된다.
= 클래스간 결합이 약해져서 의존관계가 약해진다. 
= 변경이 용이하고, 테스트가 간편하며, 콤포넌트 재 사용성이 높은 유연한 애플리케이션을 만드는 것이 가능해진다. 
= 객체를 변경할 떄도 코드를 다시 작성하지 않고 스프링 설정 파일만 변경하면 된다. 

스프링 활용 
: 인터페이스 기반 설계의 이해가 가장 중요
: 의존 관걔는 구상 클래스가 아닌, 인터페이스를 통해 이루어진다. 
: 클래스 사용시에는 인터페이스를 통해 사용하려는 클래스의 메서드를 호출한다.( 구상 클래스에 대해서 기술할 필요가 없음)