Skip to main content

Golang, ๊ทธ๋Œ€๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€ - 1. ๋“ค์–ด๊ฐ€๋ฉฐ

2024๋…„ 3์›” 27์ผAbout 2 minGoArticle(s)blogd2.naver.comgogolang

Golang, ๊ทธ๋Œ€๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€ - 1. ๋“ค์–ด๊ฐ€๋ฉฐ ๊ด€๋ จ

Go > Article(s)

Article(s)

Golang, ๊ทธ๋Œ€๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€ - 1. ๋“ค์–ด๊ฐ€๋ฉฐ | NAVER D2
Golang, ๊ทธ๋Œ€๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€ - 1. ๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”, ๋งŒ 2๋…„์ฐจ ๊ฐœ๋ฐœ์ž๋กœ ํด๋กœ๋ฐ”๋…ธํŠธ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ๊น€์ค€ํ•˜์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์˜ ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š” ํด๋กœ๋ฐ”๋…ธํŠธ V2๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉฐ ํŒ€ ๋‚ด๋ถ€ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ๋ˆ„๊ตฌ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์–ด๋Š ์ •๋„ ์žˆ๋‹ค ๋ณด๋‹ˆ Golang์„ ํ•œ ๋ฒˆ์ด๋ผ๋„ ์ ‘ํ•ด๋ณด์‹  ๋ถ„์ด๋ฉด ์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฏธ์•ผ์žํ‚ค ํ•˜์•ผ์˜ค ๊ฐ๋…์˜ ์˜ํ™” โ€œ๊ทธ๋Œ€๋“ค์€ ์–ด๋–ป๊ฒŒ ์‚ด ๊ฒƒ์ธ๊ฐ€โ€๋ฅผ ์•„์‹œ๋‚˜์š”?

ํ˜ธ๋ถˆํ˜ธ๊ฐ€ ๊ฐˆ๋ฆฌ๋Š” ์˜ํ™”์ง€๋งŒ ์ €๋Š” ์ฆ๊ฒ๊ฒŒ ๊ด€๋žŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋– ํ•œ ์ •๋‹ต์„ ์ง์ ‘ ๊ด€๊ฐ์—๊ฒŒ ์ฃผ๋ ค๊ณ  ํ•˜์ง€ ์•Š๊ณ  ๋ณธ์ธ์˜ ์‚ถ์„ ํ’€์–ด๋‚ธ ํšŒ๊ณ ๋ก ๊ฐ™์€ ์˜ํ™”์˜€์Šต๋‹ˆ๋‹ค. โ€œ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ์‚ด์•˜๊ณ , ์ด๋Ÿฐ ๊ฒƒ์„ ํ›„ํšŒํ•˜๊ณ  ๊นจ๋‹ฌ์•˜๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ๊ทธ๋Œ€๋“ค์€ ์–ด๋–ป๊ฒŒ ์‚ด ๊ฒƒ์ธ๊ฐ€์š”?โ€ ์ด๋ ‡๊ฒŒ ์งˆ๋ฌธ์„ ๋˜์ง€๋Š” ๋“ฏํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ์˜ํ™” ์ œ๋ชฉ์„ ๋ณ€ํ˜•ํ•ด์„œ ์ด ๊ธ€์˜ ์ œ๋ชฉ์„ ์ง€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ˜„์žฌ ํŒ€์—์„œ ์ฒ˜์Œ์œผ๋กœ Golang์„ ์ ‘ํ•˜๊ณ  Golang์œผ๋กœ API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ๊ณ ๋ฏผ๊ณผ ๊ฒฐ๊ณผ๋ฌผ์„ ์—ฌ๋ ค๋ถ„๊ป˜ ์†Œ๊ฐœํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์˜ํ™” ์ œ๋ชฉ์„ ๋ณ€ํ˜•ํ–ˆ๋“ฏ์ด ์ด ๊ธ€์˜ ๋‚ด์šฉ์€ ์ €์˜ ๊ฐœ๋ฐœ ์ผ๋Œ€๊ธฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด โ€œ์ด ์‚ฌ๋žŒ์€ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ–ˆ๊ณ  ์ด๋ ‡๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๊ตฌ๋‚˜โ€ ํ•˜๋ฉฐ ์ฝ์–ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.


์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

๊ธ€์„ ์‹œ์ž‘ํ•˜๊ธฐ ์•ž์„œ, ์ œ๊ฐ€ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์ด ๋” ์ž˜ ์ดํ•ด๋˜๋„๋ก Golang์˜ ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•๊ณผ ์ปจ๋ฒค์…˜์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Don't panic

Golang์„ ์ฒ˜์Œ ์ ‘ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋ˆˆ์— ๋„๋Š” ๋ถ€๋ถ„์€ error์— ๊ด€ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Java ๊ฐ™์€ ์–ธ์–ด๋Š” ์˜ˆ์™ธ(exception)๋ฅผ try/catch๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ Golang์—๋Š” try/catch๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. try/catch์™€ ๋น„์Šทํ•œ panic/recover๊ฐ€ ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, Golang์—๋Š” Don't panic์ด๋ผ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ปจ๋ฒค์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. error๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” panic์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  error ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func openFile(fn string) error {  
    f, err := os.Open(fn)
    if err != nil {
        return err
        // panic(err) // don't panic!
    }

    defer f.Close()
    return nil
}

func main() {  
    // ์ž˜๋ชป๋œ ํŒŒ์ผ๋ช…์„ ๋„ฃ์Œ
    if err := openFile("Invalid.txt"); err != nil {
        fmt.Println(err)
    }
}

panic์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ๋งˆ๋•…ํ•œ ์ƒํ™ฉ(stackoverflow, OOM ๋“ฑ)์—๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ recover๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๋˜์‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Errors are value

panic์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๋ฉด error๋ฅผ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

Values can be programmed, and since errors are values, errors can be programmed.

์ถœ์ฒ˜: The Go Blog

๊ฐ’(value)์€ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, error ๋˜ํ•œ ๊ฐ’์ด๋ฏ€๋กœ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

var ErrDivideByZero = errors.New("divide by zero")

func Divide(a, b int) (int, error) {  
    if b == 0 {
        return 0, ErrDivideByZero
    }
    return a / b, nil
}

func main() {  
    result, err := Divide(10, 0)
    if err != nil {
        log.Error(err) // "divide by zero"
        return
    }
    fmt.Printlnt(result)
}

Import library by repository path

Golang์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๊ณ  ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub ์ €์žฅ์†Œ URL ์ž์ฒด๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ๋˜๊ณ  GitHub์— release ํƒœ๊ทธ๋งŒ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go get -u github.com/gin-gonic/gin  

์œ„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด Golang ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” go.mod ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

// go.mod
module ...

go 1.20

require (  
    github.com/gin-gonic/gin v1.9.1
    go.mongodb.org/mongo-driver v1.12.1
  ...
)

์ด๋ ‡๊ฒŒ ๋ณ„๋„์˜ ํŠน์ • ๊ณต๊ฐ„์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š์•„๋„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €ํฌ ํŒ€์—์„œ๋Š” Golang์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ๊ณตํ†ต ์ €์žฅ์†Œ์—์„œ ๊ฐœ๋ฐœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์†Œ๊ฐœํ•  ์ฝ”๋“œ๋„ ๋Œ€๋ถ€๋ถ„ ํ•ด๋‹น ๊ณตํ†ต ์ €์žฅ์†Œ์—์„œ ๊ฐœ๋ฐœํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ€์กฑ

Golang์˜ ๋˜ ํ•˜๋‚˜์˜ ํŠน์ง•์€ ์ง์ ‘ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Java์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด์„œ ์˜คํ”ˆ ์†Œ์Šค๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŽ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ ์ธ ์˜ˆ๋กœ, Golang ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— slice(=List)์—์„œ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๋นผ๋‚ด๋Š” pop ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ง์ ‘ ๊บผ๋‚ด๊ณ  ๊ทธ ์•ž๊นŒ์ง€์˜ slice๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” pop์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

pop, s1 := s[len(s)-1], s[:len(s)-1]  
fmt.Println(s1) // [1 2 3 4]  
fmt.Println(pop) // 5  

๋˜ํ•œ, Set ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ์—†์–ด ์ด๋ฅผ map์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ง์ ‘ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„, ์ž˜๋ชปํ•˜๋ฉด ์ฝ”๋“œ ์–‘์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์‰ฝ๊ฒŒ ์ƒ์‚ฐ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


error๊ฐ€ ์˜์•„์˜ฌ๋ฆฐ ์ž‘์€ ๊ณต

panic์„ ๋˜์ง€์ง€ ์•Š๊ณ  error๋ฅผ ์ƒ์œ„ ํ•จ์ˆ˜๋กœ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ๋ณด๊ธฐ์—๋Š” ๊ฐ„๋‹จ ๋ช…๋ฃŒํ•œ ์ปจ๋ฒค์…˜์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์ด๋Š” ์ ˆ๋Œ€ ๋งŒ๋งŒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 2023๋…„ Golang ์‚ฌ์šฉ์ž ์„ค๋ฌธ์— ๋”ฐ๋ฅด๋ฉด ์ด ์ ์€ ์ €๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Golang ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ€์ง€๋Š” ์–ด๋ ค์›€์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Error handling and learning are respondents' top challenges

ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๊ณ  error๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๊ณ  ๋˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์‹ฌ์‹ฌ์น˜ ์•Š๊ฒŒ ๋ฐœ์ƒํ•˜๋‹ค ๋ณด๋‹ˆ, ์ด error์— ๋Œ€ํ•œ ๋กœ๊ทธ๋Š” ์–ด๋””์—์„œ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ๋“ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.


ํด๋กœ๋ฐ”๋…ธํŠธ V1 ์ฝ”๋“œ ๊ฐœ์„  ํ•„์š” ์‚ฌํ•ญ

๊ทธ๋Ÿผ ๊ธฐ์กด V1 ์ฝ”๋“œ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋Š”์ง€ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ
// Controller
func DoAPI() {  
    result, code := service.DoSomething()
    if code == 500 {
        log.error("error in main, message: %s", err.Error())
        // create err response
        return
    } else if code != 0 {
        log.warn("error in main, message: %s", err.Error())
        // create err response
        return
    }
    //...
    // create response
}

// Service
func DoSomething() (Foo, int) {  
    result, code, err := db.DoSomething()
    if code != 0 {
        log.error("error in baz, message: %s", err.Error())
        return result, code
    }
    // ...
    return result, code
}

// DB
func DoSomething() (Foo, int, error) {  
    cursor, err := doQuery()
    if err != nil {
        log.error("error in bar, message: %s", err.Error())
        return nil, 500, err
    }
    // decodeCursor()
    return result, 0, nil
}

// DB common
func doQuery() (*mongo.Cursor, error) {  
    // ... do DB query
    return nil, errors.New("error")
}

Mongo ๋™์ž‘ ๋ฐฉ์‹ ์ƒ์ด

์„œ๋ฒ„๋งˆ๋‹ค Mongo ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ฐ๊ฐ ๋ž˜ํ•‘ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, >์„œ๋ฒ„๋งˆ๋‹ค ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด FindOne์—์„œ (result, error) ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ๋•Œ, A ์„œ๋ฒ„๋Š” ๊ฒฐ๊ณผ ๊ฐ’์ด ์—†์œผ๋ฉด (nil, nil)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  B ์„œ๋ฒ„๋Š” (nil, not found err)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

error ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๊น…

์ƒ์œ„ ํ•จ์ˆ˜์—์„œ ์‰ฝ๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก >error์™€ ํ•จ๊ป˜ error code๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์กฐ์ •ํ•˜๋ฉฐ >๋ชจ๋“  ์ง€์ ์—์„œ error ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์ปจ๋ฒค์…˜์— ๋งž์ง€ ์•Š๋Š” ๋ฐฉ์‹์ด์—ˆ๊ณ  ์ค‘๋ณต ๋กœ๊ทธ๊ฐ€ ๋งŽ์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, error์˜ ๋กœ๊ทธ ๋ ˆ๋ฒจ์ด ๋ชจํ˜ธํ•œ ๊ฒฝ์šฐ๋„ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, DB ๋ ˆ์ด์–ด ํ•จ์ˆ˜์—์„œ ์–ด๋–ค document๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ ์ด๋Š” Error ๋ ˆ๋ฒจ์ผ๊นŒ์š”, Info ๋ ˆ๋ฒจ์ผ๊นŒ์š”? ์ด ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ƒํ™ฉ์ธ์ง€ ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ธ์ง€๋Š” ์ƒ์œ„ ๋ ˆ์ด์–ด์—์„œ ๊ฒฐ์ •๋˜๋ฏ€๋กœ ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ์•Œ ์ˆ˜๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, >error๋ฅผ ์–ด๋””๊นŒ์ง€ ์˜ฌ๋ ค์•ผ ํ•˜๋ฉฐ ํ•˜์œ„ ๋ ˆ์ด์–ด์—์„œ ๋ฐœ์ƒํ•œ error๋ฅผ ์ƒ์œ„ ๋ ˆ์ด์–ด์—์„œ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.


๋งˆ์น˜๋ฉฐ

๊ณ ๋ฏผ์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ํด๋กœ๋ฐ”๋…ธํŠธ V2 ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•˜์—ฌ ์œ„์˜ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ๊ณ , ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๋‚ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์œ„ 3๊ฐ€์ง€ ๊ณ ๋ฏผ์„ ์ค‘์ ์œผ๋กœ ์ฝ์–ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.