프로그래밍 언어
Celery로 파이썬 비동기 작업 처리: 큐, 워커, 운영 체크리스트
웹 요청 안에서 처리하면 안 되는 무거운 작업을 Celery로 분리하는 법을 정리합니다. 브로커·워커·결과 백엔드로 이루어진 작업 큐의 구조, 태스크 정의와 delay 호출, 재시도와 지수 백오프 설정, 최소 한 번 실행이라는 전제에서 나오는 멱등성 원칙, acks_late와 시간 제한 같은 운영 설정, Flower 모니터링, 그리고 FastAPI BackgroundTasks나 RQ로 충분한 경우의 구분까지 다룹니다.
Rust 기초 강좌 #9 수명과 모듈: lifetime 표기가 필요한 순간, 모듈과 크레이트까지
기초 강좌의 마지막 편입니다. 4편의 댕글링 참조 차단이 어떻게 작동했는지를 수명(lifetime)으로 설명하고, missing lifetime specifier 에러가 나는 순간과 수명 매개변수 표기의 진짜 의미(수명을 늘리는 것이 아니라 관계를 선언하는 것), 대부분 표기가 생략되는 이유를 다룹니다. 이어서 mod와 pub으로 코드를 나누는 모듈 시스템, crates.io에서 외부 크레이트를 쓰는 법, 그리고 강좌 이후의 학습 경로까지 정리하겠습니다.
Rust 기초 강좌 #8 트레이트와 제네릭: 상속 없이 공통 동작을 정의하는 법
지금까지 미뤄 온 개념을 회수하는 편입니다. 공통 동작을 정의하는 트레이트(trait)와 기본 구현, 타입을 일반화하는 제네릭과 트레이트 바운드, derive가 자동 생성하는 표준 트레이트(Debug·Clone·Copy·PartialEq), 제네릭이 런타임 비용 없이 컴파일되는 단형화, 그리고 Box<dyn Error>의 dyn이 뜻하는 동적 디스패치까지 다루겠습니다.
SQLAlchemy 2.0 #7 Alembic과 실전 구성: 마이그레이션, 비동기, 팀 규약
시리즈 마지막 편으로 운영 단계의 주제를 정리합니다. create_all이 스키마 변경을 해결하지 못하는 이유와 Alembic 도입, autogenerate가 감지하는 것과 놓치는 것, 마이그레이션 파일 리뷰 원칙, create_async_engine과 AsyncSession으로 넘어가는 비동기 구성과 지연 로딩 제약, 모델·세션·설정을 배치하는 프로젝트 구조, 팀에서 지킬 규약까지 다룹니다.
Rust 기초 강좌 #7 컬렉션과 이터레이터: Vec·String·HashMap과 for문을 대체하는 체인
실무 코드의 몸통인 세 컬렉션을 다룹니다. 가변 길이 배열 Vec과 인덱스 대신 get을 쓰는 이유, 왜 String은 인덱스로 접근할 수 없는지(UTF-8과 바이트·문자의 차이), HashMap과 entry API, 그리고 for 반복문을 map·filter·collect 체인으로 바꾸는 이터레이터 스타일과 지연 평가까지 다루겠습니다.
SQLAlchemy 2.0 #6 쿼리 심화: 조인, 집계, 서브쿼리, 대량 처리
select() 하나로 실전 쿼리를 조립하는 법을 정리합니다. scalars와 execute의 반환 형태 차이, 여러 조건과 or_, 조인과 명시적 ON 절, group_by와 집계 함수에 라벨을 붙여 읽는 법, 서브쿼리와 EXISTS, LIMIT·OFFSET 페이지네이션과 그 한계, ORM 단위 작업을 우회하는 대량 INSERT·UPDATE까지, 2.0 스타일 쿼리의 실무 레퍼토리를 다룹니다.
Rust 기초 강좌 #6 에러 처리: Result와 ? 연산자, panic·unwrap 사용 기준
예외(exception)가 없는 Rust의 에러 처리를 다룹니다. 실패 가능성을 반환 타입에 드러내는 Result, match 중첩을 한 글자로 줄이는 ? 연산자와 에러 전파, main이 Result를 반환하는 실용 형태, 그리고 unwrap·expect·panic을 언제 써도 되고 언제 쓰면 안 되는지의 판단 기준까지 다루겠습니다.
SQLAlchemy 2.0 #5 관계 매핑: 1:N, N:M, 그리고 N+1 문제
ORM의 꽃이자 함정인 relationship을 정리합니다. 외래 키와 relationship의 역할 분담, back_populates로 양방향을 잇는 1:N 선언, secondary 테이블을 쓰는 N:M, 부모 삭제 시 자식 처리를 정하는 cascade와 delete-orphan, 지연 로딩이 만들어 내는 N+1 문제를 echo 로그로 확인하는 법, selectinload와 joinedload로 해결하는 기준까지 다룹니다.
Rust 기초 강좌 #5 구조체와 열거형: match와 Option, null이 없는 언어의 설계
데이터를 구조화하는 두 축인 구조체(struct)와 열거형(enum)을 다룹니다. impl 블록으로 메서드를 붙이는 법, variant마다 다른 데이터를 담는 Rust 열거형의 표현력, 모든 경우를 검사했는지 컴파일러가 강제하는 match, 그리고 null 대신 "값이 없을 수 있음"을 타입으로 드러내는 Option까지, Rust 코드의 뼈대가 되는 도구들을 다루겠습니다.
SQLAlchemy 2.0 #4 세션: 변경 추적, flush와 commit, 객체의 네 가지 상태
ORM의 심장인 Session을 정리합니다. 세션이 단위 작업(Unit of Work)으로 변경을 모았다가 한 번에 SQL로 내보내는 원리, flush와 commit의 차이, transient·pending·persistent·detached라는 객체의 네 가지 상태, 같은 행은 같은 객체로 돌려주는 identity map, commit 후 속성 접근이 다시 쿼리를 날리는 이유, 웹 애플리케이션에서 요청당 세션 하나라는 스코프 원칙까지 다룹니다.
Rust 기초 강좌 #4 참조와 빌림: &와 &mut, 빌림 규칙 관련 컴파일 에러 해결
소유권을 옮기지 않고 값을 사용하는 참조(&)와 가변 참조(&mut)를 다룹니다. "불변 참조는 여러 개, 가변 참조는 하나"라는 빌림 규칙이 무엇을 막는지(반복 중 수정, 데이터 레이스), cannot borrow as mutable 에러를 읽고 푸는 법, 해제된 메모리를 가리키는 댕글링 참조가 컴파일 단계에서 차단되는 구조, 그리고 &str과 슬라이스까지 다루겠습니다.
SQLAlchemy 2.0 #3 ORM 모델 정의: DeclarativeBase, Mapped, mapped_column
테이블을 파이썬 클래스로 선언하는 2.0 스타일 ORM 모델 정의를 정리합니다. DeclarativeBase를 상속하는 구조, Mapped 타입 힌트와 mapped_column의 역할 분담, 파이썬 타입이 DB 타입으로 매핑되는 규칙, Optional과 nullable의 연동, 기본값·유니크·인덱스 선언, 제약 조건 이름을 자동으로 붙이는 네이밍 컨벤션까지 다룹니다.