자바(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
- https://medium.com/geekculture/achieve-best-performance-spring-boot-or-node-js-6cda6fdd9b95
- https://medium.com/maestral-solutions/alternative-package-managers-for-node-js-f52805b98064
'Language > Java' 카테고리의 다른 글
Java - JDK와 JRE 차이 정리! (0) | 2022.04.26 |
---|---|
Java - Equals()랑 HashCode()를 반드시 같이 재정의해야 하는 이유! (1) | 2022.04.24 |
Java - Hibernate는 무엇인가? (0) | 2022.04.17 |
Java - 실수하기 쉬운 메모리 누수의 5가지 패턴! (0) | 2022.04.15 |
Java - Concurrent Programming (Runnable, Executor, Callable, Future 등) (0) | 2022.04.03 |