@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..
RESTful, REST API 에 대해
·
API 설계
사전적인 정의의 RESTful 은 다음과 같다.RESTful(Representational State Transferful)은 REST(Representational State Transfer) 원칙을 따르는 웹 서비스 또는 API를 의미합니다. REST는 웹의 장점을 최대한 활용하여 설계된 아키텍처 스타일로, 주로 HTTP를 사용하여 자원(Resource)을 전송하고 처리합니다. RESTful은 이 원칙을 충실히 따르는 시스템을 말합니다. 라고 합니다. 그리고 다음 제한조건을 준수해야 된다고 합니다 통합된 인터페이스클라이언트 서버/구조Stateless (무상태)캐시 처리 가능(Cacheable)계층화된 시스템 1. 통합된 인터페이스https://jaess.com/orders orders 라는 주문에 대..
첫 게시글
·
회고
블로그를 하겠다고 다짐하고 github 블로그를 개설했었다.이것저것 스킨을 찾다 Jekyll을 적용하여 만들었고 초반에는 잘 작성했다.그게 벌써 4년 전인 2020년이다.하지만, 몇 개의 포스팅을 하고 결국엔 점점 작성하지 않았다.아무래도 생성했을 당시 마크다운으로 글을 작성하는 게 매우 불편해서 흥미를 잃었던 걸로 어렴풋이 기억한다.이후에 원하는 메모 또는 정보들은 note 앱에 저장하기 위해 시작했다. 정보가 적었을 땐 찾기도 괜찮았고 나만의 정보(?) 꿀팁(?) 이 늘어나는 거 같아 기분이 좋았다.점점 늘어나는 note 안의 정보들이 관리가 안되기 시작했고 내용도 부실해지기 시작했다.그 이유에 대해 최근 생각을 해봤고 나름대로 내린 결론이 있었다.나만 보기 때문에 대충 작성하고 내가 작성했지만 퀄리..