분류 전체보기
[Django]TIME_ZONE, USE_TZ 설정 (feat. 글로벌 서비스)
오롯이 한국에서만 서비스를 한다면 타임존 설정(DB포함)은 전부 Asia/Seoul 로 통일하면 됩니다. 하지만, 글로벌 서비스를 염두하고 있거나, 추후에 글로벌 진출을 고려한다면 타임존 문제는 사전에 해결하고 가는 것이 좋습니다. 이미 정해버린 타임존을 되돌리는 것은 생각보다 많이 어렵습니다. 글로벌 서비스를 하고있는 프로덕트를 개발하다가 타임존에 대해서 항상 헷갈리는 부분이 있어 공부하는 차원에서 포스팅하게 되었습니다. 대부분의 내용은 장고의 공식 문서를 참고하였습니다. https://docs.djangoproject.com/en/3.2/topics/i18n/timezones/ Django The web framework for perfectionists with deadlines. docs.djan..
[Python]staticmethod vs classmethod (feat. 언제 사용할까?)
최근에 개발을 하다가 파이썬의 정적 메소드와 클래스 메소드를 언제 사용해야 하는지에 대한 기준이 궁금해졌습니다. 단순하게 눈에 보이는 차이로는 self 와 cls의 차이였는데요. 이 둘을 주로 어떤 상황에서, 어떤 용도로 나누어 사용하는지 알아보려고 합니다. 이와 관련한 유명 아티클이 있어 해당 글의 일부를 차용하였고, 개인적으로 이해한 것을 바탕으로 정리했습니다. https://julien.danjou.info/guide-python-static-class-abstract-methods/ The definitive guide on how to use static, class or abstract methods in Python Doing code reviews is a great way to disco..
[Python]partial 란? (feat. functools)
partial() 란? positional parameter인 args와 keyword parameter인 keywords로 호출된 함수처럼 동작하는 새 partial 객체를 반환하는 역할을 합니다. 쉽게 말하자면 함수 인자의 값이 미리 채워진 상태로 동작하는 함수(partial 객체)가 반환되는 것입니다. partial 파이썬 공식 Document functools — 고차 함수와 콜러블 객체에 대한 연산 — Python 3.10.8 문서 functools — 고차 함수와 콜러블 객체에 대한 연산 소스 코드: Lib/functools.py functools 모듈은 고차 함수를 위한 것입니다: 다른 함수에 작용하거나 다른 함수를 반환하는 함수. 일반적으로, 모든 콜러 docs.python.org 언제 사..
오픈소스 기여하기 회고 3
이번 포스팅을 마지막으로 오픈소스 기여하기 시리즈는 끝입니다. 마지막인만큼 오픈소스 컨트리뷰터로서 활동하는 것에 대한 느낀점을 쭈욱 나열하는 형식으로 적어보려고 합니다. 오픈소스를 왜 시작했어요 ? "유명한 오픈소스에 내 코드를 남겨보자" 시작하자고 마음을 먹은 이유자체는 정말 순수했습니다. 물론 앞선 포스팅에서 다양한 이유들도 적어두긴 했습니다만, 위와 같은 이유가 제일 컸습니다. 자랑하거나 유명해지고 싶었다고 할까요? 쉽지 않은 길이라는 것을 미리 알고는 있었지만, 때로는 이런 무모하고 단순한 이유들이 가장 큰 원동력이 되기도 합니다. 어렵거나 큰일을 이루어 내기 위해서는 해내야하는 수많은 일들이 있는데 이런 순수한 감정들은 정말 큰 도움이 됩니다. 패치할만한 버그를 찾는 과정은 고달프다 오픈소스를 ..
오픈소스 기여하기 회고 2 (feat. Regression Test)
안녕하세요, 이번 포스팅에서는 코드 관점에서 Django 버그 패치 과정을 다뤄보려고 합니다. 문제를 접근하는 방식, 해결 과정, 느낀점 등의 내용이 담겨 있습니다. 버그 재현하기 (Reproduce bug) 우선 해당 이슈를 패치하기로 결정했다면 가장 먼저 해야할 일은 버그를 재현하는 것입니다. 대부분의 이슈들은 자세한 설명과 재현 방법이 나와있어 그대로 따라하면 됩니다. 만약 그렇지 않다면 이슈 리포터에게 조금 더 상세한 내용이나 샘플 코드를 부탁하면 됩니다. 제가 할당했던 티켓의 경우에는 명확한 재현 방법, version등이 나와 있어 재현에 어려움을 겪지는 않았습니다. https://code.djangoproject.com/ticket/34052 #34052 (migrate --check stil..
오픈소스 기여하기 회고 1 (feat. Django Contributor)
안녕하세요, 오랜만에 블로그 포스팅으로 찾아왔습니다. 회사에서도 바쁜 시간을 보냈고 여러 오픈소스에 관심을 가지면서 시간을 보냈던 것 같습니다. 오늘은 틈나는대로 관심을 가지고 있던 오픈소스 생태계에서 Django Contributor가 된 경험을 공유하려고 합니다. 바로 시작하겠습니다! 오픈소스 Contributor 되기로 마음 먹기 시작하기 전 오픈소스와 관련된 여러 글들을 읽어 보았는데 공통적으로 하는 말이 꽤나 고되며, 시간이 많이 소요된다라는 말들을 종종 볼 수 있었습니다. 하지만 그럼에도 불구하고 장점이 더 많았고 무엇보다 너무 해보고 싶었던 일이었기에 올해 안에는 오픈소스에 기여를 무조건 해보자 라는 마음가짐으로 시작했습니다. 제가 오픈소스를 시작하면서 기대했던 효과는 다음과 같습니다. 각국..
[Python]파이썬 정렬 알고리즘, Timsort
파이썬은 sort(), sorted() 메서드를 통해 정말 간편하게 정렬된 값을 얻을 수 있습니다. 사용하는 방법도 매우 쉽기에 내부 동작 원리에 대해서는 깊게 생각해본 적이 없었습니다. 이번 포스팅에서는 파이썬이 어떤 정렬 알고리즘을 사용하는지 알아보도록 하겠습니다. Timsort 파이썬은 Tim sort라는 정렬 알고리즘 표준으로 채택되어 사용 중입니다. Timsort는 삽입정렬과 병합정렬을 합친 알고리즘입니다. 2001년도에 고안되었으며, 창시자인 Tim Peters의 이름을 따왔습니다. 또한, 이 알고리즘은 파이썬 뿐만 아니라 Java SE7, Android, 구글 크롬 엔진등 다양한 곳에서 채택되어 사용중입니다. Timsort 특징 현실 세계의 데이터들은 완전 무작위가 아니라 어느정도는 정렬이..
[Python]네임스페이스란(Namespace) ?
지난번 Zen of Python에 잠깐 언급된 파이썬의 네임스페이스에 대해 알아보는 포스팅을 써보려고 합니다. 지난 포스팅 -> Zen of Python https://leffept.tistory.com/396 [Python]The Zen of Python - 파이써닉한 코드 파이썬에서의 디자인 원칙을 잘 나타내는 The Zen of Python이라는 것이 존재한다. 여기에 존재하는 원칙들을 바탕으로 자신이 작성한 코드가 파이써닉한 코드인지 아닌지에 대해서도 생각해볼 수 leffept.tistory.com 네임스페이스란 ? 네임스페이스란 특정한 객체를 이름에 따라 구분할 수 있는 범위를 말합니다. 파이썬 내부의 모든 것들은 전부 객체로 구성되어 있고, 이들은 특정 이름들과의 매핑 관계를 가지고 있습니다...
[Django]SetUpTestData의 격리 지원 (feat. Django > 3.2)
지난번 Side effect를 방지하는 테스트 코드 작성법에서 언급했던 내용이 Django 3.2 버전 업그레이드를 통해 변경된 것이 있어 포스팅을 추가적으로 작성하게 되었습니다. 지난 포스팅 https://leffept.tistory.com/415 [Django]Side effect 를 방지하는 테스트 코드 작성법 Side effect 를 방지하는 테스트 코드 작성 테스트 코드 작성의 중요성을 깨닫고 난 후부터 신경을 써서 테스트를 작성하고 있습니다. 오늘은 Django로 테스트를 작성하면서 Side effect가 발생했던 경 leffept.tistory.com SetUpTestData 의 격리 지원 기존에는 SetUpTestData에 선언한 클래스 프로퍼티의 경우 테스트 메소드간의 격리를 지원하지 않..
[Django]get_or_create() 란?
이번 포스팅에서는 Django QuerySet API 중 하나인 get_or_create에 대해서 알아보겠습니다. get_or_create() 란? get_or_create는 모델 객체를 생성할 때 이미 있는 객체라면 가져오고 없으면 생성하는 QuerySet API 중 하나입니다. 간단하게 사용법을 알아보겠습니다. 기본 사용법 class Leffe(models.Model): name = models.CharField(max_length=30) ... obj, created = Leffe.objects.get_or_create(name='leffe') 위 코드는 leffe 라는 이름을 가진 객체가 있다면 가져오고 없다면 객체를 생성하여 줍니다. 또한, created 라는 값을 통해 객체의 생성 여부도 파악..