[spring] Teams Message Push 및 FeginClient 추가 By starseat 2022-12-13 17:57:54 java/spring Post Tags Spring Batch 에 기능에 기능이 추가할 일이 생겼다. 그리고 추가 개발 건으로 알림을 보내는 기능이 필요하다고 한다. 사내 메신져로 [Microsoft Teams](https://www.microsoft.com/ko-kr/microsoft-teams) 를 사용하고 있어 채널을 추가하여 메시지를 전송하고자 한다. # Teams Message Push Message Push 를 하기 위해 `Teams Web Hook` 을 사용할 것이다. ## 메시지 수신 설정 먼저 `Teams` 좌측 메뉴 에서 `팀` 을 클릭한다. ![image.png](/uploads/_temp/20221214/b7572d9f6d300913c26d6756d724a275.png) 그리고 채널을 새로 만들거나 사용하고자 하는 채널을 선택후에 마우스 우클릭(또는 우측의 점 3개 클릭) 하여 `커넥터` 를 클릭한다. ![image.png](/uploads/_temp/20221214/cba08d2a33a3352ff4f2f32d4e8d54ea.png) 검색란에 `Webhook` 을 검색 한다. (이상하게 나는 로딩이 오래 걸린다... 믿음을 가지고 참고 기다려야 된다.....) `Incoming Webhook` 이 보이면 `구성` 버튼을 클릭한다. ![image.png](/uploads/_temp/20221214/8d0dcb1052b91fd864a89059ad0ddd59.png) 적당하게 내용을 입력 (타이틀 입력 및 아이콘 변경) 후 하단의 `만들기` 버튼을 클릭한다. ![image.png](/uploads/_temp/20221214/c1ae72088e70265ac2eaf3c10e9f15c7.png) 그럼 하단에 URL 이 생성 된다. 이 URL 로 요청을 보낼것이라 은 매우 중요하니 우측의 복사 버튼을 눌러 따로 저장해주자. 그리고 `완료` 버튼을 클릭한다. ![image.png](/uploads/_temp/20221214/53f206056f64b223a1bfdc8a59b4e00a.png) 이제 설정 부분은 완료 되었다. ## 메시지 전송 테스트 설정이 완료 되었으니 `Postman` 사용하여 메시지 전송 테스트를 해 볼 것이다. ```text - Method: POST - URL: 위에서 복사한 URL - Payload: { "themeColor": "BCF7DA", "title": "테스트 제목", "text": "테스트 내용" } ``` 전송이 성공하면 `1` 응답으로 보내진다. ![image.png](/uploads/_temp/20221214/9d8b6b01937a0530374aff0674f1330b.png) 그리고 `Teams`에서 확인하면 아래와 같이 메시지가 보여지는 것을 확인할 수 있다. ![image.png](/uploads/_temp/20221214/3a2b58545f456705122f31214eaa5f25.png) 참고로 요청 정보가 잘못되면 아래와 같이 에러 메시지가 표출된다. ![image.png](/uploads/_temp/20221214/9408b8e088780b43be746f7bf1f237fd.png) # FeginClient RestTemplate 보다 더 간편하게 외부 API 요청을 할 수 있는 `FeginClient` 를 사용할 것이다. ## 설정 ### build.gradle [Maven Repository 에서 Spring Cloud Starter OpenFeign ](https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign) 를 찾는다. 현재 프로젝트가 `gradle` 프로젝트 여서 `build.gradle` 에 추가한다. ```text ... dependencies { ... //########## Spring Cloud ##########// implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:3.1.5' ... } ``` 이 후 Maven Update 를 해 준다. (Reload Gradle Project) ### 소스 개발 방법론이나 패키지 설정은 자유이니 내가 작성한 코드로 예제를 작성 할 것이다.. #### Application 설정 SpringBoot 의 시작점이 되는 (`@SpringBootApplication` 및 `SpringApplication.run()` 부분) class 에 `@EnableFeignClients` 를 추가 해 준다. ```java @EnableFeignClients @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 설정 파일 추가 `application.properties` 또는 `application.yml` 파일에 위에서 복사한 `Teams URL` 을 추가해 주어야 한다. 나는 `application.yml` 로 사용 하였다. ```yaml api: teams: message-push: host: {Teams URL} ``` #### Request DTO - `Postman` 에서 사용할 정보를 담은 DTO 이다. ```java @ToString @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class TeamsRequestDto { private String title; private String text; private String themeColor; } ``` #### HttpClient ```java @FeignClient(value = "teamsMessagePushHttpClient", url ="${api.teams.message-push.host}") public interface TeamsMessagePushHttpClient { @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) String pushMessage(@RequestBody TeamsRequestDto payload); } ``` #### Fallback 실패하였을 경우를 대비하여 Fallback 을 작성한다. ```java @Slf4j @Component public class TeamsMessagePushHttpClientFallbackFactory implements FallbackFactory { private final TeamsMessagePushHttpClientFallback clientFallback; public TeamsMessagePushHttpClientFallbackFactory() { this.clientFallback = new TeamsMessagePushHttpClientFallback(); } @Override public TeamsMessagePushHttpClient create(Throwable cause) { log.error("Teams feign client 실패. {}", cause.getMessage(), cause); return clientFallback; } public static class TeamsMessagePushHttpClientFallback implements TeamsMessagePushHttpClient { @Override public String pushMessage(TeamsRqstDto payload) { String errorMessage = "Failed to Teams Message Push."; log.error("[Teams Message Push Fallback] {} data: {}", errorMessage, payload.toString()); return errorMessage; } } } ``` `Fallback` 을 작성하였으니 `@FeignClient` 부분을 다음과 같이 수정한다. (`fallbackFactory` 추가) ```java @FeignClient(value = "teamsMessagePushHttpClient", url ="${api.teams.message-push.host}", fallbackFactory = TeamsMessagePushHttpClientFallbackFactory.class) public interface TeamsMessagePushHttpClient { ``` #### 사용 이제 실제 사용하려는 부분에서 사용하는 코드이다. ```java @RequiredArgsConstructor public class SendTest { private final String DEFAULT_COLOR = "BCF7DA"; private final TeamsMonitoringBatchClient client; public void sendMessageTest() { String result = client.pushMessage(TeamsRequestDto.build() .title("테스트 제목") .text("테스트 메시지") .themeColor(DEFAULT_COLOR) .build()); } } ``` #### 기타 - 타임아웃, 재시도 등은 아래 링크가 잘 나와있어 참조하면 될 듯 하다. - [https://mangkyu.tistory.com/279](https://mangkyu.tistory.com/279) # 출처 - [Spring Cloud OpenFeign](https://spring.io/projects/spring-cloud-openfeign) - [Maven Repository - Spring Cloud Starter OpenFeign](https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign) Previous Post [java] LocalDateTime SerializationException 이슈 Next Post [spring] HttpMediaTypeNotAcceptableException: Could not find acceptable representation 오류