FastAPI는 Swagger를 기본적으로 내장하여 제공하는데, JWT 인증 관련해서 Swagger에서 바로 사용해 볼 수 있도록 하는 Authorize 버튼을 활성화하는 방법에 대해 공유한다. JWT 토큰을 넣으면 인증이 완료되고, 유저 정보를 갖고 있도록 구현할 것이다. 기본적으로 JWT 관련 로직은 미리 구현되어있다고 가정하고 여기서는 따로 다루지 않는다. # HTTPBearer 구현 FastAPI는 보안을 위해 몇 가지 기본 클래스를 제공하는데, 이 중 OAuth2PasswordBearer라고 있는데 얘를 바로 사용하면 Swagger 모달창에 불필요한 인풋들도 추가되어서 여기서는 사용하지 않을 것이다. 우리는 FastAPI가 제공하는 HTTPBearer 클래스를 상속받아서 구현할 것이다. 이렇게 ..
pytorch아 tensorflow로 작성된 딥러닝 모델을 FastAPI로 서빙하는 방법에대해 공유한다. # 서론 딥러닝 개발자가 어느정도 서버 지식을 갖고 있어서 모델 서빙까지 해주면 더할나위 없이 좋지만, 그렇지 않은 경우 서버 개발자가 이를 수행해야한다. 필자는 보통 모델 서빙 서버와 비즈니스 서버를 분리하지 않고 하나의 FastAPI 프레임워크로 구성하는데, 프로젝트 규모가 크다면 모델 서빙용 서버를 따로 분리하는 것도 방법이다. # 딥러닝 개발자의 역할 필자는 Vision 관련 모델 (Shufflenet이나 resnet 등)만 연동해봐서, 이 기준으로 설명함을 미리 알린다. 1. 모델 학습시키기 딥러닝 개발자는 코랩이든 워크스테이션이든 일단 학습을 시킨다. 2. 모델 소스와 weight 파일 전..
다음 내용은 "가상 면접 사례로 배우는 대규모 시스템 설계 기초"에서 얻은 내용과 필자의 지식이 더해진 글입니다. https://m.yes24.com/Goods/Detail/102819435 가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 예스24 “페이스북의 뉴스 피드나 메신저, 유튜브, 구글 드라이브 같은 대규모 시스템은 어떻게 설계할까?”IT 경력자라도 느닷없이 대규모 시스템을 설계하려고 하면 막막하다고 느낄 수 있다. 특히나 m.yes24.com 서비스가 커지고, 사용자가 늘어남에도 서버는 고가용성과 장애내성, 장애극복, 높은 성능을 유지해야 한다. 서버 스펙을 스케일업 하는 것은 한계가 있고, 단일 장애 포인트(SPOF) 문제도 있기 때문에 결국은 다중화를 통한 분산 시스템을 구축해야 한다..
FastAPI 프레임워크로 이벤트 기반 아키텍처를 구축하는 방법에 대해 공유한다. # 이벤트 기반 아키텍처란? 새로운 댓글 작성 시, 게시물 작성자에게 알림을 보내야 하는 기능을 구현해야 한다고 가정해 보자. 이때 "댓글 작성 로직" 마지막에 "게시물 작성자에게 푸시 알림 전송 로직"이 포함될 것이다. 이러면 "댓글 작성"은 본연의 역할과는 다소 다른 도메인인, "푸시 알림 전송"이라는 로직을 포함하게 된다. (즉, 알림 도메인에 의존성이 생긴다.) 이를 이벤트 기반 아키텍처로 변경하면 결합도를 낮출 수 있다. 댓글 작성 -> 댓글 작성 완료 이벤트 발행 댓글 작성 완료 이벤트 핸들러에서 푸시 알림 전송 이러한 이벤트 기반 아키텍처는 로컬 이벤트(앱 서버 내부 이벤트)와 외부 이벤트 구조(카프카, 메시지..
데이터베이스의 조회 성능을 끌어올리기 위해서 가장 우선적으로 검토되는 것이 "인덱스"다. 칼럼에 인덱스를 설정하면 왜 조회 성능이 빨라지는지 비유적으로 이해해 보자. # 책의 목차 비유 1000장이 넘는 데이터베이스 책이 있다고 가정하자. 책의 구성은 트랜잭션, 인덱스, 샤딩, 파티셔닝 등 다양하다. 이때, 우리는 인덱스 관련 부분만 읽고 싶다. 이럴 때 우리는 목차를 찾아가서 인덱스 관련 부분이 몇 페이지에 존재하는지 확인 후 곧바로 해당 페이지로 이동한다. 목차를 보니, 320페이지부터 인덱스 관련 내용이 시작이다. 이를 바탕으로 처음부터가 아니라 320페이지부터만 훑어보면 된다. 만약 목차가 없다면 어떻게 할까? 처음부터 하나씩 페이지를 훑어보면서 인덱스 관련 주제가 나오는지 찾아봐야 할 것이다. ..
일반적으로 많은 양의 데이터를 조회할 때 (목록조회) 이를 한 번에 다 가져오지 않고 페이지로 쪼개서 가져온다. 이를 페이징(페이지네이션)이라고 하며 일반적으로 이런 형태로 보인다. # 일반 페이징 구현 일반적인 페이징은 SQL의 LIMIT, OFFSET 구문으로 구현된다. (MySQL 기준이긴 하지만, 다른 디비도 비슷하다) select * from board limit 10 offset 10; LIMIT은 한 번에 가져올 양, OFFSET은 page * size로 동적으로 계산된다. 예를 들어, 3번째 페이지의 내용물을 가져오고 싶으면 limit 10 offset 3 * 10 이 된다. 추가적으로 프론트에게 몇 개의 총 데이터 수와, 페이지가 존재하는지 알려주기 위해서 전체 데이터 count() 쿼리..
딥러닝 모델을 탑재한 FastAPI 앱을 AWS ElasticBeanstalk으로 배포하는 과정에서 분명 로컬에서는 잘 되는데 빈스톡 환경에서 import torch하는 부분에 libgomp-d22c30c5.so.1: cannot allocate memory in static TLS block 에러가 뜨면서 서버가 배포되지 않는 이슈를 맞이했다. https://stackoverflow.com/questions/70446215/torch-lib-libgomp-d22c30c5-so-1-cannot-allocate-memory-in-static-tls-block torch/lib/libgomp-d22c30c5.so.1: cannot allocate memory in static TLS block I insta..
DevFest 2023에서 Spring Weflux vs. Virtual Thread 세션을 듣고 정리한 내용과 내생각을 정리 및 공유하고자 한다. # Virtual Thread Project Loom이라는 프로젝트로, JDK 21버전 부터 공식으로 추가된 자바 전용 코루틴 느낌이다. 일반적으로 JVM의 스레드는 OS 스레드와 1:1로 매핑되어서 사용된다. OS 스레드 (커널 스레드)는 그 생성/유지 비용이 비싸 보통 풀링 (스레드 풀)을 통해 미리 만들어놓고 사용한다. 당연히 OS 자원이기 때문에 그 수는 제한이 있다. 그래서 JVM 레벨에서 이 OS 스레드를 좀 더 나뉘어서 사용하게끔 만든 스레드가 Virtual Thread이고 이는 생성 제한이 없다. 가상 스레드의 최고 장점은 기존 자바 스레드 코..