[BackEnd] SpringBoot API gateway 개발

🥅 Goal

  • Phase 1

  • Phase 2

🛠️ Tech Stack

👩🏻‍🏫 Subject

Express.js vs Spring Boot

  • Python vs Java

특징 및 비교

싱글 스레드 (Single-Threaded)

Node.js와 Express

특징:

  • Node.js는 싱글 스레드 이벤트 루프를 사용하여 비동기 I/O 작업을 처리합니다.

  • 단일 스레드에서 모든 요청을 처리하지만, 비동기 작업을 통해 블로킹을 최소화합니다.

  • 이벤트 루프와 콜백을 사용하여 I/O 작업을 비동기적으로 처리합니다.

장점:

  • 메모리 소비가 적고, 높은 처리량을 유지할 수 있습니다.

  • 비동기 I/O 처리가 간편하여 실시간 애플리케이션에 적합합니다 (예: 채팅 애플리케이션, 실시간 알림 등).

단점:

  • CPU 집약적인 작업을 처리할 때 성능이 저하될 수 있습니다.

  • 하나의 작업이 오래 걸리면 전체 이벤트 루프가 블로킹될 수 있습니다.

사용 예시:

  • I/O 바운드 애플리케이션 (파일 시스템, 데이터베이스, 네트워크 요청 등)

  • 실시간 애플리케이션 (채팅, 게임 서버)

예제 코드:

javascript코드 복사const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello, World!');
});

app.get('/slow', (req, res) => {
    // 비동기 작업 (예: 파일 읽기)
    setTimeout(() => {
        res.send('This was a slow request.');
    }, 5000);
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

멀티 스레드 (Multi-Threaded)

Python과 Flask (단일 스레드) vs. Spring Boot (멀티 스레드)

특징:

  • 멀티 스레드 서버는 각 요청마다 새로운 스레드를 생성하거나 스레드 풀에서 스레드를 가져와 작업을 처리합니다.

  • CPU 집약적인 작업도 효율적으로 처리할 수 있습니다.

장점:

  • 병렬 처리가 가능하여 CPU 집약적인 작업에 강합니다.

  • 하나의 요청이 오래 걸려도 다른 요청이 영향을 받지 않습니다.

단점:

  • 메모리 소비가 많고, 컨텍스트 스위칭 비용이 발생할 수 있습니다.

  • 동기화 문제를 관리해야 합니다.

사용 예시:

  • CPU 바운드 애플리케이션 (이미지 처리, 데이터 분석)

  • 트랜잭션 기반 시스템 (은행 시스템, 결제 시스템)

예제 코드:

Flask (단일 스레드)

python코드 복사from flask import Flask
import time

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"

@app.route('/slow')
def slow():
    time.sleep(5)  # CPU 바운드 작업
    return "This was a slow request."

if __name__ == '__main__':
    app.run(debug=True)

Spring Boot (멀티 스레드)

java코드 복사import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RestController
    class MyController {

        @GetMapping("/")
        public String hello() {
            return "Hello, World!";
        }

        @GetMapping("/slow")
        public String slow() throws InterruptedException {
            Thread.sleep(5000);  // CPU 바운드 작업
            return "This was a slow request.";
        }
    }
}

요약

  • 싱글 스레드: Node.js와 Express는 싱글 스레드로 비동기 I/O를 효율적으로 처리하지만, CPU 집약적인 작업에는 적합하지 않습니다.

  • 멀티 스레드: Python과 Flask는 기본적으로 단일 스레드이지만 멀티 스레드로 설정할 수 있습니다. Spring Boot는 기본적으로 멀티 스레드로 동작하여 CPU 집약적인 작업도 효율적으로 처리할 수 있습니다.

언제 사용해야 하는지

  • 싱글 스레드 (Node.js/Express):

    • 많은 I/O 작업이 필요한 애플리케이션 (파일 읽기/쓰기, 데이터베이스 쿼리, 네트워크 요청 등)

    • 실시간 애플리케이션 (채팅, 실시간 알림, 게임 서버 등)

  • 멀티 스레드 (Spring Boot, 멀티 스레드 설정된 Flask):

    • CPU 집약적인 작업이 많은 애플리케이션 (이미지 처리, 데이터 분석, 과학 계산 등)

    • 트랜잭션이 중요한 시스템 (은행 시스템, 결제 시스템 등)

각각의 접근 방식은 고유의 장단점이 있으므로, 애플리케이션의 요구사항에 따라 적절한 방식을 선택해야 합니다.

Spring Boot 기반 API Server 개발

비동기 처리

데이터 직렬화 역질렬화

🔥 Challenge

Last updated