언어
-
[Python] requests 모듈 retry 추가하기언어/파이썬 & 장고 2022. 4. 24. 22:57
requests 모듈은 https://brownbears.tistory.com/198 와 같이 간단하게 사용할 순 있지만 retry 옵션은 존재하지 않습니다. 아래는 반복문, try-except문으로 retry 기능을 추가하는 것이 아닌 requests 모듈에서 제공하는 기능으로 retry와 알아두면 유용한 기능을 설명합니다. Session와 HTTPAdapter 클래스를 사용하여 retry 간단하게 구현하기 구현에 앞서 흔히 사용하는 requests 구조를 먼저 파악해 봅니다. requests 모듈은 보통 아래와 같이 사용합니다. import request requests.get('http://www.naver.com') # 또는 requests.request('get', 'http://www.nave..
-
[Python] pre-commit, black, flake8 적용하기언어/파이썬 & 장고 2022. 2. 6. 15:36
git hook을 사용하여 커밋하기 전에 code style chek, formmatter, test 등등과 같은 사용자가 원하는 동작을 처리할 수 있습니다. 사용자가 추가한 단계에서 실패가 되면 커밋은 이뤄지지 않기 때문에 프로젝트의 품질을 올릴 수 있는 좋은 도구입니다. 여기서는 pre-commit을 사용하여 flake8로 코드 스타일을 체크하고 black으로 자동으로 코드 포매팅을 하도록 설정하도록 합니다. 아래는 변경된 파일부터 pre-commit, commit 의 과정을 설명하는 예시입니다. pre-commit 설치 $ pip install pre-commit # 또는 $ brew install pre-commit $ pre-commit --v pre-commit 2.17.0 설정 pre-com..
-
[Python] 데코레이터 만들기언어/파이썬 & 장고 2021. 8. 8. 19:33
파이썬에서 데코레이터란 @staticmethod와 같은 형태로 클래스나 함수 위에 선언하여 사용하는 것을 말합니다. 데코레이터는 기존 함수 내부의 코드를 수정하지 않고 시작과 끝에 추가 기능을 구현할 수 있습니다. class Test: @staticmethod def test(): pass 또한 데코레이터는 1개 이상 추가할 수도 있습니다. from abc import abstractmethod class Test: @staticmethod @abstractmethod def test(): pass 아래에서는 함수와 클래스로 데코레이터를 만드는 방법을 소개합니다. 함수로 데코레이터 만들기 함수로 데코레이터를 만드는 방법은 아래와 같습니다. def deco1(func): def wrapper(*args, ..
-
[Django] transaction언어/파이썬 & 장고 2021. 7. 24. 18:20
트랜잭션이란 트랜잭션은 DB의 데이터 삽입, 수정 및 삭제를 진행할 때 성공과 실패가 분명하고 상호 독립적이며 일관되게끔 처리하는 기능입니다. 트랜잭션에 대해선 https://brownbears.tistory.com/181 에서 자세하게 설명하고 있습니다. Django의 transaction 장고에서도 transaction을 제공해주고 있습니다. django.db.transaction 파일에 존재하며 사용은 아주 간단합니다. 사용법 설명에 앞서 장고는 auto commit을 기본값으로 제공하고 있습니다. 즉, 코드에 트랜잭션이라고 명시가 안되어 있으면 insert, update와 같은 문장을 바로 DB에 commit을 진행합니다. 장고에서 auto commit을 기본으로 사용하는 이유 만약 기본적으로 a..
-
[Python] typing언어/파이썬 & 장고 2021. 7. 18. 18:29
python은 동적 타입으로 하나의 변수에 여러 타입의 값을 할당할 수 있습니다. 이는 편하기도 하지만 예상치 못한 버그를 발생시킬 수 있는데 3.5부터 지원하는 typing을 사용하면 ide나 mypy와 같은 라이브러리에서 예상하지 않는 타입을 확인할 수 있습니다. (하지만 typing 모듈을 사용한다고 해서 자바와 같이 컴파일 에러는 발생하지 않습니다.) 3.6 버전 부터는 변수에도 typing을 적용할 수 있는데 아래에서 어떻게 사용하는지 설명합니다. 여기서는 파이썬 3.8 버전 기준으로 설명을 합니다. 파이썬 3.9에서는 문법이 약간 변경되었는데 이는 아래에서 간략하게 설명을 하겠습니다. typing 변수 # from typing number: int = 1 name: str = '가나다' 만약 ..
-
[Python] metaclass란언어/파이썬 & 장고 2021. 7. 17. 19:08
python에서는 클래스도 객체입니다. 그렇다면 클래스를 만드는 클래스가 있다는 얘기인데 이러한 역할을 하는 것이 metaclass(이하 메타클래스)입니다. 메타클래스를 사용하면 클래스를 만들 수 있게 됩니다. 보통의 상황에서는 잘 사용하진 않지만 Django의 Model 객체에서 사용하고 있는 것을 볼 수 있습니다. 우리는 모르게 메타 클래스를 사용하고 있었는데 필드가 무슨 타입인지 확인할 때 사용하는 type()이 바로 메타클래스입니다. 즉, type()에는 타입이 무엇인지 와 메타클래스로서 클래스를 생성하는 2가지의 역할을 합니다. temp = type('aaa') temp2 = type('temp', (), {}) temp3 = type(int) print(temp) print(temp2) pri..
-
[Python] psycopg2를 사용한 unnest insert와 execute_values 속도 비교언어/파이썬 & 장고 2021. 7. 10. 23:45
psycopg2 2.7 버전 이후부터 execute_values 함수가 추가되었습니다. https://www.psycopg.org/docs/extras.html#fast-execution-helpers 대량 insert를 하는 방법은 여러 방법이 있지만 copy문을 사용하지 않고 가장 빠른 방법은 https://brownbears.tistory.com/297 에서 설명한 것과 같이 unnest를 사용해 insert 하는 방법이 가장 빠릅니다. 그럼 여기서 추가된 execute_values 함수와 비교를 진행해 어떤 것이 가장 빠른지 비교를 해봅니다. 예시 테이블은 name::text, id::bigint 로 설정하였습니다. 100건 insert import psycopg2 import psycopg2.e..
-
[Python] 이분/이진 탐색 (Binary Search)언어/파이썬 & 장고 2021. 6. 13. 21:19
이분 탐색 또는 이진 탐색은 찾고자 하는 수를 두 부분으로 나눠서 찾는 기법입니다. 따라서 순차 탐색(linear search) 보단 더 빠른 성능을 보입니다. 이분 탐색을 하기 위해선 주어진 탐색 리스트가 이미 정렬이 되어 있다는 전제가 깔려야 합니다. 아래는 이진 탐색의 탐색 순서입니다. 탐색 리스트가 정렬이 되어 있지 않다면 정렬 left, right, mid를 잡아줌 (리스트 첫 번째는 left, 리스트 마지막은 right, 리스트의 중간 값은 mid 여기서 값보단 리스트의 인덱스로 잡는 것이 더 범용적으로 사용할 수 있음 mid 값과 찾고자 하는 값 비교 mid값이 더 크면 right 값을 mid -1, mid값이 더 작으면 left값을 mid + 1로 세팅 left > right가 될 때까지 ..
-
[Java] Comparator와 Comparable언어/Java 2021. 6. 13. 19:20
Comparator와 Comparable은 둘 다 객체를 정렬할 때 사용할 수 있는 기능입니다. 먼저 아래와 같이 객체가 존재한다고 가정합니다. public class Image { private final int type; private final String url; private final int idx; public Image(int type, String url, int idx) { this.type = type; this.url = url; this.idx = idx; } public int getIdx() { return idx; } } 다음 아래와 같이 리스트에 위 객체들을 입력합니다. List images = new ArrayList(); images.add(new Image(3, "/i..
-
[Python] 최단 경로 알고리즘 - 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm)언어/파이썬 & 장고 2021. 6. 6. 20:07
플로이드 워셜 알고리즘은 다익스트라 알고리즘과 같이 최단 경로를 구하는 알고리즘입니다. 차이점은 다익스트라 알고리즘의 경우, 특정 노드에서 이동할 수 있는 모든 노드에 대해 최소 거리(이 때, 거리(edge)는 양수여야 함)를 구하는 거고 플로이드-워셜 알고리즘은 모든 노드에서 도착할 수 있는 모든 노드의 최소 거리를 구하는 알고리즘입니다. 또한 거리(edge)가 양수 뿐만 아니라 음수여도 사용할 수 있습니다. (다익스트라 알고리즘 설명: https://brownbears.tistory.com/554) 즉, 다익스트라 알고리즘은 서울에서 시작해 인천, 목포, 강릉의 최소 거리를 구하는 것이고 플로이드 워셜 알고리즘은 서울-인천, 서울-목포, 서울-강릉, 인천-목포, 인천-강릉 과 같이 모든 쌍을 한번에 ..