
개발 동기 유튜브 프리미엄이야 그렇다쳐도, 멜론을 처음 스트리밍클럽에 가입했던게 2010년도 초반쯤이었다. 그때는 분명 3천원이었던걸로 기억하는데... 하기사 체감 물가가 김밥 한줄에 천원하던 시대에서 3~4천원하니 그럴만도 하다 싶지만, 돈을 좀 아껴보고자 멜론 구독을 이제 보내줄 때가 된 것 같다. 가수 - 노래제목 형태의 CSV파일로 파싱해서 soundiiz 로 유튜브 뮤직 플레이리스트를 만들어 줄 수 있다고 한다. 나는 이제 개발자이기도 하니까, 직접 해보기로했다. 오랜만에 셀레니움도 다시 써볼겸 작업을 했는데, 여전히 셀레니움으로 구글 플랫폼을 핸들링하는 데 짜증이낫다. 구글 로그인과정에서 오래 잡아먹어서 한 7~8시간정도 걸렸다. 작업물 GitHub - mag123c/from-Melon-to-..
![[NestJS] Failed to catch error thrown by guard in nestjs in interceptor / guard의 uncaughtException](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FReLfw%2FbtsGwBK2SWb%2FAAAAAAAAAAAAAAAAAAAAAB55ox9YkrWDJJ3irOcqkuhuRTv9XdPiDwL1b6BX0ctj%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DhykiLeEMiLmhgXc4Ngvy7L68MSk%253D)
Guard에서의 uncaughtException 새 프로젝트를 진행중인데, 에러를 캐치하지 못해서 서버가 뻗어버렸다. 바로 본론으로 들어가서, 프로젝트의 에러 핸들링 설계는 아래처럼 구성했었다. 에러 발생 > 인터셉터에서 에러 로깅 및 필요에 따라 WebHook 전송 > 필터에서 클라이언트에 보낼 에러 포맷 정의 이러한 방식의 설계는, NestJS의 요청 응답 사이클과 각 구성요소의 역할에 대해 완전히 이해하지 못했기 때문에 만들어졌다. NestJs req-res lifecycle Interceptor에서 간과한 부분이 있었다. 클라이언트에서 보낸 API 요청이 프로젝트 전역에 설정한 Global Interceptor에서 가로채기 전에 가드에서 에러가 발생했다. 그렇기에 Exception Intercep..
![[NestJS] enum과 literal type 중 어떤걸 사용할까? (feat. Tree-shaking, Template Literal Ty](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbFh5aG%2FbtsFYsHVUJD%2FAAAAAAAAAAAAAAAAAAAAALOutFWN8rHk5w6wTXomzS3yskPG71vS5qgtiy32sbWQ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DotNjZzggXM2DZuU2HHz0NxL%252BaeM%253D)
정확한 정보 전달이 아닌, 여러 좋은 포스팅들을 보며 적용해보고개인의 관점에서의 의견 서술입니다. 여러 피드백들을 적극 환영합니다. 요약트리 쉐이킹(Tree Shaking)은 번들링 시 사용하지 않는 불필요한 코드를 제거하는 최적화 작업을 말한다.프론트에서의 트리쉐이킹은 번들의 크기를 최소화해서 UX의 향상에 목적이 있다고 하지만 백엔드 관점에서의 최적화는 코드의 안정성, 유지보수 등에 초점이 맞춰지고, 프로젝트의 특성과 요구사항과 등을 고려하는 것이 좋다고 생각한다.TypeScript4.1에 추가된 Template Literal Type처럼, 명시된 타입들을 조합하는 복잡한 타입 조합이 필요하지 않을 경우, 이넘을 사용하는 것이 어떠한 이넘 값으로 강제되기 때문에 오히려 더 명확한 의도를 전달할 ..
![[쿼리튜닝 - 2] 사내 조회쿼리 성능의 개선 과정 두번째 이야기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FTTa52%2FbtsFKRPRZvk%2FAAAAAAAAAAAAAAAAAAAAAK1PQNxUuVJjMtyDABcCk9XEJZpAum82CO_xRh1DvJXe%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3D8%252Bjt%252Fk%252FEoUsHli4OQsO7dvf3ey8%253D)
해당 글을 보고 오시면 좋아요 [쿼리튜닝] 신입 개발자의 간단한 사내 조회 쿼리의 쿼리튜닝 여정.발단 계속해서 짧은 주기로 프로젝트를 쏟아내고 있던 와중에 DB연산이 많은 작업을 수행하는 경우가 생겼다. 개발 단계에서 API 자체를 돌리는 과정에서도 1~2000ms가 되어 걱정하고 있던 과정에 Qmag1c.tistory.com 서론팀장님께서 나를 불렀다."집계 함수를 사용해서 요청사항 집계를 하는 SQL문이 있는데 ~~~ 성능 최적화를 좀 할 수 있을까요?" 기존 쿼리를 받아들고 돌려보았다. 기존 상태SELECT YEAR(a.registe_time) AS year, MONTH(a.registe_time) AS month, a.code, count(a.code) AS t..

개선 동기 LogBack 관련 포스팅을 훑던 도중에, 블로그 주인분의 깃 레포를 자연스레 보게 되었다. Shin._.Mallang https://github.com/shin-mallang 충남대학교 컴퓨터융합학부 19학번, 우아한테크코스 5기 BE ttl-blog.tistory.com 오픈소스 기여도 많이하시고 꾸준하신 것 같아서 긍정적인 에너지를 막 받고있는 찰나에, 레포 하나가 눈에 들어왔는데, 1인 개발 프로젝트 레포에서도, issue를 적극 활용하는 모습이었다. 사내 두 서비스의 노드 기반 백엔드를 담당하고 있는데, 1인 개발이라는 같은 상황에서 기존 사내 해당 서비스의 개발 형태를 개선할 생각을 하지 못했던 나 자신을 되돌아보며 개선을 했으면 좋겠다 싶어서 남기는 포스팅이다. 템플릿 작성 이슈 ..
![[로그 분석/시각화 -2] 실제 서비스에 적용해보기(PLG : Promtail / Loki/ Grafana)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FmJLW1%2FbtsFF8iy8yz%2FAAAAAAAAAAAAAAAAAAAAABywronp5gt5abafhIDlNrLHDnfb5RxKa5et6wG4RhB_%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DhhbCm%252Fej%252FfXKfjQGCrr5xDTfvUs%253D)
이전글과 이어집니다. [로그 분석/시각화 - 1] 기존 로그 관리의 문제점과 PLG로 로그 시각화 구현해보기 (Promtail, Loki, Graf 개발 동기 현재 사내 서비스들에 대한 로그는 winston으로 날짜별/레벨별로 관리되고 있다. nest-winston A Nest module wrapper for winston. Latest version: 1.9.4, last published: 6 months ago. Start using nest-winston in your pro mag1c.tistory.com 프로젝트의 빌드 프로세스 변경 우선, 프로젝트 배포 시 프로젝트 내부에서 docker-compose를 이용해서, 로키와 프롬테일 모두 빌드시켜주고 있는 기존 프로세스가 잘못됐다고 판단했다. ..
![[Grafana Loki] Data source connected, but no labels received. Verify that Loki and Promtail is configured properly](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fbls1Oy%2FbtsFFKvo7Jv%2FAAAAAAAAAAAAAAAAAAAAAGT3i4ambc4p5GfPLOsXELJBQt6W-mmmqPeBEbWZ_IDM%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DNqntyVIcAKshrEuS0gvfHucBj4I%253D)
에러 원인 라벨 설정 시 설정했던 라벨이 존재하지 않음. 이는 로키는 제대로 연결되었지만, 로그 파일을 제대로 프롬테일에서 받아오지 못했음을 의미한다. 본인의 경우는 프로젝트의 도커컴포즈 볼륨 설정에서, 경로가 제대로 작성되지 않아 망운트가 제대로 되지 않았음. 걸린 시간 3시간 남짓 에러 해결 프로젝트의 로그생성 docker exec -it containerName /bin/sh 프로젝트 내부에서는, 루트 경로에 logs폴더 내부에서 날짜, 에러레벨에 맞게 분기처리를 하여 로그를 생성했다. 호스트 서버에서, 위 명령어를 통해 컨테이너 내부로 진입하는데, 진입하자마자 logs경로에 로그가 잘 들어오고 있길래 당연히 잘 동작할거라 생각했지만 그라파나에서 로키의 ip:port로 커넥션을 연결하는 과정에서 계..
![[sendbird - 3]사내 서비스 샌드버드 도입기 (feat.처음 그려보는 시스템 아키텍처 구성도)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fbso4MF%2FbtsFkVFQNWp%2FAAAAAAAAAAAAAAAAAAAAAFiipjulp36EYh6kMqS4IuGOdTcBKZYzMc7fofMcQNI9%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DPwCT7Z%252Bb9XEXps1cRsrGEeHj72c%253D)
[sendbird - 1]샌드버드 chat의 사내 도입? api 사용해보기 / Next + Nest 서론 현재 근무하는 회사 서비스의 웹 소켓 기반의 채팅 기능이 전반적으로 하자가 많아서 카카오톡이나 다른 여러 채팅 API를 끌어다가 사용하자는 의견이 나오고 있고, 실제로 11월 초에 한번 mag1c.tistory.com [sendbird - 2]샌드버드 chat 도입에 대한 고찰 서론 지난 글과 이어서 작성해본다. [sendbird - 1]센드버드 chat의 사내 도입? api 사용해보기 / Next + Nest 서론 현재 근무하는 회사 서비스의 웹 소켓 기반의 채팅 기능이 전반적으로 하자가 많아서 카 mag1c.tistory.com 도입 결정 장장 10월말부터 시작된 도입에 대한 얘기가, 일정이 밀리..