Spring 개념과 express.js와의 차이

spring 개념 및 장단점 / express.js vs spring

Spring 개념 및 장단점

Spring 개념

  • 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크
  • 특정 기술에 종속되지 않고(기술 비침투적) 객체를 관리할 수 있는 컨테이너를 제공하는 것

Spring MVC

  • View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO
    • 크게 보면 View / Controller / Service / DAO / DTO로 이루어짐
  • View : 사용자에게 보여지는 화면. JSP를 통해 화면을 구성하고 Controller를 통해 서버와 연결
  • Controller : View와 Service 사이를 연결. 클라이언트에서 입력한 URL에 맞는 View를 보여주고, View에서 처리하는 데이터를 Service로 전달
  • Service : 실제 로직을 처리. Controller를 통해 화면과 연결되고, DAO를 통해 DB와 연결
  • DAO : Data Access Object. 프로젝트와 DB를 연결. Mapper에 SQL을 명시한 뒤 Mapper와 함께 DB와 데이터를 주고 받음
  • DTO : Data Transfer Object. VO(Value Object)라고도 불림. 데이터 교환을 위한 오브젝트. getter/setter 함수만 가지고 있으며 주로 DB 테이블과 매칭
    • VO? 도메인에서 한개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체

Spring 장점

  • 경량 컨테이너 - 객체의 라이프 사이클 관리 Java EE 구현을 위한 다양한 API 제공
    • Bean LifeCycle
      • 객체 생성 → 의존 관계 주입
        • 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존 관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
    • Java EE?
      • Java SE 플랫폼 위에 구축
      • 네트워크 애플리케이션을 개발하고 실행하기 위한 API 및 런타임 환경을 제공
      • Servlet, JSON, Rest 반응형 클라이언트 API, WebSocket 등 지원
  • DI(Dependency Injection) 지원
    • 컨테이너에서 request나 response를 만들어서 지원
    • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 연결
    • 객체의 의존관계를 외부에서 주입
      • 생성자 주입, Setter 주입, 인터페이스 주입 등이 있다.
    • A와 B 클래스가 있을 때, B 내부의 변경이 A에 영향을 끼칠 때, ‘A는 B에 의존한다’라고 한다.
    • 장점
      • 의존성이 줄어든다.(타 클래스의 변경에 덜 취약해진다.)
      • 모의 객체를 주입할 수 있기 때문에 단위 테스트가 쉬워진다.
      • 가독성이 높아진다.
      • 재사용성이 높아진다.
  • IoC(Inversion of Control) 지원
    • 프로그램의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드 호출
    • 스프링 컨테이너(IoC Container)는 프로젝트에서 사용되는 객체들을 Bean으로 관리하고 @Autowired 어노테이션을 이용해 객체를 주입
    • DI를 통해 IoC 구현
  • AOP(Aspect Oriented Programming) 지원
    • 컨테이너와 함께 작업
    • 트랜잭션, 로깅, 보안과 같은 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있음
  • POJO(Plain Old Java Object) 지원
    • POJO?
      • 간단한 자바 오브젝트. 특정 '기술'에 종속되어 동작하는 것이 아닌 순수한 자바 객체
      • 본래 Java의 장점을 살리기 위함
      • Hibernate가 아닌 JPA를 사용함으로 ORM을 사용하는 데 있어 POJO를 유지
      • ORM? Object Relational Mapping
  • EJB(Enterprise JavaBeans)를 대신해 경량 컨테이너 사용
    • 컴포넌트 교체가 쉬움
    • EJB의 단점
      • 단위 테스트가 어려움
        • EJB 컨테이너 외부에서 실행이 어려움 → 테스트를 위해서 반드시 컨테이너에 배포 vs Spring DI
      • 불필요한 메소드 구현
      • 예외 처리가 번거로움
        • in Spring, 모든 메소드에서 예외 처리를 구현하는 대신, 중앙 집중식 예외 처리를 수행하고 AOP를 사용해 주입
      • 배포 불편

Spring 단점

  • 선택적으로 도입할 수 없는 복잡한 기술
    • IoC로 인해 개발자는 Spring에서 지원하는 기술에 대한 이해가 필요
      • 프레임워크에 강력하게 종속되어 있어 제거할 수 없음
  • 너무 다양한 방법 제시
    • 특정한 문제를 해결할 수 있는 단 한가지의 방법 대신, 여러 방법을 동시에 제공하는 경우가 많음
      • Spring Boot vs Spring Framework
      • XML 기반 의존성 vs Annotation 기반 의존성
      • Reactive Web vs Servlet Web
      • Spring Annotation vs 표준 호환(JSR-330, JSR-107) Annotation
  • 많은 기능을 제공하고 탑재하여 무거움
  • 높은 러닝 커브

Spring vs Spring Boot

Spring Boot?

  • Embed Tomcat을 사용해 따로 tomcat을 설치하거나 버전 관리를 하지 않아도 됨
    • tomcat?
      • WAS(Web App Service). 자바 서블릿을 실행하고 JSP가 포함된 웹페이지 제공
        • 자바 서블릿? 동적 웹페이지를 만들 때 사용되는 자바 기반의 웹 어플리케이션 프로그래밍
        • JSP? Java Server Page : HTML 코드에 Java 코드를 넣어 동적 웹페이지 생성
      • WAS는 컨테이너 기능이 존재하여 동적인 데이터를 처리 가능, 비즈니스 로직 O
      • WS는 컨테이너 기능이 없어 정적인 데이터 처리, 비즈니스 로직 X
        • 컨테이너 기능? 동적인 데이터를 처리해 정적인 페이지로 생성해주는 소프트웨어 모듈
  • starter를 통한 dependency 자동화(starter가 대부분의 dependency를 자동으로 관리)
  • XML 설정 불필요
  • jar 파일을 이용해 자바 옵션만으로 손쉽게 배포가 가능
  • Spring Actuator를 이용한 어플리케이션의 모니터링과 관리 제공

Express.js vs Spring

Spring

  • Spring MVC의 Multi-Thread 방식에서 I/O 작업이 수반된다면 자원의 낭비 발생
  • Thread가 수행하는 요청과 응답에 대한 일처리에 비하여 I/O 작업은 훨씬 더 긴 작업을 가지고 있고 이러한 시간동안 Thread들이 블로킹
  • Thread 수가 증가할 때마다 컨텍스트 스위칭이 빈번하게 일어나며, 이로 인한 성능 저하도 야기 가능
  • Java를 사용하기 때문에 Type Safe함

Express.js

  • 모든 클라이언트의 요청은 이벤트 루프로 들어가게 됨
  • 이벤트 루프가 I/O와 같은 무거운 블로킹 작업들을 백그라운드에서 수행하고 이를 비동기 콜백 함수로 이벤트 루프로 반환
  • I/O 작업이 아닌 CPU를 많이 사용하는 작업의 경우 작업이 끝날 때까지 blocking되므로 성능 저하 야기 가능
  • 단순한 I/O 작업이 많고 연산 작업이 적을 경우 적합
  • Node.js를 사용하므로 JSON 기반 DB와 함께 사용할 시 JSON 변환 과정 없이 사용 가능
  • Javascript 기반이므로 프로젝트 규모가 커질수록 Type Safe하지 못함.
  • Type Safe하지 못하기 때문에 IDE의 자동 완성 기능에 한계
  • 싱글스레드를 사용하므로 메모리를 적게 사용함

Ref.

https://velog.io/@duckchanahn/Spring-이론정리

https://velog.io/@whitecloud94/스프링-프레임워크의-장단점-및-특징

https://velog.io/@outstandingboy/Spring-왜-스프링-프레임워크를-사용할까-Spring-vs-EJB-JavaEE

https://siyoon210.tistory.com/120

https://devlog-wjdrbs96.tistory.com/321

https://kbj96.tistory.com/38

https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/

https://velog.io/@syi9595/nodejsexpress-vs-springboot

https://selfish-developer.com/entry/Nodejs-vs-Spring-Boot

'Programming > Java' 카테고리의 다른 글

[JAVA] Gradle  (0) 2022.07.19
Maven  (0) 2022.07.13
[JAVA] 람다식  (0) 2022.04.18
[JAVA] 제네릭  (0) 2022.04.11
[JAVA] I/O  (0) 2022.04.05

댓글