8.1. 기능정의서를 기반한 라이브러리의 특징과 장점, 단점 조사자료 - TEAM-PROJECT-ACC/trip-at-five-client GitHub Wiki
작성자 : 윤석준
- 그 외 항목 (햄버거 메뉴, 버튼, 카드, 폼)
- Material-UI (MUI): Material Design 시스템을 따르는 아름다운 UI와 풍부한 커스터마이징 옵션을 선호하는 경우에 적합합니다.
- Ant Design: 깔끔하고 기능적인 UI와 강력한 폼 관리 기능을 내장한 기업용 애플리케이션 개발에 적합합니다.
- React Bootstrap: Bootstrap 기반의 디자인 시스템과 빠르게 통합하고 반응형 레이아웃을 쉽게 구성해야 하는 경우에 적합합니다.
라이브러리명 | 사용 컴포넌트 | 햄버거메뉴 특징 |
---|---|---|
Material-UI | Drawer | 접근성(ARIA) 속성을 잘 지원합니다. 커스터마이징 옵션이 다양하며, 테마 설정을 통해 전체적인 스타일을 쉽게 변경할 수 있습니다. 내부적으로 상태 관리를 처리하며, 간단한 props 설정을 통해 제어가 가능합니다. Material Design 시스템을 따르는 부드러운 애니메이션과 스타일을 제공합니다. |
Ant Design | Drawer | 깔끔하고 현대적인 스타일을 제공하며, 기업용 애플리케이션에 적합한 디자인을 갖습니다. 다양한 props를 통해 크기, 위치, 애니메이션 속도 등을 세밀하게 제어할 수 있습니다. 국제화(i18n)를 잘 지원합니다. Menu컴포넌트와 함께 사용하여 계층적인 탐색 메뉴를 구성하기 용이합니다. |
React Bootstrap | Offcanvas | Bootstrap의 기본적인 스타일을 따르므로, Bootstrap 기반의 레이아웃과 일관성을 유지하기 쉽습니다. show prop을 통해 표시 여부를 제어하며, 이벤트 핸들러를 통해 열고 닫는 동작을 관리해야 합니다. 반응형 디자인에 맞춰 쉽게 구현할 수 있도록 클래스 기반으로 스타일이 제공됩니다. 접근성 측면에서 기본적인 지원을 제공합니다. |
라이브러리명 | 사용 컴포넌트 | 버튼 특징 |
---|---|---|
Material-UI | Button | 아이콘, 로딩 상태 등을 쉽게 통합할 수 있습니다. 접근성(ARIA) 속성을 잘 지원합니다. 테마 설정을 통해 전체적인 버튼 스타일을 일관성 있게 관리할 수 있습니다. Material Design 시스템을 따르는 다양한 스타일과 애니메이션 효과를 제공합니다. |
Ant Design | Button | 깔끔하고 기능적인 스타일을 제공하며, 다양한 상황에 맞는 버튼 스타일을 쉽게 적용할 수 있습니다. 아이콘, 로딩 상태 등을 쉽게 통합할 수 있습니다. 국제화(i18n)를 잘 지원합니다. 다양한 이벤트 핸들러 props를 제공하여 버튼 동작을 제어할 수 있습니다. |
React Bootstrap | Button | Bootstrap의 기본적인 스타일을 따르므로, Bootstrap 기반의 디자인 시스템과 일관성을 유지하기 쉽습니다. 아이콘 통합을 위해 별도의 라이브러리 (예: React Icons)와 함께 사용하는 경우가 많습니다. 기본적인 클릭 이벤트 핸들러 props를 제공합니다. disabled, active 등의 상태를 쉽게 제어할 수 있습니다. |
라이브러리명 | 사용 컴포넌트 | 카드 특징 |
---|---|---|
Material-UI | Card, CardContent, CardActions, CardMedia, CardHeader |
Material Design 시스템을 따르는 그림자 효과와 레이아웃 구조를 제공합니다. 다양한 하위 컴포넌트를 통해 헤더, 내용, 액션, 미디어 영역을 명확하게 분리하여 구성할 수 있습니다. 커스터마이징 옵션이 다양하며, 스타일 오버라이딩을 통해 세부적인 디자인 변경이 가능합니다. |
Ant Design | Card, props(title, extra, actions, cover) | 깔끔하고 정돈된 스타일을 제공하며, 다양한 콘텐츠를 담기에 적합한 레이아웃을 제공합니다. grid속성을 통해 카드 내부의 콘텐츠를 그리드 형태로 쉽게 배치할 수 있습니다. actionsprop을 통해 카드 하단의 액션 버튼들을 배열 형태로 쉽게 추가할 수 있습니다. |
React Bootstrap | Card, props(bg, text, border) | Bootstrap의 클래스 기반 스타일을 따르므로, Bootstrap 기반의 레이아웃과 일관성을 유지하기 쉽습니다.. 반응형 디자인에 맞춰 카드 레이아웃을 쉽게 조정할 수 있습니다.. 기본적인 카드 구조를 제공하며, 필요에 따라 추가적인 스타일링이 필요할 수 있습니다. |
라이브러리명 | 사용 컴포넌트 | 폼 (Form) 특징 |
---|---|---|
Material-UI | TextField, FormControl, InputLabel, Select, Checkbox, Radio, FormHelperText | Material Design 시스템을 따르는 세련된 폼 디자인과 애니메이션 효과를 제공합니다. FormControl을 통해 레이아웃 및 접근성을 관리하고, FormHelperText를 통해 에러 메시지나 설명을 제공합니다. 유효성 검사 연동을 위한 다양한 props와 기능을 제공하지만, 직접적인 유효성 검사 로직은 별도로 구현하거나 Formik, React Hook Form 등의 라이브러리와 함께 사용하는 경우가 많습니다. |
Ant Design | Form, Form.Item, Input, Select, Checkbox, Radio, InputNumber, DatePicker | 강력한 폼 관리 기능을 내장하고 있으며, Form 컴포넌트를 통해 폼 상태 관리, 유효성 검사 규칙 정의, 제출 처리 등을 중앙 집중적으로 관리할 수 있습니다. 다양한 내장 유효성 검사 규칙을 제공하며, 사용자 정의 규칙을 추가할 수도 있습니다. 레이아웃을 위한 Form.Item 컴포넌트를 제공하며, labelCol, wrapperCol 등의 props를 통해 그리드 기반 레이아웃을 쉽게 구성할 수 있습니다. |
React Bootstrap | Bootstrap의 클래스 기반 스타일을 적용한 Form, Form.Group, Form.Label, Form.Control, Form.Check, Form.Text | Bootstrap의 그리드 시스템을 활용하여 반응형 폼 레이아웃을 쉽게 구성할 수 있습니다. 기본적인 폼 요소 스타일을 제공하며, 필요에 따라 추가적인 스타일링이 필요할 수 있습니다. 유효성 검사 기능은 직접 구현하거나 Formik, React Hook Form 등의 라이브러리와 함께 사용하는 경우가 많습니다. Form.Text를 통해 도움말 텍스트를 제공할 수 있습니다. |
폼처리 라이브러리 | React Hook | Form Formik |
---|---|---|
특징 | Uncontrolled Component 기반, useRef 활용 | Controlled Component 기반, state 관리 내장 |
성능 | 높음 (불필요한 리렌더링 최소화) | 상대적으로 낮음 (입력마다 리렌더링 발생 가능성) |
API 간결성 | 매우 간결하고 직관적 | 다양한 헬퍼 함수 및 컴포넌트 제공 |
번들 크기 | 작음 | 상대적으로 큼 |
유효성 검사 통합 | Yup, Zod 등 외부 라이브러리와 쉬운 통합 | Yup과 특히 잘 통합됨, Zod도 지원 |
학습 곡선 | 비교적 낮음 | 비교적 낮음 |
제어 용이성 | Uncontrolled 방식에 익숙해야 함 | Controlled 방식에 익숙하면 쉬움 |
확장성/유연성 | Custom Hook 활용 용이, 외부 라이브러리 통합 용이 | 다양한 헬퍼 함수로 편리하게 확장 가능 |
유효성검사 특징 | Yup | Zod |
---|---|---|
타입 안전성 | JavaScript 기반, 타입 정의 필요 (TypeScript) | TypeScript 기반, 강력한 타입 추론 및 검증 |
API 직관성 | 비교적 직관적 | 간결하고 현대적인 API |
스키마 정의 | 객체 기반의 선언적 방식 | 함수형 조합 방식 |
에러 메시지 | 사용자 정의 용이 | 사용자 정의 용이 |
변환 (Transform) | 지원 | 강력한 변환 기능 제공 |
조건부 검사 | when 메서드 활용 | refine 등을 활용하여 유연하게 처리 |
번들 크기 | 상대적으로 약간 큼 | 일반적으로 더 작음 |
커뮤니티 | 매우 활발 | 빠르게 성장 중 |
React 통합 | React Hook Form, Formik 등과 쉬운 통합 | React Hook Form 등과 뛰어난 통합 및 타입 안전성 |
소셜 로그인 라이브러리 특징 | 해당 플랫폼별 라이브러리 (react-oauth/google, react-kakao-login, react-facebook-login 등) |
---|---|
플랫폼 특화 | 특정 소셜 로그인 플랫폼과의 원활한 연동 및 해당 플랫폼 API 기능 지원 |
간편한 통합 | 해당 플랫폼의 OAuth 2.0 흐름을 추상화하여 개발자가 쉽게 통합할 수 있도록 컴포넌트 또는 Hooks 제공 |
토큰 관리 | 로그인 성공 시 Access Token 및 기타 필요한 정보의 효율적인 관리 지원 |
UI 커스터마이징 | 플랫폼별 가이드라인을 준수하는 기본 UI 제공, 제한적인 커스터마이징 옵션 제공 가능 |
에러 처리 | 로그인 실패 시 에러 처리 및 사용자 피드백 제공 |
보안 | 해당 플랫폼의 보안 표준 및 권장 사항 준수 |
유지보수 | 해당 플랫폼 API 변경에 따라 라이브러리 업데이트 필요 |
# 3. 로그아웃 시 일반적으로 수행되는 상태 업데이트 - 로그인 상태 변경: isLoggedIn 플래그를 false로 설정합니다.
- 사용자 정보 제거: 저장된 사용자 이름, ID, 토큰 등의 정보를 삭제합니다.
- UI 업데이트: 로그인 상태에 따라 메뉴, 버튼 등의 UI 요소를 변경합니다.
- 로컬 스토리지/쿠키 정리: 저장된 인증 관련 정보를 삭제합니다.
라이브러리명 : | 상태업데이트 특징 | 장점 | 단점 | 프로젝트 이점 |
---|---|---|---|---|
Redux | 로그아웃 액션(예: LOGOUT)을 정의합니다. 해당 액션을 처리하는 리듀서 함수를 작성하여 스토어의 상태를 업데이트합니다. dispatch 함수를 사용하여 로그아웃 액션을 발생시킵니다. UI 업데이트는 스토어의 변경된 상태에 연결된 컴포넌트들이 자동으로 리렌더링되면서 이루어집니다. 로컬 스토리지/쿠키 정리는 액션 발생 시 사이드 이펙트를 처리하는 미들웨어(예: Redux Thunk, Redux Saga) 내에서 수행합니다. |
예측 가능한 상태 변화 중앙 집중식 상태 관리 미들웨어를 통한 확장성 성숙한 생태계 및 강력한 도구 |
많은 보일러플레이트 코드 러닝 커브 불필요한 리렌더링 가능성 |
대규모 애플리케이션 및 예측 가능한 상태 변화 |
Zustand | create 함수로 생성한 스토어 내부에 로그아웃 액션 함수를 직접 정의합니다. 이 함수 내에서 로그인 상태를 false로 설정하고, 사용자 정보를 초기화합니다. UI 업데이트는 스토어의 상태가 변경되면 해당 상태를 구독하는 컴포넌트들이 자동으로 리렌더링되면서 이루어집니다. 로컬 스토리지/쿠키 정리는 로그아웃 액션 함수 내에서 직접 수행하거나, 미들웨어(예: zustand/middleware/persist)를 활용하여 처리할 수 있습니다. |
매우 간단한 API 뛰어난 성능 가볍고 빠름 Hooks 기반 사용으로 인한 편리성제공 |
상대적으로 작은 생태계 상태 변화 추적의 어려움(별도 미들웨어 필요) |
간단하고 빠른 개발 및 성능 |
Recoil | 로그인 상태(isLoggedIn atom)를 false로 업데이트하고, 사용자 정보 관련 atom들을 초기화합니다. UI 업데이트는 해당 atom들을 구독하는 컴포넌트들이 자동으로 리렌더링되면서 이루어집니다. 로컬 스토리지/쿠키 정리는 로그아웃 액션 발생 시 별도의 함수 내에서 직접 수행하거나, Recoil Persist와 같은 라이브러리를 활용할 수 있습니다. |
React 친화적인 API 세분화된 상태 관리 전역 상태와 로컬 상태의 자연스러운 통합 Selector를 통한 파생 상태 관리 용이 |
상대적으로 새로운 라이브러리 학습 곡선이 높음 |
React의 함수형 모델과 자연스러운 통합 및 세분화된 상태 관리 |
Context API + useState/useReducer | Context Provider에서 관리하는 로그인 상태와 사용자 정보 상태를 업데이트하는 함수를 제공합니다. 로그아웃 버튼 클릭 시 해당 업데이트 함수를 호출하여 상태를 변경합니다. UI 업데이트는 Context의 값이 변경되면 Context를 구독하는 컴포넌트들이 리렌더링되면서 이루어집니다. 로컬 스토리지/쿠키 정리는 업데이트 함수 내에서 직접 수행합니다. |
별도의 라이브러리 불필요 간단한 사용법 (useState) 복잡한 상태 변화 관리 용이 (useReducer) |
Context Provider 재렌더링 문제 중간 컴포넌트 props drilling 대규모 애플리케이션 관리 어려움 |
소규모 애플리케이션 또는 간단한 상태 관리 |
특징 | Material-UI (MUI) | Ant Design | React Bootstrap |
---|---|---|---|
레이아웃 시스템 | Grid, Box 컴포넌트 기반의 유연한 레이아웃 | Grid 컴포넌트 기반의 강력하고 반응형 레이아웃 | Container, Row, Col 컴포넌트 기반의 Bootstrap 그리드 |
검색 컴포넌트 | TextField(입력) Autocomplete(자동 완성) 등 |
Input.Search, AutoComplete 등 | Form.Control (입력) 별도 자동 완성 라이브러리 필요 |
지역 메뉴 | Select, MenuList, MenuItem, Drawer 등 조합 | Select, Menu, Dropdown, Drawer 등 조합 | Dropdown, Nav 등 조합, Offcanvas 활용 |
숙소 목록 | Card, GridList 등 조합과 커스터마이징 용이 | Card, List 등 조합, 다양한 List 스타일 제공 | Card, Row, Col 조합, Bootstrap 스타일 적용 |
스타일링 | Material Design 기반, 테마 커스터마이징 강력 | 자체적인 세련된 스타일, 테마/커스터마이징 지원 | Bootstrap 스타일 기반, CSS 클래스 활용 |
접근성 | ARIA 속성 등 접근성 지침 준수 노력 | ARIA 속성 등 접근성 지침 준수 노력 | 기본적인 접근성 지원 |
반응형 디자인 | Grid, Box, Hidden 컴포넌트 활용 | Grid 컴포넌트, 반응형 유틸리티 클래스 제공 | Bootstrap 그리드 시스템 활용 |
번들크기 | 필요한 컴포넌트만 import 하여 최적화 가능 | 전체 번들 또는 부분 import, 상대적으로 큰 편 | 전체 CSS 포함 시 큼, 필요한 CSS만 import 필요 |
학습곡선 | 비교적 쉬움 | 중간 | 쉬움 (단!! Bootstrap 경험 있다면) |
장점 | 세련되고 현대적인 Material Design UI를 쉽게 구현 가능. 높은 수준의 커스터마이징 및 테마 적용 용이. 활발한 커뮤니티와 풍부한 자료. |
기업용 애플리케이션에 적합한 안정적이고 기능적인 UI 제공. 강력한 레이아웃 시스템과 다양한 UI 컴포넌트 지원. 국제화(i18n) 지원 용이. |
기존 Bootstrap 스타일 및 레이아웃 시스템에 익숙한 경우 빠른 개발 가능. 반응형 디자인 구현 용이. 상대적으로 간단한 구조. } |
단점 | 디자인 제약이 있을 수 있음 (Material Design 시스템). 일부 컴포넌트의 복잡성 존재. |
번들 크기가 클 수 있으며, 커스터마이징이 MUI만큼 자유롭지 않을 수 있음. 영문 자료가 많음. |
UI 커스터마이징이 상대적으로 제한적이며, Bootstrap 스타일에 종속됨. 자동 완성 등 일부 고급 컴포넌트는 직접 구현 또는 외부 라이브러리 활용 필요. |
특징 | Axios | Fetch API (브라우저 내장) |
---|---|---|
기능 | HTTP 요청 (GET, POST, PUT, DELETE 등) HTTP 요청 (GET, POST, PUT, DELETE 등) | |
Promise 기반 | Yes | Yes |
요청/응답 변환 | 자동 JSON 데이터 변환 | 수동 JSON 데이터 변환 (.json() 메서드 필요) |
에러 처리 | 요청 실패 시 에러 객체 제공, 인터셉터로 전역 처리 용이 | response.ok 속성 확인 후 수동 에러 처리 필요 |
요청 취소 | CancelToken API 제공 | AbortController API 사용 (IE 미지원) |
요청 인터셉터 | 요청 전/후 가로채서 로깅, 헤더 추가 등 처리 가능 | 제공 안 함 (별도 구현 필요) |
응답 인터셉터 | 응답 처리 전/후 가로채서 데이터 변환, 에러 처리 등 가능 | 제공 안 함 (별도 구현 필요) |
CSRF 방어 | 쿠키 기반 CSRF 방어 설정 용이 | 별도 처리 필요 |
파일 업로드 | FormData 지원 | FormData 지원 |
브라우저 지원 | 대부분의 최신 브라우저 지원 | 대부분의 최신 브라우저 지원 (IE는 폴리필 필요) |
라이브러리 크기 | 비교적 작음 | 브라우저 내장 |
학습 곡선 | 쉬움 | 쉬움 |
장점 | 간편한 사용법과 풍부한 기능 (자동 데이터 변환, 인터셉터, 요청 취소 등) 전역적인 요청/응답 처리 및 에러 핸들링 용이. 넓은 브라우저 호환성. |
별도의 라이브러리 설치 불필요 (브라우저 내장). Promise 기반의 깔끔한 API. |
단점 | 별도의 라이브러리 설치 필요. | 자동 JSON 변환 기능 부재. 요청/응답 인터셉터 부재로 전역 처리 구현 복잡. 요청 취소 기능 (AbortController)의 IE 지원 문제. 에러 처리가 상대적으로 번거로움. |
특징 | Axios | Fetch API |
---|---|---|
요청 방식 | axios.post('/api/check-id', { id: userId }), axios.get('/api/check-id?id=' + userId) | fetch('/api/check-id', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: userId }) }), fetch('/api/check-id?id=' + userId) |
장점 | 자동 JSON 데이터 변환으로 요청/응답 처리 용이<br>- 요청/응답 인터셉터로 전역 로깅, 에러 처리 등 편리<br>- 요청 취소 기능 (CancelToken) 제공<br>- CSRF 방어 설정 용이<br>- 넓은 브라우저 호환성 - 별도 라이브러리 설치 불필요 (브라우저 내장)<br>- Promise 기반의 깔끔한 API | |
고려 사항 | 별도 라이브러리 설치 필요 | 수동으로 JSON 데이터 변환 필요 (.json() 메서드 사용)<br>- 요청/응답 인터셉터 직접 구현 필요<br>- 요청 취소 (AbortController) IE 미지원<br>- 에러 처리 시 response.ok 체크 후 수동으로 에러 객체 생성 필요 |
특징 | Axios | Fetch API |
---|---|---|
요청 방식 | axios.post('/api/send-verification-code', { email: userEmail }) | fetch('/api/send-verification-code', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: userEmail }) }) |
장점 | 자동 JSON 데이터 변환으로 요청/응답 처리 용이<br>- 요청/응답 인터셉터로 로딩 상태 관리, 에러 처리 등 편리<br>- 넓은 브라우저 호환성 | 별도 라이브러리 설치 불필요 (브라우저 내장)<br>- Promise 기반의 깔끔한 API |
고려 사항 | 별도 라이브러리 설치 필요 | 수동으로 JSON 데이터 변환 필요 (.json() 메서드 사용)<br> - 요청/응답 인터셉터 직접 구현 필요<br> -에러 처리 시 response.ok 체크 후 수동으로 에러 객체 생성 필요 |
특징 | Axios | Fetch API |
---|---|---|
요청 방식 | axios.post('/api/verify-code', { email: userEmail, verificationCode: code }) | fetch('/api/verify-code', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: userEmail, verificationCode: code }) }) |
장점 | 자동 JSON 데이터 변환으로 요청/응답 처리 용이<br>- 요청/응답 인터셉터로 로딩 상태 관리, 에러 처리 등 편리<br>- 실패 시 상세한 에러 응답 처리 용이<br>- 넓은 브라우저 호환성 - 별도 라이브러리 설치 불필요 (브라우저 내장)<br>- Promise 기반의 깔끔한 API | |
고려 사항 | 별도 라이브러리 설치 필요 | 수동으로 JSON 데이터 변환 필요 (.json() 메서드 사용) - 요청/응답 인터셉터 직접 구현 필요 - 에러 처리 시 response.ok 체크 후 수동으로 에러 객체 생성 필요, 실패 상태 코드에 따른 분기 처리 필요 |
라이브러리 | 컴포넌트 | 특징 | 장점 | 단점 |
---|---|---|---|---|
Material-UI | List, ListItem, ListItemButton, ListItemIcon, ListItemText, Drawer, BottomNavigation, Tabs | 다양한 형태의 메뉴 제공 (수직 목록, 드로어, 하단 네비게이션, 탭), 아이콘 및 텍스트 조합 용이, 액티브 상태 스타일링 용이, 접근성 (ARIA) 속성 지원 우수 | Material Design 스타일 적용 용이, 유연한 메뉴 구조 구현 가능, 다양한 컴포넌트 조합으로 복잡한 메뉴 구성 가능, 테마 커스터마이징 용이, React Router와 자연스러운 연동 | 다양한 메뉴 형태를 조합하여 사용해야 하므로 초기 학습 시 컴포넌트 이해 필요, 깊이 있는 커스터마이징 시 스타일 오버라이딩 복잡성 증가 가능성 |
Ant Design | Menu, Dropdown, Sider, Tabs | 수직/수평 메뉴, 드롭다운 메뉴, 사이드 메뉴, 탭 메뉴 제공, 아이콘 지원, 액티브 상태 스타일링 용이, 국제화 (i18n) 지원, 다양한 트리 구조 메뉴 지원 | 깔끔하고 현대적인 스타일, 다양한 메뉴 레이아웃 및 기능 제공, 트리 구조 메뉴 등 복잡한 계층 구조 표현에 용이, 국제화 지원 용이, React Router와 연동 용이 | 스타일 커스터마이징이 Material-UI에 비해 다소 제한적일 수 있음, 영문 자료가 많을 수 있음 |
React Bootstrap | Nav, NavItem, NavLink, Dropdown, Offcanvas | 탐색 메뉴, 네비게이션 아이템, 링크, 드롭다운 메뉴, 화면 슬라이드 메뉴 제공, Bootstrap 그리드 시스템과의 연동 용이, 액티브 클래스 적용 용이 | Bootstrap 스타일 기반으로 빠른 메뉴 구성 가능, 반응형 메뉴 구현 용이, Offcanvas 를 활용한 모바일 메뉴 구성 용이, React Router와 기본적인 연동 지원 |
다단계 메뉴나 복잡한 구조의 메뉴 구현 시 제약 발생 가능, 스타일 커스터마이징 어려움, 자동 액티브 상태 관리를 위해 추가적인 로직 필요할 수 있음 |
-
특징:
- 선언적인 라우팅: 컴포넌트 기반으로 경로와 해당 경로에 렌더링될 컴포넌트를 선언적으로 정의합니다.
- 동적인 라우팅: URL 파라미터, 쿼리 파라미터 등을 통해 동적인 경로 매칭 및 데이터 전달이 가능합니다.
- History API 활용: 브라우저의 History API를 사용하여 페이지 새로고침 없이 URL을 변경하고 UI를 업데이트합니다.
-
Link 컴포넌트: 페이지 이동을 위한
<Link>
컴포넌트를 제공하며, 클릭 시 페이지 전체를 새로고침하지 않고 해당 경로로 이동합니다. -
Route 컴포넌트: 특정 경로와 매칭되는 컴포넌트를 렌더링하는
<Route>
컴포넌트를 제공합니다. -
Switch/Routes 컴포넌트: 여러
<Route>
중 첫 번째로 매칭되는 경로의 컴포넌트만 렌더링합니다. (v6 이후Routes
사용 권장) -
Navigation Hooks:
useNavigate
,useParams
,useLocation
등의 Hooks를 통해 라우팅 관련 정보를 쉽게 접근하고 제어할 수 있습니다.
-
장점:
- SPA (Single Page Application) 경험 향상: 페이지 전체 새로고침 없이 부드러운 화면 전환을 제공하여 사용자 경험을 향상시킵니다.
- 모듈화 및 유지보수성 향상: 각 기능별로 컴포넌트와 경로를 분리하여 코드의 모듈성을 높이고 유지보수를 용이하게 합니다.
- 북마크 및 공유 용이: 각 기능 페이지에 고유한 URL을 할당하여 북마크 및 공유가 용이합니다.
- 뒤로/앞으로 가기 지원: 브라우저의 뒤로/앞으로 가기 버튼을 자연스럽게 지원합니다.
- 활발한 커뮤니티 및 풍부한 자료: 널리 사용되는 라이브러리인 만큼 방대한 자료와 커뮤니티 지원을 받을 수 있습니다.
-
단점:
- 초기 로딩 시간 증가 가능성: 애플리케이션 규모가 커질수록 초기 로딩 시 모든 코드를 다운로드해야 할 수 있습니다 (코드 분할 등을 통해 해결 가능).
- SEO (검색 엔진 최적화) 문제: 초기 렌더링 시 빈 HTML만 제공될 수 있어 SEO에 불리할 수 있습니다 (SSR, SSG 등을 통해 해결 가능).
- History API 이해 필요: History API 기반 동작 방식을 이해해야 고급 기능을 효과적으로 활용할 수 있습니다.
마이페이지 메뉴를 구현할 때 UI 라이브러리의 메뉴 컴포넌트와 React Router의 <Link>
컴포넌트를 함께 사용하여 각 메뉴 아이템을 특정 경로에 연결하는 것이 일반적인 전략입니다.
특징 | Axios | Fetch API (브라우저 내장) |
---|---|---|
요청 방식 |
axios.get('/api/user/info') , axios.put('/api/user/update', data) , axios.delete('/api/user/delete')
|
fetch('/api/user/info') , fetch('/api/user/update', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) , fetch('/api/user/delete', { method: 'DELETE' })
|
데이터 변환 | 요청/응답 시 자동 JSON 데이터 변환 | 응답 데이터 수동 JSON 변환 필요 (.json() 메서드 사용) |
에러 처리 | 요청 실패 시 에러 객체 제공, 인터셉터로 전역 처리 용이 |
response.ok 속성 확인 후 수동 에러 처리 필요 |
요청 취소 |
CancelToken API 제공 |
AbortController API 사용 (IE 미지원) |
인터셉터 | 요청/응답 인터셉터로 로깅, 인증 헤더 추가, 에러 핸들링 등 전역 처리 용이 | 제공 안 함 (별도 구현 필요) |
CSRF 방어 | 쿠키 기반 CSRF 방어 설정 용이 | 별도 처리 필요 |
브라우저 지원 | 대부분의 최신 브라우저 지원 | 대부분의 최신 브라우저 지원 (IE 폴리필 필요) |
라이브러리 크기 | 비교적 작음 | 브라우저 내장 |
학습 곡선 | 쉬움 | 쉬움 |
특징 | React Hook Form | Formik |
---|---|---|
폼 상태 관리 | Uncontrolled Component 기반, useRef 활용 |
Controlled Component 기반, state 관리 내장 |
성능 | 높음 (불필요한 리렌더링 최소화) | 상대적으로 낮음 (입력마다 리렌더링 발생 가능성) |
API 간결성 | 매우 간결하고 직관적 | 다양한 헬퍼 함수 및 컴포넌트 제공 |
번들 크기 | 작음 | 상대적으로 큼 |
유효성 검사 통합 | Yup, Zod 등 외부 라이브러리와 쉬운 통합 | Yup과 특히 잘 통합됨, Zod도 지원 |
제출 처리 |
handleSubmit 함수를 통한 간편한 제출 처리 |
handleSubmit prop을 통한 제출 처리 |
상태 접근 |
formState 객체를 통해 에러, 유효성 등 상태 접근 용이 |
values , errors , touched , isSubmitting 등 상태 제공 |
필드 등록 |
register 함수를 사용하여 필드 등록 및 유효성 규칙 적용 |
<Field> 컴포넌트를 사용하여 필드 등록 및 관리 |
리셋 기능 |
reset 함수를 통한 간편한 폼 초기화 |
resetForm 메서드를 통한 폼 초기화 |
-
API 요청:
GET
메서드를 사용하여 서버에 사용자 정보를 요청합니다. 인증 토큰을 헤더에 포함하여 요청해야 할 수 있습니다. -
폼 처리: 조회된 사용자 정보를 폼에 미리 채워 보여주기 위해 폼 처리 라이브러리의
setValue
(React Hook Form) 또는initialValues
(Formik)를 활용합니다. 폼은 수정 불가능한 상태로 표시할 수도 있습니다.
-
API 요청:
PUT
또는PATCH
메서드를 사용하여 수정된 사용자 정보를 서버에 전송합니다. 요청 본문에는 수정된 필드와 값이 JSON 형태로 담깁니다. -
폼 처리:
- 유효성 검사: React Hook Form 또는 Formik과 Yup/Zod를 함께 사용하여 클라이언트 측에서 수정된 데이터의 유효성을 검사합니다.
-
제출 처리:
handleSubmit
함수 (React Hook Form) 또는onSubmit
prop (Formik)을 통해 폼 데이터를 서버로 전송하는 API 요청 함수를 호출합니다. - 상태 관리: 수정 성공/실패에 따른 UI 업데이트 (알림 메시지, 리다이렉션 등)를 위해 상태 관리 라이브러리 (Redux, Zustand, Recoil 등) 또는 컴포넌트 상태를 활용합니다.
-
API 요청:
DELETE
메서드를 사용하여 서버에 회원 탈퇴 요청을 보냅니다. 사용자 인증을 위해 토큰 또는 추가적인 확인 절차가 필요할 수 있습니다. -
폼 처리:
- 확인 절차: 탈퇴 전에 사용자에게 비밀번호를 다시 입력받거나, "정말 탈퇴하시겠습니까?"와 같은 확인 메시지를 표시하는 UI를 구현할 수 있습니다.
- 제출 처리: 탈퇴 확인 후 API 요청 함수를 호출합니다.
-
상태 관리: 탈퇴 성공 시 로그인 상태를 변경하고, 관련 사용자 데이터를 제거하며, 홈페이지로 리다이렉션하는 등의 상태 업데이트를 수행합니다. 로컬 스토리지 또는 쿠키에 저장된 인증 정보도 삭제해야 합니다.
라이브러리명 | 특징 | 장점 | 단점 |
---|---|---|---|
Socket.IO Client | 양방향 통신 자동 재연결 폴백 메커니즘 이벤트 기반 JSON 기반 데이터 낮은 수준의 추상화 |
높은 유연성 광범위한 호환성 커스터마이징 용이 오픈 소스 |
구현 복잡성 증가 서버 측 연동 필수 기능 부족 |
Stomp.js | STOMP 프로토콜 지원 메시지 브로커 의존성 Pub/Sub 모델 텍스트 기반 메시지 높은 수준의 추상화 |
높은 안정성 및 확장성 메시지 관리 용이 다양한 언어 지원 구독 기반 메시징 |
메시지 브로커 의존성 실시간성 제약 기능 부족 |
SDK | End-to-End 솔루션 풍부한 기능 UI 컴포넌트 제공 높은 수준의 추상화 확장성 및 안정성 보장 다양한 플랫폼 지원 |
빠른 개발 기능 풍부 유지보수 용이 확장성 및 안정성 전문적인 지원 |
높은 비용 커스터마이징 제한 벤더 종속성 학습 곡선 |
|
라이브러리 | 주요 테이블 컴포넌트 | 특징 | 장점 | 단점 |
---|---|---|---|---|
Material-UI (MUI) |
Table , TableBody , TableCell , TableContainer , TableHead , TableRow , TablePagination , TableSortLabel
|
데이터 그리드 형태로 정보를 표시, 정렬, 페이지네이션, 선택 등 다양한 기능 제공, 커스터마이징 용이, 반응형 디자인 지원 | Material Design 스타일 적용 용이, 강력한 데이터 시각화 및 조작 기능 제공, 다양한 컴포넌트 조합으로 복잡한 테이블 구조 구현 가능, 테마 커스터마이징 용이, 접근성 (ARIA) 속성 지원 우수 | 복잡한 기능 사용 시 초기 학습 필요, 스타일 오버라이딩 시 복잡성 증가 가능성 |
Ant Design | Table |
데이터 그리드 형태로 정보 표시, 정렬, 필터링, 페이지네이션, 선택, 확장 가능한 행 등 다양한 기능 제공, 칼럼 정의 및 렌더링 방식 유연, 반응형 디자인 지원 | 깔끔하고 현대적인 스타일, 다양한 데이터 조작 기능 기본 제공, 복잡한 데이터 테이블 구현에 용이, 국제화 (i18n) 지원, 칼럼 렌더링 커스터마이징 용이 | 스타일 커스터마이징이 Material-UI에 비해 다소 제한적일 수 있음, 영문 자료가 많을 수 있음 |
React Bootstrap | Table |
기본적인 테이블 형태 표시, striped, bordered, hover 등 간단한 스타일 옵션 제공, Bootstrap 그리드 시스템과의 연동 용이, 반응형 디자인을 위한 클래스 제공 | Bootstrap 스타일 기반으로 빠른 테이블 구성 가능, 반응형 테이블 구현 용이, 간단하고 직관적인 사용법 | 정렬, 페이지네이션, 필터링 등 고급 기능은 직접 구현하거나 외부 라이브러리 활용 필요, 스타일 커스터마이징 어려움, 복잡한 데이터 테이블 구현에 제약 발생 가능 |
라이브러리 | 주요 목록 컴포넌트 | 특징 | 장점 | 단점 |
---|---|---|---|---|
Material-UI (MUI) |
List , ListItem , ListItemText , ListItemIcon , ListItemSecondaryAction
|
다양한 형태의 목록 표시 (단순 목록, 아이콘/텍스트 조합, 액션 버튼 포함), 유연한 레이아웃 구성 가능 | Material Design 스타일 적용 용이, 간단한 목록부터 복잡한 구조까지 다양한 표현 가능, 액션 버튼 등 추가 UI 요소 통합 용이, 접근성 고려 | 대량의 데이터 표시 시 성능 고려 필요, 테이블 형태에 비해 정보의 구조화가 덜 명확할 수 있음 |
Ant Design |
List , Card (목록 형태 활용) |
기본 목록, 가로 목록, 액션 목록 등 다양한 스타일 제공, Card 컴포넌트를 활용하여 목록 아이템을 카드 형태로 표시 가능 |
깔끔하고 정돈된 스타일, 다양한 목록 스타일 제공, 카드 형태를 활용하여 풍부한 정보 표시 가능, 액션 처리 용이 | 목록 아이템의 특정 스타일 커스터마이징이 Material-UI에 비해 다소 제한적일 수 있음, 테이블 형태에 비해 정보의 구조화가 덜 명확할 수 있음 |
React Bootstrap |
ListGroup , ListGroup.Item , Card (목록 형태 활용) |
기본적인 목록 표시, 비정렬/정렬 목록 지원, 액티브/비활성화 상태 스타일링, Card 컴포넌트를 활용하여 목록 아이템을 카드 형태로 표시 가능 |
Bootstrap 스타일 기반으로 빠른 목록 구성 가능, 간단하고 직관적인 사용법, 카드 형태를 활용하여 시각적인 강조 가능 | 복잡한 목록 구조나 특수한 UI 요구 사항 처리 시 제약 발생 가능, 스타일 커스터마이징 어려움, 정렬/필터링/페이지네이션 등 고급 기능 직접 구현 필요 |
특징 | Axios | Fetch API (브라우저 내장) |
---|---|---|
요청 방식 |
axios.get('/api/reservations') , axios.delete('/api/reservations/' + reservationId)
|
fetch('/api/reservations') , fetch('/api/reservations/' + reservationId, { method: 'DELETE' })
|
데이터 변환 | 요청/응답 시 자동 JSON 데이터 변환 | 응답 데이터 수동 JSON 변환 필요 (.json() 메서드 사용) |
에러 처리 | 요청 실패 시 에러 객체 제공, 인터셉터로 전역 처리 용이 |
response.ok 속성 확인 후 수동 에러 처리 필요 |
요청 취소 |
CancelToken API 제공 |
AbortController API 사용 (IE 미지원) |
인터셉터 | 요청/응답 인터셉터로 로딩 상태 관리, 인증 헤더 추가, 에러 핸들링 등 전역 처리 용이 | 제공 안 함 (별도 구현 필요) |
브라우저 지원 | 대부분의 최신 브라우저 지원 | 대부분의 최신 브라우저 지원 (IE 폴리필 필요) |
라이브러리 크기 | 비교적 작음 | 브라우저 내장 |
학습 곡선 | 쉬움 | 쉬움 |
-
API 요청:
GET
메서드를 사용하여 서버에 예약 내역 데이터를 요청합니다. 필터링 (예: 특정 기간, 상태) 또는 페이지네이션을 위한 쿼리 파라미터를 함께 전송할 수 있습니다. -
UI 표시:
- 테이블: 예약 정보를 명확하게 구조화하여 표시하고, 정렬, 페이지네이션 기능을 제공하여 사용자 편의성을 높일 수 있습니다. 대량의 데이터 표시 및 관리에 적합합니다.
- 목록: 각 예약 항목을 간결하게 표시하고, 필요에 따라 상세 정보를 확장하여 보여줄 수 있습니다. 이미지나 간단한 요약 정보를 함께 표시하기에 용이합니다.
- 상태 관리: 로딩 상태, 조회된 예약 데이터, 에러 발생 여부 등을 관리하여 UI를 적절하게 업데이트합니다.
-
API 요청:
DELETE
메서드를 사용하여 특정 예약 ID에 대한 취소 요청을 서버에 전송합니다. 사용자 인증 및 취소 가능 여부 확인을 위해 추가적인 정보를 요청 본문에 담을 수 있습니다. -
UI 처리:
- 취소 버튼: 각 예약 항목에 취소 버튼을 제공하여 사용자가 직접 취소 요청을 보낼 수 있도록 합니다.
- 확인 절차: 중요한 작업이므로 사용자에게 취소 의사를 다시 한번 확인하는 모달 또는 알림창을 표시하는 것이 좋습니다.
-
상태 업데이트: 취소 요청 성공/실패에 따라 UI를 업데이트하고, 사용자에게 결과를 알립니다 (예: 성공 메시지, 실패 이유).
-
폼 컴포넌트 (등록):
-
Material-UI:
- 특징: Material Design 기반의 다양한 입력 컴포넌트 제공, 쉬운 커스터마이징, 반응형 지원.
- 장점: 일관된 디자인 시스템 적용 용이, 풍부한 컴포넌트 제공, 접근성 우수.
- 단점: 디자인 제약 존재, 번들 크기 관리 필요.
-
Ant Design:
- 특징: 세련되고 기능적인 UI 컴포넌트 제공, 다양한 폼 레이아웃 지원, 국제화 지원.
- 장점: 기업용 애플리케이션에 적합, 강력한 기능, 뛰어난 사용성.
- 단점: 커스터마이징 난이도 존재, 번들 크기 클 수 있음.
-
React Bootstrap:
- 특징: Bootstrap 스타일 기반, 반응형 레이아웃 용이, 기본적인 폼 컴포넌트 제공.
- 장점: 빠른 개발 가능, Bootstrap과의 호환성, 쉬운 학습 곡선.
- 단점: 디자인 커스터마이징 제한적, 고급 기능 부재.
-
Material-UI:
-
목록 컴포넌트 (조회):
-
Material-UI:
List
,ListItem
등 유연한 목록 구조 제공, 다양한 스타일링 옵션. -
Ant Design:
List
컴포넌트의 다양한 스타일 제공, 데이터 시각화 용이. -
React Bootstrap:
ListGroup
등 기본적인 목록 구조 제공, 간단한 스타일링.
-
Material-UI:
-
Axios:
- 특징: Promise 기반 HTTP 클라이언트, 자동 JSON 데이터 변환, 요청/응답 인터셉터, 요청 취소, CSRF 방어.
- 장점: 편리한 API, 전역 설정 용이, 넓은 브라우저 호환성, 활발한 커뮤니티.
- 단점: 별도 라이브러리 설치 필요.
-
Fetch API:
- 특징: 브라우저 내장 HTTP 클라이언트, Promise 기반.
- 장점: 별도 설치 불필요.
- 단점: 자동 데이터 변환 없음, 인터셉터 부재, 에러 처리 번거로움.
- 목록 컴포넌트: (10번 목록 컴포넌트 특징 및 장단점과 동일)
-
카드 컴포넌트:
-
Material-UI:
Card
,CardMedia
,CardContent
,CardActions
등 다양한 카드 관련 컴포넌트 제공, 유연한 레이아웃. -
Ant Design:
Card
컴포넌트의 다양한 스타일 제공, 액션 처리 용이. -
React Bootstrap:
Card
컴포넌트의 기본적인 카드 UI 제공, 간단한 사용법.
-
Material-UI:
- (10번 Axios/Fetch API 특징 및 장단점과 동일)
- (10번 목록 컴포넌트 특징 및 장단점과 유사)
-
react-infinite-scroll-component
:- 특징: Intersection Observer 또는 스크롤 이벤트 기반 무한 스크롤 구현, 사용자 정의 로딩 컴포넌트, hasMore prop을 통한 로딩 제어.
- 장점: 쉬운 사용법, 다양한 설정 옵션, 성능 최적화 용이.
- 단점: 과도한 사용 시 성능 문제 발생 가능, UI/UX 고려 필요.
-
Redux:
- 특징: 단방향 데이터 흐름, 액션/리듀서 기반 상태 관리, 미들웨어 지원.
- 장점: 예측 가능한 상태 변화, 디버깅 용이, 대규모 애플리케이션에 적합.
- 단점: 보일러플레이트 코드 많음, 학습 곡선 존재.
-
Zustand:
- 특징: 간단하고 유연한 Hooks 기반 상태 관리, 적은 보일러플레이트 코드, 뛰어난 성능.
- 장점: 빠른 개발, 쉬운 사용법, 성능 최적화.
- 단점: 상대적으로 작은 생태계.
-
Recoil:
- 특징: Atom과 Selector 기반 세분화된 상태 관리, React 친화적인 API, 코드 분할 및 동시성 지원.
- 장점: 필요한 컴포넌트만 리렌더링, 유연한 상태 관리, 성능 최적화.
- 단점: 비교적 새로운 라이브러리, 학습 곡선 존재.
- 특징: 다양한 결제 수단 지원 (카드, 간편결제, 계좌이체 등), 간편한 API 연동, 보안 기능 제공, 결제 UI 제공.
- 장점: 쉬운 결제 기능 통합, 다양한 결제 방식 지원, 안정적인 결제 처리.
- 단점: 상용 서비스 이용료 발생 가능, Bootpay 의존성 발생.
- 목록 컴포넌트: (10번 목록 컴포넌트 특징 및 장단점과 유사)
- 필터 컴포넌트: (10번 폼 컴포넌트 특징 및 장단점과 유사, Select, Checkbox, Slider 등 활용)
- (10번 Axios/Fetch API 특징 및 장단점과 동일)
-
react-kakao-maps:
- 특징: 카카오 지도 API 기반, React 컴포넌트 형태 제공, 다양한 지도 기능 지원.
- 장점: 국내 지도 데이터 정확성, 쉬운 API 사용, 다양한 UI 커스터마이징 옵션.
- 단점: 카카오 지도 API에 종속.
-
@react-google-maps/api:
- 특징: Google Maps Platform 기반, Hooks 형태 제공, 다양한 지도 기능 지원, 높은 확장성.
- 장점: 글로벌 지도 데이터, 강력한 기능, 방대한 자료.
- 단점: Google Maps API 키 필요, 사용량에 따른 비용 발생 가능.
-
react-naver-maps:
- 특징: 네이버 지도 API 기반, React 컴포넌트 형태 제공, 다양한 지도 기능 지원.
- 장점: 국내 지도 데이터, 네이버 서비스 연동 용이.
- 단점: 네이버 클라우드 플랫폼 API 키 필요, API 사용량 제한 존재 가능.
- 레이아웃 컴포넌트: (10번 폼 컴포넌트 특징 및 장단점과 유사, Grid, Box, Layout 등 활용)
-
탭 컴포넌트:
-
Material-UI:
Tabs
,Tab
컴포넌트의 유연한 스타일링 및 기능 제공, 접근성 우수. -
Ant Design:
Tabs
컴포넌트의 다양한 스타일 및 위치 옵션 제공. -
React Bootstrap:
Tabs
,Tab
컴포넌트의 기본적인 탭 기능 제공.
-
Material-UI:
- (10번 Axios/Fetch API 특징 및 장단점과 동일)
- 폼 컴포넌트: (10번 폼 컴포넌트 특징 및 장단점과 유사)
- Select 컴포넌트: (10번 폼 컴포넌트 특징 및 장단점과 유사, 드롭다운 선택 UI 제공)
- (13번 결제 API (Bootpay SDK) 특징 및 장단점과 동일)
- (13번 상태 관리 라이브러리 특징 및 장단점과 유사)
-
react-toastify
:- 특징: 간단한 토스트 알림, 다양한 스타일 및 위치 설정, 자동 닫힘, 사용자 정의 컴포넌트 지원.
- 장점: 쉬운 사용법, 다양한 설정 옵션, 가벼운 라이브러리.
- 단점: 복잡한 UI 커스터마이징 제한적.
-
sweetalert2-react-content
:- 특징: 예쁘고 사용자 정의 가능한 alert/confirm 창, Promise 기반 비동기 처리 지원, 다양한 애니메이션 효과.
- 장점: 뛰어난 UI 디자인, 강력한 사용자 상호 작용 제공, 다양한 설정 옵션.
- 단점: 상대적으로 큰 라이브러리 크기, 초기 학습 필요.