Content type 'application/octet-stream' not supported for bodyType Intro WebClient를 사용하여 아래와 같은 방식으로 API 통신을 하던 중 마주한 예외를 탐구해 보게 되었습니다. Response response = webClient.mutate() .baseUrl(baseUrl).build() .post().uri(uri) .bodyValue(requestBody) .headers(httpHeaders -> httpHeaders.setAll(headers)) .retrieve() .onStatus(HttpStatus::isError, res -> { return Mono.error(new ResponseStatusException(res.s..
슬랙봇으로 개발 생산성 높이기 with Slack RTM API 개발을 하면서 때때로 간단한 프로퍼티를 조회하기 위해 매번 번거로운 DB 접근 절차를 거치게 되는데요. 개발 생산성을 높이기 위해 프로퍼티를 조회하는 절차를 효율적으로 개선해 보자는 생각을 시작으로 공통 코드 조회 슬랙봇(WhatIsThisCode)이 만들어지게 되었고, 이번 글에서는 그 생성 과정을 공유해 드리고자 합니다. 들어가기 슬랙봇을 만드는 방법은 정말 다양했습니다. 그중에서도 저에게는 아래와 같은 조건을 만족하는 방법이 필요했습니다. API를 외부(Slack)에 오픈하지 않고 슬랙봇을 동작시킬 수 있는가? 구현 환경에서 방화벽 이슈가 발생하지 않는가? 슬랙봇이 실시간으로 이벤트를 수신하고 메시지를 보낼 수 있는가? 다행히도 슬랙은..
Firebase 구글에서 제공하는 모바일 앱/웹을 위한 플랫폼인 Firebase 을 알아보려고 한다. AWS 같은 클라우드 컴퓨팅 플랫폼으로 기대(?)했었는데.. 알고 보니 백엔드의 역할을 대신해 주는 플랫폼으로 보인다.😥 . 인증, 데이터베이스, 스토리지, 푸시 알림 등의 기능을 제공하여 백엔드 개발 없이 프론트 개발만으로도 빠른 앱/웹 개발이 필요한 사람들에게는 유용할 것 같다. 백엔드 개발을 해야 하는데.. 필요가 없다니..🥲 백엔드 개발이 필요 없는 플랫폼인만큼.. Spring-boot 프로젝트를 firebase 에 배포할 수는 없어 보이고 필요하다면 별도 서버에 배포가 필요해 보인다. . Firebase 를 알아보는 김에 Spring-boot 와 연동까지는 해보자. Spring-boot 와 Fi..
Slack Bot - Real Time Messaging API 슬랙의 Real Time Messaging API 를 활용해서 슬랙봇을 만들어 보자. . Real Time Messaging 은 줄여서 RTM 으로 불리기도 하고, 이름처럼 실시간으로 이벤트를 수신하고 메시지를 보낼 수 있는 WebSocket 기반 API 이다. 그 밖에도 Events API, Web API API 를 제공해 주고 있다. . 사내에서는 방화벽 문제로 Real Time Messaging API 를 활용하려고 한다. Real Time Messaging API 의 간략한 설명을 보면 해당 API 를 더 이상 지원을 하고 있지는 않다. 다만, Events API, Web API 활용에 있어 방화벽 제한이 있을 경우 사용할 것으로 안..
Jenkins REST API in JAVA 특정 시기마다 대략 20개 정도의 배치를 Jenkins 에서 수동 재기동해야 하는 일이 있다. 가끔씩? 종종? sometimes.. 있는 일이긴 하지만 너무나 귀찮은 일이다. 한 번의 어떠한 동작으로 이 귀찮은 일을 처리할 수 있는 방법을 떠올리다 Jenkins API 를 활용해 보자는 생각이 들었다. . 이제 하나의 API 호출만으로 20개 정도의 배치가 Jenkins 에서 실행되도록 해보자. 참고로, jenkins-rest 라이브러리를 활용할 수도 있지만 REST API 호출을 적용해볼 예정이다. API Token REST API 사용을 위해 먼저 사용자 API Token 이 필요하다. 아래 경로에서 토큰을 추가할 수 있다. 설정 경로 Jenkins 메인 ..
Spring Batch & Jenkins 구동 방식 개선 현재 실무에서 스프링 배치의 구동 방식이 아래와 같다 Deploy Tool 배치 프로젝트 특정 브랜치의 jar 파일을 배치 서버에 배포 Jenkins Build periodically - Schedule 설정 Execute shell 을 통한 배치 실행 쉘에는 파라미터, 프로파일 설정과 jar 파일로 배치 잡을 실행하는 커멘드가 포함 현상 현재 구동 방식에서는 한 가지(한 가지가 아닐 수도 있지만..) 문제가 있었다. . jar 파일이 배포되는 사이 배치 잡이 실행되거나, 배치 잡이 실행되는 사이 jar 파일이 배포되면 Class 정보를 찾을 수 없다는 예외(java.lang.NoClassDefFoundError, java.lang.ClassNot..
RSA Public/Private key in JAVA 업무 중 외부 API와 연동을 위해 RSA 암호화 알고리즘을 적용이 필요하게 되었는데, Public Key, Private key 에 대한 개념을 이해하고 적용해 보고자 간단하게 정리하게 되었다. RSA(Rivest-Shamir-Adleman) 비대칭 암호화 알고리즘 공개 키를 사용하여 데이터를 암호화하고, 개인 키를 사용하여 암호를 해독 대칭 알고리즘인 DES, AES와 다르게 2개의 키(Public Key, Private Key) 존재 Public Key : 누구와도 공유할 수 있는 공개 키(데이터를 암호화에 사용) Private Key : 자신을 위한 개인 키(복호화에 사용) 메세지 암호화 시 해당 메세지가 공개 키(Public Key)로 암호..
Request multipart/form-data type API by attaching a file 서버단에서 multipart/form-data 타입으로 파일을 첨부해서 요청을 보내본 적은 없었는데.. 이번에 관련 작업을 하면서 정리를 해보고자 한다. (여기서 파일은 이미지 URL 을 저장해서 보낸다.) MultipartFile multipart/form-data 타입으로 Request 시 MultipartFile 객체가 필요하다. @PostMapping(value = "/sample/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) SampleResponse uploadImage(MultipartFile upload, @RequestHeader(va..