본문 바로가기

전체글138

DB mid 정리 logical data independence 에 대한 설명으로 적합하지 않는 것은? 1 1) Concerned with internal schema (v) 2) Concerned with conceptual schema 3) It is mainly concerned with the structure or changing the data definition 4) Modification at the logical levels is significant whenever the logical structures of the database are changed Conceptual schema 에 대한 설명으로 적절하지 않는 것은? 4 1) 전체적으로 통합된 데이터 구조이다. 2) 해당 기관이 필요로 하는 모든.. 2023. 4. 16.
EDA 에서 NullPointerException 조심하기 spring application 내부에서 메세지를 직접 주고받지 않고, event 기반으로 kafka 를 통해 메세지를 주고받는다면 NullPointerException 을 특히 신경써야한다. 아래 그림은, onStartOrder 에서 주문이 시작되서 포인트적립 Command message를 kafka 에 발행하고 onReservePoint 에서 포인트적립 Command message 를 받아서 처리하는 프로세스다. 포인트적립 Command message 에는 pointReserveDto 가 담겨있다. 스펙이 변경되서 새로운 필드가 필요해졌다. 그래서 newObject 를 만들어서 추가로 전달해주고, 포인트적립을 수행하는 onReservePoint 에서 get 해서 사용하게 수정하고 배포했다. 여기서 .. 2023. 4. 15.
java stream 으로 Map 다루는 방법 이전글 에서 java stream 으로 Grouping 하는 방법을 설명하면 중간에 map 을 이용하는 방법을 공유했다. 이 글에서는 다른 예제로 설명을 해보려고 한다. 먼저 product 와 item 구조는 아래와 같다. product 안에 item 들을 리스트로 가질 수 있다. @Value @Builder public class Product { long productId; List items; @Value @Builder public static class Item { long itemId; } } 외부 api 를 호출해서 여러개의 product 들을 가져온다고 해보자. 이때 item 을 다루기 위해선 이중 for 문이 필요하다. product 도 여러개인데 각 product 마다 item 들도 여.. 2023. 4. 6.
자기만의 트랙 예전에 인상깊게 읽었던 페북 글이 있었다. 회사 네임벨류가 내 실력이 아님을 꼬집는 글이었다. 나는 네이버라는 회사를 다닌다고 안주한적 없고 꾸준히 공부하며 나를 발전시켜왔다. 그럼에도 부족함을 계속 느껴 2년간 개인 수학과외도 받아보고, 새로운 팀으로 옮겨보는 등 다양한 경험들을 시도했다. 그래서 페북 글을 읽었을 때, 회사 간판에 취해있지 않았다는 자부심?은 있었다. 그러나 '나의 일을 나만의 언어로 설명' 할 수 있냐는 질문엔 자신있게 대답하지 못했다. 그래서 그때부터 더 열심히 회사에서 경험한 것들을 블로그에 정리하고 기록하고 있다. 정해진 기한을 맞추기 위해 빠르게 일을 쳐내다 보면, 전체를 보고 또 비즈니스 임팩트와 구조를 보면서 일하는것을 놓치기 쉽기 때문이다. 그리고 한번 정리한것으로 끝.. 2023. 3. 27.
DID 스터디 3회차(kotlin let/run/also/apply/with) DID 안드로이드 앱개발을 위해 kotlin 을 다시 공부하는 중이다. let 확장함수 코드를 보고 이전에 배웠던 let/run/apply/also/with 들을 다시 정리했다. 그전에 코틀린에서 많이 보이는 함수 패턴 중 하나를 간단히 살펴보자. 아래 func 함수는 두개의 인자를 받는다. 1. Int 타입의 age 2. Int 를 받아 Unit 을 리턴(Void 리턴) 하는 process(함수 타입) process 변수에 담길 함수는 전달받은 age 만 출력하는 단순한 로직이지만 확장성 있는 구조를 보여준다. preProcess 와 postProcess 를 계속 재활용하면서 process 부분만 새롭게 바꿀 수 있다. @Test fun test1() { // 코틀린에서 많이 보이는 패턴 func(34.. 2023. 3. 18.
WebClient 인코딩 중복 이슈 이전글 에서 WebClient 인코딩 중복에 대해서 한번 다룬적 있다. 간단히 요약하면, uriBuilder 를 이용해서 만들면 이미 인코딩된 query string 값을 또 인코딩 해서 이중 인코딩 한 결과가 나온다. 그래서 미리 인코딩 할 필요가 없다. // 아래처럼 만들면, 최종 request 는 이중 인코딩된 결과로 보내진다. this.webClient .get() .uri(uriBuilder -> uriBuilder .path("/api") //.query("name=양봉수") .query("name=%EC%96%91%EB%B4%89%EC%88%98") .build() ) .retrieve() 그런데 query string 이 json 일때는 미리 인코딩 해야만 한다. 안하면 에러가 발생한다... 2023. 3. 13.