전체 글 31

[Django ORM] Q 객체와 F 객체

1. Q객체Q객체는 filter문에서 and, or, not 같은 복잡한 비교 연산을 간단하게 쿼리하는데 사용된다.result = ( Book.objects.filter(name__startswith="a") | Book.objects.filter(name__startswith="b"))result = Book.objects.filter( Q(name__startswith="a") | Q(name__startswith="b"))result = Book.objects.filter( ~Q(name__startswith="a") | Q(name__startswith="b"))Q를 사용하면 두 개의 filter 문을 |, &로 조합하는것 보다 filter 내부에서 비교연산자를 사용할 수 있게 해줘서 훨씬 짧고..

카테고리 없음 2025.09.05

[Django ORM] union, subquery

1. unionuser1 = User.objects.get(id=1)user2 = User.objects.get(id=2)users = user1.union(user2)# , ]>union은 SQL의 UNION 절의 역할을 한다.두개의 쿼리셋의 합집합을 구할때 사용한다. 모델이 다르거나 조회 row가 다르면 에러가 발생한다. 2. subquery서브쿼리는 쿼리 안에 또 다른 쿼리를 할때 사용된다.SELECT *, (SELECT MAX(score) FROM grade WHERE score >= 50) AS max_scoreFROM user;Django ORM으로 해당 쿼리를 구현하려면 Subquery를 사용하면 된다.max_score_gte_50 = Grade.objects.filter( id=Out..

카테고리 없음 2025.09.05

[Django ORM] .get() vs .filter()

1. 개념차이.get은 단일 객체 조회시에 사용한다.board = Board.objects.get(id=1)# SELECT * FROM board WHERE id=1 LIMIT 1;get은 단일 모델 인스턴스를 반환하며 즉시 쿼리가 발생한다.get은 조회되는 객체가 없을시에는 DoesNotExists 예외, 여러개가 반환되면 MultipleObjectsReturned 예외를 뱉어낸다.조회된 객체가 없을시에 예외가 터지기 때문에 500이 발생하게 된다. 대안으로 조회 객체가 없을시에 404를 뱉어내는 get_object_or_404 혹은 get_list_of_404를 사용하기도 한다. .filter은 여러 객체 조회시에 사용한다.board = Board.objects.filter(id=1)# SELECT ..

카테고리 없음 2025.09.05

[Other] SCD Slowly Changing demension

SCD는 천천히 그리고 예측 불가하게 변하는 데이터들을 효율적으로 관리하기 위한 솔루션이다. 디멘션 테이블은 사실 정보를 기록하는 테이블의 컬럼들을 설명하는 테이블이다.사실 정보를 기록하는 팩트테이블이 예측 불가능하게 변하고, 우리는 그 기록과 과정을 추적할 수 없으면 많은 문제가 생길것이다.이런 환경을 개선하기 위해서 나온 개념이 SCD이다. SCD에는 6개의 타입이 있다.Type 1 - 직접 업데이트팩트테이블의 변화할 컬럼을 직접 업데이트 하는 방식이다.이런 방식은 가장 쉽고 간단하지만 변경사항을 기록할 수 없다. 과거의 기록이 중요하지 않는 테이블에서 사용한다. Type 2 - 컬럼 단위로 관리idpointstart_dateend_datecurrent_flag33002025-01-08 1220020..

카테고리 없음 2025.08.17

[Design] 캐시 디자인 패턴

캐시는 성능 향상을 목표로 적용한다. 영속성 데이터 저장소를 사용하면 데이터는 영속적이지만 성능이 비교적 낮다.캐시를 도입하게 되면 영속적인 부분을 포기하지만 성능을 높게 가져갈 수 있다. Cache-Aside / Lazy Loding 패턴가장 많이 사용되는 패턴이다. 애플리케이션 서버에 영속성 db와 캐싱 db가 병렬적으로 연결되는 구조이며애플리케이션에서 캐싱 db에 원하는 데이터가 저장되어 있는지 확인하고, 없다면 영속성db에서 조회를 하여 캐시에 저장하는 구조이다.캐시 적중률이 높지만 2단계로 조회를 해야하고 cold start 상황에서는 warm up 시간이 필요하다. Read-Through 패턴애플리케이션 - 캐시 - db 로 연결이 되며 애플리케이션은 데이터 조회를 캐시를 통해서만 한다.배치 ..

카테고리 없음 2025.08.15

[CPython] Memory 할당, Reference Count 회수

1. C에서 메모리를 관리하는법1.1 C 메모리 할당C에서 변수를 사용하려면 운영 체제한테 메모리를 할당받아야 한다.1.1.1 정적 메모리 할당C언어는 타입별로 메모리 크기가 다 정해져있다. 컴파일 시점에 모든 정적변수, 전역변수에 필요한 메모리를 계산한 후 메모리를 애플리케이션에 컴파일한다.static int a = 10;sizeof(int) int형 변수 하나는 4바이트를 차지한다.크기가 정적으로 할당되는 배열도 똑같다.static int a[10] = {1,2,3,4,5,6,7,8,9,10};sizeof(int) * 10int 자료형 10개 모인 만큼 메모리를 계산하고 할당한다.1.1.2 자동 메모리 할당자동 메모리 할당도 컴파일 시점에 컴파일러가 필요 메모리를 계산한다.static const in..

python 2025.07.24

[Security] ReDos Attack으로 실제 서비스 분석하기

1. Regex정규식은 특정한 규칙(전화번호, 이메일)을 갖는 문자열의 집합을 다루는 데 사용하는 언어입니다. 다양한 언어에서 형식, 검증, 검색 치환을 위해서 지원하고 있습니다.2. 정규식 사용법2-1. 매칭 패턴대문자 영어는 아닌 것을 뜻합니다.패턴의미a-zA-Z, 0-9, ㄱ-ㅎ-으로 범위를 지정한다.\d, \D숫자\w, \W알파벳, 숫자, 언더스코어\s, \S스페이스 공백\특수문자특수기호2-2. 검색 패턴패턴의미|OR[ ]괄호안의 문자 중 하나[^문자 ]괄호안의 문자를 제외한 것^문자열특정 문자열로 시작문자열$특정 문자열로 끝남()그룹화(?:패턴)그룹 검색\b, \B단어의 처음, 끝2-3. 수량 표현패턴의미?최대 1개*있거나 없거나+최소 1개{min, max}최소 ~ 최대전화번호 정규식을 예시로 ..

카테고리 없음 2025.03.20

[Python] 파이썬의 특이한 특징들

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