스프링프레임웍
태그 :
- 개념
- - EJB 기반의 복잡함과 무거움을 극복하고 개발생산성 향상과 고품질의 시스템 개발을 위한 자바 플랫폼 상의 경량화된 오픈소스 웹 어플리케이션 프레임워크 - 안정성과 유연성이 입증되어 전자정부 표준 개발 프레임워크의 핵심 근간으로 활용
1. 자바 기반 경량화된 컨테이너의 선두주자, Spring 프레임워크
가. Spring 프레임워크의 개념
- EJB 기반의 복잡함과 무거움을 극복하고 개발생산성 향상과 고품질의 시스템 개발을 위한 자바 플랫폼 상의 경량화된 오픈소스 웹 어플리케이션 프레임워크
- 안정성과 유연성이 입증되어 전자정부 표준 개발 프레임워크의 핵심 근간으로 활용
나. Spring 프레임워크의 특징
구분 |
설명 |
비고 |
객체 관리 |
컨테이너에서 직접 객체 관리(생성/소멸) |
개발자의 객체 생성 및 소멸 관리 부담 감소 |
제어 반전 (IoC) |
컨트롤의 제어권이 프레임워크에 존재 |
스프링에서 사용자 코드 호출 가능 |
의존성 주입 (DI) |
각각의 계층이나 서비스들 간에 의존성 존재할 경우 프레임워크가 상호 연결시켜줌 |
XML 파일을 통한 환경설정 |
관점지향 프로그래밍 (AOP) |
여러 모듈에서 공통적으로 사용하는 기능의 분리 지원 |
추상화된 트랜잭션 관리, 로깅, 보안 등의 공통 기능 활용 |
영속성 |
데이터베이스 처리 라이브러리와 인터페이스 제공 |
JDBC, iBatis, Hibernate 등에 대한 지원 |
- 작고 쉬운 과거의 자바 개발 환경을 따르자는 POJO(Plain Old Java Object) 기반의 특징을 가짐
[EJB 단점을 극복하는 Spring 프레임워크의 특징]
구분 |
EJB의 단점 |
Spring의 특징 |
코드 개발 |
EJB 구현 위해 실질적인 클래스 외에 3개 이상의 클래스 추가 생성 필요 |
경량화된 컨테이너로 코드 개발의 양이 줄고, 쉬워짐 |
테스트 |
테스트는 EJB 컨테이너에 배포 후 가능 (개발 생산성 저하) |
TDD(Test Driven Development)와 CI(Continuous Integration) 사상 지원 |
실행 속도 |
분산 환경 지원 위한 Client와 Server 간 직렬화로 어플리케이션 속도의 저하 |
서비스 및 어플리케이션 간 의존성 및 결합도 감소로 실행 속도 저하 없음 |
확장성 |
대형 벤더들의 실행속도 향상 위한 개별 기능 추가로 EJB 기반 어플리케이션 간 이식성 저하 |
수많은 라이브러리 내장 및 별도 분리 지원으로 스프링 프레임워크에 통합이 용이 |
- EJB가 지원하는 모든 기능들을 내포하며 단점을 개선하고 대체하는 특징을 가짐
2. 경량화된 개발이 가능케 하는 Spring 프레임워크의 구성
가. Spring 프레임워크 구성 모듈
- 객체지향 기반으로 유연한 개발 및 확장성을 제공, 주요 사상으로는 AOP와 IoC를 꼽을 수 있음
나. Spring 프레임워크 구성 모듈별 기능과 역할
구성 모듈 |
기능 및 역할 |
세부 기능 및 사례 |
DAO |
- 단순화된 JDBC 기능 - 대부분의 ORM 프레임워크와 통합 - 트랜잭션 관리 기능 |
- JTA에 대한 ‘global’ transaction 지원 - 단일 데이터 소스에 대한 ‘local’ transaction 지원 |
ORM |
- 객체 관계형 모델 지원 - 다양한 DB 접속 방식 및 인터페이스 지원 |
- Hibernate, JDO, Oracle Toplink, iBatis, JPA 등 |
J2EE |
- 원격접근 - EJB 대체 및 통합 - 스케줄링 및 동적 언어 지원 - 테스트 기반환경 제공 |
- 다양한 프로토콜에 대한 POJO 기반 원격접근 - JUnit 통합, DI에 의한 용이한 테스팅 - 어플리케이션 서버 밖에서 통합 테스트 지원 |
WEB |
- Spring Web MVC - 이벤트 기반 프레임워크 - 타 웹 어플리케이션 프레임워크와 대체 통합 |
- Request 기반 프레임워크 - JSP, PDF, Excel 등 다양한 View 기술 지원 - Struts, WebWork, JSF 등 |
Core(IoC) |
- IoC(Inversion of Control) Container - 객체간 의존성 감소로 코드 변경에 유연한 대처 가능하고 재사용 가능성 제고시킴 - 컨테이너가 객체의 생성부터 소멸까지 관리 - 컴포넌트를 개별적으로 테스트 가능 |
- The Hollywood Principle: “Don’t call me, I will call you” - 컨테이너에 의한 Dependency Injection(의존성 주입) |
AOP |
- 트랜잭션 관리, 로깅 등과 같은 관심사에 대한 모듈화 - 횡단 관심사의 분리로 코드 변경 없이 더해지거나 제거 가능(유지보수성, 변경 용이성) |
- Crosscutting Concern - Aspect = Advice + Pointcut - Join Point, Pointcut, Weaving - AspectJ(사실상 표준) |
3. Spring 프레임워크의 핵심 구성 모듈(Core Modules)
가. SW 컴포넌트 결합도를 낮추기 위한 제어의 역전 현상, IOC(Inversion of Control) 모듈
- 객체의 생성에서부터 생명주기의 관리까지 모든 객체에 대한 제어권이 개발자로부터 컨테이너로 넘어간 현상
- 서블릿, EJB 컨테이너는 서블릿과 EJB에 대한 제어권만 컨테이너가 담당하고 객체에 대한 제어권을 개발자들이 직접 담당
- Spring 컨테이너는 일부 POJO에 대한 제어권만을 가지고 대부분의 POJO에 대한 제어권은 개발자에게 있는 상태
[IoC 컨테이너의 분류체계]
- DL(Dependency Lookup)은 저장소에 저장되어 있는 빈(Bean)에 접근하기 위해 개발자들이 컨테이너에 제공하는 API를 이용하여 사용하고자 하는 빈(Bean)을 Lookup하는 것(컨테이너에서 제공하는 API와 의존관계 증가)
- DI(Dependency Injection)는 각 클래스 사이의 의존관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결시켜주는 것(개발자들이 컨테이너 API를 이용하여 의존관계에 관여할 필요가 없어 API 종속성 감소)
[Dependency Injection의 유형]
유형 |
기능 |
Setter Injection |
클래스 사이의 의존관계를 연결시키기 위한 방법 |
Constructor Injection |
생성자를 통하여 클래스 사이의 의존관계를 연결시키는 방법 |
Method Injection |
Singleton 인스턴스와 Non Singleton 인스턴스의 의존관계를 연결시키는 방법 |
나. 공통 기능의 재사용성 높여 주는 관점지향프로그래밍, AOP(Aspect Oriented Programming)
- 로깅이나 트랜잭션관리, 보안 등과 같은 시스템 공통 서비스(횡단관심사)를 컴포넌트 고유의 기능과 분리하여 유연하게 호출 / 재사용 가능하도록 해주는 프로그래밍 방식
- 시스템 서비스를 모듈화해서 컴포넌트에 선언적으로 적용할 수 있게 해 줌으로써 응집도가 높고 본연의 관심사에 집중하는 컴포넌트를 개발하는 방식
[AOP 개념도]
구분 |
설명 |
구현 및 사례 |
Primary Concern |
- 시스템의 핵심가치와 목적 영역 - 컴포넌트 고유의 역할 및 기능 |
- 구현물을 Code라 부름 - 수강신청 서비스, 교과과정 서비스, 강사 서비스, 교육내용 서비스 등 |
Crosscutting Concern |
- 횡단 관심사 - 시스템에서 공통으로 사용되는 요구사항 |
- 구현물을 Advice라 부름 - 트랜잭션 관리자, 보안모듈, 로깅모듈 등 |
Pointcut |
- 횡단 관심사에 대한 Advice를 Code의 어디에 위치시킬 것인지를 결정 |
- Joinpoint 결정 |
Weaving |
- Advice와 Code를 Pointcut 정보를 이용하여 결합 |
- 시점에 따라 컴파일시, 클래스 로딩시, 런타임시로 구분 가능 |
- 객체지향프로그래밍 기법에서 횡단관심사 구현의 어려움을 극복해 주고, 코드의 혼란을 방지해 줌
- 컴포넌트로 하여금 고유 기능에 집중할 수 있게 해 주고 개발의 단순화와 생산성 향상 효과를 제공
4. Spring 프레임워크에 대한 활용 방안
- Spring 프레임워크은 분산 환경을 지원할 수 없다는 것이 가장 큰 단점
- 분산 환경을 지원하는 어플리케이션 개발 할 때 적은 비용으로 Spring 프레임워크를 활용 가능
- 어플리케이션의 모든 기능은 Spring 프레임워크 기반 하에서 우선 개발 하고 EJB나 웹 서비스 통해 클라이언트와 인터페이스만 하도록 구현함으로써 개발생산성, 테스트 용이성 확보 가능
- POJO 빈을 이용하여 비지니스 계층을 전담하게 함으로써 비지니스 계층의 재사용성을 극대화