Spring Framework 개요
Spring은 Java Enterprise 애플리케이션을 쉽게 생성할 수 있도록 도와줍니다. 엔터프라이즈 환경에서 Java 언어를 수용하는 데 필요한 모든 것을 제공하며, Groovy와 Kotlin을 JVM에서 사용할 수 있는 대체 언어로 지원하며, 애플리케이션의 필요에 따라 다양한 아키텍처를 생성할 수 있는 유연성을 제공합니다. Spring Framework 6.0부터는 Spring이 Java 17 이상을 요구합니다.
Spring은 다양한 애플리케이션 시나리오를 지원합니다. 대규모 Enterprise에서는 애플리케이션이 오랜 시간 동안 존재하며, 개발자가 제어할 수 없는 업그레이드 주기를 가진 JDK와 애플리케이션 서버에서 실행되어야 합니다. 다른 애플리케이션은 서버가 내장된 단일 JAR로 실행될 수 있으며, 클라우드 환경에서 실행될 수도 있습니다. 또 다른 애플리케이션은 서버가 필요 없는 독립형 애플리케이션(예: 배치 또는 통합 작업)일 수 있습니다.
Spring은 오픈 소스입니다. 다양한 실제 사용 사례에 기반한 지속적인 피드백을 제공하는 크고 활발한 커뮤니티가 있습니다. 이는 Spring이 오랜 시간 동안 성공적으로 발전하는 데 기여했습니다.
"Spring"의 의미
"Spring"이라는 용어는 다양한 맥락에서 다른 의미를 가집니다. 이는 Spring Framework 프로젝트 자체를 지칭하는 데 사용될 수 있으며, 이는 모든 것이 시작된 곳입니다. 시간이 지나면서 Spring Framework 위에 다른 Spring 프로젝트들이 구축되었습니다. 대부분의 경우, 사람들이 "Spring"이라고 말할 때, 그들은 전체 프로젝트 가족을 의미합니다. 이 참조 문서는 기초인 Spring Framework 자체에 중점을 두고 있습니다. Spring Framework는 모듈로 구성되어 있습니다. 애플리케이션은 필요한 모듈을 선택할 수 있습니다. 핵심에는 Spring configuration 모델과 의존성 주입 메커니즘을 포함한 코어 컨테이너 모듈이 있습니다. 그 외에도 Spring Framework는 메시징, 트랜잭션 데이터 및 지속성, 웹을 포함한 다양한 애플리케이션 아키텍처에 대한 기본 지원을 제공합니다. 또한 Servlet 기반의 Spring MVC 웹 프레임워크와 병행하여 Spring WebFlux 반응형 웹 프레임워크도 포함되어 있습니다.
모듈에 대한 주의 사항: Spring Framework의 JAR 파일은 모듈 경로(Java Module System)에 배포할 수 있습니다. 모듈이 활성화된 애플리케이션에서 사용하기 위해, Spring Framework의 JAR 파일은 안정적인 언어 수준 모듈 이름(spring.core, spring.context 등)을 정의하는 Automatic-Module-Name 매니페스트 항목을 포함하고 있습니다. 이 이름들은 JAR 아티팩트 이름과는 독립적입니다. JAR 파일은 spring-core 및 spring-context와 같이 - 대신 .을 사용하여 동일한 명명 패턴을 따릅니다. 물론, Spring Framework의 JAR 파일은 클래스 경로에서도 잘 작동합니다.
Spring과 Spring Framework의 역사
Spring은 2003년에 초기 J2EE 사양의 복잡성에 대한 응답으로 탄생했습니다. 일부는 Java EE와 그 현대의 후계자인 Jakarta EE가 Spring과 경쟁 관계에 있다고 생각하지만, 사실 이들은 상호 보완적입니다. Spring 프로그래밍 모델은 Jakarta EE 플랫폼 사양을 수용하지 않으며, 오히려 전통적인 EE 우산에서 신중하게 선택된 개별 사양과 통합됩니다:
- Servlet API (JSR 340)
- WebSocket API (JSR 356)
- Concurrency Utilities (JSR 236)
- JSON Binding API (JSR 367)
- Bean Validation (JSR 303)
- JPA (JSR 338)
- JMS (JSR 914)
필요한 경우 트랜잭션 조정을 위한 JTA/JCA 설정도 포함됩니다.
Spring Framework는 또한 Dependency Injection (JSR 330) 및 Common Annotations (JSR 250) 사양을 지원하며, 애플리케이션 개발자는 Spring Framework에서 제공하는 Spring 전용 메커니즘 대신 이를 선택하여 사용할 수 있습니다. 원래 이들은 공통 javax 패키지를 기반으로 했습니다.
Spring Framework 6.0부터 Spring은 전통적인 javax 패키지 대신 jakarta 네임스페이스를 기반으로 Jakarta EE 9 수준으로 업그레이드되었습니다 (예: Servlet 5.0+, JPA 3.0+). EE 9가 최소 요구 사항으로 설정되었고 EE 10이 이미 지원되므로, Spring은 Jakarta EE API의 추가 발전을 위한 즉시 사용 가능한 지원을 제공할 준비가 되어 있습니다. Spring Framework 6.0은 Tomcat 10.1, Jetty 11 및 Undertow 2.3과 같은 웹 서버와 완전히 호환되며, Hibernate ORM 6.1과도 호환됩니다.
시간이 지남에 따라 애플리케이션 개발에서 Java/Jakarta EE의 역할이 진화해왔습니다. J2EE와 Spring의 초기 시절에는 애플리케이션이 애플리케이션 서버에 배포되도록 생성되었습니다. 오늘날, Spring Boot의 도움으로 애플리케이션은 devops 및 클라우드 친화적인 방식으로 생성되며, Servlet 컨테이너가 내장되어 있고 변경이 용이합니다. Spring Framework 5부터 WebFlux 애플리케이션은 Servlet API를 직접 사용하지 않으며, Servlet 컨테이너가 아닌 서버(예: Netty)에서 실행될 수 있습니다. Spring은 지속적으로 혁신하고 발전하고 있습니다. Spring Framework 외에도 Spring Boot, Spring Security, Spring Data, Spring Cloud, Spring Batch 등과 같은 다른 프로젝트들이 있습니다. 각 프로젝트는 고유한 소스 코드 저장소, 이슈 트래커 및 릴리스 주기를 가지고 있다는 점을 유념해야 합니다. Spring 프로젝트의 전체 목록은 spring.io/projects에서 확인할 수 있습니다.
디자인 철학
프레임워크에 대해 배울 때, 그것이 무엇을 하는지뿐만 아니라 어떤 원칙을 따르는지도 아는 것이 중요합니다. Spring Framework의 안내 원칙은 다음과 같습니다:
-
모든 수준에서 선택을 제공하다. Spring은 디자인 결정을 가능한 한 늦게 미룰 수 있게 해줍니다. 예를 들어, 코드를 변경하지 않고도 구성 설정을 통해 지속성 제공자를 전환할 수 있습니다. 많은 다른 인프라 문제와 서드파티 API와의 통합에서도 마찬가지입니다.
-
다양한 관점을 수용하다. Spring은 유연성을 포용하며, 사물의 처리 방식에 대해 고정된 의견을 갖고 있지 않습니다. 다양한 관점에서의 다양한 애플리케이션 요구를 지원합니다.
-
강력한 하위 호환성을 유지하다. Spring의 발전은 버전 간의 파괴적인 변경을 최소화하도록 신중하게 관리되었습니다. Spring은 애플리케이션과 Spring에 의존하는 라이브러리의 유지 관리를 용이하게 하기 위해 신중하게 선택된 JDK 버전과 서드파티 라이브러리 범위를 지원합니다.
-
API 디자인에 신경 쓰다. Spring 팀은 직관적이고 여러 버전과 여러 해에 걸쳐 유지될 수 있는 API를 만들기 위해 많은 노력을 기울입니다.
-
코드 품질에 대한 높은 기준을 설정하다. Spring Framework는 의미 있고, 최신이며, 정확한 Javadoc에 강한 중점을 둡니다. 패키지 간의 순환 의존성이 없는 깨끗한 코드 구조를 주장할 수 있는 매우 몇 안 되는 프로젝트 중 하나입니다.
피드백 및 기여
For how-to questions or diagnosing or debugging issues, we suggest using Stack Overflow. Click 여기에서 Stack Overflow에서 사용할 추천 태그 목록을 확인하세요. Spring Framework에 문제가 있다고 확신하거나 기능을 제안하고 싶다면, GitHub Issues에서 GitHub Issues를 사용해 주세요.
해결책이나 제안된 수정 사항이 있다면, GitHub에서 pull request를 제출할 수 있습니다. 그러나 가장 사소한 문제를 제외하고는, 문제 추적기에 티켓을 제출하고 논의가 이루어지며 향후 참조를 위한 기록이 남도록 하는 것을 기대합니다.
자세한 내용은 CONTRIBUTING 가이드라인을 참조하세요.
시작하기
Spring을 처음 사용하는 경우, Spring Boot 기반 애플리케이션을 생성하여 Spring 프레임워크를 사용해 보기를 권장합니다. Spring Boot는 프로덕션 준비 완료된 Spring 기반 애플리케이션을 빠르고(의견이 반영된) 방식으로 생성할 수 있도록 도와줍니다. Spring 프레임워크를 기반으로 하며, 설정보다 관례를 우선시하며, 최대한 빨리 시작할 수 있도록 설계되었습니다. 사용자는 start.spring.io를 사용하여 기본적인 프로젝트를 생성하거나, Getting Started 가이드 중 하나를 참고할 수 있습니다. 예를 들어, RESTful Web Service 구축 시작하기와 같은 가이드가 존재합니다. 이러한 가이드는 이해하기 쉬울 뿐만 아니라 매우 작업 중심적이고, 대부분 스프링 부트를 기반으로 합니다. 또한 특정 문제를 해결할 때 고려할 수 있는 Spring 포트폴리오의 다른 프로젝트도 포함되어 있습니다.