스프링은 자바 플랫폼 기반 오픈소스 애플리케이션 프레임워크이다. 엔터프라이즈급 애플리케이션 개발에 필요한 모든 기능을 종합적으로 제공하며, 경량화된 설루션으로 개발자의 부담을 덜어준다. 주요 특징으로는 객체 생성 및 소멸 관리, 외존성 주입, AOP, MVC 웹 프레임워크 등이 있으며, 다양한 모듈을 통해 웹 개발, 데이터 접근, 트랜잭션 관리, 보안 등을 손쉽게 처리할 수 있다.
스프링 생태계
스프링은 어떤 특정한 하나의 프로그램이 아니라 여러 가지 여러 가지 기술들의 모음이라고 할 수 있다. 먼저 스프링이라고 하면 가장 먼저 떠오르는 것과 핵심이라고 할 수 있는 스프링 프레임워크가 있고 여러 기술들을 편리하게 사용할 수 있도록 도와주는 스프링 부트, 스프링 데이터, 스프링 세션 등과 같은 여러 가지가 있다.
여기서 간단하게 오른쪽에 있는 선택적인 기술들에 대해 간단하게 알아보고 넘어가자.
프로그램
기능
Spring Data
데이터베이스의 종류가 달라도 기본적인 CRUD는 비슷하다. 스프링 데이터는 이런 CRUD를 더 편리하게 사용할 수 있도록 도와준다.
Spring Session
세션 기능을 조금 더 편리하게 사용할 수 있도록 도와준다.
Security
스프링의 보안을 관리할 수 있도록 도와준다.
REST Docs
API 문서와 테스트를 편리하게 할 수 있게 도와준다.
Spring Batch
실시간으로 한 번에 대량의 데이터를 처리하고 저장하기 번거롭기 때문에 1,000개, 10,000개와 같은 일정 단위로 일정 주기마다 데이터를 처리하고 저장하는 것을 배치 처리라고 하는데, Spring Batch는 이러한 배치 처리를 더 편리하게 할 수 있도록 도와준다.
Spring Cloud
클라우드 기술에 특화된 기술이다.
위에서 언급한 기술 외에도 정말 많은 기술들이 있는데, 보다 더 많은 기술들은 Spring.io 에서 확인할 수 있다. 해당 화면에서 볼 수 있는 모든 기술들이 스프링 관련 프로젝트들이다. 하지만 저 프로젝트들 중에서도 가장 핵심은 스프링 프레임워크라고 보면 된다. 그리고 저 모든 기술들을 편리하게 사용할 수 있게 해 주는 게 스프링 부트이다.
Spring Framework
그럼 이제 가장 중요한 스프링 프레임워크에 대해 좀 더 자세히 알아보자. 스프링 프레임워크는 핵심 기술인 Spring의 어떤 DI, 컨테이너, AOP, 이벤트 등으로 이루어져 있다. 그다음으로는 웹 기술이 있는데, 웹 기술은 Spring MVC, 웹플렉스와 같은 것들이 있다. 또한, DB에 접근하는 데이터베이스 트랜잭션이나 JDBC ORM 등을 지원하는 데이터 접근 관련 기술이 있다. 그 외에 기술 통합(캐시, 이메일, 원격접근, 스케줄링), 테스트(스프링 기반 테스트 지원), 언어(코틀린, 그루비) 등이 있는데 이러한 기술들을 최근에는 스프링 부트를 통해서 스프링 프레임워크의 기술들을 편리하게 사용한다.
하지만 최근 들어서는 스프링보단 스프링 부트를 더 많이 사용하는 추세이다. 스프링 부트는 스프링을 편리하게 사용할 수 있도록 지원하는데 최근에는 스프링 부트를 많이 사용하는 추세이다. 스프링 부트는 단독으로 스프링 웹 애플리케이션을 쉽게 생성하며 Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 된다는 편리함이 있다.
왜 스프링을 만들었을까?
스프링은 객체지향이 가진 장점들을 최대로 사용할 수 있게 해주는 프레임워크
위에서 언급했다시피 스프링은 로드 존슨이 처음으로 만든 약 3만 줄의 코드로 시작되었다. 하지만 위에서 잠깐 봤을 때 스프링이란 기술은 매우 복잡하고 커 보인다. 왜 사람들이 로드 존슨의 그 3만 줄의 코드에 이어 더 기술을 발전시키고 확장시키고 오픈소스까지 만들자고 하였을까? 해답을 찾으려면 로드 존슨이 처음 3만 줄의 코드를 작성했을 때 잡았던 핵심 콘셉트에 대해 먼저 이해해야 한다.
스프링의 핵심 콘셉트를 이해하기 위해서 먼저 스프링은 자바 기반의 프레임워크라고, 자바는 객체지향 언어임을 다시 한번 상시 시켜보자. 그리고 스프링은 객체지향 언어가 가진 가장 강력한 특징을 가장 잘 살려내는 프레임워크이다. 그럼 여기서 로드 존슨이 스프링의 최초 3만 코드를 개발하였을 때, 많은 사람들이 열광했던 이유를 조금 알 수 있다. 스프링이 탄생하기 전에는 EJB를 사용했다고 언급했었다. EJB를 사용하게 되면 EJB를 상속받고 의존적으로 개발을 해야 한다. 그렇게 되면 객체지향으로서 발휘되는 좋은 장점들을 거의 사용할 수 없게 된다.
한 마디로, EJB에 종속돼서 EJB 스타일로 개발할 수 없게 된다는 뜻이다. 그래서 순수한 객체지향으로 돌아가자라는 취지로 POJO라는 개념도 나왔다. 그리고 이 핵심이 스프링이 가진 DI 컨테이너에 이러한 것들을 가능하게 하는 것들이 있었다.
따라서 스프링에 대해 배우기 전, 스프링이 가장 추구하는 철학이 무엇인지 항상 기억하며 스프링을 배워보도록 하자. 스프링은 객체지향 언어를 더욱더 객체지향 언어답게 사용할 수 있게 도와주는 프레임워크이다. 만약 스프링을 사용했던 필자들 중에서 스프링은 의존적이고 객체지향의 특징을 살릴 수 없다고 느꼈던 분들이 있다면 그건 스프링에 대해 잘 이해하지 못하고 그저 기능만 사용했던 것이라고 생각한다.