1. 스프링 프레임워크 이전
스프링 프레임워크는 2005년 로드 존슨이 2004년에 만든 오픈소스 프레임워크입니다. 이러한 스프링 프레임워크가 등장하기 이전, 자바 기반의 애플리케이션은 대부분 EJB로 개발되었습니다.
[EJB]
EJB는 Enterprise JavaBeans의 약자로 기업환경의 시스템을 구현하기 위한 서버 측 컴포넌트입니다. 즉, 거대 규모 시스템 구축을 위한 컴포넌트 모델입니다.
[EJB의 구조]
Enterprise Bean
- 비즈니스 로직을 실행하는 서버 컴포넌트
- CRUD를 관리하고 클라이언트와 DB 사이에 접근하는 역할
Container
- 서버 내에서 Enterprise Bean에 대한 런타임 환경 제공
- EJB Server와 Enterprise Bean 사이에 통신 역할
- Sevelt이 Apache Tomcat Continer에 올려 사용하듯, EJB는 Weblogic, JBoss와 같은 EJB Continer에 올려서 서비스
EJB Server
- 컨테이너는 관리해서 EJB로서 피룡한 시스템 서비스를 구현
ClientApplication
- EJB구조를 사용해 연결할 수 있는 클라이언트단의 어플리케이션
-Applet, Servlet, JSP
[EJB의 한계점]
하지만 EJB는 스펙 자체가 복잡하기 때문에 학습에 많은 시간이 필요하며, EJB를 배치하고 실행하기 위해서 필요한 WAS들은 고가의 장비가 필요합니다.
가장 큰 문제는 분산환경 지원을 위해 객체를 직렬화하는 과정에서 발생하는 실행 속도의 저하로 실행 속도가 느리다는 단점이 있습니다.
결론적으로는 EJB를 기반으로 비즈니스 컴포넌트를 구현하는 것은 매우 복잡하고 비싸며, 많은 시간과 노력이 필요하기 때문에 EJB를 대체한 스프링 프레임워크가 등장했습니다.
2. 스프링 프레임워크의 등장
스프링 프레임워크는 POJO를 사용하면서도 EJB에서만 가능했던 일을 지원하고 있습니다.
[POJO]
Plain Old Java Object의 약자로 해석하자면 평범한 옛날 자바 객체를 의미합니다. 아무런 규칙이 없는 클래스이기 때문에 문법적 제약이 거의 없어 유연하고, 배우기가 쉽습니다. 메소드, 매개변수, 리턴 등 엄격한 규칙이 없습니다.
Not POJO 클래스인 Servlet이나 EJB와 비교하면 이해가 더 쉽습니다. Servlet은 클래스를 만드는데 있어 엄격한 규칙이 적용되기 떄문에 규칙에 맞게 작성해야 합니다. 규칙이 엄격하면 배우기가 어려울 뿐 아니라 관리하는데 사용하는 메모리가도 많이 사용됩니다.
3. 스프링 프레임워크의 특징
[경량]
스프링이 EJB에 비해 가벼운 이유는 두 가지입니다.
- 크기 측면에서 여러 개의 모듈(JAR파일)로 구성되어 있어 가벼움
- 스프링이 관리하는 객체가 POJO로 관리하는 메모리 사용량 적고 가벼움
[제어 역행:IoC]
제어역행(IoC)을 통해 애플리케이션의 느슨한 결합을 지원합니다.
- 제어 역행의 주체 : Srping Container
- 제어의 대상 : Container가 관리하는 POJO 형태의 자바 객체
[관점지향:AOP]
관점지향 프로그래밍은 코드의 분리로 응집도가 높은 컴포넌트 개발을 가능하게 합니다. 이를 통해 기존의 객체지향의 한계를 뛰어넘을 수 있습니다.
- 애플리케이션의 비지니스 로직
- 공통 기능의 코드를 분리 (예외 처리, 트랜잭션 처리 같은 공통 기능 모듈화 + 선언적으로 처리)
[Container]
Container는 스프링 이전에도 사용되었던 개념입니다.
- EJB Container: EJB 객체의 생성 및라이프사이클을 관리합니다.
- Servlet Container: Servlet 객체의 생성 및 라이프 사이클을 관리합니다.
Spring Container : 객체의 생명주기와 객체들 간의 의존관계를 관리합니다.
즉, 객체를 생성해서 관리하는 것을 Container의 개념이라고 생각하면 됩니다.
참고자료
https://woongsin94.tistory.com/357
https://zunoxi.github.io/programming/2020/12/30/dev-web-ejb/
'SERVER > SpringBoot' 카테고리의 다른 글
[SPRING BOOT] @Controller, @RestController 차이 (0) | 2022.06.30 |
---|