개요
스프링은 J2EE 기반의 개발을 쉽게할 수 있게하는 프레임워크로 등장했습니다. J2EE(Java 2 Enterprise Edition) 는 자바 기술로 기업환경의 어플리케이션을 만드는데 필요한 스펙들을 모아둔 스펙 집합입니다. J2EE 를 이루는 대표적인 것들은 Servlet, JSP, EJB, RMI, JNDI, JDBC, JCA, JMS 등이 존재합니다.
그렇다면 스프링을 써서 얻을 수 있는 장점은 무엇이 있을가요?
스프링 장점
- 스프링은 자바 POJOs(Plain Old Java Object) 를 사용합니다. 이러한 이유로 기업 규모의 애플리케이션을 제작하는데 EJBs 에 비해서 상대적으로 쉽게 구축할 수 있습니다.
- POJO가 상대적으로 쉽게 구축할 수 있는 이유는 Java 언어 사양에 의해 강제된 것 외에는 어떠한 제한도 받지 않는 Java 객체이기 때문입니다. 따라서 POJO는 프레임워크에서 미리 지정된 클래스를 확장하거나 프레임워크에서 미리 지정된 인터페이스를 구현할 필요가 없습니다.
- dependency of injection 을 지원해서 loose coupling code 를 장려합니다.
- AOP 패턴을 사용해서 로깅, 감사, 트랜잭션, 보안, 캐싱등 비즈니스 로직을 쉽게 분리할 수 있습니다. AOP 에 대한 내용은 나중에 포스팅에서 다루도록 하겠습니다.
- boilerplate java code 를 최소와 합니다.
- 기존에 존재하던 ORM frameworks 와 logging frameworks, JEE, Quartz, JDK 등을 활용할 수 있습니다.
- Spring 프레임워크의 핵심 기능은 모든 자바 애플리케이션을 개발하는데 사용할 수 있지만 Java EE 플랫폼 위에 웹 애플리케이션을 구축하기 위한 확장기능이 존재합니다.
Some concepts of Spring
Dependency Injection (DI)
Inversion of Control (IOC) 컨테이너를 사용하여 의존성 주입을 사용할 수 있습니다. 의존성 주입으로 객체를 loosely coupled 하게 설계할 수 있습니다. runtime 에 인스턴스의 구체 클래스를 주입할 수 있습니다.
public class App {
private Service service;
// 해당 서비스의 구체객체는 Spring IOC Container 에 의해 런타임시에 결정됩니다.
public App (Service service) {
this.service = service;
}
}
Aspect Oriented Programming (AOP)
AOP 는 관점지향프로그래밍이라 불립니다. 어떤 로직이 존재할 때 로직을 부가적인 관점, 핵심적인 관점으 나누고, 관점을 기준으로 각각 모듈화 하겠다는 뜻입니다.
일반적인 비즈니스 로직에는 데이터베이스 연결, 로깅, 파일 입출력등이 포함됩니다. 이러한 로직들을 부분화 하여 모듈화하여 다른 비즈니스 로직에서 재사용 할 수 있다면 반복해서 쓰는 코드들을 줄일 수 있습니다. 흩어진 관심사(Crosscutting Concerns) 를 해결할 수 있는 것이지요.
이와 같이 흩어진 관심사를 Aspect 로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP 의 취지입니다.
Spring Architecture
Spring 은 모듈 방식으로 구성되어 있어서 필요한 모듈만 걱정하고 나머지는 무시할 수 있습니다.
모듈 프로그래밍은 프로그램의 기능을 독립적인 모듈로 분리하여 각각 하나의 특정 기능을 포함하도록 하는 소프트웨어 설계 기법입니다.
스프링 프레임워크는 20개의 모듈을 제공하며 모든 모듈은 core container위에 구축되어있습니다. 이러한 모듈들은 개발자가 기업 규모의 애플리케이션을 개발하며 사용하는 대부분의 기능을 포함하고 있습니다.
Core Container
빈을 생성하고 빈 종속성을 관리하는 데 사용됩니다.
- Core 및 Bean 모듈은 IoC 및 의존성 주입 기능을 포함하여 프레임워크의 기본 부분을 제공합니다.
- Bean 모듈은 팩토리 패턴의 정교한 구현인 BeanFactory를 제공합니다. 이 모듈은 실제 프로그램 로직에서 종속성의 구성 및 사양을 분리합니다.
- Context 모듈은 코어 및 Bean 모듈을 기반으로 구축됩니다. 정의되고 구성된 모든 객체에 액세스할 수 있는 수단입니다.
- SpEL 모듈은 런타임 중에 객체를 쿼리하고 조작할 수 있는 강력한 표현 언어를 제공합니다.
컨텍스트 모듈은 BeanFactory를 확장하고 애플리케이션 수명 주기 이벤트 및 유효성 검사에 대한 지원을 추가합니다. 이 모듈은 JNDI 액세스, EJB 통합, 원격 및 스케줄링과 같은 많은 엔터프라이즈 서비스를 가능하게 하며 다른 프레임워크와의 손쉬운 통합을 용이하게 합니다.
Data Access/Integration Modules
데이터베이스와 통신하는 데 사용됩니다.
- JDBC: JDBC 관련 코딩이 필요 없는 JDBC 추상화 계층을 제공합니다.
- ORM: JPA, JDO, Hibernate, iBatis 등 널리 사용되는 객체 관계형 매핑 API를 위한 통합 계층을 공합니다.
- OXM: 객체/XML 매핑 구현을 지원하는 추상화 계층을 제공합니다.
- JMS(Java 메시징 서비스): 메시지(이메일) 생성 및 소비를 위한 기능이 포함되어 있습니다.
- 트랜잭션: 클래스에 대한 트랜잭션 관리를 지원합니다.
Web Modules
Sring MVC 프레임워크의 본고장입니다. JSF와 같은 다른 기술을 통합할 수 있습니다.
- Web: 멀티파트 파일 업로드 기능, 서블릿 리스너와 웹 지향 애플리케이션 컨텍스트를 사용한 IoC 컨테이너의 초기화 등 기본적인 웹 지향 통합 기능을 제공합니다.
- Web-MVC: 웹 애플리케이션을 위한 Spring의 모델-뷰-컨트롤러(MVC) 및 REST 웹 서비스 구현이 포함되어 있습니다.
- 웹 소켓: 웹 애플리케이션에서 클라이언트와 서버 간의 WebSocket 기반 양방향 통신을 지원합니다.
- 웹 포틀릿: 포틀릿 환경에서 사용할 수 있는 MVC 구현을 제공하며 Web-MVC 모듈의 기능을 미러링합니다.
AOP and Instrumentation
- AOP: 앞서 설명한 대로 비즈니스 로직과 교차되는 문제를 분리할 수 있는 측면 지향 프로그래밍 구현을 제공합니다.
- Aspects: AspectJ와의 통합을 제공하는 별도의 모듈입니다.
- 계측: 클래스 계측 지원 및 클래스 로더 구현에 대한 지원을 제공합니다.
Messaging
메시징 기반 애플리케이션의 기반이 됩니다.
비동기 메시징 시스템의 기능을 제공하며 사용자가 메시지를 교환할 수 있도록 웹스콕을 통해 STOMP를 지원합니다.
Test
JUnit 또는 TestNG를 사용하여 Spring 구성 요소의 단위 테스트 및 통합 테스트를 지원합니다. 또한 코드를 개별적으로 테스트하는 데 사용할 수 있는 모의 객체도 제공합니다.
'프레임워크 > Spring' 카테고리의 다른 글
[Spring] WebFlux - 개요 (0) | 2024.02.16 |
---|