[Spring Framework - Core] 프롤로그

mrcocoball·2023년 8월 16일

Spring Framework

목록 보기
1/20
post-thumbnail

해당 포스트는 Spring.io의 공식 문서를 포함한 레퍼런스와 코드를 통해 Spring Framework의 구조 / 기술에 대해 확인해보고자 하는 포스트입니다.

1. Spring Framework란?

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크

Spring Framework (이하 스프링 프레임워크) 는 자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크입니다.

Spring을 사용하면 Java 엔터프라이즈 애플리케이션을 쉽게 만들 수 있습니다. JVM에서 대체 언어로 Groovy 및 Kotlin을 지원하고 애플리케이션의 요구 사항에 따라 다양한 종류의 아키텍처를 생성할 수 있는 유연성을 통해 엔터프라이즈 환경에서 Java 언어를 수용하는 데 필요한 모든 것을 제공합니다. - Spring Framework Overview

스프링 프레임워크 이전에 자바 플랫폼에서는 표준 기술로 EJB (Enterprise Java Bean) 를 제공했는데 복잡한 구조와 EJB에 의존적인 설계로 인해 개발에 어려움이 있었다고 합니다.

이러한 상황에서 2002년, 로드 존슨(Rod Johnson) 이 발표한 서적 <Expert One-on-One J2EE Design and Development>의 예제 코드를 기반으로 발전한 스프링 프레임워크는 2003년에 아파치 2.0 라이센스로 처음 공개되어 지금에 이르게 되었습니다.

Spring Framework의 주요 특징

  • 경량 컨테이너
    자바 객체를 직접 관리하며 개발자는 스프링으로부터 필요한 객체를 얻을 수 있습니다.

  • POJO(Plain Old Java Object) 방식의 프레임워크
    POJO 방식으로 특정 인터페이스를 구현하거나 상속 받을 필요가 없어 객체가 가볍고 기존에 존재하는 라이브러리 등을 지원하기에 용이합니다.

  • IoC(Inversion of Control)를 지원
    컨트롤의 제어권이 사용자가 아닌 프레임워크에 있는 제어의 역전을 지원하며 필요에 따라 스프링에서 사용자의 코드를 호출합니다. 스프링의 가장 중요하고 핵심적인 기능으로 객체의 생명 주기를 관리합니다.

  • DI(Dependency Injection)를 지원
    스프링의 가장 중요하고 핵심적인 기능으로 각각의 계층이나 서비스들 간 의존성이 존재할 경우 프레임워크가 서로 연결시켜줍니다.

  • AOP(Aspect Oriented Programming)를 지원
    트랜잭션, 로깅, 보안과 같은 횡단 관심사를 처리하기 위한 관점 지향 프로그래밍을 지원합니다. AspectJ는 물론 스프링 자체적으로 지원하는 런타임 시 조합하는 방식도 지원합니다.

  • 영속성과 관련된 다양한 서비스를 지원 (Data Access)
    MyBatis, Hibernate 등의 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공합니다.

  • 확장성이 높음
    스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능합니다.

  • 필요한 모듈을 선택할 수 있음
    스프링 프레임워크는 모듈로 나뉘며, 어플리케이션 개발 시 필요한 모듈을 선택할 수 있습니다.
    또한 메시징, 트랜잭션 데이터, 영속성, 웹을 비롯한 다양한 어플리케이션 아키텍처에 대한 기본을 제공합니다.

Spring Framework의 디자인 철학

Spring Framework Overview에서 제시한 스프링 프레임워크의 기본 원칙은 다음과 같습니다.

  • 모든 수준에서 선택권을 제공
    스프링은 가능한 한 늦게까지 설계 결정을 미룰 수 있게 해줍니다. 예를 들어 코드를 변경하지 않고도 설정을 통해서 영속성 관련 제공자 (MySQL → PostgreSQL) 를 변경할 수 있습니다. 이러한 원칙은 많은 인프라 문제와 제3자 API와의 통합에 대해서도 적용됩니다.

  • 다양한 관점을 수용
    스프링은 유연성을 채택하며 다양한 관점에서 다양한 애플리케이션 요구 사항을 지원합니다.

  • 강력한 이전 버전과의 호환성을 유지
    스프링의 진화는 주요한 버전 간 파괴적인 변경 사항을 최소화하기 위해 신중하게 관리됩니다. 스프링에 의존하는 어플리케이션 및 라이브러리의 유지 보수를 용이하게 하기 위해 신중하게 선택된 JDK 버전 및 제3자 라이브러리 범위를 지원합니다.

  • API 디자인에 관심을 가짐
    스프링 팀은 직관적이고 오랫동안 지속되며 다양한 버전과 여러 해에 걸쳐 유지되는 API를 만들기 위해 많은 생각과 시간을 투자합니다.

  • 코드 품질에 대한 높은 기준을 설정
    스프링 프레임워크는 의미 있고 최신이며 정확한 Javadoc에 큰 강조를 두고 있습니다. 패키지 간의 순환 종속성이 없는 깔끔한 코드 구조를 가진 몇 안되는 프로젝트 중 하나입니다.

(번외) 사람들이 자주 이야기하는 ‘스프링’은?

사람들이 자주 이야기하는 스프링은 사실 많은 것들이 혼용되어 있습니다.

  • Spring 전체 프로젝트 제품군 (Spring.io 에서 언급)
  • Spring Framework
  • Spring WEB MVC
  • Spring Boot

(번외) 스프링 생태계 (Spring Framework Ecosystem)

2. Core Technologies?

Spring Framework의 핵심 기술

Spring Framework Overview에서는 스프링 프레임워크에 절대적으로 필요한 핵심 기술들에 대한 내용을 다루고 있는데요. 스프링 프레임워크는 가장 중요한 IoC 컨테이너를 필두로 다음과 같은 핵심 기술들을 제공합니다.

  • IoC 컨테이너
  • Resources (자원)
  • Validation, Data Binding and Type Conversion (유효성 검사, 데이터 바인딩 및 타입 변환)
  • SpEL
  • Spring을 사용한 AOP
  • 스프링 AOP API
  • Null Safety (널 안정성)
  • Data Buffer and Codec (데이터 버퍼 및 코덱)
  • Logging (로깅)
  • Ahead of Time Optimizations (사전 최적화)

또한 상기한 핵심 기술들 말고도 다양한 기능을 가진 모듈들을 선택적으로 결합할 수 있습니다.

  • 영속성 관련(Data Access)
  • 웹 관련(Web on Servlet Stack / Web on Reactive Stack)
  • 테스트(Testing)
  • 통합 기능(Integration)

핵심 기술에 대한 간단한 설명

  • IoC 컨테이너
    객체 간의 의존성을 관리하고 제어하는 방법을 제공하는 핵심적인 기능입니다.
    컨테이너가 객체를 생성한 후 객체(Bean) 간의 의존성을 DI(Dependency Injection) 을 통해 주입하며 생명 주기 관리와 제어를 담당합니다.

  • Resources (자원)
    Resource 인터페이스를 비롯한 다양한 인터페이스를 통해 리소스를 처리합니다.

  • Validation, Data Binding and Type Conversion (유효성 검사, 데이터 바인딩 및 타입 변환)
    Validator , DataBinder 인터페이스를 통해 유효성 검사와 데이터 바인딩, 타입 변환을 처리합니다.

  • SpEL (Spring Expression Language)
    런타임 시 객체 그래프 쿼리 및 조작을 지원하는 강력한 표현 언어입니다.

  • Spring을 사용한 AOP
    스프링 프레임워크의 주요 구성 요소 중 하나이며 AOP를 통해 IoC 컨테이너를 보완할 수 있습니다. 선언적 엔터프라이즈 서비스를 제공하고 (예시 : 선언적 트랜잭션 관리) 스키마 기반 접근 방식 또는 @AspectJ 어노테이션 스타일을 사용하여 사용자 정의 측면을 작성하는 간단한 방법을 제공합니다.

  • 스프링 AOP API
    위에서 소개한 내용(스키마 기반 접근 방식 및 AspectJ 사용)과는 다른 하위 수준 스프링 AOP API를 제공합니다.

  • Null Safety (널 안정성)
    스프링 프레임워크는 API 및 필드의 Null 허용 여부를 선언할 수 있도록 어노테이션을 제공합니다
    (@Nullable, @NonNull …)

  • Data Buffer and Codec (데이터 버퍼 및 코덱)
    DataBufferFactory, DataBuffer, Codec 인터페이스를 통해 데이터 버퍼 생성과 바이트 버퍼, 디코딩 / 인코딩을 추상화합니다.

  • Logging (로깅)
    spring-jcl 모듈은 스프링 프레임워크 5.0부터 추가로 제공하는 로깅 모듈이며 Log4j, SLF4J를 모두 사용할 수 없는 경우라면 사용할 수 있습니다. 다만 코어 프레임워크 및 확장에서 인프라 로깅 목적으로만 사용하는 것이므로, 애플리케이션 내에서 로깅이 필요하다면 Log4j, SLF4J를 사용하는 것을 추천합니다.

  • Ahead of Time Optimizations (사전 최적화)
    빌드 시 사전 처리를 수행, 추가 자산을 생성할 수 있습니다. 추가 자산은 일반적으로 자바 소스 코드, 바이트코드(동적 프록시용), RuntimeHints 리플렉션, 리소스 로딩 등이 있습니다.

3. 앞으로의 포스팅에서 다룰 내용

위에서 소개한 스프링 프레임워크의 핵심 기술들에 대한 공식 문서 설명과 예제 코드 등을 분석할 예정입니다.
또한, 핵심 기술들에 대한 내용이 정리되면 Spring WEB MVC, Data Access 등 추가적인 모듈이나 프레임워크를 지속적으로 분석 / 정리하고자 합니다.

Appendix. 출처

https://docs.spring.io/spring-framework/reference/overview.html
https://ko.wikipedia.org/wiki/스프링_프레임워크

profile
Backend Developer

0개의 댓글