|
|
|
PM/팀장 이화여자대학교 손윤지 |
|
|
|
|
DS 동국대학교 박서연 |
DS 동국대학교 백지연 |
|
|
|
|
|
|
Front-end 팀장 한국항공대학교 송필수 |
Front-end 덕성여자대학교 권도희 |
Front-end 성신여자대학교 오지윤 |
Front-end 홍익대학교 이가연 |
|
|
|
|
|
|
Back-end 팀장 한국외국어대학교 박주희 |
Back-end 한국항공대학교 김강연 |
Back-end 한국항공대학교 박상혁 |
Back-end 숙명여자대학교 양어진 |
- 초기 프로젝트 생성 및 배포 진행
- 피드 페이지, 마이 페이지 UI 구현 및 API 연동
- 홈 페이지 API 연동
- 리드미 작성
- ESLint 설정
- 홈 페이지 UI 구현
- style 초기 세팅
- 모멘트 생성 페이지 UI 구현 및 API 연동
- route, instance, tanstack-query 설정
- 카카오 로그인 담당
- 모멘트 페이지 UI 구현 및 API 연동
- 각종 애니메이션 구현
MOMENT-FRONT\SRC
├─apis
├─assets
│ ├─images
│ └─svg
├─components
├─hooks
│ ├─common
│ └─queries
├─layouts
├─pages
│ └─Start
├─router
├─store
├─styles
├─types
└─utils
apis - axios 기반 instance 코드를 작성하고 ai api 코드를 관리합니다.
assets - 이미지 및 폰트를 관리합니다.
components- 컴포넌트를 관리합니다.
hooks - 리액트 훅을 관리합니다.
common- 공통적으로 사용되는 훅들을 관리합니다.ex) useInput, useModal, useToastqueries- React Query 기반 훅(api 요청 쿼리 코드)를 관리합니다.
layouts - 전체적인 레이아웃을 설정합니다. ex) 웹앱뷰, 중첩 라우팅
pages - 라우트 경로 기반 대표 페이지 컴포넌트를 관리합니다.
- 경로(주소)당 하나의 페이지 컴포넌트 대응
router - 라우트를 관리합니다.
store - context를 관리합니다.
styles - 스타일 코드를 관리합니다. ex) theme, mixin, GlobalStyle
types - 각종 타입을 관리합니다.
utils - 상수, mockData, 반복해서 사용되는 변수, 훅이 아닌 공통 함수 등을 관리합니다.
feat: 새로운 기능 및 주요 개발
fix: 버그 수정
chore: 초기 세팅
docs: 문서 수정(README)
style: 스타일 코드 혹은 간단한 수정
refactor: 코드 리팩토링
code review: 코드리뷰 반영
add: 라이브러리 및 패키지 설치, 관리
- 예시 -
feat: Todo 컴포넌트 생성 및 제출하기 이벤트 핸들러 작성
- 주기적인 배포 및 QA 반영을 위하여
- main 브랜치를 보다 안전하게 관리
Git-flow 전략을 기반으로 프로젝트와 부합한 브랜치를 정하였습니다.
- main: 최종 Merge를 하는 곳이며 프로젝트에 반영되는 버전입니다.
- develop: 최상위 개발 브랜치입니다. 각자의 개발 내용을 하나로 합칩니다.
- feature(커밋 타입/#이슈번호): 기능을 개발하는 브랜치입니다. 커밋 타입과 같이 기능에 맞게 브랜치명을 작성합니다.
- test: 개인 연습 브랜치입니다.
작업 단위로 이슈를 생성하며 이를 브랜치에 반영합니다.
- 작업 내역을 세분화하며 각 이슈마다의 작업 내용을 보다 명확히할 수 있습니다.
## ✨어떤 기능인가요?
>추가하려는 기능에 대한 간단한 설명을 해주세요
## ✔️TODOS
- [ ] TODO
- [ ] TODO
- [ ] TODO
## 🎶참고할 만한 자료
>공식 문서, 개발 블로그, 강의 자료 등 자유롭게 첨부해주세요.PR(Pull Request)를 통하여 머지 이전 작업 내용들과 팀원들과 공유합니다.
이후 코드리뷰를 진행 후 머지를 합니다.
## #️⃣연관된 이슈
>PR과 연관된 이슈 번호를 작성해주세요. ex) #이슈 번호, #이슈 번호
- close: #[issue number]
## 🪄작업 내용
>해당 이슈 그리고 이번 PR에서 작업한 내용들을 작성해주세요.
>뷰 작업 내용이 포함되었을 경우 사진 혹은 동영상 파일 첨부를 부탁드립니다!
-
-
## 💖리뷰 요청사항
>특별히 봐주셨으면 하는 부분, 나 좀 잘했다 하는 부분! 기타 당부의 말씀 등 자유롭게 작성해주세요.
-여러 커밋을 하나로 합쳐서 머지하며 로그를 깨끗이 유지할 수 있습니다.
- 여러 사람이 개발을 진행하지만 코드 스타일을 통일하여 가독성을 높인다
- 추후 유지보수에 용이하다
- 실수를 줄이고 버그를 예방할 수 있다
- 초기에 정의하여 작업 도중 발생하는 혼란과 갈등을 방지할 수 있다
camelCase작성const사용.let은 최대한 지양하며var는 사용하지 말아요- bool타입 변수의 경우
is,has,can으로 시작
camelCase작성- 컴포넌트 내부에서 동작하는 함수의 경우
handle로 시작 - Props 로 넘기는 함수의 경우
on으로 작성
UPPER_CASE작성 (_로 이어줌)
PascalCase작성- 컴포넌트 구조화 및 공통 컴포넌트 활용
- 하나의 폴더는 컴포넌트 파일 과 스타일 파일을 지님
- 버튼 컴포넌트의 경우 Btn으로 시작 ex)
BtnKakaoLogin,BtnSubmit
camelCase작성- 여러 props 존재시 interface 사용, 단일 prop의 경우 type 사용
-Props혹은-Prop으로 작성- children 타입은
React.ReactNode로 통일
- div 태그도 좋지만 section, nav, p 태그 등 다양한 태그 사용 지향 → seo 최적화
- 이미지 태그는 alt 속성 작성하기 → seo 및 이미지 최적화
- children 이 없을 경우 단일 태그로 작성
<Foo />- 속성이 2개 이상일 경우 줄 띄어쓰기
<Input name="name" value={value} onChange={handleChange} />//- 주석을 달 코드 상단에 작성
- 모든 주석은 공백으로 시작
- 2탭 → 가독성 용이
- prettierr 설정 예정
- 모든 함수는
화살표 함수로 정의 (컴포넌트 포함)- 익명 함수로 선언
const foo = () => {};
- 익명 함수로 선언
- 구조분해할당 활용
({ foo, bar }) - 변수 조합할 경우 리터럴 활용
${var}님 환영합니다 - for문 지양, forEach 혹은 map 활용
- jsx 내에서 사용 불가
- 선언형 프로그래밍 지향
- 반복 렌더링에서 최상위 태그의 key 값은 index 값이 아닌 고유한 값(name, id 등)으로 설정
- 조건문은 삼중 등호 연산자 지향
- 조건부 렌더링의 경우 삼항연산자 사용
- jsx 내부 사용 가능
- switch 문 사용시 break 활용
- div 태그도 좋지만 section, nav, p 태그 등 다양한 태그 사용 지향 → seo 최적화
tsx 코드랑 스타일 관련 ts 코드를 분리할 예정
S-dot 네이밍
S: ex. S import
//Temp.tsx
import * as S from './style.tsx';
export default function Temp() {
return <S.Wrapper></S.Wrapper>;
}-
style 코드를 따로 분류 하여 style 파일로 관리한다.
//Temp.style.ts import styled from 'styled-components'; export const Header = styled.header` position: absolute; top: 0; left: 0; display: flex; align-items: center; height: 9rem; `, export const Link = styled(Link)` display: flex; algn-items: center; font-size: 1.6rem; font-weight: 600; letter-spacing: -0.2rem; color: ${({ theme }) => theme.colors.gray100}; `;
- 최상위 div:
컴포넌트명Layout - 여러개를 감싸는 경우:
~Container - 1개의 요소를 감싸는 경우:
~Wrapper - div:
~Box - p:
~Paragraph - span:
~Span - nav:
~Navigation - ul, ol:
~List - li:
~Item - image:
~Image
- 모든 이미지 파일은 webp로 변환하여 사용 ← 성능 최적화
- svg는 컴포넌트화하여 관리
//Icon.tsx
const IcIcon = () => (
//svg 코드
);
export default IcIcon;
//Temp.tsx
import IcIcon from '../../assets/svg/Icon';
<IcIcon />import { ThemeProvider } from 'styled-components';- 프로젝트 전체에 일관된 스타일 요소 적용 가능
<ThemeProvider theme={theme}></ThemeProvider> 은 본 태그의 하위 태그들에게 공통으로 적용할 theme을 직접 커스텀할 수 있게 해줍니다.
- color 를 적용할 예정
import mixin from './mixin';
import { css } from 'styled-components';
const colors = {
normal: {
white: '#FFFFFF',
black: '#000000',
}
primary: {
default: '#f67402',
hover: '#f04f1e',
disabled: '#ffdace',
bg: '#ffece8',
bgDisabled: '#fff7f5',
},
category: {
yellow: '#ffeb3a',
aeroBlue: '#afffc6',
lightGreen: '#66d8a1',
sky: '#7cd0ff',
lightPurple: '#d2afff',
lightGray: '#C5C5C5',
}
};- 피그마 디자인 시스템을 토대로 도입 예정
- 사용법
export const CardWrapper = styled.div`
${({ theme: { mixin } }) => mixin.flexBox({direction: 'column'})};
color: ${({ theme }) => theme.colors.gray[700]};
${({ theme }) => theme.fonts.m_30_500};
}theme을 통하여 여러 스타일 속성값들을 변수처럼 활용하여 프로젝트에 적용할 수 있다면, GlobalStyle 을 통해서 기본적인 스타일 초기값들을 설정 가능
import { createGlobalStyle } from 'styled-components';
import reset from 'styled-reset';
const GlobalStyle = createGlobalStyle`
${reset};
a {
text-decoration: none;
}
* {
box-sizing: border-box;
}
button {
cursor: pointer;
border: none;
}
input {
outline: none;
}
:root {
--vh: 100%;
}
.
.
.
`;반복적인 스타일들을 재사용할 수 있도록 모아둔 스타일 그룹
https://ko.legacy.reactjs.org/blog/2016/07/13/mixins-considered-harmful.html
https://itmining.tistory.com/124
- 깊게 사용하지는 않고, flex 설정에만 사용할 예정
import { css } from 'styled-components';
interface MixinProps {
direction: string;
align: string;
justify: string;
}
const mixin = {
flexBox: ({ direction = 'row', align, justify }: MixinProps) => css`
display: flex;
flex-direction: ${direction};
align-items: ${align};
justify-content: ${justify};
`,
inlineFlexBox: ({ direction = 'row', align, justify }: MixinProps) => css`
display: inline-flex;
flex-direction: ${direction};
align-items: ${align};
justify-content: ${justify};
`,
flexCenter: ({ direction = 'column' }: MixinProps) => css`
display: flex;
flex-direction: ${direction};
align-items: center;
justify-content: center;
`,
};
export default mixin;import styled from 'styled-components';
export const FeedWrapper = styled.div`
${({ theme: { mixin } }) =>
mixin.flexBox({ direction: 'column', align: 'center' })};
`;


























