Final (25)
프로젝트 막바지에는 기능 구현에 쫓겨 블로그 정리를 제대로 하지 못했다. 그래서 이 글은 당시 GitHub 커밋 내역과, 프로젝트 기간에 직접 적어 둔 업무 내역 목록을 AI(Claude Code)에게 보여주고 그걸 바탕으로 내용을 다시 정리했다. 코드는 실제 커밋에 있던 것을 가져왔다.
오늘은 리뷰 신고의 예외처리 하나, 튜터님 피드백을 받아 바꾼 커뮤니티 입장 방식, 그리고 지도에 쓸 분식집 데이터 정리를 했다.
리뷰 신고 기타 사유 예외처리
리뷰 신고 화면은 “관련 없는 내용”, “광고” 같은 사유를 체크하고, “기타” 를 체크했을 때만 아래 입력칸에 직접 사유를 적게 되어 있다.
그런데 기타가 아닌 다른 사유만 체크하고 입력칸에 글을 써도 그 내용이 그대로 신고에 들어가고 있었다. 기타에 체크가 되어야 내용이 반영되어야 하는데, 그 조건이 빠져 있었던 것이다. 그래서 기타를 체크하지 않았는데 내용이 있으면 막도록 조건을 하나 추가했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@objc private func reportButtonTapped() {
guard let uid = Auth.auth().currentUser?.uid else { return }
if !isRelated && !isCommercial && !isPrivacy && !isIllegal && !isSpam && !isSexual && !isEtc {
showMessage(title: "오류", message: "하나 이상의 신고 사유를 선택해 주세요.")
return
}
if isEtc == true && textView.text.isEmpty {
showMessage(title: "오류", message: "신고 사유를 입력해 주세요.")
return
}
// new
if isEtc == false && !textView.text.isEmpty {
showMessage(title: "오류", message: "기타 사유를 선택한 경우에만 내용을 신고할 수 있습니다.")
return
}
// ... 신고 저장
}
이제 신고 버튼을 누르면 이 순서로 확인한다.
- 사유를 하나도 고르지 않았으면 막는다
- 기타를 골랐는데 내용이 비어 있으면 막는다
- 기타를 고르지 않았는데 내용이 있으면 막는다
커뮤니티 입장 제한 방식 변경
어제는 내 지역이 아닌 채팅방은 아예 들어가지 못하게 했다. 튜터님께 보여드렸더니 이런 피드백을 주셨다.
현재 기능도 충분히 좋지만, 다른 지역 사람들이 글은 볼 수 있게 하고, 글을 적지 않는 방향이 더 좋지 않냐
여행 가기 전에 그 지역 채팅방을 미리 구경할 수도 있으니 맞는 말이었다. 그래서 입장은 누구나 하고, 메시지 보내기만 내 지역일 때 가능하도록 바꿨다.
ChannelVC 에서 지역 여부 넘기기
입장을 막던 if 를 없애고, 지역이 같은지만 isLocation 에 담아서 ChatVC 로 넘긴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private var isLocation = false
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let channel = channels[indexPath.row]
let viewController: ChatVC
if currentAddress != channel.name {
isLocation = false
} else {
isLocation = true
}
if let user = currentUser {
viewController = ChatVC(user: user, channel: channel)
viewController.isLocation = isLocation
} else if let customUser = customUser {
viewController = ChatVC(customUser: customUser, channel: channel)
} else {
fatalError("No valid user found.")
}
navigationController?.pushViewController(viewController, animated: true)
tableView.deselectRow(at: indexPath, animated: true)
}
게스트는 어차피 보내기가 막혀 있어서 isLocation 을 넘기지 않았다.
ChatVC 에서 보내기 막기
ChatVC 는 받은 isLocation 이 false 면 세 곳을 막는다. 먼저 입력창을 회색으로 바꾸고 안내 문구를 띄운다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var isLocation: Bool?
private func setupMessageInputBar() {
if user != nil {
if isLocation == false {
messageInputBar.inputTextView.tintColor = .systemGray
messageInputBar.sendButton.setTitleColor(.systemGray, for: .normal)
messageInputBar.inputTextView.placeholder = "타 지역에서는 보낼 수 없습니다."
} else {
messageInputBar.inputTextView.tintColor = ThemeColor.mainOrange
messageInputBar.sendButton.setTitleColor(ThemeColor.mainOrange, for: .normal)
messageInputBar.inputTextView.placeholder = "채팅을 입력해주세요!"
}
} else if customUser != nil {
// 게스트 입력창
}
}
그리고 클립 버튼(사진, 지도 첨부)과 전송 버튼을 눌렀을 때도 Alert 를 띄우고 멈춘다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@objc private func presentInputActionSheet() {
if user != nil {
if isLocation == false {
showMessage(title: "안내", message: "타 지역에서는 불가합니다.")
} else {
// 사진, 지도 action sheet
}
}
// ...
}
func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String) {
// ... displayName 확인
if isLocation == false {
showMessage(title: "안내", message: "타 지역에서는 불가합니다.")
} else {
// 메시지 만들어서 저장
}
}
입장 조건과 보내기 조건이 나뉘면서, ChannelVC 는 지역이 같은지만 판단하고 ChatVC 는 그 값에 따라 보내기만 제한하게 됐다.
심사용 테스트 채널
여기서 문제가 하나 있었다. 앱 심사는 Apple 심사 담당자가 하는데, 담당자는 한국에 있지 않으니 어느 지역 채팅방에서도 메시지를 보낼 수가 없다. 그러면 채팅 기능을 확인할 수 없어서 또 Reject 이 날 수 있다.
그래서 이름이 “테스트” 인 채널만 예외로, 위치와 관계없이 보낼 수 있게 했다.
1
2
3
4
5
6
7
8
9
10
if let user = currentUser {
if channel.name == "테스트" {
isLocation = true
viewController = ChatVC(user: user, channel: channel)
viewController.isLocation = isLocation
} else {
viewController = ChatVC(user: user, channel: channel)
viewController.isLocation = isLocation
}
}
분식집 데이터 전처리
지도 탭은 내 주변 분식집을 마커로 보여준다. 이 분식집 목록은 공공데이터를 전처리한 것인데, 정리하다 보니 문제가 두 가지 있었다.
첫째는 주소다. 지도 정보는 구주소(지번)에서 신주소(도로명)로 바뀌었는데, 전처리해 둔 데이터는 구주소를 담고 있었다. 그래서 신주소로 변환하는 작업이 필요했다.
둘째는 양이다. 서울 지역 데이터만 약 8천 개였다. 지도를 열 때마다 이게 한 번에 로드되면, 내 주변이 아닌 가게까지 전부 불러오는 불필요한 로드가 생긴다. 그래서 지역을 더 나누어 필요한 지역만 불러오도록 할 예정이다.
전처리 데이터 사용 방식 변경
기존에는 전처리한 데이터를 Firebase 에 업로드해 두고, 지도를 열 때 Firebase 에서 fetch 해서 썼다.
그런데 이 데이터는 사용자가 바꾸는 값이 아니라 우리가 미리 만들어 둔 고정된 목록이다. 매번 서버에서 받아 올 이유가 없다. 그래서 JSON 파일로 만들어 앱 안에 넣고, Local 에서 읽어 쓰는 방식으로 바꾸자고 제안했다.
이렇게 하면 지도를 열 때 네트워크를 기다리지 않아도 되고, Firebase 읽기 횟수도 줄어든다. 실제 JSON 연결은 다음 글에서 한다.