[ 이메일 유효성 체크 ] - 이메일 가입이 아무거나 다된다고? (1)

2024. 8. 7. 02:19Mobile/Swift

화요일 팀플 회의 때 팀원 분이 앱 출시를 했냐고 물으셨다. 회원가입 쪽은 아직 보수할 부분이 많은데, 

다른 팀원 분이 회원가입을 하시면서 회원가입 버튼이 안 눌린다고 했다. 그래서 firebase 콘솔을 살펴보니 같은 메일 주소가 여러번 저장되었고, uid 만 다른 동일 메일이 저장되어 있었다. 설상가상 나는 이메일의 유효성 검사하는 로직을 처리하지 않았다. 

 

에러핸들링이 중요하다고 해주셨기에 한번 살펴봐야겠다는 생각이 들었고 빠른 시일내에 업데이트 할 때 적용해야겠다는 생각도 들었다. 

 

대한민국에서 사용가능한 앱임으로 한국사람들이 많이 쓰는 이메일 도메인을 생각해보자.

naver, kakao, gmail, icloud  - 4가지 정도로만 가입이 가능하게 바꾸고 싶다!  

(이건 2탄(?)에서 더 구현해봐야겠다.) 

 

네이버: 아이디 영문 소문자, 숫자, 특수기호 _, - 

네이버는 어떻게 제한할까 궁금해서, 기존 아이디가 있지만 가입해보기로 했다. 

출처 - NAVER 의 회원가입 ID 양식 조건

 

구글 계정 조건: 문자, 숫자, . 마침표 사용가능 

그럼 이메일 주소의 형태부터 접근해야겠다. 

static func isValidEmail(id: String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{3,}"
    let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: id)
}

 

 

[A-Z0-9a-z._%+-]+

[]: 문자 집합

A-Z, a-z : 대소문자

0-9: 숫자 0~9

특수문자 ._%+-를 허용 

 

+: 앞에 문자 집합 1회 이상 반복 

이메일은 @ (at) 을 기준으로 아이디@이메일도메인.com 으로 쓴다. 

요즘은 다 .com 으로 쓰니까 .com 아님 .net 일 것 같다.

import Foundation

func isValidEmail(_ email: String) -> Bool {
    let emailRegEx = "^[A-Z0-9a-z._%+-]+@(naver\\.com|kakao\\.com|icloud\\.com|gmail\\.com)$"
    let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailPred.evaluate(with: email)
}

// 예시 테스트
let testEmails = [
    "example@naver.com",
    "example@kakao.com",
    "example@icloud.com",
    "example@gmail.com",
    "example@yahoo.com"
]

for email in testEmails {
    print("\(email): \(isValidEmail(email))")
}

이런식으로 바꿀 수 있을 거 같다. 

 

 

 

\\. 

- 도메인의 마지막 부분 점(.) 을 나타낸다.

- \\ 는 점(.)을 특수문자가 아닌 일반문자로 취급하기 위한 이스케이프 문자다. 

 

난 .com 만 되게 하고 싶어!! 하면 

 

import Foundation

func isValidEmail(_ email: String) -> Bool {
    let emailRegEx = "^[A-Z0-9a-z._%+-]+@(naver\\.com|kakao\\.com|icloud\\.com|gmail\\.com)$"
    let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailPred.evaluate(with: email)
}

뒤에 저렇게 붙여야한다. 

 

 

다음엔 이메일 인증 방식에 대해 살펴봐야겠다.