본문 바로가기

[Project] 프로젝트 삽질기41 (feat 계층형 & 클린 아키텍처) 들어가며 프로젝트를 개발하면서 계층형 아키텍처를 최대한 잘 구성하기 위해 노력했습니다. 개발을 꾸준히 하면서, 계층형 아키텍처에도 문제가 있을 수 있다고 생각했습니다. 어떤 점에서 문제를 겪었는지, 그 문제를 어떻게 해결할 수 있는지에 대해 이 글을 통해 작성해보고자 합니다. 이 글은 [Clean Architecture] 계층형 아키텍처의 문제점 글과 [Clean Architecture] 계층형 아키텍처의 문제점을 해결하는 육각형 아키텍처(헥사고날 아키텍처) 글을 참고해서 작성했습니다. 데이터베이스 주도 설계 NestJS로 서비스를 개발하면서 기존 코드를 계층별로 구분하여 작성하려고 노력했습니다. 처음 코드를 작성할 때는 큰 문제를 겪지 않았지만 비즈니스의 복잡도가 커지면서 조금씩 문제를 겪기 시작했습니..
[Project] 프로젝트 삽질기40 (feat 해시) 들어가며 현재 작성된 코드는 어떤 문제가 있는지 살펴보고 싶었습니다. 리팩터링 하면서, AWS SQS를 활용했는데, 그 과정에서 문제를 하나 발견했습니다. FIFO Queue를 활용하기 위해 Producer에서 deduplicationId를 활용해야 했는데, 이때 deduplicationId 값은 중복되어서는 안 됐습니다. 그럼 deduplicationId 값에 중복되지 않는 값을 넣기 위해 어떻게 해야 할까를 고민하는 과정에서 해시 함수를 활용하면 좋겠다고 생각했습니다. 그럼 어떤 해시 함수를 활용하는 것이 좋을까에 대해 알아보고 싶었습니다. 이 글은 [Back-end] MD5와 SHA의 차이 글을 참고해서 작성했습니다. 해시 함수 해시 함수는 임의의 데이터를 입력받아 고정된 길이의 비트열로 변환하는 ..
[Project] 프로젝트 삽질기39 (feat UML) 들어가며 현재 작성된 코드는 어떤 문제가 있는지 살펴보고 싶었습니다. 그러기 위해 현재 작성된 코드의 의존성은 어떻게 설계되어 있는지 파악해봐야겠다고 생각했습니다. 하지만 어떻게 현재 코드 의존성을 파악해야 할지 몰랐습니다. 그 과정에서 UML을 직접 설계해보면 한눈에 현재 코드의 의존성을 파악할 수 있다고 생각했고, UML을 적용한 과정에 대해 글로 적어봐야겠다고 생각했습니다. UML UML이란 Unified Modeling Language로서, 프로그램 설계를 표현하기 위해 사용하는 그림으로 된 표기법을 의미합니다. UML을 사용하면 한 번에 이해하기 힘든 복잡한 시스템을 한눈에 이해할 수 있게끔 표현할 수 있습니다. UML로 표현할 수 있는 다이어그램도 여러 종류가 됩니다만, 저는 여기서 클래스 다..
[Project] 프로젝트 삽질기38 (feat AWS SQS 적용) 들어가며 리팩터링 하면서 AWS SQS를 활용한 기능을 개발하고 있습니다. 개발하는 과정에서, AWS SQS를 NestJS에서 어떻게 적용시킬 수 있는지 참고할 수 있는 자료가 거의 존재하지 않았습니다. 이번 기회에 직접 적용해보면서 삽질했던 과정을 정리하면 누군가는 제 글을 통해 도움을 얻을 수 있지 않을까 생각했습니다. Queue 생성은 해당 링크를 참고했고, Queue를 NestJS에서 활용하는 부분은 해당 링크를 참고했습니다. AWS SQS 설정하기 AWS SQS를 활용하기 위해 먼저 IAM 설정을 진행하겠습니다. IAM 설정 먼저 Nestjs에서 AWS SDK를 활용하기 위해서는 AWS IAM에서 제공하는 액세스 키 및 시크리 키 값이 필요합니다. 키 값들을 받아오기 위해 먼저 IAM 설정을 ..
[Project] 프로젝트 삽질기37 (feat AWS SQS) 들어가며 리팩터링 하면서 AWS SQS를 활용한 기능을 개발하고 있습니다. 개발하는 과정에서, AWS SQS를 어떻게 사용할 수 있는지를 정리해보고 싶었습니다. AWS SQS에 대한 특징과 설정할 때 참고할 점을 정리하고자 합니다. 왜 AWS SQS인가? 저는 POG 서비스에서 bull.js를 활용해서 Redis 기반의 Queue를 활용했던 경험이 있습니다. 하지만 특정 개발을 진행하면서 Bull.js보다 AWS SQS를 활용해서 큐 서비스를 활용하면 좋겠다고 생각했습니다. [Project] 푸시 알림 프로젝트 삽질기9 (feat Queue, bull) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 그 과정에서 생각하고 배웠던 점들을 하나씩 작성하고자 합니다. 먼저 푸시..
[Project] 프로젝트 삽질기36 (feat SonarCloud) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. CI 프로세스를 구축하는 과정에서 안정적인 통합을 위해 통합 이전에 테스트 코드를 자동으로 실행했습니다. 하지만 홀로 코드를 작성하다 보니, 컨벤션은 제대로 지켰는데, 작성한 코드가 보안적으로 취약점은 없는지 확인하기 힘들었습니다. 이때 코드를 정적으로 분석할 수 있는 SonarCloud를 적용한다면 안정적인 CI 프로세스를 구축할 수 있다고 생각했습니다. 이 글은 SonarCloud를 적용하기 위해 노력하며 작성됐고, 인프런 개발자 이동욱 님의 SonarCloud를 통한 Node.js & Jest 프로젝트 정적 분석하기 글과 SonarLint와 SonarCloud 연동하기 블로그 글을 참고했습니다. SonarCloud Sona..
[Project] 프로젝트 삽질기35 (feat CI) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. Github Action을 활용하여 배포 자동화를 구축하는 과정에서 CI는 어떻게 구축하는 것인지 궁금증이 생겼습니다. CI란 무엇이며 CI를 어떻게 구축하는 것인지 이 글을 통해 정리해보고자 합니다. 이 글은 참고 및 출처에 있는 글들을 공부하며, 프로젝트에 적용하면서 작성된 글입니다. CI & CD CI란 Continuous Integration의 약자로 지속적 통합을 의미하며, CD는 지속적인 서비스 제공(Continuous Delivery)과 배포(Continuous Deployment)를 의미합니다. 이에 대해 좀 더 자세히 알아보겠습니다. CI? 위에서 CI를 지속적 통합이라는 의미로 살펴봤습니다. 지속적 통합이라는 ..
[Project] 프로젝트 삽질기34 (feat AWS EB, Docker) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 프로젝트에서 저는 비즈니스 로직에만 집중했습니다. 그러다 보니 현재 서비스가 어떻게 배포되고 있는지 정확하게 알 수 없었습니다. 이번 기회에 프로젝트가 어떤 과정을 통해 배포되고 있는지 알아야겠다고 생각했습니다. 이 글을 통해 AWS EB, Docker, Github Action을 활용하여 배포한 과정을 정리하려 합니다. AWS Elastic Beanstalk AWS Elastic Beanstalk을 활용하면 용량 프로비저닝, 로드 밸런싱, 애플리케이션 상태 모니터링 등을 자동으로 처리합니다. EB를 활용하지 않으면 EC2를 별도로 설정해서, 로드 밸런서 등을 수동으로 모두 세팅해야 하지만, EB를 활용하면 완전 관리형이기 때문..
[Project] 프로젝트 삽질기33 (feat 정적 팩토리 메서드) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 개발하는 과정에서, 컨트롤러에서 응답 객체를 클라이언트에게 전달할 때, 어떻게 데이터를 전달하면 좋을까 생각했습니다. 개인적으로 ResponseEntity를 활용하여 응답 데이터를 전달하는 방식으로 코드를 작성했습니다. ResponseEntity를 활용하는 과정에서 했던 고민을 공유하고자 합니다. 정적 팩토리 메서드 글을 정리하면서 해당 글을 참고했습니다. 응답 객체 전달 방식 고민 API에 대한 성공적인 응답을 어떻게 클라이언트에게 전달할까 고민했습니다. NestJS에서의 일반적인 요청/응답 생명주기는 위와 같습니다. 컨트롤러에서 응답하는 과정에서 인터셉터를 거치고, 예외 필터를 거친 후 응답합니다. 그럼 성공 응답은 인터셉터..
[Project] 프로젝트 삽질기32 (feat Static) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 개발하는 과정에서, Static 메서드는 언제 사용하는 것이 좋은지에 대해 이야기 나온 적이 있습니다. 그럼 Static은 정확히 무엇이고, 왜 사용해야 하는지에 대해 알아야겠다고 생각했습니다. 이 글은 Static에 대한 생각을 정리하기 위해 작성됐습니다. Static Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필요합니다. 일반적으로 우리가 만든 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap 영역에 생성됩니다. 객체의 생성 시에 할당된 Heap 영역의 메모리는 Gar..