
배경최근 몇 차례의 코드 리뷰 경험들로 공유하는 문화가 얼마나 큰 이펙트가 있는지 경험할 수 있었다. 하지만 현재 조직에서는 홀로 서버 개발을 진행하다보니 내가 작성하고 있는 코드가 과연 좋은 방향으로 나아가고 있는 것인지 혹은 구조적이나 가독성 등 좋은 코드를, 올바른 설계를 하고 있는 것일까? 라는 의구심이 생겼다. 또한, 여러 번 기술 면접을 다녀왔는데 많은 조직에서 내부적으로 소나 큐브를 정적 코드 분석 도구로 활용하고 있었다.소나큐브를 통해 받을 수 있는 코드 리뷰를 통해 코드 품질 향상과 더불어, 코드 일관성 등의 컨벤션도 정립하고자 도입하게 되었다. 설치 Installing from Docker | SonarQube DocsExplains how to install the SonarQub..

[NestJS] 의존성 제어 1 - 레이어간 의존성 낮추기(Layered Architecture)최근 인프랩 면접에서 얻게 된 코드 리뷰를 통해 현업에서 사용하고 있는 코드들에 대해 되짚어 보고 있다. 값진 경험을 통해 메타인지를 할 수 있게 되었고, 오답이라고 생각하는 부분에 대한 mag1c.tistory.com 1편의 연장선으로, 실제 기술 면접의 코드 리뷰에서 mysql2에 의존적인 코드를 어떻게 변화에 유연하게 만들것이냐는 질문을 받았다. 레이어간 역할을 명확하게 하는데 그치지 않고 데이터베이스에 엑세스하는 레이어를 두 단계로 나눠서, 레포지토리 레이어는 단순 쿼리 실행 레이어로 인프라 레이어를 데이터베이스와 연결하는 레이어로 두어 인프라 레이어만 교체하게끔 할 수 있다고 생각했다. ORM, DB..

전환 이유레퍼런스들을 찾아보면, 대부분이 PM2를 통해 간편하게 인스턴스를 띄워 사용하다가, 컨테이너 단위로 전환하고 노드 환경에서는 추가로 pm2-runtime을 도커 컨테이너 내부에서 적용하는 경우를 많이 봤던 것 같다. 나는 반대로, 현재 운영중인 서비스를 계속해서 개발하면서 겪은 문제들을 개선하기 위해 배포 파이프라인을 Git Actions - Docker에서 Git Actions - PM2로 전환하였다. 1. 긴 배포 시간 (길면 3~5분, 평균 1분 후반대)2. 간헐적인 서비스 장애 탐지의 위치 이동 서버와 백엔드 코드를 혼자 관리하다 보니 빈번하게 코드를 업데이트해야 한다. 테스트 같은 안전 장치의 통과를 위해 소요되는 시간은 언제나 수긍하지만, Docker 프로세싱의 긴 소요 시간은 점차 ..

최근 인프랩 면접에서 얻게 된 코드 리뷰를 통해 현업에서 사용하고 있는 코드들에 대해 되짚어 보고 있다. 값진 경험을 통해 메타인지를 할 수 있게 되었고, 오답이라고 생각하는 부분에 대한 리팩토링을 진행하고 있다. 특히 이번에는 면접 당시에 서비스 레이어와 인프라(DB) 레이어 사이의 의존성에 대해 피드백을 들었던 부분을 바탕으로 실제 코드를 개선하고 그 과정에서 꼬리에 꼬리를 무는 의문들을 정리해보는 시간을 가지고자 한다. import { Injectable } from '@nestjs/common';import { InjectRepository } from '@nestjs/typeorm';import { Repository } from 'typeorm';import { User } from './u..
![[쿼리튜닝 - 2] 사내 조회쿼리 성능의 개선 과정 두번째 이야기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTTa52%2FbtsFKRPRZvk%2FGcxNNTfK2TcuZQOFZkgbXk%2Fimg.jpg)
해당 글을 보고 오시면 좋아요 [쿼리튜닝] 신입 개발자의 간단한 사내 조회 쿼리의 쿼리튜닝 여정.발단 계속해서 짧은 주기로 프로젝트를 쏟아내고 있던 와중에 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..
![[로그 분석/시각화 -2] 실제 서비스에 적용해보기(PLG : Promtail / Loki/ Grafana)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJLW1%2FbtsFF8iy8yz%2FKkqk3LquvkBRS9kZf7SZ7K%2Fimg.png)
이전글과 이어집니다. [로그 분석/시각화 - 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를 이용해서, 로키와 프롬테일 모두 빌드시켜주고 있는 기존 프로세스가 잘못됐다고 판단했다. ..
![[sendbird - 3]사내 서비스 샌드버드 도입기 (feat.처음 그려보는 시스템 아키텍처 구성도)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbso4MF%2FbtsFkVFQNWp%2FYmrUgDF5ivMj8vJZzxaVs0%2Fimg.png)
[sendbird - 1]샌드버드 chat의 사내 도입? api 사용해보기 / Next + Nest 서론 현재 근무하는 회사 서비스의 웹 소켓 기반의 채팅 기능이 전반적으로 하자가 많아서 카카오톡이나 다른 여러 채팅 API를 끌어다가 사용하자는 의견이 나오고 있고, 실제로 11월 초에 한번 mag1c.tistory.com [sendbird - 2]샌드버드 chat 도입에 대한 고찰 서론 지난 글과 이어서 작성해본다. [sendbird - 1]센드버드 chat의 사내 도입? api 사용해보기 / Next + Nest 서론 현재 근무하는 회사 서비스의 웹 소켓 기반의 채팅 기능이 전반적으로 하자가 많아서 카 mag1c.tistory.com 도입 결정 장장 10월말부터 시작된 도입에 대한 얘기가, 일정이 밀리..
![[로그 분석/시각화 - 1] 기존 로그 관리의 문제점과 PLG로 로그 시각화 구현해보기 (Promtail, Loki, Grafana / ELK)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUHql1%2FbtsESK4jtsp%2FnNqCjnN9DMabByGKDKJW4K%2Fimg.png)
개발 동기현재 사내 서비스들에 대한 로그는 winston으로 날짜별/레벨별로 관리되고 있다. nest-winstonA Nest module wrapper for winston. Latest version: 1.9.4, last published: 6 months ago. Start using nest-winston in your project by running `npm i nest-winston`. There are 236 other projects in the npm registry using nest-winston.www.npmjs.com export const winstonLogger = WinstonModule.createLogger({ transports: [ new w..