Menu
Coddy logo textTech

관리자 CLI Interface

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

challenge icon

챌린지

쉬움

Command Pattern을 사용하여 Library Management System을 위한 명령줄 인터페이스를 만들어 봅시다! 책 추가, 사용자 등록, 대출 작업 관리와 같은 관리자 명령을 처리하는 CLI를 깔끔하고 확장 가능한 아키텍처로 구현하게 됩니다: all.

코드를 여섯 개의 파일로 구성합니다:

  • book.go: ID, Title, Author, ISBN, Available에 대한 JSON 태그가 있는 Book 구조체입니다. NewBook constructor를 포함하세요.
  • user.go: ID, Name, Email, BorrowedBooks에 대한 JSON 태그가 있는 User 구조체입니다. NewUser constructor를 포함하세요.
  • library.go: books와 users를 위한 맵이 있는 Library 구조체와 이전 레슨에서 만든 AddBook, AddUser, Borrow, Return 메서드를 포함합니다.
  • commands.go: 이곳에서 Command Pattern이 실제로 동작합니다! *Library[]string args를 받아 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를 등록하는 NewCLI constructor: addbook, adduser, borrow, return, listbooks
    • input string을 받아 strings.Fields를 사용하여 파싱하고, command를 조회한 다음 실행하는 Run 메서드. 입력이 비어 있으면 No command provided를 반환하고, 인식할 수 없는 command에는 Unknown command: [name]을 반환합니다.
  • 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: B001

CLI가 각 작업의 세부 사항을 알 필요가 없다는 점에 주목하세요. 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를 사용할 때 이 줄을 제거하세요
}

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

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