Skip to content

Conversation

@WooGie911
Copy link
Collaborator

요구사항

기본

공통

  • AWS 루트 유저 계정을 생성하세요. 이미 생성된 계정이 있다면 해당 계정을 활용해 주세요.
  • AWS Free Tier 제공 범위를 파악한 후, 해당 서비스를 적극 활용하세요.
  • 인스턴스의 중지 및 종료 과정을 꼭 숙지해야 합니다. EC2 과금 정책에 주의하여 프리 티어 한도 내에서 사용해 주세요.
  • 리전은 '아시아 태평양(서울)'으로 설정하세요.

백엔드 배포
프로젝트 구조 및 환경 설정

  • 배포에 적합한 프로젝트 구조를 설정합니다.
  • 개발(development) 및 배포(production) 환경 설정을 구분하고, 환경 변수를 사용해 관리합니다.

AWS S3를 이용한 파일 업로드 시스템 구축

  • AWS S3 버킷을 생성하고, 파일 업로드를 위한 설정을 완료합니다.
  • multer-s3 라이브러리를 사용하여 이미지 업로드 미들웨어를 S3로 변경합니다.
  • S3에 이미지 업로드가 정상적으로 작동하는지 확인합니다.
    AWS RDS를 사용한 데이터베이스 관리
  • AWS RDS 인스턴스를 설정하고, 프로젝트 데이터베이스와 연결합니다.
  • RDS에서 데이터베이스의 초기화 및 CRUD 작업을 테스트합니다.
    AWS EC2에서의 애플리케이션 운영
  • AWS EC2 인스턴스를 생성합니다. 프리 티어에 해당하는 인스턴스 타입과 운영 체제(OS)를 선택하세요.
  • EC2 인스턴스에 대한 보안 그룹을 설정합니다. HTTP(포트 80), HTTPS(포트 443), SSH(포트 22) 등 필요한 포트를 열어 네트워크 연결을 구성하세요.
  • 프로세스 매니저 pm2를 사용하여 애플리케이션을 백그라운드에서 실행시킵니다.
  • Nginx를 이용한 리버스 프록시 설정을 구축하고, 외부 접속을 관리합니다.

백엔드 테스트 구현

  • Jest 설정 파일(jest.config.js)을 만들고 기본 설정을 하세요.
  • 상품 CRUD 연산에 대한 유닛 테스트를 작성합니다. 각 CRUD 연산에 대해 적절한 입력과 예상 출력을 정의하여 테스트 코드를 구현하세요.
  • 사용자의 접근 권한 검증을 고려하여 상품 CRUD 연산에 대한 시나리오를 테스트해 주세요.
  • 회원가입, 로그인에 대한 유닛 테스트를 작성합니다.
  • API 요청이나 데이터베이스 작업 등 비동기 코드에 대한 테스트를 작성하세요. async/await와 done 콜백을 사용하여 비동기 코드의 완료를 테스트하세요.
  • Mock, Spy와 같은 테스트 더블을 사용하여 외부 서비스와의 상호 작용을 테스트하세요.
  • describe와 test 블록을 사용하여 테스트 케이스를 그룹화하고 정리하세요.

심화

테스트 구현

  • Jest의 테스트 커버리지 도구를 사용해 코드 커버리지를 분석하고 결과를 확인해 보세요.
  • 커버리지 결과를 바탕으로 누락된 테스트 케이스를 추가합니다. 커버리지 보고서를 검토하여 테스트되지 않은 코드 영역을 찾아내고 적절한 테스트를 추가해 보세요.

상품 이미지 업로드

  • AWS S3의 Presigned URL 기능을 활용하여 상품 이미지 업로드 기능을 구현합니다.

AWS Route 53을 활용한 도메인 관리

  • AWS Route 53을 사용하여 도메인을 구매하거나 기존 도메인을 연결합니다.
  • Route 53에서 DNS 설정을 관리하고, EC2 인스턴스와 연결합니다.
  • 도메인을 통한 애플리케이션 접속 및 운영을 테스트합니다.

SSL 인증서를 통한 HTTPS 연결 구현

  • SSL 인증서를 설정하여 EC2 인스턴스에서 HTTPS 연결을 구현합니다.
  • SSL 인증서는 AWS Certificate Manager(ACM)를 사용하여 무료로 생성하거나, 외부 인증 기관에서 구매할 수 있습니다.

주요 변경사항

  • 미션 11에서 완벽하게 선행 되지 않아 모범답안을 사용하려 했으나 모범답안도 완벽하지 않았습니다.(레거시 코드가 지워지지 않거나 사용된 모듈이 패키지 제이슨에 들어있지 않거나 상당한 문제 존재.)
  • 따라서 실제로 동작하는 것을 확인하는 데는 한계가 있다고 판단하고 AWS를 실습해보는데 목표를 두고 진행했습니다.
  • FE 는 버셀로라도 배포해보려 했으나 실패했습니다.
  • BE는 RDS 로 DB 구성후 EC2로 WAS를 구성하여 연결하고 ALB 를 사용해 로드밸런서까지 적용했습니다.
  • 이미지 업로드를 위해 S3 를 구성하고 multer-s3 라이브러리를 사용했습니다.
  • pm2로 무중단 배포를 적용하고 nginx로 리버스 프록시까지 적용했습니다.
  • 패키지 제이슨에 터널링 스크립트를 추가해 접속을 간소화 했습니다.

멘토에게

  • 기능 코드가 엉망이라 테스트 코드까지 가지 못하고 AWS 실습에 초점을 두고 진행했습니다.
  • 잘 다듬어서 고급 프로젝트에 잘 적용해보겠습니다.
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

Copy link
Contributor

@basilry basilry left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체적으로 DDD에 맞게 잘 짜셨습니다.

다만 폴더 구조는 어느정도 잡혀있는데, 파일의 내용이 조금 폴더 성격과 안맞게 구성되어 있는 부분들이 있었어요. 내용이 분절되어 있다던지같은.

이런 부분들은 차차 개선되어 나갈거라 생각합니다.

고생하셨습니다.

});

if (!writerEntity) {
throw new NotFoundException(ExceptionMessage.USER_NOT_FOUND);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오, 에러를 따로 별도 모듈화를 하신 부분은 잘하셨습니다.

import { NotFoundException } from "../../exceptions/NotFoundException";
import { ForbiddenException } from "../../exceptions/ForbiddenException";
import { ExceptionMessage } from "../../constant/ExceptionMessage";
import { Requester } from "../../infra/AuthTokenManager";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

보다보니 import 부분을 alias로 상대경로화 할 수 있지 않았을까 하네요.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

<맨 아래에서 DDD로 구성하셨다는 readme 보고 다시 올라와서 수정합니다.>

이 application 폴더에 대한 궁금증인데, 가만 보니 prisma 통해서 db 데이터와 연계하는 부분 아닌가요?

이걸 보통 비즈니스 로직이라 하는데, 이게 밑에서 domain 폴더에 있는 로직과 따로 떨어져있더군요.

어느정도 다시 재배합 하는게 필요해 보입니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

env는 constant에 넣지 않습니다. 루트에 놓습니다.

또한, 깃헙 레포에도 올리지 않습니다. 기본입니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

<맨 아래에서 DDD로 구성하셨다는 readme 보고 다시 올라와서 수정합니다.>

아까 위에서 작성한 application 폴더 안의 소스들과 적절히 배합해서 분할하는게 어떤가요?

getter, setter를 생각하시고 구성하신 것 같은데, 사실 express에서는 그렇게까지 안하셔도 됩니다..

nest.js에서는 이야기가 다르지만요.

@@ -0,0 +1,19 @@
/**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

함수(클래스 포함)에 대한 설명을 다는 주석은 둘 중에 하나로 하면 됩니다.

  1. 모든 함수에 쓴다
  2. 모든 함수에 안쓴다

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

superstruct를 찾아보니 js api의 유효성검사를 위한 라이브러리군요. 기술 도입은 잘 하셨습니다.

그런데 왜 위에서는 도메인 별로 묶으셨는데 여기서는 안묶으셨나요?

파일이 많아지면 그만큼 컴파일링/트랜스파일링이 오래걸립니다. 서버에도 안좋아요.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인증 미들웨어 위치는 interface/middleware 로 폴더를 따로 구성하심이 어떨까요.

@basilry basilry merged commit badcb8d into codeit-sprint-fullstack:express-김재욱 Jul 10, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants