![[Ting / 트러블슈팅] 회원정보 수정 시 닉네임 변경을 강제하는 현상 수정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegvyVW%2FbtsMe33ZExY%2FQqkKgTclWfrLAWA7ajcBJK%2Fimg.png)
개요
마이페이지에서 회원정보 수정하러 들어가서 저장하기 버튼을 누르면, 닉네임 수정을 강제하는 문제가 생겼다.
우리는 닉네임을 유니크 값으로 유지하기로 결정했기 때문에, 중복 닉네임을 허용하지 않는다.
코드를 보자.
Firebase를 사용하기 위한 API Service
class UserInfoService {
static let shared = UserInfoService()
private let db = Firestore.firestore()
private init() {}
// MARK: 중복 닉네임 확인 로직
func checkNicknameDuplicate(nickname: String, completion: @escaping (Bool) -> Void) {
db.collection("infos").whereField("nickName", isEqualTo: nickname)
.getDocuments { snapshot, error in
if let error = error {
print("닉네임 중복 확인 실패: \(error)")
completion(false)
return
}
completion(!(snapshot?.isEmpty ?? true))
}
}
}
위의 API Service를 사용한 닉네임 중복확인 로직
@objc
private func saveBtnTapped() {
// MARK: 닉네임 중복 검사
let nickname = nickNameField.textField.text ?? ""
UserInfoService.shared.checkNicknameDuplicate(nickname: nickname) { [weak self] isDuplicate in
guard let self = self else { return }
if isDuplicate {
DispatchQueue.main.async {
self.basicAlert(title: "오류", message: "중복된 닉네임입니다.\n 다른 닉네임을 입력해 주세요.")
}
return
}
-- 이하 서버에 수정된 정보 업로드 하는 코드 생략 --
}
이런 식으로 기존 서버에 있는 닉네임과 대조하여 중복검사를 실시한다.
여기서 발견된 문제
무지성으로 회원정보 수정 뷰에서 저장하기 버튼을 누르면, 이게 기존에 사용중이던 닉네임이냐 아니냐를 따지지 않고,
단순히 해당 TextField에 있는 String값을 서버에 있는 nickname과 대조하여 중복확인을 실시했던 것이었다.
따라서 당연히 기존 TextField에는 서버에서 닉네임 값을 받아다가 현재 닉네임을 띄우고 있었고,
당연히 서버와 같은 값이기 때문에 닉네임 중복검사에서 걸리는 것이다.
전개
여러가지 방법을 생각했었다.
방법 1.
아래 닉네임 TextField를 Label로 바꿔서 현재 닉네임을 출력하고, 닉네임 수정이라는 버튼을 따로 만들어서
Label을 TextField로 변환하고 닉네임 변경을 진행.
-> UX 측면에서 보자면, 굳이 버튼을 한번 더 클릭해서 닉네임 변경을 진행? 다른 방법을 찾아보자.
방법 2.
TextField의 값 변경을 감지해서 변경 감지 시 닉네임 중복검사 진행.
UITextFieldDelegate 중 shouldChangeCharactersln 사용
addTarget 사용 등의 방법이 있었다.
방법 1과 2까지 떠올리고, 어떤 것이 좀 더 효율적일지 생각해보다가 UX 측면에서 팀원들은 나와 다른 생각을 가지고 있을지도 모른다는 생각이 들어서, 지금까지 떠올린 해결책을 공유하고 의견을 물었다.
그러다가 팀원이 툭 던진 한마디가 번뜩 했는데...
방법 3.
현재 닉네임(서버에 있는 닉네임)과 TextField에 있는 닉네임을 대조.
일치하면 닉네임을 변경하지 않은 것이니 중복검사 스킵.
일치하지 않는다면 닉네임이 변경된 것이니 중복검사 실행 후, 통과시 서버에 업데이트.
좀 더 간단하고 근본적인 생각을 못하고 있었다.
해결
최종적으로 생각해보면서 내린 결론은,
- originalNickname이라는 변수를 생성해서, 그 안에 기존 닉네임(서버에 있는 닉네임)을 넣는다.
- 저장하기 버튼을 클릭했을 때, nicknameTextField에 있는 text와 대조한다.
- 일치하면 중복검사 패스 -> 수정사항 서버에 업데이트,
불일치하면 중복검사 실행 -> 통과시 업데이트, 불통시 중복되었다고 Alert 출력
구현해보자.
originalNickName이라는 변수 생성
private var originalNickname: String? // 서버에 있는 닉네임
서버에서 데이터를 받아와서 textField들에 기존 데이터 출력.
데이터 fetch 성공 시, originalNickname에 서버에 있는 닉네임 저장.
// MARK: - Firebase Data Fetching (Read)
// 서버에서 데이터 받아와서 텍스트 필드에 기존 데이터 출력
private func fetchUserData() {
UserInfoService.shared.fetchUserInfo { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let userInfo):
DispatchQueue.main.async {
self.showPreviousInfo(with: userInfo)
self.originalNickname = userInfo.nickName // originalNickName에 저장.
}
case .failure(let error):
print("데이터 가져오기 실패: \(error.localizedDescription)")
}
}
}
저장하기 버튼을 클릭했을때,
- if문을 사용하여 현재 텍스트 필드에 있는 String값(닉네임), 서버에 있는 String값과 대조.
- 같다면(if) saveUserInfo라는 따로 구현해둔 서버에 업데이트 하는 함수 실행.
- 통과하지 못했다면(else), 중복된 닉네임 검사 실행.
중복 -> Alert 출력
중복 x -> saveUserInfo 함수 실행, 서버에 업데이트
// MARK: - Save Button Action
@objc
private func saveBtnTapped() {
let nickname = nickNameField.textField.text ?? "" // 현재 텍스트필드에 있는 닉네임
// MARK: 닉네임 중복 검증
// 닉네임이 변경되지 않은 경우 바로 저장
if nickname == originalNickname { // 서버에 있는 닉네임과 대조
saveUserInfo()
print("닉네임 변경 없음. 중복검사 생략")
} else {
// 닉네임이 변경된 경우 중복 검사 후 저장
UserInfoService.shared.checkNicknameDuplicate(nickname: nickname) { [weak self] isDuplicate in
guard let self = self else { return }
DispatchQueue.main.async {
if isDuplicate {
self.basicAlert(title: "오류", message: "중복된 닉네임입니다.\n 다른 닉네임을 입력해 주세요.")
} else {
// 중복되지 않은 경우 저장 진행
self.saveUserInfo()
}
}
}
}
}
결과
두가지 테스트를 해보자.
첫번째는 닉네임 이외에 다른 값들을 변경 후 중복검사 스킵이 목표대로 되는가?
두번째는 기존에 있는 닉네임에 대한 중복검사가 제대로 이루어 지는가?
테스트 1.
닉네임 변경 없이 다른 값들을 바꿨을때, 목표했던대로 닉네임은 변경되지 않았기 때문에, 중복검사가 스킵 되는가?
성공
테스트 2.
기존에 서버에 있는 닉네임으로 변경을 시도해서, 검증이 제대로 작동하는지 확인해보자.
서버에 기존에 있는 "솔플로우"라는 닉네임으로 변경 시도.
서버에 이미 있기때문에, 중복검사를 통과하지 못하고 Alert 출력.
성공
'개발일지' 카테고리의 다른 글
[Ting] TextField 공백, 특수문자 검사 로직 구현 (0) | 2025.02.12 |
---|---|
2025 (0) | 2025.02.12 |
2025.02.04 (0) | 2025.02.04 |
[Ting] UISearchBar, Custom Navigation Bar 구현 (0) | 2025.01.23 |
Project Ting 기획 (0) | 2025.01.21 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.