*** 스프링(spring framework)이란?

* 스프링은 엔터프라이즈 어플리케이션에서 필요로 하는 기능을 제공하는 프레임워크이다.
* 스프링은 JEE가 제공하는 다수의 기능을 지원하고 있기 때문에, JEE를 대체하는 프레임워크로 자리 잡고 있다.

* 스프링은 JEE가 제공하는 기능 외에 DI나 AOP와 같은 기능을 지원하고 있다.

* 스프링의 주요 특징
  => 스프링은 경량의 프레임워크이다.
     .자바 객체를 담고 있는 컨테이너다
     .자바객체의 생성, 소멸과 같은 라이프 사이클을 관리한다.

 
  => 스프링은 DI(dependency Injection)패턴을 지원한다.

     .설정파일을 통해서 의존관계를 설정할 수 있다.
 
  => 스프링은 AOP(Aspect Oriented Programming)를 지원한다.
     .트랙잭션이나 로깅, 보안과 같은 공통으로 필요로 하는 기능을 분리해서 각각의 모듈에 적용할 수 있다.
 
  => 스프링은 POJO(Plain Old Java Object)를 지원한다.
     .특정 인터페이스나 클래스를 상속받지 않은 자바 객체를 스프링 컨테이너가 저장하고 있다.
 
  => 트랜잭션 처리를 위한 일관된 방법을 제공한다.
 
  => 영속성과 관련된 다양한 API를 제공한다.
     .JDBC, iBatis, Hibernate, JPA등과 같은 프레임워크와의 연동을 지원한다.


1. DI 지원 : 의존성주입(= Ioc (Inversion of Control : 제어역행))
  => DI는 스프링 컨테이너가 지원하는 핵심 개념 중 하나
  => DI는 객체 사이의 의존 관계를 객체 자신이 아닌 외부의 조립기(스프링 컨테이너)가 수행한다는 개념이다.
  => 스프링은 설정 파일이나 어노테이션을 이용하여 객체 간의 의존 관계를 설정할 수 있다.

/* 의존하는 객체를 코드에 직접 명시하는 경우 */

A has a B. (A B에 의존한다.)

=>의존하는 객체를 취할 때 사용하는 클래스(A)측에서 호출. 이를 제어순행이라고 함

 

DI는 의존하는 객체에 대한 취득(획득)의 책임이 사용하는 class에 있지 않고 스프링 컨테이너가 제공(주입)해 준다.

, A class에서 B class의 메소드를 사용하기 위해서는 B b = new B();를 통해 B class instance b를 생성해야 하는데 스프링의 DI A class를 생성할 때 B class instance(객체)를 생성하여 주입까지 해주는 기능. 그러므로 개발자는 A class에서 B b = new B();라는 식의 코드를 작성할 필요가 없이 스프링 컨테이너가 만들어 놓은 instance(bean)를 가지고 와서 사용만 하면 됨.(xml 설정을 통해서)

 
2.

Dao

<<interface>>

Interface사용을 통한 의존성 낮춤 : B class의 메소드 이름이 바뀌면 A class의 메소드 이름도 바뀌어야 한다.(즉 의존성이 높음). 이는 내가 의존하는 class가 바뀌면 그것을 사용하는 모든 class가 전부 수정해야 한다는 문제점을 가지고 있다. 이런 결합도가 높은 코드를 위해 interface 기반으로 만들어 결합도를 낮추어야 한다.


dao = new jdbcDao();

dao = new itatisDao();

ð  이런식으로 사용하면 의존성이 낮아짐. 스프링의 경우 컨테이너가 빈 팩토리 역할로 설정파일에서만 필요한 설정을 해주면 기존코드 변경하지 않고도 dao의 값(jdbc인지, ibatis인지)을 가져와 사용할 수 있음. 왜냐 객체의 의존성을 xml에서 설정가능 하기 때문이다.

ð  , 코드의 변경없이 xml의 설정만으로 개발자가 원하는 객체의 주입으로 바꿀 수 있음.



테스트를 위한 소스

TestDao.java



TestDaoImp.java


TestMain.java


test.xml


결과

TestMain.class의 코드를 보면 testDao.printMessage( ); 코드가 있는데 해당 class의 어떤 부분에서도 TestDao testDao = new TestDaoImp( ); 이라는 코드가 존재하지 않는다. 보통 해당 class의 메소드를 사용하기 위해서는 instance.메소드명( ) 이런식으로 사용하므로 반드시 instance(스프링에서는 bean 이라함)가 있어야 함에도 해당 소스상에 instance의 생성관련 코드가 없는 이유는 스프링 컨테이너가 해당 class의 instance(= bean)를 직접 생성하기 때문이다.(개발자가 생성할 필요가 없음)

스프링 컨테이너는 설정파일을 통해 해당 class의 bean를 생성하게 되는데 test.xml에 보면 test.TestDaoImp class의 bean을 id의 이름(testDaoImp)으로 생성하고 있다. 따라서 개발자는 해당 id(혹은 name)의 이름으로 getBean( )하여 instance(bean)를 가져와 사용만 하면 된다.


/** 편의를 위해 [객체 = instance = bean] 같은 의미 이므로 앞으로는 모두 bean으로 통일함 **/

+ Recent posts