오늘은 좀 많이 재밌었다. 자료구조를 이용해서 해결하게 될 줄이야..
어제 밤에 추가 배포를 진행했다.
덕분에 오늘 오전부터 밤까지 이슈가 아무것도 없었다 ^-^
그래서 점심에 핫픽스 배포함
하하 젠장
운송장 출력하는 로직을 짜던 와중, 요구사항이 들어와서 그것을 적용해보기로 했다.
기존에는 숫자열을 받아서, 한개씩 반복문이 돌아가는 것으로 구현을 해놨다.
왜냐하면 TypeORM이 벌크업데이트가 안된다(...)
6번같은 경우는 그냥 where구문에 IN(운송장 번호 배열)을 넣으면 동일하게 출력 여부만 true로 변경해주는 것이라 괜찮았는데....
출고 정보마다 운송장의 개수가 다르다보니, 저 방식으로 업데이트를 못하더라.
사실 저거때문에 한번에 getMany()를 사용해서 다 긁어오는 것을 포기했는데;
그래서 계속 고민을 하다가, 이거 Map 자료구조를 쓰면 되겠다! 라는 생각이 들었다.
나중을 위해서라도 자료구조를 썼어야했다.
왜냐하면 운송장 프린터의 문제로 52/100에서 운송장 출력이 끊겼다면?
53부터 출력을 할 수 있어야하는데, 무조건 데이터베이스를 거쳐야만 출력을 할 수 있다보니 뭔가를 남겨놔야한다.
그리고 그 뭔가를 map에 담아놓고 Redis에 잠시 캐싱을 해놓는 것으로 나중에 구현을 해볼 예정이다. (지금은 바빠서 못하고)
그럼 어떻게 작성하는게 좋을까, 하다가 내가 과거에 문제를 풀었던 것이 생각났다.
그 당시 이 문제가 너무너무 어려워서 2일 내내 고민하다가 결국 못풀고 다른 분들의 블로그를 보고 그것으로 포스팅을 했었다.
근데 기억이 정말 강렬하게 남았는지 그냥 제목이 기억나더라(....) 무려 7개월 전에 적은 글임에도 말이다
그래서 array.map을 순회하면서
미리 new Map으로 선언을 해놓고 아래처럼 코드를 짜놨다.
if (!dataMap.get(val.id)) {
dataMap.set(val.id, { datas: val.data });
} else {
dataMap.get(val.id).datas.push(val.data);
}
운송장번호 같은 것은 여러개가 들어갈 수 밖에 없다보니 배열의 형태를 가지고 있어서 좀 골치가 아팠는데
dataMap.set(val.id, dataMap.get(val.id).datas.push(val.data));
이런식으로 짜보려고 했더니 계속 안돼(...)
그래서 그냥 push로 밀어넣었더니 데이터가 잘 들어가더라?(당황함)
아무튼 그래서 맵 내부를 보니 내가 원하던 것처럼
한개의 출고정보에 출력된 여러개의 운송장번호 배열
이 한개의 객체로 여러개가 담겨있는 것을 구현할 수 있었다.
평소에는 써보지 않았지만, 뭐랄까 아. 이거면 어떻게든 할 수 있을 것 같은데? 라는 생각이 들었는데
정말 됐다(좀 짜릿했음)
조만간 회사에 도입할 스택이 정말 많다.
사실상 확정인 스택은 ELK와 Redis
현재 가능한지 확인 중인 것은 GraphQL과 Prisma다.
모두 다 내가 제안하고 열심히 사유를 만들었다(?)
그 중 엘라스틱서치는 내가 이번 주말에 작업을 좀 해볼 예정이다.
바로 우편번호를 획득하기 위하여 외부 API에 의존하는 것에 문제가 발생해서 그런데
이것을 아예 자체적으로 DB를 구성하는게 좋겠다는 생각이 들던차, 우체국에서 해당 정보를 제공해주는 것을 확인했다.
https://www.epost.go.kr/search/zipcode/cmzcd002k01.jsp
그래서 내가 하고 있는 생각은
해당하는 데이터를 MySQL에 꽂아넣은 다음에
Logstash로 데이터를 전처리하고 Elasticsearch에 모든 정보를 적어넣는다.
그 후 사용자가 입력한 주소를 기반으로 유사도 쿼리
를 사용해 우편번호를 가져오는 것이 현재의 목표다.
이거 주말에 해볼거임ㅎㅎ; 생각만 해도 재밌을 것 같아서 얼렁 주말이 되면 좋겠다.
내일은 NestJS Meetup에 가는 날이라서 조금 기대된다.
사람 참 적은데...여기서 만날 수 있다니!