본문 바로가기

Coding345

Java Spring Boot 전역 예외처리하는 방법 개요 기본적으로 웹 어플리케이션 개발을 시작하는 시점에 미리 해두어야 할 선행 작업으로 생각하는 포인트가 몇가지 존재하는데, 그 중 하나가 바로 전역 예외처리이다. 예외이지만 예외가 아닌 것으로 간주해야할 것들, 예를 들어서 유저가 존재하는지 확인하는 코드에서 존재하지 않는다면 UserNotFoundException 예외를 던지는 행위와 같은 것들이다. 코드상에서는 예외로 처리하지만 서버에서 예외로 간주하기보다 정해진 Response 규격에 맞게 클라이언트로 돌려주는 형태로 처리한다. 또한 해당 예외는 Sentry(파이썬의 경우)등과 같은 에러 트래킹 툴에 보고되지말아야 하므로 관련된 처리 또한 해주는게 일반적이다. 물론 우리가 정의한 커스텀 예외를 제외하고는 당연히 에러 트래킹에 잡혀야한다. 최상위 C.. 2021. 9. 29.
ElasticSearch Ngram 활용하여 검색하는 방법 개요 많은 케이스가 있겠지만 보통 검색 용도로 ElasticSearch를 사용하는 것으로 알고 있다. MySQL의 경우 LIKE쿼리를 사용하여 검색을 할 수 있는데, %파이썬% 과 같이 앞뒤로 %를 사용하여 검색하는 경우 인덱스를 태우지 못하고 Full scan을 해버린다. 데이터베이스는 데이터베이스일 뿐 검색용도가 아니기에 애초에 적합하지 않다. 그렇다면 엘라스틱 서치를 사용하여 단순히 검색 쿼리를 날리면 바로 해결이 가능할까? 보통 DB를 접하다가 ES를 처음 접하는 사람들은 LIKE쿼리와 같이 Wildcard를 줘서 검색하는 방법을 찾곤 한다. (나또한 그랬다) 아무리 엘라스틱 서치가 검색 용도에 적합하다고는 하지만, 데이터베이스와 마찬가지로 와일드 카드를 통해 검색을 진행하면 속도 저하가 발생할 .. 2021. 8. 11.
FastAPI SQLAlchemy 연동하며 발생한 문제 정리 개요 기존과 다른 패러다임을 가진 비동기 프레임워크 FastAPI와 SQLAlchemy를 연동하는 과정에서 발생했던 문제들과 어떠한 형태로 해결했는지에 대해 다뤄본다. 사전 지식 SQLAlchemy는 scoped_session() 함수를 활용하여 Thread-local한 세션을 생성할 수 있다. 이 때 scopefunc 라는 인자에 특정한 함수를 콜백 형태로 넣어주게 된다면 세션 사용 시 아래와 같은 로직을 통해 세션을 관리하게 된다. session.registry.registry에 키/밸류 쌍의 딕셔너리를 생성한다. scopefunc에 넣어준 함수를 통해 키를 결정하고(가져오고) 해당 값을 통해 session.registry.registry에 접근하여 사용할 세션을 가져와서 사용한다. 추후 sessio.. 2021. 5. 24.
FastAPI SQLAlchemy Session 객체 연동하기 개요 동기적으로 돌아가는 서버의 경우 Thread-local을 적용하면 각 Request별로 다른 Context를 가지도록 할 수 있다. 하지만 asyncio를 통해 이벤트 루프를 사용하는 비동기 서버의 경우(FastAPI, Sanic...) Thread-local로는 이러한 문제를 해결할 수 없다. 따라서 Python 3.7 버전부터 제공되는 ContextVar를 사용해야하는데 이에 대해 간략하게 기술한다. 참고로 예제 서버는 FastAPI이다. 발생할 수 있는 문제 그렇다면 어떠한 문제가 발생할 수 있을까? 일반적으로 파이썬의 코루틴은 싱글 스레드로 동작하기때문에 하나의 스레드에서 여러가지의 일을 Concurrency하게 번갈아가며 수행한다. 그렇기에 SQLAlchemy의 세션 객체 또한 공유하면서 .. 2021. 2. 15.
Stripe 결제 시스템 도입하기 1. 개요 기존 해외결제의 경우 아임포트를 통해 페이팔 결제 시스템을 사용하고 있었다. 사용상의 불편함은 없었지만 데이터 분석 결과 나름 치명적인 문제가 하나 발견되었는데, 바로 결제용 팝업 창이 새롭게 뜨는 문제였다. 이게 왜 문제가 되는 걸까? 데이터 분석팀을 통해 유저 행동을 분석해보니 결제창이 뜬 이후 이탈하는 빈도가 굉장히 높은 모습을 찾을 수 있었고, 이 또한 가설이지만 모달/팝업 없이 같은 페이지에서 카드 번호등을 입력하여 결제하는 방식을 제공한다면 보다 높은 결제를 유도할 수 있을 것이라 판단했다. 따라서 결제를 위한 모달 창이나 팝업이 뜨는것이 아닌 임베디드 형태로 페이지내부에 삽입할 수 있는 방법을 찾아보기 시작하였다. 그러다 찾아낸 서비스가 바로 Stripe이다. 이미 해외에서는 유명.. 2020. 12. 10.
Kollus 서비스를 통해 동영상 플랫폼 제작하기 1. 개요 사용자에게 영상을 제공하는 기능이 요구사항으로 등장하였다. 처음으로 살펴본 서비스는 AWS에서 제공하는 미디어 서비스였다. 타 플랫폼을 이용하게되면 해당 플랫폼에서 만든 규칙을 따라야하기 때문에 여러가지 제약사항이 발생할 수 있기에 AWS 서비스를 살펴봤었는데, 몇가지 사항들때문에 직접 구현하지 않기로 결정했다. 첫 번째로, 개발 기간이 늘어난다. 위 요구사항은 언제든지 변할 가능성이 충분한 요구사항이었고 영상을 제공하는 기능 자체는 매니지드 서비스의 장점으로 인해 손쉽게 구현이 가능하겠지만, 한번도 사용해보지 못한 서비스이기 때문에 개발 기간을 정확하게 산정하기가 어려웠다. 두 번째로, 녹화 방지 등 DRM기능이 필요했다. 하지만 그러한 기능까지 서칭하고 구현하기에는 시간적, 비용적인 무리가.. 2020. 12. 9.