728x90
- 목표
- EJB가 무엇인지
- EJB의 어떤 불편한 점으로 인해 Spring으로 이동하게되었는지
- 알면 좋은 점
- Spring이 EJB의 어떤 문제점을 해소하기 위해 탄생하게 되었는지 알아야 스프링의 핵심을 파악할 수 있다.
- Spring이 EJB의 어떤 문제점을 해소하기 위해 탄생하게 되었는지 알아야 스프링의 핵심을 파악할 수 있다.
- 사전에 알아야 하는 용어
- JavaEE(java platform Enterprise Edition)
- 자바를 이용한 서버측 개발을 위한 플랫폼
- 표준 플랫폼인 Java SE를 사용하는 서버를 위한 플랫폼
- 엔터프라이즈 환경을 위한 도구로 EJB, JSP, Servlet, JNDI,JDBC, JMS, JavaMail API, JTA 같은 기능을 지원
- WAS를 이용하는 프로그램 개발 시 사용
- J2EE라고도 함
- JavaSE(Standard Edition)
- 가장 보편적으로 쓰이는 자바 API집합체
- 코딩테스트 할 때, 'hello, world' 찍을 때 사용
더보기
3. JDK(java development kit)
- java11, java17 같이 우리가 자바 개발하려면 다운로드 받던 것
- 자바 개발 키트로 JavaSE, JavaEE 플랫폼 중 하나를 구현한 것으로 JRE를 포함한다.
4. JRE(java runTime Enviroment)
- JDK로 만들어진 프로그램을 실행 시켜주지만 개발을 불가
- 한글 뷰어 같은 역할 (한글을 읽을 수 있지만 작성은 못하는 것)
- java11, java17 같이 우리가 자바 개발하려면 다운로드 받던 것
- 자바 개발 키트로 JavaSE, JavaEE 플랫폼 중 하나를 구현한 것으로 JRE를 포함한다.
4. JRE(java runTime Enviroment)
- JDK로 만들어진 프로그램을 실행 시켜주지만 개발을 불가
- 한글 뷰어 같은 역할 (한글을 읽을 수 있지만 작성은 못하는 것)
1. EJB(Enterprise Java Bean)란
- Java Bean
- Java로 작성된 소프트웨어 컴포넌트를 의미하며 하나의 목적을 가진 java class들이 복합적으로 이루어진 구조
- Java Bean 컴포넌트의 목적은 데이터를 표현하는 것을 목적으로 한다.
- Java Bean은 아래의 규격을 따른다.
더보기1. 클래스는 패키지화 해야 한다
2. 멤버 변수는 프로퍼티(Property)라 칭한다
3. 클래스는 필요에 따라 직렬화가 가능하다
4. 프로퍼티의 접근자는 private이다
5. 프로퍼티마다 getter/setter가 존재해야 하며, 그 이름은 각각 get/set으로 시작해야 한다
6. 위의 프로퍼티 getter/setter 메서드의 접근자는 public이어야 한다
7. 외부에서 프로퍼티에 접근은 메서드를 통해서만 한다
7. 프로퍼티는 반드시 읽기/쓰기가 가능해야 하지만, 읽기 전용인 경우 getter만 정의 가능하다
8. getter의 경우 파라미터가 존재하지 않아야 하고, setter의 경우 한 개 이상의 파라미터가 존재한다
9. 프로퍼티의 type이 boolean인 경우 get 메서드 대신 is 메서드를 사용해도 된다
- EJB는 JavaBean을 기반으로 만들어져서 일반 Java Bean과의 차이점이 존재
- Java Bean : 개발환경에서 사용되는 재사용 가능한 컴포넌트, 클라이언트에서 서버로 통신하는 경로에서 사용
- EJB : 서버 쪽 비즈니스 애플리케이션에서 사용되는 분산 객체 컴포넌트 모델, 오직 서버에서만 동작
- EJB는 분산 애플리케이션을 지원하는 엔터프라이즈 환경의 시스템을 구현하기 위한 서버 측 컴포넌트 모델
- 분산 애플리케이션이란?
- 현재 제작하는 사이트가 원격의 여러 다른 사이트들의 데이터를 처리
- 예) 은행 입출금이 대표적. '토스'로 '국민은행 -> 신한은행' 으로 입출금을 할 경우 각 사이트에서 원격처리가 필요
- 분산 애플리케이션이란?
- EJB는 애플리케이션 업무 로직을 갖고 있는 서버 애플리케이션
- EJB는 비즈니스 객체들을 관리하는 컨테이너 기술, 설정에 의한 트랜잭션 기술 등이 포함
- 장점
- 대량의 트랜잭션을 안정적으로 처리 - 기본적으로 분산 트랜잭션을 지원하기 때문
- 예) '토스'로 '국민은행 -> 신한은행' 입출금 시, 신한은행에서 오류 발생하면 토스, 국민은행 데이터가 롤백되어 '원자성'을 유지
- 단점
- 대규모 프로젝트를 목적으로 생겨나서 분산 트랜잭션을 사용하지 않는 가벼운 프로그램도 무거운 JTA(EJB의 transaction) 기반 기능을 사용해야한다.
- 특정 환경 및 기술에 종속적이다
- 분산 환경을 지원하기 위해 객체를 직렬화하는 과정에서 실행 속도의 저하가 발생
- EJB 컴포넌트는 컨테이너 밖에서는 정상적으로 동작하지 않아서 빌드,배포,테스트 과정에 많은 시간 낭비 (컨테이너 올리는데 시간 되게 많이 걸림) 및 간단한 기능조차 자동화 테스트 만들기 어려움
- 원격 분산 모델로 인해 시스템 성능이 떨어지고 서버의 복잡도만 증가
- EJB의 혜택을 얻기 위해 고가의 WAS 구입해야함
- EJB 스팩을 따르는 비즈니스 오브젝트들이 객체지향적인 특징과 장점을 포기
2. POJO(plain old java object)
- EJB은 문제점들 중 특히, 객체 지향을 어기고 과도한 기술을 피해서 자바 언어의 기본 기술에 충실한 비즈니스 로직을 구현하는 POJO 방식으로 돌아감
- POJO 정의
- 지정된 클래스를 extends하면 안된다.
- 정의된 인터페이스를 implement하면 안된다.
- 정의된 Annotation을 포함하지 않는다.
- POJO 장점
- 코드가 간결해진다.
- 자동화 테스트에 유리하다
- 객체지향 설계가 가능하다.
- POJO의 장점을 살린 다양한 프레임워크들 중 하나가 Spring이다.
- 참고 - POJO의 정의 재해석
더보기
1. 지정된 클래스를 extends하면 안된다.
- DI(의존관계 주입)을 이용하여 객체를 연결
- Spring은 더 나아가 DI를 시키는 것을 스프링 컨테이너에게 위임하여 IoC(제어의 역전)를 구성 - context.xml 혹은 @Configuration 이용
- Factory Pattern 이용
2. 정의도니 인터페이스를 implement한지 않으면 Service -ServiceImpl은 어떻게 설명될까?
- 객체 설계 및 구조화를 위한 스프링의 디자인 패턴 중의 하나로 POJO의 개념을 완전히 위배하는 것은 아니다.
- 스프링에서 따르는 예를 유추해본 결과 Logger, Transaction 처리시 따로 인터페이스를 상속받아 사용하지 않아서 코드의 복잡성을 줄인 경우도 존재
3. 스프링의 @ 사용
- @Controller, @Service 등 스프링의 애너테이션을 스프링 컨테이너가 감지하여서 스프링 프레임워크 기능을 활성화하여서 DI, IoC를 할 수 있도록 돕는 역할
결론
POJO를 법칙처럼 따르는 것이 아닌 최대한 지향하는 방향으로 만들어지는 것으로 판단
3. Spring
- 무거운 EJB 컨테이너를 대체하기 위한 POJO를 지향하여 나온 프레임워크
- 위의 문장으로 유추가능한 Spring의 핵심
- JavaEE 개발을 편하게 해주는 경량급(EJB 보다 가벼움) 애플리케이션 프레임워크
- 특정 클래스를 상속하거나 인터페이스를 구현하지 않는 POJO를 사용하여 많은 복잡성 제거 (Logger, Transaction, Persistence)
- DI, IoC를 이용해서 객체의 라이프 사이클 관리함
- 특정 기술에 종속되지 않고 객체를 관리할 수 있는 컨테이너를 제공하는 것이 스프링의 기본 철학
- 예) JDBC, JPA 갈아 끼워도 무방
- 정리
- 크기와 부하의 측면에서 가볍다
- 제어의 역전(IoC)를 통해 어플리케이션의 느슨한 결합을 도모한다
- 관점 지향 프로그래밍(AOP)을 위한 풍부한 지원을 한다
- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(container)라고 할 수 있다
- 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있다
- 확장성이 높다
- DI(의존성 주입)을 지원한다
- POJO(Plain Old Java Object) 방식의 프레임워크
- 핵심
- IoC, DI
- AOP
- 확장성
참고 자료 : https://yummy0102.tistory.com/550
관련 글 : 스프링이 핵심인 제어의 역전을 통한 의존관계 주입을 어떻게 만들었는지 작성 예정