본문 바로가기

개발 이야기12

지속 가능한 소프트웨어 아키텍처 구현하기 들어가며최근 '읽기 쉬운 코드'라는 책을 읽고 있다. 아직 다 읽진 않았지만 굉장히 재미있고, 도움이 많이 되는 책이라고 생각한다. 회사 동료들에게도 계속 공유하고 있을 정도이다. 이 책의 초반부에 강조하는 개념이 바로 '지속 가능한 소프트웨어'이다. 토스의 재민님 영상을 즐겨보는 영향으로, 소프트웨어 통제와 제어에 대한 관점을 많이 배웠다. 모듈 간 의존성을 관리하여 다양한 변화에 대응할 수 있는 소프트웨어를 만드는 것이 중요하다고 생각한다.주의: 이 글은 경험이 많지 않은 주니어 개발자의 주관적인 의견을 담고 있습니다. 잘못된 개념이나 틀린 부분이 있을 수 있으니, 피드백은 언제나 환영합니다. 지속 가능한 소프트웨어란?내가 생각하는 지속 가능한 소프트웨어는 다음과 같다."장기간에 걸쳐 유지보수, 확장.. 2025. 3. 14.
스케일 아웃 환경에서의 서킷브레이커 동기화 서킷브레이커 패턴?서킷브레이커 패턴은 간단히 말하면 회로 차단기 패턴이다. 관련해 다른 좋은 글들이 많기 때문에 서킷브레이커에 대한 설명은 생략하겠다.쨋든 회로 차단기 패턴을 구현한 라이브러리가 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.