@Transactional로 감싸진 블록은 RuntimeException을 상속받는 예외를 맞이하면 자동적으로 롤백을 해준다. 그런데 간혹, 여러 데이터를 저장할 때 일부는 실패하더라도 트랜잭션이 성공했으면 바라는 경우가 있다. 그럴 때 Transaction silently rolled back because it has been marked as rollback-only라고 에러가 발생하면서 전체 롤백이 되는 경우가 있다. 왜 이런지 구체적으로 알아보도록 하자. # 예시 상황총 5명의 User의 포인트를 1씩 증가시켜가며 저장할 것이다.이때 포인트가 2이면 예외를 발생시킨다.예외가 발생하더라도 다른 User는 저장에 성공해야 한다.@Serviceclass UserTestService( priva..
필자가 회사에서 다루는 데이터는 주로 고객 데이터로, 1000만 건 정도 된다. 무거운 로직을 전체고객에 대해서 수행하거나, 주기적으로 수행되는 배치의 성능을 개선하기 위해서 시도했던 것들과 적용하는 노하우 몇 가지를 정리한다. # 배치 프로그램에서 챙겨야 할 것들일반적으로 필자가 배치 프로그램을 만들 때 중요하게 고려하는 건 다음과 같다. 1. 모수의 사이즈2. 수행 시간이 얼마나 걸리는지3. 멱등성과 실패 시 재처리 방법 모수의 사이즈모수의 사이즈는 배치 수행시간과 직접적으로 연결되므로 매우 중요하게 고려해야 한다. 또한 트랜잭션을 너무 오래 물고 있지 않도록 고려해야 하므로 모수 측정은 반드시 선행되어야 한다. 수행 시간이 얼마나 걸리는지필자 기준 1시간이 넘어가면 오래 걸린다고 판단하여 성능..
일반적으로 API를 설계할 땐, REST 원칙을 적용하여 설계하곤 한다. 이번 글에서는 내가 생각하는 실무적인 RESTful 한 API와 그 과정에서의 trade-off 몇 가지를 공유하고자 한다. 생성, 수정, 삭제 API의 응답에 관하여 게시글을 생성, 수정, 삭제하는 API를 설계한다고 해보자. REST 원칙에 의거하면 다음과 엔드포인트는 같이 설계할 수 있을 것이다. POST /boards PUT /boards/{boardId} DELETE /boards/{boardId} 이때 종종 각 API의 응답 필드에 대한 고민을 할 때가 많다. 응답은 생성/수정/삭제된 boardId만 리턴할 것인가? 아니면 내용 전체를 리턴할 것인가? 엄격하게 RESTful 하게 설계한다면, 각 API의 응답은 board..
https://festa.io/events/4588 게으른개발자컨퍼런스 | Festa! Festa에서 당신이 찾는 이벤트를 만나보세요. festa.io 서울 근처에서 오프라인 무료 컨퍼런스가 열려서 신청해서 다녀왔다. 추첨제였고 700여명 가량 신청했는데 운 좋게 참여 기회를 얻을 수 있었다. 이 컨퍼런스는 서버 개발자 위주의 내용이어서 백엔드 개발자 친구와 함께 다녀왔다. (운 좋게 친구도 당첨되었다.) 필자는 빨간색 네모 세션들을 들었는데 주로 2~5년 차 주니어 개발자분들이 발표를 해주셔서 생생한 경험과 인사이트를 들을 수 있었다. 스프링과 코틀린에 대한 이야기가 주로 있어서 굉장히 반가웠다. 실로, JPA Patterns는 클린 아키텍처를 적절히 버무린 발표자만의 새로운 패턴 (OORM이라고 하셨..
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 프레임워크로 이벤트 기반 아키텍처를 구축하는 방법에 대해 공유한다. # 이벤트 기반 아키텍처란? 새로운 댓글 작성 시, 게시물 작성자에게 알림을 보내야 하는 기능을 구현해야 한다고 가정해 보자. 이때 "댓글 작성 로직" 마지막에 "게시물 작성자에게 푸시 알림 전송 로직"이 포함될 것이다. 이러면 "댓글 작성"은 본연의 역할과는 다소 다른 도메인인, "푸시 알림 전송"이라는 로직을 포함하게 된다. (즉, 알림 도메인에 의존성이 생긴다.) 이를 이벤트 기반 아키텍처로 변경하면 결합도를 낮출 수 있다. 댓글 작성 -> 댓글 작성 완료 이벤트 발행 댓글 작성 완료 이벤트 핸들러에서 푸시 알림 전송 이러한 이벤트 기반 아키텍처는 로컬 이벤트(앱 서버 내부 이벤트)와 외부 이벤트 구조(카프카, 메시지..