Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
83bef42
sprint mission2 push
BlueHamster530 Oct 15, 2025
7ceb00c
[FIX] product클래스 파일 분리, 캡슐화
BlueHamster530 Oct 17, 2025
d97ea80
[FIX] Article클래스 파일 분리, 캡슐화 진행
BlueHamster530 Oct 17, 2025
95fbb38
[DEL] 불필요한 주석 삭제
BlueHamster530 Oct 17, 2025
671b3de
Revert "[FIX] Article클래스 파일 분리, 캡슐화 진행"
BlueHamster530 Oct 17, 2025
0dae9bf
[DEL] 불필요한 주석 삭제
BlueHamster530 Oct 17, 2025
bfa7d1c
[FIX]Article관련 불필요한 코드 삭제
BlueHamster530 Oct 17, 2025
2662e55
Merge pull request #11 from BlueHamster530/유인학-sprint1
max-callstack Oct 22, 2025
be279da
[ADD] sprint3 내용 추가
BlueHamster530 Nov 6, 2025
885b172
Merge pull request #54 from BlueHamster530/유인학-sprint3
kyungseopk1m Nov 9, 2025
347bb38
스프린트4 시작
BlueHamster530 Nov 25, 2025
8f13cd5
[FIX] 에러핸들러, prismaclient 인스턴스 패턴 추가
BlueHamster530 Nov 25, 2025
f1aca6f
[FIX] api파일 이름 controller 로 변경
BlueHamster530 Nov 25, 2025
d7d632e
[FIX]express의 싱글톤패턴화
BlueHamster530 Nov 25, 2025
de07cd9
[FEAT] 회원가입, 로그인 기능 추가
BlueHamster530 Nov 26, 2025
c6e41ad
[FEAT] 비밀번호 해싱 추가
BlueHamster530 Nov 26, 2025
a8a7d74
[feat] 비밀번호 해싱, jwt기반 토큰 로그인, accesstoken 구현
BlueHamster530 Nov 27, 2025
8ebb91a
[FEAT] 로그인 유저만 상품 등록, 수정, 변경 추가 등
BlueHamster530 Nov 27, 2025
573f68f
[FEAT] refresh토큰 제작
BlueHamster530 Nov 27, 2025
79cddba
[FEAT] 게시글, 댓글 등록 인가 추가
BlueHamster530 Nov 27, 2025
e57d75c
[feat] 자기 정보 조회 구현
BlueHamster530 Nov 27, 2025
39cf97f
[FEAT] 유저관련 기능, 좋아요 기능 추가
BlueHamster530 Nov 29, 2025
e348a48
Merge pull request #84 from BlueHamster530/유인학-sprint4
eunji-codeit Dec 3, 2025
f84aa7d
[FIX] REAMD.me 수정
BlueHamster530 Dec 3, 2025
af5a1f9
Service,structs,main 파일 마이그레이션
BlueHamster530 Dec 5, 2025
573dbc0
auth.ts 마이그레이션
BlueHamster530 Dec 5, 2025
c0b72d0
[FEAT] 스프린트 미션 5개발완료
BlueHamster530 Dec 9, 2025
91de85f
[스프린트 미션8]
BlueHamster530 Jan 19, 2026
4c2c1cb
readme 수정
BlueHamster530 Jan 19, 2026
4e85dec
[수정] comment관련 기능 분리
BlueHamster530 Jan 19, 2026
968ff8d
Layer코드 분리 , 댓글 달리면 알람
BlueHamster530 Jan 19, 2026
d09a70d
[추가] 가격 변동시 알림
BlueHamster530 Jan 20, 2026
68a5b62
[추가] 알림 컨트롤
BlueHamster530 Jan 20, 2026
a5ca40b
[수정] 기능 테스트 프론트 페이지 수정
BlueHamster530 Jan 20, 2026
d7e0ffa
미션8 피드백 수정, 미션9 제작
BlueHamster530 Feb 1, 2026
a97c5d5
스프린트10 미션 중간 저장
BlueHamster530 Feb 8, 2026
d3511e8
dist파일 트래킹취소
BlueHamster530 Feb 8, 2026
1ac28d9
수정 : dist 폴더 트래킹 취소
BlueHamster530 Feb 8, 2026
bd8986e
prisma 폴더 추가
BlueHamster530 Feb 8, 2026
a8c56ab
infra파일 추가
Feb 8, 2026
aa01be5
테스트 코드 및 일부수정
BlueHamster530 Feb 8, 2026
a04db02
apitest페이지 내 api url 수정
BlueHamster530 Feb 8, 2026
dad0f44
env 내 사용되는 환경변수에 맞게 내부 코드 수정
BlueHamster530 Feb 8, 2026
5c6312f
인바운드 아웃바운드 규칙 이미지 추가
BlueHamster530 Feb 8, 2026
c33c1f8
멘토님 피드백 수정
BlueHamster530 Feb 11, 2026
8dc28eb
파일 경로 재정의
BlueHamster530 Feb 11, 2026
f60b8e7
파일 경로 재정의
BlueHamster530 Feb 11, 2026
20e3c97
github action test
BlueHamster530 Feb 13, 2026
e2b7c9a
일부 코드 참조 경로 에러 수정
BlueHamster530 Feb 13, 2026
7ac7950
테스트코드 정상화
BlueHamster530 Feb 15, 2026
1d95044
deploy workflows 제작
BlueHamster530 Feb 15, 2026
0750606
업로드 테스트 코드 수정
BlueHamster530 Feb 15, 2026
76816a4
depoly 수정
BlueHamster530 Feb 15, 2026
4eaf92c
Dwa
BlueHamster530 Feb 15, 2026
0b47170
test.yml 수정
BlueHamster530 Feb 15, 2026
20bae3d
deplo.yml 수정
Feb 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Deploy to EC2

on:
push:
branches:
- main

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: Deploy to EC2
uses: appleboy/ssh-action@v1.0.3 # 버전을 v1.0.3 최신으로 올리는 것을 권장합니다
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
port: 22
script: |
# 1. EC2 내부의 프로젝트 폴더로 이동
cd 6-sprint-mission

# 2. GitHub에서 최신 코드 당겨오기
git pull origin main

# 3. 🚨 기존 PM2 방식 대신 Docker Compose로 빌드 및 백그라운드 실행!
# npm install이나 build 명령어는 Dockerfile 내부에서 알아서 처리됩니다.
docker-compose up -d --build

echo "Docker Deployment successful!"
72 changes: 72 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# .github/workflows/test.yml
# 이 GitHub Actions 워크플로우는 main 브랜치로의 푸시 또는 Pull Request가 생기면 자동으로 테스트를 실행합니다.
# 통합 테스트를 위해 PostgreSQL 데이터베이스를 함께 실행합니다.

name: Test

on:
push:
branches:
- main # main 브랜치에 푸시될 때 실행
pull_request:
branches:
- main # main 브랜치로 향하는 Pull Request가 생성 또는 업데이트될 때 실행

jobs:
test:
runs-on: ubuntu-latest # GitHub에서 제공하는 Ubuntu 리눅스 머신에서 실행

# PostgreSQL 서비스를 Docker 컨테이너로 함께 실행
services:
postgres:
image: postgres:15 # PostgreSQL 15 버전 사용
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: testdb
ports:
- 5432:5432 # 로컬에서 5432 포트를 통해 접근 가능
options: >- # DB가 준비될 때까지 기다리는 설정 (헬스 체크)
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5

# 전체 테스트 환경에서 사용할 공통 환경변수
env:
# PostgreSQL 연결 정보 (Prisma가 이 값을 사용하여 DB 접속)
DATABASE_URL: postgres://postgres:postgres@localhost:5432/testdb

# API 기본 주소 및 포트 (예: supertest 등에서 사용)
BASE_URL: http://localhost:3000
PORT: 3000

# JWT 서명을 위한 시크릿 키 (테스트용 더미 값)
JWT_SECRET: test-secret-key

# AWS 관련 설정 - 실제 AWS 리소스를 사용하는 경우에는 Secrets로 값 주입 필요
AWS_S3_REGION: ${{ secrets.AWS_S3_REGION }}
AWS_S3_ACCESS_KEY: ${{ secrets.AWS_S3_ACCESS_KEY }}
AWS_S3_SECRET_KEY: ${{ secrets.AWS_S3_SECRET_KEY }}
AWS_S3_BUCKET_NAME: ${{ secrets.AWS_S3_BUCKET_NAME }}

steps:
- name: Checkout code
uses: actions/checkout@v3 # GitHub 저장소의 코드를 가져옴

- name: Set up Node.js
uses: actions/setup-node@v3 # Node.js 실행 환경을 설치
with:
node-version: "lts/*" # 또는 프로젝트에 필요한 Node.js 버전

- name: Install dependencies
run: npm install # 프로젝트 의존성 설치

- name: Apply DB Schema
run: npm run prisma:migrate # Prisma 마이그레이션 적용 (testdb에 스키마 반영)

- name: Type Check
run: npm run typecheck # TypeScript 타입 검사 수행

- name: Run Tests
run: npm run test # 테스트 실행 (예: Jest, Supertest 등 포함)
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules/
.env
__http__/
dist/
coverage/
30 changes: 30 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
// IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
// 기존 특성에 대한 설명을 보려면 가리킵니다.
// 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug TypeScript",
"runtimeArgs": ["-r", "ts-node/register"],
"args": ["${workspaceFolder}/src/main.ts"]
},
{
"command": "npm start",
"name": "Run npm start",
"request": "launch",
"type": "node-terminal"
},
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/dist/main.js"
}
]
}
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"prisma.pinToPrisma6": true
}
29 changes: 29 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
## 미션 목표

- [ ] Github Actions로 테스트, 배포 자동화
- [ ] Docker 이미지 만들기

## 요구사항

### Github Actions 활용

- [ ] 브랜치에 pull request가 발생하면 테스트를 실행하는 액션을 구현해 주세요.
- [ ] main 브랜치에 push가 발생하면 AWS 배포를 진행하는 액션을 구현해 주세요.
- [ ] 개인 Github 리포지터리에서 Actions 동작을 확인해 보세요.

### Docker 이미지 만들기

- [ ] 다음을 만족하는 Dockerfile과 docker-compose.yaml을 작성해 주세요.
- [ ] Express 서버를 실행하는 Dockerfile을 작성해 주세요.
- [ ] Express 서버가 파일 업로드를 처리하는 폴더는 Docker의 Volume을 활용하도록 구현해 주세요.
- [ ] 데이터베이스는 Postgres 이미지를 사용해 연결하도록 구현해 주세요.
- [ ] 실행된 Express 서버 컨테이너는 호스트 머신에서 3000번 포트로 접근 가능하도록 구현해 주세요.

## 제출 안내

### 주의

- [ ] AWS 인증 정보들을 제출 코드에 포함하지 마세요!

- [ ] Github actions는 .github/workflows/ 폴더에 저장해서 제출합니다.
- [ ] Docker 관련 파일들은 프로젝트 폴더 최상위에 저장합니다.
33 changes: 33 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# version: "3.8"

# services:
# db:
# image: postgres:15-alpine
# container_name: pandamarket-db
# restart: always
# environment:
# POSTGRES_USER: myuser
# POSTGRES_PASSWORD: mypassword
# POSTGRES_DB: pandamarket
# ports:
# - "5432:5432"
# volumes:
# - pgdata:/var/lib/postgresql/data # DB 데이터 영구 저장

# app:
# build: .
# container_name: pandamarket-app
# restart: always
# ports:
# - "3000:3000" # 호스트 머신의 3000포트와 컨테이너의 3000포트 연결
# environment:
# # db 서비스의 이름('db')을 호스트처럼 사용하여 연결
# DATABASE_URL: "postgresql://myuser:mypassword@db:5432/pandamarket?schema=public"
# volumes:
# # 호스트의 ./uploads 폴더와 컨테이너 내부의 /app/uploads 폴더를 연결 (Volume 활용)
# - ./uploads:/app/uploads
# depends_on:
# - db # db 컨테이너가 먼저 실행된 후 app 컨테이너 실행

# volumes:
# pgdata:
22 changes: 22 additions & 0 deletions dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Node.js 공식 이미지를 기반으로 생성 (버전은 현재 사용하는 버전에 맞게 수정)
FROM node:22

# 컨테이너 내에서 작업할 디렉토리 설정
WORKDIR /app

# 패키지 관련 파일 먼저 복사 (캐시를 활용하여 빌드 속도 향상)
COPY package.json package-lock.json ./

# 의존성 패키지 설치
RUN npm ci

# 소스 코드 전체 복사
COPY . .

RUN npm run build

# 컨테이너에서 접근 가능하도록 포트 노출
EXPOSE 3000

# 서버 실행 명령어 (package.json의 스크립트 기준)
CMD ["npm","run", "start"]
11 changes: 11 additions & 0 deletions infra/ec2/ecosystem.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports ={
apps: [{
name: "yoo-pandamarket",
script: "./dist/main.js",
instances: 1,
exec_mode: "fork",
env_production:{
NODE_ENV: "production",
}
}]
}
13 changes: 13 additions & 0 deletions infra/ec2/nginx.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
server {
listen 80;
server_name 52.79.184.244;

location / {
proxy_pass http://localhost:3000; # Express 서버 포트
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Binary file added infra/ec2/secure-group-inbound.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added infra/ec2/secure-group-outbound.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions infra/ec2/start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
cd /home/ec2-user/6-sprint-mission

pm2 start /home/ec2-user/6-sprint-mission/infra/ec2/ecosystem.config.js --env production

pm2 status
Binary file added infra/rds/secure-group-inbound.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added infra/rds/secure-group-outbound.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added infra/s3/policy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
collectCoverage: true,
coverageDirectory: 'coverage',
coveragePathIgnorePatterns: ['/node_modules/', '/dist/', '/tests/'],
testMatch: ['**/*.test.ts'],
verbose: true,
};
31 changes: 31 additions & 0 deletions launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
// IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
// 기존 특성에 대한 설명을 보려면 가리킵니다.
// 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug TypeScript",
// "runtimeExecutable": "/home/bluehamster/.nvm/versions/node/v18.16.0/bin/node",
"runtimeArgs": ["-r", "ts-node/register"],
"args": ["${workspaceFolder}/src/main.ts"]
},
{
"command": "npm start",
"name": "Run npm start",
"request": "launch",
"type": "node-terminal"
},
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/dist/main.js"
}
]
}
Loading
Loading