인턴 생활도 거의 2달이 지난 시점. 블로그를 다시 시작해야겠다고 마음을 먹은 뒤, 오랜만에 작성해보는 포스팅. 실제 서비스 중인 api 서버에는 주기적으로 데이터를 Update하고 Delete하는 스케줄링 로직이 박혀있었다. 팀원 분께서 스케줄링 로직은 따로 분리해서 관리하는 것이 효율적일 것 같다고 나에게 분리 작업을 해보는 것이 어떠냐 하셔서, AWS도 익힐 겸 진행해보았고, 뭔가 분명 나중에 또 작업할 일이 생길 것 같아서 간단하게 정리하려한다. Lambda 함수 생성 원하는 환경에 따라 런타임과 아키텍처를 적절히 선택하고 Lambda 함수를 생성한다. 함수 개요에서 트리거 추가 부분을 보면 아직 아무 트리거도 추가되어있지 않다. 여기에 추가할 트리거가 바로 EventBridge이다. 먼저 lam..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 6월 28일 작성) 최근에 테스트 코드를 조금씩 작성하기 시작했다. 자연스레 CICD 파이프라인에도 test를 추가함으로써 build-test-deploy 구조가 완성되었다. 그런데 문뜩 '테스트 통과 못하면 main branch에 merge 되면 안되지 않나?'라는 생각이 들었고 테스트가 통과될 때만 merge 되도록 설정했고 이에 대해 간소하게 정리했다. 🌼 workflows 수정 하나의 main.yml 파일에 모든 job이 작성되있는 상태여서, 이를 둘로 나눈다. main.yml: 다른 branch가 main branch에 merge될 때 build와 deploy job 진행 pull_request.yml: main branch에 대한 ..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 3월 17일 작성) 이전에 CICD 구축했을 때에는 아무런 문제 없이 애플리케이션 실행이 잘 되었었다. 그런데 어떤 것이 바뀌었는지 모르겠는데 어느 순간부터 배포 서버에 연결이 안되는 것이었다. ec2 인바운드 규칙에서 포트 열었다 닫았다 반복하고 docker 호스트 포트도 80으로 했다가 3000으로 했다가 8080으로 했다가 무한반복 했지만 ec2 서버에 접속할 수가 없었다. (SSH는 잘되는데..) 그러다가 curl 명령어로 도커 컨테이너에 요청을 보내보았다. curl http://localhost:3000 curl: (52) Empty reply from server 열려있는 포트도 확인해보았다. netstat -tnlp tcp 0 0..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 5월 3일 작성) TalkGG 프로젝트 진행하면서 테이블 설계가 중간에 바뀌었었다. 게시물 테이블과 관련된 이슈였고 게시물과 관련된 테이블들이 비효율적으로 설계된 것 같아 테이블을 통합하는 작업이었다. 하면서 느낀 건데 데이터 중복이 많은 것도 문제인데 마냥 테이블을 잘게 분해시키는 것도 큰 문제가 될 수 있을 것 같다. 상황에 따라 분해도 하고 통합도 하고 유연하게 대처하는 것이 옳은 것 같다. 🐹 1차 설계 우선 게시물 테이블을 만들었는데 게시물은 자유, 유머, 대회소식으로 총 3개의 카테고리로 나누어진다. 게시물 카테고리 별로 게시물의 구조나 양식이나 저장하는 데이터 컬럼이 달라질 수 있지 않을까 하는 생각이 들어 카테고리마다 테이블을 ..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 4월 5일 작성) 레디스를 좋아요, 세션, 캐시 용도로 사용하고자 마음을 먹고 레디스 클라우드에서 제공해주는 무료 서버를 파서 사용했다. 사용하다보니 몇가지 비효율적인 부분이 생겼다. 레디스 클라우드와 커넥션할 때 굉장히 자주 타임 아웃이 발생하였다. 커넥션 타임을 늘려줘도 마찬가지였다. 레디스 클라우드 무료 인스턴스는 사용할 수 있는 최대 메모리 용량이 30MB 밖에 안된다. 다양한 데이터가 하나의 인스턴스에 저장되는 것은 싱글스레드로 작동하는 레디스의 성능에 문제를 끼칠 수 있을 것 같았다. 이러한 이유로 EC2 인스턴스를 하나 파서 용도별로 docker redis container를 띄워서 사용하기로 했다. EC2 프리티어는 총 1GB의..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 4월 22일 작성) 프로젝트에는 카카오 로그인과 네이버 로그인 둘 다 구현했는데, 둘 다 흐름이 매우 비슷해서 네이버 로그인만 정리해도 될 것 같다. node.js 진영에서는 인증 구현할 때 passport 라이브러리를 굉장히 많이 쓴다고 들었는데, OAuth 방식으로 인증이 어떻게 이루어지는 지 흐름도 익힐 겸 passport 없이 했다. 한 번 훑으면 passport도 쉽게 익힐 수 있지 않을까 싶다. 네이버 로그인 API 공식 문서를 참조했다. 🐱 전체적인 흐름 사전에 Naver Developer에서 애플리케이션을 등록하고 클라이언트 ID와 클라이언트 secret을 발급받는다. 프론트엔드에서 https://nid.naver.com/oau..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 4월 6일 작성) 유튜브를 둘러보다가 'Redis 야무지게 사용하기'라는 영상을 보게 되었다. NHN FORWARD 2021 Redis 야무지게 사용하기 영상을 본지는 꽤 오래되었다. 영상 앞 부분에서 설명해주신 캐싱 읽기 전략을 직접 구현해보고 싶었는데, 이제서야 프로젝트에 적용하게 되었다. 💥 로직 전체적인 흐름은 다음과 같다. 프론트엔드에게 postId를 받음 redis 인스턴스에서 postId에 해당하는 데이터를 가져옴 만약 redis 인스턴스에서 가져온 데이터가 없으면 mysql에서 postId에 해당하는 데이터를 가져옴 데이터를 redis 인스턴스에 저장하고 프론트엔드에게 리턴 만약 redis 인스턴스에서 가져온 데이터가 있다면 곧..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 3월 12일 작성) 서버 scale-out 시 세션 불일치 문제가 발생하기 마련이다. sticky 세션이나 클러스터 세션 등 여러 방법으로 해결할 수 있지만 세션 스토리지로 세션들을 관리하는 것이 가장 좋은 방법인 것 같다. 물론 모든 것에는 트레이드 오프가 있듯이 세션 스토리지 서버가 다운되면 인증 로직 자체가 작동할 수 없다는 단점도 있으나 나머지 둘 보다 낫다고 생각한다. (DB 레이어에서 고가용성을 위한 방법이 또 여러가지 있으니까) 아무튼 REDIS를 이용해서 세션 스토리지를 구성했다. REDIS는 이번에 처음 사용해보는데, 데이터가 key-value 구조고 이에 따라 명령어도 단순해서 굉장히 편하다는 느낌을 받았다. 😺 세션 스토리..
본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 2월 23일 작성) 🐨 어려운 타입스크립트 현재 nest.js로 프로젝트를 진행하고 있는데, 타입스크립트에 익숙하지 않아서 타입 지정해주는데에 많은 시간을 쏟고 있다. 이왕 타입스크립트 쓰는 김에 타입 먹일 수 있는 곳에는 다 먹이려고 하는데 쉽지가 않다. 아무튼 며칠 전부터 메소드 리턴 타입 지정을 어떻게 해야할 지 고민을 많이 했다. 다른 개발자들의 프로젝트도 좀 찾아봤는데, 둘 중 하나였다. 너무 복잡하거나(제네릭 안에 제네릭 안에 제네릭이 있다던지..) 아예 리턴 타입을 지정해주지 않는 경우였다. 뭔가 대단한 방법이 있을 줄 알았는데 딱히 그런 것도 아닌거 같아서 Response용 DTO를 만들기로 했다. 🐷 공식문서에서는 DTO는 c..