스프링은 자바 기반의 웹 어플리케이션을 만들 수 있는 프레임워크다.
spring.io
사이트에서 확인하면 '스프링 프레임워크는 현대 자바 기반의 엔터프라이즈 어플리케이션을 위한 프로그래밍 및 Configuration Model 제공한다.'라고 언급하고 있다.
Spring Architect
Spring 프레임워크는 여러 모듈로 구성되어 있으며, 각각의 모듈은 특정한 기능과 역할을 수행한다. 가장 핵심적인 모듈은 다음과 같다
Core Container
: Spring의 핵심 기능을 제공한다. Bean 관리, 의존성 주입(Dependency Injection), 이벤트 처리, 리소스 관리 등을 포함한다.
AOP (Aspect-Oriented Programming)
: 관점 지향 프로그래밍을 지원하는 모듈로, 애플리케이션의 핵심 비즈니스 로직과 각각의 부가적인 기능을 분리하여 모듈화할 수 있다. 이를 통해 코드의 재사용성을 높이고 관심사의 분리를 도모한다.
Web
: 웹 애플리케이션 개발에 필요한 기능을 제공한다. 웹 애플리케이션의 MVC (Model-View-Controller) 아키텍처를 지원하며, 요청 처리, 세션 관리, 데이터 바인딩, 검증, 보안 등을 처리한다.
Data Access/Integration
: 데이터베이스 연동과 관련된 작업을 처리하기 위한 기능을 제공한다. JDBC
, ORM
프레임워크 (예: Hibernate
), 트랜잭션 처리 등을 지원하여 데이터베이스와의 상호작용을 단순화한다.
Test
: 단위 테스트를 위한 기능을 제공한다. JUnit
등과 통합하여 테스트 코드 작성 및 실행을 지원한다.
스프링 프레임워크의 특징은 아래와 같다.
POJO(Plain Old Java Object) 방식
: POJO는Java EE
의 EJB 를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하며 나타난 용어다. 별도의 프레임워크 없이Java EE
를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다.
[필드, Getter, Setter 만 존재하는 POJO]public class Person { private String name; private int age; public String getName(){ return name; } public String getAge() { return age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } }
관점 지향 프로그래밍(Aspect Oriented Programming, AOP)
: 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다.AspectJ
를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다.
[AOP 예 시]class OrderApp{ ... public void 주문하기() { //공통 관심 사항 로깅 관련 코드 보안 관련 코드 //핵심 관심 사항 주문 관련 로직 } public void 주문_변경하기() { //공통 관심 사항 로깅 관련 코드 보안 관련 코드 //핵심 관심 사항 주문 변경 관련 로직 } public void 메뉴_등록하기() { //공통 관심 사항 로깅 관련 코드 보안 관련 코드 //핵심 관심 사항 메뉴 등록 관련 로직 } }
의존성 주입(Dependency Injection, DI)
: 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.
제어 역전(Inversion of Control, IoC)
: 전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
[DI + IoC example]// (1) A 가 사용하는 메소드를 인터페이스 I의 추상 메소드로 정의한 다음 (추상화) interface I { void example(); } class A { // (3) 그 다음, 인터페이스 타입의 필드를 선언하고, private I i; // (4) 생성자를 통해 외부로부터 인스턴스를 받아와 i를 초기화해준다. (다형성) public A (I i) { this.i = i; } public void methodOfA() { // (5) 외부로부터 받아온 인스턴스의 메소드를 호출 i.example(); } } // (2) A 가 사용하는 메소드를 가진 객체들이 I 를 구현하도록 한다. class B implements I { public void example() { ... } } class C implements I { public void example() { ... } }
생명주기 관리
: 스프링 프레임워크는Java
객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용할 수 있다.