전체 글 16

코드 리뷰 문화 도입하기

코드리뷰가 좋다는 것은 누구나 알고 있지만, 유지하기가 참 어려운 것 같다.많은 회사가 그렇듯이 우리 팀도  코드 리뷰가 원활하지 않았다.처음엔 merge 를 눈치보지 않고 팍팍할 수 있어서 좋았지만 점차 시간이 지나며 몇몇 문제들이 누적되었다.  내가 느낀 코드리뷰를 하지 않을 때의 문제점은 크게 세 가지이다. 첫 번째로, 팀원들이 무슨 일을 하는지 파악하기 어렵다. 팀원들이 하는 일이 남의 일 같이 느껴지고, 무관심해진다. 같은 맥락에서 팀원이 짠 코드에 문제가 발생하면 원작자의 부재시 빠른 대응이 어렵다. (코드도 코드지만 비즈니스 로직 이해가 참 어렵다..) 말 그대로 이거 왜 이렇게 한거지?? 가 나오게 된다. 두 번째로, 문제 해결 비용이 크게 든다. 크로스체크를 통해 쉽게 예방할 수 있는 문..

카테고리 없음 2025.03.07

nplusone : Python framework 에서 N+1 문제를 찾기 쉽게 도와주는 라이브러리 추천

요즘 조금 여유가 생겨서 프로젝트 내에 잘못된 orm 사용으로 생기는 비효율적인 쿼리를 개선하고 있는데, 쉽게 찾을 수 있는 방법이 없을까 검색하다가 nplusone 이라는 파이썬 라이브러리를 사용해보았는데 내 시간을 매우 아껴주었다. 혹시 비슷한 사람이 있을까봐 정리해본다.  라이브러리 설명링크 :  https://pypi.org/project/nplusone/nplusone은 Python ORM 프레임워크에서 발생하는 N+1 쿼리 문제를 감지하고 진단하기 위한 라이브러리이다. N+1 쿼리 문제는 ORM을 사용할 때 흔히 발생하는 성능 이슈로, 하나의 객체 목록을 가져온 후(1회 쿼리) 각 객체의 관련 데이터를 개별적으로 추가 쿼리(N회 쿼리)하는 상황을 말한다. Django ORM과 SQLAlchem..

카테고리 없음 2025.03.06

장고(Django)에서 datetime 객체를 조작할 때 유의할 점. (UTC 시간대를 로컬 타임존으로 정확하게 변환하기)

datetime 객체를 다루는 과정에서 타임존을 신경 쓰지 않으면, 날짜가 불일치하는 등의 문제가 발생할 수 있다. 날짜 객체들이 사용하기 어려운 건 아닌데, 소홀히 하기 쉬워서 오류가 발생하기 쉬운 것 같다. 이번 포스트에서는 데이터베이스에 저장된 UTC 시간을 가져와서 사용할 때 주의해야 할 사항을 정리해 보겠다. [Prerequisite]Naive & Aware datetime object - naive : datetime object에 tzinfo(타임존 정보)가 없는 datetime 객체- aware: datetime object에 tzinfo(타임존 정보)가 있는 datetime 객체  Django 프로젝트에서는 아래와 같이 세팅 파일에 USE_TZ = True로 설정하면, 모든 datetim..

Django 2024.08.14

장고에서 auto_now_add=True 인 필드 값을 커스텀 값으로 넣고 싶을 때

장고에서 모델을 정의할 때 date나 datetime 필드인 경우에 auto_now_add=True 옵션을 주는 경우가 많다. 이 옵션은 object 가 최초로 생성될 때 자동으로 해당 필드를 현재시각(날짜)로 세팅해준다. 그런데 이 값은 내가 원하는 값으로 오버라이드 할 수가 없기 때문에, 만약 객체 생성 시에 원하는 다른 값을 넣어준다면 무시된다. 그래서 만약에 테스트나 다른 이유로 auto_now_add=True 인 필드에 커스텀 값을 넣어주어야 한다면, 생성 후에 save() 를 통해 값을 업데이트 해주는 것이 간편하다. (나는 테스트 때문에 객체의 created_at 필드를 마치 과거에 생성된 것 처럼 만들어야 해서 이 방법을 사용했다) auto_now_add 옵션은 처음 생성될 때만 그때의 시..

Django 2024.08.13

큰 숫자를 사용할 때 읽기 쉽게 언더바 (_) 사용하기

Underscores in Numeric Literals 파이썬 3.6 부터 새로 추가된 Underscores in Numeric Literals 기능을 소개하고자 한다 (https://peps.python.org/pep-0515/ ) 아주 간단한 기능인데, 쉽게 말하면 긴 숫자를 적을 때 콤마 부분을 언더바로 대신할 수 있는 기능이다. 예를 들어 1000000 같은 경우, 1_000_000 으로 표현할 수 있다. 예시) 참고로 언더바는 인터프리터에서 마지막 값을 저장하고 싶을 때 사용할 수도 있다.

파이썬 2022.08.20

파이썬 dataclass란? (@dataclass, 데이터클래스)

dataclass란? 파이썬 3.7부터 dataclass라는 모듈이 추가되었다. 말 그대로 데이터를 담는 클래스이고, import 후에 @dataclass 라는 데코레이터를 사용하면 된다. 기존의 방식으로 클래스를 사용하는 것과 비교했을 때, dataclass가 가지는 몇 가지 장점들이 있다. 이번 포스트에서는 dataclass의 사용법과 편리한 점들을 정리해보겠다. dataclass 사용법 - 아이스크림 정보를 담는 클래스를 예시로 기존의 클래스와 데이터클래스를 비교해보자. 그냥 클래스를 사용해서 아이스크림을 만들 때: import random import string def generate_id() -> str: return "".join(random.choices(string.ascii_upperc..

파이썬 2022.06.06

파이썬 Global Interpreter Lock (GIL) - 1

GIL - GIL의 필요성 GIL의 필요성을 이해하려면 우선 스레드에 대해서 이해하고 있어야합니다. 스레드가 가지고 있는 어떤 특성 때문에 어떤 현상이 발생하고, 이 현상을 방지하기 위해 GIL이 도입되었기 때문입니다. 간단한 비유를 들어서 설명해보겠습니다. 위의 상황처럼 열 명의 사람들이 눈치게임을 하고 있습니다. 눈치게임은 말 그대로 눈치를 보다가 동시에 같은 숫자를 외치는 사람이 있으면 그 둘이 걸리는 게임이죠. 원래 눈치게임은 게임을 끝내야 하니까 끝까지 동시에 번호를 외치는 사람이 없으면 번호를 안 외친 마지막 사람이 걸리는데 이런 룰이 없이, 10명이 아무도 겹치지 않고 끝까지 번호를 각각 외치면 되는 게임이라고 생각해봅시다! 이 게임이 무리없이 잘 돌아갈까요? 번호를 외칠 순서도 정해져있지 ..

파이썬 2022.05.01

파이썬) 스택으로 큐 구현하기 (Queue with stack)

스택 두 개로 큐를 구현해보자. 그 뭐더라.. 구현하다보니 그 게임이 생각난다. 버터링같은 거 요리조리 옮기는 거.. 그거 어렸을 때 중독돼서 진짜 빨리했었는데 ㅋㅋ class Queue: def __init__(self) -> None: # enqueue 할 때 쓸 스택 self.enqueue_stack = [] # dequeue 할 때 쓸 스택 self.dequeue_stack = [] def enqueue(self, data): # queue에 아이템 넣기 O(1) self.enqueue_stack.append(data) def dequeue(self): # 두 stack 모두 아이템이 하나도 없을 경우 raise Exception 하기 if len(self.enqueue_stack) == 0 an..

자료구조 2022.04.12