본문 바로가기

Programing/OpenSource

(55)
메시지 템플릿 방식 및 구현 기술 조사 존 벤틀리의 생각하는 프로그래밍(원서명: Programming Pearls)의 컬럼3에 "폼 레터 프로그래밍"이 있다.일종의 메시지를 구성하는 템플릿에 대한 이야기이다.2022년 메시지 발송 관련 개발을 하면서 메시지 템플릿을 어떻게 할지 조사한 적이 있었다. 결과적으로는 "{{ mustache }}" 형태로 변수를 치환하는 Moustache 문법 방식을 채택했다.비개발자들도 템플릿 문법에 거부감없이 사용할 수 있어야 했던 것이 가장 큰 이유였다.기존의 마케터 분들이 사용하는 Braze의 Webhook Templates과 유사했기에 추가적인 학습 비용을 낮출 수 있었기 때문이다.물론, {% Directives %} 를 사용하기도 한다.구현체로는 Pebble Templates을 사용했다. Java, Kot..
[JobRunr] 지연된 작업 기능으로 문자 메시지 상태 조회하기 2022년 8월 진행했던 프로젝트 중에 문자 메시지 발송하는 기능이 있었다.백오피스를 이용하는 직원들은 문자로 고객과 커뮤니케이션을 하는 일이 있었다.자주 사용하는 문구 기능과 더불어 시스템을 통한 메시지 발송 기능으로 시간 비용을 줄일 수 있었다.상태 조회문제는 문자 메시지 발송 후 상태 조회를 하는 방식이었다. 문자 메시지는 서드파티를 통해 수행했는데 1) 폴링 방식과 2) 콜백을 받는 방법 의 크게 두 가지 모두 제공하고 있었다.문자 메시지는 발송 즉시 상태는 곧바로 알 수 없었고 수초 이상 걸릴 수 있었다.따라서 언제 상태가 제대로 되는지는 알 수 없기에 후자 방식이 바람직했다. 하지만 콜백을 받기 위해서는 외부에서 훅(hook)을 줄 수 있는 인터페이스를 준비해야 했다.인프라적인 지원이 필요했는..
[JobRunr] 시작하기 요약1. https://start.spring.io/ 에서 의존성은 Spring Web만 선택하여 생성2. JobRunr 의존성 추가3. Spring Data JPA, H2 의존성 추가4. JobRunr 대시보드 켜기5. 지연된 작업 수행 수행진행 배경주기적으로 수행하는 작업이나 특정 시간을 두고 동작하는 작업은 스프링 스케쥴러이나 스프링 배치로 구현이 가능하다.하지만 스프링 배치는 배치 처리 작업을 지원하는 강력한 프레임워크라는 장점이 있지만, 초기 테이블 구성 등의 다양한 설정이 필요하고 배치 작업을 처음 접하는 개발자에게 학습 곡선이 있다는 단점도 있다.반면 스프링 스케쥴러는 기존 환경에 간단하고 쉽게 구성을 할 수 있다는 장점이 있는 반면, 2개 이상의 인스턴스가 있는 분산 환경에서 적용할 경우 ..
SimpleR2dbcRepository 를 사용한 R2DBC 학습 계기: Spring Tips: Reactive Summit Keynote: Here and There → Spring R2DBC + MySQL 회사에서 WebFlux 를 사용하여 프로젝트가 되어 있었다. Redis는 ReactiveRedisTemplate 을 사용하여 작성이 되어 있었으나, RDBMS는 jooq 를 이용하고 있었는데 ExecutorService 를 이용해서 CompletionStage 로 바꾸고 Mono.fromCompletionStage 로 래핑을 사용하는 형태로 구성이 되어 있었다. R2DBC를 이용하면 ReactiveRedisTemplate 를 사용하는 것처럼 Mono 나 Flux로 바로 받을 수 있으니 좀 더 편하게 사용할 수 있을까 생각했는데 Spring Data R2DBC 드라..
Electron ≥ 12.x : 컨텍스트 분리(Context Isolation) 3년전에 둘째 출산 휴가 때 진행했던 serami 프로젝트를 얼마 전에 다시 보게 되었다. 이메일 인증을 개발하면서 템플릿의 결과를 확인하게 위해 사용을 했는데 개발한지 오래되었다보니 Github에서 버전 업데이트에 대한 경고를 그 동안 지속적으로 받고 있었다. 라이브러리 업데이트를 하고나서 보니 "Uncaught ReferenceError: require is not defined" 에러가 발생했다. 에러의 부분을 찾아보니 리액트를 bootstrap 하는 부분인 require 이라는 부분에 문제가 발생하였다. 일단 찾아보니 Electron 12 부터 Context Isolation 이라는 것이 활성화 되었고 Renderer Process 에서 수행할 수 있는 것들이 제한이 생겼다. stackoverfl..
Mockito use case 이미 잘 정리가 되어 있어서 링크로 대신... Mocking Exception Throwing (Baeldung)
[eclipse] Runnable JAR File 구현은? 자바 카페에서 아래와 같은 질문이 올라왔다. 질문 이클립스에서는 아래와 같이 프로젝트에서 Export로 Runnable JAR 파일을 만들수가 있습니다. 이것을 CMD 창에서 만드려면 어떤 명령어를 입력해야 하나요? 라이브러리 JAR도 포함시킬 때 추가 명령어 입력하는 부분도 궁금합니다. 생성된 JAR 파일에는 META-INF가 자동으로 포함되어 있는데요, CMD 상에서 JAR 파일 만들때에는 MAINFEST.MF 파일이 반드시 있어야 하나요? 느낌은... 일단 질문 자체를 듣고 느낀 점은 IDE의 장점이자 단점을 느낄 수 있었다. 통합개발도구(IDE)는 개발시에 코드입력 뿐만 아니라 컴파일 등의 반복적으로 하는 것과 디버깅, 리팩토링 등 여러가지를 도와준다. 만약 자바를 명령어부터 시작했더라면 컴파일 ..
[Lombok & Spring (Jackson)] @Getter(lazy=true)를 쓸 때 주의해야 할 점 효진님이 getter 에서 매번 객체를 만드는 것에 대해 이유를 물어봐서 한 번만 만들어지게 하기 위해서 아래와 같이 lazy 를 true로 했다. import lombok.Getter; public class TistoryIssueParams { @Getter(lazy = true) private final TistoryNumber tistoryNumber = TistoryNumber.of(tistoryNumberType, tistoryNumberValue); 이런 식으로 annotation을 달면 lombok은 AtomicReference 로 필드를 만들고 늦은 초기화를 하는 코드를 만든다. 늦은 초기화를 Double-checked locking idiom을 사용하는 것을 알 수 있다. public ..