본문 바로가기

Java22

함수형 파라미터를 두번 전달하는 이슈 정리 PR 리뷰를 하다 함수형 파라미터를 두 번 전달하는 코드를 만났다. 처음보는 패턴이라 코드가 어렵게 느껴졌다. 그래서 핵심부분을 재구성해서 정리했다. 재구성한 코드를 먼저 살펴보자. channel 안에는 여러개 room 이 존재하고 다시 room 안에는 여러명의 user 가 존재한다. 그래서 총 user size 는 room 갯수 X user 갯수가 된다. @Value @Builder public class ChannelRequest { @Valid List rooms; @Value @Builder public static class RoomRequest { @Valid List users; } @Value @Builder public static class UserRequest {} public int.. 2022. 1. 5.
날짜 포맷 하위호환(기록용) java.util.Date 객체를 활용해 Date 객체를 생성하면 기본적으로 출력되는 날짜 형식은 아래와 같다. Tue Jan 04 18:03:23 KST 2022 레거시 프로젝트 로그 포맷의 날짜 형식이 위와 같았고, 신규 프로젝트에서도 로그 포맷을 똑같이 맞춰줘야 했다. 왜냐하면 해당 로그를 모니터링하는 부서가 따로 있고 로그를 파싱해서 분석하는 툴을 갖고 있는데 내부적으로 툴 수정이 어려운 상황이었다. 신규 프로젝트에서는 Date 대신 LocalDateTime 과 DateTimeFormatter 를 사용해서 하위호환을 맞췄다. LocalDateTime .of(2022,1,4,18,3,23) .atZone(ZoneId.of("Asia/Seoul")) .format(DateTimeFormatter.of.. 2022. 1. 4.
Commands and Events(Design Principles of Reactive Systems) Chapter1 에 이런 글이 있다. "With Reactive, you put the notion of events at the core of your system." reactive 프로그래밍을 통해 reactive 한 시스템을 만드는 것은 event driven 이 되는것과 관련이 있다. Commands and Events 먼저 commands 와 events 차이에 대해서 논의해보자. 이 두개는 핵심적인 기본 개념이다(fundamental). Commands 모든 시스템은 명령(commands)을 내린다. 명령(commands)은 사용자가 수행하고자 하는 action이다. 대부분의 HTTP 기반 API들은 클라이언트가 요청하는 명령(commands)을 전달한다. 여기서 action이 아직 수행되지.. 2021. 12. 22.
slf4j error log 포맷 String 문자열을 Integer 로 바꾸면 NumberFormatException 이 발생한다. 문제가 되는 변수 s 와 예외인 e 를 에러로그로 같이 출력하고 싶다면 아래처럼 만들 수 있다. String s = "Hello world"; try { Integer i = Integer.valueOf(s); } catch (NumberFormatException e) { logger.error("Failed to format {}", s, e); } 그런데 해당 error 메서드 인자를 보면 String var1, Object var2, Obejct var3 다. 즉 exception 파라미터가 Object로 받게 된다. package org.slf4j; public interface Logger { .. 2021. 11. 17.
The synchronous communication drawback(timing) 시간은 종종 잘못 이해되는 이슈다. 두대의 컴퓨터가 통신하고 메세지를 교환할 때, 네트워크를 자연스럽게 신뢰하고 문제 없다고 가정한다. 그런데 만약 통신이 실패하다면? 실패를 전파(propagate)하거나 재시도(retry) 하도록 준비가 되어 있어야한다. 일반적으로 MSA 기반에서 서버 간 통신은 동기식(synchronous) HTTP 를 사용한다. 요청을 보내고 응답을 기다린 후 다음 실행을 계속한다. 동기식 호출은 추론하기 쉽다. 코드를 순차적으로 만들고 하나씩 실행시킨다. 하지만 동기식은 덜 고려되고 자주 오해를 불러일으키는 coupling 형태중 하나인 time-coupling 으로 이어진다. 여기서 파생되는 불확실성과 coupling 에 대해서 알아보자. 동기식으로 요청을 보낼 때 아래 3가지.. 2021. 11. 12.
Mono.defer 스택오버플로 글을 보면 Mono.defer 는 defer 안 코드를, 선언 시점이 아닌 실행 시점에 동작하게 해준다. 그래서 나는 한 context에서 여러번 subscribe 할 때 필요하겠구나로 이해했다. 하지만 그렇지 않은 상황에서도 defer 를 만나게 됐고 처음엔 왜 사용했는지 이해가 안됐다. 이해를 위해 아래 코드를 보자. id를 파라미터로 받아 Data를 얻어오는 메서드다. defer를 사용 안한다면 아래와 같이 switchIfEmpty 에 넣을 Mono를 따로 선언해야된다. 그래서 캐시에 값이 있으면 switchIfEmpty 를 실행 안시킴에도 항상 this.apiClient.getDataNoById(id) 메서드가 수행된다. // Mono.defer 사용 안한 코드 public Mono .. 2021. 11. 11.