포스트

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
    }

    // ... 신고 저장
}

이제 신고 버튼을 누르면 이 순서로 확인한다.

  1. 사유를 하나도 고르지 않았으면 막는다
  2. 기타를 골랐는데 내용이 비어 있으면 막는다
  3. 기타를 고르지 않았는데 내용이 있으면 막는다

커뮤니티 입장 제한 방식 변경

어제는 내 지역이 아닌 채팅방은 아예 들어가지 못하게 했다. 튜터님께 보여드렸더니 이런 피드백을 주셨다.

현재 기능도 충분히 좋지만, 다른 지역 사람들이 글은 볼 수 있게 하고, 글을 적지 않는 방향이 더 좋지 않냐

여행 가기 전에 그 지역 채팅방을 미리 구경할 수도 있으니 맞는 말이었다. 그래서 입장은 누구나 하고, 메시지 보내기만 내 지역일 때 가능하도록 바꿨다.


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 연결은 다음 글에서 한다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.