업무를 진행하며 Spring에 대해 부족한 점이 많다고 느껴 더욱 확실히 개념을 잡고자 정리를 한다.
Spring의 가장 큰 특징은 '객체지향' 이다.
객체지향적인 설계를 쉽게 구현하게 도와주며, 이를 통해 높은 유지보수성과 테스트 용이성, 개발 생산성 향상 등의 이점을 제공한다.
프로젝트를 진행하다 보면 중복되는 코드가 있기 마련이다.
Spring은 이런 중복코드의 사용률을 줄여주고, 비지니스 로직을 더 간단하게 해줄 수 있다.
즉, Spring이란 Java 기술들을 더 쉽게 사용할 수 있게 해주는 오픈소스 프레임워크 이다.
Spring 생태계는 다양한 프로젝트로 구성되어 있다.
해당 링크 를 들어가면 스프링 프로젝트의 전체 생태계를 살펴볼 수 있다.
Spring Framework:
스프링의 핵심 프레임워크로, 제어의 역전(IoC), 의존성 주입(DI), 관점 지향 프로그래밍(AOP), 이식 가능한 서비스 추상화(PSA) 등의 기능을 제공한다.
이를 통해 개발자는 객체지향적인 설계를 쉽게 구현하고, 코드의 재사용성과 유지보수성을 높일 수 있다.
Spring Boot:
스프링 부트는 스프링 기반의 애플리케이션을 빠르게 개발할 수 있도록 도와주는 도구이며, 복잡한 설정 없이도 스프링 애플리케이션을 생성하고 실행할 수 있다.
또한, 내장 Tomcat 등의 서버를 제공하여 별도의 WAS를 설치하지 않고도 웹 애플리케이션을 실행할 수 있게 해준다.
Spring Data:
스프링 데이터는 데이터 액세스 기술에 대한 일관성 있는 접근 방식을 제공하여, 개발자가 데이터 액세스 로직을 더욱 쉽게 작성할 수 있게 도와준다.
또한, JPA, MongoDB, Redis 등 다양한 데이터 소스를 동일한 방식으로 사용할 수 있게 해준다.
Spring Security:
스프링 시큐리티는 애플리케이션의 보안을 담당하며, 인증과 권한 부여 등의 다양한 보안 기능을 제공한다.
선언적인 보안 규칙을 설정할 수 있으며, 사용자 인증을 위한 다양한 방식을 지원한다.
Spring Batch:
스프링 배치는 대량의 데이터를 처리하는 데 특화된 프레임워크이며, 일괄 처리 작업을 효율적으로 처리할 수 있다.
또한, Job, Step, Tasklet 등의 구조를 통해 복잡한 배치 처리 로직을 구조적으로 관리할 수 있게 도와준다.
POJO(Plain Old Java Object)는 특정한 규약에 종속되지 않은 Java 객체를 의미한다.
Spring에서는 POJO를 이용하여 간단한 Java 객체로도 복잡한 기능을 구현할 수 있으며, 개발자는 비즈니스 로직에 집중할 수 있다.
즉, getter/setter를 가진 단순한 자바 오브젝트를 말한다.
또한, 코드의 재사용성과 유지보수성을 높일 수 있다.
IoC(Inversion of Control, 제어의 역전)는 프로그램의 제어 흐름을 개발자가 아닌 프레임워크가 관리하는 개념을 의미한다.
즉, 인스턴스 (객체)의 생성부터 소멸까지 객체 생명주기 관리를 개발자가 하는게 아닌 스프링(컨테이너)가 대신 해주는 것을 말한다.
이를 통해 개발자는 비즈니스 로직에 집중할 수 있게된다.
DI(Dependency Injection, 의존성 주입)는 객체 간의 의존 관계를 Spring Container가 관리하는 것을 의미한다.
프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부의 설정파일을 통해 정의되는 방식이다.
이를 통해 개발자는 의존성 관리에 대한 부담을 줄일 수 있다.
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 공통적인 기능을 재사용하고, 비즈니스 로직에서 분리하여 관리할 수 있게 도와준다.
즉, AOP는 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법이다.
이를 통해 코드의 중복을 줄이고, 모듈성을 높일 수 있다.
스프링 프레임워크는 총 20여 개의 모듈들로 구성이 되어 있는데 이를 꼭 전부 사용해야 하는 것이 아니라 필요할 때 해당 모듈만 사용하면 되는 경량 컨테이너로 설계가 되어있다.
스프링 프레임워크의 핵심인 빈의 생명주기와 설정 그리고 처리 방법을 관리하는 스프링 컨테이너이다
모든 스프링 모듈은 코어 컨테이너 기반으로 구축된다
1. Beans
Beans는 스프링 DI기능의 핵심인 빈 팩토리와 DI 기능을 제공하는 모듈이다
빈 메타 정보, 빈 리더, 빈 팩토리의 구현과 프로퍼티 에디터가 포함되어 있다고 한다
2. Core
Core모듈을 단어의 뜻처럼 거의 대부분의 다른 스프링 모듈에서 필요로 하는 공통 기능을 갖는 핵심 모듈이다
스프링에서 사용하는 주요 어노테이션과 컨버터, 상수 그리고 유틸리티 클래스 등을 제공한다
3. Context
애플리케이션의 Context 기능을 제공하는 모듈이다
콘텍스트를 만드는데 필요한 대부분의 기능과 빈 스캐너, 자바 코드 설정 기능 , 표현식 , 스크립트 언어 지원 등의 주요한 기능을 담고 있다
단순한 빈 팩토리가 아닌 엔터프라이즈 애플리케이션 프레임워크로 사용하기 위하여는 반드시 필요한 모듈이라고 한다
4. SpEL
스프링 표현 언어 기능을 제공한다
1. AOP
스프링은 AOP 모듈을 통해 관점 지향 프로그래밍을 지원한다
2. Aspects
스프링이 제공하는 AspectJ AOP를 사용할 때 필요한 모듈이다
3.Instrument
특정 애플리케이션 서버에서 사용할 클래스 계측 지원 및 클래스 로더 구현을 제공한다
Message, MesageChannel, MessageHandler 등의 스프링 통합 프로젝트를 포함하고 있으며
메시지 기반 애플리케이션의 구축하는데 역할을 한다.
스프링은 JDBC , ORM , Transaction 등의 서비스 추상화를 통하여 쉽게 데이터에 접근하는 방법을 제공한다
1. JDBC
Java JDBC 프로그래밍을 비교적 쉽게 할 수 있도록 제공하는 모듈이다
2. ORM
JPA , JDO 및 Hibernate를 포함한 널리 사용되는 관계형 매핑 API에 대한 통합 계층을 제공한다
orm을 통하여 간단한 선언적 트랜잭션 관리 기능을 비롯한 Spring이 제공하는 다른 모든 기능을 O/R 매핑 프레임워크로 사용할 수 있게 한다
3. OXM
JAXB , XMLBeans 등과 같은 객체/XML 매핑의 추상화 계층을 제공한다
4. JMS
spring-jms 모듈은 Java Messaging Service의 약자로서 메시지 생성 및 사용을 위한 기능을 제공한다
(이는 Spring Freamwork 4.1부터 spring-messging 모듈과 통합 제공한다)
5. Transaction
spring-tx 모듈은 특수 인터페이스를 구현하는 클래스와 모든 POJO에 대하여 선언적 트랜잭션 관리를 지원한다
스프링은 다양한 MVC 프레임워크를 사용할 수 있지만 스프링 자체적으로 제공하는 Spring MVC 모듈들이 있다
또한 스프링의 리모팅 기술로 RMI, Hessian, HTTP 호출자 , REST API 모듈 등을 제공한다
1. WebSocket
웹소켓을 지원한다
2. Servlet
스프링 MVC 기능을 제공하는 모듈이다 전통적인 MVC와 @MVC의 기능이 모두 포함되어 있다
3. Web
웹 애플리케이션 이용에 편리한 기능을 제공한다
Multipart-File Upload 기능 및 서블리 리스너 , IoC 컨테이너 초기화 같은
기본적인 웹 지향 통합 기능을 제공한다
4. Portlet
포틀릿 환경 미러 서블릿 기반의 기능에 사용될 MVC 구현을 제공한다
스프링 애플리케이션의 테스트를 지원한다.
JUnit과 연동하여 스프링 애플리케이션의 다양한 테스트를 지원하며, 테스트를 위한 별도의 설정 없이도 스프링 애플리케이션의 테스트를 진행할 수 있게 도와준다.
Spring은 Java 기반의 애플리케이션 개발을 쉽고 효율적으로 할 수 있도록 도와주는 프레임워크이다.
강력한 기능과 유연성을 제공하며, 객체지향적인 설계를 쉽게 구현할 수 있게 도와준다.
또한, 다양한 모듈을 통해 필요한 기능만을 선택하여 사용할 수 있으며, 이로 인해 개발자는 비즈니스 로직에 집중하고, 품질 높은 소프트웨어를 빠르게 개발할 수 있다.
참고: https://maenco.tistory.com/entry/Spring-Spring-Framework-Module-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%AA%A8%EB%93%88
참고: https://jerryjerryjerry.tistory.com/62