야놀자 미니 프로젝트 - 숙박 예약 서비스
테스트 아이디 1: [email protected] 비밀번호: aaaa1111
테스트 아이디 2: [email protected] 비밀번호: bbbb1111
2023.11.06 - 11.16
리팩터링 기간: 2023.11.20 - 12.15
사용이유
사용이유
사용이유
사용이유
사용이유
따라서 React Query와 Axios를 결합해 사용하면 더욱 효율적으로 데이터를 관리할 수 있을 것이라 생각했습니다.
사용이유
사용이유
사용이유
사용이유
사용이유
-
로그인, 회원가입
-
전체 숙박 상품 목록 조회
-
카테고리를 임의 생성하여 분류하여 출력
-
개별 숙박 상품 상세 소개
-
숙박 상품 옵션 선택
-
장바구니 담기
-
바로 결제하기
-
장바구니 보기
-
장바구니에서 주문하기 버튼 클릭 시, 예약(주문) 페이지로 이동
-
만 14세 이상 이용 동의 (상세 설명서 X, 체크박스로만 간단히 처리)
-
결제하기 버튼 클릭 시, 상품을 주문한 것으로 처리 (별도 결제 로직 없음)
-
결제 성공 시 주문 결과 출력
-
별도 주문 내역 페이지를 통해 주문 내역 확인
- useForm을 사용해 각 항목에 대한 유효성 체크
- 로그인 시 유저정보 전역 상태로 담아 각 페이지에서 사용자 Id로 내정보 조회
- 실패 응답 값에 따라 존재하지 않는 회원이거나, 비밀번호 불일치 시 toast 알림 노출
- useForm을 사용한 각 항목에 대한 유효성 체크
- 값의 유무, 숫자 입력 제한, 글자 수에 따라 1차 필터
- 중복 데이터 서버 요청 후 boolean 응답 값에 따라 사용 가능 여부 알림
- 약관 동의 미체크 혹은 닉네임 중복 여부에 따른 버튼 활성화
- 회원가입 유효성 자동검사
- 모달 포트를 활용한 모달 구현
- 텍스트, 버튼동작 prop 전달
- 로그아웃 시 토큰 정보 제거 및 메인페이지 이동
-
이름, 주소, 예약 가능 여부, 전화번호, 소개, 위치, 옵션, 객실 표시
- 날짜, 가격 같은 계산이 필요한 부분들을 유틸 함수로 제작
- 쿼리 스트링을 통해 데이터를 구분하여 어디서 온 데이터인지 체크하여 그에 맞는 API 요청
- 내 데이터를 불러와서 수정과 유효성 체크를 한 후 API 요청
- axios instance를 만들어서 응답과 요청 전에 interceptor를 통해 토큰이 필요한 상황을 분리하지 않도록 하여 개발 비용을 줄이고 에러 핸들링을 쉽게 하도록 제작
📂 src
┣ 📂 api
┣ 📂 assets # 폰트, 이미지 ,아이콘
┣ 📂 components # 공용 컴포넌트
┃ ┣ 📂 common
┃ ┃ ┣ 📂 badge
┃ ┃ ┣ 📂 modal
┃ ┃ ┣ ...
┃ ┣ 📂 roomName
┃ ┣ 📂 termsAgreement
┃ ┣ ...
┣ 📂 constant
┃ ┣ validation
┃ ┣ ...
┣ 📂 hooks # 커스텀훅
┣ 📂 mocks
┣ 📂 pages # 페이지 컴포넌트
┃ ┣ 📂 accommodation
┃ ┣ 📂 basket
┃ ┣ 📂 home
┃ ┣ 📂 members
┃ ┣ 📂 order
┃ ┃ ┣ 📂 bookInformation
┃ ┃ ┣ 📂 orderItem
┃ ┣ ...
┣ 📂 routes
┣ 📂 states # 전역상태
┣ 📂 styles # 스타일테마
┣ 📂 types # 타입스크립트 공용 인터페이스
┣ 📂 utils
┣ App.tsx
┣ main.tsx
팀장 | 어준혁 | 팀원 | 고솔미 | 팀원 | 윤태관 | 팀원 | 이예인 | 팀원 | 정범환 |
---|---|---|---|---|
@Eojoonhyuk | @SOL-MI | @tkyoun0421 | @furaha707 | @Bumang-Cyber |
|
|
|
|
|
- 주요 에러 내용
-
CORS에러
- 동일 출처 정책(Same Origin Policy)을 지키지 않을 시 발생하는 에러입니다. 브라우저는 보안 상의 이유로 교차 출처 요청을 제한합니다.
-
Mixed Contents 에러
- 최초 html이 안전한 https 연결을 통해 되는 반면 다른 리소스(이미지, 동영상, 스타일 시트, …)들은 안전하지 않은 http 연결을 통해 로드를 시도할 때 발생하는 에러입니다.
-
- 에러 해결 방법
-
CORS에러 해결 방법
- 프론트엔드는 localhost와 5173이란 포트로 요청을 보내고 서버는 EC2 서버 호스트와 80 포트에서 응답하여 발생하였습니다. 백엔드 단에서 프론트 서버의 출처를 white list에 추가하여 해결해야 되는 문제였습니다. 그래서 백엔드에서 localhost:5173 으로 오는 요청을 열어 두어 문제를 해결하였습니다.
-
Mixed Contents 에러 해결 방법
- api를 http 혹은 https로 통일했어야 하는데 이를 혼합하여 api를 설계했기 때문에 발생한 문제였습니다. 이를 해결하기 위해서는 api를 완전 다시 설계하거나 혹은 프록시 서버를 이용한 우회로로 해결하는 방법을 시도해야 됐습니다. 그래서 프록시 서버를 돌리기 위해 Let's Encrypt라는 무료의 TLS/SSL 인증서를 발급받으려 했으나 이에 어려움을 겪고 결국 서버에서 도메인을 사서 로드밸런서를 연동하여 https 프로토콜 통신을 가능하게 했습니다.
-
고솔미
-
짧은 프로젝트 기간으로 인해 백엔드와 더욱 긴밀한 소통을 해볼 수 있는 값진 경험이 되었습니다. 원활한 소통을 위한 방법과 개발 기간을 효율적으로 사용하는 방법에 대해 많은 고민을 해보았습니다. 이슈나 궁금증이 생겼을 때 즉각적으로 소통할 수 있는 창구를 만들어 놓는 것이 중요한 것 같습니다. 저희는 디스코드에 항상 상주해 실시간으로 소통할 수 있도록 했고, 이는 프론트엔드 사이에서도, 프론트&백 사이에서 이슈가 생겼을 때 모두 빠르게 참여해 해결할 수 있는 환경을 만들어주었습니다.또한 코드리뷰를 매번 꼼꼼히 하는 환경을 조성해서 서로의 코드를 파악하고 있다보니 전체적으로 코드의 통일성도 높아지고, 큰 이슈 없이 프로젝트를 마칠 수 있었습니다.
-
lighthouse 점수를 높이는 것을 목표로 리팩토링을 진행해보았는데, 같은 동작을 하더라도 어떤 방식으로 코드를 짜고, 설계하는지에 따라 점수 차이가 큰 것이 와닿았었습니다. 코드 스플리팅과 font 최적화가 가장 큰 영향을 주었습니다. font가 주는 부담을 줄이기 위해서는 dynamic subset과 preload를 적용해보았습니다.
- 같은 동작을 하는 코드를 다양한 방식으로 다시 짜보고, 백엔드와 일정 조율에 있어서 이슈가 생겼을 땐 MSW도 도입해보며 성장하는 시간을 보낸 것 같습니다. 또한 재활용할 수 있는 공통 컴포넌트들을 여럿 제작해보며 확장성이 좋은 컴포넌트를 만드는 힘을 기를 수 있었습니다. 팀원분들께서 좋은 코드를 많이 짜주셔서 코드리뷰를 하면서도 많이 배울 수 있었습니다. 또한 늦은 시간에도 정성스런 답변을 해주신 멘토님께도 감사드립니다 :)
어준혁
이예인
윤태관
정범환
-
여행 숙박 예약이라는 큰 주제를 2주 안에 구현한다는 매우 밀도 높은 과제였습니다. 이를 위해 수많은 논의가 필요했고 제 역량보다 더 도전적인 과제들을 구현하는 일의 연속이었습니다. 그 과정에서 좋은 팀원분들이 매우 소통을 원활히 이끌어주셔서 해낼 수 있던 것 같습니다. 밤늦게까지 도와주신 멘토님께도 감사의 말씀 드립니다!
-
전역 상태 관리에 크게 경험치를 쌓을 수 있는 프로젝트였습니다. 여행 지역, 일정, 인원등을 여러 페이지에서 접근 가능한 전역데이터로 관리했는데 유저가 시험삼아 바꿔본 값이 페이지 이동 시 유지되는 페인 포인트가 있었습니다. 그래서 사용자가 '실제로 적용 버튼을 누르기 전까지의 값'과 '가장 최근 적용된 값'을 두 개 다 가지고 있다가 적용버튼을 누르지 않으면 가장 최근 적용된 값으로 보이게 설계했었는데, 이 부분에서 되게 많은 고민과 고충이 있어서 기억에 남네요. 좋은 경험치를 쌓을 수 있는 프로젝트였습니다!
커밋 컨벤션 | |
---|---|
feat | 새로운 기능 추가 |
fix | 버그 수정 |
env | 개발 환경 관련 설정 |
style | 코드 스타일 수정 (세미 콜론, 인덴트 등의 스타일적인 부분만) |
design | css 등 디자인 추가 및 수정 |
refactor | 코드 리팩토링 |
comment | 주석 추가/수정 |
docs | 내부 문서 추가/수정 |
test | 테스트 추가/수정 |
chore | 빌드 관련 코드 수정 |
rename | 파일 및 폴더명 수정 |
remove | 파일 삭제 |
이름 | 내용 |
---|---|
어준혁 | 1) API 요청 react-query로 변경 2) 공통 컴포넌트 폴더 구조 수정 |
고솔미 | 1) 폰트 로드 방식 수정으로 성능 최적화 (lighthouse 점수 개선 55점→96점) 2) FOUT 방식 적용 3) type 및 interface 정리, 에러/로딩 페이지 적용 등 리팩토링을 통한 가독성 및 완성도 향상 4) 반응형 스타일링 |
이예인 | 1) 토큰 갱신 로직 구현 2) 로그아웃 API 호출 및 토큰 해제 3) 리프레시 토큰 만료 시 재인증 유도 4) 반응형 스타일링 업데이트 |
윤태관 | 1) React.memo와 useCallback을 이용하여 필요하지 않은 재랜더링을 막아 성능 최적화 2) 필수 체크 박스가 체크되지 않았을 때 opacity로 구분 짓는것이 아니라 아예 체크가 안된 박스를 사용하여 사용자 경험성 향상 3) react-query를 사용하여 캐시된 데이터가 변경 되었을 때 refetch 함수를 사용하여 서버 통신을 통해 바로 화면에 반영 (주문 목록페이지 → 예약 아이템 취소 → 취소 목록에 아이템 생성) |
정범환 | 1) 헤더 반응형을 고려하여 태블릿 사이즈까지 지원, 브레이크 포인트 이하일 시 주요 버튼 텍스트 간소화. 2) 디테일 필터의 버그 수정(현재 선택되어진 카테고리 기준으로 필터링이 되는게 아니라 전체 기준으로 필터링 되는 버그 수정) 3) lottie.js를 활용한 에러, 로딩 중 인터랙션 추가 4) intersection observer, 리액트 쿼리 리패치보다 recoil 업데이트를 먼저 이루어지게 하기위한) 순서보장을 위해 썼던 setTimeout을 모두 제거 |