Node.js?
JavaScript인 스크립트 언어에서 Google의 V8엔진을 사용하여 Javascript로 만든 프로그램을 실행 시켜주는 환경
핵심
Javascipt > 언어
Node.js > 실행 환경(런타임 환경)
Express > 웹 프레임 워크
프로세스 내에서 하나의 스레드가 하나의 요청만을 수행한다.
해당 요청이 수행될 때 다른 요청을 함께 수행할 수 없다.
위 사진과 같이 하나의 종업원(thread)이 손님(client)에게 하나씩 주문(request)을 받고 햄버거(response)가 완성 되는 순서대로 각 손님에게 전달
먼저 요청을 모두 접수하고 빨리 완료된 순서대로 실행
A : 10초
B : 10초
C : 500초
D : 10초
위와 같은 작업이 들어 왔을 때
1. 논블로킹 없는 서버는 D는 C의 작업이 끝나는 500초를 기다려야 한다.
2. 논브로킹을 가지고 있는 서버는 빨리 완료된 순서대로 처리해줌
예) 싱글쓰레드 예제에서 2번 세트 주문 / 3번 콜라 요청
3번 콜라를 먼저 주고 2번의 세트를 주게 된다.
Node.js 내부 아키텍쳐를 살펴보면 C++로 작성된 libuv에 쓰레드 풀이 존재
즉 이벤트 리스너에 등록해둔 쓰레드 풀을 실행하는 방식으로 동작한다.
Spring?
Java 웹 애플리케이션을 개발 할 수 있는 오픈소스 Framework이다.
동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공핵심
Java > 언어
Spring > 프레임워크
한개의 Thread가 하나의 요청을 담당하여 응답까지 책임지고 반환하고 요청이 들어오면 바로 결과를 반환해주는 동기방식을 사용 blocking 방식 사용
위 사진과 같이 각각의 종업원(thread)이 각각의 손님(client)를 담당하여 주문(request)을 받아서 한번에 음식(response)을 반환
경량 컨테이너로서 자바 객체를 직접 관리한다.
각각의 객체 생성, 소멸과 같은 라이프 사이클 관리하며 스프링으로부터 필요한 객체 얻어올 수 있다.
애플리케이션의 느슨한 결합을 도모.
Spring에서 의존성 객체를 만들어주고 필요한 곳에 넣어 주어 기존에 사용자가 가졌던 제어권을 다른 주체에게 넘겨주는 것을 의미
평범하고 오래된 자바의 객체를 의미
별도 API를 사용하지 않고 Java 코드를 이용하여 객체를 구성할 수 있음
객체를 직접 생성하는 것이 아닌, 필요로 하는 객체를 프레임워크(Spring)에서 생성하여 사용하려는 객체에 주입 시켜주는 것
직접 객체 생성 > 의존성 ↑
외부에서 객체 주입 > 의존성 ↓
개발자가 비즈니스 로직에만 집중 할 수 있도록 반드시 처리가 필요한 부분을 모듈로 분리하는 프로그래밍의 패러다임 의미
예) 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
구조
View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO
외에 DispatcherServlet, servlet-context
View - 사용자에게 보여지는 화면(JSP등)
Controller - View와 Service 사이를 연결
Service - 실제 로직을 처리하는 곳(거의 모든 기능은 Service에 만들어짐)
DAO(Data Access Object) - 프로젝트와 데이터베이스를 연결
DTO(Data Transfer Object) - 데이터 교환을 위한 오브젝트
간단한 I/O요청이 많은 경우 비교
동일한 처리 CPU 사용 연산에 따른 그림
Node.js | Spring | |
---|---|---|
Programmin Language | javascript | Java |
Thread | Single | Multi |
I/O | Non-blocking | blocking |
좋은 부분 | 간단하고 많은 I/O 작업 | Cpu intensive |
특징 | 런타임 환경 | 자바 기반 프레임 워크 |
간단한 I/O가 많은 경우 | 👍 | |
CPU 연산 많아질 경우 | 👍 | |
외부 API 작업 요청 많을 경우 | 👍 | |
진입 장벽(개인적인) | 👍 |
그래서 이번 프로젝트의 결론은 다른 백엔드분과 협의 결과
우선 요리도우미라는 프로젝트에는 간단한 I/O작업이 많고
javascript에도 부족한 부분이 많은데 Typescript로 해야하기 때문에
React도 공부하며 Spring으로 하기에는 부족한점이 많을 것 같아
다음학기에 Spring을 이용한 Backend를 구상하고
javascript를 이용하는 Node.js를 사용하기로 했다..
https://doqtqu.tistory.com/284
https://well-made-codestory.tistory.com/31
https://jaehoney.tistory.com/167
https://siyoon210.tistory.com/164