-
Notifications
You must be signed in to change notification settings - Fork 2
[가은] 1113(월) 개발기록
- 폴더 내에 index.tsx가 들어가면 폴더명 대문자로 시작, 그 외에는 폴더명 소문자로 시작하는 것으로 결정했다.
- 컴포넌트와 페이지는 index.tsx, styled.ts 파일로 구성한다.
- 일반적으로는 화살표 함수를 사용하되, 컴포넌트를 정의할 때는 일반 함수를 사용하기로 했다.
- 한 파일에서 하나의 컴포넌트만 export하는 경우에는
export default function
을 사용하는 것이 더 명확하다고 판단했다.
우리 프로젝트는 HashRouter를 쓰기로 결정했다.
SEO 최적화가 필요하지 않기 때문에, HashRouter를 쓰는 것이 더 괜찮다고 생각했다.
-
BrowserRouter
- HTML5의 history API를 활용한 라우터
- SSR에 적합
- 새로고침 or url 직접 접근 시 에러 발생할 수 있음
- 배포 상대적으로 어려움
-
HashRouter
- URL의 hash를 활용한 라우터
- CSR에 적합
- 새로고침 or url 직접 접근 시 에러 발생하지 않음
- 배포 상대적으로 간단함
컴포넌트를 만드는 도중 React.FC 타입을 사용하자는 의견이 나왔다.
이전에 분명 들어본 것 같았는데, 내가 왜 사용하지 않고 있었는지 정확히 기억이 나지 않았다.
찾아보니 아래와 같은 이유로 React.FC 타입을 권장하지 않고 있었다.
-
children prop이 옵셔널로 포함되어 props 타입이 명확하지 않음
- 팀원은 children을 props에 작성하지 않아도 된다는 점에서 React.FC를 쓰자고 말했었다.
- 하지만 이런 경우 children의 필요 여부를 코드로 알 수 없기 때문에 오히려 마이너스 요소가 될 수 있다.
- 코드의 의도를 명확하게 드러낼 수 없는 안티패턴이라고 한다.
-
제네릭을 지원하지 않음
그래서 우리는 React.FC를 사용하지 않고, props 옆에 타입을 정의하는 방법을 사용하기로 했다.
이전에 인턴을 할 때, children같은 요소의 타입을 지정할 때 여러 타입 중 무조건 ReactNode를 사용하라는 말을 들은 적이 있었다.
여기에 관해서도 기억이 잘 나지 않아 다시 찾아보았다.
비슷한 것으로는 ReactNode, ReactElement, ReactChild, JSX.Element가 있다.
-
ReactNode
- 가장 넓은 의미의 타입
- React 컴포넌트에서 렌더링될 수 있는 모든 타입을 포함한다.
-
ReactElement
- createElement 함수의 반환값이거나 JSX를 통해 생성되는 객체이다.
-
ReactChild
- ReactNode의 부분집합
- 렌더링될 수 있는 단일 노드
-
JSX.Element
- JSX를 반환하는 컴포넌트의 반환 타입
- ReactElement와 비슷하지만, Typescipt 환경에서 JSX 문법으로 작성된 React 요소를 나타내는 데 사용된다.
이전에 무조건 ReactNode를 사용하라고 하셨던 이유가, 이 타입이 가장 포괄적이고 안전하기 때문인 것 같다.
하지만 children을 설정할 때 조금 더 좁은 범위로 제한하고 싶다면 굳이 ReactNode로만 할 필요는 없을 것 같다.
기본적으로는 ReactNode를 사용하되 필요에 따라 다른 타입들도 써보자.
© 2023 debussysanjang
- 🐙 [가은] Three.js와의 설레는 첫만남
- 🐙 [가은] JS로 자전과 공전을 구현할 수 있다고?
- ⚽️ [준섭] NestJS 강의 정리본
- 🐧 [동민] R3F Material 간단 정리
- 👾 [재하] 만들면서 배우는 NestJS 기초
- 👾 [재하] GitHub Actions을 이용한 자동 배포
- ⚽️ [준섭] 테스트 코드 작성 이유
- ⚽️ [준섭] TypeScript의 type? interface?
- 🐙 [가은] 우리 팀이 Zustand를 쓰는 이유
- 👾 [재하] NestJS, TDD로 개발하기
- 👾 [재하] AWS와 NCP의 주요 서비스
- 🐰 [백범] Emotion 선택시 고려사항
- 🐧 [동민] Yarn berry로 모노레포 구성하기
- 🐧 [동민] Vite, 왜 쓰는거지?
- ⚽️ [준섭] 동시성 제어
- 👾 [재하] NestJS에 Swagger 적용하기
- 🐙 [가은] 너와의 추억을 우주의 별로 띄울게
- 🐧 [동민] React로 멋진 3D 은하 만들기(feat. R3F)
- ⚽️ [준섭] NGINX 설정
- 👾 [재하] Transaction (트랜잭션)
- 👾 [재하] SSH 보안: Key Forwarding, Tunneling, 포트 변경
- ⚽️ [준섭] MySQL의 검색 - LIKE, FULLTEXT SEARCH(전문검색)
- 👾 [재하] Kubernetes 기초(minikube), docker image 최적화(멀티스테이징)
- 👾 [재하] NestJS, 유닛 테스트 각종 mocking, e2e 테스트 폼데이터 및 파일첨부
- 2주차(화) - git, monorepo, yarn berry, TDD
- 2주차(수) - TDD, e2e 테스트
- 2주차(목) - git merge, TDD
- 2주차(일) - NCP 배포환경 구성, MySQL, nginx, docker, docker-compose
- 3주차(화) - Redis, Multer 파일 업로드, Validation
- 3주차(수) - AES 암복호화, TypeORM Entity Relation
- 3주차(목) - NCP Object Storage, HTTPS, GitHub Actions
- 3주차(토) - Sharp(이미지 최적화)
- 3주차(일) - MongoDB
- 4주차(화) - 플랫폼 종속성 문제 해결(Sharp), 쿼리 최적화
- 4주차(수) - 코드 개선, 트랜잭션 제어
- 4주차(목) - 트랜잭션 제어
- 4주차(일) - docker 이미지 최적화
- 5주차(화) - 어드민 페이지(전체 글, 시스템 정보)
- 5주차(목) - 감정분석 API, e2e 테스트
- 5주차(토) - 유닛 테스트(+ mocking), e2e 테스트(+ 파일 첨부)
- 6주차(화) - ERD
- 2주차(화) - auth, board 모듈 생성 및 테스트 코드 환경 설정
- 2주차(목) - Board, Auth 테스트 코드 작성 및 API 완성
- 3주차(월) - Redis 연결 후 RedisRepository 작성
- 3주차(화) - SignUpUserDto에 ClassValidator 적용
- 3주차(화) - SignIn시 RefreshToken 발급 및 Redis에 저장
- 3주차(화) - 커스텀 AuthGuard 작성
- 3주차(수) - SignOut시 토큰 제거
- 3주차(수) - 깃헙 로그인 구현
- 3주차(토) - OAuth 코드 통합 및 재사용
- 4주차(수) - NestJS + TypeORM으로 MySQL 전문검색 구현
- 4주차(목) - NestJS Interceptor와 로거
- [전체] 10/12(목)
- [전체] 10/15(일)
- [전체] 10/30(월)
- [FE] 11/01(수)~11/03(금)
- [전체] 11/06(월)
- [전체] 11/07(화)
- [전체] 11/09(목)
- [전체] 11/11(토)
- [전체] 11/13(월)
- [BE] 11/14(화)
- [BE] 11/15(수)
- [FE] 11/16(목)
- [FE] 11/19(일)
- [BE] 11/19(일)
- [FE] 11/20(월)
- [BE] 11/20(월)
- [BE] 11/27(월)
- [FE] 12/04(월)
- [BE] 12/04(월)
- [FE] 12/09(금)
- [전체] 12/10(일)
- [FE] 12/11(월)
- [전체] 12/11(월)
- [전체] 12/12(화)