개발자는 전통적인 자바 엔터프라이즈 개발에서 유지 보수와 테스트가 쉽도록 구조가 제대로 된 애플리케이션을 만들 책임이 있다. 비지니스와는 무관한 이런 요구 사항(비기능 요구사항)을 만족시키기 위해 개발자는 다양한 디자인 패턴을 사용하지만 다양한 디자인 패턴을 사용해도 생산성이 낮아질 뿐 아니라 개발한 애플리케이션의 품질까지 낮아지곤 한다.
스프링 프레임워크는 자바 엔터프라이즈 애플리케이션 개발을 단순하게 해주는 오픈 소스 애플리케이션 프레임워크다. 스프링을 사용하면 독립 실행 자바 애플리케이션, 웹 애플리케이션, applet, 다양한 유형의 자바 애플리케이션을 개발할 수 있다.
스프링의 중심에는 IoC(Inversion of Control, 제어의 역전) 컨테이너가 있다. IoC 컨테이너는 DI(Dependency Injection, 의존성(의존관계) 주입) 기능을 제공한다.
모듈 그룹 | 설명 |
핵심 컨테이너 | 스프링의 기반을 이루는 모듈을 포함. 이 그룹에 spring-core와 spring-beans 모듈은 스프링 DI 기능과 IoC 컨테이너 구현을 제공 spring-expression 모듈은 스프링 애플리케이션에서 애플리케이션 객체 설정에 사용하는 SpEL(Spring Expression Language) 지원을 제공한다. |
AOP 및 계측 | AOP과 클래스 계측을 지원하는 모듈을 포함. spring-aop 모듈은 AOP 기능, spring-instrument 모듈을 클래스 계측 지원을 제공. |
메시징 | 메시지 기반 애플리케이션을 쉽게 개발하도록 도와주는 spring-messaging 모듈을 포함 |
데이터 접근/통합 | 데이터베이스나 메시징 공급자와의 상호 작용을 쉽게 해주는 모듈을 포함. spring-jdbc 모듈은 JDBC를 사용한 데이터 베이스 사용을 단순화 해 주고, spring-orm 모듈은 하이버네이트나 JPA와 같은 ORM(Objeect-Relation Mapping) 프레임워크 통합을 제공 spring-jms 모듈은 JMS 공급자와의 상호 작용을 쉽게 만들어준다. spring-tx모듈은 프로그램을 통해 트랜잭션 관리를 선언적으로 할 수 있다. |
웹 | 이 그룹에는 spring-web, spring-webmvc, spring-webflux, spring-websocket 모듈이 있다. spring-webmvc 모듈은 servlet 기반의 웹 애플리케이션과 RESTful 웹 서비스 개발(Blocking 방식)을 용이하게 해주며 spring-webflux 모듈은 반응형(Non-Blocking 방식) 웹 애플리케이션과 RESTful 웹 서비스 개발을 쉽게 해준다. spring-websocket 모듈은 웹소켓 프로토콜을 사용하는 웹 애플리케이션 개발 지원 spring-web 모듈은 모든 웹 모듈이 공통으로 사용하는 클래스와 인터페이스 정의 |
테스트 | 단위/통합 테스트를 도와주는 spring-test 모듈이 있다. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package sample.spring.chapter01.bankapp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class FixedDepositController {
private static Logger logger = LogManager.getLogger(FixedDepositController.class);
private FixedDepositService fixedDepositService;
public FixedDepositController() {
logger.info("initializing");
}
public void setFixedDepositService(FixedDepositService fixedDepositService) {
logger.info("Setting fixedDepositService property");
this.fixedDepositService = fixedDepositService;
}
public boolean submit() {
return fixedDepositService
.createFixedDeposit(new FixedDepositDetails(1, 10000, 365, "someemail@something.com"));
}
public FixedDepositDetails get() {
return fixedDepositService.getFixedDepositDetails(1L);
}
}
|
cs |