Skip to content

Conversation

@afafmmm
Copy link
Collaborator

@afafmmm afafmmm commented Jul 1, 2025

프론트주소 https://6-sprint-mission-fe-pxcf.vercel.app/

백엔드주소 https://api.mustvisit.shop/

기본 요구사항

공통

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

백엔드

  1. 프로젝트 구조 및 환경 설정
  • 배포에 적합한 프로젝트 구조를 설정합니다.
  • 개발(development) 및 배포(production) 환경 설정을 구분하고, 환경 변수를 사용해 관리합니다.
  1. AWS S3를 이용한 파일 업로드 시스템 구축
  • AWS S3 버킷을 생성하고, 파일 업로드를 위한 설정을 완료합니다.
  • multer-s3 라이브러리를 사용하여 이미지 업로드 미들웨어를 S3로 변경합니다.
  • S3에 이미지 업로드가 정상적으로 작동하는지 확인합니다.
  1. AWS RDS를 사용한 데이터베이스 관리
  • AWS RDS 인스턴스를 설정하고, 프로젝트 데이터베이스와 연결합니다.
  • RDS에서 데이터베이스의 초기화 및 CRUD 작업을 테스트합니다.
  1. AWS EC2에서의 애플리케이션 운영
  • AWS EC2 인스턴스를 생성합니다. 프리 티어에 해당하는 인스턴스 타입과 운영 체제(OS)를 선택하세요.
  • EC2 인스턴스에 대한 보안 그룹을 설정합니다. HTTP(포트 80), HTTPS(포트 443), SSH(포트 22) 등 필요한 포트를 열어 네트워크 연결을 구성하세요.
  • 프로세스 매니저 pm2를 사용하여 애플리케이션을 백그라운드에서 실행시킵니다.
  • Nginx를 이용한 리버스 프록시 설정을 구축하고, 외부 접속을 관리합니다.
  1. 백엔드 테스트 구현
  • Jest 설정 파일(jest.config.js)을 만들고 기본 설정을 하세요.
  • 상품 CRUD 연산에 대한 유닛 테스트를 작성합니다. 각 CRUD 연산에 대해 적절한 입력과 예상 출력을 정의하여 테스트 코드를 구현하세요.
  • 사용자의 접근 권한 검증을 고려하여 상품 CRUD 연산에 대한 시나리오를 테스트해 주세요.
  • 회원가입, 로그인에 대한 유닛 테스트를 작성합니다.
  • API 요청이나 데이터베이스 작업 등 비동기 코드에 대한 테스트를 작성하세요. async/await와 done 콜백을 사용하여 비동기 코드의 완료를 테스트하세요.
  • Mock, Spy와 같은 테스트 더블을 사용하여 외부 서비스와의 상호 작용을 테스트하세요.
  • describe와 test 블록을 사용하여 테스트 케이스를 그룹화하고 정리하세요.

프론트엔드

  • AWS Amplify 혹은 Vercel을 활용해 배포합니다.
  • AWS에 배포된 백엔드의 주소에 맞게 API 주소를 변경합니다.

심화 요구사항

테스트 구현

  • 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)를 사용하여 무료로 생성하거나, 외부 인증 기관에서 구매할 수 있습니다.

주요 변경사항

  • 시간이 없어서 메인페이지랑 , 디자인 등등 미완성이지만 그냥 올렸습니다.
  • 로그인, 회원가입, 상품등록 및 수정(이미지 업로드 포함), 좋아요버튼 등의 기능적인 부분은 다 작동합니다.

스크린샷

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

export default {
accessTokenStrategy,
refreshTokenStrategy,
};
Copy link
Contributor

Choose a reason for hiding this comment

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

process.env.JWT_SECRET을 HMAC 기반 서명키로 잘 분리하여 관리하고 있고,
디코딩된 payload의 무결성을 검증한 후 안전하게 사용자 조회에 사용하는 흐름이 보안적으로 잘 구성되어 있습니다.
이는 공무원 정보보호론 과목 기준으로도 MAC 기반 인증 구조의 실질 예시가 되며, 시험에서 다루는 무결성 보장/인증 구조가 그대로 코드로 구현된 셈입니다.
refreshToken은 쿠키 기반 전달 방식으로 설계되어, CSRF나 XSS 대응이 잘 고려된 점도 인상적입니다.

Copy link
Contributor

@loquemedalagana loquemedalagana left a comment

Choose a reason for hiding this comment

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

유효성 검증이 많아질 경우엔 zod나 joi 같은 validation 라이브러리를 사용하는 것도 고려해보면 좋습니다.

이 경우 코드 분리가 가능해지고, 클린코드와 유지보수성이 더 올라갑니다.

예: zod 활용

import { z } from "zod";

const productSchema = z.object({
  name: z.string().min(1),
  price: z.number().nonnegative(),
  description: z.string().optional(),
});

const parsed = productSchema.safeParse(req.body);
if (!parsed.success) {
  throw new CustomError(422, "유효하지 않은 상품 입력값입니다.");
}

message: responseMessage,
timestamp: new Date().toISOString(),
});
}
Copy link
Contributor

Choose a reason for hiding this comment

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

복습용 상태코드 테이블 정리했어요!

Status 이름 의미 예시
400 Bad Request 문법 오류, 누락된 파라미터 JSON 파싱 오류 등
401 Unauthorized 인증되지 않은 사용자 로그인 실패, 토큰 없음
403 Forbidden 인증은 되었지만 권한 없음 관리자 전용 기능 접근 등
404 Not Found 요청 리소스 없음 잘못된 URL, ID 없음
405 Method Not Allowed 메서드 불허 GET만 가능한 엔드포인트에 POST 요청
422 Unprocessable Entity 문법은 맞지만 처리 불가 빈 body, 유효성 검사 실패 등
500 Internal Server Error 서버 내부 오류 DB 연결 실패 등

const ownerId = req.user.id;
if (!req.body.name || req.body.price === undefined) {
throw new CustomError(422, "상품 이름과 가격은 필수입니다.");
}
Copy link
Contributor

Choose a reason for hiding this comment

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

422 상태 코드를 적극적으로 도입한 것은 매우 바람직하며, 공무원 출신의 정책적 감각과 표준 해석 능력이 잘 반영된 예입니다.
앞으로도 400 vs 422, 403 vs 401 등 상황에 맞는 세분화된 상태 코드 사용은 REST API 품질을 결정짓는 핵심 요소입니다. 잘하셨습니다.

@loquemedalagana
Copy link
Contributor

지금 conflict났어요ㅠㅠ


const accessTokenStrategy = new JwtStrategy(accessTokenOptions, jwtVerify);
const refreshTokenStrategy = new JwtStrategy(refreshTokenOptions, jwtVerify);

Copy link
Contributor

Choose a reason for hiding this comment

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

다은님이 짜신 코드 일부인데,

const verifyRefreshToken = expressjwt({
  secret: JWT_SECRET as string,
  algorithms: ["HS256"],
  credentialsRequired: true, // 개발 중 새로고침 시 쿠키 누락 대응
  // 쿠키에 리프레시 토큰을 담기 때문
  getToken: (req: Request): string | undefined => {
    const token = req.cookies?.refreshToken;
    return token || undefined;
  },
});

위의 verifyRefreshToken 코드에서 HS256쿠키에 담긴 refreshToken의 무결성과 진위 여부를 검증하는 데 사용됩니다. JWT 서명 검증은 암호학적으로 다음과 같은 구조로 작동합니다:

signature = HMAC-SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
  • 예전에 지수님께서 준비하실 때는 HMAC 알고리즘이 대칭키 기반이며, 해시 충돌 회피와 메시지 무결성 검증에 사용된다는 점을 외웠어야 했는데,
  • 실무에서는 단지 .verify() 메서드만 호출하면 됩니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants