Java 에서 문자열이 이메일 형식과 일치하는지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 정규 표현식 (regular expression) 을 사용하여 주어진 문자열이 표준 이메일 형식과 일치하는지 확인하는 방법을 배우게 됩니다. 적절한 정규 표현식 패턴을 정의하고, 유효성 검사를 위해 Pattern.matches() 메서드를 활용하며, 다양한 유효 및 무효 이메일 주소로 구현을 테스트하여 올바르게 작동하는지 확인합니다. 이 실습을 통해 문자열 패턴 매칭을 위한 Java 의 정규 표현식 기능을 실제로 경험할 수 있습니다.

이메일 정규 표현식 패턴 정의

이 단계에서는 이메일 주소의 유효성을 검사하는 데 사용할 정규 표현식 패턴을 정의하는 것으로 시작합니다. 정규 표현식 (regular expression) 은 종종 "regex" 또는 "regexp"로 축약되며, 검색 패턴을 정의하는 문자 시퀀스입니다. 문자열의 패턴 매칭 및 조작에 매우 강력합니다.

이메일 유효성 검사의 경우, 정규 표현식 패턴은 주어진 문자열이 이메일 주소의 표준 형식 (예: username@domain.com) 을 따르는지 확인하는 데 도움이 됩니다. 가능한 모든 유효한 이메일 주소에 대한 완벽한 정규 표현식은 매우 복잡하지만, 가장 일반적이고 유효한 형식을 다루는 패턴을 정의할 수 있습니다.

코드를 담을 새로운 Java 파일을 만들 것입니다.

  1. WebIDE 가 아직 열려 있지 않은 경우 엽니다. 기본적으로 ~/project 디렉토리에 있어야 합니다.

  2. 왼쪽의 파일 탐색기에서 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 "New File"을 선택합니다. 파일 이름을 EmailValidator.java로 지정합니다.

  3. 파일 탐색기에서 EmailValidator.java 파일을 클릭하여 편집기에서 엽니다.

  4. 이제 Java 클래스의 기본 구조를 추가하고 정규 표현식 패턴을 정의해 보겠습니다. 다음 코드를 복사하여 EmailValidator.java 파일에 붙여넣습니다.

    import java.util.regex.Pattern;
    
    public class EmailValidator {
    
        // Email regex pattern
        private static final String EMAIL_REGEX =
                "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    
        public static void main(String[] args) {
            // We will add code here in the next steps
        }
    }

    새로운 부분을 간략하게 살펴보겠습니다.

    • import java.util.regex.Pattern;: 이 줄은 정규 표현식에 대한 Java 의 내장 지원의 일부인 Pattern 클래스를 가져옵니다.
    • private static final String EMAIL_REGEX = "...";: 이 줄은 EMAIL_REGEX라는 상수 변수를 선언하고 정규 표현식 패턴을 할당합니다.
      • ^: 문자열의 시작 부분을 일치시킵니다.
      • [a-zA-Z0-9_+&*-]+: 하나 이상의 영숫자 문자 또는 _, +, &, *, -를 일치시킵니다. 이는 사용자 이름 부분에 해당합니다.
      • (?:\\.[a-zA-Z0-9_+&*-]+)*: 점 다음에 더 많은 사용자 이름 문자가 오는 0 번 이상 발생을 일치시킵니다. 이는 사용자 이름에 점을 허용합니다 (예: first.last).
      • @: 리터럴 "@" 기호를 일치시킵니다.
      • (?:[a-zA-Z0-9-]+\\.)+: 영숫자 문자 또는 - 다음에 점이 오는 1 번 이상 발생을 일치시킵니다. 이는 도메인 이름에 해당합니다 (예: domain.).
      • [a-zA-Z]{2,7}: 최상위 도메인 (예: com, org, 국가 코드) 에 대해 2~7 개의 영문자를 일치시킵니다.
      • $: 문자열의 끝 부분을 일치시킵니다.

    정규 표현식 패턴이 복잡해 보여도 걱정하지 마세요. 복잡한 정규 표현식 패턴의 모든 세부 사항을 이해하는 데는 시간과 연습이 필요합니다. 지금은 이 문자열이 유효한 이메일 주소의 모양에 대한 규칙을 정의한다는 사실에 집중하세요.

  5. EmailValidator.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

이제 Java 파일을 성공적으로 만들고 이메일 유효성 검사를 위한 정규 표현식 패턴을 정의했습니다. 다음 단계에서는 이 패턴을 사용하여 실제 이메일 주소의 유효성을 검사합니다.

Pattern.matches() 를 사용하여 이메일 유효성 검사

이 단계에서는 Java 에서 Pattern.matches() 메서드를 사용하여 주어진 문자열이 정의된 이메일 정규 표현식 패턴과 일치하는지 확인하는 방법을 배우게 됩니다. Pattern.matches(regex, input) 메서드는 전체 입력 문자열을 정규 표현식과 비교하여 간단한 일치를 수행하는 편리한 방법입니다. 전체 입력 문자열이 정규 표현식과 일치하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

이 유효성 검사를 수행하기 위해 EmailValidator 클래스에 새로운 메서드를 추가합니다.

  1. WebIDE 편집기에서 EmailValidator.java 파일이 아직 열려 있지 않은 경우 엽니다.

  2. EmailValidator 클래스 내부에, main 메서드 외부에 다음 메서드를 추가합니다.

    public static boolean isValidEmail(String email) {
        return Pattern.matches(EMAIL_REGEX, email);
    }

    이 새로운 메서드를 살펴보겠습니다.

    • public static boolean isValidEmail(String email): isValidEmail이라는 새로운 메서드를 선언합니다.
      • public: 이 메서드가 클래스 외부에서 접근할 수 있음을 의미합니다.
      • static: 이 메서드가 클래스의 특정 객체가 아닌 EmailValidator 클래스 자체에 속함을 의미합니다. 클래스 이름을 사용하여 직접 호출할 수 있습니다 (예: EmailValidator.isValidEmail(...)).
      • boolean: 이 메서드가 부울 값 (true 또는 false) 을 반환함을 나타냅니다.
      • (String email): 메서드가 email이라는 String 형식의 인수를 하나 받도록 지정합니다. 이는 유효성을 검사하려는 이메일 주소입니다.
    • return Pattern.matches(EMAIL_REGEX, email);: 이것이 메서드의 핵심입니다. Pattern.matches() 메서드를 호출하여 EMAIL_REGEX와 입력 email 문자열을 전달합니다. 이 일치의 결과 (true 또는 false) 는 isValidEmail 메서드에서 반환됩니다.
  3. 이제 main 메서드를 수정하여 새로운 isValidEmail 메서드를 사용해 보겠습니다. 기존 main 메서드를 다음 코드로 바꿉니다.

    public static void main(String[] args) {
        String testEmail = "test.email@example.com";
        boolean isValid = isValidEmail(testEmail);
    
        if (isValid) {
            System.out.println(testEmail + " is a valid email address.");
        } else {
            System.out.println(testEmail + " is not a valid email address.");
        }
    }

    이 업데이트된 main 메서드에서:

    • String testEmail = "test.email@example.com";: 테스트할 샘플 이메일 주소를 정의합니다.
    • boolean isValid = isValidEmail(testEmail);: testEmailisValidEmail 메서드를 호출하고 반환된 부울 값을 isValid 변수에 저장합니다.
    • ifelse 블록은 isValid의 값을 확인하고 이메일이 유효한지 여부를 나타내는 메시지를 출력합니다.
  4. EmailValidator.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  5. 이제 업데이트된 프로그램을 컴파일해 보겠습니다. WebIDE 하단의 터미널을 열고 ~/project 디렉토리에 있는지 확인합니다. 다음 명령을 실행합니다.

    javac EmailValidator.java

    오류가 없으면 컴파일이 성공적으로 완료된 것입니다.

  6. 마지막으로, java 명령을 사용하여 컴파일된 프로그램을 실행합니다.

    java EmailValidator

    정규 표현식 패턴을 기반으로 테스트 이메일이 유효한지 여부를 나타내는 출력을 볼 수 있습니다.

    test.email@example.com is a valid email address.

이제 정의된 정규 표현식 패턴을 사용하여 Pattern.matches() 메서드를 사용하여 이메일 주소의 유효성을 성공적으로 검사했습니다. 다음 단계에서는 다양한 유효 및 무효 이메일 주소로 테스트합니다.

유효 및 무효 이메일로 테스트

이 마지막 단계에서는 정규 표현식 패턴과 Pattern.matches() 메서드가 어떻게 처리하는지 확인하기 위해 유효 및 무효 이메일 주소의 몇 가지 예제를 사용하여 EmailValidator를 테스트합니다. 이를 통해 유효성 검사 로직의 동작을 이해하는 데 도움이 됩니다.

  1. WebIDE 편집기에서 EmailValidator.java 파일을 엽니다.

  2. 여러 이메일 주소를 테스트하도록 main 메서드를 수정합니다. 현재 main 메서드를 다음 코드로 바꿉니다.

    public static void main(String[] args) {
        String[] testEmails = {
            "test.email@example.com",       // Valid
            "another_test+alias@sub.domain.co.uk", // Valid
            "invalid-email",                // Invalid (missing @)
            "invalid@domain",               // Invalid (missing top-level domain)
            "invalid@domain.",              // Invalid (missing top-level domain)
            "invalid@domain.c",             // Invalid (top-level domain too short)
            "invalid@domain.abcdefgh",      // Invalid (top-level domain too long)
            "@domain.com",                  // Invalid (missing username)
            "test@.com"                     // Invalid (missing domain name)
        };
    
        for (String email : testEmails) {
            boolean isValid = isValidEmail(email);
    
            if (isValid) {
                System.out.println(email + " is a valid email address.");
            } else {
                System.out.println(email + " is not a valid email address.");
            }
        }
    }

    이 업데이트된 main 메서드에서:

    • 유효한 이메일 주소와 의도적으로 유효하지 않은 이메일 주소를 모두 포함하는 testEmails라는 문자열 배열을 만듭니다.
    • for 루프를 사용하여 testEmails 배열의 각 이메일 주소를 반복합니다.
    • 루프 내에서 각 email에 대해 isValidEmail 메서드를 호출하고 이전 단계에서 했던 것처럼 결과를 출력합니다.
  3. EmailValidator.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 수정된 프로그램을 컴파일합니다.

    javac EmailValidator.java

    컴파일 오류가 없는지 확인합니다.

  5. 컴파일된 프로그램을 실행합니다.

    java EmailValidator

    출력을 관찰합니다. testEmails 배열의 각 이메일 주소에 대해 정규 표현식 패턴을 기반으로 유효성 검사기가 유효하다고 간주하는지 여부를 나타내는 줄이 표시되어야 합니다.

    test.email@example.com is a valid email address.
    another_test+alias@sub.domain.co.uk is a valid email address.
    invalid-email is not a valid email address.
    invalid@domain is not a valid email address.
    invalid@domain. is not a valid email address.
    invalid@domain.c is not a valid email address.
    invalid@domain.abcdefgh is not a valid email address.
    @domain.com is not a valid email address.
    test@.com is not a valid email address.

다양한 입력을 테스트하여 정규 표현식 패턴과 Pattern.matches() 메서드가 함께 작동하여 이메일 주소의 유효성을 검사하는 방식을 확인할 수 있습니다. 이 정규 표현식이 많은 일반적인 경우를 다루지만, 엄격한 표준에 따라 가능한 모든 이메일 형식을 검사하는 것은 훨씬 더 복잡할 수 있다는 점을 기억하십시오.

이제 Java 의 정규 표현식 기능을 사용하여 기본 이메일 유효성 검사 메커니즘을 성공적으로 구현하고 테스트했습니다.

요약

이 Lab 에서는 Java 환경을 설정하고 새로운 파일 EmailValidator.java를 생성하는 것으로 시작했습니다. 그런 다음 이메일 주소의 유효성을 검사하도록 특별히 설계된 정규 표현식 패턴 (EMAIL_REGEX) 을 정의했습니다. 상수 문자열로 저장된 이 패턴은 Java 의 java.util.regex.Pattern 클래스를 활용하여 강력한 문자열 일치 기능을 활성화합니다. 이 초기 단계는 후속 단계에서 이메일 유효성 검사 로직을 구현하기 위한 기반을 마련합니다.