framework/spring

EJB와 Spring

wooweee 2024. 8. 16. 13:01
728x90
  • 목표
    1. EJB가 무엇인지
    2. EJB의 어떤 불편한 점으로 인해 Spring으로 이동하게되었는지

  • 알면 좋은 점
    1. Spring이 EJB의 어떤 문제점을 해소하기 위해 탄생하게 되었는지 알아야 스프링의 핵심을 파악할 수 있다.

  • 사전에 알아야 하는 용어
    1. JavaEE(java platform Enterprise Edition)
      • 자바를 이용한 서버측 개발을 위한 플랫폼
      • 표준 플랫폼인 Java SE를 사용하는 서버를 위한 플랫폼
      • 엔터프라이즈 환경을 위한 도구로 EJB, JSP, Servlet, JNDI,JDBC, JMS, JavaMail API, JTA 같은 기능을 지원
      • WAS를 이용하는 프로그램 개발 시 사용
      • J2EE라고도 함
    2. JavaSE(Standard Edition)
      • 가장 보편적으로 쓰이는 자바 API집합체
      • 코딩테스트 할 때, 'hello, world' 찍을 때 사용
더보기
3. JDK(java development kit)
     - 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

 

관련 글 : 스프링이 핵심인 제어의 역전을 통한 의존관계 주입을 어떻게 만들었는지 작성 예정