DB
PHP
LLM

S&P 500

SPI@SPX 미국 2026.02.13 16:49 현지시간 기준 |10분 지연제공

6,836.17

전일대비 3.41 (+ 0.05% )

나스닥 종합

NAS@IXIC 미국 2026.02.13 16:15 현지시간 기준 |15분 지연제공

22,546.67

전일대비 50.48 ( -0.22% )

다우 산업

DJI@DJI 미국 2026.02.13 16:20 현지시간 기준 |15분 지연제공

49,500.93

전일대비 48.95 (+ 0.10% )

CGI, WSGI, ASGI :: FastAPI

작성자아이디 : skok1025, 2023-11-26 10:36:11
카테고리 : 프레임워크 FastAPI 게시글 수정

최근에 사내에서 웹프레임워크로 FastAPI 를 채택하여 개발을 진행했는데요. 아무래도 이론적인 지식이 바탕이 된다면 운영에 더 힘이 될 것이라는 생각에FastAPI 프레임워크 관련 블로그 포스팅을 시작해보고자 합니다.

처음 시작은 FastAPI 가 "ASGI 웹프레임워크" 라고 불리는데 이게 무슨의미이고 이와 관련해서 CGI, WSGI 도 함께 알아보고자 합니다. 


CGI

  • Common Gateway Interface
  • 가장 오래된 인터페이스 (= 거의 모든 Web Server 지원)
  • Web Server 와 Application 간의 인터페이스
  • Web Server 에 HTTP Request 가 오면 Interpeter 에서 이를 감지하여 프로세스를 생성 (fork) 후 처리
  • CGI 는 요청마다 프로세스를 생성하는 방식이기 때문에 오버헤드가 심합니다. 이를 해소하기 위해 등장한 것이 FastCGI 입니다.
  • FastCGI 는 요청이 들어와도 하나의 프로세스만을 사용하여 처리를 합니다. 즉 메모리에 하나의 프로그램을 적재하여 재활용하기 때문에 CGI 에 비해 오버헤드가 월등하게 감소합니다.
  • Tomcat 에서도 FastCGI 를 사용할 수 있다고 합니다. 


WSGI

  • Web Server Gateway Interface
  • Python 어플리케이션, 스크립트가 웹서버와 통신하기 위한 인터페이스
  • CGI 는 매 요청마다 프로세스를 생성하지만 WSGI 는 한 프로세스에서 모든요청을 받습니다.
  • ㄴ 그럼 FastCGI 처럼 하나의 프로세스를 사용하는건 같은데, 무엇이 다른가 확인해보니 FastCGI 는 다양한 언어 프레임워크에서 사용이 가능하여 범용성을 띄는 반면에 WSGI 는 파이썬 앱만을 위해 고안한 인터페이스라고 합니다.
  • 많은 Request 들을 callback 으로 받아 처리합니다.
  • 대표적인 두가지 방법
    • 1) Nginx, Apache 에서 내장 모듈로 제공하는 server-often high profile 방식
      • 1-1) mod-wsgi
      • 1-2) mod-python
    • 2) Python 으로 작성된 Web App Server
      • 2-1) gunicorn
      • 2-2) cherrpy
  • WSGI 는 동기함수만 지원하여 여러작업을 동시에 처리하는데 한계가 있습니다. 그리고 아래와 같은 기능을 제공하지 않습니다.
    • Web Socket 지원 안함
      • ㄴ 어떻게 하면 가능은 하다는데 공식적인 방법은 아닌듯함.
    • HTTP 2.0 지원 안함


    ASGI


    • Asynchronous Server Gateway Interface
    • 대용량 트래픽을 더욱 더 유연하게 처리하기 위해서 등장한 인터페이스입니다.
    • WSGI 가 Synchronuous 하게 동작함으로써 발생하는 한계를 해결하기 위해 Uvicorn 과 같은 ASGI 가 나오게 되었습니다.  (* uvloop 를 이용하여 요청을 Asynchronous 하게 처리할 수 있다고함)
    • Web Socket, HTTP 2.0 을 지원합니다.
    • 현재 사내에서 서버를 시작할 때, 위 그림과 같이 gunicorn 을 process manager 로 uvicorn 으로 worker process 를 3개를 띄워 실행하고 있습니다.
      • gunicorn main:app --workers 3 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
    • uvicorn 만으로도 worker 여러 프로세스를 띄울 수는 있지만 공식문서에서도 gunicorn 을 process manager 로 worker process 를 띄우는게 더 효율적이라고 합니다.
    • worker 와 관련한 내용은 https://fastapi.tiangolo.com/deployment/server-workers/ 를 참고해주세요. 


    해당 블로그를 작성하면서 참고했던 포스팅들의 링크를 남겨두겠습니다. 학습에 도움이 되시기를...


    end

    safe-updates :: mysql 클라이언트 옵션

    작성자아이디 : skok1025, 2023-11-03 16:10:27
    카테고리 : DB MariaDB 게시글 수정

    mysql 클라이언트를 이용하여 mysql 서버 접근시 safe-updates 라는 옵션이 있습니다. 아래와 같이 뒤에 "--safe-updates" 를 붙여주면 되는데요. 

    root@shkim-VirtualBox:~# mysql -u root -p --safe-updates

    해당 명령어의 역할은 

    UPDATE, DELETE 그리고 SELECT 쿼리가 인덱스를 사용하지 못할 때 다음과 같이 에러를 발생시키고 쿼리를 중지시켜줍니다. 

    # flag 필드는 인덱스가 걸린 필드가 아니기 때문에 조건으로 사용불가

    MariaDB [npay]> DELETE FROM t_test WHERE flag='T';

    ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column


    # no 는 primary key 라 조건 사용가능

    MariaDB [npay]> DELETE FROM t_test WHERE no=2;

    Query OK, 1 row affected (0.001 sec)


    이게 왜 필요하냐면, 만일 인덱스를 사용하지 않고 쿼리를 실행한다면 모든 레코드를 업데이트하거나 지워버리는 불상사가 생길 수 있기 때문이죠. 

    회사에서도 운영 DB 에 접근할 일이 있는데, 앞으로는 해당 옵션을 꼭 붙여야겠네요. 

    공인 IP, 사설 IP, NAT

    작성자아이디 : skok1025, 2023-11-02 15:50:10
    카테고리 : 컴퓨터공학 네트워크 게시글 수정

    IP 주소의 부족을 공인 IP, 사설 IP 로 나누고 중간에 NAT 기술을 통해 해결합니다.

    NAT (Network Address Translation)

    패킷이 트래픽 라우팅 장치를 통해 전송되는 동안, 패킷의 주소를 변경, IP주소를 다른 IP 주소로 매핑하는 방법입니다.

    IP 주소체계 :: IPv4, IPv6

    작성자아이디 : skok1025, 2023-11-02 15:25:44
    카테고리 : 컴퓨터공학 컴퓨터공학 게시글 수정

    IPv4

    • 32비트, 2^32개의 주소 (41억 9천만 주소) 표현

    • 8비트의 단위로 점을 찍어 4개로 구분 (8비트 == 1옥텟)

    • 8비트를 10진수로 표현

    • 수가 부족하기 때문에 NAT, 서브네팅같은 부수적인 기술이 필요하다.


    IPv6

    • 128비트, 2^128개의 주소 표현가능

    • 16비트씩 8개로 구분

    • 16비트는 16진수로 변환되어 콜론 (:) 으로 구분하여 표시

    • 앞의 연속되는 0은 생략가능함.

    • 앞 64비트 : 네트워크 / 뒤 64비트 : 인터페이스


    scp :: 리눅스명령어

    작성자아이디 : skok1025, 2023-09-22 14:38:14
    카테고리 : OS (Operation System Linux 게시글 수정

    회사업무중에 DB서버의 데이터를 신규 DB서버로 이전해야 하는 작업이 있었다. 

    mariadb 의 특정 테이블을 dump 로 insert 쿼리문을 담은 "dump.sql" 파일을 생성을 했었는데, 그 이후 파일이전을 어떻게 해야할지 고민이 필요했다. 

    그 과정에서 scp 명령어라는걸 알게되었다. 


    scp는 "secure copy"의 약자로, SSH 프로토콜을 사용하여 두 호스트 간에 파일을 안전하게 복사하는 데 사용되는 명령어이다. (* 22번 포트를 사용)

    scp [옵션] [원본_파일_경로] [사용자명@원격_호스트:목적지_경로]

    만약 A서버의 "/home/shkim30_test.txt" 파일을 B서버의 "/home/tmp/shkim30_test.txt" 파일로 복사하고 싶다면 아래와 같이 진행하면 된다. 

    # scp /home/shkim30_test.txt root@B서버호스트명:/home/tmp/shkim30_test.txt

    end