요약 - 파일 파서
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 58번째.
챌린지
쉬움이 장에서 배운 모든 에러 처리 기술을 통합하는 설정 파일 파서(parser)를 만들어 보겠습니다. 여러분의 파서는 커스텀 에러 타입, 센티널 에러(sentinel errors), 에러 래핑(error wrapping), 그리고 defer를 사용한 적절한 정리를 통해 여러 실패 시나리오를 처리하게 됩니다.
코드는 다음 세 개의 파일로 구성됩니다:
errors.go: 파서를 위한 에러 인프라를 정의합니다.두 개의 센티널 에러를 생성하세요:
ErrEmptyContent: 메시지"file content is empty"ErrInvalidFormat: 메시지"invalid configuration format"
Line(int)과Message(string) 필드를 가진 커스텀 에러 타입ParseError를 생성하세요. 이 타입의Error()메서드는parse error at line [Line]: [Message]를 반환해야 합니다.parser.go: 계층화된 에러 처리를 갖춘 설정 파서를 구축합니다.파싱이 성공적으로 완료되었는지 추적하기 위한
parsed불리언 필드를 가진ConfigParser구조체를 생성하세요.다음 메서드들을 구현하세요:
NewConfigParser() *ConfigParser-parsed가false로 설정된 새 파서를 생성합니다.ParseLine(lineNum int, line string) error- 단일 라인을 검증합니다. 라인에=문자가 포함되어 있지 않으면, 라인 번호와 메시지"missing key-value separator"를 포함한*ParseError를 반환합니다. 그렇지 않으면nil을 반환합니다.Parse(content string) error- 다음을 수행하는 메인 파싱 메서드입니다:- 내용이 비어 있으면
ErrEmptyContent를 반환합니다. - 내용에 줄바꿈 문자가 하나 이상 포함되어 있지 않으면
ErrInvalidFormat을 반환합니다. - 내용을 줄바꿈으로 나누고 각 라인에 대해
ParseLine을 호출합니다 (라인 번호는 1부터 시작합니다). ParseLine이 에러를 반환하면,"parsing configuration: %w"로 에러를 래핑하여 반환합니다.- 성공 시
parsed를true로 설정하고nil을 반환합니다.
- 내용이 비어 있으면
Status() string-parsed가 true이면"ready"를, 그렇지 않으면"not parsed"를 반환합니다.
main.go: 설정 내용을 읽고 포괄적인 에러 검사를 시연합니다.설정 내용을 구성하는 두 줄의 입력을 읽습니다 (줄바꿈 문자로 연결하세요). 성공 여부와 관계없이 항상 마지막에 파서의 상태를 출력하도록
defer를 사용하세요.파싱을 시도한 후,
errors.Is()와errors.As()를 모두 사용하여 에러를 검사하고 발생한 문제에 따라 구체적인 피드백을 제공하세요.
다음 입력이 제공됩니다:
- Line 1: 설정 내용의 첫 번째 줄
- Line 2: 설정 내용의 두 번째 줄
특정 메시지로 에러를 처리하세요:
errors.Is()가ErrEmptyContent를 찾으면:Error: No configuration provided를 출력합니다.errors.Is()가ErrInvalidFormat을 찾으면:Error: Configuration must have multiple lines를 출력합니다.errors.As()가*ParseError를 찾으면: 전체 래핑된 에러를 출력한 후, 새 줄에Fix line [Line]: [Message]를 출력합니다.- 파싱에 성공하면:
Configuration parsed successfully를 출력합니다.
결과 처리(성공 또는 에러) 후, 지연된(deferred) 상태가 새 줄에 출력되어야 합니다: Parser status: [status]
예를 들어, host=localhost와 port=8080이 주어지면 출력은 다음과 같아야 합니다:
Configuration parsed successfully
Parser status: ready그리고 host=localhost와 invalid line이 주어지면 출력은 다음과 같아야 합니다:
parsing configuration: parse error at line 2: missing key-value separator
Fix line 2: missing key-value separator
Parser status: not parsed직접 해보기
package main
import (
"bufio"
"errors"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 설정의 첫 번째 줄 읽기
line1, _ := reader.ReadString('\n')
line1 = line1[:len(line1)-1] // 끝에 있는 줄바꿈 문자 제거
// 설정의 두 번째 줄 읽기
line2, _ := reader.ReadString('\n')
if len(line2) > 0 && line2[len(line2)-1] == '\n' {
line2 = line2[:len(line2)-1]
}
// 두 줄을 줄바꿈 문자로 연결하여 설정 내용 생성
content := line1 + "\n" + line2
// 새로운 파서 생성
parser := NewConfigParser()
// TODO: defer를 사용하여 항상 마지막에 파서의 상태를 출력
// 형식: "Parser status: [status]"
// TODO: 내용 파싱 시도
// TODO: errors.Is()와 errors.As()를 사용하여 에러 처리
// - 만약 errors.Is()가 ErrEmptyContent를 찾으면: "Error: No configuration provided" 출력
// - 만약 errors.Is()가 ErrInvalidFormat을 찾으면: "Error: Configuration must have multiple lines" 출력
// - 만약 errors.As()가 *ParseError를 찾으면: 래핑된 전체 에러를 출력하고,
// 그 다음 줄에 "Fix line [Line]: [Message]" 출력
// - 파싱에 성공하면: "Configuration parsed successfully" 출력
_ = errors.Is // 힌트: 센티넬 에러(sentinel errors)에는 errors.Is를 사용하세요
_ = errors.As // 힌트: 커스텀 에러 타입에는 errors.As를 사용하세요
_ = fmt.Println
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서