본문 바로가기
관리자

Programming-[Backend]

(393)
[TIL] PyPy, CPython과 session close(), reference counting CPython 상용 Python은 CPython이다. CPython은 Garbage Collector(GC)를 통해 Reference Counting 방식으로 참조되지 않는 객체는 메모리에서 제거한다. 따라서 requests.session을 따로 close() 해주지 않아도 알아서 없어진다. 참고로 Reference counting 방식은 어떤 객체의 참조 수가 0이 되면 커널에서 해당 객체에 대한 메모리를 해제할 수 있도록 이벤트 큐에 넣어서 전달하고, 이를 OS가 해지하는 방식으로 작동한다. PyPy PyPy는 개별로 설치가 필요하다. 기존 Python이 interperter 방식이라 속도가 떨어지는 점을 보완하기 위해서 JIT(Just In Time) Compiliing 방식을 적용한 Python이..
[TIL] 파이썬 Retry 방식 요약 backoff_factor, status_forcelist 파이썬의 requests.Retry 스펙은 대략 이렇다. retry = Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist) 서버간 또는 서버 - 클라이언트간 통신에서 서버에 요청을 보냈는데, 500대 에러가 떨어지면서 정상적인 응답을 하지 못하는 경우 Retry를 적용한다. 보통은 서버가 잠시 네트워크 지연이 있거나, 너무 과도한 로드가 걸려있는 경우에 시행한다. Http Status Code = 500, 502, 503, 504 정도에 대해 시행한다. [TIL][link] HTTP 상태 코드별 내용 정리 total은 총 요청 횟수이다. 2 = ..
[TIL][link] HTTP 상태 코드별 내용 정리 출처 : https://hongong.hanbit.co.kr/http-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9C-%ED%91%9C-1xx-5xx-%EC%A0%84%EC%B2%B4-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC/ 상태 코드 상태 텍스트 한국어 뜻 서버 측면에서의 의미 1XX Informational 정보 제공 클라이언트의 요청을 받았으며 작업을 계속 진행하고 있다. 1xx 계열의 응답은 HTTP/1.1 클라이언트에게만 보낼 수 있으며 응답은 바디 없이 상태 라인, 헤더(생략 가능), 빈 줄로 종료됩니다. 100 Continue 계속 계속 진행하라. 클라이언트는 요청 헤더에 ‘Expect: 100-continue’를 보내고 서버는 이를 처리할 수..
[TIL] prviate, public 메서드 테스트 기준, Exception 테스트 기준 정석인 내용은 아니며, 회사 시니어분들께 배운 내용 기록 1. private, public 테스트 기준 public은 테스트, private은 테스트하지 않는 것을 기본으로 한다. private 일지라도 매우 중요한 로직이고, 테스트가 필요할 것 같다면 public method로 wrapping하여 테스트한다. 테스트 커버리지는 60~80 사이로 한다. 이 사이에서 적절한 커버리지를 찾되, 각 팀원에게 커버리지 정도를 강요하긴 어렵다. 2. Exception 테스트 기준 exception의 결과가 예상 가능하고 정상적인 상황일 때는 테스트한다. 예외적인 케이스에 대해서까지 테스트하는 것은 보통의 프레임워크가 처리해주는 범위를 건드리는 것이고 과한 커버리지 일 수 있다.
[TIL] DB pagination offset 문제, covering index 문제점 pagination을 하기 위해서 보통 아래와 같은 형식의 쿼리문을 사용한다. select ... from ... where ... limit ... offset limit은 가져올 데이터의 총 개수를, offset은 데이터를 조회할 시작점을 의미한다. 여기서 문제는, 데이터 개수가 많아지면(offset 100만건 이상?) offset 위치를 찾는 것을 마치 연결 리스트처럼 처음부터 쭉 이어나가다가 DB에 부하가 크게 걸릴 수 있다. 해결방법 where절에 조건을 건다. 특정값 이상의 id를 갖는 row만 조회한다던가, 날짜-연도 등을 기준으로 특정일 이후부터만 조회하도록하여 데이터의 개수 자체를 줄여서offset에 드는 부하를 줄여준다. covering index를 갖는 subquery를 실행하..
[TIL] Deepcopy, dict 순서 유지 1. Deepcopy: dict 어떤 원본 값을 변형하지 않고 다음 로직에서 사용하기 위해서는 deepcopy를 사용하여 참조되는 값의 변경이 일어나지 않도록 해줘야한다. some_value = _get_some_value( ... ) # some_value = {"a": 1, "b": 2} another_result = _get_another_result(some_value=some_value) def _get_another_result(some_value): result = some_value result["a"] = 3 return result 위 코드처럼 간단한 경우에는 한눈에 _get_another_result를 실행하면서 some_value 값도 변경된다는 것을 인지할 수 있으나 코드가 복잡해..
[TIL] insert시 ForeignKey에 제한 걸기: DB Trigger 사용 Django - python - postgresql을 이용하여 작업을 진행하던 중, 발생했던 문제점을 해결한 기록이다. 문제상황 아래처럼 새로운 테이블(모델)을 생성하고자 했다. class IWantNewModel: old_model = ForeignKey( "models.OldModel", on_delete=CASCADE, ... ) 이 때, FK가 되는 old_model의 타입을 특정 타입이 되도록 제한하고 싶었다. DB 자체에서 제한을 걸면 나중에 서비스단 로직에서 굳이 validation을 복잡하게 할 필요가 없기 때문이다. 한층 더 추상화되는 점은 있다만, 그래도 편리할 수 있다. Django에서는 이런 경우(FK가 아닌 경우에는) CheckConstraint 조건을 주어서 DB에서 제한을 걸도..
[TIL] python csv writer StringIO, BytesIO for AWS boto3 문제상황 AWS boto3가 BytesIO로 저장 양식이 정해졌을 때를 상정해서, python의 csv를 import하여 csv 파일을 만들 때 BytesIO를 이용하여 바로 csv.writer를 생성하면 byte 데이터를 넣어줘도 에러가 난다. data = ["a", "b"] writer = csv.writer(io.BytesIO()) b_data = [str(ch).encode() for ch in data] writer.writerow(b_data) 원인 AWS boto3는 BytesIO로 입력을 받는데 csv는 writer로 StringIO만 받기 때문이다. 해결책 converting 과정을 추가한다. data = ["a", "b"] str_buffer = io.StringIO() writer =..