Skip to content

Conversation

@hyeonsik971029
Copy link
Collaborator

제곧내

hyeonsik971029 and others added 30 commits March 21, 2025 10:12
- deinit 시 이미 해체되는 객체에 약한 참조 사용해서 문제 발생
 - 같은 로직을 담당하는 reactor의 state에 로직 옮기는 것으로 수정
* [삭제] NetworkManager 버전 검사 함수 삭제

* [수정] 버전 검사 시 기존 request 사용하는 것으로 수정
* [추가] Clarity 의존성 추가

* [추가] 각 타겟의 clarity project id 추가

* [추가] Clarity 초기화 및 적용
* [변경] 개발 서버 endpoint 변경

 - https -> http

* [변경] 정의된 에러 관리 방식 변경

 - DefinedError 파일에 정의된 에러 관리
 - NetworkManager 에러 생성 위치 변경

* [추가] 답카드 작성 시 에러 추가

 - 답카드 작성 시 부모 카드가 삭제되었을 때 에러 추가 및 분기

* [변경] 상세보기 > 카드 삭제 시 디자인 변경
* [변경] README.md 초안

* [추가] README.md 가이드

* [추가] README.md 완성본

* [추가] 앱스토어 링크 추가
* [변경] pod install

* [추가] Github Action CI 추가

 - 빌드(+ 린트 룰) 및 테스트 자동화

* [변경] 린트 룰 적용

* [수정] 오타 수정

* [추가] Github Action CD 추가

 - testFilght 업로드를 위한 certification 및 mobileprovision 암호화
 - signing : auto -> Profile-Dev 사용
 - export 후 앱의 ExportOptions 사용
* [수정] 알림센터의 특정 알림 삭제 로직 수정
 - 모든 알림을 삭제 후 특정 알림을 제외한 알림을 재 발송
 - 포그라운드에서 발생하는 상황이기 때문에 alert, banner 옵션을 제외

* [추가] Github Action CD 조건 추가
 - Develop: 1.12.0(1012000) -> 1.12.1(1012010)
 - Production: 1.4.0(104000) -> 1.4.1(104010)
* [추가] 숨 버전2를 위한 Pretandard 타이포그래피 추가

* [추가] 기존 스타일과 v2 스타일을 분리

* [변경] 기존 타이포그래피와 분기 처리

* [추가] 숨 버전2를 위한 색상 추가

* [추가] 숨 버전2를 위한 아이콘 추가

* [추가] 숨 버전2를 위한 이미지 및 로고 추가

* [변경] 기존 로고 초기화 방식 변경

* [변경] v2 업데이트에 따른 이미지 초기화 방식 분기 처리

* [변경] 숨 버전2 업데이트를 위한 Dialog 업데이트

 - title 및 message에 alignment 추가

* [변경] 숨 버전2를 위한 LaunchScreen 업데이트

 - 로고 애니메이션 삭제
 - 버전 업데이트 팝업 앱 강제 종료 로직 삭제

* [변경] SwiftLint 적용

* [변경] 숨 버전2를 위한 SOMButton 업데이트

* [추가] 온보딩 화면을 위한 이미지 추가

* [변경] 숨 버전2를 위한 온보딩 화면 업데이트

* [추가] 온보딩 화면에서 팝업 표시 중복 삭제

* [변경] SOMButton highlighted 색상 변경

* [변경] 숨 버전2를 위한 회원가입(이용약관) 업데이트

* [추가] MARK 주석 공백 추가

* [변경] 숨 버전2를 위한 SOMNavigationBar 업데이트

* [변경] 숨 버전2를 위한 회원가입(닉네임) 업데이트

* [변경] SOMButton 업데이트

 - 이미지 위치 변경 가능하도록 업데이트
 - 타이틀 위치 변경 가능핟록 업데이트

* [추가] 숨 버전2를 위한 프로필 이미지 추가

* [변경] 숨 버전2를 위한 프로필 설정 화면 업데이트

* [추가] 팝업을 위한 SwiftEntryKit 추가

* [추가] 로딩 뷰를 위한 lottie 및 json 추가

* [변경] 오타 수정

* [추가] LaunchScreen 딜레이 추가

* [추가] 온보딩 완료 화면을 위한 이미지 추가

* [추가] 숨 버전2를 위한 회원가입 완료 화면 추가

* [추가] 계정 이관 코드 화면을 위한 아이콘 추가

* [변경] 숨 버전2를 위한 계정 이관 코드 입력 화면 업데이트

* [변경] 오타 수정

* [추가] 계정 이관 코드 입력 실패 팝업 추가

* [변경] 개발 서버 endpoint 변경

* [변경] RxSwift 병합 오퍼레이터 변경

 - combineLatest -> merge: 둘 중 하나의 이벤트만 발생해도 방출

* [변경] 앱 아이콘 변경

 - Dev 및 Prod

* [변경] 온보딩 로직 변경

 - suspension 상태 초기화 추가
 - check 함수 Mutation 반환하는 것으로 변경

* [변경] 이용약관 선택 시 애니메이션 삭제

* [추가] 프로필 이미지 업로드 화면 에러 핸들링 추가

 - 부적절한 이미지 업로드 시 팝업 표시

* [수정] 온보딩 화면 및 로직 수정

 - 뒤로가기로 다시 온보딩 화면으로 돌아왔을 때, 상태 관리 수정

* [변경] 폰트 폴더 위치 변경

* [수정] SwiftLint 룰 적용

* [추가] 온보딩/회원가입/알림 DTO/Model 추가

* [변경] Managers 폴더 변경

* [변경] 숨 버전2를 위한 Request 변경

* [변경] 숨 버전2를 위한 모델 변경

* [추가] 의존성 주입 컨테이너 추가

* [변경] 숨 버전2를 위한 매니저 변경

* [추가] 클린 아키텍처 적용

* [변경] 숨 버전2를 위한 온보딩/회원가입 업데이트

* [추가] 파이어베이스 콘솔 로그 출력 감소

* [변경] App 및 Base 업데이트

* [변경] 로딩 뷰 크기 변경

* [변경] 주석 뎁스 변경

* [변경] xcode 계정 변경

* [변경] 네비게이션 뒤로가기 제스처 등록 위치 변경
* [수정] 이미지 수정

 - 기본 프로필 이미지 profile_large 사용하는 것으로 수정
 - 이용약관 체크 아이콘 수정

* [수정] 타이포그래피 수정

 - adjustment 삭제 (xcode 14 이상에서는 불필요)
 - text가 변하는 환경에서 typography 재설정 적용 및 주석 작성

* [추가] 밑줄 버튼 배경색 추가

 - highlighted 색상을 위해 추가
* [추가]스플래쉬 이미지 스토리보드에도 추가

* [추가] Intro MARK 주석 추가

* [추가] 홈 및 알림 화면에 사용될 이미지 추가

* [변경] 불필요한 request 모델 정리

* [추가] 홈 및 알림 화면에 필요한 모델 추가

* [추가] 홈 및 알림 화면에 필요한 클린아키텍처 관련 파일 추가

* [변경] 홈 및 알림 화면에 사용될 컴포넌트 정리

* [변경] 홈 및 알림 화면에 필요한 파운데이션 정리

* [변경] 불필요한 이전 작업 결과물 정리

* [변경] 홈 및 알림 화면 관련 파일 정리

* [변경] 개선 작업 중 호환되지 않는 부분 주석 처리

* [버전] Develop 1.14.0(1014000) 버전 업데이트

* [변경] 탭바 표시 시점 변경

* [버전] Develop 1.14.1(1014010) 버전 업데이트

* [수정] 피드 카드 높이 수정

* [수정] 상단 탭바 인디케이터 우선순위 수정

* [버전] Develop 1.14.2(101420) 버전 업데이트

* [수정] 피드 카드 시간 표기법 수접

* [버전] Develop 1.14.3(1014030) 버전 업데이트

* [수정] 피드 카드 본문 백그라운드 뷰 코너 수정

* [수정] 피드 카드 border 수정

* [수정] 홈 화면 알림 유무 닷 뷰 수정

* [버전] Develop 1.14.3(1014030) 버전 업데이트
hyeonsik971029 and others added 26 commits October 31, 2025 01:58
* [추가] BaseVC 및 SOMTabBarC의 deinit 시 옵저버 제거

* [수정] 상세화면 새로고침 시 api 2번 호출하는 문제 해결

* [변경] pulse 사용하는 것으로 변경

* [수정] 상세 화면 위로 스크롤 시 하단 offset 생기는 문제 해결

* [수정] 상세 화면 좋아요 및 답카드 수 표시 방법 및 리로드 횟수 수정

* [수정] 상세 화면 뷰 레이아웃 수정

* [변경] 새로고침 시 offset 추가 방식 변경

* [수정] 알림 화면 읽지 않은 알림 선택 시 API 호출

* [수정] 상세 화면 기본 프로필 이미지 border 추가

* [수정] 상세 화면 좋아요 로직 변경

* [추가] 상세 화면 차단 및 신고를 위한 이미지 및 버튼 변경

* [수정] 차단 및 신고 로직 수정

* [변경] 알림 화면에서 상세 화면 전환 로직 변경

* [수정] API 호출 시 empty response 대응

* [버전] Develop 1.17.1(1017010) 버전 업데이트

* [수정] 타이핑 시 줄바꿈 문제 해결

* [변경] UILabel, UITextField, UITextView 타이포그래피 설정 시 키 변경

* [수정] placeholder 이미지 표시 문제 해결

* [수정] SOMCard 표시 로직 수정

* [수정] 상세 화면 작성된 태그 간격 문제 해결

* [수정] 하단 탭바 아이콘 색상 수정

* [변경] 카드 추가 rpeonse 변경

* [수정] 카드 추가 성공 시 해당 카드 상세로 전환

* [변경] 상세 화면 변경

* [수정] 알림 선택 시 로직 수정

* [변경] 카드 추가 화면 태그 입력 시 동작 변경

* [버전] Develop 1.17.2(1017020) 버전 업데이트

* [수정] 상세 카드 삭제 시 뷰 로직 수정

* [추가] 사진 권한 추가

* [버전] Develop 1.17.3(1017030) 버전 업데이트

* [수정] 탭바 아이콘 색상 수정

* [변경] 태그 입력 방식 변경

* [변경] 상세 화면 백그라운드 색상 변경

* [수정] 카드 추가 시 s3 공간 확보 API 추가

* [버전] Develop 1.17.4(1017040) 버전 업데이트
* [추가] 마이 화면 API 및 클린 아키텍처 파일 추가

* [변경] 마이 화면에 사용될 API 및 클린 아키텍처 관련 파일 변경

* [변경] 마이(프로필, 프로필 변경, 팔로우) API 및 클린 아키텍처 파일 변경

* [변경] 개발에 필요한 유틸 파일 변경

* [변경] 디자인 시스템 변경

* [수정] 오타 수정

* [변경] 프로필 탭 화면 숨 버전2 개선 적용

* [변경] 숨 버전2를 위한 프로필 변경 화면

* [변경] 숨 버전2를 위한 팔로우 화면

* [변경] 상세 화면에서 프로필 화면 전환 추가

* [삭제] 구버전 조회 API 삭제

* [추가] 설정 관련 API 및 클린 아키텍처 파일 추가

* [추가] 설정 관련 파일 추가

* [수정] 오타 수정

* [변경] 프로필 변경

* [변경] 팔로우 화면 변경

* [변경] 숨 버전2를 위한 설정 개선

* [버전] Develop 1.18.0(1018000) 버전 업데이트

* [변경] 내 프로필일 경우에만 제스처 델리게이트 설정

* [추가] 알림 화면 태그 알림 포맷 추가

* [수정] 문구 수정 '답카드' -> '댓글카드'

* [추가] 셀 재사용 시 기존 데이터 초기화

* [수정] 프로필 업데이트 화면에서 기본 이미지 변경 기능 추가

* [추가] 네트워크 불안정 토스트 메시지 및 싱글톤 클래스 추가

* [변경] 팔로우 알림일 때, 상대방 프로필로 전환

* [수정] 삭제된 카드일 때, 팝업 표시

* [추가] 홈 공지 페이지 뷰 오토 스크롤 추가

* [추가] 카드 작성 중 이용 안내 제한 케이스 추가

* [추가] 네트워크 토스트 메시지 패딩 추가

* [추가] 설정 화면 재가입 날짜 조회 API 및 클린 아키텍처 파일 추가

* [변경] 회원탈퇴 팝업 표시 시 데이터 변경

* [추가] API 호출 중 네트워크 오류 핸들링

* [추가] 설정 화면 상태 초기화 코드 추가

* [추가] 오토 스크롤 시 뷰 로드 시점 추가

* [변경] 서버에서 받은 이미지 원본 비율 유지

* [수정] 메모리 누수 해결

* [수정] 프로필 업데이트 화면에서 사용자 이미지일 때, 이미지 초기화 추가

* [버전] Develop 1.18.1(1018010) 버전 업데이트

* [수정] 홈 화면 시간 표시 수정

* [변경] 차단 및 팔로우 상태 pulse 사용 및 UI 업데이트 로직 변경

* [추가] 현재 쓰이지 않는 기능 주석 처리

* [추가] Dialog 표시할 때, 중복 제거

* [변경] 네트워크 유실 감지 로직 변경

* [버전] Develop 1.18.2(1018020) 버전 업데이트

* [변경] 프로필 업데이트 초기화 시 프로필 이미지 직접 받는 것으로 변경

* [수정] 프로필 업데이트 방식 변경

 - 이미지 업로드 시 상태코드로 성공 여부 판단

* [변경] 토큰 재인증 시 성공 여부에 따라 바로 반환하는 것으로 변경

* [추가] Firebase Crashlytics 추가

* [수정] SOMDialog 수정

* [수정] header 탭 아이템이 변경될 때, 선택된 인덱스 사용

* [수정] 닉네임 텍스트 필드 삭제 버튼 수정

* [수정] 카드추가 화면 중복 push 수정

* [수정] 팔로우 화면 팔로잉 취소 시 다이얼로그 표시

* [수정] 부적절한 이미지 사용 시 기본 이미지로 변경 시점 수정

* [수정] 공백 혹은 줄바꿈만 있을 경우 카드 작성 버튼 비활성화

* [버전] Develop 1.18.3(1018030) 버전 업데이트

* [수정] 공지 조회 API 변경에 따른 수정

* [수정] 텍스트 입력 중 clearButton 숨김 여부 수정

* [수정] 프로필 업데이트 화면에서 기본 이미지 변경 기능 추가

* [추가] NetworkManager 온보딩 화면 보낸 후 반환 추가

* [추가] 글자수 제한 시 한글 조합 고려해서 적용

* [수정] 프로필 업데이트 버튼 활성화 로직 수정

* [수정] 하단 네비게이션 바 선택되지 않은 이미지 색상 수정

* [수정] 에러 핸들링 수정

* [버전] Develop 1.18.4(1018040) 버전 업데이트

* [변경] reloadData 시에 애니메이션 제거

* [변경] 온보딩 화면 밴 사용자 판단 로직 변경
* [변경] Reactor에서 usecase를 통해 authManager 접근하도록 변경

* [변경] Reactor/View에서 usecase를 통해 pushManager/locationManager 접근하도록 변경

* [변경] 설정 > 공지사항 화면에서 임의로 붙였던 `공지` 접두사 제거

* [삭제] v1 버전 API request 및 model 삭제

* [변경] 태그 관련 API 및 클린 아키텍처 관련 파일 업데이트

* [수정] 탈퇴하기 팝업 버튼 색상 변경

* [수정] 회원탈퇴 화면 하단 버튼 높이 수정

* [삭제] ㅎㅎ

* [수정] 회원탈퇴 화면 view 간격 수정

* [수정] 닉네임 입력 시 항상 clear 버튼 표시

* [변경] 홈 화면 공지 뷰 자동 스크롤 조건 변경

* [수정] 회원탈퇴 화면 기타 입력 글자 수 제한 수정

* [수정] 회원탈퇴 화면 `기타` 내용 입력 시 키보드 인터랙션 수정

* [수정] 서버 응답 필드 타입 수정

* [수정] 오류 발생 시 처리 코드 연결

* [버전] Develop 1.18.5(1018050) 버전 업데이트

* [추가] 사용자 닉네임 정보 로컬에서 관리

* [삭제] 불필요한 주석 삭제

* [수정] 재인증 로직 수정

* [버전] Develop 1.18.6(1018060) 버전 업데이트

* [수정] 재인증 과정 종료 후 초기화 과정 추가

* [버전] Develop 1.18.7(1018070) 버전업데이트

* [수정] 회원탈퇴 화면 기타 입력 시 키보드 인터랙션 수정

* [추가] 키체인 로드 실패 시 로깅 더 자세히 추가

* [수정] 불필요한 코드 제거

* [변경] 리프레쉬 컨트롤 로직 변경

* [추가] 개발에 필요한 유틸 추가

* [추가] 프로필 탭에서 상세 화면 전환 추가

* [추가] 관심 태그 관련 파일 추가

* [추가] 인기 태그 관련 파일 추가

* [추가] 태그 모아보기 화면 관련 파일 추가

* [추가] 태그 검색 + 모아보기 화면 관련 파일 추가

* [추가] 태그 탭 관련 파일 추가

* [추가] 계정이관 성공 시 온보딩화면으로 이동

* [버전] Develop 1.19.0(1019000) 버전 업데이트

* [추가] 상세 화면에서 태그 모아보기 화면 전환 추가

* [삭제] 불필요한 주석 삭제

* [추가] 화면 전환 혹은 api 호출 탭의 경우 throttle 추가

* [변경] 검색 텍스트필드 로직 수정

* [수정] 카드추가 화면에서 관련 태그 뷰 레이아웃 수정

* [추가] 알림 화면 태그 알림 추가

* [버전] Develop 1.19.1(1019010) 버전 업데이트

* [변경] 로그인 실패 시 로직 변경

* [수정] 태그 검색 시 텍스트 인풋 영역 수정

* [수정] 계정이관 성공 시 기존 토큰 제거

* [수정] 회원 탈퇴화면 기타 입력 시 키보드 인터랙션 수정

* [수정] 온보딩 및 프로필 업데이트 화면에서 에러 로직 수정

* [수정] 빈 화면일 때 UI 중앙 정렬

* [수정] banned와 withdraw 유저 분리해서 처리

* [추가] 태그 검색 후 모아보기 화면에서 관심 태그 조회 추가

* [추가] 알림 화면 관련 태그 상세 화면 전환 추가

* [변경] 계정 이관 성공 후 온보딩 화면으로 전환

* [변경] 인증 실패 후 온보딩 화면 전환 시 트랜지션 변경

* [추가] 푸시 알림 통해 앱 진입 시 화면 플로우 추가

* [추가] 탭 전환 추가

* [삭제] 불필요한 코드 삭제

* [수정] 상세 화면 댓글 카드 정렬 수정

* [버전] Develop 1.20.0(1020000) 버전 업데이트

* [수정] 푸시 알림으로 앱 진입 시 로직 수정

* [수정] 홈 화면 우측 알림 아이콘 레이아웃 수정

* [버전] Develop 1.20.1(1020010) 버전 업데이트

* [수정] 닉네임 텍스트필드 X 버튼 표시 로직 수정

* [수정] 삭제된 카드에 대한 화면 전환 시 로직 수정

* [버전] Develop 1.20.2(1020020) 버전 업데이트

* [수정] 삭제된 상세 화면에서 카드추가 시 로직 수정

* [수정] 상세 화면 댓글 카드 top inset 수정

* rebase 요망

* [추가] 앱 처음 진입 시 카드추가 가이드 뷰 추가

* [수정] 카드추가 화면 삭제된 카드일 때 플로우 수정

* [수정] UITextView 줄바꿈 시 겹치는 문제 해결

* [버전] Develop 1.20.3(1020030) 버전 업데이트

* [수정] 상세 화면 댓글 카드 정렬 수정

* [수정] 스크롤 뷰에서 아래->위 스크롤 시 위치 고정

* [추가] 스크롤 뷰에서 초기값 설정

* [추가] 삭제된 피드 카드에서도 홈 화면 전환

* [버전] Develop 1.20.4(1020040) 버전 업데이트
* [변경] 레파지토리 관심사 분리

* [변경] UseCase 더 세세하게 관심사 분리

* [수정] LaunchScreen 불필요한 코드 제거 및 메인 스레드 활용

* [수정] 온보딩 화면 UseCase 변경 및 메인 스레드 활용

* [변경] asyncInstance -> instance로 변경

* [수정] 온보딩 닉네임 설정 화면 UseCase 변경 및 메인 스레드 활용

* [수정] 온보딩 프로필 이미지 설정 화면 UseCase 변경 및 메인 스레드 활용

* [수정] 회원가입 완료 화면 버튼 탭 액션 throttle 추가

* [수정] 메인 탭바 VC UseCase 변경 및 메인 스레드 활용

* [수정] 나의 닉네임 조회할 때, 기존 함수 사용

* [추가] 홈 화면에 필요한 UseCase 추가

* [수정] 홈 화면 UseCase 변경 및 메인 스레드 활용

* [수정] 상세 화면 카드 유형 로직 UseCase 및 메인 스레드 활용

* [수정] 상세 화면 카드 유형 로직 변경에 따른 수정

* [수정] 신고 화면 UseCase 및 메인 스레드 활용

* [수정] 알림 화면 UseCase 및 메인 스레드 활용

* [수정] 카드추가 화면 UseCase 및 메인 스레드 활용

* [수정] 태그 화면 UseCase 및 메인 스레드 활용

* [수정] 태그 검색 화면 UseCase 및 메인 스레드 활용

* [수정] 태그 모아보기 UseCase 및 메인 스레드 활용

* [수정] 프로필 화면 UseCase 및 메인 스레드 활용

* [수정] 팔로우 화면 UseCase 및 메인 스레드 활용

* [수정] 프로필 업데이트 화면 UseCase 및 메인 스레드 활용

* [수정] 설정 화면 UseCase 및 메인 스레드 활용

* [수정] 차단 사용자 화면 UseCase 및 메인 스레드 활용

* [수정] 계정 이관 화면 UseCase 및 메인 스레드 활용

* [수정] 약관 화면 URL 수정

* [수정] 회원 탈퇴 화면 UseCase 및 메인 스레드 활용

* [수정] 공지사항 화면 UseCase 및 메인 스레드 활용

* [수정] 계정 이관 시 존재하지 않는 사용자 예외 처리

* [수정] 온보딩 약관 URL 수정

* [수정] 온보딩 닉네임 입력 화면 clearButton 숨김로직 수정

* [수정] 상세 하면 조회 시 디코딩 로직 수정

* [수정] 홈 -> 상세 화면으로 전환 시 중복 제거

* [수정] 오타 수정

* [수정] 태그 관련 화면 불필요한 코드 제거 및 토스트 메시지 추가

* [수정] 홈 화면 위치 권한 여부에 따른 로직 수정

* [수정] 계정 이관 성공 시 런치 화면 부터 시작

* [삭제] 불필요한 UseCase 삭제

* [버전] Develop 1.20.5(1020050) 버전 업데이트

* [삭제] 중복 throttle 삭제

* [수정] 카드추가 화면에서 글 작성 시 정렬 수정

* [수정] 태그 탭 화면 닉네임 조회 보장

* [수정] 피드 카드 정보 표시 로직 수정

* [수정] 알림 화면 텍스트 줄바꿈 로직 수정

* [수정] 이용 제한 날짜 수정

* [수정] 태그 탭 화면 관심/인기 태그 화면 전환 지연 수정

* [수정] 설정 화면 오타 수정

* [수정] 홈 공지사항 자동 스크롤 로직 수정

* [수정] 설정 > 공지사항 정렬 수정

* [변경] 탭바 숨김 로직 수정

* [변경] 상세 조회 시 삭제된 카드 API 변경

* [추가] 상세 조회 시 신고여부 조회 추가

* [수정] 메모리 누수 원인 제거

* [추가] 재인증 후 return 추가

* [삭제] 불필요한 코드 삭제

* [추가] 카드추가 화면 가이드 뷰 추가

* [버전] Develop 1.21.0(1021000) 버전 업데이트

* [수정] 제스처 뒤로가기 활성화

* [버전] Develop 1.21.1(1021010) 버전 업데이트

* [수정] 네비게이션 제스처 활성화 수정

* [버전] Develop 1.21.2(1021020) 버전 업데이트

* [삭제] 홈 화면 알림 조회 중복 삭제

* [수정] 온보딩 `화면 숨 시작하기` 탭 시 항상 계정 상태 확인

* [수정] 프로필 탭 화면 조회수 항상 표시

* [수정] UITextField 글자수 제한 수정

 - 마지막 타이핑이 영어 여부 확인 추가
 - 마지막 타이핑이 모음 여부 확인 추가

* [추가] 온보딩 화면 닉네임 유효 검사 후 화면 전환

* [수정] 여러 API가 토큰 재인증을 시도할 때, 중복 삭제

* [버전] Develop 1.21.3(1021030) 버전 업데이트

* [수정] 네비게이션 코드 수정

* [추가] 카드추가 시 입력중인 태그 있을 때, 같이 요청

* [추가] 카드추가 화면 이벤트 탭 및 이미지 추가

* [버전] Develop 1.22.0(1022000) 버전 업데이트

* [수정] 카드 추가 API 요청 시 작성중 태그 관련 수정

* [수정] 코드 스타일 및 약한참조 사용

* [수정] 프로필 업데이트 시 프로필 이미지 이름 항상 요청

* [수정] 카드 추가 화면 기본 이미지 정렬

* [수정] SwiftLint 해결

* [수정] 재인증 완료 시 즉시 성공 반환

* [수정] 런치 화면 로그인 실패 시 로직 추가

* [수정] 닉네임 텍스트 필드 입력 시 clearButton 숨김 로직 수정

* [수정] 오타 수정

* [수정] 텍스트 편집의 경우 editingChanged 사용

* [추가] self 캡처 추가

* [수정] firebase 버전 수정

* [추가] 카드 추가 화면 기본 이미지 필터 중 이벤트 닷 추가

* [수정] 메인 홈 화면 카드 이미지 레이아웃 수정

* [변경] 리프레쉬 컨트롤 표시 더 자연스럽게 변경

* [버전] Develop 1.22.1(1022010) 버전 업데이트

* [추가] 카드 추가 화면 이미지 보더 색상 변경

* [수정] 프로필 화면 하단 인셋 추가

* [버전] Develop 1.22.2(1022020) 버전 업데이트

* [수정] 마이 > 작성된 댓글카드 조회 페이징 API 추가

* [수정] 오타 수정

* [수정] 마이 화면 작성된 카드 유무에 따른 하단 인셋 다르게 유지

* [버전] Develop 1.22.3(1022030) 버전 업데이트
* [변경] Dialog dismiss 방식 변경

* [변경] 카드 추가 권한 및 딥링크 상태 초기화 액션 변경

* [변경] 카드 추가 화면 전환 상태 초기화 액션 변경

* [변경] 설정 화면 회원 탈퇴 시 재가입 가능 날짜 상태 초기화 액션 변경

* [변경] 홈 피드 상태 및 상세 전환 상태 액션 변경

* [수정] API 호출 최소화를 위한 옵저버 패턴 사용

* [변경] 메인 스레드 사용

* [추가] 상대방 프로필 일 경우, 하단 인셋 삭제

* [변경] 피드카드 삭제 이벤트 명명

* [변경] GA 관련 파일 명명 및 주석처리

* [변경] Clarity 등록 및 사용자 앨범 녹화 막음

* [변경] 타이머 아이콘 변경

* [변경] 변경해야 할 카드 정보만 순회

* [변경] 단일 파라미터인 경우에도 처리할 수 있도록 변경

* [수정] 펑 시간 공백 제거

* [수정] 삭제된 카드팝업 표시 로직 수정

* [수정] 상세 화면 댓글카드 삭제 시 업데이트 로직 수정

* [수정] 상세 화면에서 가로 크기에 맞춰 줄바꿈 하도록 수정

* [수정] nil 및 중복 확인 시점 수정

* [수정] 상세 화면 진입 전 삭제된 카드인지 확인

* [수정] 읽지 않은 알림이 없을 때, 홈 새로고침하던 것 수정

* [수정] 알림 화면 삭제된 카드 알림 읽음 요청 및 전환 로직 수정

* [수정] 카드 추가 시 중복 태그 삭제

* [수정] 홈 카드 뷰 보더 로직 수정

* [삭제] 불필요한 린트 룰 삭제

* [추가] 맞춤 이벤트를 위한 GA 연동

* [버전] Develop 1.23.0(1023000) 버전 업데이트

* [수정] Gemini 제안

- 기존 set을 통한 중복제거는 순서 보장 어려움

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* [수정] SwiftLint 룰에 맞게 수정

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
@hyeonsik971029 hyeonsik971029 self-assigned this Dec 17, 2025
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @hyeonsik971029, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 모듈성, 테스트 용이성 및 유지보수성을 향상시키기 위해 의존성 주입(DI) 컨테이너, 리포지토리 및 유스케이스 패턴을 도입하여 애플리케이션 아키텍처를 크게 리팩토링합니다. 또한, 향상된 오류 처리 및 토큰 관리를 위해 네트워크 계층을 대폭 업데이트했습니다. 더불어, 새로운 디자인 시스템 컴포넌트로 UI/UX를 개선하고 온보딩 및 인증 흐름을 간소화했습니다.

Highlights

  • DI 컨테이너 도입: 기존 ManagerProviderType을 대체하는 의존성 주입(DI) 컨테이너 패턴을 도입하여 모듈성과 테스트 용이성을 향상시켰습니다.
  • 리포지토리 및 유스케이스 패턴 적용: 데이터 접근 계층을 추상화하는 리포지토리 패턴과 특정 애플리케이션 기능을 캡슐화하는 유스케이스 클래스를 도입하여 비즈니스 로직을 분리하고 ReactorKit의 역할을 경량화했습니다.
  • 네트워크 계층 개선: 네트워크 매니저에 GET 요청을 위한 fetch와 다른 HTTP 메서드를 위한 perform 메서드를 추가하고, 토큰 재인증 및 네트워크 오류 대화 상자를 포함한 강력한 오류 처리를 위해 ErrorInterceptor를 도입했습니다.
  • UI/UX 개선 및 컴포넌트 업데이트: 새로운 디자인 시스템(v2)을 반영하여 SOMButton, SOMCard, SOMDialogViewController, SOMRefreshControl 등 여러 UI 컴포넌트를 업데이트하거나 새로 추가했습니다.
  • 온보딩 및 인증 흐름 개선: 새로운 UI, 닉네임 유효성 검사, 프로필 이미지 설정 등 온보딩 프로세스를 개선하고, 인증 재인증 로직을 세분화했습니다.
  • Firebase 및 Pods 업데이트: Firebase SDK를 10.24.0으로 업데이트하고, Clarity, SwiftEntryKit, lottie-ios와 같은 새로운 Pod를 추가했습니다.
Ignored Files
  • Ignored by pattern: .github/workflows/** (3)
    • .github/workflows/CD.yml
    • .github/workflows/CI.yml
    • .github/workflows/swiftlint.sh
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 PR은 운영 배포를 위한 준비와 함께 클린 아키텍처 도입을 위한 대규모 리팩토링을 포함하고 있습니다. 전반적으로 코드 구조가 개선되고 최신 Swift 기능을 활용하려는 노력이 돋보입니다. 그러나 몇 가지 중요한 보안 및 아키텍처 관련 문제점이 발견되었습니다. 특히, ExportOptions.plist에 민감한 정보가 하드코딩되어 있어 시급한 수정이 필요합니다. 또한, 데이터 계층에 UI 로직이 포함되어 있어 계층 간 책임 분리 원칙을 위반하는 부분이 있습니다. 이 외에도 테스트 코드의 불일치, 코드 중복, 매직 넘버 사용 등 유지보수성을 저해할 수 있는 부분들이 확인되었습니다. 아래의 상세 리뷰를 참고하여 수정해주시기 바랍니다.

Comment on lines +22 to +23
<key>teamID</key>
<string>99FRG743RX</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

teamID가 파일에 하드코딩되어 있습니다. 이는 심각한 보안 취약점이 될 수 있습니다. 민감한 정보는 소스 코드에 포함되지 않도록 빌드 시점에 환경 변수나 별도의 보안 설정 파일을 통해 주입하는 방식을 사용해야 합니다. 예를 들어, CI/CD 파이프라인에서 $(TEAM_ID)와 같은 변수를 설정하여 사용할 수 있습니다.

return Coordinate()
}

var hasCoordinate: Bool { return true }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

LocationManagerDelegate 프로토콜이 hasCoordinate 대신 hasPermission을 요구하도록 변경되었습니다. MockLocationManager도 이 변경사항을 반영하여 hasPermission을 구현해야 합니다. 현재 코드는 컴파일 오류를 유발할 수 있습니다.

Suggested change
var hasCoordinate: Bool { return true }
var hasPermission: Bool { return true }

Comment on lines +209 to +219
DispatchQueue.main.async {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let windowScene: UIWindowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window: UIWindow = windowScene.windows.first(where: { $0.isKeyWindow })
else { return }

let onBoardingViewController = OnboardingViewController()
onBoardingViewController.reactor = OnboardingViewReactor(dependencies: appDelegate.appDIContainer)
onBoardingViewController.modalTransitionStyle = .crossDissolve
window.rootViewController = UINavigationController(rootViewController: onBoardingViewController)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

certification() 메서드 내에서 404 에러 발생 시 AppDelegateUIWindow에 직접 접근하여 화면 전환 로직을 수행하고 있습니다. AuthManager는 데이터 및 인증 로직에만 집중해야 하며, UI 관련 코드를 포함해서는 안 됩니다. 이는 계층 간의 책임 분리 원칙을 위반합니다. 이 로직은 상위 계층(예: UseCase 또는 ViewModel/Reactor)에서 에러를 받아 처리하도록 리팩토링해야 합니다.

Comment on lines +13 to +14
<key>com.sooum.dev</key>
<string>Profile-Dev</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

개발용 프로비저닝 프로파일(com.sooum.dev)이 하드코딩되어 있습니다. 운영 배포를 위한 PR이므로, 운영용 번들 ID와 프로비저닝 프로파일을 사용해야 합니다. 환경 변수를 사용하여 개발과 운영 빌드를 구분하는 것이 좋습니다.

Comment on lines +124 to +206
func showNetworkErrorDialog() {

let confirmAction = SOMDialogAction(
title: Text.confirmActionTitle,
style: .primary,
action: {
SOMDialogViewController.dismiss()
}
)

DispatchQueue.main.async {
SOMDialogViewController.show(
title: Text.networkErrorDialogTitle,
message: Text.networkErrorDialogMessage,
textAlignment: .left,
actions: [confirmAction]
)
}
}

func showUnknownErrorDialog() {

let closeAction = SOMDialogAction(
title: Text.closeActionButtonTitle,
style: .gray,
action: {
SOMDialogViewController.dismiss()
}
)

let inquireAction = SOMDialogAction(
title: Text.inquiryActionTitle,
style: .primary,
action: {
SOMDialogViewController.dismiss {
let subject = Text.inquiryMailTitle.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
let guideMessage = """
\(Text.identificationInfo)
\(self.provider?.authManager.authInfo.token.refreshToken ?? "")\n
\(Text.inquiryMailGuideMessage)
"""
let body = guideMessage.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
let mailToString = "mailto:\(Text.adminMailStrUrl)?subject=\(subject)&body=\(body)"

if let mailtoUrl = URL(string: mailToString),
UIApplication.shared.canOpenURL(mailtoUrl) {

UIApplication.shared.open(mailtoUrl, options: [:], completionHandler: nil)
}
}
}
)

DispatchQueue.main.async {
SOMDialogViewController.show(
title: Text.unknownErrorDialogTitle,
message: Text.unknownErrorDialogMessage,
textAlignment: .left,
actions: [closeAction, inquireAction]
)
}
}


// MARK: go to onboarding

func goToOnboarding() {

self.provider?.authManager.initializeAuthInfo()

DispatchQueue.main.async {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let windowScene: UIWindowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window: UIWindow = windowScene.windows.first(where: { $0.isKeyWindow })
else { return }

let onBoardingViewController = OnboardingViewController()
onBoardingViewController.reactor = OnboardingViewReactor(dependencies: appDelegate.appDIContainer)
onBoardingViewController.modalTransitionStyle = .crossDissolve
window.rootViewController = UINavigationController(rootViewController: onBoardingViewController)
}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

ErrorInterceptor 내에 showNetworkErrorDialog, showUnknownErrorDialog, goToOnboarding과 같이 UI를 직접 제어하는 로직이 포함되어 있습니다. 네트워크 인터셉터는 데이터 계층의 일부이므로 UI 로직을 포함해서는 안 됩니다. 에러를 상위 계층으로 전달하여 UI 관련 처리는 해당 계층에서 담당하도록 리팩토링하는 것이 좋습니다. 이는 계층 간 책임 분리 원칙을 지키고 코드의 테스트 용이성과 유지보수성을 향상시킵니다.

# Environment
- Xcode 16.0(16A242d)
- iOS Deployment Target 15.0
- Ccocoapods Version 1.16.2
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Ccocoapods에 오타가 있습니다. Cocoapods로 수정해야 합니다.

Suggested change
- Ccocoapods Version 1.16.2
- Cocoapods Version 1.16.2

Comment on lines +169 to +217
// TODO: 임시, removeDeliveredNotifications(withIdentifiers: ) 의도한 동작 X
// 모든 알림을 삭제 후 특정 알림을 제외한 알림을 재 요청한다.
func deleteNotification(notificationId: String) {
let current = UNUserNotificationCenter.current()

Log.debug("remove notification with userInfo ID: \(notificationId)")

current.getDeliveredNotifications { notifications in

guard notifications.isEmpty == false else {
Log.debug("No delivered notifications to remove.")
return
}

let requestsToKeep = notifications
.filter { ($0.request.content.userInfo["notificationId"] as? String) != notificationId }
.map {
let identifier = $0.request.identifier
let contentToKeep = $0.request.content.mutableCopy() as! UNMutableNotificationContent
contentToKeep.userInfo["isReAddedNotifications"] = true
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false)

// 아주 짧은 시간 뒤에 다시 발송
return UNNotificationRequest(
identifier: identifier,
content: contentToKeep,
trigger: trigger
)
}
Log.debug("Preparing to remove all notifications and re-add \(requestsToKeep.count) notifications.")

current.removeAllDeliveredNotifications()
Log.debug("Called removeAllDeliveredNotifications.")

if requestsToKeep.isEmpty {
Log.debug("No notifications to re-add.")
} else {
requestsToKeep.forEach { request in
current.add(request) { error in
if let error = error {
Log.error("Error re-adding notification (ID: \(request.identifier)): \(error.localizedDescription)")
} else {
Log.debug("Successfully re-added notification (ID: \(request.identifier))")
}
}
}
}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

알림을 삭제하는 로직이 모든 알림을 가져와서 삭제 후 재등록하는 방식으로 구현되어 있어 복잡하고 비효율적일 수 있습니다. 주석에 removeDeliveredNotifications(withIdentifiers:)가 의도대로 동작하지 않는다고 언급되어 있는데, 이 문제에 대한 애플의 문서나 다른 해결책을 다시 한번 확인해보는 것이 좋습니다. 예를 들어, iOS 버전에 따른 동작 차이일 수 있습니다. 현재의 워크어라운드는 예기치 않은 사이드 이펙트를 유발할 수 있습니다.

Comment on lines +197 to +198
var serialTimer: Disposable?
var disposeBag = DisposeBag()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

SOMCard 뷰 내부에 serialTimerdisposeBag을 사용하여 '펑' 남은 시간을 계산하고 UI를 업데이트하는 로직이 포함되어 있습니다. 뷰는 데이터를 표시하는 역할에 집중하고, 이러한 비즈니스 로직은 ViewModel/Reactor에서 처리하는 것이 좋습니다. Reactor에서 타이머를 관리하고 남은 시간 문자열을 State로 전달하여 뷰에 바인딩하는 방식으로 리팩토링하면 코드의 책임 분리가 더 명확해지고 테스트가 용이해집니다.


var banEndFormatted: String {
return self.toString("yyyy년 MM월 dd일")
return self.addingTimeInterval(24 * 60 * 60).toString("yyyy년 MM월 dd일")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

banEndFormatted 계산 시 24시간을 더하는 로직이 추가되었습니다. 이 변경이 의도된 비즈니스 로직 변경인지 확인이 필요합니다. 예를 들어, '정지 종료일'이 '정지 시작일 + 정지 기간'을 의미하는데, UI 표시 시점에 하루를 더하는 것이 정확한 표현인지 검토가 필요해 보입니다.

Comment on lines +24 to 38
if let latesFilePath = filePaths.last {
let fileUrls: [URL] = [URL(fileURLWithPath: latesFilePath)]
let viewController = UIActivityViewController(
activityItems: fileUrls,
applicationActivities: nil
)
observer(.success(viewController))
} else {
let error = NSError(
domain: "\(identifier):Log",
code: -999,
userInfo: [NSLocalizedDescriptionKey: "기록된 로그가 없습니다."]
)
observer(.failure(error))
} else {
let fileUrls: [URL] = filePaths.map { .init(fileURLWithPath: $0) }
let viewController = UIActivityViewController(
activityItems: fileUrls,
applicationActivities: nil
)
observer(.success(viewController))
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

로그 추출 로직이 모든 로그 파일을 첨부하던 것에서 최신 로그 파일 하나만 첨부하도록 변경되었습니다. 이 변경으로 인해 문제 해결에 필요한 과거 로그 정보가 유실될 수 있습니다. 의도된 변경이 아니라면 이전처럼 여러 로그 파일을 첨부하거나, 최근 몇 개의 파일을 첨부하는 방식으로 재고려하는 것이 좋을 것 같습니다.

@hyeonsik971029 hyeonsik971029 merged commit 31b66a3 into main Dec 17, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants