전체 288

Jenkins를 이용하여 Docker 애플리케이션 배포하기 [2]

저번 글에서는 Jenkins와 Github를 연결해 보았다. 연결하는 순간 Github에 Jenkins 파일이 생성될 것이다. 젠킨스 파일을 이용해서 파이프라인을 구성하면 배포 과정을 비교적 쉽게 알아챌 수 있다. 3번부터 6번까지의 과정은 Jenkins파일 안에서 스크립트로 진행될 예정인데, 이를 작성하기 위해서는 3번부터 6번까지의 과정을 cli 명령어로 구성할 줄 알아야한다. Docker Image 빌드하기 도커 이미지를 로컬에서 빌드해야 한다. 먼저 다음 설명서를 읽고 도커를 설치하자. https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html Docker basics for Amazon ECS - Amazon El..

Jenkins를 이용하여 Docker 애플리케이션 배포하기 [1]

현재 우리 회사의 배포환경은 절반은 자동, 절반은 수동으로 배포를 하는 중이다. 대략적인 플로우는 github에 push를 하게 되면 dockerhub에서 자동으로 빌드가 되고, 이 이미지를 수동으로 elastic beanstalk에 배포하는 방식이다. 테스트 환경은 상관없는데 프로덕션 환경에서는 상당히 거추장스럽다는 생각이 들게 되었다. 그래서 자동 배포 툴을 찾아보다가 Jenkins 라는 CI/CD 툴을 발견하게 되었다. 내가 사용하는 환경에서 상당히 적합하다는 느낌을 많이 받아서 Jenkins를 사용하기로 했다. 구상하기 구상한 환경은 다음과 같다. 내가 대강 구상한 플로우는 번호 순서대로 따라가면 된다. 1. 로컬에서 코드 작성 후 Github에 push한다. 2. webhook을 통해서 코드 저..

[NestJS] Subscription과 Guard 사용하기

NestJS를 이용해서 실시간 통신을 구현해야 하는 상황이 주어졌다. 이를 위해서 실시간 통신에 관련한 자료를 찾아보니 WebSocket 관련한 자료가 많이 나왔다. 하지만 현재 사용중인 서버는 Graphql을 사용하므로, Graphql에서 지원하는 것들 위주로 찾아보니 Subscription이라는 기능을 발견했다. 이제 이를 이용해서 실시간 통신을 구현함과 동시에, HTTP Header를 이용해 보안까지 같이 챙겨보자. Subscription 이란? Subscription에 관해서 알아보기 전에 Rest API 와 GraphQL의 차이에 대해서 정말 간단히 정리해봐야겠다. Rest API와 GraphQL은 서버에 무언가를 요청하여 응답을 받을 수 있는 하나의 약속이라고 볼 수 있다. 하지만 둘의 사용 ..

[NestJS] Prisma db 여러개 연결하기

현재 서버의 데이터를 이용해서 의미있는 데이터를 만들고 싶었다. 하지만 이 작업을 수행하게 되면 DB에 자원이 많이 소모되기 때문에, 기존의 db를 새 db에 마이그레이션 한 이후 이 db에서 데이터를 추출하고 싶었다. 여기서 문제가 되는 것이 복사한 db에서 의미있는 값을 뽑아낸 뒤에 기존의 db에 바로 올리기 위해서는 한 대의 서버에 2개의 db를 연결해야 했다. 나는 NestJS + Prisma 를 사용하므로, Prisma에 대한 방법을 정리해 보았다. DB 2개 연결하기 Prisma에 DB를 연결하는 방법은 prisma.schema 파일에 db의 주소를 넣으면 된다. 현재 생성하는 db가 2번째 일 경우, 스키마에 새로 추가할 것이 output 항목이다. generate 명령어를 실행하게 되면 클..

Grafana 에서 graphql을 통해 데이터 받아와서 그래프 그리기

우리 회사에서 예전부터 유저들의 동향을 그래프로 표시하고 싶다는 욕심이 있긴 했다. 그럴 때마다 Firebase 쓰세요~ 라고 했지만 뭔가 자세한 로그가 보고 싶다고 한다. 그래서 이것저것 알아봤더니 모니터링 프로그램은 Grafana가 제일 좋아 보여서 Grafana를 쓰기로 했다. 하지만 data source는 뭐로 쓸까 고민을 했다. 찾아 보니 prometeus라는 프로그램이랑 grafana와 궁합이 제일 잘 맞아 보였다. 서버에서 생긴 로그들을 다 prometeus로 몰아넣고 grafana에서 가져와 쓰면 되는 듯 했다. 하지만 우리 서버는 예전에 있던 로그들도 사용해야 해서 고민하다가 결국 기존에 사용중인 graphql을 grafana에서 사용해 보기로 했다. 구상과 제작 기본적인 구상은 다음과 ..

2021년 연말 개발 회고록

2021년 회고 내가 살아오면서 지금까지 단 한번도 회고록 같은 글을 작성해 본 적이 없다. 하지만 올해는 나한테 다양한 이벤트가 생기고 이를 자주 경험했던 것 같다. 그래서 올해 개발에 관련된 주제를 중점으로 무엇을 했는지 돌아보면서 간단하게 정리를 해 볼려고 한다. 필력이 따라와 줄 지는 모르겠으나, 일단은 시간의 흐름대로 정리해 봐야겠다. 진로 살짝 비틀기 나는 대학교 전공이 전자공학부이다. 그래서 전자 및 전기에 관한 공부를 계속 했으며 당연히 취업도 전자공 쪽으로 할 줄 알았다. 하지만 계속 공부를 하다 보니 나랑 맞지 않는다는 생각이 자주 들었다. 가장 크게 다가왔던 감정은 전자공학을 공부한다고 하나, 사실상 대부분의 시간은 반도체 관련 공부를 하고 있었다. 문득 든 생각이, 반도체 공부를 하..

잡다한 이야기 2021.12.26

Postgresql DB의 인덱싱 알고리즘

Postgresql db를 사용하면서 다수의 row를 가진 데이터들을 다룰 때 양이 많아질수록 쿼리 시간이 길어지는 것이 보였다. 이를 개선하기 위해 여러가지 기법을 찾던 중, db의 인덱싱 알고리즘에 따라서 특정한 데이터들은 성능이 빨라진다는 것을 알게 되었다. 이에 대한 지식이 부족한 것 같아 간단히 정리했다. 알고리즘 종류의 필요성 현재 사용되는 db 서비스들은 대부분 기본값으로 b-tree 인덱싱을 사용하고 있다. 보편적으로 많이 사용되고 성능 또한 어느정도 검증이 되어 있어 이를 기반으로 구조가 이루어져 있다. 하지만 이것이 만능 인덱싱 알고리즘은 아닐 뿐더러 항상 특수한 경우가 생기기 마련이다. 이를 위해서 postgres 에서는 21년 현재 6개(사실상 5개)의 알고리즘을 지원하고 있다. 지..

서버 인프라/DB 2021.12.26

[NestJS] DB 캐시 Redis 사용하기

현재 앱 운영이 순조롭게 되고 있는 것 같지만, 내부적으로 서버 응답 속도가 느리다는 문제가 꾸준히 있었다. 사실 이 문제는 AWS CloudWatch에서도 꾸준히 보고되었고 예전부터 해결해야 할 과제 중 하나였는데, 다른 작업들에 밀려 우선순위가 낮아졌다. 이제서야 이 문제를 해결하게 되었다. 현재 문제 상황 현재 운영 중인 데이터의 구조는 postgresql에서 부모 데이터에 자식 데이터가 1:n으로 물려 있는 형태이다. 여기서 부모 데이터는 15만개 정도의 row 데이터가 있고, 자식 데이터는 그것의 10배 정도의 row 데이터가 있다. 이 데이터는 사용자의 tz 기준으로 하루에 대한 데이터를 뽑아내야 한다. 여기서 문제가 되는 것은 time을 기준으로 데이터를 범위 검색을 하다 보니 하루에 대한 ..

[NestJS] Guard 사용하기

웹서버에서 중요한 것 중의 하나는 보안 관련한 로직일 것이다. NestJS에서는 허용된 User가 아니면 query나 Mutation, Subscription을 요청하지 못하도록 하는 Middleware를 제공한다. 이것을 UseGuard라는 decorator로 제공하고 있다. 이번에 Query, Mutation, Subscription에 관해서 Guard를 제작한 경험을 작성하고자 한다. Guard 개념 Guard 개념은 간단하다. 허용된 유저가 아니면 요청 자체를 막아버리는 것이다. 예를 들어 모든 사용자가 서버에 요청을 할 수 있다면, DDos 같은 엄청난 트래픽이 들어올 때 모든 요청에 대하여 응답을 하게 될 것이다. 이러한 상황이 지속되면 서버의 자원에 낭비가 올 수 밖에 없으며, 결국에는 서버..

DockerHub 와 Github 연동하여 자동으로 이미지 만들기

배포 자동화는 계속 발전하고 있다. 개발자들이 개발에 집중할 수 있게 함으로서 생산성을 올리게 되는 선순환으로 이어지게 된다. 내가 현재 사용하는 개발환경은 nodejs 환경이며, 도커 컨테이너에 담아서 쉽게 deploy 할 수 있게 하고 있다. 최근에 도커에 대한 공부를 하면서 기존의 배포 환경을 한번 더 정리하는 식으로 정리해 둘려고 한다. 참고로 내가 하는 방법은 현재 "유료" 이다. (1년에 60달러를 결제하면 Pro 계정 사용이 가능하다.) DockerHub 에서 Github 코드 depoly 하기 먼저 dockerhub 사이트에서 github 계정이랑 연동한다. 나의 경우에는 Github 계정과 연동을 시켜 두었다. 그 다음으로는 Repository를 만들고 간단한 설정을 한다. 1. 도커 허..