프로젝트 삽질기33 (feat ECR tag 관리) 들어가며 AWS ECR에 빌드한 Docker Image를 업로드할 때 tag를 latest로 설정했습니다. 그 후 latest 태그가 붙은 이미지를 이용해서 배포하는 과정에서 문제가 생겼는데, 어떤 문제가 생겼고 문제를 어떻게 해결했는지 공유하고자 합니다. 문제 정리첫 번째, 롤백이 안 되는 문제가 있었습니다. 배포 과정에서 문제가 생기면 롤백해야 했는데, ECR에는 모두 latest 태그가 붙은 이미지만 존재했습니다. 그래서 문제가 발생하는 latest 버전이 아닌 이전 버전으로 롤백을 하려고 하더라도, 현재 문제가 발생하는 latest 태그의 Docker 이미지로 컨테이너를 만들어야 했습니다. 즉 latest 태그를 유지함으로써 서버를 롤백할 수 없는 문제가 있었습니다. 두 번째는 버전 관리.. 프로젝트 삽질기32 (feat DOO 단위 테스트) 들어가며 이 글에서 비즈니스 로직과 이벤트 전달 로직을 분리하는 과정을 공유했습니다. 이번 글에서는 테스트 코드를 활용해서 이벤트를 전달하는 코드가 호출되었는지, 그리고 이벤트를 전달하는 코드를 호출하기 위해 어떤 객체가 전달되었는지 확인한 방법을 공유하고자 합니다. 그 과정에서 테스트 코드를 어떻게 작성했는지 함께 공유하겠습니다. 테스트 코드 작성 준비기존 코드는 아래와 같이 구성되어 있었습니다. 만약 아래 코드로 단위 테스트를 작성한다면, 테스트 코드를 작성하기 어렵습니다. hackle, amplitude SDK를 직접 제어하기 어렵고, sdk를 활용해서 외부에 데이터를 전달하는 것이기 때문에 테스트를 하기 위해서는 외부의 환경에 의존해야 합니다. 문제를 해결하기 위해선, 직접.. 프로젝트 삽질기31 (feat DOO, Enum 클래스) 들어가며팀에서 데이터 드리븐한 의사결정을 할 수 있도록 핵클, 앰플리튜드에 데이터를 적재하는 환경을 구축하고 있습니다. 데이터를 전달하기 위해 비즈니스 로직에 이벤트 전달 코드를 함께 작성했습니다. 그러다 핵클, 앰플리튜드에 전달해야 하는 이벤트 전달 코드가 점진적으로 많아지면서 코드의 가독성을 해치게 되었고 하나의 클래스에서 여러 책임을 갖게 되는 문제가 발생했습니다. 이 글을 통해 제가 겪은 문제를 어떻게 해결했는지 공유하고자 이 글을 씁니다. 이벤트 전달하기먼저 유저의 회원가입을 처리하는 클래스가 있다고 가정하고 간단한 샘플 코드를 살펴보겠습니다. 만약 유저가 언제 회원가입을 했는지 알기 위해 핵클과 앰플리튜드에 이벤트를 전달하고 싶다면 다음과 같이 코드를 구성할 수 있을 것입니다.. 프로젝트 삽질기30 (feat 나이스 인증 3) 들어가며 본인확인 기능을 개발하기 위해 팀에서는 나이스 본인확인 서비스를 도입했습니다. 나이스에서 제공하는 개발 가이드를 보면서 도입을 해야 했는데, 배경 지식이 전혀 없는 상황에서 도입을 하려고 하니 여러 삽질을 거쳐야만 했습니다. 나이스 인증을 도입하는 다른 분들이 저와 같은 어려움을 겪지 않았으면 하는 바람으로, 나이스 인증 기능을 어떻게 도입했는지를 상세하게 작성해 보려 이 글을 적습니다. 나이스 인증 결과 복호화저번 글에서는 NICE 표준창을 호출하기 위해 요청 정보를 반환하는 과정을 살펴봤습니다. 다음은 유저가 NICE 표준창을 활용해서 인증을 완료하면 인증 결과가 서버 쪽으로 전달되도록 8번부터 11번까지의 과정을 살펴보겠습니다. 이 과정을 코드를 보면서 따라가고 싶.. 프로젝트 삽질기29 (feat 나이스 인증 2) 들어가며 본인확인 기능을 개발하기 위해 팀에서는 나이스 본인확인 서비스를 도입했습니다. 나이스에서 제공하는 개발 가이드를 보면서 도입을 해야 했는데, 배경 지식이 전혀 없는 상황에서 도입을 하려고 하니 여러 삽질을 거쳐야만 했습니다. 나이스 인증을 도입하는 다른 분들이 저와 같은 어려움을 겪지 않았으면 하는 바람으로, 나이스 인증 기능을 어떻게 도입했는지를 상세하게 작성해 보려 이 글을 적습니다. 나이스 본인확인기관 토큰을 발급받는 과정을 저번 글에서 살펴봤습니다. 다음은 유저가 나이스 본인인증 요청 버튼을 클릭하면 NICE 표준창을 호출할 수 있도록 로직을 구현해 보겠습니다. 3번부터 7번까지의 과정을 살펴보겠습니다. 이 과정을 코드를 보면서 따라가고 싶으신 분들은 코드를 레.. 프로젝트 삽질기28 (feat 나이스 인증 1) 들어가며 본인확인 기능을 개발하기 위해 팀에서는 나이스 본인확인 서비스를 도입했습니다. 나이스에서 제공하는 개발 가이드를 보면서 도입을 해야 했는데, 배경 지식이 전혀 없는 상황에서 도입을 하려고 하니 여러 삽질을 거쳐야만 했습니다. 나이스 인증을 도입하는 다른 분들이 저와 같은 어려움을 겪지 않았으면 하는 바람으로, 나이스 인증 기능을 어떻게 도입했는지를 상세하게 작성해 보려 이 글을 적습니다. 나이스 본인확인나이스평가정보에서 제공하는 API는 여러 종류가 있는데, 본인인증(통합형)을 도입하는 방법에 대해 알아보겠습니다. 이 과정을 코드를 보면서 따라가고 싶으신 분들은 코드를 레포지토리에 올려두었으니 함께 확인해 주시면 됩니다. GitHub - epitone/nice-.. 프로젝트 삽질기27 (feat sentry 잘 활용하기) 들어가며서버에 에러가 발생했을 때, 고객이 어떤 문제를 겪는지 빠르게 파악하고 싶어서 Sentry 환경을 구축했습니다. Sentry의 기본 기능만 활용하면서 Sentry를 보다 잘 활용한다면, 에러 핸들링을 조금 더 잘할 수 있지 않을까 싶어서 Sentry 활용 방법을 바꿨는데요. Sentry를 보다 잘 사용하기 위해 삽질한 내용을 공유하고자 글을 씁니다. 기존 Sentry 활용서버에서 발생하고 있는 에러를 탐지하기 위해 nest-raven 라이브러리를 활용해서 sentry를 활용했습니다. import { Module } from '@nestjs/common';import { APP_INTERCEPTOR } from '@nestjs/core';import { RavenInte.. 프로젝트 삽질기26 (feat IAM MFA 강제) 들어가며NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. 프로덕트가 성장하면서 AWS 콘솔에 접근해야 하는 팀원이 조금씩 늘었습니다. 팀원들이 보다 안전하게 AWS 콘솔에 접근할 수 있는 환경을 구성하고 싶었습니다. 이를 위해 MFA 인증을 등록해야만 AWS 콘솔에 접근할 수 있도록 환경을 구축했습니다. 그럼 AWS 콘솔에 처음 접근하는 사용자에게 MFA 설정을 강제하려면 어떻게 해야 하는지 공유해 보려 합니다. MFAMFA는 사용자가 계정에 로그인할 때 패스워드 입력 후 OTP와 같은 추가적인 인증 단계를 거쳐 보안을 강화하는 기술입니다. MFA를 활용하면 계정에 대한 무단 접근을 방지하고 보안을 강화할 수 있습니다. AWS는 고객의 데이터를 .. 프로젝트 삽질기25 (feat aws-vault) 들어가며NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. AWS 환경에서 인프라를 관리하면서 문득 aws-cli 환경에 접근할 때 조금 더 안전하게 접근하려면 어떻게 해야 할까 알아보면서 aws-vault에 대해 알 수 있었습니다. aws-vault를 활용한다면, aws의 credentials 정보를 조금 더 안전하게 관리할 수 있다고 생각했습니다. 그럼 aws-vault를 어떻게 활용할 수 있는지 알아보겠습니다. aws-vaultAWS CLI를 로컬 환경에서 사용하는 경우 보통 access_key와 secret_key를 발급받습니다. 그리고 aws configure 명령어를 입력하여 사용자의 access_key, secret_key를.. 프로젝트 삽질기24 (feat transactional outbox) 들어가며NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. 저번 글에서 Transactional 데코레이터를 활용하면서 이벤트가 발행되지 않았다는 이유로 트랜잭션이 rollback 된다면 어떻게 대처해야 하는가에 대한 문제를 살펴봤습니다. 문제 해결을 위해서는 Transactional outbox 패턴을 적용해야 한다고 생각했습니다. 이번 글에서는 Transactional outbox 패턴이란 무엇이며, 패턴을 적용하면서 어떤 어려움이 있었는지 내용을 공유하고자 합니다. 문제점저번 글에서 작성한 문제를 다시 가져왔습니다. 만약 아래 로직처럼 데이터 저장 로직은 성공했지만 이벤트 발행에 실패할 경우, 트랜잭션은 어떻게 처리되어야 할까요? @Transact.. 이전 1 2 3 4 다음