개발 이야기11 스케일 아웃 환경에서의 서킷브레이커 동기화 서킷브레이커 패턴?서킷브레이커 패턴은 간단히 말하면 회로 차단기 패턴이다. 관련해 다른 좋은 글들이 많기 때문에 서킷브레이커에 대한 설명은 생략하겠다.쨋든 회로 차단기 패턴을 구현한 라이브러리가 resilience4j 이다. resilience4j docs: https://resilience4j.readme.io/docs/circuitbreaker CircuitBreakerGetting started with resilience4j-circuitbreakerresilience4j.readme.io 서킷브레이커를 어디에서 사용하는가?우리는 자체 검색 엔진이 없다. 그래서 검색이 AI 기반으로 돌아가는데 이를 제공해주는 외부 서비스사의 API를 활용한다.즉, 검색 기능은 외부 API에 의존하고 있는 상태이.. 2025. 1. 1. Kotlin Value Class와 Mangling 문제 해결기 배경새로운 결제 시스템 연동 작업 중 발생한 문제를 공유하고자 한다.해당 결제 시스템은 서버 간 통신을 통해 이루어지며, API 호출 시 토큰이 필요하다.즉, 토큰을 얻어오는 API 호출 후, 해당 토큰을 포함하여 외부 API 호출을 해야한다. 나는 타입 안정성을 위해 얻아온 토큰을 Value Class로 래핑했고, 네트워크 오류에 대응하기 위해 resilience4j의 retry 기능을 사용하였다.문제예시 코드는 아래와 같다.해당 코드에서 fallback 메서드를 찾지 못하는 문제가 발생하였다.@Serviceclass RetryServiceTest { @Retry(name = "retryServiceTest", fallbackMethod = "fallback") fun test(token: .. 2024. 12. 21. MultiPart와 @Async 사용 시 주의점 우리 회사는 마트와 소비자를 연결해주는 중개 플랫폼을 운영하고 있다. 소비자가 앱을 통해 주문하면 마트에서 물건을 배송해주는 형태다. 마트 관리자들을 위한 관리 페이지가 있는데, 여기서 환불 처리할 때 간헐적으로 문제가 발생했던 경험을 공유하고자 한다. 문제 상황주문은 하나의 환불 정보만 가질 수 있는데, 동일한 주문에 대해 환불 정보가 두 개씩 생성되는 문제가 발생했다. 환불 처리는 다음 세 가지 엔티티를 저장하는 과정을 포함한다:Refund: 환불 기본 정보RefundProduct: 환불 상품 정보RefundImage: S3에 업로드된 이미지 URL 정보문제 해결 과정1차 시도: 네임드 락(Named Lock) 적용처음에는 동시성 문제로 판단하여 주문 ID에 대해 네임드 락을 걸었다. 하지만 문제는 .. 2024. 11. 16. 슬랙 알림 최적화 - 배치처리, 버퍼링 많은 기업에서 슬랙을 단순한 커뮤니케이션 도구 이상으로 활용하고 있을 것이다. 우리 팀은 애플리케이션에서 발생하는 중요한 에러 로깅 알림을 슬랙을 통해 관리하고 있다. 우리 앱은 이미 ELK(Elasticsearch, Logstash, Kibana)를 사용하여 로그를 수집하고 있으며, 여기에는 operation time 정보도 포함된다. ELK 검색을 통해 긴 operation time을 가진 요청들을 추적할 수 있지만, 슬랙 알림을 통해 이를 더욱 신속하게 모니터링할 수 있다고 판단하여 새로운 기능을 구현하였다. 구현은 간단했다. 로깅 필터에서 ELK에 로그를 쌓을 때, 특정 시간(15,000ms) 이상의 작업이 발생하면 비동기로 슬랙 알림을 발송하도록 했다. 이를 통해 별도의 검색 없이도 긴 시간이 .. 2024. 8. 25. 데이터 대량 등록/수정 성능 개선 with JDBC Batch Update 우리 애플리케이션에는 마트 관계자를 위한 관리 페이지가 존재한다.해당 페이지에서 상품 관리, 주문 관리 등 관리 작업이 가능하다.상품을 단건으로도 저장/수정이 가능하고, 엑셀 파일을 통해 대량으로 저장/수정도 가능하다. 엑셀 파일을 통해 대량으로 저장/수정하는 기능을 우리 앱에서는 '상품 통합 관리'라고 부른다.상품 통합 관리 기능은 아래 프로세스로 이루어져 있다.1. 엑셀 업로드2. 엑셀 파싱 후 클라이언트 반환3. 클라이언트는 파싱된 정보를 보고 상품 분류 요청4. 상품 분류에서는 해당 상품이 신규 상품인지, 기존 상품인지 분류하여 클라이언트에게 반환5. 기존 상품은 수정6. 신규 상품은 저장정리하면 통합 상품 관리 기능은 엑셀 파싱 -> 상분 분류 -> 상품 수정 -> 상품 저장 순으로 진행한다. .. 2024. 8. 17. 효율적인 개발과 유지보수를 위한 문서화의 힘 신입 개발자로 입사했을 때, 가장 어려웠던 점은 기존 코드로만 기능과 정책을 파악하는 것이였다.문서화가 제대로 되어 있지 않고, 테스트 코드 조차 제대로 존재하지 않는 경우가 많아 팀 동료들에게 계속 물어봐야 했다.또한, 코드 작성자가 퇴사자인 경우도 있어서 제대로 파악이 힘들었다.이러한 과정에서 많은 시간이 소모되었던 것 같다. 장바구니 기능 서버 이전 프로젝트의 서버 담당자를 맡게 되었다. 관련 글은 다음 링크에 있다: https://comengin.tistory.com/851 Redis로 장바구니 구현하기: 예상치 못한 함정과 그 해결책우리 앱의 장바구니 기능은 기존에 클라이언트 캐시로 관리되고 있었다. 해당 방식은 서버 부하를 줄일 수 있다는 장점이 있지만, 몇 가지 심각한 단점이 있었다. 1. .. 2024. 8. 11. 이전 1 2 다음