Ting은 원활한 프로젝트의 시작을 지원하기 위해 탄생했습니다.
개발자, 디자이너, 기획자 등 여러 직군을 타겟으로 하여,
기존 프로젝트에 참여하거나, 팀원을 구인할 수 있는 플랫폼입니다.
| Names | GitHub | Parts |
|---|---|---|
| 이재건 | @Quaker-Lee | 메인페이지, 마이페이지, 회원정보입력, 프로젝트 초기 세팅, 앱배포 |
| 유태호 | @taeryu7 | 게시글 상세화면, 신고하기 |
| 나영진 | @bryjna07 | 게시글 리스트, 게시글 작성, 검색페이지 |
| 오푸른솔 | @solnamul | 애플로그인 연동, 회원가입, 이용약관 |
- MVP: 2025.01.16 ~ 2025.02.17
- 유저피드백 & 버그수정: 2025.02.17 ~ 2025.02.19
- UIKit: 인터페이스 구현
- SnapKit: 코드 기반 AutoLayout
- Then: 선언형 UI 구성
- Firebase Auth: 사용자 인증
- Firebase Firestore: 데이터베이스
- AuthenticationServices: Apple 로그인을 위한 프레임워크
- CryptoKit: Apple 로그인 인증에 사용된 해시 라이브러리
- BaseView: 공통 UI 컴포넌트 상속 구조
- CustomTag: 재사용 가능한 태그 버튼 컴포넌트
- NotificationCenter: 화면 간 이벤트 전달
- Protocol-Delegate: 모달 및 팝업 데이터 전달
- iOS 16.0+
- Swift 6.0+
- MVC Design Pattern
firebase/
├── users/
│ └── {uid}
├── infos/
│ └── {infoId}
├── posts/
│ └── {postId}
└── reports/
└── {reportId}
graph LR
A[User] --> B[Auth]
B --> C[UserInfo]
C --> D[Posts]
D --> E[Reports]
- Apple 로그인 (Sign in with Apple):
AuthenticationServices활용 - 비로그인 둘러보기 모드: Firebase 인증 없이 콘텐츠 접근 가능
- 이용약관 동의 프로세스: 필수 약관 동의 후 회원가입 진행
- 회원정보 관리 (수정/탈퇴): Firebase Firestore와
UserDefaults활용한 CRUD 작업
- 팀원 모집 / 팀 합류 게시글 작성: Firestore를 활용한 CRUD
- 카테고리별 게시글 분류:
(개발자, 디자이너, 기획자, 기타)필터링 기능 - 게시글 조회 및 페이징 처리:
lastDocument기반 무한 스크롤 적용 - 게시글 수정 및 삭제: Firebase에서 게시글 정보 업데이트 및 삭제 처리
- 동적 컴포지셔널 레이아웃:
UICollectionView를 활용한 메인 화면 구성 - 태그 기반 필터링: 다중 선택 가능한 필터 UI 적용
- 키워드 기반 게시글 검색: Firestore에서 검색어 기반 쿼리 실행
- 다중 태그 필터링:
(게시판 유형, 직무, 작업 방식)태그 필터링 - 동적 태그 UI 구현:
TagFlowLayout을 활용하여 태그 자동 배치
- 부적절한 게시글 신고 기능: 신고 버튼을 통한 Firestore 신고 데이터 저장
- 신고 내역 관리: 신고된 게시글 및 사용자 관리
- 누적 신고 시 자동 삭제 처리: 신고 5회 이상 누적 시 자동 삭제 로직 적용 (
Firestore 트랜잭션활용) - Slack 알림 연동: 신고 발생 시 관리자에게 실시간 알림 전송
- 특정 유저 차단 기능: 차단한 유저의 게시글 자동 숨김 처리
TagFlowLayout: 동적 태그 배치 시스템 구현LoadingFooterView: 페이징 로딩 인디케이터 추가CustomTag: 재사용 가능한 태그 UI 구성- 반응형 레이아웃: 다양한 기기 해상도 대응
UserInfoService: Firebase Firestore를 활용한 회원 정보 관리 (CRUD)- 회원정보 수정 및 탈퇴:
UserDefaults에 저장된 UID를 기반으로 회원 정보 변경 가능 - 로그인 상태 유지:
Firebase Auth인증을 통한 자동 로그인 기능 지원
🔗 관련PR
#207, #209, #210, #213, #215
🔍 원인
- 신고하기, 차단하기 등의 기능이 미흡, 지역이라는 불필요한 개인정보를 요구하여 리젝처리됨
✅ 해결 방안
- 신고한 게시글 숨김 (Firebase에 저장 후 자동 숨김 처리)
- 누적 신고 시 자동 삭제 (중복 신고 방지 및 일정 횟수 초과 시 삭제)
- Slack 알림 연동 (신고 발생 시 실시간 알림 전송)
- 차단 유저 숨김 (Firebase에 저장 후 자동 숨김 처리)
- 지역 관련 필드 삭제 (사용자의 지역 입력 필드 제거)
🔥 개선 효과
- 신고 및, 차단 등 유해컨텐츠와 유저를 분리함으로써 사용자 경험 향상
- 개발팀이 실시간으로 신고 게시글을 관리할 수 있게 됨
🔗 관련PR
#238
🔍 원인
- Firestore에서
limit(to: 3)으로 데이터를 가져온 후 필터링을 수행 → 필터링된 후 게시글 수가 부족해짐
✅ 해결 방안
- Firestore에서 최신 10개의 게시글을 가져옴
- 신고 및 차단된 게시글을 필터링
- 필터링 후 최신 3개 게시글만 반환
🔥 개선 효과
- 필터링 후에도 항상 3개 게시글을 유지하여 사용자 경험 개선
- 신고/차단 비율이 높은 경우, 가져오는 데이터 개수를 조정해 성능 최적화 필요
🔗 관련PR
#160
🔍 원인
TextField의 값이 기존 닉네임과 동일한지 확인하지 않고 중복 검사를 실행하여 발생
✅ 해결 방안
- 서버에서 가져온 기존 닉네임을 변수에 저장
TextField의 값과 기존 닉네임을 비교- 닉네임이 변경되지 않았다면 중복 검사 생략, 변경된 경우에만 검사 실행
🔥 개선 효과
- 닉네임을 변경하지 않아도 중복 검사 실행 문제 해결
- 불필요한 중복 검사 방지로 성능 최적화 및 사용자 경험 개선
🔍 원인
SignUpVC에서 회원가입 시 약관 동의 여부와 관계없이termsAccepted: true를 Firestore에 저장- 사용자가 약관을 미동의해도 Firestore에서 동의한 것으로 인식
✅ 해결 방법
✔ SignUpVC에서 termsAccepted와 createdAt 저장 제거
✔ PermissionVC에서 약관 동의 후 Firestore에 업데이트
🔥 개선 효과
- 약관을 동의하지 않으면 Firestore에 저장되지 않도록 수정
- 재접속 시 약관 동의 단계를 정확히 유지하여 사용자 경험 개선
🔗 관련PR
#270
유닛테스트
- 정상적인 게시글 데이터로 업로드 성공
- 필수 필드 누락 시 업로드 실패
- 제목 최대 길이(20자) 제한 검증
- 태그 배열 데이터 처리
- 검색 키워드 자동 생성 검증
- 빈 문자열 입력 처리
- 공백만 있는 입력 처리
- 특수문자 포함된 입력 처리
- 날짜 형식 검증
- 업로드 실패 시 에러 처리
- 최근 게시글 3개 조회 정확성
- 페이징 처리 (20개 단위) 검증
- lastDocument 기반 페이징 정확성
- 포지션 필터링 정확도
- 게시글 타입별 필터링
- 빈 결과 처리
- 정렬 순서 정확성
- 데이터 일관성 검증
- 누락된 필드 처리
- 네트워크 오류 처리
- 정상적인 수정 처리
- 권한 검증
- 일부 필드만 수정
- 삭제 후 조회 불가 확인
- 잘못된 ID로 수정 시도
- 동시 수정 요청 처리
- 수정 이력 추적
- 연관 데이터 업데이트
- 롤백 처리
- 캐시 데이터 정리
- 회원 로그인 처리
- 비회원 로그인 처리
- 로그인 상태 유지
- 로그아웃 처리
- 자동 로그인
- 세션 만료 처리
- 접근 권한 검증
- 비회원의 제한된 기능 접근
- 인증 토큰 관리
- 로그인 상태 변경 이벤트
- 약관 동의 체크 검증
- Apple 재인증 성공/실패 처리
- Firebase Auth 계정 삭제
- UserDefaults 데이터 정리
- 탈퇴 완료 후 SignUpVC로 화면 전환
- 탈퇴 중 앱 종료 시나리오
- 탈퇴 후 재로그인 시도 차단
- 탈퇴 취소 프로세스
- 탈퇴 실패 시 사용자 피드백
- 탈퇴 완료 확인
- users 컬렉션에서 사용자 문서 삭제
- infos 컬렉션에서 사용자 정보 삭제
- 작성한 게시글 일괄 삭제 (posts)
- 작성한 신고 내역 처리 (reports)
- 피신고 내역 처리
- Batch 작업 성공 여부 확인
- 부분 삭제 실패 시 롤백 처리
- 삭제된 데이터 복구 불가능 확인
- 대용량 데이터 삭제 성능
- 삭제 진행률 표시
- 모든 컬렉션에서 사용자 데이터 완전 삭제 확인
- 삭제된 게시글 접근 시도
- 삭제된 신고 내역 접근 시도
- Firebase Auth와 Firestore 데이터 동기화
- 연관된 모든 문서 참조 정리
- 캐시 데이터 정리
- 로컬 저장소 정리
- 부분 실패 시 일관성 유지
- 동시 요청 처리
- 네트워크 오류 복구
- 필수 정보 검증
- 닉네임 중복 체크
- userId 유효성 검사
- 데이터 형식 검증
- 공백 처리
- 특수문자 처리
- 최대 길이 제한
- 생성 시간 기록
- 초기 설정값 검증
- 에러 메시지 정확성
- 기본 정보 수정 성공
- 닉네임 변경 처리
- posts 컬렉션 닉네임 업데이트
- reports 컬렉션 닉네임 업데이트 (신고자/피신고자)
- infos 컬렉션 닉네임 업데이트
- 일괄 업데이트 트랜잭션
- 부분 업데이트 실패 시 롤백
- 동시 수정 요청 처리
- 수정 권한 검증
- 변경 이력 추적
- UserDefaults 데이터 검증
- 캐시 데이터 관리
- 존재하지 않는 정보 조회
- 권한 체크
- 데이터 일관성
- 조회 성능
- 동시 요청 처리
- 오프라인 동작
- 세션 관리
- 에러 복구
- 태그 선택/해제 상태
- 다중 선택 처리
- 스타일 변경 검증
- 탭 이벤트 처리
- 레이아웃 정확성
- 비활성화 상태
- 애니메이션 동작
- 텍스트 오버플로우
- 접근성 지원
- 메모리 누수 검사
- 태그 추가/제거
- 레이아웃 계산
- 동적 크기 조정
- 여백 처리
- 스크롤 동작
- 터치 이벤트
- 재사용 처리
- 성능 측정
- 메모리 사용량
- 레이아웃 업데이트
- 게시글 작성 화면 전환
- 상세 화면 전환
- 뒤로가기 처리
- 모달 표시
- 네비게이션 스택
- 데이터 전달
- 메모리 해제
- 상태 저장
- Deep Link 처리
- 전환 애니메이션
- Delegate 패턴 동작
- Protocol 구현
- 약한 참조 처리
- 옵셔널 체이닝
- 순환 참조 방지
- 데이터 동기화
- 이벤트 전파
- 상태 관리
- 메모리 관리
- 에러 전파
- 최대 길이 제한
- 공백 처리
- 특수문자 처리
- 포맷팅 검증
- 실시간 유효성 검사
- 키보드 처리
- 포커스 관리
- 자동완성
- 복사/붙여넣기
- 실행 취소
- 단일 선택 처리
- 다중 선택 처리
- 선택 해제
- 필수 선택 검증
- 상태 변경 이벤트
- 시각적 피드백
- 선택 제한
- 그룹 선택
- 정상적인 신고 생성
- 신고 사유 선택 필수
- 신고 내용 필수 입력
- 중복 신고 방지
- 자기 자신 신고 불가
- 비회원 신고 불가
- 삭제된 게시글 신고
- 신고자/피신고자 정보 저장
- 신고 시간 기록
- 신고 상태 관리
- 신고 목록 조회
- 신고 상세 정보 조회
- 신고 처리 상태 변경
- 신고 이력 관리
- 신고 통계 집계
- 게시글별 신고 수 집계
- 사용자별 신고 수 집계
- 신고 데이터 정합성
- 관리자 권한 검증
- 신고 처리 알림
- 연결 끊김 처리
- 타임아웃 처리
- 재시도 메커니즘
- 오프라인 모드
- 에러 메시지
- 상태 복구
- 캐시 활용
- 백그라운드 처리
- 데이터 동기화
- 사용자 피드백
- 필수 필드 검증
- 형식 검증
- 중복 검증
- 범위 검증
- 유효성 검사
- 에러 표시
- 포커스 처리
- 오류 수정 안내
- 입력 제한
- XCTest 프레임워크
- Firebase Test Lab
- SnapKit
- Then
- Firebase 에뮬레이터 설정
- 테스트용 데이터베이스 구성
- 테스트 계정 준비
- UI 테스트를 위한 화면 캡처 도구
- 게시글 CRUD 및 권한 관리
- 회원정보 관리
- UI 인터랙션
- 데이터 정합성
- 단위 테스트는 독립적으로 실행 가능해야 함
- UI 테스트는 실제 디바이스에서 진행
- 테스트 데이터는 매 테스트마다 초기화
- 성능 측정이 필요한 경우 별도 표시
통합테스트
- Apple 로그인 → 약관 동의 → 회원정보 입력 → 메인화면 이동
- 필수 약관 동의 검증
- 회원정보 입력 시 닉네임 중복 체크
- UserDefaults에 userId 저장 검증
- Firebase Auth와 Firestore 데이터 동기화 확인
- 비회원으로 시작 → 메인화면 접근
- 게시글 조회만 가능한지 확인
- 제한된 기능 접근 시 로그인 유도 알림
- 로그인 화면 전환 처리
- 탈퇴 버튼 → 약관 확인 → Apple 재인증 → 데이터 삭제 → 로그인 화면
- Firebase Auth, Firestore, UserDefaults 데이터 삭제 검증
- 연관된 posts, reports, infos 컬렉션 데이터 삭제
- 실패 시 롤백 처리 검증
- 작성 화면 진입 → 데이터 입력 → 업로드 → 목록 갱신
- 필수 입력값 검증
- 태그 선택 상태 관리
- 게시글과 작성자 정보 연동
- 검색 키워드 자동 생성
- 상세화면 → 수정 버튼 → 수정 화면 → 저장 → 상세화면 갱신
- 작성자 본인만 수정 가능
- 기존 데이터 로드 및 표시
- 수정된 내용 실시간 반영
- 연관된 검색 키워드 업데이트
- 상세화면 → 삭제 확인 → 삭제 처리 → 목록 화면
- 작성자 본인만 삭제 가능
- 관련 신고 내역 처리
- 목록 화면 자동 갱신
- 최근 글 3개씩 표시
- 게시글 타입별 분류
- 스크롤 시 자동 갱신
- 카테고리 필터링
- 무한 스크롤 동작
- 새로고침 기능
- 게시글 선택 및 상세화면 전환
- 작성 버튼 노출 및 동작
- 검색어 입력 → 결과 표시 → 필터 적용
- 태그 기반 필터링
- 검색 결과 정렬
- 결과 없음 처리
- 프로필 화면 → 수정 화면 → 저장 → 프로필 갱신
- 닉네임 변경 시 연관 데이터 업데이트
- posts 컬렉션 닉네임
- reports 컬렉션 신고자/피신고자 닉네임
- infos 컬렉션 닉네임
- 일괄 업데이트 트랜잭션 처리
- 실패 시 롤백 검증
- 로그아웃 → UserDefaults 정리 → 로그인 화면
- 세션 정리
- 캐시 데이터 정리
- 화면 전환 처리
- 게시글 상세 → 신고 버튼 → 신고 작성 → 완료
- 비회원 신고 시도 차단
- 본인 게시글 신고 불가
- 중복 신고 방지
- 신고 데이터 저장 및 연동
- 신고 기록 저장
- 게시글 삭제 시 신고 내역 처리
- 회원 탈퇴 시 신고 내역 처리
- 신고 상태 관리
- 오프라인 상태 처리
- 데이터 로드 실패 시 재시도
- 업로드 실패 시 임시 저장
- 에러 메시지 표시
- 동시 수정 요청 처리
- 데이터 일관성 유지
- 트랜잭션 롤백
- 충돌 해결
- 로그인 상태 확인
- 작성자 권한 검증
- 접근 제한 처리
- 권한 오류 메시지
- 테스트용 Firebase 프로젝트 구성
- 테스트 계정 및 데이터 준비
- 네트워크 상태 시뮬레이션 도구 설정
- 테스트 디바이스/시뮬레이터 준비
- 테스트 전 초기 데이터 설정
- 테스트 후 데이터 정리
- 테스트 데이터 백업/복원
- 테스트 간 독립성 유지
- 기본 인증 및 회원 관리 플로우
- 게시글 CRUD 플로우
- 목록 및 검색 플로우
- 회원정보 관리 플로우
- 신고 기능 플로우
- 예외 상황 처리
커밋 메시지
- Feat: 새로운 기능 추가
- Fix: 버그 수정
- Docs: 문서 수정
- Style: 코드 포맷팅
- Refactor: 코드 리팩토링
- Test: 테스트 코드
- Chore: 기타 변경사항
- Cmt: 주석 수정
PR 규칙
- PR 탬플릿 준수
- 최소 3명의 리뷰어 승인 필요
- 기능별 스크린샷 첨부
- 유저피드백 반영
- 지역 필드 삭제
- 유저 차단기능 구현
- 다크모드, 텍스트필드, 키보드 관련 버그 수정

