HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
프로그래머스 웹 데브코스 1기
프로그래머스 웹 데브코스 1기
/
📌
프롱이 전용 페이지
/
🏏
프로젝트
/
📂
1차 기획서 모음
/
[기동 2팀] ReacTree
[기동 2팀] ReacTree
[기동 2팀] ReacTree
[기동 2팀] ReacTree

[기동 2팀] ReacTree

기동 2팀 프로젝트 기획서

기동 2팀 프로젝트 기획서🧭 리액트 가꿈이가 되어 나만의 리액트 나무를 키워보세요! 🥳팀 소개프로젝트 개요💾 기능 명세사용 API 기능 : 인증, 유저, 설정, 채널, 포스트, 좋아요, 댓글페이지 별 상세 기능 스펙🔍 UI 와이어 프레임⚙️ 컴포넌트 구조💘 협업 준비코드 스타일 합의 (Eslint, Prettier) 네이밍 컨벤션 깃, 깃허브 관련 협의 - 이슈 기반 ✅ API 추가 기능 요청 사항
 

🧭 리액트 가꿈이가 되어 나만의 리액트 나무를 키워보세요! 🥳


팀 소개

  • 팀명 : 가꿈이 (gakkum2)
  • 팀원 : 윤승록, 문승희, 김다슬
  • 프로젝트 명 : ReacTree

프로젝트 개요

프로젝트 주제
  • 자기주도적 React 학습 SNS 서비스
 
프로젝트가 추구하는 가치
  • 지식 공유
  • 자기주도 학습
  • 꾸준함
  • 소통
 
주제 선정 배경
데브코스를 진행하면서 누군가에게 내가 공부한 내용을 설명 할 때, 내 지식이 더욱 공고해지는 경험을 하게 되었다 다른 사람의 글을 읽고, 소통하는 과정을 통해 내 지식의 공백을 메울 수 있는 경험 또한 하게 되었다 그래서 우리는 이 둘을 한 곳에 아우를 수 있는 서비스를 기획했다
프로젝트 세부 내용
  • 사용자는 30일 동안 매일 리액트 관련 키워드에 대한 질문을 부여받는다. 사용자는 매일 주어진 질문에 대해 스스로 학습해 나가며 나름의 답변을 작성하여 제출한다
  • 또한, SNS 기능을 활용하여, 동일한 키워드를 학습하고 있는 다른 사용자의 답변이 공유되며 '댓글'과 '좋아요'를 통한 소통이 가능하다. 이를 통해 사용자는 해당 키워드에 대한 지식의 완성도를 높일 수 있다
  • 답변 내용이 트리 형태로 저장되어 나만의 리액트리(정리 노트)를 만들 수 있다
 
서비스 타겟층
  • 현재 사용자: 프로그래머스 프롱이 2기~
  • 잠재적 사용자: 리액트를 처음 학습하는 프론트엔드 개발자 준비생
 
기대효과
  • 사용자는 리액트 관련 키워드에 관한 자기주도적인 학습 경험을 토대로 이후 학습 계획 수립에 도움을 얻을 수 있음
  • 동일 키워드를 학습 중인 사용자들과의 소통을 통해서 지식의 완성도를 높일 수 있음
  • 30일 동안 진행되는 일련의 과제 수행을 통해, 성취감 고취 및 꾸준한 학습 습관 배양
 
기술 스택
  • 라이브러리: React,
  • 컴포넌트관리: StoryBook
  • 상태 관리: ContextAPI
  • 배포: Netlify
notion image
로고
'매일매일 나는 성장 할 수 있어!'
notion image
 
대표 색상
  • FFF8BC
    • notion image
  • EEF2BB
    • notion image

💾 기능 명세


사용 API 기능 : 인증, 유저, 설정, 채널, 포스트, 좋아요, 댓글

페이지 별 상세 기능 스펙

인트로 페이지
회원 가입 Modal
  • 회원 가입 페이지는 Modal로 구현합니다
  • 이메일, 풀네임, 패스워드를 입력 받습니다
  • 유효성 검사를 진행합니다
    • 이메일 - 정규 표현식을 이용한 검증, 중복 확인
    • 풀네임 - 한글로만 입력 가능, 최소 2자 이상 최대 6자
    • 패스워드 - 정규 표현식을 이용한 검증(영어 대소문자, 숫자, 특수문자), 패스워드 검증
    • 위의 조건 미 충족시 빨간색 글자로 warning 메세지
  • 회원 가입 요청 후 완료 시 완료 메세지(alert)를 띄어줍니다
  • 데이터를 하나라도 입력하지 않은 상태에서 회원가입 요청 시 실패 메세지(alert)를 띄어줍니다
  • 완료 후 로그인 페이지로 이동합니다
  • 이전으로와 x 버튼이 있고, 클릭 시 로그인 Modal로 이동합니다
로그인 Modal
  • 로그인과 회원 가입 버튼이 존재합니다
  • 회원 가입 버튼 클릭 시 회원 가입 Modal로 이동합니다
  • 회원 가입 시 입력한 이메일과 패스워드로 로그인이 가능합니다
  • 로그인이 성공하면 서버로 부터 토큰을 받고 받은 토큰을 로컬 스토리지에 저장합니다
  • 로그인에 성공하면 Welcome Modal로 이동합니다 🥳
웰컴 Modal
  • 웰컴 메세지를 2초간 띄어줍니다
  • 2초후 메인 페이지로 이동합니다
 
 
메인 페이지
Header
  • 로고를 클릭하면 메인 페이지로 이동합니다
  • 메뉴 탭(메인, 피드, 마이 트리, 설정)이 존재하며 해당 탭 클릭 시 해당 페이지로 이동이 가능합니다
NavChannel
  • 채널은 1~30개가 존재하며 버튼 컴포넌트로 구성됩니다
  • 각 채널 클릭시 해당 채널의 질문이 보여집니다
  • 사용자별 진도율의 경우 user API의 posts length와 createdAt의 날짜를 이용하여 계산합니다
  • 진도율에 따라 버튼이 열리고, 질문을 확인할 수 있습니다
NavSocial
  • 팔로우한 친구 목록을 볼 수 있습니다
  • 접속 중인 친구의 경우 뱃지로 확인이 가능합니다
  • 친구 추가 버튼이 존재하며, 버튼 클릭 시 Social Modal이 띄어집니다
  • Social Modal에는 searchbar가 존재하고, 이름으로 검색이 가능합니다
  • 검색한 유저의 팔로우 상태에 따라 팔로우 또는 언팔로우 버튼이 활성화됩니다
Main Contents Container
  • Question 컴포넌트에는 오늘의 질문이 보여집니다
  • 오늘의 질문 배경은 포스트잇 이미지이고 랜덤으로 불러옵니다
  • Answer 컴포넌트는 textarea 형태이며, 답변(Post)을 작성할 수 있습니다
  • 제출 버튼을 클릭하여 답변 제출이 가능합니다
  • 답변을 제출하면 제출 버튼은 수정 버튼, textarea는 readonly 상태로 변경됩니다
  • 수정 버튼을 클릭하여 textarea 수정이 가능합니다
  • 답변 제출 완료 시 alert 창이 뜨고, alert 창에는 오늘의 피드로 이동하기, 머무르기 버튼이 존재합니다
  • 사용자는 버튼을 클릭하여 오늘의 피드로 이동 또는 메인 페이지에 머무르기가 가능합니다
 
 
피드 페이지
Header
  • 로고를 클릭하면 메인 페이지로 이동합니다
  • 메뉴 탭(메인, 피드, 마이 트리, 설정)이 존재하며 해당 탭 클릭 시 해당 페이지로 이동이 가능합니다
NavChannel
  • 채널은 1~30개가 존재하며 버튼 컴포넌트로 구성됩니다
  • 각 채널 클릭시 해당 채널의 질문이 보여집니다
  • 사용자별 진도율의 경우 user API의 posts length와 createdAt의 날짜를 이용하여 계산합니다
  • 진도율에 따라 버튼이 열리고, 질문을 확인할 수 있습니다
NavSocial
  • 팔로우한 친구 목록을 볼 수 있습니다
  • 접속 중인 친구의 경우 뱃지로 확인이 가능합니다
  • 친구 추가 버튼이 존재하며, 버튼 클릭 시 Social Modal이 띄어집니다
  • Social Modal에는 searchbar가 존재하고, 이름으로 검색이 가능합니다
  • 검색한 유저의 팔로우 상태에 따라 팔로우 또는 언팔로우 버튼이 활성화됩니다
Feed Contents Container
  • Question 컴포넌트에는 오늘의 질문이 보여집니다
  • 전체 사용자의 답변이 무한 스크롤로 보여집니다
  • 각 답변에는 댓글과 좋아요를 달 수 있습니다
  • 답변의 길이가 길 경우 더보기 버튼을 이용해 답변 전체를 확인할 수 있습니다
  • 댓글은 특정 개수만 보여지며 더보기 버튼을 이용해 나머지 댓글들을 확인할 수 있습니다
  • 답변의 최상단은 나의 답변이 위치하며 좋아요 순으로 정렬되어 보여집니다
 
 
마이 트리 페이지
Header
  • 로고를 클릭하면 메인 페이지로 이동합니다
  • 메뉴 탭(메인, 피드, 마이 트리, 설정)이 존재하며 해당 탭 클릭 시 해당 페이지로 이동이 가능합니다
NavChannel
  • 채널은 1~30개가 존재하며 버튼 컴포넌트로 구성됩니다
  • 각 채널 클릭시 해당 채널의 질문이 보여집니다
  • 사용자별 진도율의 경우 user API의 posts length와 createdAt의 날짜를 이용하여 계산합니다
  • 진도율에 따라 버튼이 열리고, 질문을 확인할 수 있습니다
UnitContainer > unit > image(node)
  • 노드 30개는 unit의 형태로 나뉘어져 있습니다
  • 유저의 진도율에 맞춰 unit과 node가 활성화됩니다
  • 활성화되지않은 unit Icon 클릭 시 이전 학습 완료 독려 메세지가 화면에 출력됩니다
  • 활성화된 노드를 클릭하면 TreeModal이 띄어집니다
TreeModal
  • 내 답변과 내가 좋아요한 사용자의 답변 확인이 가능합니다
TreeCover
  • current-step(학습 진도율)에 맞춰 나무가 자랍니다
    • notion image
 
설정 페이지
Header
  • 로고를 클릭하면 메인 페이지로 이동합니다
  • 메뉴 탭(메인, 피드, 마이 트리, 설정)이 존재하며 해당 탭 클릭 시 해당 페이지로 이동이 가능합니다
MyInfoContainer
  • 카메라 버튼을 클릭하여 커버, 프로필 이미지 변경이 가능합니다
  • fullname과 이메일 확인이 가능합니다
  • fullname과 비밀번호 변경 기능이 있습니다
  • 수정 버튼을 클릭하여 내 정보 변경이 가능합니다
  • 내 정보를 변경하고 저장 버튼을 클릭하면 서버로 요청이 전달되고 화면의 요소는 readonly 상태로 변경됩니다.
 

🔍 UI 와이어 프레임


Figma

⚙️ 컴포넌트 구조


. └── pjt ├── README.md ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt ├── src │ ├── App.css │ ├── App.js │ ├── App.test.js │ ├── Components │ │ ├── base │ │ │ ├── Alert │ │ │ ├── Avatar │ │ │ ├── Badge │ │ │ ├── Button │ │ │ ├── Divider │ │ │ ├── Form │ │ │ ├── Input │ │ │ ├── Logo │ │ │ ├── ModalContainer │ │ │ ├── Question │ │ │ ├── SearchBar │ │ │ ├── Spinner │ │ │ ├── Text │ │ │ └── image │ │ └── domain │ │ ├── FeedcontentsContainer │ │ ├── Header │ │ ├── MaincontentsContainer │ │ ├── MyInfoContainer │ │ ├── NavChannel │ │ ├── Navsocial │ │ ├── SignInModal │ │ ├── SignUpModal │ │ ├── TreeCover │ │ ├── TreeModal │ │ ├── Node │ │ └── UnitContainer │ ├── assets │ │ ├── BigLogoImage │ │ └── LogoImage │ ├── contexts │ ├── hooks │ ├── index.css │ ├── index.js │ ├── logo.svg │ ├── pages │ │ ├── FEED │ │ │ ├── FeedcontentsContainer │ │ │ ├── Header │ │ │ ├── NavChannel │ │ │ └── Navsocial │ │ ├── INTRO │ │ │ ├── Alert │ │ │ ├── Button │ │ │ ├── Form │ │ │ ├── Logo │ │ │ ├── SignInModal │ │ │ ├── SignUpModal │ │ │ └── Text │ │ ├── MAIN │ │ │ ├── Alert │ │ │ ├── Header │ │ │ ├── MaincontentsContainer │ │ │ ├── NavChannel │ │ │ └── Navsocial │ │ ├── MYTREE │ │ │ ├── Header │ │ │ ├── NavChannel │ │ │ ├── TreeCover │ │ │ ├── UnitContainer │ │ │ └── TreeModal │ │ └── SETTING │ │ ├── Header │ │ └── MyInfoContainer │ ├── reportWebVitals.js │ └── setupTests.js └── yarn.lock
 

💘 협업 준비


코드 스타일 합의 (Eslint, Prettier)

notion image
✅
기존 룰에서 취사 선택하여 우리 팀에 맞는 룰만 취사 선택
// 예시 printWidth: 100, // 코드 라인 길이 tabWidth: 2, // 탭 간격, 스페이스 설정 시 2칸 띄어쓰기 singleQuote: true, // '' 작은 따옴표 사용 trailingComma: 'all', // , 자동으로 붙이기 semi: false, // ; 사용 안 함 useTabs: false, // tab키 사용. false 추천 == space 대체 arrowParens: 'always', // (x) => x, x => x로 전자처럼 괄호 유지 endOfLine: 'auto', bracketSpacing: true, // 대괄호 {} 사이 공백 jsxBracketSameLine: true, // JSX 요소 > 줄바꿈
 

네이밍 컨벤션

  • Component 는 Pascal Case (ex. Divider)
  • 변수명의 경우 Camel Case (ex. useForm)
  • 함수명의 경우 동사+목적어 (ex. useForm, displayHeader)
  • .으로 세 번 이상 depth 로 진입해서 접근하는 경우는 별도의 변수 선언하여 사용
  • 상수 변수는 대문자로 명명 (ex. ROOT_URL, API_KEY)
 

깃, 깃허브 관련 협의 - 이슈 기반

 
ISSUE 및 Projects 활용
이슈 등록 및 라벨 사용
  • feature: 기능 개발
  • question: 프로젝트 진행 중, 질문 사항 (비동기적으로)
  • discussion: 합의사항
  • etc. Github Projects 라벨 내용 참고
    • notion image
 
Projects 칸반 보드
  • To do, In progress, Review in progress, Done
    • notion image
       
 
Branch 관리
Git flow 방식
  • main-develop-issue_based_branch
    • notion image
 
Comit 메시지 관리
기존 커밋 메세지 컨벤션 차용
  • [참고 링크] https://doublesprogramming.tistory.com/256
    • notion image
 
 
PR 관리
.github 폴더를 이용한 템플릿화
  • Issue 템플릿
    • notion image
  • PR 템플릿
    • notion image
 
 
코드 리뷰
코드 리뷰 규칙
  • PR 이후 24시간 내 수행
  • 엣지 케이스, 개선 사항 제안
 
 

✅ API 추가 기능 요청 사항


🙇🏻‍♀️
NavChannel 컴포넌트 내부 질문의 경우, 사용자별 진도율에 따라 버튼의 활성화 여부가 다릅니다 이를 핸들링하기 위해서는 각 유저마다 현재 진도율을 저장하고 불러와야합니다 하지만 현재 유저 속성에는 이러한 정보를 저장할 프로퍼티가 없습니다 따라서 만약 user API에 currentStep이라는 number(1 ~ 30)값 추가가 가능한지 요청드립니다
💡
만약 필드 값 추가가 어려운 경우
→ user API의 posts length와 createdAt의 날짜를 이용하여 사용자별 진도율을 계산하여 사용하려 합니다