
개발 스터디를 시작하며, 나는 스프링에 관해 공부를 하는 파트를 맡게 되었다. 우선, 내가 스프링에 대해 얼마나 알고 있는지 객관적으로 돌아볼 필요가 있었다.

처참했다. 알고 있던 지식도 정확한 것이 아닌 반은 맞고 반은 틀리는 것이었고, 누군가에게 설명하기엔 부족한 부분이 많았다.
그래서 스프링을 사용하는 개발자로서 갖추어야할 기본 지식들을 배우고 학습한 내용을 정리하기 위해 글을 작성하고자 한다.
스프링에 대해 알아보기 전, 우선 프레임 워크가 무엇인지부터 알아야한다.
Frame은 "틀"을 의미한다. Work은 "일하다"라는 뜻으로 이것을 합쳐보면 "틀을 가지고 일하다"가 된다.
즉 프레임워크는 제공받은 일정한 요소와 틀, 규약을 가지고 무언가를 만드는 것으로, 프로그램을 개발하기 위해 사용되는 틀을 제공하는 프로그램이다. 프레임워크로 개발을 할 경우 전체 동작방식은 프레임워크가 제공하고 개발자는 프레임워크의 일정 부분만 개발한다.
우리가 생명주기를 관리할 때, 직접 빈을 생성하는 코드를 직접 짜지 않아도 생성되는 것이 그러한 이유다.
프레임워크가 나오면 꼬리 물듯이 나오는 질문이다.
가장 큰 차이점은 제어의 통제권을 누가 가지고 있냐 로 구분할 수 있다.
프레임워크는 위에서 말했듯 프레임워크가 제어의 통제권을 가지고 있다. 예를 들면 설정파일의 태그 설정이나, DB 연동 방법등에 대한 규칙을 가지고 있고 개발자는 이를 따라야한다. 라이브러리는 반대로 개발자가 제어의 통제권을 가지고 있다.
스프링은 자바 진영의 프레임워크로, 자바를 기반으로 다양한 엔터프라이즈급 어플리케이션을 만들기 위해 사용되는 도구이다.
Spring 공식문서인 spring.io에서는 Spring을 다음과 같이 정의한다.

Why Spring?
Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world's most popular Java framework.
번역하면, 스프링은 자바에서 가장 대중적인 프레임워크라는 것을 알 수 있다. 또한, 스프링의 의미는 자바 언어 생태계의 긴 겨울을 끝내고 봄을 맞이한다는 것이라고도 알려져 있다.
앞에서 Spring의 정의에 대해서 살펴보았다. 그렇다면 Spring은 어떻게 개발되어졌고, 왜 만들어졌는지를 알아보자.
Spring이 등장하기 전에는 애플리케이션의 업무 로직을 담당하는 EJB가 Java의 표준 기술이었다.
Enterprise JavaBeans, EJB
기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다. 즉, EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다. EJB 사양은 Java EE의 자바 API 중 하나로, 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하는 역할을 한다.
앞에서 Spring의 정의를 보았다면 Spring은 Java 엔터프라이즈 개발을 보다 편하게 도와주는 프레임워크라는 것을 기억할 수 있을 것이다. 그렇다면 EJB는 Java 엔터프라이즈 개발이 편하지 않고 어렵다는 걸까?
IT시스템이 점점 증대하고 그에 따라 점점 복잡한 기술이 요구되었으며 자바의 기초적인 JDK만으로는 그것을 충족시킬 수 없었다. 서버 기반의 자바 기술인 J2EE가 등장했지만 Servlet, JSP 레벨의 최소한의 서버 프로그래밍 인터페이스만 가지고는 복잡한 애플리케이션을 제작하는 것은 쉽지 않았다.
이런 것을 보안하기 위해 나온 것이 바로 sun사에서 만든 EJB이다. EJB를 사용함으로서 개발자는 비즈니스 로직에만 집중할 수 있게 되었다.
하지만 이것은 배보다 큰 배꼽을 사용하는 것과 비슷했다. 현실에서 1% 미만의 애플리케이션을 위해 나머지 99% 애플리케이션도 무거운 기능을 사용해야했다. 또한, EJB의 혜택을 모두 얻기 위해서는 모든 기능이 다 필요하지도 않은 WAS를 구입해야 했고, 고급 IDE도움 없이는 복잡한 설정에 허우적대야 했다.
결국 EJB와 같은 잘못된 기술을 피하고, 객체지향 원리에 따라 만들어진 자바 언어의 기본에 충실하게 비즈니스 로직을 구현하는 일명 POJO방식으로 돌아서야 한다는 목소리가 높아졌다.
많은 종류의 프레임워크가 등장했고, 그 중 Java 진영에서는 대표적인 표준 기술로써 EJB가 등장했지만, 개발하기 복잡하고 무겁다는 단점 때문에 경량급 프레임워크인 Spring이 등장하게 되었다.
이 시기를 개발자들은 자바의 겨울에 비유했고, 스프링이 등장함으로써 그 겨울이(EJB를 사용하던 시기) 끝나고 봄이 찾아오게 될 것이라는 의미로 이 J2EE framework를 스프링이라 이름지었다.
요약하자면
- EJB는 복잡한 자바 엔터프라이즈 애플리케이션 개발을 간편하게 하려는 목적으로 나왔지만, 너무 무겁고 복잡하다는 단점이 있었다.
- 이에 따라 객체지향 원리에 충실하게 비즈니스 로직을 구현하는 POJO 방식으로 돌아가야 한다는 의견이 제기되었다.
- 이러한 배경 속에서 개발자들의 요구에 부합하는 경량급 프레임워크로서 스프링이 등장하게 되었다.
Spring이 EJB를 대체하기 위해 등장했다는 간단한 사실을 배우게 되었다.
그렇다면 Spring이 얼마나 강력하길래 EJB를 넘어서서 대중적인 프레임워크로 자리잡은걸까? EJB의 큰 단점인 객체지향적 특성을 잘 지킬 수 있어서일까? Spring의 특징을 보면 그 해답을 얻을 수 있다.
경량 컨테이너로서 자바 객체를 직접 관리
스프링은 POJO 방식의 프레임워크
IoC 지원
DI 지원
AOP 지원
영속성과 관련 다양한 서비스를 지원
iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.위 특징들만으로는 POJO가 어떻게 EJB를 넘어설 수 있는지 알기 힘들 수 있다. 그렇다면, 두 용어에 대해서 알아보도록 하자.
POJO는 단순한 자바 오브젝트를 의미한다. 이는 특정 규약, 인터페이스, 베이스 클래스를 따르지 않는 자바 클래스를 말한다. 즉, POJO는 특정한 '제약' 없이 자유롭게 코드를 작성할 수 있는 개념이다.
예를 들어, 자동차를 모델링하는 클래스를 만든다고 생각해보자. 이 클래스에는 '색상', '브랜드', '모델' 등의 속성이 있을 것이고, '가속', '정지' 등의 메소드가 있을 수 있다. 이런 클래스는 어떤 특정한 프레임워크나 기술에 의존하지 않아, POJO라고 볼 수 있다.
EJB는 자바 엔터프라이즈 플랫폼(Java EE)의 서버 측 컴포넌트 모델로서, 대규모 엔터프라이즈 애플리케이션을 개발하는데 사용된다. EJB는 비즈니스 로직을 처리하는 역할을 하며, 트랜잭션 관리, 보안, 원격 접근, 생명주기 관리 등의 서비스를 제공한다.
EJB를 사용하면 개발자는 복잡한 시스템 수준의 작업을 자동으로 처리해주는 컨테이너에 의존하여, 비즈니스 로직에만 집중할 수 있다. 하지만 EJB를 사용하기 위해서는 EJB 컨테이너가 제공하는 API를 사용하고, 특정 인터페이스를 구현해야 한다. 이로 인해 EJB 컴포넌트는 비교적 복잡하고 무겁다.
결국, EJB는 비즈니스 로직을 캡슐화하고 시스템 수준의 서비스를 제공하는 데는 강력하지만, 그에 따른 복잡성과 무거움이 단점으로 작용할 수 있다. 이에 비해 POJO는 이러한 단점을 상쇄하여 특정 프레임워크나 기술에 의존하지 않고 자유롭게 코드를 작성할 수 있어, 더 단순하고 유연한 개발이 가능하다.
마지막으로, 스프링하면 과자 묶음 세트처럼 딸려오는 스프링 부트와 스프링과 어떤 차이가 있는지에 대해 알아보자.
스프링을 사용하여 애플리케이션을 개발하려면 설정이 상당히 복잡하고, 개발자가 직접 설정 파일(XML 또는 자바 설정 파일)을 작성해야 한다. 이때 등장한 것이 스프링 부트(Spring Boot)이다.
스프링 부트는 스프링을 기반으로 만들어진 것으로, 복잡한 스프링 설정을 단순화하고 빠르게 애플리케이션을 개발하고 실행할 수 있게 돕는 도구이다. 스프링 부트는 개발자가 직접 복잡한 설정을 할 필요 없이 주요 설정들을 자동화한다. 또한, 내장 Tomcat, Jetty 등의 서버를 제공하여 별도의 웹 서버 설치 없이도 웹 애플리케이션을 실행할 수 있게 도와준다.
요약하면, 스프링은 자바 기반의 애플리케이션 개발을 위한 기본적인 틀을 제공하는 반면, 스프링 부트는 그 틀 위에서 복잡한 설정을 단순화하고 빠르게 애플리케이션을 개발하고 실행할 수 있게 돕는 도구라고 볼 수 있다.

나는 스프링에 대해서는 알고 싶었으나, 알고 싶지 않았던 그런 이중적인 모습을 갖고 있었다. 하지만, 이번 학습을 통해 스프링의 정의, 등장 배경, 필요성을 정리하며 이해하는 시간을 가지니 왜 조금이라도 더 일찍 알려고 하지 않았을까 하는 반성의 시간을 갖게 되었다.
여전히 스프링에 관해서는 모르는 것이 많다고 생각한다. 하지만, 모르는 것을 모른다에서 끝내는 것이 아닌 알아간다는 마음가짐으로 지속적으로 학습을 이어나갈 예정이다.
자료 출처
spring.io
seungdols님의 글