@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 을 활용하면 해결을 할 수 있다는 힌트를 얻을 수 있었고 실제 적용을 해보니 코드도 정말 깔끔해지고..
Spring Cloud Config 도입기: 구성부터 실시간 설정 반영까지
·
Java & Spring
이번 포스팅에서는 Spring Cloud Config 설정에 대해 다루고자 합니다.사용하게된 이유와 그리고 어떤 이점이 있었는지 다시 한 번 정리해보고자 합니다. Spring Cloud Config 란?"Spring Cloud Config는 마이크로서비스 환경에서 분산된 설정 관리를 중앙에서 할 수 있도록 도와주는 구성 관리 도구입니다." 1. 도입 배경1. 장점 공통 설정의 중앙 집중화 - 여러 서버에서 사용하는 설정을 Git에 저장하여 하나의 Config Server로 통합 관리할 수 있습니다.무중단 설정 변경 - 설정 변경 시 애플리케이션을 재시작하지 않아도 `/actuator/refresh` 엔드포인트를 통해 실시간으로 반영할 수 있습니다. ex) rabbitMQ 에서 사용하는 q..
Spring Rest Docs 적용 3 - Controller Test 작성을 통한 문서화
·
Java & Spring
이번 포스팅에서는 지난번 문서화 설정에 이어 어떻게 테스트 코드를 작성하여 문서화를 할 수 있는지에 대해 다뤄보고자 합니다. 앞 게시물 에서는 Rest Docs 관련 설정에 대한 내용이니 참고 부탁드립니다. Spring Rest Docs 적용 2 - Swagger 연동지난번 마지막 포스팅을 한 후 한참이 지나서야 다시 포스팅을 하게 됐습니다. 그래도 시작한 거에 대해 마무리를 지어야 하니 개인적으로 정리했던 내용들을 블로그에 다시 정리해 보려 합니jaess.tistory.com 코드에서 필요한 부분들을 발췌하여 보여드리도록 하겠습니다. Company 라는 엔티티가 있고 해당 엔티티의 생성 및 조회에 대하여 정리해 보도록 하겠습니다.다음은 Controller, Entity, Request, Respo..
Spring Rest Docs 적용 2 - Swagger 연동
·
Java & Spring
지난번 마지막 포스팅을 한 후 한참이 지나서야 다시 포스팅을 하게 됐습니다. 그래도 시작한 거에 대해 마무리를 지어야 하니 개인적으로 정리했던 내용들을 블로그에 다시 정리해 보려 합니다! 앞 포스팅은 다음 링크에 있으니 아직 확인하지 못하신 분들은 먼저 읽으신 후에 현재 포스팅을 읽어주시면 감사하겠습니다! Spring Restdocs 적용plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' id "org.asciidoctor.jvm.convert" version "3.3.2"}도입하게된 이유테스트코드 작성을 하고 결과물을 통해 문서작성jaes..
Spring Rest Docs 적용
·
Java & Spring
plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' id "org.asciidoctor.jvm.convert" version "3.3.2"}도입하게된 이유테스트코드 작성을 하고 결과물을 통해 문서작성을 한번에 할 수 있다는 아주 큰 장점이 도입을 하게된 계기다. 적극적으로 테스트코드를 활용하면 좋겠다 생각하던 찰나에 컨퍼런스 및 서칭을 통해 아주 적합하다고 판단했다. 그 동안 안일했던 생각들컨트롤러에서는 크게 예외가 발생하지 않겠지예외가 발생해도 금방 고치면 되지 않아?? Swagger 로 api 잘 돌아가는지 테스트 하면 되잖아~문서화? sw..