본문 바로가기

[Project] 프로젝트 삽질기52 (feat 검색 로그 구축 2) 들어가며 저번 글에서 검색 로그 구축을 위해 필요한 사전 지식을 정리했다면, 이번 글에서는 검색 로그 구축을 어떻게 할 수 있는지와 관련된 내용을 정리해보려 합니다. 바로 시작하겠습니다. Kinesis Streams 데이터 수집 아키텍처는 위와 같이 구성했습니다. 그럼 먼저 Kinesis Streams, Kinesis Firehose를 구축하고, EC2에 연결하여 데이터를 전송하는 부분에 대해 알아보겠습니다. 먼저 AWS에서 검색창에 Kinesis라고 검색하여 들어가면 위와 같은 화면이 나올 것입니다. 여기서 데이터 스트림 생성 버튼을 클릭합니다. 그 후 data stream 이름을 설정합니다. 저는 검색 로그를 저장할 것이기 때문에 search_log라고 입력하고, 용량 모드는 온디멘드를 선택했습니다...
[Project] 프로젝트 삽질기51 (feat 검색 로그 구축 1) 들어가며 육아크루 서비스가 고도화되면서, 검색 기능을 통해 동네 육아 친구를 찾고 싶어 하는 고객들이 늘었습니다. 고객이 서비스 이용에 불편함을 겪지 않도록 검색 기능을 구현해야 했습니다. 검색 기능을 구현하면서 만약 유저들이 검색 기능을 어떻게 사용하는지 분석할 수 있다면, 유저들에게 더 좋은 서비스를 만들 수 있겠다고 판단했습니다. 이를 위해 실시간으로 저장되는 검색 로그 데이터를 수집하고 저장, 가공, 분석하고 시각화하는 단계를 구축하여 팀 내에서 데이터 드리븐하게 의사결정할 수 있도록 구성했습니다. 이번 글을 시작으로 로그란 무엇이며, 팀에서는 어떻게 로그 데이터를 수집하고, 분석하며, 시각화하는지에 대한 과정에서 겪은 삽질의 경험이 담긴 글을 정리하려 합니다. 로그 고객에 대한 새로운 인사이트를..
[회고] 2023년 상반기 - 친절한 자세를 흩뜨리지 않도록 들어가며 가끔 당신으로부터 옛이야기를 듣습니다. 당신의 자식이 열이 끓어올라 병원에 가야 하는데, 당장 병원비가 없어 이웃들에게 돈을 빌리러 다니셨다는 이야기. 당신의 자식이 집에 친구들을 데려왔는데, 집이 너무나도 좁아 친구들의 표정이 좋지 못한데도 당신의 자식은 누구보다 밝게 웃고 있었다는 이야기. 누군가 당신의 자식에게 가장 좋아하는 음식이 무엇이냐고 물을 때면, 맛있는 음식을 먹어본 적이 없어 '계란프라이'라고 말했다는 이야기까지. 당신은 늘 과거의 이야기를 모두 마무리 지을 때쯤이면, 어렵지만, 바르게 성장해서 고맙다는 이야기를 전했습니다. 고맙다는 이야기는 당신이 들어야 하는데, 당신은 늘 먼저 고맙다고 이야기합니다. 참 신기하게도, 당신은 아무리 힘들어도 홀로 사는 어르신을 위해 음식을 나누..
[일기장] 작별할 수 있었다면 개발자라는 꿈을 이루기 위해서는 치열하게 공부해야 했다. 공부에 더 많은 시간을 쓰기 위해, 친하게 지냈던 이들과 모두 연락을 단절했다. 물론 당신도 예외는 아니었다. 당신이 내게 했던 연락 모두 냉정하게 무시했다. 당신의 부고를 접했을 때, 슬픔보단 걱정이 앞섰다. 수중에는 돈 한 푼 없이 공부만 하던 상황에서 조의금을 어떻게 내야 할까 고민이 먼저 들었다. 수중에 있던 돈을 다 끌어 모아서 조의금을 냈을 때, 적어도 사람 구실은 했구나 싶어 안도감이 들었다. 그렇게 친구 곁에서 마지막 식사를 하고 집에 돌아오자 그때부터 슬픔이 밀려왔다. 시간이 갈수록 자책감이 들었다. 아무리 공부를 열심히 했더라도 분명 당신 얼굴 한 번은 볼 수 있는 시간은 있었을 것이다. 같잖은 핑계 때문에 소중한 당신을 만나 그..
[Project] 프로젝트 삽질기50 (feat PostgreSQL 검색) 들어가며 NestJS와 TypeORM을 활용하여 프로덕트를 만들고 있습니다. 특정 유저를 멘션 하는 기능을 만들기 위해, 특정 유저의 닉네임을 검색하는 시스템을 구축해야 했습니다. 검색 시스템을 구축하기 위해 ElasticSearch를 활용하여 검색 기능을 개발하고 싶었습니다. 하지만 개발 마감 기한이 촉박했고, 대량의 데이터를 검색하는 시스템이 아니었기 때문에, 당장 ES 구축을 하는 것은 오버 엔지니어링이라 판단했습니다. 오버 엔지니어링하지 않으면서 보다 빠르고, 안정적으로 검색 시스템을 구축하려면 어떻게 해야 할까 고민하면서 postgresql로 full text search를 구현했습니다. 이번 글은 PostgreSQL을 활용한 검색 시스템 구축 과정과 전략 패턴을 활용한 코드 구성 과정에서 겪은..
[Project] 프로젝트 삽질기49 (feat 전략 패턴 활용) 들어가며 NestJS와 TypeORM을 활용하여 프로덕트를 만들고 있습니다. 비즈니스 로직을 구성하는데, if else if 문이 계속해서 추가되다 보니 코드의 가독성이 좋지 못한 문제가 발생했습니다. if - else 문을 개선하기 위해 노력하면서 전략 패턴에 대해 알 수 있었습니다. 이번 글은 전략 패턴을 NestJS에 적용하기 위해 노력하면서 작성된 글입니다. 요구 사항 분석 유저를 멘션 할 수 있는 기능을 개발해야 했습니다. 멘션 기능을 구성하기 위해선, 먼저 유저 닉네임 검색 시스템을 개발해야 했습니다. 예를 들어 "@검색어"를 입력했을 때, 검색어와 관련된 유저의 닉네임의 목록들이 노출되어야 했습니다. 만약 검색어를 포함하지 않고, "@"만 입력했을 경우엔, 한 번이라도 검색했던 유저들의 닉네..
[Project] 프로젝트 삽질기48 (feat 전략 패턴) 들어가며 NestJS와 TypeORM을 활용하여 프로덕트를 만들고 있습니다. 비즈니스 로직을 구성하는데, if else if 문이 계속해서 추가되다 보니 코드의 가독성이 좋지 못한 문제가 발생했습니다. if - else 문을 개선하기 위해 노력하면서 전략 패턴에 대해 알 수 있었습니다. 이번 글은 전략 패턴에 대해 공부하고, 전략 패턴을 적용하기 위해 노력하면서 작성된 글입니다. If문의 증가 API를 개발하면서, 기획의 요청이 들어오면 API의 동작 방식을 계속해서 변경해야 했습니다. if문을 사용하여 API 동작을 제어했는데, 추가적인 조건들이 계속해서 들어올 때마다 if-else if 문이 점점 쌓여가는 문제가 발생했습니다. 예를 들어 조종석 Class에서 조종석의 종류에 따라 방어력이 바뀐다고 가..
[Project] 프로젝트 삽질기47 (feat TypeORM IN 커스텀 정렬) 들어가며 NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. TypeORM을 활용하여 IN Query를 구성하면서, 데이터를 특정 순서에 맞게 정렬해서 조회해야 하는 상황이었습니다. 어떻게 하면 데이터를 특정 조건에 맞게 순차 조회할 수 있을지 알아보다 커스텀 정렬에 대해 알 수 있었습니다. 커스텀 정렬을 활용한다면, 특정 순서에 맞게 정렬된 데이터를 조회할 수 있었습니다. 그럼 TypeORM에서 커스텀 정렬은 어떻게 구성할 수 있는지 알아보겠습니다. array_position array_position은 PostgreSQL에서 제공하는 내장 함수 중 하나입니다. array_position 함수는 아래와 같은 문법을 가집니다: array_position(array, ..
[Project] 프로젝트 삽질기46 (feat Time Zone) 들어가며 도메인 별로 서버를 분리해서 프로젝트를 운영하고 있습니다. 특정 도메인 서버에서 created_at 데이터를 조회할 때 시간 데이터가 제대로 출력되지 않는 문제를 겪었습니다. 알고 보니, created_at 컬럼이 timestamp without time zone 타입이었기에 발생한 문제였는데요. PostgreSQL을 활용할 때 시간 데이터가 왜 제대로 출력되지 않았는지, timezone 설계를 어떻게 해야 하는지 파악해보고 싶었습니다. 이 글은 Postgres의 Time Zone에 대해 공부하며 작성됐습니다. timestamp vs timestampz TypeORM을 활용하다 보면, CreateDateColumn 데코레이터를 활용하곤 하는데요. postgres를 활용하다 보면, type으로 t..
[Project] 프로젝트 삽질기45 (feat Date) 들어가며 날짜와 관련해서 아리송한 것들이 많았습니다. DB의 createdAt 컬럼 데이터를 조회했을 때 '2023-02-13T11:57:33:05.442Z' 라고 출력된다면 여기서 Z는 무엇인지, UTC는 무엇인지 정확하게 알지 못했습니다. 심지어 Javascript의 Date는 불변이 아니라는 이야기를 종종 들었는데, 불변이 아닌 게 어떤 문제가 있는 건지 알 수 없었습니다. 이번 기회에 Date에 대해 정리해 봐야겠다고 생각했습니다. 이 글은 Date에 대해 공부하며 작성됐습니다. Date 자바스크립트로 알고리즘을 공부하다 보면, Date Type을 활용하는 문제가 꼭 한 문제씩 나옵니다. 문제를 풀기 위해 Date 객체 중에서 이런저런 메서드를 잘 조합하다 보면 원하는 데이터를 얻을 수 있는데, ..