HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🍭
프로그래머스 데브코스 기동팀 스크럼!
/
기동_2팀
기동_2팀
/
📡
1차 프로젝트 회의록 정리 (10/14~11/3)
/
🌳
최종 발표
/
기동 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
 
대표 색상
  • #14bd7e
    • 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의 날짜를 이용하여 사용자별 진도율을 계산하여 사용하려 합니다