왜 Spring을 사용할까?
현재 현업에서 가장 많이 쓰이는 프레임워크는 단연 Spring이 1위이다.
그래서 나도 Spring, SpringBoot를 배우고 있지만 Spring의 어떤 점이 좋은지, Spring을 왜 쓰는지는 몰랐다.
그냥 남들 많이 쓰길래 시작했지만 썼지..ㅎ

배우다 보니 생각보다 굉장히 편리하면서도 빈 주입 순서나 의존성 문제 등 이해해야 할 부분이 많아 블로그에 Spring의 원리를 정리해가며 제대로 공부해보고 싶다고 생각하게 되었다. 단순한 기능을 구현하는 개발자가 아니라 확장성, 유지보수까지 고려하는 설계 능력을 갖춘 개발자가 되고 싶기 때문이다.
강의 들은 내용에 최대한 구글링 하고 영어 원서도 찾아보며 한 번 찾아보았다.
이번 포스팅에서는 그 다짐의 첫 번째 도약으로, Spring Framework가 탄생하게 된 배경과 Spring이 해결하고자 했던 이전 프레임워크의 문제점, Spring의 핵심적인 특징에 대해 알아보고자 한다.
Spring은 EJB의 한계를 극복하기 위해 등장했다고 한다. 그렇다면 EJB는 무엇인가?
1990년대 후반- 2000년대 초반까지 기업 애플리케이션의 복잡성이 급격하게 증가하며,
대규모 트랜잭션 처리, 분산 시스템, 보안 요구사항 등 개발자들은 복잡한 요구사항들을 관리해야 했다.
이를 지원하기 위해 비즈니스 로직을 캡슐화하는 표준화된 컴포넌트 모델을 제공하여 일관된 개발 방식을 지원하는 EJB가 자바 EE(Enterprise Edition)의 핵심 컴포넌트로 도입되었다.
EJB는 강력한 기능을 제공했지만 몇 가지 단점이 있었다.
1. 테스트의 어려움
분산 애플리케이션은 단일 JVM에서 실행되는 애플리케이션보다 항상 테스트하기가 더 어렵다.
원격 인터페이스를 사용하든 로컬 인터페이스를 사용하든 EJB 애플리케이션은
컨테이너 내에서만 실행할 수 있어 컨테이너 서비스에 대한 의존성이 높아 단위 테스트가 어렵다.
2. 복잡한 개발 과정
Home Interface: EJB 인스턴스 생성/제거 담당, Remote Interface: 클라이언트가 호출할 메서드 정의, Bean Class: 실제 비즈니스 로직을 수행하는 구현체 등 여러 인터페이스를 구현해야 했고, XML 설정 파일을 필수적으로 작성해야 했다.
이로 인해 개발 속도가 느려지고, XML 설정의 유지보수도 어려웠다.
3. 무거운 컨테이너
EJB를 사용하면 애플리케이션 작성을 편하게 할 수 있다. 로우레벨의 트랜잭션이나 상태 관리, 멀티스레딩, 리소스 풀링과 같은 복잡한 로우레벨의 API 따위를 이해하지 못하더라도 아무런 문제 없이 애플리케이션을 개발할 수 있다.
EJB의 목표는 편리한 애플리케이션 개발이었지만, 기술에 대해 과도한 욕심을 부린 탓에 불필요하게 무거웠다.
EJB 객체의 생성, 제거, 트랜잭션 관리, 보안 설정 등을 자동으로 처리하지만, 이로 인해 불필요한 메모리 사용, 오버헤드가 발생했다.
4. 의존성 강한 설계
EJB는 JNDI(Java Naming and Directory Interface)를 통해 객체를 찾는 구조로 특정 서버 환경과 밀접하게 결합된 구조이다.
이는 코드의 결합도를 증가시켜 새로운 기능을 추가하거나 서버를 변경하는 것이 어렵고, 유지보수를 어렵게 만들었다.
이로 인해 배포도 어렵고, 실행도 어렵고, 여러모로 비효율적인 면이 있었고
해결해야 할 문제로 남게 되었다.
이러한 EJB의 단점을 해결하기 위해 2003년 로드 존슨이 "Expert One-on-One J2EE Design and Development"라는 책을 출간하며 Spring Framework를 발표했다.

책 초반부에서 로드 존슨은 EJB는 다음과 같은 근거로 EJB의 문제점을 지적한다.
1. 테스트하기 어렵다
2. 배포도 어렵다.
3. Remote Interface를 사용하는 EJB는 설계도 어렵다.
EJB를 대체할 방안을 3만 라인 정도의 샘플 코드를 예시로 들며 설명하는데 여기에서 사용된 예시용 프레임워크가 매우 흥미로웠던 개발자들이 로드 존슨을 설득하여 오픈소스 프로젝트를 시작하게 됐다고 한다. 그렇게 우리에게 익숙한 스프링 프레임워크가 등장했다.
그렇다면 스프링은 뭔데 EJB의 문제점을 해결했을까? 이 정의에 스프링의 특징이 다 들어가 있다.
자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
하나하나 뜯어보자.
1. 오픈 소스
2. 경량급
3. 애플리케이션 프레임워크
4. 편한 자바 엔터프라이즈 개발
EJB의 문제를 해결하고 편하게 자바 엔터프라이즈를 개발하는 것을 목표로 스프링은 다음과 같은 기능을 가지고 있다.
스프링이 경량급 애플리케이션 프레임워크인 이유는,
경량 컨테이너를 사용하여 애플리케이션 내 흐름을 관리하고, 불필요한 무거운 서버나 복잡한 설정 없이 필요한 기능만 제공하기 때문이다.
기존의 무거운 EJB의 컨테이너와 달리 필요한 기능만 제공하여 애플리케이션의 성능을 최적화화고,
Spring은 내장형 서버(예: Tomcat, Jetty 등)를 사용하여 별도의 복잡한 애플리케이션 서버 설정 없이 애플리케이션을 실행 및 배포할 수 있다.
경량 컨테이너의 포인트는 "객체 생명주기 관리의 주체"이다.
제어의 역전은 경량 컨테이너의 기반이 되는 원칙이다.
전통적인 프로그래밍 방식에서는 개발자가 애플리케이션의 흐름을 제어했다.
개발자가 언제 어느 객체를 생성하고 폐기할지 어떤 흐름으로 실행할지를 모두 정했다.
이는 개발자가 객체의 생명주기를 직접 생각해야 한다는 뜻이다.
그러나 외부 프레임워크나 컨테이너가 제어 흐름을 제어하게 한다면
개발자는 객체의 생성, 초기화, 소멸, 그리고 의존성 주입을 신경 쓸 필요 없다.
이처럼 애플리케이션 흐름을 제어하는 주체가 '개발자'에서 '프레임워크'로 역전되어
개발자는 객체의 생명주기를 세세하게 신경쓰지 않고
오직 비즈니스 로직에만 집중할 수 있게 되었다.
IoC를 구현하는 방법에는 의존성 주입(DI)와 의존성검색(DL) 등이 있는데 스프링은 기본적으로 DI 방식을 사용한다.
의존성 주입은 객체 간의 의존성을 직접 설정하는 대신, 필요한 객체를 외부에서 주입하는 기술이다.
즉, 클래스 간의 의존관계를 Bean 설정에 기반하여 컨테이너가 자동으로 연결해주는 방식이다.
의존성을 주입받는 방법은 크게 3가지가 있다.
의존성 주입의 장점은 다음과 같다.
관점 지향 프로그래밍은 프로그램을 구성하는 핵심 비즈니스 로직(주된 관심사)과 공통적으로 필요한 부가 기능(횡단 관심사)을 분리하여 모듈화하는 프로그래밍 패러다임이다.
횡단 관심사
애플리케이션의 여러 모듈이나 컴포넌트에 걸쳐 공통적으로 적용되는 기능으로
로깅, 보안, 트랜잭션 관리, 예외 처리가 대표적인 예시이다.
다음 그림과 같이 여러 모듈에 횡단 형태로 포함된다는 의미에서 붙여진 이름이다.

공통 모듈은 필요한 시점에 비즈니스 로직에 삽입되어 실행되어
코드의 중복을 줄이고, 유지보수를 용이하게 한다.
스프링의 어떤 점이 좋아 스프링을 쓰는지 알아보았다.
| 특징 | Spring | EJB (Enterprise JavaBeans) |
|---|---|---|
| 컨테이너 | 경량 컨테이너 (Spring IoC 컨테이너) | 무거운 컨테이너 (EJB 컨테이너) |
| 객체 관리 | 객체의 생명주기와 의존성 관리가 Spring 컨테이너에서 자동으로 처리 | 객체의 생명주기 관리가 클라이언트 요청에 따라 EJB 컨테이너에서 처리, 설정 복잡도 높음 |
| 설정 | XML 설정 또는 어노테이션 기반으로 설정 가능 | 대부분 XML 설정이 필요하고 설정이 복잡함 |
| 배포 | 내장 서버 지원 (예: Spring Boot로 Tomcat, Jetty 등 사용) | EJB 컨테이너가 반드시 필요 |
| 의존성 관리 | 의존성 주입(DI)을 통해 객체 간 의존성 관리 | EJB 컨테이너에서 객체 생성 및 의존성 관리 |
| 성능 | 경량화된 설계로 성능 최적화 가능 | 무겁고 복잡하여 성능이 낮을 수 있음 |
| 트랜잭션 관리 | AOP를 사용하여 트랜잭션 관리 가능 | EJB 내장 트랜잭션 관리 기능 사용 |
| 확장성 | 애플리케이션이 쉽게 확장 가능 | 유지보수와 확장 모두 어려움 |
| 테스트 용이성 | Mock 객체 활용 가능하고 단위 테스트가 쉬움 | 테스트가 어렵고, EJB 컨테이너에 의존 |
| 공통 관심사 처리 | AOP로 공통 기능(로깅, 보안, 트랜잭션 등)을 분리 | 복잡한 설정이 필요 |
추천
[스프링] 스프링이란 무엇인가? : 로드 존슨의 책을 가장 잘 정리한 글이라고 본다. 강추!
[Spring] Spring vs EJB :Spring뿐만 아니라 EJB의 특징에 대해 가장 자세히 기술한 글이다.
"스프링 5 마스터 2/e", 랑가 라오 카라남, 에이콘출판사, 2020