관리자 CLI Interface
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 103번째.
챌린지
쉬움커맨드 패턴(Command Pattern)을 사용하여 도서 관리 시스템을 위한 명령줄 인터페이스(CLI)를 구축해 봅시다! 도서 추가, 사용자 등록, 대출 작업 관리와 같은 관리자 명령을 깔끔하고 확장 가능한 아키텍처를 통해 처리하는 CLI를 만들게 됩니다.
코드는 다음 여섯 개의 파일로 구성됩니다:
book.go:ID,Title,Author,ISBN,Available에 대한 JSON 태그가 포함된Book구조체입니다.NewBook생성자를 포함하세요.user.go:ID,Name,Email,BorrowedBooks에 대한 JSON 태그가 포함된User구조체입니다.NewUser생성자를 포함하세요.library.go: 도서와 사용자를 위한 맵(map)과 이전 레슨에서 구현한AddBook,AddUser,Borrow,Return메서드가 포함된Library구조체입니다.commands.go: 여기서 커맨드 패턴이 실제로 구현됩니다!*Library와[]string인자를 받아 문자열 결과를 반환하는Execute메서드를 가진Command인터페이스를 정의하세요. 그런 다음 아래의 커맨드 구조체들을 구현하세요:AddBookCommand— 4개의 인자(id, title, author, isbn)를 예상합니다. 도서를 추가하고Book added: [title]를 반환합니다.AddUserCommand— 3개의 인자(id, name, email)를 예상합니다. 사용자를 추가하고User added: [name]를 반환합니다.BorrowCommand— 2개의 인자(userID, bookID)를 예상합니다. 성공 시Borrowed: [bookID]를, 실패 시Error: [message]를 반환합니다.ReturnCommand— 2개의 인자(userID, bookID)를 예상합니다. 성공 시Returned: [bookID]를, 실패 시Error: [message]를 반환합니다.ListBooksCommand— 인자를 받지 않습니다. 각 도서의 ID와 제목을[id]: [title]형식으로 각 줄에 반환하며, 도서가 없으면No books를 반환합니다 (도서는 ID순으로 정렬하여 나열합니다).
명령에 인자가 부족한 경우,
Error: insufficient arguments를 반환하세요.cli.go:Library포인터와 명령 이름에서Command구현체로의 맵을 가지는CLI구조체를 만듭니다. 다음을 구현하세요:NewCLI생성자: 라이브러리로 CLI를 초기화하고 모든 명령(addbook,adduser,borrow,return,listbooks)을 등록합니다.Run메서드: 입력 문자열을 받아strings.Fields를 사용하여 파싱하고, 명령을 찾아 실행합니다. 입력이 비어 있으면No command provided를 반환하고, 인식되지 않는 명령이면Unknown command: [name]를 반환합니다.
main.go: 라이브러리와 CLI를 생성한 후 입력으로부터 명령을 처리합니다. 명령의 개수를 읽은 다음, 각 명령 문자열을 별도의 줄에서 읽습니다. 각 명령에 대해Run을 호출하고 결과를 출력합니다.
다음과 같은 입력이 제공됩니다:
- 명령의 개수
- 각 명령은 한 줄에 하나의 완전한 문자열로 제공됨
예를 들어, 다음과 같이 입력되면:
6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001출력은 다음과 같아야 합니다:
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not available또한, 다음과 같이 입력되면:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd test출력은 다음과 같아야 합니다:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmd또한, 다음과 같이 입력되면:
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001출력은 다음과 같아야 합니다:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001CLI가 각 작업의 세부 사항을 알 필요가 없다는 점에 주목하세요. CLI는 단순히 명령을 찾아 실행을 위임할 뿐입니다. 덕분에 Command 인터페이스를 구현하는 새 구조체를 만들고 CLI에 등록하는 것만으로 새로운 명령을 아주 간단하게 추가할 수 있습니다!
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 명령어의 개수를 읽습니다
var n int
fmt.Scanln(&n)
// 전체 줄을 읽기 위해 스캐너를 생성합니다
scanner := bufio.NewScanner(os.Stdin)
// TODO: 새로운 라이브러리를 생성합니다
// TODO: 라이브러리를 사용하여 새로운 CLI를 생성합니다
// TODO: 각 명령어를 처리합니다
// n개의 각 명령어에 대해:
// - scanner.Scan() 및 scanner.Text()를 사용하여 명령줄을 읽습니다
// - CLI를 통해 명령어를 실행합니다
// - 결과를 출력합니다
_ = scanner // scanner를 사용할 때 이 줄을 제거하세요
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서