Spring Framework Overview
Version 5.2.3.RELEASE
스프링은 자바 엔터프라이즈 애플리케이션을 쉽게 만들수 있게 한다. 스프링은 엔터프라이즈 환경에서 당신이 자바 언어를 수용하기 위한 모든 것을 제공한다. 그리고 JVM 언어인 Groovy와 Kotlin도 지원한다. 그리고 애플리케이션의 요구사항에 맞는 여러 종류의 아키텍쳐를 만들 수 있는 유연성을 가지고 있다. 스프링 프레임워크 5.1 버전부터 스프링은 JDK 8 이상의 버전이 필요하고 JDK 11 LTS 버전에 대해서도 out-of-the-box support(별도 설정 필요 없는 지원)를 제공합니다. Java SE 8 update 60 버전은 Java 8 버전에 대한 최소 요구 버전으로 지원되나 최신 패치버전도 일반적으로 사용할 수 있습니다.
스프링은 다양한 애플리케이션 시나리오를 지원합니다. 대규모 엔터프라이즈 상황에서 애플리케이션은 종종 오랜 시간 유지되어야 하고 개발자의 관리범위를 넘어서는 업그레이드 주기를 가진 애플리케이션 서버를 실행해야 할 때가 있습니다. 또다른 경우는 클라우드 환경에서 임베디드 서버를 내장한 single jar를 실행해야 하는 경우입니다. 그리고 서버가 필요 없는 배치나 워크로드 통합을 위한 standalone 애플리케이션의 경우가 있습니다.
스프링은 오픈소스이다. 다양한 실제 사용 사례에 기반한 지속적인 피드백을 제공하는 크고 활성화된 커뮤니티가 있다. 이는 스프링을 오랜시간동안 성공적으로 발전시켜나가는데 도움을 주고 있다.
1. "Spring"의 의미
"Spring"이라는 용어는 다양한 상황에서 다양한 의미를 가지고 있다. 이 것은 Spring Framework 자체를 의미할 수 있다. 시간이 흐르면서, 다른 스프링 프로젝트들이 스프링 프레임워크의 위에 생겼다. 오늘날 자주 사용하는, 사람들이 말하는 "Spring"은 스프링 프로젝트의 전체를 의미하기도 한다. 이 문서는 스프링 프레임워크에 초점을 맞추고 있다.
스프링 프레임워크는 모듈들로 분리되어 있다. 애플리케이션은 필요한 모듈을 선택할 수 있다. 핵심은 configuration model과 dependency injection 메카니즘이 포함된 코어 컨테이너의 모듈이다. 이 외에도 스프링 프레임워크는 여러 애플리케이션 아키텍쳐, 메시징, 데이터 트랜잭션과 영속성, 웹 등에 대한 기초적인 지원을 제공합니다. 서블릿 기반의 Spring MVC 웹 프레임워크와 Spring WebFlux reactive 웹 프레임워크를 함께 지원합니다.
모듈에 대한 메모: 스프링의 프레임워크 jar 파일은 JDK 9의 모듈화(Jigsaw) 배포를 허용합니다. Jigsaw 활성화 애플리케이션에서 사용하기 위해 스프링 프레임워크 5 는 jar artifact 이름(e.g. "spring-core", "spring-context")에서 독립된 안정적인 언어 레벨의 모듈 이름을 정의하는 "Automatic Module-Name" 매니페스트 항목(e.g. "spring.core", "spring.context", ...)이 제공됩니다. 물론 스프링 프레임워크 jar는 JDK 8과 JDK 9+에서 동일하게 잘 동작합니다.
2. 스프링과 스프링 프레임워크의 역사
스프링은 2003년에 초기 J2EE 명세의 복잡함에 대한 대안(response)로 시작되었습니다. 일부는 Java EE와 스프링이 경쟁 관계에 있다고 생각하지만, 사실 스프링은 Java EE와 상호보완적인 관계에 있습니다. 스프링 프로그래밍 모델은 Java 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 구성 (필요하다면)
스프링 프레임워크는 Dependency Injection(JSR 330) 명세와 공통 애너테이션(JSR 250) 명세도 지원한다. 애플리케이션 개발자는 스프링 프레임워크가 제공하는 특정 메카니즘들(e.g. XML 방식의 빈 등록) 대신 사용할 수 있다.
스프링 프레임워크 5.0 기준으로 스프링은 Java EE 7 레벨 (e.g. 서블릿 3.1+, JPA 2.1+)을 최소조건으로 요구함과 동시에 Java EE 8 레벨 (e.g. 서블릿 4.0, JSON 바인딩 API)과 즉시 통합을 지원하고 있다. 이는 스프링이 Tomcat 8, 9, WebSphere 9, JBoss EAP 7 과의 완전 호환을 유지하게 한다.
시간이 지남에 따라 애플리케이션 개발을 위한 Java EE의 역할을 진화했다. 초창기의 Java EE와 스프링 애플리케이션들은 애플리케이션 서버에 배포되었다. 오늘날엔 스프링 부트의 도움으로 클라우드 친화적인 devops 환경에서 서블릿 컨테이너가 내장된 애플리케이션을 생성할 수 있다. 스프링 프레임워크 5 기준으로 웹플럭스 애플리케이션은 서블릿 API를 직접적으로 사용하지 않고 서블릿 컨테이너가 아닌 (Netty와 같은) 서버에서 동작한다.
스프링은 계속해서 혁신하고 발전하고 있다. 스프링 프레임워크를 넘어, 스프링 부트, 스프링 시큐리티, 스프링 데이터, 스프링 클라우드, 스프링 배치와 같은 다른 프로젝트들이 있다. 각 프로젝트는 고유의 소스코드 저장소, 이슈 트래커, 릴리즈 주기가 있다는걸 명심해라. spring.io/projects에서 스프링 프로젝트의 전체 리스트를 확인할 수 있다.
3. 디자인 철학
프레임워크에 대해 배울 때, 그것이 하는 일 뿐만이 아니라 그에 따르는 원칙을 아는 것도 중요하다. 아래는 스프링 프레임워크의 가이드 원칙이다:
- 모든 레벨에서의 선택을 제공한다. 스프링은 당신이 설계에 대한 결정을 가능한 늦게 미룰 수 있게 합니다. 한 예로, 코드의 변경 없이 설정만으로 영속성 제공자를 전환할 수 있다. 그외 많은 인프라스트럭쳐와 써드파티 API와의 통합에서도 마찬가지이다.
- 다양한 관점을 수용한다. 스프링은 유연성을 포용하고 문제 해결에 대한 의견을 고집하지 않는다. 다양한 관점으로 애플리케이션 요구사항에 대한 해결방법을 지원한다.
- 이전 버전과의 호환을 완벽하게 지원한다. 스프링의 발전은 매우 조심스럽게 관리되어서 버전 간의 변경 충돌이 거의 없었다. 스프링은 신중하게 선택한 JDK 버전과 써드파티 라이브러리를 지원하며 스프링에 의존하는 라이브러리와 애플리케이션들의 유지보수를 용이하게 한다.
- API 디자인에 신경쓴다. 스프링 팀은 직관적이고 오랜 시간, 다양한 버전에 걸쳐 사용할 수 있는 API를 설계하는데 많은 시간과 노력을 투입한다.
- 높은 기준의 코드 퀄리티를 가지고 있다. 스프링 프레임워크는 의미있고 정확한 javadoc에 중점을 두고 있다. 이는 패키지 간의 순환 의존관계가 없는 클린 코드 체계를 주장하는 매우 소수의 프로젝트들 중 하나이다.
4. 피드백과 기여
어떻게 해야하는지 질문하거나 이슈 디버깅/진단을 위해 StackOverFlow와 사용을 위한 태그들이 나열된 질문 페이지(역자 주: 깨져있음)를 이용하는 것을 추천한다. 만약 스프링 프레임워크에 확실한 문제가 있거나 새로운 기능을 제안하고 싶을 땐 Github Issues를 사용해라.
만약 버그 수정이나 솔루션을 염두하고 있다면, Github로 PR을 보낼 수 있다. 그러나 대부분의 사소한 이슈는, 미래에 추가될 기능을 위해 기록을 남기거나 토론중인 이슈트래커에 티켓이 채워져 있다는 것을 명심해라.
기여를 위한 가이드라인에 대해 더 알고싶다면, 탑 레벨의 프로젝트 페이지를 살펴보면 된다.
5. 시작하기
만약 빠르게 스프링을 사용하고 싶다면, 스프링 부트 기반의 프레임워크를 고려하고 있을 것이다. 스프링 부트는 빠르고 자동 설정이 포함된 프로덕션에 바로 적용 가능한 스프링 애플리케이션을 제공한다. 이는 스프링 프레임워크에 기반하고 설정을 직접 하기보다 이미 구성된 컨벤션을 선호한다. 그리고 스프링 부트는 가능한 빨리 실행할 수 있도록 설계되어 있다.
start.spring.io나 "시작하기" 가이드를 통해서 기본적인 프로젝트를 생성할 수 있다. 이런 가이드는 실제 업무에 집중되어 있기 때문에 소화하기 쉬울 뿐 아니라 대부분의 가이드가 스프링 부트 기반이다. 그리고 스프링 포트폴리오의 다른 프로젝트들 역시 특정 문제를 해결하기 위한 방안으로써 포함되어 있다.