본문 바로가기
개발 상식 시리즈/백엔드 상식

백엔드 30일 완성을 읽고 배운 것(60페이지까지)

by 신재은👩🏼‍💻 2024. 5. 18.

(31p)

먼저 단일 스레드 버전의 서버를 만들어본다. 그런 다음 몇 가지 간단한 과정을 통해 스레드 풀을 사용하여 여러 동시 요청을 수용하도록 확장해본다.

스레드란?

더보기

스레드는 컴퓨터 프로그램 내에서 실행되는 가장 작은 단위로, 프로세스 내에서 독립적으로 실행될 수 있는 흐름을 말합니다. 스레드는 프로세스의 자원을 공유하면서 동시에 여러 작업을 수행할 수 있게 합니다.

주요 개념

  1. 프로세스와 스레드의 차이:
    • 프로세스: 실행 중인 프로그램의 인스턴스로, 독립적인 메모리 공간을 가지고 운영체제에 의해 관리됩니다.
    • 스레드: 프로세스 내에서 실행되는 독립적인 작업 단위로, 프로세스의 자원을 공유합니다. 여러 스레드가 하나의 프로세스 내에서 동시에 실행될 수 있습니다.
  2. 스레드의 장점:
    • 병렬 처리: 여러 스레드를 사용하여 작업을 병렬로 처리함으로써 성능을 향상시킬 수 있습니다.
    • 자원 공유: 동일한 프로세스 내의 스레드들은 메모리, 파일 핸들 등의 자원을 공유하므로 효율적입니다.
    • 반응성 향상: 사용자 인터페이스가 있는 프로그램에서 긴 작업을 별도의 스레드로 실행하면, UI가 응답성을 유지할 수 있습니다.
  3. 스레드의 단점:
    • 복잡성: 스레드를 올바르게 관리하고 동기화하는 것은 어렵고, 버그를 유발할 수 있습니다.
    • 동기화 문제: 자원을 공유하기 때문에 동기화 문제가 발생할 수 있으며, 이를 해결하기 위해 추가적인 코딩이 필요합니다.
    • 디버깅 어려움: 스레드 관련 문제는 디버깅이 어렵고, 재현이 어려운 경우가 많습니다.

스레드의 실행 모델

  1. 싱글 스레드 모델:
    • 하나의 스레드만 존재하며, 한 번에 하나의 작업만 수행합니다.
    • 예: 간단한 명령 줄 프로그램.
  2. 멀티 스레드 모델:
    • 하나의 프로세스 내에 여러 스레드가 존재하며, 동시에 여러 작업을 수행합니다.
    • 예: 웹 서버, 게임 엔진.

스레드의 동기화

스레드 간의 동기화는 여러 스레드가 공유 자원에 접근할 때 발생할 수 있는 문제를 방지하기 위해 필요합니다. 이를 위해 다음과 같은 기법을 사용합니다:

  • 뮤텍스 (Mutex): 상호 배제를 통해 하나의 스레드만 공유 자원에 접근할 수 있도록 합니다.
  • 세마포어 (Semaphore): 지정된 수의 스레드만 공유 자원에 접근할 수 있도록 합니다.
  • 모니터 (Monitor): 객체 기반의 동기화 기법으로, Java와 같은 언어에서 사용됩니다.

예시

  • 웹 브라우저: 각 탭이 별도의 스레드로 실행되어, 한 탭의 작업이 다른 탭에 영향을 미치지 않습니다.
  • 게임: 그래픽 렌더링, 물리 연산, 사용자 입력 처리 등이 각각의 스레드에서 병렬로 실행됩니다.

결론

스레드는 프로세스 내에서 실행되는 독립적인 작업 단위로, 자원을 공유하면서 병렬 처리를 가능하게 합니다. 이를 통해 응답성 향상, 성능 개선 등의 장점을 얻을 수 있지만, 동기화 문제와 복잡성 증가 등의 단점도 존재합니다. 스레드 프로그래밍을 올바르게 활용하려면 이러한 장단점을 이해하고 적절한 동기화 기법을 사용해야 합니다.

스레드풀이란?

더보기

스레드풀(Thread Pool)은 여러 스레드를 미리 생성하여 작업 큐에 있는 작업들을 효율적으로 처리하는 기법입니다. 스레드풀을 사용하면 새로운 작업이 발생할 때마다 스레드를 생성하고 소멸시키는 비용을 줄이고, 시스템 자원을 보다 효율적으로 사용할 수 있습니다.

주요 개념

  1. 스레드풀의 동작 방식:
    • 스레드풀 생성: 프로그램 시작 시 미리 정해진 개수의 스레드를 생성하여 풀에 보관합니다.
    • 작업 큐: 처리할 작업들을 저장하는 큐가 있습니다. 새로운 작업이 들어오면 이 큐에 추가됩니다.
    • 작업 할당: 풀에 있는 스레드들이 큐에서 작업을 가져와 처리합니다. 작업이 완료되면 해당 스레드는 다시 풀로 돌아가서 다음 작업을 대기합니다.
  2. 장점:
    • 성능 향상: 스레드를 재사용하여 스레드 생성 및 소멸에 드는 비용을 줄입니다.
    • 자원 관리: 시스템 자원의 효율적인 사용을 통해 성능을 최적화할 수 있습니다.
    • 응답 시간 단축: 미리 생성된 스레드를 사용하여 작업의 대기 시간을 줄입니다.
    • 관리 용이: 일정한 개수의 스레드를 사용하여 스레드 수를 관리하기 용이합니다.
  3. 단점:
    • 복잡성: 스레드풀의 크기를 적절히 설정하지 않으면, 성능 저하나 자원 낭비가 발생할 수 있습니다.
    • 과부하: 작업이 너무 많이 쌓이면 큐가 넘쳐서 시스템 과부하가 발생할 수 있습니다.
    • 데드락 및 동기화 문제: 여러 스레드가 동시에 작업을 처리하므로 동기화 문제를 주의해야 합니다.

스레드풀의 구성 요소

  1. 스레드 풀 관리자: 스레드를 생성하고 관리하며, 작업 큐를 모니터링하여 적절히 스레드를 할당합니다.
  2. 작업 큐: 대기 중인 작업들을 저장하는 큐입니다. 작업은 FIFO(First In, First Out) 방식으로 처리됩니다.
  3. 워커 스레드: 실제 작업을 수행하는 스레드입니다. 작업 큐에서 작업을 가져와 처리하고, 완료되면 다시 풀로 돌아갑니다.

스레드풀의 예시

Java에서의 스레드풀 예시

Java에서는 java.util.concurrent 패키지에서 스레드풀을 쉽게 사용할 수 있습니다. Executors 클래스를 통해 다양한 유형의 스레드풀을 생성할 수 있습니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 고정 크기의 스레드풀 생성
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 작업 제출
        for (int i = 0; i < 10; i++) {
            Runnable task = new Task("" + i);
            executor.execute(task);
        }

        // 스레드풀 종료
        executor.shutdown();
    }
}

class Task implements Runnable {
    private String name;

    public Task(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("Executing : " + name);
    }
}

 

요약

스레드풀은 미리 정의된 수의 스레드를 생성하여 작업을 효율적으로 처리하는 기법입니다. 이를 통해 성능 향상, 자원 관리, 응답 시간 단축 등의 장점을 얻을 수 있지만, 적절한 설정과 관리가 필요합니다.

 

스레드는 왜, 어디에 쓰나?

더보기

스레드는 여러 작업을 동시에 실행할 수 있게 해주는 도구입니다. 멀티태스킹을 통해 프로그램의 응답성을 높이고, CPU 자원을 효율적으로 사용할 수 있습니다. 스레드를 사용하는 주요 이유와 실제로 스레드를 사용하는 예시 작업들을 소개합니다.

스레드를 사용하는 주요 이유

  1. 병렬 처리: 여러 작업을 동시에 수행하여 프로그램의 성능을 향상시킵니다. CPU의 멀티코어를 활용할 수 있습니다.
  2. 응답성 개선: 긴 작업이 실행되는 동안에도 사용자 인터페이스가 응답성을 유지할 수 있도록 합니다.
  3. 자원 효율성: 여러 스레드가 자원을 공유하면서 작업을 수행하므로 자원의 활용도를 높일 수 있습니다.
  4. 백그라운드 작업: 주 작업과는 별도로 실행되는 백그라운드 작업을 처리할 수 있습니다.

스레드를 사용하는 실제 예시 작업

  1. 웹 서버: 클라이언트의 요청을 처리하는 각 연결을 별도의 스레드로 처리하여 동시에 여러 클라이언트의 요청을 처리합니다.
  2. 파일 입출력: 대용량 파일 읽기/쓰기 작업을 별도의 스레드에서 수행하여 메인 스레드의 작업이 블로킹되지 않도록 합니다.
  3. 데이터베이스 접근: 데이터베이스 쿼리를 실행하는 동안 다른 작업을 동시에 처리할 수 있습니다.
  4. 게임 개발: 게임 엔진에서 그래픽 렌더링, 물리 연산, 사용자 입력 처리를 각각 별도의 스레드에서 수행합니다.
  5. 네트워크 통신: 네트워크 요청을 비동기적으로 처리하여 메인 스레드의 응답성을 유지합니다.
  6. 타이머 및 스케줄링: 주기적으로 실행되어야 하는 작업을 별도의 스레드에서 수행합니다.

이 부분은 코드로 확인하는 게 더 좋다.

책에서 흔히 볼 수 있는 문자열 프린트 말고 프로덕트에 쓰일 만한 예시들을 인터넷에서 찾는 걸 추천.

스레드에 대해 확인하다 보니 프로세스랑 동기, 비동기까지 다시 봐야 할 것 같으나

그러면 내용이 너무 길어지니까 일단 패스.

 

(31p)

31페이지에서부터 보면 이제 코드를 보면서 설명하는데

https://github.com/bpbpublications/Backend-Developer-in-30-Days/blob/main/Chapter%2002/HttpServer.java

 

Backend-Developer-in-30-Days/Chapter 02/HttpServer.java at main · bpbpublications/Backend-Developer-in-30-Days

Backend Developer in 30 Days, by BPB Publications. Contribute to bpbpublications/Backend-Developer-in-30-Days development by creating an account on GitHub.

github.com

이쪽에서 보면 편하다.

 

TCP/IP란?

더보기

TCP/IP는 인터넷과 대부분의 네트워크에서 사용하는 프로토콜 스택(통신 규약의 집합)을 의미합니다. TCP/IP는 서로 다른 네트워크 장치들 간의 데이터 통신을 가능하게 하며, 네트워크 계층과 전송 계층에서 작동하는 두 가지 주요 프로토콜인 TCP(Transmission Control Protocol)와 IP(Internet Protocol)로 구성됩니다. TCP/IP의 구성과 역할을 간략히 설명하겠습니다.

TCP/IP의 주요 구성 요소

  1. IP (Internet Protocol)
    • 역할: 데이터 패킷을 송신지에서 목적지로 전달하는 역할을 합니다.
    • 특징:
      • 패킷 전송: IP는 데이터를 작은 패킷으로 나누어 전송합니다.
      • 주소 지정: 각 패킷에는 송신자와 수신자의 IP 주소가 포함됩니다.
      • 비연결성: IP는 연결을 유지하지 않고 패킷을 독립적으로 전송합니다.
  2. TCP (Transmission Control Protocol)
    • 역할: 데이터 전송의 신뢰성을 보장하는 역할을 합니다.
    • 특징:
      • 연결 지향: TCP는 데이터 전송 전에 송신자와 수신자 간의 연결을 설정합니다.
      • 데이터 재조립: 수신자가 패킷을 올바른 순서로 조립할 수 있도록 합니다.
      • 오류 검출 및 재전송: 손상된 패킷을 검출하고, 누락된 패킷을 재전송합니다.

TCP/IP의 4계층 모델

  1. 응용 계층 (Application Layer)
    • 역할: 사용자와 상호작용하는 응용 프로그램이 네트워크 서비스를 사용할 수 있도록 지원합니다.
    • 프로토콜 예시: HTTP, FTP, SMTP, DNS
  2. 전송 계층 (Transport Layer)
    • 역할: 종단 간 통신을 관리하고, 데이터 전송의 신뢰성을 보장합니다.
    • 프로토콜 예시: TCP, UDP
  3. 인터넷 계층 (Internet Layer)
    • 역할: 데이터 패킷을 송신지에서 목적지까지 전달합니다.
    • 프로토콜 예시: IP, ICMP, ARP
  4. 네트워크 인터페이스 계층 (Network Interface Layer)
    • 역할: 실제 데이터 전송을 위한 하드웨어 및 링크를 관리합니다.
    • 프로토콜 예시: Ethernet, Wi-Fi

TCP/IP의 작동 과정

  1. 데이터 분할: 응용 계층에서 생성된 데이터는 전송 계층에서 적절한 크기로 분할됩니다.
  2. 패킷 생성: 각 데이터 조각은 IP 계층에서 패킷으로 만들어지고, IP 주소가 추가됩니다.
  3. 전송: 패킷은 네트워크 인터페이스 계층을 통해 실제 네트워크로 전송됩니다.
  4. 라우팅: 패킷은 인터넷을 통해 여러 라우터를 거쳐 목적지로 전달됩니다.
  5. 재조립: 수신 측에서는 패킷을 수신하고, 전송 계층에서 데이터를 재조립합니다.

예시

TCP/IP 통신의 예시

웹 브라우저가 웹 서버에서 페이지를 요청하는 과정을 예로 들어보겠습니다.

  1. 웹 브라우저: 사용자가 웹 브라우저에 URL을 입력합니다.
  2. DNS 요청: 브라우저는 DNS를 사용하여 URL에 해당하는 IP 주소를 찾습니다.
  3. TCP 연결: 브라우저는 웹 서버의 IP 주소와 포트 번호를 사용하여 TCP 연결을 설정합니다.
  4. HTTP 요청: 브라우저는 HTTP 프로토콜을 사용하여 웹 서버에 페이지를 요청합니다.
  5. 데이터 전송: 웹 서버는 요청된 페이지를 TCP를 통해 브라우저로 전송합니다.
  6. 페이지 렌더링: 브라우저는 수신한 데이터를 사용하여 페이지를 렌더링합니다.

결론

TCP/IP는 인터넷과 대부분의 네트워크에서 사용되는 핵심 프로토콜 스택입니다. IP는 데이터 패킷을 주소에 따라 전달하고, TCP는 데이터 전송의 신뢰성을 보장합니다. TCP/IP는 네트워크 통신을 체계적으로 관리하며, 다양한 네트워크 서비스를 가능하게 합니다.

TCP/IP는 볼 내용이 많다. 이 키워드 하나로 책도 쓸 수 있다.

그러니까 일단 여기서는 대충 이 정도로만 정리한다.

https://www.geeksforgeeks.org/tcp-ip-model/

OSI 7계층만 하더라도... 정리할 내용이 많다.

이런 내용 나도 여러 번 봤지만 시간 지나면 다 까먹는다.

내가 지금 이런 내용 몇 번 본 건지 모르겠다.

https://www.cloudns.net/blog/tcp-transmission-control-protocol-what-is-it-and-how-does-it-work/

좀 더 쉽게 정리하자면

TCP/IP는 프로토콜 '스택'이다.

스택이니까 안에 프로토콜이 많겠지?

HTTP는 그 중 애플리케이션 레이어에서 사용되는 프로토콜 중 하나다.

 

소켓이란?

IP 주소와 포트의 조합이 소켓이다.

아직 32페이지인데 이렇게나 확인할 내용이 많다...

더보기

소켓(Socket)은 네트워크 상에서 통신을 수행하는 두 장치 간의 연결을 관리하고 데이터 교환을 가능하게 해주는 소프트웨어 구조입니다. 소켓을 통해 컴퓨터 프로그램은 네트워크를 통해 데이터를 송수신할 수 있습니다. 소켓은 주로 클라이언트와 서버 간의 통신을 설정하고 관리하는 데 사용됩니다.

소켓의 역할

  1. 통신 엔드포인트: 소켓은 네트워크 통신의 끝점(엔드포인트) 역할을 합니다. 클라이언트와 서버는 각각 소켓을 사용하여 통신을 시작하고 데이터 패킷을 주고받습니다.
  2. 데이터 송수신: 소켓을 통해 데이터를 송수신할 수 있습니다. 소켓은 데이터의 전송 및 수신을 관리합니다.
  3. 프로토콜 지원: 소켓은 다양한 네트워크 프로토콜(TCP, UDP 등)을 지원하여 통신을 수행합니다.

소켓의 종류

  1. TCP 소켓:
    • 연결 지향적: TCP 소켓은 연결을 설정하고 유지합니다. 데이터 전송 전에 클라이언트와 서버 간에 연결이 설정됩니다.
    • 신뢰성: 데이터의 신뢰성을 보장하며, 데이터 손실이나 순서 변경이 발생하지 않도록 합니다.
    • 사용 예: 웹 브라우저와 웹 서버 간의 통신, 이메일 전송 등.
  2. UDP 소켓:
    • 비연결 지향적: UDP 소켓은 연결을 설정하지 않고 데이터를 전송합니다. 각 데이터그램은 독립적으로 전송됩니다.
    • 신뢰성 없음: 데이터의 신뢰성을 보장하지 않으며, 데이터 손실이나 순서 변경이 발생할 수 있습니다.
    • 사용 예: 스트리밍 서비스, 온라인 게임, 실시간 비디오/오디오 전송 등.

소켓으로도 책 한 권 분량이다.

https://www.geeksforgeeks.org/introducing-threads-socket-programming-java/

나는 그냥 대충 이해하고 있다.

 

패킷 스니퍼란?

 

(작성 중)