Go์ ๋์์ฑ
Go ๋์์ฑ ๋ชจ๋ธ์ ํ์ ์ดํด๋ณด๊ณ ํจ๊ณผ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ๋ฐฐ์ฐ๊ณ ๋น ๋ฅด๊ณ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ต์ ํ ๊ธฐ์ ์ ์์๋ณด์ธ์.

Go์ ๋์์ฑ ์๊ฐ
๋์์ฑ์ ๋์ ๋๋ ์์ฌ ๋ณ๋ ฌ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ํด ์คํ๋๋ ๋ ๋ฆฝ์ ์ธ ์์ ์ ๊ตฌ์ฑ์ ๋๋ค. ๋์์ฑ์ ๊ฐ๋ฐ์๊ฐ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ณ ์์คํ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋์์ธ์ ๋จ์ํํ ์ ์๋๋ก ํ๋ ์ต์ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ธก๋ฉด์ ๋๋ค.
golang ์ด๋ผ๊ณ ๋ ํ๋ Go๋ ๋จ์์ฑ๊ณผ ํจ์จ์ฑ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋ ์ ์ ์ ํ์ ์ปดํ์ผ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. ๋์์ฑ ๋ชจ๋ธ์ Tony Hoare์ CSP(Communicating Sequential Processes) ์์ ์๊ฐ์ ์ป์์ผ๋ฉฐ ์ด๋ ๋ช ์์ ๋ฉ์์ง ์ ๋ฌ ์ฑ๋๋ก ์ํธ ์ฐ๊ฒฐ๋ ๋ ๋ฆฝ์ ์ธ ํ๋ก์ธ์ค์ ์์ฑ์ ์ด์งํ๋ ํ์์ ๋๋ค. Go์ ๋์์ฑ์ ๊ณ ๋ฃจํด, ์ฑ๋ ๋ฐ 'select' ๋ฌธ์ ๊ฐ๋ ์ ์ค์ฌ์ผ๋ก ํฉ๋๋ค.
์ด๋ฌํ ํต์ฌ ๊ธฐ๋ฅ์ ํตํด ๊ฐ๋ฐ์๋ ์์ ๊ฐ ์์ ํ๊ณ ์ ํํ ํต์ ๋ฐ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ฉด์ ์ฝ๊ณ ์ต์ํ์ ์์ฉ๊ตฌ ์ฝ๋๋ก ๊ณ ๋์ ๋์์ฑ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค. AppMaster ์์ ๊ฐ๋ฐ์๋ Go์ ๋์์ฑ ๋ชจ๋ธ์ ํ์ฉํ์ฌ ์๊ฐ์ ์ฒญ์ฌ์ง ๋์์ด๋์ ์๋ ์์ค ์ฝ๋ ์์ฑ์ ํตํด ํ์ฅ ๊ฐ๋ฅํ ๊ณ ์ฑ๋ฅ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ณ ๋ฃจํด: ๋์์ฑ์ ๋น๋ฉ ๋ธ๋ก
Go์์ ๋์์ฑ์ Go ๋ฐํ์ ์ค์ผ์ค๋ฌ์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ๋ฒผ์ด ์ค๋ ๋์ ๊ฐ์ ๊ตฌ์กฐ์ธ ๊ณ ๋ฃจํด์ ๊ฐ๋ ์ ์ค์ฌ์ผ๋ก ๊ตฌ์ถ๋ฉ๋๋ค. ๊ณ ๋ฃจํด์ OS ์ค๋ ๋์ ๋นํด ๋งค์ฐ ์ ๋ ดํ๋ฉฐ ๊ฐ๋ฐ์๋ ๊ณผ๋ํ ์์คํ ๋ฆฌ์์ค ์์ด ๋จ์ผ ํ๋ก๊ทธ๋จ์์ ์์ฒ ๋๋ ์๋ฐฑ๋ง ๊ฐ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๊ณ ๋ฃจํด์ ๋ง๋ค๋ ค๋ฉด ๋จ์ํ ํจ์ ํธ์ถ ์์ 'go' ํค์๋๋ฅผ ๋ถ์ ๋๋ค. ํธ์ถ ์ ํจ์๋ ํ๋ก๊ทธ๋จ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋์์ ์คํ๋ฉ๋๋ค.
func printMessage(message string) { fmt.Println(message) } func main() { go printMessage("Hello, concurrency!") fmt.Println("This might print first.") }
์ธ์๋ ๋ฉ์์ง์ ์์๋ ๊ฒฐ์ ์ ์ด์ง ์์ผ๋ฉฐ ๋ ๋ฒ์งธ ๋ฉ์์ง๊ฐ ์ฒซ ๋ฒ์งธ ๋ฉ์์ง๋ณด๋ค ๋จผ์ ์ธ์๋ ์ ์์ต๋๋ค. ์ด๋ ๊ณ ๋ฃจํด์ด ํ๋ก๊ทธ๋จ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋์์ ์คํ๋๋ฉฐ ์คํ ์์๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. Go ๋ฐํ์ ์ค์ผ์ค๋ฌ๋ ๊ณ ๋ฃจํด์ ๊ด๋ฆฌ ๋ฐ ์คํํ์ฌ CPU ์ฌ์ฉ๋ฅ ์ ์ต์ ํํ๊ณ ๋ถํ์ํ ์ปจํ ์คํธ ์ ํ์ ํผํ๋ฉด์ ๋์์ ์คํ๋๋๋ก ํฉ๋๋ค. Go์ ์ค์ผ์ค๋ฌ๋ ์์ ๋์ฉ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ณ ๊ณ ๋ฃจํด์ ํ๋ ฅ์ ์ผ๋ก ์์ฝํ์ฌ ์ฅ๊ธฐ ์คํ ์์ ์ค์ด๋ ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ ์ ํ ๋ ์ ์ด๊ถ์ ์๋ณดํ๋๋ก ํฉ๋๋ค.
๊ณ ๋ฃจํด์ ํจ์จ์ ์ด์ง๋ง ๋ถ์ฃผ์ํ๊ฒ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ์ ๋ณด์ฅํ๊ณ ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๊ณ ๋ฃจํด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ๊ฐ๋ฐ์๋ ์ฃผ์ด์ง ์๊ฐ์ ํ์ฑ ๊ณ ๋ฃจํด์ ์๋ฅผ ์ ํํ๊ธฐ ์ํด ์์ ์ ํ๊ณผ ๊ฐ์ ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ฑ๋: ๊ณ ๋ฃจํด ๊ฐ ๋๊ธฐํ ๋ฐ ํต์
์ฑ๋์ ๊ณ ๋ฃจํด์ด ์คํ์ ์์ ํ๊ฒ ํต์ ํ๊ณ ๋๊ธฐํํ ์ ์๋๋ก ํ๋ Go ๋์์ฑ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ๋ถ๋ถ์ ๋๋ค. ์ฑ๋์ Go์ ์ผ๋ฅ ๊ฐ์ด๋ฉฐ 'make' ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ผ๋ฉฐ ์ฉ๋์ ์ ์ดํ๊ธฐ ์ํ ์ ํ์ ๋ฒํผ ํฌ๊ธฐ๊ฐ ์์ต๋๋ค.
// Unbuffered channel ch := make(chan int) // Buffered channel with a capacity of 5 bufCh := make(chan int, 5)
์ง์ ๋ ์ฉ๋์ ๋ฒํผ๋ง๋ ์ฑ๋์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์ฑ๋์ ์ ์ฅํ์ฌ ๊ฐ๋จํ ๋๊ธฐ์ด ์ญํ ์ ํ ์ ์์ต๋๋ค. ์ด๋ ํน์ ์๋๋ฆฌ์ค์์ ์ฒ๋ฆฌ๋์ ๋๋ฆฌ๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง ๊ฐ๋ฐ์๋ ๊ต์ฐฉ ์ํ๋ ๊ธฐํ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ฑ๋์ ํตํ ๊ฐ ์ ์ก์ '<-' ์ฐ์ฐ์๋ฅผ ํตํด ์ํ๋ฉ๋๋ค.
// Sending the value 42 through the channel ch <- 42 // Sending values in a for loop for i := 0; i < 10; i++ { ch <- i }
๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ๋์์ ๊ฐ์ ์์ ํ ๋๋ ๋์ผํ '<-' ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฑ๋์ด ์ค๋ฅธ์ชฝ์ ์์ต๋๋ค.
// Receiving a value from the channel value := <-ch // Receiving values in a for loop for i := 0; i < 10; i++ { value := <-ch fmt.Println(value) }
์ฑ๋์ ๊ณ ๋ฃจํด ํต์ ๋ฐ ๋๊ธฐํ๋ฅผ ์ํ ๊ฐ๋จํ๋ฉด์๋ ๊ฐ๋ ฅํ ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ฑ๋์ ์ฌ์ฉํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํ๊ณ ๋ฐ์ดํฐ ๊ฒฝํฉ ๋ฐ ๊ธฐํ ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ๊ฐ์ ๋์ ํจ์๊ฐ ๋ ์กฐ๊ฐ์ ์์๋ฅผ ํฉ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ๋ณ์์ ์ ์ฅํ๋ ๋ค์ ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
func sumSlice(slice []int, result *int) { sum := 0 for _, value := range slice { sum += value } *result = sum } func main() { slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{6, 7, 8, 9, 10} sharedResult := 0 go sumSlice(slice1, &sharedResult) go sumSlice(slice2, &sharedResult) time.Sleep(1 * time.Second) fmt.Println("Result:", sharedResult) }
์์ ์๋ ๋ ๊ณ ๋ฃจํด์ด ๋์ผํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ฒฝ์์ ์ทจ์ฝํฉ๋๋ค. ์ฑ๋์ ์ฌ์ฉํ๋ฉด ํต์ ์ ์์ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ก๋ถํฐ ์์ ๋กญ๊ฒ ํ ์ ์์ต๋๋ค.
func sumSlice(slice []int, ch chan int) { sum := 0 for _, value := range slice { sum += value } ch <- sum } func main() { slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{6, 7, 8, 9, 10} ch := make(chan int) go sumSlice(slice1, ch) go sumSlice(slice2, ch) result1 := <-ch result2 := <-ch fmt.Println("Result:", result1 + result2) }
Go์ ๋ด์ฅ๋ ๋์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์๋ ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๊ณ ๋ฃจํด๊ณผ ์ฑ๋์ ์ฌ์ฉํ์ฌ ์์ ํ๊ณ ์ฐ์ํ ์ฝ๋๋ฅผ ์ ์งํ๋ฉด์ ์ต์ ํ๋์จ์ด์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ ์ ์์ต๋๋ค. AppMaster ์์ Go ์ธ์ด๋ ์ต๊ณ ์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ์ํ ์๋ ์์ค ์ฝ๋ ์์ฑ์ ํตํด ๊ฐ๋ฐ์๊ฐ ์๊ฐ์ ์ผ๋ก ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
Go์ ์ผ๋ฐ์ ์ธ ๋์์ฑ ํจํด
๋์์ฑ ํจํด์ ๋์์ฑ ์ํํธ์จ์ด๋ฅผ ์ค๊ณ ๋ฐ ๊ตฌํํ๋ ๋์ ๋ฐ์ํ๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋๋ค. ์ด ์น์ ์์๋ ํฌ์ธ/ํฌ์์, ์์ ์ ํ, ํ์ดํ๋ผ์ธ ๋ฑ Go์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋์์ฑ ํจํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํฌ์ธ/ํฌ์์
ํฌ์ธ/ํฌ์์ ํจํด์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ์ฌ๋ฌ ์์ (ํฌ์์)๊ณผ ํด๋น ์์ ์์ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ๋จ์ผ ์์ (ํฌ์ธ)์ด ์์ ๋ ์ฌ์ฉ๋ฉ๋๋ค. Go์์๋ ๊ณ ๋ฃจํด๊ณผ ์ฑ๋์ ์ฌ์ฉํ์ฌ ์ด ํจํด์ ๊ตฌํํ ์ ์์ต๋๋ค. Fan-out ๋ถ๋ถ์ ์ฌ๋ฌ ๊ฐ์ ๊ณ ๋ฃจํด์ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ฌ ์์ฑ๋๋ฉฐ, Fan-in ๋ถ๋ถ์ ๋จ์ผ ์ฑ๋์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๋นํ์ฌ ์์ฑ๋ฉ๋๋ค. ```go func FanIn(channels ...<-chan int) <-chan int { var wg sync.WaitGroup out := make(chan int) wg.Add(len(channels)) for _, c := range channels { go func(ch <-chan int) { for n := range ch { out <- n } wg.Done() }(c) } go func() { wg.Wait() close(out) }( ) ๋ฐํ } ```
์์ ์ ํ
์์ ์ ํ์ ๋์ผํ ์์ ์ ๋์์ ์คํํ๋ ์ผ๋ จ์ ๊ณ ๋ฃจํด์ผ๋ก ์์ ๋ถํ๋ฅผ ์๋ก ๋ถ์ฐ์ํต๋๋ค. ์ด ํจํด์ ๋์์ฑ์ ์ ํํ๊ณ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ์์ ์ ์คํํ๋ ๊ณ ๋ฃจํด์ ์๋ฅผ ์ ์ดํ๋ โโ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Go์์๋ ๊ณ ๋ฃจํด, ์ฑ๋ ๋ฐ 'range' ํค์๋์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ์์ ์ ํ์ ๋ง๋ค ์ ์์ต๋๋ค. ```go func WorkerPool(workers int, jobs <-chan Job, results chan<- Result) { for i := 0; i < ๋ ธ๋์; i++ { go func() { for job := range jobs { results <- job.Execute() } }() } } ```
ํ์ดํ๋ผ์ธ
ํ์ดํ๋ผ์ธ ํจํด์ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ผ๋ จ์ ์์ ์ผ๋ก, ๊ฐ ์์ ์ ์ถ๋ ฅ์ ๋ค์ ์์ ์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌํฉ๋๋ค. Go์์ ํ์ดํ๋ผ์ธ ํจํด์ ๊ณ ๋ฃจํด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ผ๋ จ์ ์ฑ๋์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ํ๋์ ๊ณ ๋ฃจํด์ ํ์ดํ๋ผ์ธ์ ๋จ๊ณ ์ญํ ์ ํฉ๋๋ค. ```go func Pipeline(input <-chan Data) <-chan Result { stage1 := stage1(input) stage2 := stage2(stage1) return stage3(stage2) } ```
์๋ ์ ํ
์๋ ์ ํ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ฆฌ์์ค๋ฅผ ์๋นํ๊ฑฐ๋ ํน์ ์์ ์ ์ํํ๋ ์๋๋ฅผ ์ ์ดํ๋ โโ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ณ ์์คํ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. Go์์๋ time.Ticker ๋ฐ 'select' ๋ฌธ์ ์ฌ์ฉํ์ฌ ์๋ ์ ํ์ ๊ตฌํํ ์ ์์ต๋๋ค. ```go func RateLimiter(requests <-chan Request, rate time.Duration) <-chan Response { limit := time.NewTicker(rate) responses := make(chan Response) go func() { defer close(responses) for req := ๋ฒ์ ์์ฒญ { <-limit.C ์๋ต <- req.Process() } }() ๋ฐํ ์๋ต } ```
์ทจ์ ๋ฐ ์๊ฐ ์ด๊ณผ ํจํด
๋์ ํ๋ก๊ทธ๋จ์์ ์์ ์ ์ทจ์ํ๊ฑฐ๋ ์์ ์๋ฃ๋ฅผ ์ํ ์ ํ ์๊ฐ์ ์ค์ ํ๋ ค๋ ์ํฉ์ด ์์ ์ ์์ต๋๋ค. Go๋ ๊ณ ๋ฃจํด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ปจํ ์คํธ ํจํค์ง๋ฅผ ์ ๊ณตํ์ฌ ์ทจ์, ๊ธฐํ ์ค์ ๋๋ ๊ฒฉ๋ฆฌ๋ ํธ์ถ ๊ฒฝ๋ก์์ ๊ณต์ ํ ๊ฐ์ ์ฒจ๋ถํ๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ```go func WithTimeout(ctx context.Context, duration time.Duration, task func() error) error { ctx, cancel := context.WithTimeout(ctx, duration) defer cancel() done := make(chan error, 1) go func() { done <- task() }() select { case <-ctx.Done(): return ctx.Err() case err := <-done: return err } } ```

๋์ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ณต๊ตฌ
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ณต๊ตฌ๋ ํ๋ก๊ทธ๋จ์ด ์๊ธฐ์น ์์ ์ํฉ์ ๋์ํ๊ณ ์ ์ด๋ ๋ฐฉ์์ผ๋ก ์คํ์ ๊ณ์ํ ์ ์๋๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ฅํ ๋์ ํ๋ก๊ทธ๋จ์ ํ์ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ด ์น์ ์์๋ ๋์ Go ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ณ ๋ฃจํด์ ํจ๋์์ ๋ณต๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
๋์ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฒ๋ฆฌ
- ์ฑ๋์ ํตํด ์ค๋ฅ ๋ณด๋ด๊ธฐ : ์ฑ๋์ ์ฌ์ฉํ์ฌ ๊ณ ๋ฃจํด ๊ฐ์ ์ค๋ฅ ๊ฐ์ ์ ๋ฌํ๊ณ ์์ ์๊ฐ ๊ทธ์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค. ```go func worker(jobs <-chan int, results chan<- int, errs chan<- error) { for job := range jobs { res, err := process(job) if err != nil { errs < - ์ค๋ฅ ๊ณ์ } ๊ฒฐ๊ณผ <- ์ ์ } } ```
- 'select'๋ฌธ ์ฌ์ฉ : ๋ฐ์ดํฐ์ ์ค๋ฅ ์ฑ๋์ ๊ฒฐํฉํ ๋ 'select'๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ฑ๋์ ๋ฃ๊ณ ์์ ๋ ๊ฐ์ ๋ฐ๋ผ ์กฐ์น๋ฅผ ์ํํ ์ ์์ต๋๋ค. ```go select { case res := <-results: fmt.Println("Result:", res) case err := <-errs: fmt.Println("Error:", err) } ```
๊ณ ๋ฃจํด ํจ๋์์ ํ๋ณตํ๊ธฐ
๊ณ ๋ฃจํด์ ํจ๋์์ ๋ณต๊ตฌํ๋ ค๋ฉด ์ฌ์ฉ์ ์ง์ ๋ณต๊ตฌ ๊ธฐ๋ฅ๊ณผ ํจ๊ป 'defer' ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ณ ๋ฃจํด์ด ํจ๋์ ์ง๋ฉดํ์ ๋ ์คํ๋๋ฉฐ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๊ธฐ๋กํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ```go func workerSafe() { defer func() { if r := ๋ณต๊ตฌ(); r != nil { fmt.Println("Recovered from:", r) } }() // ์ฌ๊ธฐ์ ๊ณ ๋ฃจํด ์ฝ๋๊ฐ ์์ต๋๋ค. } ```
์ฑ๋ฅ์ ์ํ ๋์์ฑ ์ต์ ํ
Go์์ ๋์ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ค๋ฉด ์ฃผ๋ก ๋ฆฌ์์ค ํ์ฉ์ ์ ์ ํ ๊ท ํ์ ์ฐพ๊ณ ํ๋์จ์ด ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํด์ผ ํฉ๋๋ค. ๋ค์์ ๋์ Go ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋๋ค.
- ๊ณ ๋ฃจํด ์ ๋ฏธ์ธ ์กฐ์ : ์ ์ ํ ๊ณ ๋ฃจํด ์๋ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ํ๋์จ์ด ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ค์ํ ๊ฐ์ผ๋ก ์คํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ ์ต์ ์ ๊ณ ๋ฃจํด ์๋ฅผ ์ฐพ์ผ์ธ์.
- ๋ฒํผ๋ง๋ ์ฑ๋ ์ฌ์ฉ : ๋ฒํผ๋ง๋ ์ฑ๋์ ์ฌ์ฉํ๋ฉด ๋์ ์์ ์ ์ฒ๋ฆฌ๋์ ๋๋ฆด ์ ์์ผ๋ฏ๋ก ๋๊ธฐํ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์ฐํ๊ณ ์๋นํ ์ ์์ต๋๋ค.
- ์๋ ์ ํ ๊ตฌํ : ๋ฆฌ์์ค ์ง์ฝ์ ์ธ ํ๋ก์ธ์ค์์ ์๋ ์ ํ์ ์ฌ์ฉํ๋ฉด ๋ฆฌ์์ค ์ฌ์ฉ์ ์ ์ดํ๊ณ ๊ฒฝํฉ, ๊ต์ฐฉ ์ํ ๋ฐ ์์คํ ๊ณผ๋ถํ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ์บ์ฑ ์ฌ์ฉ : ์์ฃผ ์ก์ธ์ค๋๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ์ค์ด๊ณ ํ๋ก๊ทธ๋จ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง : pprof์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ Go ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ๋ฆฌ์์ค ์๋ชจ ์์ ์ ์๋ณํ๊ณ ์ต์ ํํฉ๋๋ค.
- ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ AppMaster ํ์ฉ : AppMaster ๋ ธ์ฝ๋ ํ๋ซํผ์ ์ฌ์ฉํ๋ฉด Go์ ๋์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ฌ ์ํํธ์จ์ด ์๋ฃจ์ ์ ๋ํ ์ต์ ์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋์์ฑ ํจํด๊ณผ ์ต์ ํ ๊ธฐ์ ์ ๋ง์คํฐํ๋ฉด Go์์ ํจ์จ์ ์ด๊ณ ๊ณ ์ฑ๋ฅ์ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ๋ ฅํ AppMaster ํ๋ซํผ๊ณผ ํจ๊ป Go์ ๋ด์ฅ๋ ๋์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ํํธ์จ์ด ํ๋ก์ ํธ๋ฅผ ์๋ก์ด ์ฐจ์์ผ๋ก ๋์ด์ฌ๋ฆฌ์ญ์์ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Go์์์ ๋์์ฑ์ ์ฌ๋ฌ ์์ ์ ๋์์ ์คํํ๊ฑฐ๋ ์ต์ํ ๋ณ๋ ฌ๋ก ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ก ๊ตฌ์ฑํ๋ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ ์๋ฏธํฉ๋๋ค. Go๋ ๊ณ ๋ฃจํด, ์ฑ๋ ๋ฐ 'select' ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
๊ณ ๋ฃจํด์ Go์ ๋ฐํ์ ์์คํ ์์ ๊ด๋ฆฌํ๋ ๊ฐ๋ฒผ์ด ์ค๋ ๋์ ๊ฐ์ ๊ตฌ์กฐ์ ๋๋ค. ์์ฒ ๋๋ ์๋ฐฑ๋ง ๊ฐ์ ๋์ ์์ ์ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๋ ์ฝ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ณ ๋ฃจํด์ 'go' ํค์๋์ ํจ์ ํธ์ถ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. Go ๋ฐํ์ ์ค์ผ์ค๋ฌ๋ ๊ณ ๋ฃจํด์ ๋์์ ๊ด๋ฆฌํ๊ณ ์คํํฉ๋๋ค.
Go์ ์ฑ๋์ ๊ณ ๋ฃจํด ๊ฐ์ ๋๊ธฐํ ๋ฐ ํต์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋์ ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ํต์ ์ด ์์ ํ๊ณ ๋ฐ์ดํฐ ๊ฒฝํฉ์ด ์๋๋ก ํฉ๋๋ค. ์ฑ๋์ ์์ฑ ์ค์ ์ง์ ํ ์ฉ๋์ ๋ฐ๋ผ ๋ฒํผ๋ง๋์ง ์๊ฑฐ๋ ๋ฒํผ๋ง๋ ์ ์์ต๋๋ค.
Go์ ์ผ๋ฐ์ ์ธ ๋์์ฑ ํจํด์๋ ํฌ์ธ/ํฌ์์ ํจํด, ์์ ์ ํ, ํ์ดํ๋ผ์ธ, ์๋ ์ ํ ๋ฐ ์ทจ์๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด๋ฌํ ํจํด์ ๊ฒฐํฉํ๊ณ ์ฌ์ฉ์ ์ง์ ํ์ฌ Go์์ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Go์์๋ ์ฑ๋์ ํตํด ์ค๋ฅ ๊ฐ์ ์ ๋ฌํ๊ณ , 'select' ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ค๋ฅ ์์ค๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋ณต๊ตฌ ํจ์์ ํจ๊ป 'defer' ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ๋ฃจํด์์ ๋ฐ์ํ ์ ์๋ ํจ๋์ ๊ฐ๋ก์ฑ๊ณ ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋์ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. .
Go์์ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๋ ค๋ฉด ๊ณ ๋ฃจํด ์๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๊ณ , ๋ฒํผ๋ง๋ ์ฑ๋์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋์ ๋๋ฆฌ๊ณ , ์๋ ์ ํ์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ ์ดํ๊ณ , ์บ์ฑ์ ๊ตฌํํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ์ค์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ต์ ํํ ์ ์์ต๋๋ค. ๋ํ AppMaster ์ฌ์ฉํ์ฌ Go์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ฌ ์ต๊ณ ์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.


