전체 글376 동기(Synchronous)/비동기(Asynchronous) & 블로킹(Blocking)/논블로킹(Non-Blocking) 동기(Synchronous)/비동기(Asynchronous) & 블로킹(Blocking)/논블로킹(Non-Blocking)최근 팀원분의 기술리뷰에서 해당 단어들이 언급되었고, 듣는 순간 머릿속에서 정리가 안되었는데요.따라서, 확실하게 정리하고자 해당 포스팅을 작성했습니다.도입부에서 간단하게 요약해보자면 ...동기/비동기를 구분하는 기준은 작업의 수행 순서,블로킹/논블로킹을 구분하는 기준은 작업의 차단 여부 이라고 말할 수 있습니다.이를 조금 더 풀어서 설명해보자면 아래와 같이 설명할 수 있겠네요.동기 : 작업이 하나씩 실행비동기 : 작업이 여러개 실행블로킹: 작업을 시키고, 기다림논블로킹: 작업을 시키고, 기다리지 않음그럼 하나씩 살펴보겠습니다. 동기/비동기란?동기(Synchronous)약어: Sync.. 2025. 1. 19. 여러 외부 API 동기적으로 호출할 때 발생할 수 있는 문제 모든 코드는 깃허브에 있습니다.여러 외부 API 동기적으로 호출할 때 발생할 수 있는 문제최근 흥미로운 문제를 고민하게 되었어요.여러 외부 API를 동기적으로 호출할 때 성능 이슈가 발생하진 않을까?예를 들면, 음식 배달 앱에서 사용자 요청을 처리할 때 외부 API 호출이 지연된다면 사용자가 느끼는 대기 시간이 길어질 수 있는데요.이러한 상황에서 효율적인 API 호출 방법을 고민해볼 필요가 있을 것 같아요. 이에 대해 고민했던 내용을 정리해보았습니다. 동기적(Synchronous)으로 여러 외부 API 호출HTTP 요청을 위해서 사용했던 라이브러리는 spring-boot-starter-web 모듈에서 제공하는 Rest Template 이었어요.간단하게 예제 코드를 살펴볼게요.// FoodService... 2024. 11. 26. 순차 처리로 인한 네트워크 트래픽 문제, Queue 기반 스케줄링으로 70% 감소 순차 처리로 인한 네트워크 트래픽 문제, Queue 기반 스케줄링으로 70% 감소기술 블로그의 게시글을 한번에 볼 수 있는 서비스를 운영하고 있습니다.서비스 이용자분들에게 최신의 게시글을 보여드리기 위해서, 하루 간격으로 RSS를 제공하는 블로그의 게시글을 수집하고 있습니다.수집하는 작업은 아래와 같이 Spring Scheduler를 통해서 구현했는데요.(궁금하신 분들은 아래 코드를 참고해주세요.) 매일 동시간대에 19개의 블로그를 순차적으로 수집하다보니, 트래픽이 급격하게 증가하는 현상이 지속적으로 발생했습니다.Network InNetwork Out피크 트래픽이라고 하기엔 다소 낮은 수치일 수도 있습니다. (수치를 직접 확인해보고 싶으신 분들은 아래 내용을 참고해 주세요.)600 Kbps = 600,.. 2024. 9. 27. Offset Based Pagination 성능 이슈 해결하기 Offset Based Pagination 성능 이슈 해결하기기술 블로그의 게시글을 한번에 볼 수 있는 서비스를 운영하고 있습니다. 현재 많은 사용자가 이용하고 있는 건 아니지만, 앞으로 서비스를 지속적으로 유지하기 위해서는 지출되는 비용을 최대한 절감하는 것이 중요하다고 생각했어요.그 중에서도 데이터베이스 성능 이슈를 발견했었고, 이를 해결하고자 합니다.성능 이슈가 발생했던 시점에는, 아래와 같이 페이지 번호를 보여주고 있습니다.클라이언트가 페이지 번호를 클릭할 때마다, 데이터베이스 쿼리가 실행되는 속도를 확인해봤어요.사용자 경험 혹은 리소스 사용 측면에서 봤을 때, 원인을 찾아서 해결해야 하는 것이 중요하다고 생각했습니다.해당 포스팅에서는 데이터베이스 성능 이슈를 발견하고, 이를 개선하기 위해 시도.. 2024. 8. 30. Cglib Proxy에 포함되지 않는 Final Method 모든 코드는 github를 참고해주세요.Cglib Proxy에 포함되지 않는 Final Method토이 프로젝트에서 Server Error 발생 시에 Slack으로 알림을 보내주도록 설정했었는데요.해당 설정을 사내에서 진행했던 프로젝트에 적용하려고 했습니다.(궁금하신 분들은 Spring AOP로 Slack 알람 구현 포스팅을 참고해주세요.)토이 프로젝트에서 적용했던 설정을 사내 프로젝트에 그대로 적용했지만,개발 서버에 정상적으로 배포 후, 제보를 받았어요.클라이언트에서 Server Error 응답을 받았지만,슬랙 채널로 알림이 오지 않는데요? 분명, local(로컬) 환경에서 테스트를 진행했었고, dev(개발) 환경에 정상적으로 배포되었는데 말이죠.디버깅을 해보면서 확인해보니, 특정 Exception .. 2024. 6. 29. 강결합된 구조를 이벤트 기반 약결합된 구조로 변경하기(with. Spring Event) 강결합된 구조를 이벤트 기반 구조로 변경하기(with. 트랜잭션 분리)쿠폰(Coupon) 발급 시 해당 회원에게 알림이(Notification) 발송되어야 하는 요구사항으로 인해 기존 프로덕션 코드가 수정되어야 했습니다.* 알림: 서비스 내 알림, 메일, SNS 알림 등을 의미합니다. 해당 요구사항을 파악 후 기존 쿠폰 서비스 객체에 알림 서비스 객체를 추가하는 방향을 고려했습니다. 그렇다면, 쿠폰 발급 시 알림이 발송되는 흐름은 다음과 같습니다. 하나의 트랜잭션으로 진행되다보니, 다음과 같은 문제점을 발견했습니다. 보조 업무인 알림 발송이 실패할 경우, 핵심 업무인 쿠폰 발급이 실패할 수 있다. 핵심 업무(Core Business): 쿠폰을 발급하는 로직보조 업무(Auxiliary Bu.. 2024. 5. 8. 대량 쿠폰 발급 시 Bulk Insert로 처리 시간 70% 단축 대량 쿠폰 발급 시 Bulk Insert로 처리 시간 70% 단축쿠폰 발급과 관련된 프로덕션 코드를 작성하면서,향후 서비스 규모가 커짐에 따라 쿠폰을 발급하는 대상 회원 수가 100명, 1,000명, 혹은 10,000명이 된다면 성능 이슈는 발생하지 않을까? 라는 고민을 하게 되었습니다.결과적으로 쿠폰의 발급 방식을 Single Insert에서 Bulk Insert으로 변경했더니, 아래 그래프와 같이 쿠폰 발급 처리 시간이 약 70% 단축되는 결과를 확인할 수 있었습니다.해당 포스팅에서는 70%라는 시간 단축하기까지의 과정을 소개합니다. 해당 글에서 사용되었던 모든 코드는 gitHub에서 확인하실 수 있습니다.아래 서버 환경은 참고해주시면 좋을 것 같습니다.Spring Boot: 2.7.1Spring .. 2024. 4. 27. 쿠폰 발급 시 동시성 제어를 위해 고려했던 4가지 방법 쿠폰 발급 시 동시성 제어를 위해 고려했던 4가지 방법 쿠폰 Entity에서 잔여 발급 횟수를 관리하고 있었습니다. 쿠폰 발급과 관련된 비즈니스 로직을 구현하면서 문득, 동시 다발적인 쿠폰 발급 요청이 올 경우 어떤 일이 벌어질지 궁금해졌습니다. 실제 운영환경에서 여러 Thread가 동시 다발적으로 쿠폰을 발급하기 위해서 데이터베이스에 접근할텐데, 고려해야할 문제는 없을까? 해당 포스팅에서는 동시성 문제를 해결하려고 고려했던 4가지 방법에 대해서 이야기 해보려고 합니다. 단일 Thread에서 쿠폰을 발급하는 상황 단일 Thread에서 동시성 문제를 고려할 필요가 없지만, 이후에 나올 내용과 연관되어 있기 떄문에 간단하게 쿠폰을 발급하는 상황을 살펴보겠습니다. 1) 트랜잭션 시작 2) 쿠폰을 발급하기 전,.. 2024. 4. 13. 테스트 코드에서 JPA의 dirty checking 모든 코드는 깃허브에 있습니다. 테스트 코드에서의 JPA의 dirty checking Spring Data Jpa를 사용하면서, 테스트 코드 실행 시 update 쿼리가 실행되지 않는 상황이 있었습니다. 결론적으로, dirty checking 기능이 제대로 동작하지 않는 상황에 대해서, 해결했던 내용을 기록했습니다. MemberService와 테스트 코드 JpaRepository 상속받는 MemberRepository 클래스를 선언하고, 이를 협력 객체로 두는 MemberService 클래스를 만들어서 Spring Bean으로 등록했습니다. 이 후 MemberService 레이어에 대한 테스트 코드를 작성하고자 했습니다. 이때, 테스트 환경은 아래와 같이 구성해 주었습니다. @DisplayName("회원.. 2024. 3. 23. 이전 1 2 3 4 ··· 42 다음