설정 관련 QnA (a.k.a 살려주세요🥕)
Q : API의 요청이 20가지가 넘는 상황인데 재 사용성과 가독성을 고려해서 모든 요청을 별도 함수로 만들어 놓는 것이 좋을까요? 종류가 많으니 하나의 API 함수에 여러가지 요청 URL을 바꾸어가며 사용하는 것이 좋을까요? API 종류가 많다 보니 의견이 갈려서 멘토님의 생각이 궁금합니다.
//1. 모든 요청을 별도 함수로 분리 const fetchUserList = (userId) => fetch(`${API_END_POINT}/get-users/${userId}`); const fetchPostList = (postId) => {} const fetchOnlineUser = () => {} const fetchChannels = () => {} // 이외 모든 API 요청들 // 재사용, 가독성이 더 좋지만 API 요청 종류가 많아 선뜻 적용하기 힘듭니다. //2. 하나의 fetch 함수에 URL과 Option을 넣어서 요청 const fetchAPI = (url, option) => fetch(`${API_END_POINT}/${url}, option).then(...) // 사용시 url과 option 파라미터를 달리하여 여러 API 요청 처리.
A : 일단 첫 번째 방법이 더 좋아보입니다. 정확히 말하면 url도메인마다 디렉토리로 구분하여 관리하시면 깔끔해질 수 있을것 같아요. 예를 들어 아래는 게시판 만드는 api이고, API ENDPOINT 같은 환경변수는 api 최상단에서 만들어서 사용할 수 있도록 커스텀하시면 될것 같습니다.
const endpoints = { noticeBoardList: "/noticeboard/", noticeBoardDetail: (id) => `/noticeboard-content/${id}/`, noticeBoardPopup: "/noticeboard-content/popup/", }; const authfetch = (endpoints, options) = { const token = window.localStorage.getItem('token') await axios(`${API_END_POINT}${endpoints}`, {...options, Authorization : token}); } const fetch = (endpoints, options) = await axios(`${API_END_POINT}${endpoints}`, {...options}); export default { async fetchNoticeBoardList() { const result = await fetch(`${API_END_POINT}${endpoints.noticeBoardList}`); return result; }, async fetchNoticeBoardDetail(id) { const result = await fetch(endpoints.noticeBoardDetail(id)); return result; }, };
06-09 Coffee Chat 기록
기획서에 Node.js, npm 버전 적기
UI Framework 선정 후 기획서에 추가 → mui
storybook 설정과 jsconfig 설정으로 절대경로 alias 적용해보기.
Redux와 Context API
→ Redux에 대한 기본 개념이 잡혀 있다면 사용하길 추천
→ Context API를 사용하는 추세이다. 프로젝트 크기가 크지 않아 더 깔끔할 수 있다.
라우터 세팅 전부 하고 배포
global css 적용 고려
Create와 Edit의 Endpoint를 분리해야 한다. (edit/:id)
좋아요의 state를 글로벌로? 비동기 처리 로직 경험해보고 고민해보기 (주의깊게)
github action을 이용해서 처리해보기 (husky, pre-commit)
로그인, 회원 가입, 포스트 작성과 수정에 집중하기
채널 목록에 카테고리 추가하기
최신순, 좋아요순 등의 필터 기능 고려하기
useCallback과 useMemo를 생략해보기. 습관적으로 추가하는 것은 성능의 이점도 없을 수 있다.
atomic design 적용 고려
task 분배
- url 라우트 페이지 별로 나누기 ( O )
- Atomic 컴포넌트로 나누기 → 만든 컴포넌트로 페이지 구성하기
TO DO → In Progress → In Review → Done
06-11 프로젝트 특강 기록
요구 사항
세부 개발 사항
햄버거 버튼 메뉴
하단 네비게이션 바
관심사
- 회원가입과 분리시켜서, 로그인한 상태에서 관심 채널을 설정할 수 있도록 한다.
- 즐겨찾기는 User 모델의 username에 저장한다. (임시)
메인 페이지
회원가입 페이지
- 사용자는 이메일과 비밀번호를 입력해 자신의 계정을 만들 수 있다.
- 중복된 이메일인 경우 사용자에게 알린다.
- 비밀번호와 비밀번호 확인이 일치하지 않을 경우 사용자에게 알린다.
- 계정의 생성이 완료된 경우 로그인 페이지로 이동한다.
로그인 페이지
- 사용자는 로그인 페이지에서 로그인 할 수 있다.
- 로그인 정보가 유효하지 않을 경우 사용자에게 알린다.
- 로그인이 완료된 경우 사용자가 이전에 있던 페이지로 이동한다.
전체 채널 리스트 페이지
- 사용자는 존재하는 채널의 목록을 볼 수 있다.
- 인증된 사용자는 자신의 즐겨찾기 목록을 리스트 상단에서 우선적으로 볼 수 있다.
- 즐겨찾기 된 목록은 시각적으로 표시되어 구분할 수 있어야 한다.
채널 페이지
- 사용자는 해당 채널에 있는 포스트의 목록을 조회할 수 있어야 한다.
- 사용자는 아래로 스크롤 하여 추가적인 포스트를 로딩 할 수 있다. (무한 스크롤)
- 사용자는 포스트를 클릭하여 포스트의 세부 내용을 볼 수 있다.
포스트 세부 내용 페이지
- 사용자는 채널에 있는 포스트를 눌러 모집의 세부 사항을 읽을 수 있다.
- 인증된 사용자는 포스트에 댓글을 입력할 수 있다.
- 인증된 사용자는 자신의 댓글을 삭제할 수 있다.
- 인증된 사용자는 포스트에 좋아요를 남길 수 있다.
- 인증된 사용자는 포스트에 자신이 남긴 좋아요를 취소할 수 있다.
포스트 작성 페이지
- 인증된 사용자는 채널에 포스트를 적어 모집을 시작할 수 있다.
- 인증된 사용자는 자신의 포스트에 태그를 입력해 모집의 목적을 표기할 수 있다.
- 인증된 사용자는 자신의 포스트를 수정할 수 있다.
- 인증된 사용자는 자신의 포스트를 삭제할 수 있다.
포스트 수정 페이지
- 포스트 작성 페이지와 유사하게 만든다.
통합 검색 페이지
- 사용자는 검색어를 입력해 검색어에 해당하는 사용자와 포스트를 검색할 수 있다.
- 사용자는 더 보기 버튼을 눌러 사용자 또는 포스트 검색 페이지로 이동한다.
포스트 검색 페이지, 사용자 검색 페이지
- 사용자는
알람 페이지
프로필 페이지
220613 클로즈 스크럼 프로젝트 논의사항
전체 수정사항
특정 페이지의 수정사항 말고, 전체적으로 수정되어야 하는 사항의 경우
develop_fix
브랜치에서 작업 후 develop
브랜치로 PR 작성하기- utils/fetch.js error시에도 return error
- 기본 레이아웃 Topbar와 BottomNavbar 둘다 fixed로 수정
Search Page에서 검색어 처리 방식에 대한 논의
진행 상황
- 문자의 길이가 2개 이하 일 경우 오류를 표기한다.

개발 예정
- 검색어에 특수 문자가 포함된 경우
- 처리 방식
- 별도의 오류 메세지 ( ex: ”특수 문자는 포함 될 수 없습니다”)
- 내부적으로 수정 →
replace
- replace 했을 때 글자 수가 달라지는 경우?
Channel, User 등 요청을 추가적으로 보내야 하는 경우가 생기는데?
⇒ 채널은 정적으로 정해지니까 어떤 게임의 채널인지 알 수 있다
⇒ 프로필 아이콘 + 게임이름 + 게임아이콘 정도?
inline style, sx 가급적 지양
// 가급적 지양 <div style={{ width: '100%' }}></div> <Box sx={{ width: '100%' }}></Box> // 가급적 추천 import styled from '@emotion/styled`; const myDiv = styled.div` width: 100%; `; const myBox = styled(Box)` width: 100%; `;
220614 클로즈 스크럼 프로젝트 논의사항
.env와 fetch url 통일
.env의 url에
/
를 붙이는 방법으로 통일
⇒ 광필, 동언 개인 수정채우님 카드가 3/3 스크롤인데 디자인 좀 수정?
페이스북처럼 탭으로 이동하는 방식으로 추가 예정
탭이 추가되면서 탭에 해당하는 url라우트와 페이지 추가
Route 수정
- 현재 url 쿼리문이 뒤로가도록 수정?
/:postId/edit
=>edit/postId
로 수정
- 검색 url 세분화
search/user
,search/post
라우트와 페이지 추가
chip color
기본적인 몇가지의 tag color
const chipColor = { '힐러': 'pink', }
PropTypes 통일
// 얘는 자동완성이 안됨 import { PropTypes } from 'prop-types'; import propTypes from 'prop-types'; // * 컨벤션 이걸로 사용 * import PropTypes from 'prop-types';
로그아웃의 위치?
햄버거 버튼 눌러서 나오는 Sidebar의 하단에 위치
토큰의 만료시간?
문제 상황
- 현재 서버쪽에서 토큰의 만료 시간을 확인하지 않는것으로 추정
- 고광필 로그인 후 2번째 로그인 요청 시 새로운 토큰이 오지만, 1번째 토큰으로도 요청이 성공한다
- 슬랙에 로그인 토큰 / 로그아웃 관련 기능 이상을 제보하는 경우가 많음
⇒ 이슈 작성 해놓고 킵
로그인 modal
마무리해서 공통컴포넌트로 추가할 예정
사용시 useState로 boolean 데이터 설정 후 넘겨주면 modal 켰다 끄기 가능
⇒ 글쓰기 등 액션에 대해 로그인 상태면 액션을 수행하고, 아니면 modal을 보여주는 식
context api
로그인 유무와 토큰만 필요할 줄 알고 context api를 사용하지 않고 훅으로 사용했으나
다른 요청 시 토큰 말고도 id도 필요함
⇒ context api 도입해보겠습니다
아이디 / 이메일?
아이디
로 진행영어 대문자, 소문자, 숫자만 가능하고, 특수문자는 불가능하도록 Form 필터링 필요
디펜스 특수문자
알파벳 대소문자 숫자만 포함
특수문자 금지
220615 클로즈 스크럼 프로젝트 논의사항
- post write text field Error가 unfocuse 상황에만 출력 되도록 수정
- bottum nav bar
url 변경에 따라서
value
값의 변경이 필요하다.
개인별 개발 중 논의사항
개발 중에
이거 애매한데 팀원들과 논의좀 해볼까?
하는 내용이 있으시면 생각날 때 여기에 적고 스크럼 때 회의할까요?채우님 3/3이 부족할경우 2/4나 1/5로?
최대 3/3이고 부족하면 1/3이나 2/2처럼 그냥 부족한채로 보여주고
0개일때만 검색된게없다고 하면 될듯
BottomNavbar 새로고침 문제
useState 초기값이 0이라서 문제로 보인다
location.href 같은걸로 url에 따라서 초기값을 변경해야 할듯
⇒ merge 후 변경했습니다 (아래 내용 참고)
Json 커스텀 데이터의 경우 Json.stringify 필수 사용!
미사용시 parse가 안될 수 있음
context api
develop
브랜치에 기본 코드 추가완료실사용 예제코드
// page1 import React from 'react'; import useValueContext from '@hooks/useValueContext'; import useActionContext from '@hooks/useActionContext'; import { Link } from 'react-router-dom'; function SignupPage() { const value = useValueContext(); console.log(value); const action = useActionContext(); console.log(action); return ( <div> SignupPage<Link to="/">Home</Link> <button type="button" onClick={() => action.changeTest(500)}> change 500 </button> </div> ); } export default SignupPage; //page2 import React from 'react'; import useValueContext from '@hooks/useValueContext'; import useActionContext from '@hooks/useActionContext'; import { Link } from 'react-router-dom'; function HomePage() { const value = useValueContext(); console.log(value); const action = useActionContext(); console.log(action); return ( <div> HomePage<Link to="/signup">signup</Link> <button type="button" onClick={() => action.changeTest(200)}> change 200 </button> </div> ); } export default HomePage;
두 페이지를 이동하면서 값을 바꾸는 실사용 예제 코드입니다
value, action은 구조분해로 원하는 값을 가져와 사용할 수 있습니다
merge 후 변경내용
- homepage key 수정
- assets 폴더 alias적용
- package.json build명령어 수정
- 동언님꺼에서 글쓰기링크 /pots에서 /posts/write로
- 동언님 슬랙대로 BottomNavbar
- 햄버거 사이드바에 임시 로그인 이동 추가
User객체의 posts 질문 남기기
⇒ 빈 객체로 내려와서
내가 쓴 글
이 맞는지 아닌지 질문했습니다username으로 즐겨찾기 넘길 때 [id1, id2] 형식으로 넘기기
users/get-users로 요청 보내면 다음과 같은 형식으로 나온다.
"username": "[\"62a7367f5517e27ffcab3bcb\",\"62a736a15517e27ffcab3bd5\",\"62a818db5517e27ffcab3ce2\"]"
즐겨찾기를 위한 Context API action
추후 수정 필요
const actions = useMemo( () => ({ // 생략 favorites(user) { setState((prevState) => ({ ...prevState, user, })); }, }), [] );
최신 Posts 불러오는 로직
/search/all/tt
tt로 검색해 불러오기