Menu
Coddy logo textTech

예외 처리 통합

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

challenge icon

챌린지

쉬움

적절한 예외 처리를 통합하여 Library Management System을 더욱 견고하게 만들어 봅시다! 실제 도서관 시스템은 오류 상황을 우아하게 처리해야 합니다. 존재하지 않는 책을 누군가 빌리려고 하면 어떻게 해야 할까요? 또는 사용자가 허용된 수보다 많은 책을 빌리려고 하면 어떻게 해야 할까요? 이러한 상황에 대해 의미 있는 피드백을 제공하는 custom 예외를 만들게 됩니다.

여섯 개의 파일에 걸쳐 기존 코드를 계속 확장합니다.

  • Book.java: isbn, title, author, isAvailable, borrowedBy, getDetails() 및 적절한 getter/setter를 포함한 기존 Book class의 모든 기능을 유지합니다.
  • User.java: id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() 및 toString()을 포함한 기존 User class를 유지합니다.
  • LibraryException.java: Exception을 extends하는 LibraryException이라는 base custom exception class를 Create합니다. 이 class는 모든 도서관 관련 exception의 parent class가 됩니다. message를 accepts하여 parent class에 전달하는 constructor를 포함합니다.
  • BookNotAvailableException.java: LibraryException을 extends하는 custom exception을 Create합니다. 이 exception은 이미 borrowed된 book을 누군가 borrow하려고 할 때 throw되어야 합니다. book의 ISBN을 accepts하고 Book not available: [isbn]과 같은 의미 있는 message를 생성하는 constructor를 포함합니다.
  • Library.java: 오류 message를 출력하는 대신 exception을 throw하도록 Library class를 업데이트합니다. borrowBook(String userId, String isbn) method를 다음과 같이 수정합니다.
    • user가 존재하지 않으면 User not found: [userId] message와 함께 LibraryException을 throw합니다.
    • book이 존재하지 않으면 Book not found: [isbn] message와 함께 LibraryException을 throw합니다.
    • book이 이미 borrowed 상태이면 BookNotAvailableException을 throw합니다.
    • 성공하면 user가 book을 borrow하도록 하고 [userName] borrowed [bookTitle] confirmation message를 return합니다.

    method signature를 throws LibraryException으로 변경하고 return type을 String으로 변경합니다.

    다른 모든 method(addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks)는 이전과 동일하게 작동하도록 유지합니다.

  • Main.java: exception handling을 시연합니다! comma로 구분된 command 문자열을 받게 됩니다. 각 command는 다음 형식 중 하나를 따릅니다.
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    각 command를 처리합니다. ADD_BOOK의 경우 Added: [title]을 출력합니다. REGISTER_USER의 경우 Registered: [name]을 출력합니다. BORROW command의 경우 try-catch block을 사용하여 exception을 처리하고, 성공하면 confirmation message를 출력하며, LibraryException이 발생하면 Error: [exception message]를 출력합니다.

    모든 command를 처리한 후 Operations completed를 출력합니다.

입력으로 comma로 구분된 command 문자열 하나를 받게 됩니다.

예를 들어 입력이 ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001이면 출력은 다음과 같습니다.

Added: Clean Code
Registered: Alice
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Error: User not found: U002
Operations completed

custom exception이 얼마나 명확하고 구체적인 오류 message를 제공하는지 확인해 보세요. 첫 번째 borrow는 성공하고, 두 번째는 book이 이미 borrowed 상태이므로 실패하며(BookNotAvailableException), 세 번째는 user U002가 존재하지 않으므로 실패합니다(LibraryException). 이 접근 방식을 사용하면 일반적인 오류 message를 사용하는 것보다 library system이 훨씬 더 유용한 정보를 제공하고 debug하기도 쉬워집니다!

직접 해보기

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 쉼표로 구분된 명령어 읽기
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Library 및 AdminService 생성
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // 각 명령어 처리
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                // TODO: try-catch 블록을 사용하여 library.borrowBook(userId, isbn) 호출
                // 성공 시 반환된 확인 메시지 출력
                // LibraryException 발생 시 "Error: " + e.getMessage() 출력
            }
        }
        
        // TODO: Print "Operations completed"
    }
}

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

직접 연습해 보세요: 온라인 Java 컴파일러