Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- 크로스브라우징
- HTML5
- JSON-LD
- 개발생산성
- 상태관리
- TypeScript
- opengraph
- 서버사이드렌더링
- Next.js
- 프론트엔드개발자
- Vue3
- Ai툴
- 이직
- 성능최적화
- 웹개발
- 프론트엔드
- 취업난
- 검색최적화
- react
- 컴포넌트
- 공통화
- 코드품질
- SEO
- 프레임워크
- 팀협업
- 아키텍처
- 유지보수
- 자동화
- SSR
- 모듈화
Archives
- Today
- Total
프론트엔드 개발자의 기록
React + Firebase 프로젝트 실전 디버깅: 트위터 클론 앱에서 발생한 문제들과 해결 과정 본문
🎨 3. 사용자 경험 개선: 세부사항이 만드는 차이
개선 1: 접근성(Accessibility) 향상
javascript
// 개선 전
<img src={nweetObj.attachmentUrl} />
// 개선 후
<img src={nweetObj.attachmentUrl} alt="Nweet attachment" />
접근성 개발 지식:
- WCAG 가이드라인: 모든 이미지에는 적절한 alt 텍스트가 필요
- 스크린 리더 지원: 시각 장애인 사용자를 위한 배려
- SEO 효과: 검색 엔진 최적화에도 도움
개선 2: 에러 처리 강화
javascript
// 개선된 삭제 함수
const onDeleteClick = async () => {
const ok = window.confirm("Are you sure you want to delete this nweet?");
if (ok) {
await deleteDoc(NweetTextRef);
// 파일이 있을 때만 삭제 시도
if (nweetObj.attachmentUrl) {
await deleteObject(ref(storageService, nweetObj.attachmentUrl));
}
}
};
에러 처리 패턴:
- Graceful Degradation: 일부 기능이 실패해도 전체 앱이 중단되지 않도록
- 사용자 피드백: 작업 결과를 사용자에게 명확히 전달
- 예외 상황 처리: null, undefined 값에 대한 안전한 처리
개선 3: 사용자 상태 관리
javascript
// Profile.js에서 안전한 사용자 정보 접근
const Profile = ({refreshUser, userObj}) => {
const [newDisplayName, setNewDisplayName] = useState(userObj?.displayName ?? "USER");
const getMyNweets = async () => {
if (!userObj?.uid) return; // 사용자가 없으면 early return
const q = query(
collection(dbService, "nweets"),
where("creatorId", "==", userObj.uid)
);
// ...
};
};
상태 관리 베스트 프랙티스:
- Null Safety: 항상 객체의 존재 여부를 확인
- 기본값 설정: ?? 연산자를 활용한 안전한 기본값 처리
- 조건부 렌더링: 데이터가 준비된 후에만 UI 렌더링
🔍 디버깅 과정에서 얻은 교훈
1. 체계적인 디버깅 접근법
- 에러 메시지 분석: Firebase 콘솔의 정확한 에러 메시지 확인
- 데이터 플로우 추적: props 전달 경로를 단계별로 확인
- 브라우저 개발자 도구 활용: console.log()를 통한 값 확인
- 재현 가능한 테스트: 일관된 테스트 시나리오 구성
2. 프로덕션 환경 고려사항
- 배포 파이프라인: Vercel 자동 배포 시 캐시 무효화 시간 고려
- 환경별 테스트: 로컬, 스테이징, 프로덕션 환경에서의 차이점 인식
- 실사용자 시나리오: 다양한 사용자 행동 패턴 시뮬레이션
3. 코드 품질 향상 방법
- 린팅 도구: ESLint 경고 메시지를 무시하지 말고 적극 해결
- 타입 안전성: TypeScript 도입 고려
- 테스트 코드: Jest, React Testing Library를 활용한 단위 테스트
- 코드 리뷰: 팀원과의 코드 리뷰를 통한 문제점 사전 발견
마무리
이번 디버깅 과정을 통해 React와 Firebase를 사용한 실시간 웹 애플리케이션 개발에서 중요한 것들을 배웠습니다:
- 작은 실수가 큰 문제가 될 수 있다: props 구조 분해 할당 같은 기본적인 문법 실수
- 보안은 선택이 아닌 필수: 클라이언트와 서버 양쪽에서의 권한 검증
- 사용자 경험은 세부사항에서 나온다: 접근성, 에러 처리, 상태 관리
개발자로서 성장하는 과정에서 이런 문제들을 직접 해결해보는 경험이 매우 중요하다고 생각합니다. 완벽한 코드는 없지만, 지속적인 개선을 통해 더 나은 소프트웨어를 만들어 갈 수 있습니다.