전체 글 806

네이버 클라우드 플랫폼(NCP)으로 Python 서버 배포하기

이 글은 FastAPI 로 구현된 Python 서버를 네이버 클라우드 플랫폼(이하 NCP)으로 마이그레이션 한 후기입니다. 들어가기 전에 저는 현재 글또 9기 운영진으로 지난 8 기서부터 또봇이라고 하는 슬랙 앱(봇)을 만들어 운영하고 있습니다. 처음 또봇을 클라우드 환경에서 배포할 때에는 `클라우드 타입`이라는 호스팅 서비스를 이용했는데요. 클라우드 타입은 클릭 몇 번으로 아주 간편하게 서버 배포를 해주는 호스팅 서비스입니다. 게다가 무료죠(였죠) 약 1년 동안 잘 사용하던 클라우드 타입이 이번 12월 부터 유료화를 도입했고, 기존 무료 호스팅은 하루 1번 강제 종료라는,, 아주 크리티컬 한 제약이 추가되었습니다. ㅠㅠ 저는 서버가 강제종료되기 전에 서둘러 다른 클라우드 서비스를 찾기 시작했습니다. 그..

Python threading.local 와 ContextVar 비교

threading.local 와 ContextVar 는 둘 다 데이터를 격리하고 동적으로 할당한다는 점에서 유사한 목적을 가지고 있지만 사용되는 상황과 특징이 조금 다르다. 이 글에서는 둘의 공통점과 차이점을 예제 코드와 함께 비교해보고자 한다. threading.local threading.local 은 각 스레드마다 고유한 데이터를 가질 수 있게 해준다. 아래 예제 코드를 살펴보자. import threading # threading.local 객체 생성 thread_local_data = threading.local() def 스레드_울음소리(): thread_local_data.value = "끼룩끼룩!" def 스레드_동물호출(): value = getattr(thread_local_data, ..

Python JSON 직렬화 TypeError 핸들링하기

json 변환 시 타입에러 발생 아래와 같이 Decimal 타입을 json 으로 변환하는 코드가 있다고 해보자. import json from decimal import Decimal data = {"value": Decimal("123.456")} json_str = json.dumps(data) print(json_str) 이를 실행하면 다음의 에러가 발생한다. raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type Decimal is not JSON serializable 왜냐하면 json 라이브러리는 기본적으로 다음 타입들만 직렬화를 지원하기 때문이다. dict list, tuple str int, fl..

Django 에서 middleware 추가하기

Django 에서 middleware 추가하기 장고에서 미들웨어를 추가하는 방법에는 함수형과 클래스형이 있는데 이 글에서는 클래스형에 대해서 설명하겠다. 먼저 미들웨어 클래스를 정의하고 __init__ 메서드와 __call__ 메서드를 다음과 같이 추가하자. from django.http import HttpRequest, HttpResponse class CustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request: HttpRequest) -> HttpResponse: some_function() # 요청에 영향을 줄 수 있는 로직 response = self.g..

Sqlalchemy 에서 joinedload 할 때, The unique() method must be ... 에러 해결방법

Sqlalchemy 로 ORM 영역에서 join 을 하려고 할 때 joinedload 를 자주 사용한다. 그런데 joinedload 방식은 복수의 ORM 객체를 불러올 때에 다음처럼 에러가 발생할 수 있다. sqlalchemy.exc.InvalidRequestError: The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collections 결론부터 말하자면 메시지의 내용대로 unique() 를 추가하면 된다. 아래처럼 말이다. ... res = await session.execute(stmt) res.scalars().all() # X res.sca..

Pydantic 옵션 하나로 ORM 을 DTO 모델로 변환하기

ORM 에서 DTO 로 모델 변환하기 ORM(Object-Relational Mapping) 객체를 통해 DB의 데이터를 가져왔다면 이를 DTO(Data Transfer Object)를 통해 다른 레이어로 전달하고 싶을 것이다. 이 글에서는 Pydantic 의 from_attributes=True 옵션을 활용하여 손쉽게 DTO를 생성하는 방법을 설명하고자 한다. 본론에 앞서 우선 ORM을 DTO로 변환하는 다양한 방법들을 살펴보자. (본론으로 넘어가고 싶다면 생략해도 좋다) 예를 들어 아래처럼 ORM과 DTO 모델이 명시되어 있다고 해보자. from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declar..

Pydantic 의 Datetime 타입으로 날짜와 시간을 다뤄보자

Pydantic 의 네 가지 Datetime 타입 Pydantic은 데이터 유효성 검사와 데이터 클래스 설정을 간결하게 만들어주는 Python 라이브러리다. Pydantic에서는 날짜와 시간을 다루는 특별한 타입이 있는데, AwareDatetime, NaiveDatetime, PastDatetime, FutureDatetime이 바로 그것이다. 이 글을 통해 각각의 타입이 어떻게 동작하고 언제 사용되는지 확인해보자. AwareDatetime AwareDatetime은 시간대(timezone) 정보가 포함된 datetime 객체를 의미한다. 세계 각지의 시간대를 일관성 있게 처리해야 할 때 유용하게 쓸 수 있다. 사용 예시 from pydantic import BaseModel from datetime i..

Python _ setup.py 의 역할과 사용법

setup.py는 파이썬 프로젝트 및 패키지의 빌드, 패키징 및 배포를 관리하는 스크립트 파일이다. 이 파일은 주로 setuptools 및 distutils 라이브러리를 사용하여 파이썬 패키지 정보와 설정을 정의한다. setup.py의 주요 역할 패키지 정보 정의: 패키지의 이름, 버전, 저자, 라이선스 등의 메타데이터를 정의 의존성 관리: 패키지의 작동을 위해 필요한 다른 파이썬 패키지들을 명시 빌드 및 배포 명령 제공: python setup.py install, python setup.py sdist 등의 명령어로 패키지를 빌드하거나 설치 엔트리 포인트 지정: 특정 스크립트나 함수를 명령어로 실행할 수 있게 설정 setup.py 예시 from setuptools import setup, find_p..

커밋 메시지를 자동 생성해보자! (feat. auto-commit-msg)

`auto-commit-msg` 프로젝트 시작 개발자들은 보통 git 이라는 버전 관리 시스템(VCS)을 사용하여 코드를 관리한다. 그리고 git 은 commit 을 통해 코드 변경사항을 기록한다. 예를 들어 개발자가 main.py 파일을 추가했다면 git commit -m "feat: Add main.py file" 처럼 명령어를 입력하여 해당 커밋이 무엇을 의미하는지 메시지를 작성한다. 예시처럼 간단한 변경사항이라면 커밋 메시지를 작성하는데 어려움은 없겠지만 복잡한 변경사항이라면 커밋 메시지를 짓는 데에도 시간이 걸린다. 만약 리팩터링을 위해 여기저기 파일을 손대고 코드를 수정했다면, 개발자는 커밋 메시지를 짓느라 일정 시간을 사용할 수 밖에 없다. 나는 커밋 메시지를 작성하는데 시간을 쓰고 싶지 않..

개발자 70명 앞에서 발표한 후기

발표 후기지난 5월 19일에 있었던 [글또 8기 - 백엔드 반상회] 발표 후기를 남겨보고자 한다! 나는 70여명의 개발자 앞에서 '내가 커뮤니티로 성장하는 방법'이라는 주제로 발표를 했다. 아래는 당시 발표하는 모습을 찍은 사진이다. 글또 백엔드 반상회에 대한 설명과 자료는 해당 링크에서 확인할 수 있다. 내가 만든 발표 자료 또한 링크를 통해 확인할 수 있다. 나도 발표를 할 수 있을까?비전공자로서 처음 개발을 시작했을 때, 언젠가 나도 다른 개발자들 앞에서 발표를 할 수 있을까?라는 의문을 가졌었다. 그 당시에는 발표를 한다는 것이 '뛰어난 개발자'의 징표처럼 여겨졌다. 이렇듯 나는 발표에 대한 막연한 동경심을 갖고 있었다. 발표에 대한 욕구가 가장 강하게 일었던 때는 작년 '글또콘'이었다. 당시 성..