Grafana 모니터링중 이상 발생시 슬랙으로 알림 보내기

Intro Oracle Cloud는 1기가 메모리 인스턴스 무료로 제공한다. 그것도 무려 2개나. 몇년간 여러가지 클라우드 옵션들을 찾아봤지만 이정도로 파격적인 조건은 전혀 찾을 수 없었다. 그래서 그 두개의 인스턴스를 정말 요긴하게 잘 사용하고 있다. 고정 아이피도 제공해주기 때문에 토이프로젝트 정도는 물론이요, 트래픽이 많지 않다면 작은 서비스도 운영할 수 있을 것이다. 이정도 스펙이면 네이버 클라우드 기준으로도 월 3만원 이상 과금을 해야 하는데 공짜로 쓸 수 있으니 정말 좋다. 하지만 망각하고 있었던게 있으니, 그들의 이름은 악명높은 오라클 이였다. 난 이제 2년정도 사용했는데 여태 잠잠하더니 슬슬 점유율을 끌어 높이기 위해 썼던 그들 스스로의 묘책을 거둘 셈으로 보인다. 요즘따라 툭하면 이메일을..

Development/DevOps 2023.06.07
골치아픈 공공데이터포털 serviceKey 인코딩 문제

Intro 처음 겪는 일은 아니지만 공공 데이터 포털 API를 쓸 때마다 고생을 해서 이번에 글로 정리해두려고 한다. 공공 데이터포털은 각 공공기관이 보유하고 있는 여러가지 다양한 공공 데이터들을 하나의 통합 창구에서 편리하게 사용할 수 있도록 만들어진, 정부에서 운영하는 서비스다. 제공하는 정보가 정말 다양하고 여러가지 유용한 정보가 있으며 무료로 사용할 수 있기 때문에 개발자라면 한번쯤은 사용 해 보았을 것이다. 아래 보이는 것 처럼, 공공 데이터 포털에서는 개인 API 인증키를 Encode / Decode 된 두가지 버전으로 제공한다. 여기까지는 좋다. 사용자가 편의에 따라서 URI 인코딩 하지 않고 인코딩 된 키를 바로 복사해서 써도 되고, 그게 아니면 Decode 된 키를 가지고 각자 알아서 요..

Development/Daily Error 2023.05.28
[Java/Kotlin] Final 클래스 Mocking 하기

Intro 코틀린을 사용한 프로젝트에서 Mockito를 사용해서 테스트 코드를 작성했는데 아래와 같은 에러가 나며 코드가 동작하지 않았다. Cannot mock/spy class com.tistory.shanepark.dutypark.security.domain.dto.LoginMember Mockito cannot mock/spy because : - final class org.mockito.exceptions.base.MockitoException: Cannot mock/spy class com.tistory.shanepark.dutypark.security.domain.dto.LoginMember Mockito cannot mock/spy because : - final class at app//..

Programming/Kotlin 2023.05.22
Let's encrypt로 SSL 인증서 발급받기

Intro 기존에 ZeroSSL을 활용해서 SSL을 발급받았는데, 90일마다 제법 번거로운 과정을 통해 재발급을 하는건 그래도 견딜 수 있었지만, 다른 도메인 포함 총 3번의 90-Day Certificates 발급을 하고 나니 이제부터는 돈내고 인증서를 발급받으라고 한다. 앞으로 zeroSSL을 쓸 일은 없겠다. 다른 무료 인증서 발급 기관을 찾아보다보니 Let's Encrypt가 사용방법도 편하고 무엇보다 비영리 단체이기 때문에 앞서 경험했던 것과 비슷한 상황을 걱정할 필요도 없고 갱신 방법이 간단하다는 점에서 선택하게 되었다. 심지어 대부분의 문서가 한국어로 번역도 잘 되어 있기 때문에 누구나 손쉽게 사용할 수 있을거라 생각한다. 발급 https://letsencrypt.org/getting..

Development/DevOps 2023.05.20
[Spring] /actuator 엔드포인트에 인터셉터 적용 문제

Intro 사이드 프로젝트에 actuator 를 적용해보았다. 그런데 /actuator 경로를 그냥 오픈하고 싶지는 않았는데, 마침 기존에 관리자 페이지 접근 권한 부여를 위해 사용하던 인터셉터가 하나 있어서, actuator 엔드포인트에 등록 해 두고 그대로 사용하면 되겠다 싶었다. 아래 코드는 기존의 인터셉터 등록에 관련된 코드. @SpringBootApplication(exclude = [UserDetailsServiceAutoConfiguration::class]) @EnableJpaAuditing @EnableScheduling class DutyparkApplication( private val authService: AuthService, private val jwtConfig: JwtCon..

Programming/JPA ⁄ Spring 2023.05.15