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으로 제어
- 타지역 사용자도 입장은 허용하되 송신은 제한
- 코드 구조상
입장 조건
과송신 조건
을 분리하여 유저 경험을 개선하고, 커뮤니티의 지역 중심성을 유지함