@EventListener, @TransactionalEventListener 설에 따른 이벤트 동작 방식
·
Java & Spring
안녕하세요 이번 포스팅에서는 이벤트 리스너 어노테이션에 대해 다루고자 합니다. 도입하여 사용하게된 계기는 다음과 같았습니다.1. 메인 비지니스 로직과 알림과 같은 부가적인 로직의 분리 - 알림 발송에 대한 처리2. 분리를 통한 결합도 낮춤 및 확장 가능한 설계3. @Async 도입을 통해 비동기 처리로 퍼포먼스 향상 그럼 스프링에서 제공하는 @EventListener, @TransactionalEventListener를 통해 어떤 경우에 어떻게 동작하는지 정리해 보겠습니다. 1. @EventListener이벤트를 publish 해주는 곳에서 PostCreatedEventFail 타입으로 발행해주면 해당 타입으로 리스너가 구성되어 있는 메소드는수행되게 됩니다EventListener 안에 별도로 class ..
Awaitility로 비동기 이벤트 테스트 하기: Spring @Async와 함께 쓰는 법
·
Java & Spring
Awaitility란 무엇인가?Awaitility는 단순히 "조건을 만족할 때까지 기다리는" 라이브러리입니다. 자바의 while 루프나 Thread.sleep을 사용하지 않고, 안정적으로 polling 하며 조건이 만족될 때까지 기다립니다. 비동기 테스트 도입 계기Spring에서 @Async 와 같이 비동기적으로 수행되는 코드를 테스트할 때 가장 어려운 점은 "테스트 메소드가 먼저 종료되어 비동기 로직이 미처 수행되지 못하는 것"입니다. Thread.sleep() 으로 기다리는 방식 보단 적절한 시간을 두고 polling 으로 완료가 되면 종료되는게 더 효율적이라 판단하였습니다. 기본 사용법await().atMost(5, SECONDS) .until(() -> someService.getSta..
Java Enum 다형성으로 Notification 처리 리팩토링하기 - 조건문 없는 전략 설계
·
Java & Spring
이번 포스팅에서는 Java 의 Enum을 통해 분기처리 없이 알림 타입에 따른 전송을 구현해 보고자 합니다. 실제 프로젝트를 진행하면서 Email, Slack, SMS 등 상황에 따라 알림을 다른 플랫폼으로 전송해야 될 일이 있었습니다. 기존에는 그런 상황에서 if ... else 구문으로 보내야되는 알림 타입에 대해 처리했고 만약 알림 타입이 추가된 경우엔 또 다시 else if 를 추가하는 등의 작업이 필요했습니다. 하지만, 그렇게 하다보니 코드도 너무 복잡해지고 실수로 작업해야되는 알림 타입에 다른 로직을 추가 하는 경우도 발견했습니다. 그래서 이를 해결하기 위한 방법을 찾던 중 Java 의 Enum 을 활용하면 해결을 할 수 있다는 힌트를 얻을 수 있었고 실제 적용을 해보니 코드도 정말 깔끔해지고..