전체 글
Transactional Outbox Pattern을 통한 웹툰 생성로직 분리
예전에 했던 `J-Toon`팀 프로젝트에서 다른 사람이 작성했던 웹툰 이미지 업로드 부분을 비동기 처리하면서 Transactional Outbox Pattern을 도입하며 리팩토링했던 부분에 대해 공유하고자 작성했습니다. 목표 웹툰 생성과 이미지 업로드 요청에 대한 응답 시간을 빠르게 하는 것이 목표 기존 @Transactional public void createWebtoon(Long memberId, MultipartFile thumbnailImage, CreateWebtoonReq request) { Member member = memberService.findById(memberId); validateDuplicateTitle(request.title()); UploadImageDto upload..
모니터링 시스템 구축 (Grafana + Prometheus + Spring)
서비스를 안정적으로 운영하기 위해서는 서버나 서비스에 대한 모니터링이 필수가 됩니다. 이러한 모니터링 도입과정에 대해 작성해보겠습니다. 목표 단일 Spring 서비스 환경에서 서비스 메트리과 시스템 메트릭을 모니터링 하는 환경을 구축하는 것이 현재 목표입니다. 최종적인 목표는 MS 환경을 생각하여 k8s와 각 파드에 대한 메트릭을 가져오고 이를 모니터링하고 얼럿까지 하는 것이었습니다. (k8s를 사용해본 적이 없었고 테스트 용도로 구성해서 시도해보기에는 비용적을 부담하기에는 별로라는 생각에 local환경에서 단일 노드를 구성하여 진행해볼 생각이었습니다. 하지만 k8s의 숙련도가 낮아 먼저 단일 서비스 환경에서의 모니터링 시스템을 구축 후 점진적으로 확장하면서 해당 내용을 공유해보겠습니다.) 모니터링 구조..
동시성 문제 해결하기
0. 작성 이유 기능 개발 중 동시성 문제를 해결해야 하는 문제가 발생하여 이를 해결하기 위해 학습했던 방법을 공유하고 싶어 이렇게 작성합니다. 0-1. 도메인 예시에서 사용할 코드 중 도메인에 대한 이해가 필요한 부분이 있어서 미리 명시합니다. Tyle이라는 도메인이 존재하고, Team과 Persoanl로 분류할 수 있는데 Team의 경우 방의 개념에 가깝고 개인 Tyle의 경우 프로필과 유사합니다. 1. 기능 요구 사항 Team Tyle에 참여한다. 이미 참여하고 있거나 Tyle이 없다면 throw 팀의 최대 참여 인원 수보다 많은 사람들이 참여하려 한다면 throw 기능 코드 @Transactional public void enterTeamTyle(AuthMember authMember, Long ..