EHX.dev

Written by@EHX
Software Developer, Back-End Engineer

GitHubFacebook

[Python] DRF 대용량 CSV 데이터 안전하게 만들기

Django에서 만들어져있는 CSV 파일을 스트리밍으로 내려주는 방법은 FileResponse 또는 StreamingHttpResponse 클래스를 쓰면 간단하게 구현이 가능하다. 하지만 현시점의 데이터를 여러 조건으로 필터링하여 CSV 파일을 만들어서 내려주는 경우 CPU 100% + OOM이 발생하여 서버가 아무 일도 할 수 없게되는 현상이 발생할 수…

[NGINX] NGINX에서 AWS private S3로 리버스 프록시 설정하기

서버 환경: ubuntu 18.04 모듈 설치 필요한 모듈들 설치하기 NGINX recompile 몇몇 빌드 옵션들은 필요없을 수도 있는데 처음에 몇 개 빼고 필요할거 같은것만 넣어서했더니 중간중간 오류 나서 어디서 잘 빌드해주는 커맨드 복붙하고 필요한 것들 추가로 넣음 AWS signature 설정 라이브러리 추가 AWS private resource에…

[Python] Django 테스트 빨리 끝내기

Hasher 변경 테스트 환경에서 사용할 Hasher class를 변경한다. Pycharm 같은 IDE에서 프로파일링 해보면서 알게되었는데 가장 많은 시간을 잡아먹는 함수가 hash 함수였다. 별도의 Hasher class를 정의하여 적용해보았지만 별다른 성능 차이가 없어서 이미 정의되어있는 클래스를 사용하였다. algorithm attribute, en…

[Python] Django model instance 변수를 리스트에 담을 때 주의할 점

데이터베이스에 신규 데이터를 넣어주기 위해서 엑셀 파일을 읽어 데이터베이스에 넣어주는 작업 중에 마주한 문제인데, 메모리및 IO 작업을 최소화하기 위해 chunk size 만큼 리스트에 Django model instance 변수를 담고 를 수행했다. 당연히 chunk size에 도달하여 리스트를 초기화해주면 메모리가 해제될 거 같지만 그렇지 않았고, 메…

[Python] str.split vs str.split(maxsplit) vs str.partition

파이썬에서 문자열을 특정 구분자로 자를 수 있게 해주는 builtin 함수로 , , , 이 있다. 그리고 함수에는 최대 몇번 자를 지 지정해줄 수 있는 파라미터가 있는데, 어떤 상황에서 사용하면 좋을 지 알아보자! str.split 가장 많이 사용되는 이다. 구분자로 전체 문자열을 잘라서 배열로 저장한다. 여기서 를 적용하면 한 번만 자르고 그 뒤에는 …

[Python] list.insert vs slice assignment vs list concat(+)

파이썬에는 리스트의 첫번째 요소를 추가하는 방법들이 되게 많다(😢), 흔히 사용되는 도 방법 중에 하나이지만 리스트의 시작과 끝에 요소를 추가하는 경우에는 많은 비용이 발생하여 권장되는 방법은 아니다. 는 왜 권장되지 않는가(매우 느리다.) https://wiki.python.org/moin/TimeComplexity …inserting or deleti…

[GraphQL] 특징 그리고 장점과 단점

GraphQL에 대해서 어느정도 알고있지만 정리가 필요할 것 같아 잘 정리된 영문으로된 글을 읽으면서 간단하게 정리해보려고 합니다. (읽으면서 알게된 내용을 적어서 순서가 뒤죽박죽입니다 😅) GraphQL? 최근에도 많이 사용되는 REST(Representational State Transfer) API design은 클라이언트에게 CRUD API를 제공…

[Python] 타임아웃 적용하기

개발을 하다보면 함수에 타임아웃을 적용해서 일정 시간이 지나면 함수를 종료시켜야 하는 경우가 있다. 가끔 있는 일이지만 막상 필요할 때 생각이 잘 안 나서 정리해두었다. Context manager로 사용하는 방법 Decorator로 사용하는 방법 비슷한 방법으로 를 이용한 방법도 있는데 을 이용한 방법이 더 깔끔해 보인다. 참고 https://stack…

[Git] git client에 python 가상 환경을 이용한 pre commit hook 적용하기

파이썬 개발조직에 입사하게 되었다. git hook을 사용해보지 않았었는데 이곳에서는 CI를 위해서 git hook을 사용하여 커밋명에 prefix를 달고, 커밋 메세지, 파일명 린트 등의 벨리데이션 검사를 진행한다. 검사를 진행하는 스크립트가 파이썬으로 작성되어 있었는데, git client를 사용하면 파이썬 가상 환경 밖에 린트 라이브러리를 설치했어야…

[Python] Flask에 circuit breaker pattern 적용해보기

최근 웹 서비스는 내부적으로 외부 API를 호출하는 일이 빈번하다. 웹 페이지에 표현해야 할 데이터를 외부에서 불러와야 하는 경우가 많아지기도 했고, MSA (Microservices Architecture) 애플리케이션은 서비스들끼리 네트워크 통신을 하기 때문인데, 이러한 변화가 불러오는 문제가 있다. 외부 API에서 장애가 발생하면 API를 호출하는 …