프로그래밍에 관심이 있다고 하면 스프링이란 단어를 들어봤을 것이다. 봄의 스프링 말고…
하지만 스프링과 스프링 부트의 차이점? 사실 스프링이 뭔지도 잘 모른다. 그냥 아 이런게 있구나.. Java를 쓰는 프레임워크 중에 유명한 거..그거! 이런 느낌이었을라나?
우선 그 전에 라이브러리와 프레임워크를 공부하면서 둘 모두 프레임워크라는 것은 알고 있다. 그렇다면 둘 모두 사용자 편의를 제공하지만 특정 약속 아래에서 프로그래밍을 하는 것일 터.
이참에 둘 모두 명확히 알고 공통점과 차이점, 어떤 것을 어떤 상황에 쓸 지까지 알아보고자 한다.
그 전에 Spring이 나오기 전에 있었던 것들에 대해 먼저 알아보자.
SPRING 이전?
- Java로 개발을 하던 초반엔 Servlets를 이용해 개발하였다. Servlets는 자바 기반의 동적 웹 앱을 개발하는 데 핵심이 되는 기술이며 자바 API를 모두 사용할 수 있다는 장점이 있지만 HTML을 생성하는게 번거롭다는 단점이 있었다.
- 이에 HTML 생성을 편하게 할 수 있는 JSP를 개발하게 되었고 이를 이용해 동적 웹페이지를 구성할 수 있게 되었다. 하지만 JSP는 하나의 파일 안에 HTML과 java 코드가 같이 있어 알아보기 어렵고 로직이 조금만 복잡해도 코드가 꼬일 수 있었다.
- 여기서 Servlet과 JSP를 섞어서 사용하면서 서로의 단점을 보완할 수 있게 사용하면서 MVC 패턴을 적용해 서로의 관심사를 나누게 되었다. MVC 패턴은 프로젝트를 구성할 때 Model, View, Controller로 구성요소를 세가지로 나눠 구분한 패턴이다.
- 이 구조를 바탕으로 한 프레임워크들이 다양하게 생기면서 MVC 프레임워크 춘추전국시대가 열리게 되었다. 대표 주자로 스트럿츠, 웹워크, 스프링 MVC(과거 버전) 등이 있었다.
- 앞서 존재한 프레임워크들은 EJB가 대표적인 표준 기술로써 존재
-
EJB: Enterprise Java Beans. 기업 환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델.
-
인스턴스 풀링, 트랜잭션 관리, 컴포넌트 생명주기 등의 특징을 가지고 있어 복잡한 로직 구현에 강점.
- 인스턴스 풀링: 자주 사용하는 객체를 메모리에 상주, 더 빠르게 사용하는 것.
- 트랜잭션 관리: 원자성, 일관성, 독립성, 지속성을 띄는 트랜잭션을 관리하는 것.
- 컴포넌트 생명주기: 라이프 사이클에 따라 컴포넌트는 생성과 실행, 종료한다.
-
EJB만을 위한 환경을 구성하고 사양을 맞춰야 했음. → 오히려 부담이 되는 상황이 되었다.
-
또한 이런 구조는 객체지향적인 자바를 객체지향에서 멀어지게 만들었다. 게다가 기술의 복잡함을 덜어주려다 오히려 무거워졌다.
→ 이러한 문제들 때문에 스프링이 나오게 되었다.
SPRING
스프링은 위의 설명처럼 여러 버전의 프레임워크들이 개발되고 그 중 스프링도 여러 버전과 방향성을 띈 프레임워크들이 개발 되었다. 현재의 스프링은 이렇게 개발 된 것들을 핵심을 뽑아 한데 모은 프레임워크다.
개념
Spring의 개념은 아래의 한 줄로 설명 할 수 있다.
- 엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크.
위의 개념을 하나하나 뜯어 보며 Spring을 살펴보자.
- 엔터프라이즈용 Java 애플리케이션 개발을 편하게 해주는 기업에서 운영하는 웹 서비스에는 비즈니스 로직 이라는 것이 있다. 비즈니스 로직은 기업이 제공하는 서비스를 코드로 구현한 것으로 사용자의 요구사항을 해결하는 실질적인 코드를 의미한다. 스프링이 등장하기 이전에는 이런 로직을 구현하기 위한 기술 자체에 대한 공부가 추가적으로 필요했는데, 이 기술이 복잡하고 어렵다고 한다. 이때 스프링은 이런 기술에 비해 상대적으로 덜 복잡한 사용 방법을 가지고 있다. 따라서 개발 초기에 기본적 설정과 적용시킬 기술들만 잘 선택한다면, 기술 보다 로직 자체에 더 집중하여 구현할 수 있는, 프레임워크의 특징을 잘 보여줄 수 있게 되었다.
- 오픈소스 스프링은 오픈소스로 모든 사용자에게 무료로 열려있다. 따라서 어떤 개인 및 기업도 스프링을 사용해 웹 애플리케이션을 개발 할 수 있고 필요 시 스프링의 코드를 일부 수정해 사용하는 것도 가능하다. 이렇게 수정을 통해 필요한 것을 개선해 나간다는 점에서 여러 사람들이 기능들을 검증하고 발전해 나아갈 수 있다. 하지만 정해진 인원이 개발과 관리를 하는 것이 아니기에 안정적이지 못하다는 단점을 가지고 있다. 기업 입장에선 안정적인 프레임워크를 사용해야 안정적인 서비스를 제공 할 수 있기 때문에 안정성은 매우 중요한 사항이다. 여기서 스프링은 SpringSource라는 IT 기업에서 관리하고 있어 이런 안정적인 개발과 개선이 보장되고 있다.
- 경량급 앞선 스프링의 간단한 설명처럼 SPRING은 여러 버전의 스프링을 한데 모아 만들었다. 즉, 다양한 라이브러리와 편의기능이 모여 스프링을 정의해서 개발자가 작성해야 할 코드가 단순해졌음을 의미한다.
- 애플리케이션 프레임워크 프레임워크는 앞에서 배웠듯 개발자에게 로직 구현을 맡기고 다른 부분은 프레임워크가 대신 해주는 것이므로 애플리케이션 프레임워크는 말 그대로 애플리케이션을 만드는데 사용하는 프레임워크이다.
특징
- POJO 프로그래밍을 지향.
- POJO는 Plain Old Java Object의 약자. 뜻은 문자 그대로 순수 자바만을 이용해 생성한 객체를 의미한다.
- 이 말은 Java의 스펙에 정의된 기술만을 사용하기 때문에 외부의 라이브러리나 모듈을 가져오지 않았다는 뜻이다.
- 이는 곧 특정 기술이나 환경에 의존적이거나 종속적이지 않다는 뜻으로 추후 기술의 발전에 따른 변화와 확장에 유연하게 대처할 수 있게 된다는 뜻이다.
이런 POJO에서 오는 3가지의 요소가 스프링의 특징에 그대로 반영된다.
- IoC(제어 역전)/DI(의존성 주입)
- 이전 프레임워크 공부할 때 배웠던 내용이다. 애플리케이션의 주요 흐름을 개발자가 아니라 프레임워크가 제어한다는 뜻이다.
- AOP(관점 지향 프로그래밍)
- 특정 상황 별 필요한 것을 개발하게 된다면 비슷하거나 같은 역할을 하는 코드가 생길 수도 있다. 이런 코드 중복이라는 문제를 해결하기 위해 관심 사항과 관련된 기능을 별도로 분리, 객체의 메서드를 통해 관심 사항을 분리해 구현한 코드를 실행하도록 하는 것이다.
- PSA(일관된 서비스 추상화)
- 이 또하 프레임워크 글에서 다뤘던 내용이다. DB를 연결할 때 DB의 프로그램의 변동에 관계없이 서비스를 유지할 수 있도록 하는 것이다.
SPRING BOOT
Spring Boot는 Spring을 보완하기 위해 나왔다고 한다. 그럼 Spring Boot는 뭘까?
개념
- 스프링을 더욱 편리하게 사용 할 수 있도록 지원해 주는 기술.
- 프레임워크를 보다 쉽게 사용할 수 있도록 만든 프레임워크.
스프링은 편리한 프레임워크지만 여러 프레임워크를 하나로 합친 만큼 설정해야 하는 것들이 많다. 이런 점을 보완하기 위해 나온 것이 SPRING BOOT 이다.
특징
- 톰캣, 제티, 언더토우 같은 웹 애플리케이션 서버(WAS, Web Application Server)가 내장되어 있어 따로 설치 하지 않아도 독립적 실행 가능
- 스프링 부트가 없으면 이런 서버를 일일히 설치, 실행하고 소스코드는 War 파일로 만들어 톰캣을 설치한 서버를 배포하고 했어야 했다.
- 빌드 구성을 단순화하는 스프링 부트스타터를 제공
- XML 설정을 하지 않고 자바 코드로 작성 가능.
- JAR를 이용해 자바 옵션만으로도 배포 가능
- 애플리케이션의 모니터링 및 관리 도구인스프링 액츄에이터(Spring Actuator) 제공
Spring VS Spring Boot
차이점
Spring Boot가 결국 Spring에서 불편한 기능들을 보완해 주는 프레임워크로 Spring을 위한 도구라고 생각해도 된다. 위의 Spring Boot의 특징을 비롯한 차이점을 아래의 표로 볼 수 있다.

어떤 것을 써야 할까?
Spring을 알기 위해선 Spring Boot를 알아가는 것이 도움이 되지만 Spring Boot도 결국 Spring의 기초 지식이 필요한, 마치 닭과 달걀의 관계 같은 느낌이다.
스프링의 개발을 처음 시작하는 사람이라면 스프링 부트를 먼저 공부하기를 추천 한다고 한다. 기본적인 세팅이 자동으로 되어 있는 상태에서 스프링의 사용법을 익히고 가는 것이 더 빠른 방법이라고 하니 말이다. 하지만 결국 이런 세팅들도 필요에 따라 세부 조절이 필요한 곳이 있을 수도 있으니 추후 스프링에 대한 공부도 해야 한다고 한다.
즉, 둘 다 공부해야 하는 것은 맞지만 스프링 부트가 스프링의 확장판의 개념에 가까운 만큼 스프링 부트를 먼저 해보고 스프링을 하는 것이 좋을 듯 싶다.
결론
- 자바를 이용한 여러 기술들이 있었지만 로직과 기술을 모두 배워야 한다는 문제점에 의해 EJB, servlets, JSP 등의 정해진 기술들을 이용한 프레임워크가 나왔다.
- 하지만 EJB를 이용한다면 자바의 객체지향성과 멀어지기 때문에 객체지향성을 살리고자 POJO에 따라 만들어진 오픈소스 프레임워크인 스프링의 다양한 모듈과 라이브러리를 합친 Spring이 나왔다.
- 이런 Spring도 설정이나 서버 쪽에서 불편한 부분이 있었기에 이런 것들을 자동화 해주는 Spring Boot가 나왔다.
- 상세 설정 등을 배우기 위해선 Spring 공부도 필요하지만 Spring에 대해 더 빠르게 배우기 위해선 Spring Boot로 공부를 시작 하는 것이 좋다.