Spring 역사 #1 (EJB)
EJB (Enterprise Java Beans)
EJB ?
- Enterprise JavaBeans 는 oracle에서 표준기술로서 내놓은 “비즈니스 로직” 구현을 위한 방법으로 나온 기술이다.
- Bean은 일반적으로 객체를 의미한다.
- EJB는 이러한 Bean들의 재사용성을 높이고 편리한 개발을 추구했다.
- ex) webLogic , Jeus 등을 이용해 개발됨
Bean 종류
- Bean 종류
- 세션 빈 (session Bean)
- DB 사용 없이 빈을 사용할때에 session Bean 사용
- 주로, 비즈니스 로직 처리
- 엔티티 빈 (Entity Bean)
- DB와의 상호작용을 위해 Entity Bean 사용
- Entity Bean은 DB의 Record를 담당하게 되고, Entity Bean 을 이용해서 해당 CRUD를 진행하게 된다.
- EJB 3.0 이후 부터는 Entity Bean 대신해서 JPA를 기본으로 사용한다
- DB와의 상호작용을 위해 Entity Bean 사용
- 세션 빈 (session Bean)
- Session Bean
- 상태 없는 세션 빈 (Stateless)
- 특징
- 클라이언트의 상태를 저장하지 않는다.
- 최대 메서드 호출 기간 동안 상태를 저장할 수 있다
- 메서드 호출 기간이 지나면 상태 정보는 유지되지 않는다.
- 예시
- “문의하기” 링크가 있는 애플리케이션일 경우
-
- 클라이언트 요청 ( Body : 받는사람 정보 + 보낸사람 정보 )
-
- 서버는 “받는 사람 및 보낸 사람” 정보를 기반으로 이메일을 생성할 수 있음
-
- 서버는 응답을 통해 클라이언트에게 전달
- 특징
- 상태 유지 세션 빈 (Stateful)
- 특징
- 메서드와 트랜잭션을 통해 빈과 특정 클라이언트 간의 상호작용을 반영하는 상태정보를 유지
- 클라이언트와 다른 빈 간의 상호작용을 관리하거나 워크플로를 관리할 수 있다
- 예시
- 로그인한 개인이 개인 프로필 정보를 보고 업데이트
-
- 클라이언트 요청 (로그인 데이터)
-
- 서버 로직 ( 로그인 데이터 유효성을 검사하는 다른 빈을 호출 )
-
- 서버 로직 ( 권한 확인 인증 )
-
- 서버 응답 ( 인증된 사용자의 프로필 정보에 액세스하는 빈 호출)
- 특징
- 싱글톤 세션 빈
- 특징
- 싱글톤 세션 빈은 JVM에서 애플리케이션당 한번 세션 빈이 인스턴스화 되고 애플리케이션이 종료될때까지 존재하도록 보장하는 공식 프로그래밍 구조 제공
- 여러 인스턴스 또는 여러 빈에서 공유하여 쉽게 사용 가능
- Stateless 상태 빈과 유사하게 제공되나, 차이점은 한개의 인스턴스를 이용해서 사용하는 점이 차이가 있다.
- 예시
- (@Lock(Read)) 기능을 이용하여 “다중” 스레드 액세스 허용
- 동시성을 올리기 위해 “읽기”에서 다중 스레드 허용
- (@Lock(Write)) 기능을 이용하여 “단일” 스레드 액세스 허용
- “쓰기”를 할 때에는 트랜잭션이 유지되어야 하기 때문에 단일 스레드 허용
- (@Lock(Read)) 기능을 이용하여 “다중” 스레드 액세스 허용
- 특징
- 상태 없는 세션 빈 (Stateless)
EJB 컨테이너
- 애플리케이션 서버에 배포되는 빈을 위한 런타임 컨테이너
- 서버가 시작될 때 자동으로 생성되며 빈과 런타임 서비스 간의 인터페이스 역할
- 특징
- 라이프 사이클 관리
- 코드 생성
- 보안
- 거래 관리
- 잠금 및 동시성 제어
- 장점
- 인스턴스 풀링 : 객체를 미리 생성하여 메모리에 저장 후 사용 준비 상태에 들어감
- 트랜젝션 처리 : 자동으로 컨테이너가 처리메소드에 대해 트랜젝션 처리
- 퍼시스턴스 관리 : 빈의 상태를 메모리에서 사용여부에 따라 활성화/비활성화 처리
- 특징
EJB 활용 시기
- 안정적인 분산처리를 하기 위해서 활용
- 많은 동시접속자가 있을때 사용 (많은 동접자 트랜잭션이 필요할때 유용)
- 속도는 느릴수 있어도, 안정성은 높음
EJB 단점
- 인터페이스와 구현의 구분이 명확하게 되어있지 않음
- 객체지향적이지 않음
- 복잡한 구조로 되어있음
- EJB에 의존적 (테스트가 유용하지 못함 / 컨테이너 안에서만 동작 가능)
참고
https://docs.oracle.com/cd/E24329_01/web.1211/e24972/examples.htm#EJBAD122
Spring과 EJB는 상호 배타적인 상황이 아니므로, 주어진 문제에 있어 분산이 필요하거나 안정성을 높일때에 EJB도 고려할 수 있다.
관련 문서
- (학습/프레임워크/Spring Framework) Spring 역사 #2 (POJO) — EJB처럼 프레임워크에 종속된 무거운 Bean 모델에 대한 반작용으로 POJO가 등장한 배경을 다루는 연작
- (학습/프레임워크/Spring Framework) Spring 역사 #3 (Spring의 탄생) — EJB의 복잡함과 POJO 지향을 거쳐 Spring이 객체지향/SOLID 원칙으로 등장하는 과정을 다루는 연작