본문 바로가기

전체 글411

[Backend] RabbitMQ 에러 핸들링 (feat. Retry) 무한 예외 발생MQ를 활용한 기본 발급 로직을 짠 뒤, 실패 테스트를 하던 중에 리스너에서 계속 예외를 던지는 상황을 마주하게 된다.Execution of Rabbit message listener failed. 기본적으로 RabbitMQ에서는 다른 조치가 없으면 리스너에서 예외가 발생하면 다시 큐에 집어넣게 된다.그리곤 무한히 반복하게 되기 때문에 이런 상황을 마주한 것이다.무한 Retry 해결하기이 상황을 해결하는 가장 쉬운 방법은 다음과 같다.1. Requeue 옵션 설정하기다음과 같이 yml 설정하면 가장 간단하게 Requeue 옵션을 제어할 수 있다.# application.ymlspring: rabbitmq: listener: simple: # exchange 옵션에 따라 다르.. 2024. 7. 14.
TIL : @Async, @EnableAsync (24) Spring Async비동기 처리를 나타내는 @Async에는 proxy target 옵션이 존재한다.처리 모드가 프록시일 때만 설정할 수 있는 옵션인데, true라면 CGLIB로, false라면 동적 프록시로 생성한다. 두 방법 모두 프록시를 사용하므로 당연히 상속을 사용하는데, CGLIB는 subclass 기반이고 동적 프록시는 interface 기반이다.여기서 CGLIB는 바이트 코드 기반으로 생성하기 때문에 성능적으로 약간 낫다. @Async가 아닌 커스텀 어노테이션을 등록해서도 사용할 수 있다.@EnableAsync 속성에 annotation 필드가 바로 이 옵션이다. 비동기를 사용하기 앞서 thread pool의 사이즈, queue 사이즈를 정해서 하나의 Executor를 빈으로 등록한다.poo.. 2024. 6. 12.
[이모저모] 리팩토링 고민 Fixtures현재 각 도메인 별로 Fixture가 존재한다.생성을 담당하는 Fixture는 도메인 별로 존재하지만, Fixture에서 Persist까지 담당할 필요는 없기 때문에 Fixtures를 만들었다.일종의 companion object이자 퍼사드 객체이다. 현재 기본적인 테스트 설정은 java-test-fixture 플러그인을 사용하는 common 모듈에서 담당하고 있다.앞서 언급한 Fixture들은 도메인(모듈)을 알아야 하기 때문에 common 모듈에선 해당 정보까지는 모두 알 필요가 없다고 판단했다.따라서, fixture들을 모든 의존성을 알고있는 client-api 모듈에 배치시켰다. 이게 하나의 문제를 이어지는데 바로 admin-api 모듈은 해당 fixture들을 모른다는 점이다.따라.. 2024. 6. 4.
[회고] 2023년을 돌아보며 🤔 나에게 23년은? 2022년 갈피를 못 잡고 방황하다가 본격적으로 백엔드에 몰입했던 해였다. 나름 바쁘게 그리고 성실하게 보냈던 한 해였던 것 같다. 단순히 잔디로 무엇을 했는지 어떤 성취가 있었는지 모두 표현하기 어렵다. 기억을 조금 더듬으며 지난 한 해를 돌이켜보겠다. 🏃 23년에는 무엇을 했나요? 23년은 무언가 정말 많이 한 것 같다. 사이드 프로젝트와 스터디로 나눠서 회고해 보겠다. 🗂️ 사이드 프로젝트 많은 토이 프로젝트와 사이드 프로젝트를 진행했는데 그중에서 딱 2가지만 기억에 남는다. 올해 초에 약 2개월의 시간을 투자했었던 Flaground와 올해 말 1개월의 시간을 투자했던 올해도 아좌좌이다. 1️⃣ Flaground 당시 소속되어 있던 학교 동아리 FLAG에서 진행했던 프로젝트이다.. 2024. 1. 5.
TIL : gradle-build-action (짧) 🏃‍♂️ Github Action 이번에 CI를 작성하면서 시간이 생각보다 더 걸려서 gradle을 캐싱해야 하는 일이 생겼다. 처음에는 "CI를 굳이 어렵게 가야하나? 적당히 긁어와서 쓰자"라는 생각으로 다음 코드를 붙여서 사용했다. - name: Gradle Caching uses: actions/cache@v3 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- 근데 뭔가 시간적으로 개선이 안되는 것 같아서 "다른 방법이 없을.. 2023. 10. 27.
[Java] Jacoco 잘 사용하기 (feat. 심화) 🙋 들어가며 애플리케이션의 안정성을 나타내는 지표는 무엇일까요? 바로 테스트 커버리지입니다. 테스트 커버리지란 우리 시스템에 얼마나 테스트 코드가 작성되었는지 나타내는 지표입니다. 자바 진영에는 Jacoco라는 도구가 존재하는데 간단하게 사용법을 알아보겠습니다. 😋 💄 Jacoco Jacoco란, 자바 진영의 테스트 커버리지 측정 도구입니다. 테스트를 작성하면 조건에 따라 커버리지를 측정하고 거기에 따른 Report를 제공합니다. 이 글에서 사용한 환경은 다음과 같습니다. Spring boot : 3.1.5 Java : 17 Jacoco : 0.8.8 Build Tool : Gradle 🚀 Gradle에 적용하기 Jacoco 플러그인을 Gradle에 다음과 같이 적용합니다. plugins { ... id.. 2023. 10. 26.