-
Notifications
You must be signed in to change notification settings - Fork 2
1119 FE 회의록
김가은 edited this page Nov 20, 2023
·
1 revision
- 멘토링 피드백
- 로그인쪽 흐름 설계 (컴포넌트, 메소드)
- 프로젝트 폴더 구조
- 이슈 정리
[Feature-Sliced Design: The Best Frontend Architecture
# 프로젝트 구조 FSD 적용
.
├── ...config (package.json, vite.config.ts)
├── public
└── src/
├── app/
│ ├── App.tsx
│ └── Router.tsx
├── pages/
│ ├── home/
│ │ ├── index.ts
│ │ ├── ui
│ │ └── model
│ └── landing/
│ ├── index.ts
│ ├── ui
│ └── model
├── widgets/
│ ├── galaxy/
│ │ ├── index.ts
│ │ ├── ui
│ │ ├── lib
│ │ └── model
│ ├── login/
│ │ ├── index.ts
│ │ ├── ui/
│ │ │ ├── LoginModal.tsx
│ │ │ └── index.ts
│ │ ├── model/
│ │ │ ├── verification.ts
│ │ │ └── index.ts
│ │ └── api/
│ │ ├── login.ts
│ │ └── index.ts
│ └── signup/
│ ├── index.ts
│ ├── ui/
│ │ ├── SignUpModal.tsx
│ │ └── index.ts
│ ├── model/
│ │ ├── verification.ts
│ │ └── index.ts
│ └── api/
│ ├── signUp.ts
│ ├── duplicateCheck.ts
│ └── index.ts
├── features/
│ ├── backgroundStar/
│ │ ├── index.ts
│ │ ├── ui
│ │ └── model
│ └── entities/
│ └── postStar/
│ ├── index.ts
│ ├── ui
│ └── model
└── shared/
├── api
├── config/
│ └── constant.ts
├── lib/
│ ├── hooks
│ └── constant
└── ui/
├── input/
│ ├── Input.tsx
│ └── index.ts
├── button/
│ ├── Button.tsx
│ └── index.ts
└── modal/
├── Modal.tsx
└── index.ts
-
모달 라우팅
네, 페이지가 2개뿐이고 모든 동작이 모달에서 이루어지더라도 React Router를 사용하여 각 모달에 대한 라우팅을 설정할 수 있습니다. 이를 통해 사용자가 브라우저의 뒤로 가기 버튼을 클릭하면 이전 모달로 돌아갈 수 있게 하거나, 특정 URL을 통해 특정 모달을 직접 열 수 있게 할 수 있습니다. 아래는 React Router를 사용하여 모달 라우팅을 설정하는 간단한 예제입니다:
jsx import { BrowserRouter as Router, Route, Switch, useHistory } from 'react-router-dom'; import { useState } from 'react'; function App() { return ( <Router> <Switch> <Route exact path="/" component={HomePage} /> <Route path="/login" render={() => <ModalPage modalType="login" />} /> <Route path="/signup" render={() => <ModalPage modalType="signup" />} /> </Switch> </Router> ); } function HomePage() { const history = useHistory(); const openLoginModal = () => { history.push('/login'); }; const openSignupModal = () => { history.push('/signup'); }; // ... } function ModalPage({ modalType }) { const [isOpen, setIsOpen] = useState(true); const history = useHistory(); const closeModal = () => { setIsOpen(false); history.push('/'); }; return ( <> {isOpen && ( <Modal onClose={closeModal}> {modalType === 'login' && <LoginForm />} {modalType === 'signup' && <SignupForm />} </Modal> )} </> ); }
위의 예제에서
HomePage
컴포넌트에서 로그인 또는 회원가입 모달을 열기 위해history.push
를 사용하여 라우트를 변경합니다. 그리고ModalPage
컴포넌트에서는modalType
prop을 기반으로 어떤 모달을 표시할지 결정하고, 모달이 닫힐 때 루트 URL(/
)로 라우트를 변경하여 모달을 닫습니다. 이렇게 하면 각 모달에 대한 URL을 가지게 되며, 사용자는 브라우저의 뒤로 가기 버튼을 사용하여 이전 모달로 돌아갈 수 있습니다.
import { useState, useEffect } from 'react';
import axios from 'axios';
const BASE_URL = 'wow'; // import 해올 base url
export const useFetch = (api: string) => {
const [data, setData] = useState<any>(null);
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<any>(null);
useEffect(() => {
const fetchData = async () => {
try {
const res = await axios.get(BASE_URL + api);
setData(res.data);
setLoading(false);
} catch (err) {
setError(err);
setLoading(false);
}
};
fetchData();
}, [api]);
const refetch = async () => {
setLoading(true);
try {
const res = await axios.get(BASE_URL + api);
setData(res.data);
setLoading(false);
} catch (err) {
setError(err);
setLoading(false);
}
};
return { data, loading, error, refetch }; // 원하는것만 구조분해할당으로 꺼내쓰기!
};
© 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(화)