스프링 프레임워크는 자바 엔터프라이즈 애플리케이션을 개발하기 쉽도록 도와줍니다. 그리고 JVM에서 Java의 대체 언어로 Groovy와 Kotlin을 지원하고, 애플리케이션을 개발할 때 요구하는 사항에 따라 다양한 종류의 아키텍처를 만들 수 있는 유연성을 갖추고 있어 엔터프라이즈 환경에서 Java 언어를 채택하는 데 필요한 모든 것을 제공해줍니다.
참고로 스프링 프레임워크 6.0 버전부터는 Java 17 버전 이상을 사용해야 합니다.
스프링 프레임워크는 광범위한 애플리케이션 시나리오를 지원합니다. 대규모 엔터프라이즈 환경에서 애플리케이션은 오랫동안 사용하는 경우가 많으며, JDK 및 애플리케이션 서버는 업그레이드 주기가 짧은 경우가 많습니다. 어떤 애플리케이션의 경우 온프레미스 서버에 내장된 하나의 jar 파일을 사용하여 실행하기도 하며, 심지어는 클라우드 환경에서 jar 파일을 실행하기도 합니다. 반면에 배치 워크로드나 통합 워크로드처럼 서버 없이 독자적으로 실행하기도 합니다.
스프링은 오픈소스이며, 스프링 커뮤니티는 다양한 실제 사례나 경험 등을 바탕으로 지속적인 피드백을 제공합니다. 이 커뮤니티는 스프링의 진화를 오랜 세월에 걸쳐서 스프링을 개선시켜 나갔으며, 지금도 개발자들이 꾸준히 활동하고 있습니다.
“Spring”이 가지는 의미
“Spring”이라는 용어는 다양한 맥락에서 다른 의미로 사용됩니다. 이는 스프링 프레임워크 프로젝트 자체를 가리킬 수 있으며, 여기서 모든 것이 시작되었습니다. 시간이 지나면서 다른 스프링 프로젝트들이 스프링 프레임워크 위에 구축되었습니다. 대부분 사람들이 “Spring”이라고 할 때, 그들은 전체 스프링 프로젝트 가족을 의미합니다. 이 참조 문서는 기초에 중점을 두며, 스프링 프레임워크 자체에 집중합니다.
스프링 프레임워크는 모듈로 나누어져 있습니다. 애플리케이션은 필요한 모듈만 선택할 수 있습니다. 핵심에는 구성 모델과 의존성 주입 메커니즘을 포함하는 핵심 컨테이너 모듈이 있습니다. 그 외에도 스프링 프레임워크는 메시징, 트랜잭션 데이터 및 퍼시스턴스, 웹 등 다양한 애플리케이션 아키텍처에 대한 기초 지원을 제공합니다. 또한 서블릿 기반의 스프링 MVC 웹 프레임워크와 병행하여 스프링 WebFlux 리액티브 웹 프레임워크도 포함되어 있습니다.
모듈에 대한 참고 사항: 스프링의 프레임워크 JAR 파일은 JDK 9의 모듈 경로(“Jigsaw”)에 배포될 수 있습니다. Jigsaw를 활성화한 애플리케이션에서 사용하기 위해, 스프링 프레임워크 5 JAR 파일에는 “Automatic-Module-Name” 매니페스트 항목이 포함되어 있으며, 이는 JAR 아티팩트 이름과는 독립적으로 안정적인 언어 수준 모듈 이름(“spring.core”, “spring.context” 등)을 정의합니다(JAR 파일은 “-” 대신 “.”을 사용하여 동일한 이름 패턴을 따릅니다, 예: “spring-core”와 “spring-context”). 물론, 스프링의 프레임워크 JAR 파일은 JDK 8과 9+에서 클래스패스에서도 잘 작동합니다.
스프링과 스프링 프레임워크의 역사
스프링은 2003년에 J2EE 명세의 복잡성을 해결하기 위해 탄생했습니다. 어떤 사람들은 Java EE와 후계 모델인 Jakarta EE는 스프링과 경쟁 관계라고 생각할 수도 있겠지만 사실 이들은 상호 보완적입니다. 스프링 프로그래밍 모델은 기존의 Java 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 설정도 제공
스프링 프레임워크는 의존성 주입(JSR 330) 및 일반적인 어노테이션(JSR 250) 명세도 지원합니다. 이로 인하여 애플리케이션 개발자들이 Spring Framework에서 제공하는 Spring 관련 메커니즘 대신 사용하도록 선택할 수 있습니다.
- Spring 관련 메커니즘 : 공통 javax 패키지를 기반으로 개발함
스프링 프레임워크 6.0 버전부터는 스프링은 javax 패키지 대신 jakarta 네임스페이스를 사용하며, Jakarta EE 9 버전 이상을 요구합니다. (Servlet은 5.0 이상, JPA는 3.0 이상을 요구) 그리고 스프링 프레임워크 6.0 버전이 나오기 전부터 Jakarta EE 10 버전을 지원하면서 스프링은 Jakarta EE API 지원을 준비하고 있습니다.
스프링 프레임워크 6.0 버전은 Tomcat 10.1, Jetty 11, Undertow 2.3과 같은 웹 서버와 Hibernate ORM 6.1과 완벽하게 호환됩니다.
시간이 지나면서 애플리케이션 개발에서 Java/Jakarta EE의 역할은 진화해 왔습니다. 초기 J2EE와 스프링 시대에는 애플리케이션이 애플리케이션 서버에 배포되도록 만들어졌습니다. 오늘날에는 스프링 부트의 도움으로 서블릿 컨테이너가 내장되어 있고 변경이 쉬운, 개발자 친화적이고 클라우드 친화적인 방식으로 애플리케이션이 만들어집니다. 스프링 프레임워크 5부터는 WebFlux 애플리케이션이 서블릿 API를 직접 사용하지 않으며 서블릿 컨테이너가 아닌 Netty와 같은 서버에서도 실행될 수 있습니다.
스프링은 계속해서 혁신하고 진화하고 있습니다. 스프링 프레임워크 외에도 스프링 부트, 스프링 시큐리티, 스프링 데이터, 스프링 클라우드, 스프링 배치 등의 프로젝트가 있습니다. 각 프로젝트는 자체 소스 코드 저장소, 이슈 트래커, 릴리스 주기를 가지고 있다는 점을 기억하는 것이 중요합니다. 스프링 프로젝트의 전체 목록은 spring.io/projects에서 확인할 수 있습니다.
설계 철학
스프링 프레임워크를 배울 때는 스프링 프레임워크가 하는 일뿐만 아니라 지켜야할 원칙을 아는 것이 중요합니다. 스프링 프레임워크를 사용할 때 지켜야할 원칙은 아래와 같습니다.
원칙 | 내용 |
---|---|
모든 레벨에서의 선택을 지원 | 언제든 설계 시점을 자유롭게 설정 가능 |
다양한 관점 수용 | 하나의 작업 수행 방식만을 고집하지 않음 |
다양한 관점을 가진 다양한 애플리케이션 요구를 지원 | |
강력한 하위 호환성 유지 | 버전 변경 시 기존 코드의 수정을 최소화 |
다양한 JDK 버전과 서드 파티 라이브러리를 신중히 선택하여 유지보수가 용이 | |
API 설계 중시 | API 설계 시 직관적이고 오랫동안 사용할 수 있도록 설계 |
엄격한 코드 품질 기준 | Javadoc : 모든 공개 API에 대한 세부 내용 제공 및 최신 정보 반영 |
패키지 간의 순환 종속성을 제거하여 각 모듈이 독립적으로 작동하고, 유지보수가 용이 |
피드백 및 기여
주의사항 : 피드백 및 기여는 거의 다 영어로 진행됩니다!!
사용법에 대해 질문하거나 문제에 대한 원인을 파악하거나 디버깅 문제를 해결하고 싶을 경우 아래의 Stack Overflow 링크로 들어가시는 것을 추천해 드립니다.
스프링 프레임워크에서 문제가 발생하거나 의견을 제시하고 싶으시면 Github Issues 링크로 들어가시는 것을 추천해드립니다.
문제에 대한 해결책이 있으면 Github에서 pull request를 수행할 수 있습니다. 다만 아주 사소한 문제를 제외하곤 토론이 이루어지는 이슈트래커에 해당 이슈가 제출될 수 있으며, 해당 이슈는 추후에 참고될 수 있습니다.
기여에 대한 가이드라인을 자세하게 확인하고 싶으시면 아래의 기여 요령 링크를 확인해주세요.
시작하기
만약 스프링을 처음 시작하신다면 스프링 부트를 기반으로 한 애플리케이션을 생성하여 스프링 프레임워크를 사용해보시는 것을 추천드립니다.
스프링 부트는 스프링 프레임워크를 기반으로 개발되었으며, 스프링 기반 애플리케이션을 만드는 과정에서 프로덕션 준비 기능을 사용하기 때문에 빠르고 간편하게 만들 수 있다는 장점을 가집니다.
start.spring.io를 사용하여 기본 프로젝트를 생성하거나, “Getting Started” 가이드 중 하나를 따라하면서 RESTful 웹 서비스와 같은 서비스를 쉽게 구축할 수 있습니다.
“Getting Started” 가이드는 대부분 스프링 부트를 기반으로 하며, 따라하기 쉽고 특정 기능을 구현하거나 특정 문제를 해결하는데 도움을 줍니다. 그리고 특정 문제를 해결할 때 고려할 수 있는 스프링 포트폴리오의 다른 프로젝트들도 안내하고 있습니다.
Leave a Reply