Menu
Coddy logo textTech

요약 - 검증된 사용자

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 63번째.

challenge icon

챌린지

쉬움

입력 데이터를 검증하고 사용자 정의 예외를 사용하여 무엇이 잘못되었는지 정확하게 전달하는 완전한 사용자 등록 시스템을 구축해 봅시다! 사용자 정의 checked 및 unchecked 예외, 예외 계층 구조, 그리고 auto-closeable 검증기를 사용한 try-with-resources 등 이번 장에서 배운 모든 내용을 결합하게 됩니다.

코드는 다음 다섯 개의 파일로 구성됩니다:

  • ValidationException.java: 모든 검증 오류의 기반이 되는 checked 예외를 생성합니다. 이 예외는 Exception을 상속받아야 하며 메시지를 인자로 받는 생성자를 포함해야 합니다.
  • InvalidUsernameException.java: 사용자 이름 검증 실패를 위한 checked 예외를 생성합니다. 이 클래스는 ValidationException 클래스를 상속받아 작은 예외 계층 구조를 형성해야 합니다. 메시지를 인자로 받아 부모 클래스에 전달하는 생성자를 포함하세요.
  • InvalidAgeException.java: 연령 관련 오류(프로그래밍 오류를 나타내는 음수 연령 등)를 위한 unchecked 예외를 생성합니다. 이 클래스는 메시지를 인자로 받는 생성자와 함께 RuntimeException을 상속받아야 합니다.
  • UserValidator.java: 적절하게 닫혀야 하는 검증 세션을 시뮬레이션하기 위해 AutoCloseable을 구현하는 클래스를 생성합니다. 검증기는 다음을 수행해야 합니다:

    생성자에서 Validator session started를 출력합니다.

    사용자 이름이 null이거나, 비어 있거나, 3자 미만인 경우 InvalidUsernameException을 던지는 validateUsername(String username) 메서드를 작성합니다 (메시지는 "Username must be at least 3 characters"). 그렇지 않으면 Username '[username]' is valid를 출력합니다.

    연령이 음수인 경우 InvalidAgeException을 던지는 validateAge(int age) 메서드를 작성합니다 (메시지는 "Age cannot be negative: [age]"). 연령이 13세 미만인 경우 ValidationException을 던집니다 (메시지는 "Must be at least 13 years old"). 그렇지 않으면 Age [age] is valid를 출력합니다.

    Validator session closed를 출력하도록 close()를 구현합니다.

  • Main.java: 검증 시스템을 하나로 합칩니다! 사용자 이름(String)과 연령(integer) 두 개의 입력을 받게 됩니다.

    try-with-resources를 사용하여 UserValidator를 생성합니다. try 블록 내부에서 먼저 사용자 이름을 검증한 다음 연령을 검증합니다. 둘 다 통과하면 User registration successful!을 출력합니다.

    InvalidUsernameException을 catch하여 Username error: [message]를 출력합니다. InvalidAgeException을 catch하여 Age error: [message]를 출력합니다. 부모 클래스인 ValidationException을 catch하여 Validation error: [message]를 출력합니다.

    검증의 성공 여부와 관계없이 검증기는 자동으로 닫혀야 합니다!

사용자 이름(String)과 연령(integer) 순서대로 두 개의 입력을 받게 됩니다.

이 챌린지는 이번 장 전체를 아우릅니다. ValidationException을 부모로 하는 예외 계층 구조를 구축하고, checked 및 unchecked 예외를 적절하게 사용하며, try-with-resources를 통해 검증기 리소스가 항상 정리되도록 보장합니다. 자식 클래스인 InvalidUsernameException 다음에 부모 클래스인 ValidationException을 catch함으로써, 다른 검증 오류를 처리하면서도 특정 사례를 먼저 처리하는 방법을 확인해 보세요!

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String username = scanner.nextLine();
        int age = scanner.nextInt();
        
        // TODO: try-with-resources를 사용하여 UserValidator 생성하기
        // try 블록 내부에서:
        //   1. username 유효성 검사
        //   2. age 유효성 검사
        //   3. 둘 다 통과하면, "User registration successful!" 출력
        
        // TODO: InvalidUsernameException을 catch하고 "Username error: [message]" 출력
        
        // TODO: InvalidAgeException을 catch하고 "Age error: [message]" 출력
        
        // TODO: ValidationException (부모)을 catch하고 "Validation error: [message]" 출력
        
        // Note: validator는 성공 여부와 관계없이 자동으로 닫혀야 합니다!
    }
}

객체 지향 프로그래밍의 모든 레슨