로드 존슨이 EJB 없이도 충분히 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주며, 30,000라인 이상의 기반 기술을 예제 코드로 선보였다. 여기에 지금의 스프링 핵심 개념과 기반 코드가 들어가 있다.
책 출간 직후, Juergen Hoeller(유겐 휠러)와 Yann Caroff(얀 카로프)가 로드 존슨에게 오픈소스 프로젝트를 제안했고, 전통적인 EJB라는 겨울을 넘어 새로운 시작이라는 이름으로 '스프링'이라 명명했다.
• 2003년 스프링 프레임워크 1.0 출시 - XML
• 2006년 스프링 프레임워크 2.0 출시 - XML 편의 기능 지원
• 2009년 스프링 프레임워크 3.0 출시 - 자바 코드로 설정
• 2013년 스프링 프레임워크 4.0 출시 - 자바8
• 2014년 스프링 부트 1.0 출시
• 2017년 스프링 프레임워크 5.0, 스프링 부트 2.0 출시 - 리엑티브 프로그래밍 지원
• 2020년 9월 현재 스프링 프레임워크 5.2.x, 스프링 부트 2.3.x
스프링은 어느 하나를 뜻하는게 아닌, 여러 기술의 집합체이다.
스프링 공식 홈페이지를 방문하면 정말 많은 프로젝트로 생태계가 형성되어 있다. 각종 데이터베이스에 접근하도록 도와주는 스프링 데이터나, 세션 기능을 편리하게 사용할 수 있도록 돕는 스프링 세션, 보안과 관련된 스프링 시큐리티 등 굉장히 많은 프로젝트들이 있다.
이 중 핵심은 스프링 프레임워크와 스프링 부트이다.
• 핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타
• 웹 기술: 스프링 MVC, 스프링 WebFlux
• 데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원
• 기술 통합: 캐시, 이메일, 원격접근, 스케줄링
• 테스트: 스프링 기반 테스트 지원
• 언어: 코틀린, 그루비
• 최근에는 스프링 부트를 통해서 스프링 프레임워크의 기술들을 편리하게 사용
• 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
• 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성
• Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
• 손쉬운 빌드 구성을 위한 starter 종속성 제공
• 스프링과 3rd parth(외부) 라이브러리 자동 구성
• 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
• 관례에 의한 간결한 설정
스프링은 자바 기반으로, 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크이다. 즉, 스프링은 좋은 객체 지향 어플리케이션을 개발할 수 있게 도와준다.
그렇다면, 좋은 객체 지향 프로그래밍이라는 것은 무엇일까?
객체지향의 특징에는 대표적으로 추상화, 캡슐화, 상속, 다형성이 있다.
이 중 '다형성'에 대해 살펴보자.
실세계와 객체 지향을 1:1로 매칭할 수는 없지만, 이해를 위해 실세계로 비유해보자.
먼저, 역할과 구현으로 세상을 구분한다고 가정해보자.
위와 같이 두 가지 예시를 들 수 있다.
자동차 역할에 K3가 구현되든 아반떼가 구현되든 운전자는 상관없이 운전할 수 있어야 한다.
공연 무대 또한, 로미오 역할에 장동건이 오든 원빈이 오든 공연은 상관없이 진행되어야 한다.
이렇게 역할과 구현이 분리되면 유연하고, 변경이 용이해진다.
또 다른 장점에는 무엇이 있을까?
• 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
• 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
• 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
• 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
자바 언어의 다형성을 활용하면 다음과 같이 볼 수 있을 것이다.
오버라이딩을 통해 인터페이스를 빨간색 혹은 초록색으로 구현하면, 클라이언트는 구현된 색상을 바라보게 된다.
한마디로, 다형성을 통해 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있는 것이다. 이렇게 다형성을 활용해 유연하고, 변경이 용이하며 확장 가능한 설계를 하는 것이 중요하다.
스프링은 제어의 역전, 의존관계 주입 등으로 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다. 그렇기에 스프링을 사용하면 마치 레고 블럭 조립하듯이 구현을 편리하게 변경할 수 있다.
Ref.
스프링 핵심원리(김영한)