본문 바로가기

전체 글139

2021 개인 리뷰 2022년이 됐고 회사 평가도 끝난 시점에서 나를 돌아보고 점검하는 리뷰를 가져보고자 한다. 먼저 작년에 팀을 옮겼다. 큰 단위 조직은 같았지만 새로운 팀에서 하는 일과 기술스택은 많이 달랐다. 주니어부터 시니어까지 모두 실력있고 열정적인 팀이고 업무강도가 높았다. 네이버페이 아키텍처 개선 프로젝트는 매력적인만큼 쉽지 않은 도메인이다. 하지만 문제 해결을 위해 단합이 되어 있고 기술 공유가 활발했다. 빠르게 적응하면서도 기술들을 내것으로 만드려고 노력했다. 그래서 업무 후 공부하고 정리한걸 세보니 25개나 됐다. 여러 api 결과 조합(with 비동기) 테스트에서 사용하는 fixture monkey 정리1 테스트에서 사용하는 fixture monkey 정리2 spring requestParam 이슈 정리.. 2022. 1. 30.
프로그래밍 심리학 다른 팀 리더분이 이 책을 선물해 주셨다. 기술적인 내용보다는 프로그래머에 초점이 맞춰진 책이다. 이 책이 유명한 것은 알고 있었지만 그동안 읽어볼 생각은 안했다. 지금도 통하는 주제를 다룬다고는 하지만 40년 세월은 무시할 수는 없는거 같다. 천공카드, 코볼, 포트란 이야기는 이해는 되도 와닿지는 않았다. 와닿지 않으니 재미가 떨어졌다. 지금은 기술 뿐만 아니라 개발 문화도 많이 발전했다. 발전한 만큼 새롭게 생긴 문제들도 많은데 그런 이야기를 다뤘다면 더 재밌었을거 같다. 읽으면서 나에게 도움이 될만한 부분들을 살펴봤는데, 아래 질문들에 대한 내 생각을 정리해보면 좋을 거 같아 이 리뷰 글을 작성했다. 8장 개인의 성격(p293) Q) 프로그래머로 일하는 데 가장 도움이 되는 당신의 성격은 무엇이라 .. 2022. 1. 26.
ObjectMapper 1. serialize/deserialize 이슈 EDA 기반에서 메세지들의 serialize/deserialize 는 특히 더 주의해야한다. 시스템들이 분산 되어 있기 때문이다. 예를 들어 아래 그림 System1 에서 serialize 하고 메세지를 발행하는 로직에서 메세지 관련 객체를 수정했다. 하지만 다른 조직 시스템인 System2, System3 은 배포 타이밍이 다를 수 있고 또 변경 대상이 반영 안되서 consume 하는데 규칙이 안맞으면 장애가 발생할 수 있다. 그래서 objectMapper 관리를 잘 해야 한다. 1-1. FAIL_ON_UNKNOWN_PROPERTIES FAIL_ON_UNKNOWN_PROPERTIES 옵션은 항상 신경써야한다. FAIL_ON_UNKNOWN_PROPERTI.. 2022. 1. 15.
국어영역 독서(비문학) 수능을 준비하던 수험생일 때 나는 국어영역(그시절 언어영역)이 항상 어렵게 느껴졌다. 특히 독서(그시절 비문학) 지문이 어려웠다. 실제로 수능도 언어를 제일 못봤다. 그때의 어렵다는 두려운 감정은 PTSD 처럼 시간이 지나도 계속 남아있었고 극복해보고 싶었다. 그래서 작년 10월 말 EBS 국어 문제집을 샀다. 그리고 매일 출근 전 한 지문씩 풀었다. 12월 중반부터는 회사일로 공부할게 많고 힘들어서 잠깐 습관이 끊겼지만 다시 시작해 오늘 모든 문제를 다 풀었다. 확실히 수능을 준비하던 때보다 아는게 많아져서 예전처럼 문제 난이도에 압도되지 않았다. 하지만 그때도 어렵게 느껴졌던 물리, 화학 같은 과학 기술 지문은 지금도 똑같이 어려웠다. 컴퓨터 과학기술은 그래프 탐색 알고리즘 지문이 하나 나왔는데 디테.. 2022. 1. 14.
nslookup 과 dig 명령어 결과 차이 서버에서 ybs.api.com 도메인으로 http api 를 보내다 connection timed out 에러가 발생했다. errorCode: connection timed out: ybs.api.com.ybs.svc.io.com/10.1.2.3:8080; nested exception is io.netty.channel.ConnectTimeoutException: connection timed out 그런데 에러로그에서 ybs.api.com.ybs.svc.io.com 도메인으로 출력됐고 이해가 안가서 확인해봤다. 먼저 nslookup 으로 ybs.api.com DNS 정보를 확인했는데, ybs.api.com.ybs.svc.io.com 도메인이 DNS CNAME 으로 등록되어 있었다. $ nslookup.. 2022. 1. 12.
kafka transaction(exactly once semantic) kafka transaction 설명에 앞서 kafka 통신을 위한 기본적인 코드부터 설명하려 한다. 테스트 코드에서 EmbeddedKafkaBroker 를 활용해 broker 역할을 대신했다. 그리고 json 데이터를 보내기 위해 objectMapper 를 생성했다. 마지막으로 데이터 전달을 위해 Product 객체를 생성했다. public class KafkaTest { static EmbeddedKafkaBroker BROKER; static final String TOPIC_NAME = "ybs-topic"; ObjectMapper objectMapper = JsonMapper.builder().build(); static { // broker 갯수 1개, 파티션 갯수 1개 BROKER = new.. 2022. 1. 9.
함수형 파라미터를 두번 전달하는 이슈 정리 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.
fixture monkey BuilderGroups 이전 글에서 BuilderGroup 추가에 대해서 제대로 설명하지 않고 넘어가서 따로 정리했다. fun fixtureMonkeyBuilder( objectMapper: ObjectMapper = JsonMappers.OBJECT_MAPPER ): FixtureMonkeyBuilder = KFixtureMonkeyBuilder() .defaultGenerator(JacksonArbitraryGenerator(objectMapper)) .registerGroup(BuilderGroup::class.java) 위 코드 마지막줄에서 registerGroup 에 들어가는 BuilderGroup 클래스를 보자. 아래 코드를 보면 fixture 한개를 셋팅했다. RegisterProduct 객체를 fixture mo.. 2021. 12. 27.
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.
배포된 애플리케이션 git branch/commit 정보 바로 확인하기 먼저 build.gradle 에 플러그인을 추가한다. 이 플러그인은 git branch/commit 정보를 git.properties 파일로 만들어 준다. plugins { id "com.gorylenko.gradle-git-properties" version "2.2.3" } 추가적으로 customProperty 도 넣을 수 있다. 더 자세한 내용은 여기에 있다. gitProperties { customProperty 'ybs.hello', 'world' customProperty "project_version", { project.version } } 컨트롤러에서는 아래와 같이 @Value 애노테이션으로 프로퍼티 git.properties 값을 가져올 수 있다. @SpringBootApplicatio.. 2021. 12. 19.
코틀린 재귀호출 최적화(Tail-Call) 이전 글에서 자바로 꼬리재귀(TCO) 구현을 설명했다. 하지만 내용이 쉽지 않았는데 코틀린은 tailrec 키워드를 제공하면서 가독성 좋게 구현이 가능하다. @Test fun factorialTest() { print(factorial(5)) } tailrec fun factorial(num: Int, acc: Int = 1): Int = when (num) { 1 -> acc else -> factorial(num - 1, acc * num) } 일반 재귀 버전 fun factorial(num: Int): Int { if (num == 1) { return 1 } return num * factorial(num - 1) } 2021. 12. 16.