Programming(78)
- 
                
                  FastAPI를 사용하는 이유: 성능 외의 트레이드오프Go가 처리량(RPS)과 지연 시간에서 우위를 보입니다만, FastAPI를 선택하는 이유는 성능만이 전부가 아니기 때문입니다. Go는 고트래픽, 저지연 미세 서비스나 실시간 시스템(예: 클라우드 네이티브 앱)에 최적화되어 있지만, FastAPI는 개발 속도, 유지보수성, Python 생태계 활용 측면에서 압도적 장점을 가집니다. 2025년 기준으로 FastAPI는 여전히 Python 백엔드의 표준으로 자리 잡았으며, 특히 중소규모 API나 프로토타이핑에서 "빠르게 만들어 유지하기 쉬운" 선택지로 사랑받고 있습니다. 아래에서 주요 이유를 정리하겠습니다. FastAPI의 핵심 장점 (Go 대비) 카테고리FastAPI 장점Go 대비 왜 선택하나? 예시/참조 개발 속도 & 생산성- 타입 힌트(Pydantic)로.. 2025.10.26
- 
                
                  Go로 서버를 구성하는 것과 Python FastAPI와 asyncio로 서버를 구성하는 것의 성능 차이# Go 언어 vs FastAPI (asyncio) 서버 성능 비교Go (Golang)와 Python의 FastAPI (asyncio 기반)는 모두 고성능 웹 서버를 구축할 수 있는 인기 있는 선택지입니다. Go는 컴파일 언어로 가벼운 Goroutines를 통해 높은 병렬성을 제공하며, FastAPI는 Python의 비동기 I/O (asyncio)를 활용해 I/O-bound 작업에 강합니다. 그러나 여러 벤치마크에 따르면, Go가 전체적으로 FastAPI보다 우수한 성능을 보입니다. 이는 주로 Go의 낮은 오버헤드, 효율적인 가비지 컬렉션(GC), 그리고 CPU-bound 작업에서의 우월성 때문입니다. Python의 인터프리터 특성과 GIL(Global Interpreter Lock)이 병목이 될 수 있.. 2025.10.26
- 
                
                  asyncio를 사용한 비동기 요청 처리Reactor pattern보통 asyncio를 사용해서 비동기 요청을 처리하는 서버를 구현한다고 했을때, 요청을 받자마자 queue에 넣고 이 queue에서 요청을 뽑아 비동기로 처리하는 reactor를 둡니다. 그리고 reactor에서 처리 완료된 결과를 결과 queue에 넣고 반환하는 처리를 합니다. 이런 패턴을 Producer-Consumer 라고 하기도 하죠. 여기서 producer는 서버 핸들러가 되고, 이는 클라이언트의 요청을 밪자마자 처리 큐에 넣어 즉시 응답을 반환하거나, 요청을 비동기로 대기 상태로 전환합니다. Consumer는 Reactor나 Worker pool이 되며, 여러 워크 태스크(reactor)가 큐에서 작업을 뽑아 비동기로 처리합니다. 워커 수를 제한해 리소스(CPU, .. 2025.10.26
- 
                
                  Python async io예제 1: 커피숍 비유로 이해하기상황: 5명의 손님이 커피를 주문했습니다커피 만드는 시간: 각 3초방법 1: 동기 방식 (Synchronous) - 비효율적인 직원import asyncio import time from datetime import datetime print("=" \* 60) print("☕ 커피숍 비유로 AsyncIO 이해하기") print("=" \* 60) def make\_coffee\_sync(customer): """커피를 만듭니다 (동기)""" print(f" \[{datetime.now().strftime('%H:%M:%S')}\] {customer}님 커피 제조 시작...") time.sleep(3) # 커피 만드는 시간 (3초 .. 2025.10.26
- 
                
                  Kotlin: Function with receivers리시버를 지닌 함수 리터럴은 다음과 같은 형태입니다.A.(B) -> C예를들어 다음과 같이 정의될 수 있습니다.val sum: Int.(Int) -> Int = { other -> plus(other) }이 경우 함수 리터럴의 바디 안에서 전달된 리시버 객체는 this가 되어 this 없이 그 멤버들에 접근이 가능합니다.위 예에서도 Int의 plus에 접근하고 있습니다.리시버가 없는 경우Int의 확장함수 wrapper는 람다함수를 func로 받고 func에 this 즉, Int객체를 넘겨서 호출합니다.람다 함수 내에서는 매개변수 it으로 hashCode()에 접근 합니다. fun Int.wrapper(func: (num: Int) -> Unit) = func(this)fun main(args: Array.. 2025.10.02
- 
                
                  Kotlin genericsGrammarclass다음 예에서 T는 타입 파라미터이며 Box 클래스가 어떤 타입이던 속성으로 지닐 수 있게 합니다. class Box(val value: T) { fun getValue(): T = value}다음과 같이 사용할 수 있습니다.val intBox = Box(123)val strBox = Box("123")println(intBox.getValue()) // 123println(strBox.getValue()) // 123다음과 같이 타입추론도 가능합니다. val intBox = Box(123)where clause여러 타입 파라미터에 복합 제약을 주거나, 하나의 타입 파라미터에 여러 제약을 줄 때 사용합니다.다음 예에서 T는 CharSquence를 구현하고, R은 Appenda.. 2025.10.02



