이 책을 관통하는 내용은 ‘우리가 정말 매일매일 함께 자랄 수 있을까?’ 입니다. 우선 자라기(성장)에 대한 이야기를 해보겠습니다.내용성장경력의 함정책에서는 어떻게 성장해야 하는지를 설명하기전에 경력의 함정에 대해서 이야기합니다. 연구 결과에 의하면 직원을 뽑을때 학력과 연차는 그 사람의 실력을 말해주기 어려우며 작업 샘플 테스트, 구조화된 인터뷰가 더 정확하다고 합니다.예외적으로 경력이 얼마 되지 않았을때는 연차가 실력을 대변해주기도 합니다. 경력이 10년인 개발자가 2년인 개발자보다 더 우수하지 않았다. 경력과 생산성은 아무 상관관계가 없었다. 단, 언어를 접한 경험이 6개월 미만인 개발자들은 전반적으로 나머지 개발자들보다 성적이 저조했다. 따라서 단순히 경험과 연차가 본인의 성장을 보장해주지는 않습..
분류 전체보기
비동기 웹프레임워크인 FastAPI에서 Sqlalchemy Session 사용법을 알아보도록 하겠습니다.기본적인 Session 사용법가장 단순한 방법은 Session 객체를 직접 생성하여 사용하는 것입니다:from sqlalchemy import create_enginefrom sqlalchemy.orm import Session# 엔진 생성engine = create_engine("postgresql://user:password@localhost/dbname")# 세션 생성session = Session(bind=engine)# 세션 사용user = session.query(User).filter_by(id=1).first()session.add(User(name="새 사용자"))session.comm..
Nginx Ingress Contoller를 사용할 때 서버에서 클라이언트의 IP를 획득하는 방법을 알아보도록 하겠습니다.proxy_set_headerNginx사용 시 서버에서 클라이언트의 IP를 읽을 때 보통 X-Forwarded-For 헤더를 사용하는데, Nginx설정에 따라 다른 값들이 오게 됩니다.proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Forwarded-For $http_x_forwarded_for;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;remote_addrNginx에 연결된 클라이언트의 IP 주소를 나타냅니다. 클라이언트가 직접 Nginx에 ..
데이터 중심 애플리케이션 설계를 읽다가 챕터7 트랜잭션 내용이 좋아서 정리해보았습니다. 우선 책에 있는 동시성문제와 격리수준을 소개합니다.동시성문제1. 더티 읽기 (Dirty Read)시나리오: 은행 계좌 이체 중 잔액 확인A 고객이 B 고객에게 100만원을 이체하는 트랜잭션 시작A의 계좌에서 100만원이 차감됨 (아직 커밋되지 않음)이때 C 고객이 A의 계좌 잔액을 조회A의 이체 트랜잭션이 실패하여 롤백됨문제점C 고객은 실제로는 존재하지 않는(롤백된) 잔액을 보게 됨잘못된 데이터를 읽어서 사용하는 문제2. 더티 쓰기 (Dirty Write)시나리오: 은행 계좌 이체트랜잭션 A가 상품 가격을 10000원에서 20000원으로 수정 (아직 커밋 전)트랜잭션 B가 같은 상품 가격을 15000원으로 수정하고 커..
PgBouncer 도입 배경PgBouncer는 PostgreSQL에 사용되는 커넥션 풀링 도구입니다. PostgreSQL 서버와의 커넥션을 맺는 과정은 많은 자원을 소모하기 때문에, 한 번 만들어 둔 커넥션을 재사용할 필요가 있습니다. 이때 사용하는 것이 커넥션 풀링 도구입니다. 풀링을 사용하는 것만으로도 서버의 부하를 많이 낮출 수 있기 때문에, DB를 사용하는 경우에는 반드시 고려하는 것이 좋습니다. 각 언어별로 DB와 연결을 도와주는 라이브러리(ex: Python asyncpg)를 사용해 서버에서도 커넥션 풀링을 사용할 수 있지만, 쿠버네티스 오토스케일링 환경에서 서버를 운영 중이라면 PgBouncer 도입을 고려해볼 만합니다. 아래는 제가 회사에서 PgBouncer를 도입하게 된 계기입니다.비용 ..
최근 팀에서 FastAPI 반환값의 Response Model를 어떻게 사용할 것인지 논의했던 내용을 정리했습니다. 함께 논의해 주신 팀원분들께 감사인사를 드립니다.jsonable_encoder의 성능 이슈FastAPI는 컨트롤러(라우터) 함수의 반환값을 json serializable 한 타입으로 변환해주는 jsonable_encoder라는 함수를 사용합니다.따라서 API 반환시마다 jsonable_encoder 👉 json.dumps 과정을 거치게되며, 해당 함수는 recursive 하게 작동하기 때문에 반환값이 많을 경우 jsonable_encoder에 의해서 API 성능이 안 좋아질 수 있습니다. 간단한 코드로 확인해보면 아래와 같습니다.import timeitfrom typing import..
MSA로 전환 시 고민해야 할 분산 데이터 관련 문제가 트랜잭션만 있는 것은 아닙니다. 쿼리를 구현하는 방법도 찾아내야 합니다. 💡 트랜잭션 문제 해결 법 → [MSA] 마이크로서비스 사가 패턴 [MSA] 마이크로서비스 사가 패턴 단일 DB에 접근하는 모놀리식 애플리케이션의 트랜잭션 관리는 어렵지 않습니다. 하지만 다중 DB, 다중 메시지 브로커를 사용하는 모놀리식 애플리케이션이나, 자체 DB를 가진 여러 서비스로 구 sawaca96.tistory.com DB가 하나뿐인 모놀리식 애플리케이션에서는 비교적 쉽게 쿼리를 구현했습니다. 하지만 MSA에서는 의외로 쿼리를 작성하기가 어렵습니다. 여러 서비스 여러 DB에 분산된 데이터를 조회해야 하기 때문입니다. 이를 해결하기 위한 2가지 패턴이 있습니다. API..
[Airflow] 개념 이해하기Airflow에 대한 공식문서의 설명 Airflow 는 워크플로우를 프로그래밍 방식으로 작성, 스케줄링 및 모니터링하는 플랫폼입니다. Airflow 를 사용하여 워크플로우를 비순환 그래프로 작성할 수 있습니sawaca96.tistory.comAirflow 두번째 글 입니다.Helm Chart를 이용해서 k8s위에 Airflow를 설치해보려고 합니다.우선 많이 사용하는 차트는 아래 2가지 옵션이 있습니다.airflow-stable→ Airflow community에서 개발한 차트입니다.astronomer/airflow-chart→ Airflow as a Service를 개발하는 astronomer에서 공개한 차트입니다.저는 airflow-stable을 이용해서 구현했습니다. ..
반응형