Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

Spring Framework 란?

by Greedy 2024. 5. 6.

Spring Framework

스프링 프레임워크는 모든 종류의 배포 플랫폼에서 Java 기반 엔터프라이즈 애플리케이션을 개발하기 위한 오픈 소스 프레임워크

Spring Framework의 역사

스프링(Spring)은 2002년에 로드 존슨(Rod Johnson)이 개발한 경량 프레임워크로 시작되었다.

초기에는 EJB(Enterprise JavaBeans)의 복잡성을 줄이고자 만들어졌으며, 특히 의존성 주입(Dependency Injection)과 관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)을 강조했다.

스프링은 자바 기반 엔터프라이즈 애플리케이션 개발을 위한 다양한 모듈과 기능을 제공하여 개발 생산성과 유지보수성을 향상시켰다.

또한, 스프링의 경량화된 설계와 모듈화된 구조는 개발자에게 높은 유연성과 확장성을 제공하여 다양한 환경에서 애플리케이션을 개발할 수 있게 했다.

스프링은 오랜 역사를 통해 많은 개발자들에게 신뢰받는 프레임워크로 자리잡았으며, 현재도 계속해서 발전하고 있다.

Spring Framework의 의의

  1. 스프링은 의존성 주입(Dependency Injection)을 통해 객체 간의 결합도를 낮추고 유연한 애플리케이션을 구축할 수 있도록 한다.
  2. 스프링은 관점 지향 프로그래밍(AOP)을 지원하여 핵심 비즈니스 로직과 부가적인 기능을 분리하여 관리할 수 있도록 해준다.
  3. 스프링은 다양한 모듈과 기능을 제공하여 데이터 액세스, 웹 개발, 통합, 보안 등 다양한 측면에서 애플리케이션을 개발하는 데 도움을 준다.

→ 다양한 인프라 구성을 제공하여 개발자가 애플리케이션의 핵심 비즈니스 로직에 집중할 수 있도록 돕는다.

Spring framework의 주요 특징

  • 의존성 주입(Dependency Injection): 객체 간의 의존 관계를 느슨하게 결합하여 유연성을 높인다. 이를 통해 객체들 간의 결합도를 낮추고 테스트 용이성을 향상시킨다.
  • AOP(Aspect-Oriented Programming): 관점 지향 프로그래밍은 애플리케이션의 핵심 기능 이외의 부가적인 기능(로깅, 트랜잭션 관리 등)을 모듈화하여 적용할 수 있도록 한다.
  • 트랜잭션 관리: 데이터베이스 트랜잭션을 관리하기 위한 추상화 계층을 제공하여 데이터의 일관성과 안전성을 보장한다.
  • MVC 웹 프레임워크: 스프링 MVC는 웹 애플리케이션을 개발하기 위한 모델-뷰-컨트롤러 아키텍처를 제공합니다. 이를 통해 HTTP 요청과 응답을 처리하고 웹 애플리케이션의 구조를 유연하게 설계할 수 있다.
  • 데이터 액세스 지원: 스프링은 JDBC, JPA, Hibernate 등 다양한 데이터 액세스 기술을 지원하여 데이터베이스와의 상호 작용을 쉽게 할 수 있다.
  • 보안: 스프링 시큐리티(Spring Security)를 통해 애플리케이션의 보안 관련 기능을 구현할 수 있다.
  • 스케줄링과 비동기 처리: 스프링은 스케줄링과 비동기 처리를 위한 다양한 기능을 제공하여 작업을 효율적으로 관리하고 실행할 수 있다.
  • 모듈화(Module): 모듈화는 소프트웨어를 작은 단위로 분할하는 것을 의미한다. 각 모듈은 특정 기능이나 관심 영역을 담당하고 있으며, 다른 모듈과 독립적으로 개발, 테스트, 유지보수될 수 있다. 모듈화의 주요 이점은 코드의 재사용성, 유연성, 유지보수성을 향상시킨다는 점이다. 스프링은 모듈화를 위해 다양한 기능을 제공하는데, 예를 들어 의존성 주입(Dependency Injection)을 통해 각 모듈 간의 의존 관계를 해결하고, 각 모듈이 독립적으로 개발될 수 있도록 지원한다.
  • 웹 지원: 스프링 MVC를 통해 웹 애플리케이션을 개발하고 RESTful 웹 서비스를 구축할 수 있습니다.
  • 리액티브 프로그래밍 지원: 스프링 WebFlux를 통해 비동기 및 논블로킹 웹 애플리케이션을 개발할 수 있습니다.

특징들을 자세히 살펴보면 다음과 같이 분류할 수 있다.

Core technologies

Dependency injection

객체 간의 의존 관계를 느슨하게 결합하여 유연성을 높인다. 이를 통해 객체들 간의 결합도를 낮추고 테스트 용이성을 향상시킨다.

Events

Spring Events는 스프링 프레임워크에서 이벤트 기반 아키텍처를 구현하는 기능으로, 객체 간 통신에 이용한다. 이벤트를 발행하고 리스너에게 전달하여 특정 상황에 대한 처리를 활성화한다. 주요 기능으로는 이벤트 발행 및 리스닝이 있으며, ApplicationEvent 클래스와 ApplicationListener 인터페이스를 사용하여 정의하고 처리한다. Spring Events는 애플리케이션이 느슨한 결합도, 유연성을 가질 수 있게 하고 이벤트 기반 아키텍쳐를 쉽게 구축할 수 있도록 도와준다.\

Spring resources

Spring Resources는 스프링에서 외부 리소스를 다루는데 쓰이는데, 파일, URL, 클래스패스 등을 통해 리소스를 관리할 수 있다. Resource 인터페이스로 다양한 종류의 리소스를 추상화하고, ResourceLoader 인터페이스를 통해 접근할 수 있다. 이걸 통해 프로퍼티 파일, 템플릿, 이미지 등을 애플리케이션에서 쉽게 다룰 수 있다. 파일 시스템, 클래스패스, 웹 위치 등 다양한 리소스에 접근할 수 있고, 읽기와 쓰기 등의 작업도 가능하다. Spring Resources는 외부 자원을 관리하는 코드를 훨씬 간단하게 만들어준다.

i18n

i18n은 "internationalization"의 줄임말로, 다국어 지원을 의미한다. 애플리케이션을 다양한 언어와 지역에 대해 번역하고 현지화하는 프로세스를 가리킨다. 이를 통해 애플리케이션은 사용자의 언어 및 지역 설정에 따라 적절한 언어와 형식을 제공할 수 있다. Spring은 다양한 i18n 기능을 제공하여 메시지 번들, 로케일 관리, 날짜 및 시간 형식, 숫자 형식 등을 지원한다. 이를 통해 다국어 애플리케이션을 쉽게 개발하고 유지보수할 수 있다.

Validation

Spring Validation은 사용자 입력 또는 데이터의 유효성을 검사하는데 사용된다. 주로 폼 입력 데이터나 API 요청 데이터의 유효성을 확인하고 에러를 처리하는 기능을 제공한다. Spring은 유효성 검사를 위해 Validator 인터페이스를 제공한다. 이를 구현하여 커스텀한 검증 로직을 정의할 수 있다. 또한, @Valid 어노테이션을 사용하여 자동으로 유효성 검사를 수행할 수 있다. 이를 통해 데이터의 무결성을 보장하고 안정적인 애플리케이션을 개발할 수 있다.

Data binding

Spring 데이터 바인딩은 HTTP 요청 파라미터와 애플리케이션의 Java 객체 간의 매핑을 쉽게 처리하는 기능을 제공한다. 주로 웹 애플리케이션에서 폼 데이터를 처리하거나 API 요청을 처리할 때 사용된다. 스프링은 HTTP 요청에서 받은 데이터를 자동으로 Java 객체로 변환해주는 기능을 제공하며, 이를 통해 개발자는 별도의 코드 없이도 객체의 필드에 값을 설정할 수 있다. 또한, 데이터 바인딩은 사용자 입력의 유효성 검사와 함께 사용될 수 있어, 입력된 데이터의 유효성을 검사하고 오류를 처리하는 데에도 도움을 준다.

Type conversion

Spring Type Conversion은 다양한 데이터 유형 간의 변환을 처리하는 기능을 제공한다. 주로 웹 애플리케이션에서 HTTP 요청 파라미터를 자바 객체의 필드에 매핑할 때 사용된다. Spring은 자동으로 요청 파라미터를 목표 유형으로 변환하여 적절한 필드에 할당한다. 이를 통해 문자열을 숫자로, 날짜로 변환하거나 사용자 정의 객체로 변환하는 등의 작업을 쉽게 수행할 수 있다. 또한, 개발자는 커스텀한 변환기를 등록하여 특정 데이터 유형 간의 변환 규칙을 지정할 수도 있다. 이를 통해 데이터의 형식을 유연하게 처리하고 애플리케이션의 상호 작용을 개선할 수 있다.

SpEL

Spring Expression Language (SpEL)은 스프링 프레임워크에서 제공하는 표현 언어이다. SpEL은 애플리케이션의 구성이나 Annotation, XML 설정 파일 등에서 사용될 수 있다. 주로 스프링 빈의 프로퍼티 값이나 메소드 호출, 조건식 등을 동적으로 설정할 때 활용한다. SpEL은 수학 연산, 문자열 조작, 컬렉션 처리 등을 수행할 수 있다. 또한, 빈의 주입 또는 프로퍼티 파일에서 값을 읽어오는 등 다양한 용도로 사용될 수 있어 애플리케이션의 유연성을 높이는 데에 도움이 된다. 코드의 가독성과 유지보수성을 향상시키는 데에도 도움이 된다.

AOP

Spring AOP는 스프링 프레임워크에서 제공하는 관점 지향 프로그래밍(Aspect-Oriented Programming) 기능이다. 이는 애플리케이션의 핵심 기능 이외의 부가 기능(로깅, 보안, 트랜잭션 관리 등)을 모듈화하여 개발하는 프로그래밍 패러다임이다. Spring AOP를 사용하면 특정 기능을 여러 모듈에서 중복 없이 적용할 수 있으며, 이를 통해 코드의 재사용성과 유지보수성을 향상시킬 수 있다. Spring AOP로 메소드 실행 전후에 특정한 작업을 수행하거나 예외를 처리하는 등의 기능을 구현할 수 있다. 이는 애플리케이션의 비즈니스 로직과 부가 기능을 분리하여 코드를 깔끔하게 유지할 수 있도록 돕는다.

Testing

Mock objects

실제 객체의 동작을 대체하는 가짜 객체로, 테스트에서 다른 객체와의 상호 작용을 테스트하는 데 사용된다. 스프링에서는 Mock 객체를 생성하고 구성하는 기능을 제공하여 테스트 환경에서 객체 간 상호 작용을 시뮬레이션할 수 있다.

TestContext framework

TestContext 프레임워크는 스프링 테스트의 실행을 관리하고 지원하는 데 사용된다. 테스트 클래스의 수명 주기를 관리하고 테스트 컨텍스트를 로드하여 애플리케이션 컨텍스트와 테스트 빈을 설정하여 테스트 환경을 설정하고 실행하는 것을 돕는다.

Spring MVC Test

Spring MVC Test는 스프링 MVC 애플리케이션을 테스트하는 데 사용된다. 실제 HTTP 요청과 응답을 모의하여 컨트롤러의 동작을 테스트할 수 있다. 이를 통해 컨트롤러의 동작과 뷰의 렌더링을 테스트하고 애플리케이션의 동작을 검증할 수 있다.

WebTestClient

WebTestClient는 스프링 WebFlux 애플리케이션을 테스트하는 데 사용된다. 비동기적인 요청 및 응답을 처리하며, WebFlux의 리액티브 스트림 모델을 활용하여 애플리케이션의 동작을 테스트한다. 이를 통해 리액티브한 웹 애플리케이션의 통합 테스트를 수행할 수 있다.

Data access

애플리케이션에서 데이터를 저장하고 검색하는 프로세스.

스프링은 다양한 데이터 액세스 기술을 지원하여 데이터베이스와의 상호 작용을 쉽게 할 수 있도록 돕는다.

Transactions

트랜잭션은 데이터베이스 작업의 원자성, 일관성, 격리성, 지속성을 보장하는 데 사용된다. 스프링은 트랜잭션 관리를 지원하여 여러 데이터 액세스 작업을 단일 트랜잭션으로 묶고 롤백을 처리할 수 있다.

DAO support

DAO(데이터 액세스 객체)는 데이터베이스와의 상호 작용을 추상화하는 객체이다. 스프링은 DAO 패턴을 지원하여 데이터 액세스 로직을 분리하고 테스트할 수 있도록 돕는다.

JDBC

JDBC(Java Database Connectivity)는 자바 프로그램과 데이터베이스 간의 연결을 제공하는 API이다. 스프링은 JDBC를 통해 데이터베이스와의 연결을 설정하고 쿼리를 실행할 수 있도록 지원한다.

ORM

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스 간의 매핑을 제공하는 기술이다. 스프링은 ORM 프레임워크인 Hibernate, JPA 등을 통해 객체와 데이터베이스 간의 상호 작용을 쉽게 할 수 있도록 돕는다.

Marshalling XML

Marshalling XML은 객체를 XML 형식으로 변환하는 프로세스이다. 스프링은 XML 데이터를 자바 객체로 변환하거나 자바 객체를 XML로 변환하는 기능을 제공하여 데이터의 직렬화와 역직렬화를 지원한다.

Spring MVC

Spring MVC는 스프링 프레임워크에서 제공하는 웹 애플리케이션을 개발하기 위한 모델-뷰-컨트롤러 아키텍처를 구현하는 웹 프레임워크이다. 이를 통해 HTTP 요청을 처리하고 응답을 생성하여 사용자에게 보여줄 수 있다.

Spring WebFlux

Spring WebFlux는 스프링 5부터 도입된 리액티브 프로그래밍 모델을 기반으로 하는 웹 프레임워크이다. 이는 비동기 및 논블로킹 요청 처리를 통해 더 많은 동시 사용자 및 더 높은 성능을 제공한다. 이는 서버 측 또는 클라이언트 측 리액티브 요청 처리를 구현하는 데 사용된다.

Integration

Integration은 스프링에서 다른 시스템이나 기술과의 상호 작용을 지원하는 기능을 의미한다. 이는 다양한 프로토콜, 통신 방식 및 데이터 형식을 통합하여 애플리케이션의 상호 작용을 간단하게 만들어준다.

Remoting

Remoting은 분산된 애플리케이션 간의 통신을 지원하는 기술이다. 스프링은 원격 서비스 호출을 쉽게 할 수 있는 다양한 방법을 제공한다.

JMS

JMS(Java Message Service)는 자바 애플리케이션 간에 메시지를 교환하기 위한 API를 제공한다. 스프링은 JMS를 통해 메시지 기반 통신을 지원하여 애플리케이션 간의 비동기적인 통신을 쉽게 구현할 수 있다.

JCA

JCA(Java EE Connector Architecture)는 자바 애플리케이션과 외부 기업 정보 시스템을 통합하는 자바 EE의 API를 제공한다. 스프링은 JCA를 사용하여 기존의 시스템과의 통합을 쉽게 처리할 수 있다.

JMX

JMX(Java Management Extensions)는 자바 애플리케이션을 관리하고 모니터링하기 위한 API를 제공한다. 스프링은 JMX를 통해 애플리케이션의 상태를 모니터링하고 관리할 수 있다.

Email

이메일 통합은 애플리케이션에서 이메일을 보내고 받는 기능을 지원한다. 스프링은 이메일 전송 및 수신을 쉽게 처리할 수 있는 기능을 제공한다.

Tasks

Tasks는 비동기적인 작업을 처리하기 위한 기능이다. 스프링은 비동기적인 작업을 스케줄링하고 관리하는 방법을 제공하여 애플리케이션의 성능을 향상시킬 수 있다.

Scheduling

Scheduling은 주기적으로 실행되는 작업을 관리하는 기능이다. 스프링은 다양한 스케줄링 기능을 제공하여 애플리케이션의 일정 관리를 용이하게 한다.

Observability

Observability는 애플리케이션의 상태를 모니터링하고 추적하는 것을 의미한다. 스프링은 애플리케이션의 상태와 동작을 관찰하고 디버깅하는 데 사용할 수 있는 다양한 도구를 제공한다.

Languages

Kotlin

Kotlin은 JetBrains에서 개발한 JVM 언어로, 안드로이드 애플리케이션 및 서버 측 애플리케이션을 개발하는 데 사용된다. Kotlin은 자바와의 상호 운용성이 뛰어나며, 코드의 간결성과 안전성을 제공한다.

Groovy

Groovy는 자바 플랫폼에서 사용할 수 있는 객체 지향 스크립트 언어이다. Groovy는 자바와의 완벽한 상호 운용성을 제공하며, 간결하고 표현력이 뛰어난 문법을 통해 개발 생산성을 높인다.

Dynamic languages

Dynamic languages는 실행 시간에 타입을 결정하고 동적으로 코드를 생성하는 언어를 말한다. 이러한 언어는 정적으로 타입이 결정되는 언어와 달리 유연성과 편의성을 제공한다. 대표적인 동적 언어로는 Python, JavaScript, Ruby 등이 있다. 스프링은 동적 언어와의 통합을 지원하여 유연하고 확장 가능한 애플리케이션을 개발하는 데 도움이 된다.

참고 자료 https://spring.io/projects/spring-framework