전체 글 23

파이썬의 기이한 특징들

1. 256 is 256은 참, 257 is 257은 거짓파이썬의 비교 연산자에는 ==와 is가 있습니다.==는 두 객체가 같은 값을 갖고 있는지를 비교하지만 is 연산자는 두 객체의 id값이 동일한 값인지를 검사합니다.id는 파이썬의 객체를 구별하는 값이라고 생각하면 됩니다.>>> a = 10>>> b = 10.0>>> a == bTrue>>> a is bFalse10과 10.0의 값은 같지만 서로 다른 객체이기 때문에 is 비교연산자로 서로의 id값을 비교하게 되면 False가 됩니다.>>> (id(a), id(b))(4343095344, 4344870928) 파이썬은 새로운 정수 객체를 만들어서 메모리에 올리는 시간이 짧은 편입니다.그 이유는 CPython 인터프리터에서 최적화를 위해 -5 ~ 25..

카테고리 없음 2025.03.12

CS - Coroutine 코루틴

1. 동시성과 병렬성코루틴을 공부하기 전에 동시성과 병렬성을 알고 있어야 합니다.1-1. Concurrency 동시성동시성은 이름만 보면 무언가가 동시에 실행되는 것처럼 생각할 수 있지만 실제론 하나의 시스템이 여러 작업을 동시에 처리하는 것처럼 보이게 하는 것이라는 의미를 갖고 있습니다.동시성은 비동기 프로그래밍, 코루틴 등등을 사용해 구현됩니다. 동시성은 여러 작업들을 서로 바꿔가며 진행하기 때문에 여러 요청들을 동시에 처리하거나 서로 번갈아가며 처리할 수 있습니다.1-2. 병렬성병렬성은 여러 작업을 물리적으로 동시에 처리하는 것을 말합니다. 여러 cpu나 코어 등을 이용해서 여러 작업을 병렬로 처리합니다. 동시성병렬성구분동시에 처리하는 것처럼 보이게 하는것물리적으로 동시에 처리하는것동작싱글 코어에서..

카테고리 없음 2025.03.06

Nginx

nginx란 http와 리버스 프록시, IMAP/POP (이메일 프로토콜)의 서버를 구동할 수 있는 오픈 소스입니다.nginx는 러시아의 개발자가 Apache의 C10K 문제를 해결하기 위해 개발이 시작되었습니다. 1. Apache C10K문제C10K는 Connection 10K Problem의 줄임말이며 동시에 1만 개의 커넥션을 가질 수 있는 서버를 구현하는 문제입니다.아파치는 prefork방식을 사용해 미리 프로세스를 만들어두고 요청이 들어오면 프로세스를 한 개 가져다 쓰는 방식을 사용합니다. 만약 프로세스가 부족하다면 하나 더 생성하고, 하나의 커넥션을 오랫동안 사용했습니다. (Keep-Alive)이렇게 커넥션마다 프로세스를 할당하면 대표적으로 메모리 부족 문제가 발생합니다. 또한 아파치의 무거운..

카테고리 없음 2025.02.07

개발시에 발생하는 DRF의 몇몇 문제점들

1. 서론학교를 다니면서 Python으로 서버를 개발하면서 프로젝트를 적지만 몇 번 진행한 경험이 있다. 그때마다 난 DRF를 사용해 왔다.사실 클라이언트와 서버를 동시에 개발하지 않는 이상 Django를 쓴다고 하면 보통 DRF를 사용한다는 걸 말하는 것 같다.진행한 프로젝트들은 보통은 간단한 프로젝트이거나 MSA에선 Python이 사용되는 도메인의 크기가 크지 않아서 장고 프로젝트가 부담스럽게 커지진 않는 것 같다.하지만 큰 프로젝트를 DRF로 개발하게 되면 몇 가지 문제가 생기는 것 같다. 2. DRF 프로젝트Django 프로젝트는 App이라는 단위로 나누어진다. 개인적으로 App으로 프로젝트가 구성되는 건 좋게 느껴진다. 기능별로 직관적으로 나눌 수 있고, 새로운 도메인이 추가되며 확장하는 경우엔..

django 2025.02.04

저스틴 비버 문제

저스틴 비버 문제란 인스타그램에 저스틴 비버가 게시글을 올릴 때마다 인스타그램 시스템 전체가 느려지거나 다운되는 현상을 말합니다.이런 저스틴 비버 문제는 소수의 유명인들의 게시글이 몇 분만에 수백만개의 좋아요를 받으면서 발생하였습니다. 1. Justin Bieber 문제이러한 문제는 인스타그램 초기에 좋아요 개수를 계산하는 방식에서 발생하였습니다.인스타그램은 게시글을 조회시에 좋아요 수를 같이 조회하게 되어있습니다. 수억 명의 팔로워를 갖는 저스틴 비버의 게시글은 초당 엄청난 좋아요 개수 조회 요청이 발생하였습니다.boardidtitleuser1asdf저스틴 비버likeuserboard_id홍길동1인스타그램은 원래 정규화된 좋아요 스키마를 사용해서 좋아요를 기록했습니다. 사용자가 좋아요를 누를 시 좋아요..

카테고리 없음 2025.01.31

Django - Throttling

스로틀링은 클라이언트가 api에 요청할 수 있는 속도를 제한하는 데 사용된다. django에서는 권한에 따라 인증되지 않는 사용자에게는 제한적으로 스로틀링을 적용할 수 있고, 분당 몇 회의 요청을 제한하는 bust throttling과 하루 요청 제한을 제한하는 sustained throttling을 적용할 수 있다.또한 각각 api 마다 다른 스로틀링을 적용할 수 있고, burst와 sustained 스로틀링을 동시에 적용할 수도 있다. 예시로 분당 30회, 하루 1000회로 동시에 제한이 가능하다.애플리케이션단의 스로틀링은 브루트포스 공격이나 ddos 공격을 막기 위한 방법으로 사용하면 안된다. 공격자는 항상 ip스푸핑이 가능하고 django의 스로틀링은 원자성이 보장되게 속도가 계산되지 않기 때문에..

django 2025.01.18

GraphQL

1. 서론내가 진행하게 된 개인 프로젝트에서 플린코 게임 서버를 구현하게 되었다.플린코 게임을 어떻게 하면 안전하게 구현할지 생각하다가 stake 플랫폼에선 플린코가 어떻게 작동하는지 궁금해 플레이했다.stake에서는 서버에서 공의 route를 정해주는 방식이다.여기서 보면 stake는 GraphQL을 사용하는 걸 알 수 있다.  2. GraphQL?GraphQL은 페이스북에서 만든 쿼리 언어이다. gql이라고도 부른다. 인기는 매우 높지만 openapi에선 실제로 사용하는 곳이 많진 않다고 한다.gql은 sql과 같은 쿼리 언어이다.gql과 sql의 차이는 sql은 데이터베이스 시스템에 저장된 데이터를 쿼리하는것이 목적이고, gql은 클라이언트가 서버로부터 데이터를 효율적으로 쿼리 하기 위한 목적이다...

카테고리 없음 2025.01.11

Django - Inverted Index로 검색하기

1. filter로 검색 시의 문제점장고 프로젝트에서 어떤것을 검색하는 것을 구현해야 할 때 filter()를 많이 사용하고, 가장 편한 방법이다.하지만 이런 방식은 많은 문제점이 있다.db index 사용 불가능filter() 에서 __contains를 사용하게 되면 LIKE 문이 실행되는데 이 경우는 Full Scan을 한다.LIKE% (__startwith)를 사용하는 경우는 제외제대로 된 검색이 불가능쿼리 한 키워드가 완벽히 일치해야지 검색된다.단어별로 검색이 불가능여러 가지 이유로 검색엔진을 구현해서 검색기능을 사용하는 게 좋은 방법이다.검색엔진에선 대표적으로 역인덱스(inverted index)를 사용하는 방법이 있다. 2. 역인덱스역인덱스란, 각 단어들이 어떤 문서에 저장되어 있는지를 나타내..

django 2024.12.29