스프링(Spring) 프레임워크 & DI(Dependency Injection)패턴
스프링에 대한 설명.
스프링의 모태는 Rod Johnson은 "Expert One-on-One J2EE Development without EJB" 라는 책을 통해 EJB없이 자바 엔터프라이즈 어플리케이션을 개발하는 방법을 소개했다.
스프링(Spring)은 엔터프라이즈 어플리케이션에서 필요로 하는 기능을 제공하는 프레임워크. JEE(Java Enterprise Edition)가 제공하는 다수의 기능을 지원, 대체 프레임워크로 자리잡았다. (3.0때 이야기)
스프링 컨테이너는 자바 개체의 생성, 소멸과 같은 라이프 사이클을 관리하며, 스프링 컨테이너로부터 필요한 객체를 가져와 사용할 수 있다.
스프링은 DI(Dependency Injection)를 지원한다. 설정 파일이나 어노테이션을 통해 객체 간의 의존관계를 설정할 수 있도록 하고 개체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
또한 AOP(Aspect Oriented Programming)를 지원한다. 자체적으로 AOP를 지원하며 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심은 아닌 기능들을 분리해서 각 모듈에서 사용할 수 있도록 지원한다.
POJO(Plan Old Java)를 지원함으로써 스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나 클래스를 상속받지 않아도 된다. 기존에 작성한 코드 수정 없이 스프링을 사용할 수 있다.
트랜잭션에 대한 일관된 방법을 제공하므로써 트랜잭션 구현에 상관없이 동일한 코드를 여러 환경에서 사용할 수 있다.
JDBC, iBATIS(mybatis), 하이버네이트, JPA등 데이터베이스 처리를 위해 널리 사용되는 라이브러리와 연동을 지원한다.
DI패턴 적용의 예.
public CrawlerServiceImpl {
private CarInsDao carInsDao;
//생성자에서 의존하는 객체를 전달받아 할당
public CrawlerServiceImpl(CarInsDao carInsDao) {
this.carInsDao = carInsDao;
}
...
}
의존하는 객체를 전달받기 위한 생성자를 제공, 의존 객체를 직접 생성하지 않고 단지 의존 객체를 전달받을 수 있는 메서드나 생성자만을 제공할 뿐. (중요)
결합도를 낮추기 위한 좋은 방법.
스프링 설정 파일 (applicationContext.xml)
스프링은 코드나 설정 파일을 이용하여 객체 간의 의존 관계를 설정할 수 있다.
<bean name="CrawlerService" class="com.zend4u.CrawlerServiceImpl">
<constructor-arg>
<ref bean="carInsDao" /> <!-- 생성자에게 전달할 파라미터를 명시 -->
</constructor-arg>
</bean>
<bean name="carInsDao" class="com.zend4u.CarInsDao"> </bean>
사실 스프링 부트를 이용해서 어플리케이션을 작성해본 결과 applicationContext.xml은 사용하지 않았는데, 검색을 통해 찾아보면 꽤 많은 xml을 이용해서 bean설정 예가 있다. 이런 부분은 따로 또 학습이 필요해 보인다. 하다 보면 알 수있는 내용인지는 모르겠다.
스프링은 각각의 객체를 빈(bean)으로 관리하는데 <beans>태그는 스프링 설정 파일의 루트 태그로 <bean> 태그는 스프링이 관리할 하나의 객체를 설정하는데 사용된다. (Android에서 Activity를 Manifast.xml에 등록하는 것과 같은 건가? ㅋㅋ)
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
factory.getBean("...");
...
'프로그래밍 > Spring' 카테고리의 다른 글
@Autowired 어노테이션 (0) | 2018.12.18 |
---|---|
@Required 어노테이션 (0) | 2018.12.18 |
Bean 범위(scope) (0) | 2018.12.18 |
스프링(Spring) 컨테이너 (0) | 2018.12.17 |
AOP(Aspect Oriented Programming)와 스프링(Spring) (0) | 2018.12.17 |