Language/Java

자바(Java)의 장단점 정리! [+ Spring vs Node.js + Express 비교]

JaeHoney 2022. 4. 24. 09:09

 

자바(Java)

이전에 가전 제품에 C++을 플랫폼 독립적으로 확장한 Oak라는 언어가 있었는데, 인터넷이 확장되면서 네트워크 통신이 적합하도록 방향을 잡고 언어의 이름을 변경했다. 그게 자바(Java)다.

 

이번 포스팅에서는 자바(Java)의 장단점에 대해 다룬다.

 

그리고 추가적으로 Java(Spring)과 (Node + Express)를 비교하는 부분을 설명한다.

 

자바의 장점

  • 객체 지향 프로그래밍의 장점을 충분히 반영하고 있다.
    • 클래스, 상속, 다형성, 캡슐화, 추상화 등을 지원
  • 플랫폼 종속적이지 않다.
  • 많은 국내 개발자, 레퍼런스와 강의가 있다.
    • 더 구조적이고 효율적인 코드 작성을 할 수 있다.
    • 오픈소스도 많아서 안정적인 애플리케이션을 빠르게 개발할 수 있다.
  • 보안, 운영측면에서 모두 안정적이다.
  • 멀티스레드로 자원이 효율적으로 동작한다.
  • 가비지 컬렉션을 지원한다.
    • 메모리 관리에 집중하지 않아도 되므로 생산성이 향상된다.

 

자바의 단점

  • 앱 실행이 오래걸린다.
    • JVM, 가비지 컬렉션 로딩에 의한 실행 지연
  • 예외 처리가 오래 걸린다 (?) 
    • 자바는 예외처리를 하지 않으면 컴파일 에러가 발생한다. 그래서 예외 처리에 시간이 소모된다.
    • 개인적으로 단점이 아니라, 엄청난 장점이라고 생각한다.
  • 실시간 응용 시스템에는 부적합하다.
    • GC에 의해 모든 쓰레드가 정지되서 중간에 끊김이 발생할 수 있다.
  • 객체 지향을 강력하게 추구하기에 난이도가 높다.
    • 변수나 메소드는 반드시 클래스 내부에 구현되어야 한다.
    • 필자는 이것 역시 장점이라고 생각한다.

 

프레임워크(Framework) 비교

스프링과 노드를 비교하면서 각자의 장단점에 대해 살펴보자.

 

스프링(Spring)

  • 로딩이 오래 걸리지만, 실행 초기에 빈을 검증하고 등록하는 과정에서 결함을 발견할 수 있다!
    • Node는 요청이 들어오거나 메소드가 실행되어야 에러를 찾을 수 있는 경우가 많다.
  • 쉽게 구동할 수 있다. (Embedded Tomcat)
  • 비즈니스 로직에 더 잘 집중할 수 있다.
    • IOC, AOP, POJO 등 스프링은 개발자가 비즈니스 로직에만 집중할 수 있도록 한다.
  • Spring security, Exception Handler 등 필요한 좋은 기능을 많이 제공한다.
  • 효율적인 JPA와 편리한 QueryDSL이 있다.

 

노드(Node.js)

  • 싱글 쓰레드이기 때문에 메모리 절약측면에서 효율적이다.
  • 여러 요청이 동시에 와도 Event loop에 의해 비동기로 처리한다.
    • 요청을 보내고 가만히 기다리는 동기 방식보다 시간적으로 효율적이다.
  • 세계적인 대규모 라이브러리 리소스 풀울 사용할 수 있다.
  • 코드가 쉽고 간편하다.
  • 처리하는 작업 크기가 작은 요청이 많이 서버에 효율적이다.

 

성능(Performance)

개발자분들이 쉽게 오해하시는 것 중에 하나가 성능이다.

 

Java + Spring은 Typescript + Node.js보다 성능이 절대적으로 우월하지는 않다.

 

아래 그림은 Amir Muminovic가 Node.js(Express)와 Java(Spring boot)를 성능을 비교한 그래프다.

처리량, 실행시간, 메모리 사용량 모든 부분에서 Node가 우세하다. 물론 그림의 그래프는 CPU 사용량이 적은 간단한 I/O 요청의 경우이다.

 

아래의 그림은 동일한 처리를 하는데 걸리는 수행 시간을 비교한 그래프이다. CPU를 사용하는 연산이 많아질수록 NodeJS의 처리 수행 시간은 급격히 증가하는 것을 볼 수 있다.

즉, CPU 연산이 많을 수록 Spring가 유리하고 간단한 I/O가 많을 수록 NodeJS가 유리하다.

 

추가적으로 외부 API에 작업을 요청하는 부분이 많으면 Node.js가 유리하다고 볼 수 있다. 스프링은 동기 방식이기 때문에 요청을 보내고 대기하기 때문이다.

 

Spring Webflux를 사용하면 스프링에서도 많은 요청을 비동기 방식으로 처리할 수 있다.

 

 


 

Reference