Skip to content

차곡: 사이드 프로젝트, 해커톤 공고 통합 플랫폼 - frontend 레포

Notifications You must be signed in to change notification settings

Chagok-Integrated-for-DevProject/Chagok-Frontend

Repository files navigation

차곡(Chagok)

사이드 프로젝트, 해커톤 등을 여러 사이트에서 크롤링하여 한 번에 보고 팀빌딩까지 할 수 있도록 해주는 웹 사이트.

🚸 팀 구성

프론트엔드2, 백엔드2, 디자이너1

📄 목차

  1. 기술 스택
  2. 커밋 컨벤션
  3. 브랜치 플로우
  4. 코드 컨벤션
  5. 프로젝트 아키텍처
  6. 기능 설명
  7. 폴더 구조



🚀 기술 스택

Language

Framework

State Management

Style

Testing

CI/CD



📝 커밋 컨벤션

Git Imoji Tag Name Description
🎉 Tada 프로젝트 시작
Feat 새로운 기능 추가
🐛 Fix 버그수정
🎨 Style 코드 포맷 변경, 세미 콜론 누락, 코드 수정이 없는 경우
💄 Design CSS 등 사용자 UI 변경 및 설계
♻️ Refactor 코드 리팩토링
📝 Docs 문서 수정
📦 Chore 빌드 업무, 패키지 매니저, 패키지 관지라 구성 등 수정
🚨 Lint eslintrc 수정 및 린트 에러 수정
🚀 Deploy 빌드 및 배포 작업
Test 테스트 코드, 리팩토링 테스트 코드 추가
🚚 Rename 파일 혹은 몰더명 수정하거나 옮기는 작업만 한 경우
🔥 Remove 파일을 삭제하는 작업만 한 경우



✨ 브랜치 플로우

  • Github flow 사용
  1. repository clone하기, fork (X)
  2. Main branch를 기준으로 sub branch만들기
  3. 진행상황 확인을 위해 commit내역 push 자주하기
  4. 1 기능, 1 PR 상대방이 review, 메인 브랜치에 merge, 해당 원격 브랜치 삭제
  5. branches rule: github action으로 testing 및 build가 성공적으로 수행되어야 merge 가능
  6. branch name pattern: [commit prefix]/[description]



✏️ 코드 컨벤션

🗃️ Nextjs Router

  • Pages Router

🔨 Code Formatting

  • eslint, prettier
  • husky & lint-staged를 사용하여 linting 자동화 및 강제성 부여

🎨 Emotion (styles)

  • styled-components 방식
  • [componentName].styles.ts 파일로 분리

🔐 React-Query

  • 버전: v4
  • query key 관리 방식: useQuery가 호출되는 위치에서 각자 관리

🏷️ Type 관리

  • 전역적으로 사용될 타입들: lib/types 폴더 안에 정의
  • 단일 컴포넌트 내에서 사용되는 타입들은 해당 컴포넌트 폴더 내에서 관리
  • interface의 경우 I, type의 경우 T를 이름의 첫글자로 한다.

🔖 관심사 분리 방식

  • custom hook 사용

🦺 Error 처리

  • 렌더링 관련 에러 처리: Nextjs Error Boundary - 공식문서
  • 서버사이드 에러: 500, 404 커스텀
  • 그 밖에 에러: 토스트 메세지를 통해 사용자에게 알림

✅ 테스팅

  • 현재까지 60개의 테스트 케이스 작성

    image



🚧 프로젝트 아키텍처

image



🧑‍💻 기능 설명

1. 회원가입 / 로그인

OAuth

A. OAuth 2.0 (Kakao, Google)

Kakao (Authorization Code Grant)
Google (Implicit Grant)

  1. frontend에서 KaKao와 Google Access token을 발급
  2. 발급 받은 KaKao or Google Access token을 백엔드 서버에 전달
  3. 백엔드 서버에서 KaKao or Google Access token으로 유저의 정보를 얻어 DB에 저장.
  4. 백엔드 서버에서 자체 access token, refresh token 생성

B. Refresh Token은 httpOnly쿠키, Access Token은 LocalStorage에 저장하고 만료시간을 짧게 하여 XSS와 CSRF에 대응하도록 함.



2. 랜딩페이지

홈

A. BookMark에 대한 유효성 검사

  • 로그아웃 상태일 경우 => "로그인이 필요합니다" 토스트 메세지
  • 로그인 상태일 경우 => 토스트 메세지를 사용하여 성공, 취소 알림. (Optimistic Update 적용)

B. 해커톤, 스터디/프로젝트 모집글을 서버사이드에서 Prefetch

image



3. 프로젝트 / 스터디 모집글

스터디프로젝트

A. 로딩 Fallback UI로 Skeleton 적용. (Layout Shift 방지)

B. 기술스택 + 검색어 조합에 따른 검색결과 표시 (Debounce 적용)

image

C. Offset Pagination 적용



4. 프로젝트 / 스터디 상세 정보

스터디프로젝트상세

A. InnerHTML형식의 TEXT를 렌더링 (sanitize를 하여 XSS에 대응)



5. 해커톤 공고글

해커톤

A. 해커톤 모집글에 대해 서버사이드에서 prefetch

image



6. 해커톤 상세 페이지

해커톤상세

A. InnerHTML형식의 TEXT를 렌더링 (sanitize를 하여 XSS에 대응)

B. 댓글 작성을 통해 해커톤 팀빌딩



7. 유저 닉네임, 프로필 이미지 수정

유저정보변경

A. 프로필 이미지 수정 조건

  • 파일 확장자가 jpg, png일 것 (정규표현식)
  • 파일 크기가 200kb이하 일 것
  • 조건에 맞지 않으면 토스트 메세지로 사용자에게 알림.

image



8. 유저 기술스택 변경

기술스택 변경



9. 유저 스크랩 목록 조회

스크랩변경



🏗️ 폴더 구조

src
├─components
│  ├─common
│  │  ├─arrow
│  │  ├─button
│  │  │  ├─pagination
│  │  │  ├─scrab
│  │  │  └─topScroll
│  │  ├─card
│  │  │  ├─hackathons
│  │  │  ├─mainBanner
│  │  │  └─projects
│  │  ├─dblArrow
│  │  ├─error
│  │  ├─hr
│  │  ├─layout
│  │  │  ├─body
│  │  │  ├─footer
│  │  │  └─header
│  │  ├─link
│  │  ├─loading
│  │  ├─logo
│  │  ├─mainBanner
│  │  ├─modal
│  │  └─skillContainer
│  ├─hackathons
│  │  ├─detail
│  │  │  ├─comment
│  │  │  │  ├─item
│  │  │  │  └─register
│  │  │  ├─original
│  │  │  │  └─test
│  │  │  └─summary
│  │  ├─list
│  │  └─recommendation
│  ├─home
│  │  ├─hackathons
│  │  ├─projects
│  │  │  └─utils
│  │  └─recommendation
│  ├─postDetail
│  │  ├─body
│  │  ├─floatingBox
│  │  └─header
│  ├─projects
│  │  ├─Loading
│  │  ├─projectList
│  │  ├─purposeFilter
│  │  ├─searchInput
│  │  ├─skillButton
│  │  └─skillFilter
│  ├─signup
│  │  ├─done
│  │  ├─name
│  │  ├─skill
│  │  └─social
│  └─userInfo
│      ├─profile
│      ├─scrab
│      └─skills
├─lib
│  ├─apis
│  ├─constants
│  ├─hooks
│  │  ├─useAccessToken
│  │  ├─useCheckNickNameMutation
│  │  ├─useCommentMutation
│  │  ├─useCommentsQuery
│  │  ├─useComponentMount
│  │  ├─useContestQuery
│  │  ├─useContestsQuery
│  │  ├─useDebounce
│  │  ├─useGetMyInfoQuery
│  │  ├─useInputHooks
│  │  ├─useJwtToken
│  │  ├─useModal
│  │  ├─useMyInfoMutation
│  │  ├─useProjectDetailQuery
│  │  ├─useProjectsQuery
│  │  ├─useStudiesQuery
│  │  └─useStudyDetailQuery
│  ├─mocks
│  │  └─data
│  ├─test-utils
│  ├─types
│  └─utils
│      ├─caculateDDay
│      ├─converToSkillId
│      ├─converToSkillIdParams
│      ├─convertToSkillSVG
│      ├─pagination
│      └─removeCRLF
├─pages
│  ├─api
│  ├─hackathons
│  │  └─[id]
│  ├─projects
│  │  └─[id]
│  └─userInfo
└─styles

About

차곡: 사이드 프로젝트, 해커톤 공고 통합 플랫폼 - frontend 레포

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •