포스트

Final (25)

신고기능 예외처리

변경 전

  • 기타 사유(isEtc)가 체크되지 않았음에도 사용자가 textView에 내용을 입력하는 경우에 대한 예외 처리가 존재하지 않음
  • 따라서 ‘기타’가 아닌 사유를 선택하고 내용을 입력하면, 유효성 충돌 없이 그대로 신고 처리됨

변경 후

기타 사유 체크 여부와 textView 입력 상태를 조합하여 유효하지 않은 조합을 방지하도록 조건을 추가함:

1
2
3
4
if isEtc == false && !textView.text.isEmpty {
    showMessage(title: "오류", message: "기타 사유를 선택한 경우에만 내용을 신고할 수 있습니다.")
    return
}
  • 사용자가 ‘기타’ 사유를 선택하지 않았음에도 불구하고 textView에 내용을 작성한 경우, 해당 내용은 무시되어야 마땅하지만, 혼란을 방지하기 위해 명시적 차단과 메시지를 추가
  • 이 조건은 아래의 조건과 함께 작동함:
    • 기타 선택은 했으나 내용이 없을 때 → 입력 요청
    • 기타 선택 안 했는데 내용이 있음 → 차단
    • 기타 선택도 했고 내용도 있음 → 허용
  • 해당 변경은 리뷰 신고 기능의 UX를 개선하며, 잘못된 신고 데이터가 등록되는 상황을 미연에 방지함

결론

이번 변경은 기타 사유 체크박스의 상태와 입력 필드의 연동을 보다 엄격히 검증함으로써, 사용자에게 명확한 신고 흐름을 제공하고, 서버에 등록되는 신고 데이터의 정확성과 신뢰성을 높인 개선이다.

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

변경 전

  • 지역 일치 여부에 따라 isLocation 값을 true/false로 설정하고, 이후 ChatVC에 이 값을 전달하여 메시지 전송 제약을 설정함.
  • 하지만 이 방식은 다음과 같은 문제가 있었음:
    • isLocation이 명시적으로 UI 입장 조건을 제어하지 않음 (즉, 입장 자체는 허용됨)
    • 예외 채널(“테스트”) 처리는 흐름과 혼합되어 있어 직관적이지 않음
    • 위치 불일치 시 경고 메시지가 표시되지 않고, 내부 제약으로만 처리되어 UX상 혼란이 발생할 수 있음

변경 후

지역 불일치 또는 테스트 채널 여부에 따라 입장 자체를 제어하고, UI 피드백을 명확히 제공함.
구체적으로 아래와 같이 변경됨:

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
31
32
33
34
35
36
37
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let channel = channels[indexPath.row]

    // 현재 주소와 채널 이름이 일치하는 경우
    if currentAddress == channel.name {
        let viewController: ChatVC
        if let user = currentUser {
            viewController = ChatVC(user: user, channel: channel)
        } 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)

    // 테스트 채널은 지역과 관계없이 항상 허용
    } else if channel.name == "테스트" {
        let viewController: ChatVC
        if let user = currentUser {
            viewController = ChatVC(user: user, channel: channel)
        } 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)

    // 그 외에는 경고 메시지 표시 후 입장 차단
    } else {
        showMessage(
            title: "지역 오류",
            message: "현재 속한 지역의 대화방만 입장가능합니다.\n현재 유저님의 속한 지역은 \(currentAddress)입니다."
        )
    }
}
  • 예외 처리(테스트 채널)와 지역 일치 조건을 별도의 분기로 명확히 분리하여 가독성 향상
  • 입장 조건이 맞지 않는 경우 즉시 showMessage로 사용자에게 지역 불일치 안내
  • isLocation을 ChatVC로 넘겨 판단하는 방식 대신, 입장 시점에서 조건을 처리함으로써 흐름이 단순하고 명확해짐
  • ChatVC는 이후 메시지 전송/입력창 제한 처리에만 집중할 수 있음

결론

기존에는 지역 제약이 내부적으로만 처리되어 사용자 경험 측면에서 혼란을 유발할 수 있었음.
이번 개선은 입장 조건을 명확히 구분하고, 예외 채널과 일반 채널의 입장 흐름을 직관적으로 재구성하여 구현 가독성 및 UX 측면 모두에서 이득을 얻은 변경이다.

튜터님 의견 수용

기존에는 현재지역만 입장하능하게했지만, 타지역도 채널입장은 가능하게 하는것이 좋겠다는 튜터님의 의견이 있어서, 그부분을 반영한다.

ChannelVC 변경 내용

  • 새로운 프로퍼티 추가
    채널 입장 시 위치 일치 여부를 판단해 전달할 수 있도록 변수 추가

    isLocation: Bool = false

  • 채널 클릭 시 지역 여부 판단

    currentAddress != channel.name 조건을 통해 지역이 일치하지 않는 경우 isLocation = false로 설정

1
2
3
4
5
  if currentAddress != channel.name {
      isLocation = false
  } else {
      isLocation = true
  }
  • ChatVC로 isLocation 전달

    인증 유저 혹은 게스트 유저로 분기 후 ChatVC 인스턴스를 초기화하고 isLocation 값을 함께 전달

1
2
3
4
5
6
  if let user = currentUser {
      viewController = ChatVC(user: user, channel: channel)
      viewController.isLocation = isLocation
  } else if let customUser = customUser {
      viewController = ChatVC(customUser: customUser, channel: channel)
  }

ChatVC 변경 내용

  • 프로퍼티 추가

    var isLocation: Bool = false

  • 메시지 전송 제한 조건 추가

    isLocation이 false인 경우 송신을 막고 안내 메시지를 띄움

1
2
3
4
guard isLocation else {
      showMessage(title: "알림", message: "현재 지역의 채널에서만 채팅을 보낼 수 있습니다.")
      return
}
  • 유저 타입 분기 구조는 유지하면서 송신만 제어

예시 코드 (설명 포함)

ChannelVC - didSelectRowAt 예시

타지역 유저도 입장할 수 있도록 하되, isLocation 값을 판단해 전달

channel 선택 시:

1
2
3
4
5
6
7
8
9
10
11
12
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)
}

ChatVC - 메시지 전송 시 분기처리

1
2
3
4
5
6
7
8
@objc private func sendButtonTapped() {
    guard isLocation else {
        showMessage(title: "알림", message: "현재 지역의 채널에서만 채팅을 보낼 수 있습니다.")
        return
    }

    // 메시지 송신 로직 진행
}

결론

  • 지역 조건을 확인해 isLocation으로 제어
  • 타지역 사용자도 입장은 허용하되 송신은 제한
  • 코드 구조상 입장 조건송신 조건을 분리하여 유저 경험을 개선하고, 커뮤니티의 지역 중심성을 유지함
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.