[Spring] WP 4-1. Spring을 쓰는 이유: Spring의 등장 배경과 특징 feat. EJB

소영·2025년 2월 9일
post-thumbnail

🍀 들어가면서

왜 Spring을 사용할까?

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

배우다 보니 생각보다 굉장히 편리하면서도 빈 주입 순서나 의존성 문제 등 이해해야 할 부분이 많아 블로그에 Spring의 원리를 정리해가며 제대로 공부해보고 싶다고 생각하게 되었다. 단순한 기능을 구현하는 개발자가 아니라 확장성, 유지보수까지 고려하는 설계 능력을 갖춘 개발자가 되고 싶기 때문이다.
강의 들은 내용에 최대한 구글링 하고 영어 원서도 찾아보며 한 번 찾아보았다.

💡 주제

이번 포스팅에서는 그 다짐의 첫 번째 도약으로, Spring Framework가 탄생하게 된 배경과 Spring이 해결하고자 했던 이전 프레임워크의 문제점, Spring의 핵심적인 특징에 대해 알아보고자 한다.

✔️ Spring 이전에 "EJB"가 있었다

Spring은 EJB의 한계를 극복하기 위해 등장했다고 한다. 그렇다면 EJB는 무엇인가?

EJB란?

  • Enterprise JavaBean
  • 자바 플랫폼을 기반으로 한 서버 사이드 컴포넌트 모델
  • 엔터프라이즈 애플리케이션 개발을 단순화하고 표준화된 방법으로 비즈니스 로직을 구현할 수 있도록 설계됨

1990년대 후반- 2000년대 초반까지 기업 애플리케이션의 복잡성이 급격하게 증가하며,
대규모 트랜잭션 처리, 분산 시스템, 보안 요구사항 등 개발자들은 복잡한 요구사항들을 관리해야 했다.

이를 지원하기 위해 비즈니스 로직을 캡슐화하는 표준화된 컴포넌트 모델을 제공하여 일관된 개발 방식을 지원하는 EJB가 자바 EE(Enterprise Edition)의 핵심 컴포넌트로 도입되었다.

EJB의 주요 목적

  • 표준화된 컴포넌트 모델 제공: 일관된 방식으로 비즈니스 로직을 구현할 수 있도록 표준화된 컴포넌트 모델을 제공.
  • 인프라 서비스 자동화: 트랜잭션 관리, 보안, 원격 접근 등 엔터프라이즈 애플리케이션에 필수적인 인프라 서비스를 자동으로 처리하여 개발자가 비즈니스 로직에 집중할 수 있게 지원.
  • 확장성 및 분산 처리 지원: 분산 환경에서의 애플리케이션 확장성과 성능을 지원하여 대규모 트랜잭션 처리를 용이하게 함.

🔎 Spring의 등장 배경

EJB의 한계

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)를 통해 객체를 찾는 구조로 특정 서버 환경과 밀접하게 결합된 구조이다.
이는 코드의 결합도를 증가시켜 새로운 기능을 추가하거나 서버를 변경하는 것이 어렵고, 유지보수를 어렵게 만들었다.

이로 인해 배포도 어렵고, 실행도 어렵고, 여러모로 비효율적인 면이 있었고
해결해야 할 문제로 남게 되었다.

Spring의 등장 계기

이러한 EJB의 단점을 해결하기 위해 2003년 로드 존슨이 "Expert One-on-One J2EE Design and Development"라는 책을 출간하며 Spring Framework를 발표했다.

책 초반부에서 로드 존슨은 EJB는 다음과 같은 근거로 EJB의 문제점을 지적한다.
1. 테스트하기 어렵다
2. 배포도 어렵다.
3. Remote Interface를 사용하는 EJB는 설계도 어렵다.

EJB를 대체할 방안을 3만 라인 정도의 샘플 코드를 예시로 들며 설명하는데 여기에서 사용된 예시용 프레임워크가 매우 흥미로웠던 개발자들이 로드 존슨을 설득하여 오픈소스 프로젝트를 시작하게 됐다고 한다. 그렇게 우리에게 익숙한 스프링 프레임워크가 등장했다.

✨ Spring

Spring의 정의: 스프링 프레임워크란?

그렇다면 스프링은 뭔데 EJB의 문제점을 해결했을까? 이 정의에 스프링의 특징이 다 들어가 있다.

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

하나하나 뜯어보자.

1. 오픈 소스

  • 앞서 등장 계기에서 설명했듯 오픈 소스 프로젝트로 발전된 Spring은 Apache 2.0 라이선스를 기반으로 한 오픈소스 프레임워크이다.
  • 무료이며, 전 세계 개발자들이 지속적으로 발전에 참여하고, 커뮤니티도 활발하다.

2. 경량급

  • 기존 EJB의 무겁고 복잡한 구조를 개선했다.
  • 특정 컨테이너가 반드시 필요했던 EJB와 달리 POJO(Plain Old Java Obejct) 기반으로 설계된 스프링은 Tomcat, Jetty, Undertow 같은 가벼운 웹 서버에서도 실행 가능하다.
  • 즉, 개발자가 원하는 환경에서 유연하게 실행될 수 있다.
  • 또한 Java 코드와 어노테이션 기반의 설정을 지원하며 XML 설정도 최소화되어 가볍고 단순하다.

3. 애플리케이션 프레임워크

  • 애플리케이션 프레임워크: 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애츨리케이션의 전 영역을 포괄하는 범용적인 프레임워크
  • 개발자가 비즈니스 로직만 작성하면 나머지 기능(트랜잭션, 보안, 객체 관리 등)은 프레임워크가 알아서 처리한다는 게 포인트이다.
  • EJB, Spring 모두 애플리케이션 프레임워크지만 EJB보다 간단하고 유연하다.

4. 편한 자바 엔터프라이즈 개발

  • 스프링의 목표는 여러 가지 핵심 기능으로 복잡한 개발을 간단하게 해주는 것이다.

Spring의 핵심 개념

EJB의 문제를 해결하고 편하게 자바 엔터프라이즈를 개발하는 것을 목표로 스프링은 다음과 같은 기능을 가지고 있다.

경량 컨테이너

스프링이 경량급 애플리케이션 프레임워크인 이유는,
경량 컨테이너를 사용하여 애플리케이션 내 흐름을 관리하고, 불필요한 무거운 서버나 복잡한 설정 없이 필요한 기능만 제공하기 때문이다.

  • 객체의 라이프사이클 관리
    객체의 생명주기를 개발자가 아니라 컨테이너에서 관리한다.
  • 의존성 주입 처리
    각 객체에서 직접 필요한 의존성을 생성하거나 찾는 것이 아니라 컨테이너가 객체에 필요한 의존성을 주입한다.
  • 설정 기반 동작
    컨테이너는 설정 파일+어노테이션에 기반해서 객체(스프링 빈)을 생성한다.

기존의 무거운 EJB의 컨테이너와 달리 필요한 기능만 제공하여 애플리케이션의 성능을 최적화화고,
Spring은 내장형 서버(예: Tomcat, Jetty 등)를 사용하여 별도의 복잡한 애플리케이션 서버 설정 없이 애플리케이션을 실행 및 배포할 수 있다.

제어의 역전(Inversion of Control, IoC)

경량 컨테이너의 포인트는 "객체 생명주기 관리의 주체"이다.
제어의 역전은 경량 컨테이너의 기반이 되는 원칙이다.

전통적인 프로그래밍 방식에서는 개발자가 애플리케이션의 흐름을 제어했다.
개발자가 언제 어느 객체를 생성하고 폐기할지 어떤 흐름으로 실행할지를 모두 정했다.
이는 개발자가 객체의 생명주기를 직접 생각해야 한다는 뜻이다.

그러나 외부 프레임워크나 컨테이너가 제어 흐름을 제어하게 한다면
개발자는 객체의 생성, 초기화, 소멸, 그리고 의존성 주입을 신경 쓸 필요 없다.

이처럼 애플리케이션 흐름을 제어하는 주체가 '개발자'에서 '프레임워크'로 역전되어
개발자는 객체의 생명주기를 세세하게 신경쓰지 않고
오직 비즈니스 로직에만 집중할 수 있게 되었다.

의존성 주입(Dependency Injection, DI)

IoC를 구현하는 방법에는 의존성 주입(DI)와 의존성검색(DL) 등이 있는데 스프링은 기본적으로 DI 방식을 사용한다.

의존성 주입은 객체 간의 의존성을 직접 설정하는 대신, 필요한 객체를 외부에서 주입하는 기술이다.
즉, 클래스 간의 의존관계를 Bean 설정에 기반하여 컨테이너가 자동으로 연결해주는 방식이다.

의존성을 주입받는 방법은 크게 3가지가 있다.

  • 생성자 주입
  • 세터 주입
  • 필드 주입

의존성 주입의 장점은 다음과 같다.

  • 결합도 감소: 객체 간의 직접적인 의존성이 줄어든다.
  • 유연성 향상: 의존성을 쉽게 교체하거나 확장할 수 있다.
  • 테스트 용이성: Mock 객체를 주입하여 단위 테스트를 수행할 수 있다.
  • 재사용성 증가: 모듈 간의 독립성이 높아져 재사용이 용이하다.

관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)

관점 지향 프로그래밍은 프로그램을 구성하는 핵심 비즈니스 로직(주된 관심사)공통적으로 필요한 부가 기능(횡단 관심사)을 분리하여 모듈화하는 프로그래밍 패러다임이다.

횡단 관심사
애플리케이션의 여러 모듈이나 컴포넌트에 걸쳐 공통적으로 적용되는 기능으로
로깅, 보안, 트랜잭션 관리, 예외 처리가 대표적인 예시이다.
다음 그림과 같이 여러 모듈에 횡단 형태로 포함된다는 의미에서 붙여진 이름이다.

공통 모듈은 필요한 시점에 비즈니스 로직에 삽입되어 실행되어
코드의 중복을 줄이고, 유지보수를 용이하게 한다.

정리: EJB와 Spring 비교

스프링의 어떤 점이 좋아 스프링을 쓰는지 알아보았다.

Spring vs EJB

  • 경량화: Spring은 필요한 기능만 제공하고, 복잡한 설정 없이 가볍게 애플리케이션을 구성할 수 있도록 한다. EJB는 무거운 컨테이너로, 성능에 부담을 주고 복잡한 설정을 요구했다.
  • 배포 용이성: Spring은 내장 서버를 지원하여, 별도의 복잡한 애플리케이션 서버 설정 없이 쉽게 배포할 수 있다. EJB는 별도의 애플리케이션 서버가 필요해 배포가 복잡했다.
  • 의존성 주입(DI): Spring은 IoC(제어의 역전) 원칙을 적용하여 객체 관리와 의존성 주입을 자동으로 처리한다. EJB는 이러한 기능을 제공하지 않았고, 객체 생성과 의존성 관리가 비효율적이었다.
  • 관점 지향 프로그래밍(AOP): Spring은 AOP를 통해 공통 기능을 비즈니스 로직에서 분리하여 관리한다.
특징SpringEJB (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

profile
블로그 이전: https://syleeblog.tistory.com/

0개의 댓글