관리자 CLI Interface
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 103번째.
챌린지
쉬움Command Pattern을 사용하여 Library Management System을 위한 명령줄 인터페이스를 만들어 봅시다! 책 추가, 사용자 등록, 대출 작업 관리와 같은 관리자 명령을 처리하는 CLI를 깔끔하고 확장 가능한 아키텍처로 구현하게 됩니다: all.
코드를 여섯 개의 파일로 구성합니다:
book.go:ID,Title,Author,ISBN,Available에 대한 JSON 태그가 있는Book구조체입니다.NewBookconstructor를 포함하세요.user.go:ID,Name,Email,BorrowedBooks에 대한 JSON 태그가 있는User구조체입니다.NewUserconstructor를 포함하세요.library.go: books와 users를 위한 맵이 있는Library구조체와 이전 레슨에서 만든AddBook,AddUser,Borrow,Return메서드를 포함합니다.commands.go: 이곳에서 Command Pattern이 실제로 동작합니다!*Library와[]stringargs를 받아 string 결과를 반환하는Execute메서드를 가진Command인터페이스를 정의하세요. 그런 다음 다음 command 구조체를 구현하세요:AddBookCommand: 4개의 args를 받습니다: id, title, author, isbn. 책을 추가하고Book added: [title]을 반환합니다.AddUserCommand: 3개의 args를 받습니다: id, name, email. 사용자를 추가하고User added: [name]을 반환합니다.BorrowCommand: 2개의 args를 받습니다: userID, bookID. 성공하면Borrowed: [bookID]을 반환하고, 실패하면Error: [message]를 반환합니다.ReturnCommand: 2개의 args를 받습니다: userID, bookID. 성공하면Returned: [bookID]을 반환하고, 실패하면Error: [message]를 반환합니다.ListBooksCommand: args를 받지 않습니다. 각 book의 ID와 title을[id]: [title]형식으로 별도의 줄에 반환하며, 비어 있으면No books를 반환합니다 (books는 ID 기준으로 정렬합니다).
command가 충분하지 않은 arguments를 받으면
Error: insufficient arguments를 반환하세요.cli.go:Library에 대한 포인터와 command 이름을Command구현에 매핑하는 맵을 보유하는CLI구조체를 만드세요. 다음을 구현하세요:- library로 CLI를 초기화하고 모든 command를 등록하는
NewCLIconstructor:addbook,adduser,borrow,return,listbooks - input string을 받아
strings.Fields를 사용하여 파싱하고, command를 조회한 다음 실행하는Run메서드. 입력이 비어 있으면No command provided를 반환하고, 인식할 수 없는 command에는Unknown command: [name]을 반환합니다.
- library로 CLI를 초기화하고 모든 command를 등록하는
main.go: library와 CLI를 만든 다음 input에서 command를 처리합니다. command의 수를 읽고, 각 command string을 별도의 줄에서 읽습니다. 각 command에 대해Run을 호출하고 결과를 출력합니다.
다음 input이 제공됩니다:
- command의 수
- 각 command는 한 줄에 완전한 string으로 제공됩니다.
예를 들어 다음이 주어지면:
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를 조회하고 실행을 위임합니다. 따라서 새로운 command를 추가하는 일은 Command 인터페이스를 구현하는 새로운 구조체를 만들고 CLI에 등록하는 것만큼 간단합니다!
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 명령의 개수를 읽습니다
var n int
fmt.Scanln(&n)
// 전체 줄을 읽기 위한 스캐너를 생성합니다
scanner := bufio.NewScanner(os.Stdin)
// TODO: 새 Library 생성
// TODO: library로 새 CLI 생성
// TODO: 각 명령 처리
// n개의 각 명령에 대해:
// - scanner.Scan()과 scanner.Text()를 사용하여 명령 줄 읽기
// - CLI를 통해 명령 실행
// - 결과 출력
_ = scanner // scanner를 사용할 때 이 줄을 제거하세요
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러