Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[정해찬] sprint5 #91

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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/auto-label-assign.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: PR 자동 라벨링 및 담당자 할당

on:
pull_request:
types: [opened, reopened]

jobs:
add-labels-assign:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Add labels and assign PR creator
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_NUMBER=${{ github.event.pull_request.number }}
PR_CREATOR=${{ github.event.pull_request.user.login }}

# Add labels
curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/$PR_NUMBER/labels \
-d '{"labels":["매운맛🔥", "진행 중 🏃"]}'

# Assign PR creator
curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/$PR_NUMBER/assignees \
-d "{\"assignees\":[\"$PR_CREATOR\"]}"
4 changes: 4 additions & 0 deletions .gitignore

Choose a reason for hiding this comment

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

gitignore는 협업 과정에서 중요한 설정 중 하나입니다. 프로젝트에 맞는 gitignore 설정 방법을 공부하시면 도움이 될 것 같습니다.

참고

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.DS_Store
._.DS_Store
**/.DS_Store
**/._.DS_Store
27 changes: 12 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# 🐼 판다마켓 프로젝트

> _이 저장소는 판다마켓 프로젝트의 프론트엔드 코드를 관리하는 곳입니다. 프로젝트를 클론하여 개발 환경을 설정하고, 각 브랜치에서 해당 스프린트 미션을 수행해 주세요!_ 🛠️

## 소개

안녕하세요! 판다마켓 프로젝트에 오신 것을 환영합니다! 🥳
판다마켓은 따뜻한 중고거래를 위한 커뮤니티 플랫폼이에요. 여러분은 이곳에서 상품을 등록하고, 다른 사용자들과 소통하며, 자유롭게 이야기를 나눌 수 있어요. 매주 스프린트 미션을 통해 기능을 하나씩 만들어 가며 성장해 나가는 여정을 함께해요. 🚀

![PandaMarket](https://github.com/user-attachments/assets/3784b99f-73c9-4349-a9a9-92b2a7563574)
_위 이미지는 판다마켓의 대표 이미지입니다. 프로젝트가 진행됨에 따라 더 많은 이미지를 추가할 예정이에요!_ 📸
_위 이미지는 판다마켓의 대표 이미지입니다._ 📸

## 스프린트 미션이란? 🤔

Expand All @@ -24,29 +26,24 @@ _위 이미지는 판다마켓의 대표 이미지입니다. 프로젝트가 진

### 브랜치 설명

1. **basic (part1): 스프린트 미션 1 ~ 4**
1. **basic (part1): 스프린트 미션 1 ~ 4 FE 요구사항**

- 기본적인 웹 애플리케이션 기능 구현을 위한 초기 단계입니다. HTML, CSS, JavaScript 등을 사용해 기본을 다집니다.
- 기본적인 웹 애플리케이션 기능 구현을 위한 초기 브랜치입니다. HTML, CSS, JavaScript 등을 사용해 기본을 다집니다.
- **스프린트 미션 1부터 4까지**의 프론트엔드 내용을 포함하고 있어요.

2. **react (part2): 스프린트 미션 5 ~ 7**
2. **react (part2): 스프린트 미션 5 ~ 7 FE 요구사항**

- React 라이브러리를 사용해 프론트엔드 기능을 구현하는 단계입니다. 컴포넌트 기반 아키텍처와 상태 관리를 배웁니다.
- **스프린트 미션 5부터 7까지**의 프론트엔드 내용을 포함하고 있어요.
- React 라이브러리를 사용해 프론트엔드 기능을 구현하는 브랜치입니다. 컴포넌트 기반 아키텍처와 상태 관리를 배웁니다.
- **스프린트 미션 5부터 7까지, 그 이후**의 프론트엔드 내용을 포함하고 있어요.
- 만약 스프린트 미션 9부터 프론트엔드 코드를 Next가 아닌 React로 구현하고 싶다면 react 브랜치를 사용해요.

3. **next (part3,4): 스프린트 미션 8 ~**
3. **next (part3,4): 스프린트 미션 8 FE 요구사항~**

- Next.js를 사용해 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 등 고급 기능을 구현합니다.
- **스프린트 미션 8부터** 시작하는 프론트엔드 내용을 포함하고 있어요.
- 만약 스프린트 미션 9부터 프론트엔드 코드를 React가 아닌 Next로 구현하고 싶다면 next 브랜치를 사용해요.

4. **express (part1): 스프린트 미션 4**

- 백엔드 서버 설정과 간단한 API 구현을 위한 Express.js 프로젝트의 초기 세팅이 포함돼요.
- **스프린트 미션 4**의 백엔드 내용이 포함돼 있어요.

5. **express (part2~4): 스프린트 미션 6 ~ 12**
- Express.js를 이용해 더 복잡한 백엔드 기능을 구현하는 단계입니다. 데이터베이스 연동, 인증 및 권한 관리 등 고급 API 설계가 포함됩니다.
- **스프린트 미션 6부터 12까지**의 백엔드 내용이 들어 있어요.
> _스프린트 미션 내 백엔드 요구사항은 [백엔드 레포지토리](https://github.com/codeit-sprint-fullstack/3-sprint-mission-be)의 브랜치에서 관리해주세요_

---

Expand Down
56 changes: 56 additions & 0 deletions pandamarket/api/ArticleService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import axios from "axios";

const ARTICLE_BASE_URL = 'https://sprint-mission-api.vercel.app/articles';

Choose a reason for hiding this comment

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

product url 과 main 도메인은 같고, path만 다른 것으로 보입니다. 이런 경우 별도의 파일로 분리하여 관리하는 방법도 생각해 볼 수 있을 것 같습니다.


axios.interceptors.request.use (
function(request) {
console.log('Request Interceptor 성공: ',request.method);
return request;
},
function(error) {
if(error.response) {
console.log('Request Interceptor 에러 발생: ',error.response.status);
return error;

Choose a reason for hiding this comment

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

에러가 발생했을 때는 대응할 수 있도록 코드가 작성되어야 합니다. 지금처럼 error를 반환할 경우 각 코드에서 일일히 에러 대응을 해야하는 등의 코드 중복이 발생할 수 있으며 심지어 정상응답처럼 코드가 동작하여 예기치 못한 상황이 발생할 수도 있습니다.
interceptors를 통해 일괄적으로 관리하는 방향으로 선택하셨다면 에러도 해당 코드 안에서 처리하는 방법을 고민해 보시는 것도 좋을 것 같습니다.

}
}
)

axios.interceptors.response.use (
function(response) {
console.log('Response Interceptor 성공: ',response.status);
console.log(response.data);
return response;
},
function(error) {
if(error.response) {
console.log('Response Interceptor 에러 발생: ',error.response.status);
return error;
}
}
)

export async function apiRequest(method,url,data = {},params = {}) {
const config = {method, url, data, params};
const response = await axios(config);
return response.data;
}

export async function getArticleList(keyword) {
return apiRequest('GET', ARTICLE_BASE_URL, {},{page:'1',pageSize:'100',keyword});

Choose a reason for hiding this comment

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

사소한 부분일 수도 있습니다만 page와 pageSize는 숫자(int)일 가능성이 높기에 문자열 처리를 하지 않는 편이 더 명확할 것 같습니다

}

export async function getArticle(id) {
return apiRequest('GET',`${ARTICLE_BASE_URL}/${id}`);
}

export async function createArticle(title,content,image) {
return apiRequest('POST',ARTICLE_BASE_URL,{title,content,image});
}

export async function patchArticle(id,title,content,image) {
return apiRequest('PATCH',`${ARTICLE_BASE_URL}/${id}`,{title,content,image});
}

export async function deleteArticle(id) {
return apiRequest('DELETE',`${ARTICLE_BASE_URL}/${id}`);
}
24 changes: 24 additions & 0 deletions pandamarket/api/ProductService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { apiRequest } from "./ArticleService.js";

const PRODUCTS_BASE_URL = 'https://sprint-mission-api.vercel.app/products';

export async function getProductList(keyword) {
return apiRequest('GET', PRODUCTS_BASE_URL, {}, {page:'1', pagsSize:'100', keyword});
}

export async function getProduct(id) {
return apiRequest('GET',`${PRODUCTS_BASE_URL}/${id}`);
}

export async function createProduct(name,description,price,manufacturer,tags,images) {
return apiRequest('POST',PRODUCTS_BASE_URL,{name,description,price,manufacturer,tags,images});
}

export async function patchProduct(id,name,description,price,tags,images) {
return apiRequest('PATCH',`${PRODUCTS_BASE_URL}/${id}`,{name,description,price,tags,images});
}

export async function deleteProduct(id) {
return apiRequest('DELETE',`${PRODUCTS_BASE_URL}/${id}`);
}

8 changes: 8 additions & 0 deletions pandamarket/api/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { getArticle, getArticleList, createArticle, patchArticle, deleteArticle } from "./ArticleService.js";
import { getProduct,getProductList,createProduct, patchProduct, deleteProduct } from "./ProductService.js";

getArticle(90);
getArticleList('정몽규');
createArticle('정해찬','test','test_image');
patchArticle(776,'patch_정해찬','patch_test','patch_image');
deleteArticle(776);
97 changes: 97 additions & 0 deletions pandamarket/api/node_modules/.package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions pandamarket/api/node_modules/asynckit/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading