본문 바로가기

Coding345

Python Generic Type 개요 스프링에서는 Spring Data JPA라는 것이 존재한다. 해당 라이브러리는 인터페이스를 생성 후 특정 인터페이스를 상속받으면 자동으로 메소드가 생성되는 역할을 한다. 예를 들어 findById(), findByEmail(), save(), delete() 등 여러가지 CRUD관련 메소드가 자동으로 생성된다. 실무에서 파이썬을 통해 서버를 개발하며 Layered architecture를 도입해서 사용하고 있는데, 특정 레포지토리를 생성할 때 마다 동일한 역할을 하는 메소드를 만드는게 귀찮았다. 그래서 스프링의 Data JPA와 같은 것을 만들어볼 순 없을까 생각했고 우연찮게 FastAPI 를 만든 개발자의 깃헙에서 비슷한 코드를 발견하였다. (https://github.com/tiangolo/fu.. 2022. 7. 7.
Python Metaclass 사용해보기 개요 파이썬에는 메타 클래스(Metaclass)라는 것이 존재한다. 메타 프로그래밍(Meta prgramming)이라고도 불리는데 이를 이용하면 특이한 행위를 수행하는 클래스를 만들 수 있다. 기본적으로 파이썬에서 메타 클래스란 클래스를 만드는 클래스를 의미하고 이를 구현하는 방법은 아래와 같이 두 가지가 존재한다. - type을 사용하여 동적으로 클래스를 생성하는 방식 - type을 상속받은 후 메타 클래스를 구현하는 방식 대부분의 경우에서 메타 클래스가 필요한 경우는 없다고 볼 수 있다. 인터넷을 찾아보면 Django ORM 등을 구현할 때 사용하는 방법이라는 예제도 나와있는데 실제로 나도 실무에서 메타 클래스를 사용한 경험은 거의 없었다. 구글 등 파이썬 메타 클래스에 대해 검색하면 수많은 자료들이.. 2022. 7. 6.
Redlock 알고리즘 개요 이전에도 동시성 관련된 글을 몇개 포스팅한적이 있다. 실무에서도 redlock알고리즘의 구현체인 aioredlock을 활용하여 동시성 제어를 진행하고 있는데, redlock 알고리즘에 대해 조금 더 자세히 살펴봐야할 것 같아서 Redis 공식 문서를 찾아봤고 나에게 필요한 부분만 추려서 번역을 진행했다. 본문은 https://redis.io/docs/reference/patterns/distributed-locks/ 에서 확인할 수 있다. Safety and Liveness Guarantees Safety property: 상호배제. 어떤 순간에도 하나의 클라이언트만 락을 획득할 수 있어야 한다. Liveness property A: 데드락이 발생하지 않는 것. 락을 획득한 클라이언트에 문제가 생겨.. 2022. 7. 2.
FastAPI에서 SQLAlchemy Session 다루는 방법 개요 FastAPI는 비동기 프레임워크이다. 내부적으로는 Starlette를 Wrapping한 프레임워크인데 일반적인 동기 프레임워크인 Flask, Django등과는 다른 패러다임을 가지고 있다. 그에 따라 프로덕션 레벨에서 서비스를 운영하며 많은 트러블슈팅이 있었고 그 중 데이터베이스와 통신을 위해 사용하는 SQLAlchemy 라이브러리 또한 큰 이슈가 발생했었다. 기존에는 SQLAlchemy 1.3버전을 사용하고 있었기 때문에 비동기를 지원하지 않았지만 1.4버전부터 AsyncSession을 통한 비동기를 지원하기 시작했고 현재 사내 코드를 마이그레이션 하기위해 개인적인 테스트를 진행하고 있다. 본 포스팅에서는 비동기 프레임워크에 SQLAlchemy를 올바르게 사용하기 위한 트러블 슈팅을 포함하여 최.. 2022. 3. 23.
SQLAlchemy AsyncSession으로 비동기 적용하기 개요 현재 서버 프레임워크로 FastAPI를 사용하고 있었고 SQLAlchemy는 1.3대 버전을 사용중이었다. 따라서 DB쪽은 여전히 동기형태로 작업이 진행되기 때문에 비동기 프레임워크의 장점을 제대로 살리지 못했다. 물론 database, peewee등 비동기 ORM이 존재하지만 팀 내 구성원간의 러닝커브등을 고려하여 기존에 사용하던 SQLAlchemy를 그대로 사용중이었다. 하지만 SQLAlchemy 1.4버전부터 비동기 처리를 지원하기 시작했고 그에 따라 마이그레이션을 준비하며 테스트하는 과정을 간단하게 담아본다. create_async_engine from sqlalchemy.ext.asyncio import create_async_engine engine = create_async_engine.. 2022. 3. 18.
Spring Hibernate EventListener로 엔티티 변경 감지하는 방법 개요 현재 토이 프로젝트에 간단하게 CQRS 아키텍처를 도입해보고 있다. 따라서 쓰기DB, 읽기DB 총 2개의 데이터베이스가 존재하고 쓰기 요청이 오는 경우 쓰기DB에 데이터를 기록함과 동시에 SQS에 이벤트를 발송하고 있다. 그리고 읽기DB에서는 해당 SQS를 컨슈밍하고 있다가 변경 이벤트가 들어오면 내부적으로 동기화를 진행하는 형태이다. 위 요구사항에 따라 엔티티에 변경사항이 생긴다면 감지한 후 이벤트를 발생해줘야하기 때문에 관련 이벤트 리스너를 찾아봤는데, Hibernate의 EventListener를 활용하면 손쉽게 가능하다는것을 알게 되었다. JPA에서 이벤트 리스너를 제공해주지만 Hibernate의 기능을 사용해야 좀 더 세분화하여 활용할 수 있다고 하여 사용하게 됐다. (참고: https:/.. 2022. 1. 21.