2023๋…„ 6์›” 22์ผยท3๋ถ„ ์ฝ๊ธฐ

Go์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ๊ธฐ์ˆ ์„ ์•Œ์•„๋ณด์„ธ์š”. ๋™์‹œ์„ฑ, ํ”„๋กœํŒŒ์ผ๋ง, ์•ˆ์ „ํ•œ ํฌ์ธํ„ฐ ์‚ฌ์šฉ ๋ฐ ๋ฒค์น˜๋งˆํ‚น์„ ํ†ตํ•ด ์ตœ๋Œ€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

Go์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”

Go์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์†Œ๊ฐœ

Go ๋˜๋Š” Golang์€ Google์—์„œ Robert Griesemer, Rob Pike ๋ฐ Ken Thompson์ด ๊ฐœ๋ฐœํ•œ ์ตœ์‹  ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Go๋Š” ๋‹จ์ˆœ์„ฑ, ๊ฐ•๋ ฅํ•œ ํƒ€์ดํ•‘, ๋‚ด์žฅ ๋™์‹œ์„ฑ ์ง€์› ๋ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ๋•๋ถ„์— ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์„œ๋ฒ„ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ๊ธฐํƒ€ ๊ณ ์„ฑ๋Šฅ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์†๋„, ํ™•์žฅ์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ ๋•Œ๋ฌธ์— Go๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ดํ•ดํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋™์‹œ์„ฑ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Go๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋ชฉํ• ๋งŒํ•œ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐฑ์—”๋“œ, ์›น ๋ฐ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ์ฝ”๋“œ ์—†๋Š” ํ”Œ๋žซํผ์ธ AppMaster ์ž…๋‹ˆ๋‹ค. AppMaster Go๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ๊ณ ๋ถ€ํ•˜ ๋ฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•„์š”ํ•œ ํ™•์žฅ์„ฑ๊ณผ ๊ณ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Go์˜ ๋™์‹œ์„ฑ ์ง€์›์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ํ•„์ˆ˜ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋™์‹œ์„ฑ ํ™œ์šฉ

๋™์‹œ์„ฑ์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. Go๋Š” ๋™์‹œ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์–ด ๊ณ  ๋ฃจํ‹ด ๊ณผ ์ฑ„๋„์„ ๋‚ด์žฅ ์–ธ์–ด ๊ตฌ์กฐ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋™์‹œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ฃจํ‹ด

๊ณ ๋ฃจํ‹ด์€ Go์˜ ๋Ÿฐํƒ€์ž„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— `go` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”: ```go go funcName() ``` ๊ณ ๋ฃจํ‹ด์ด ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ณ ๋ฃจํ‹ด๊ณผ ๋™์ผํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณ ๋ฃจํ‹ด ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฑ„๋„

์ฑ„๋„์€ Go์˜ ๊ณ ๋ฃจํ‹ด ๊ฐ„ ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ฑ„๋„์€ ๊ณ ๋ฃจํ‹ด ๊ฐ„์— ๊ฐ’์„ ๋ณด๋‚ด๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹ํ™”๋œ ๋„๊ด€์ž…๋‹ˆ๋‹ค. ์ฑ„๋„์„ ๋งŒ๋“ค๋ ค๋ฉด 'chan' ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ```go channelName := make(chan dataType) ``` ์ฑ„๋„์„ ํ†ตํ•ด ๊ฐ’์„ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š” ๊ฒƒ์€ ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž(`<-`)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค: ```go // ์ฑ„๋„์— ๊ฐ’ ๋ณด๋‚ด๊ธฐ channelName <- valueToSend // ์ฑ„๋„์—์„œ ๊ฐ’ ๋ฐ›๊ธฐ receivedValue := <-channelName ``` ์ฑ„๋„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ ๋ฃจํ‹ด ๊ฐ„์˜ ์•ˆ์ „ํ•œ ํ†ต์‹ ์ด ๋ณด์žฅ๋˜๊ณ  ์ž ์žฌ์  ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. .

๋™์‹œ์„ฑ ํŒจํ„ด ๊ตฌํ˜„

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ, ํŒŒ์ดํ”„๋ผ์ธ, ํŒฌ์ธ/ํŒฌ์•„์›ƒ๊ณผ ๊ฐ™์€ ๋™์‹œ์„ฑ ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด Go ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋Ÿฌํ•œ ํŒจํ„ด์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

  • ๋ณ‘๋ ฌ์„ฑ: ๊ณ„์‚ฐ์„ ๋” ์ž‘์€ ์ž‘์—…์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๊ณ„์‚ฐ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ: ์ผ๋ จ์˜ ๊ธฐ๋Šฅ์„ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ฑ„๋„์„ ํ†ตํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„๊ฐ€ ๋™์‹œ์— ์ž‘๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ํŒฌ์ธ/ํŒฌ์•„์›ƒ: ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ณ ๋ฃจํ‹ด(ํŒฌ์•„์›ƒ)์— ์ž‘์—…์„ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ๊ณ ๋ฃจํ‹ด์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ๋˜๋Š” ์ง‘๊ณ„๋ฅผ ์œ„ํ•ด ๋‹จ์ผ ์ฑ„๋„(ํŒฌ์ธ)๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜๋ฉด ์ด๋Ÿฌํ•œ ํŒจํ„ด์€ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง

ํ”„๋กœํŒŒ์ผ๋ง์€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ๊ณผ ๋ฆฌ์†Œ์Šค ์†Œ๋น„ ๋น„ํšจ์œจ์„ฑ์„ ์‹๋ณ„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. Go๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ์„ฑ๋Šฅ ํŠน์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” 'pprof' ํŒจํ‚ค์ง€์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์ œ๊ณต ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Go ์ฝ”๋“œ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋ฉด ์ตœ์ ํ™” ๊ธฐํšŒ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CPU ํ”„๋กœํŒŒ์ผ๋ง

CPU ํ”„๋กœํŒŒ์ผ๋ง์€ CPU ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. `pprof` ํŒจํ‚ค์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€๋ถ€๋ถ„์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ์œ„์น˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” CPU ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CPU ํ”„๋กœํŒŒ์ผ๋ง์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ```go import "runtime/pprof" // ... func main() { // CPU ํ”„๋กœํŒŒ์ผ์„ ์ €์žฅํ•  ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค f, err := os.Create( "cpu_profile.prof") if err != nil { log.Fatal(err) } defer f.Close() // CPU ํ”„๋กœํ•„ ์‹œ์ž‘ if err := pprof.StartCPUProfile(f); err != nil { log.Fatal(err) } defer pprof.StopCPUProfile() // ์—ฌ๊ธฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์‹คํ–‰ } ``` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” `cpu_profile.prof` ํŒŒ์ผ์ด ์ƒ๊น๋‹ˆ๋‹ค. `pprof` ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ˜ธํ™˜๋˜๋Š” ํ”„๋กœํŒŒ์ผ๋Ÿฌ์˜ ๋„์›€์œผ๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง

๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง์€ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ์‚ฌ์šฉ์— ์ค‘์ ์„ ๋‘์–ด ์ž ์žฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๊ณผ๋„ํ•œ ํ• ๋‹น ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ```go import "runtime/pprof" // ... func main() { // ์—ฌ๊ธฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์‹คํ–‰ // ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ์„ ์ €์žฅํ•  ํŒŒ์ผ ์ƒ์„ฑ f, err := os.Create("mem_profile.prof") if err != nil { log.Fatal(err) } defer f.Close() // ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํ•„ ์“ฐ๊ธฐ runtime.GC() // ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ ์ •ํ™•ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ†ต๊ณ„ if err := pprof.WriteHeapProfile(f); err != nil { log.Fatal(err) } } ``` CPU ํ”„๋กœํŒŒ์ผ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `pprof` ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `mem_profile.prof` ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ํ˜ธํ™˜๋˜๋Š” ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์˜ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์–ป๊ณ  ์ตœ์ ํ™” ์˜์—ญ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํšจ๊ณผ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํšจ์œจ์ ์ธ ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํฌ์ธํ„ฐ

์ดˆ๊ธฐ ์„ฑ๋Šฅ ๊ฒ€์ฆ
AppMaster์—์„œ API๋ฅผ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋งž์ถค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ์„ฑ๋Šฅ์„ ๊ฒ€์ฆํ•˜์„ธ์š”.
ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

Go์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ตœ์ ํ™”ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋ฉฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ณ  ํฌ์ธํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ

Go์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐœ์ฒด๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ ๊ฐœ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋Œ€์‹  ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ๊ฐœ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go๋Š” ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ญ์ œํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ›„์— ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŠนํžˆ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด sync.Pool ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌํ˜„๊ณผ ๊ฐ™์€ ๊ฐœ์ฒด ํ’€์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ํ’€์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด ๋ชจ์Œ์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ํ’€์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ• ๋‹น ํ•ด์ œ๋Ÿ‰์„ ์ค„์ด๊ณ  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ํ• ๋‹น ๋ฐฉ์ง€

๋ถˆํ•„์š”ํ•œ ํ• ๋‹น์„ ํ”ผํ•˜๋ฉด ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ ์••๋ ฅ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ž„์‹œ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋˜๋Š” ์กฐ๊ฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • make([]T, size, capacity) ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ ค์ง„ ํฌ๊ธฐ๋กœ ์Šฌ๋ผ์ด์Šค๋ฅผ ์‚ฌ์ „ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • append ๊ธฐ๋Šฅ์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๋Š” ๋™์•ˆ ์ค‘๊ฐ„ ์Šฌ๋ผ์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋Œ€์‹  ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.

๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์˜ ๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ์›์ธ์€ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ํ• ๋‹น์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋Œ€์‹  ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜์„ธ์š”.

ํฌ์ธํ„ฐ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์—…ํ•˜๊ธฐ

ํฌ์ธํ„ฐ๋Š” Go์˜ ๊ฐ•๋ ฅํ•œ ๊ตฌ์กฐ๋กœ, ์ฝ”๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ๋ฒ„๊ทธ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

  • ํฌ์ธํ„ฐ๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ ์•„๊ปด์„œ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ์ธํ„ฐ ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜์‹ญ์‹œ์˜ค. ๋ฒ”์œ„๊ฐ€ ํด์ˆ˜๋ก ์ฐธ์กฐ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด unsafe.Pointer ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. Go์˜ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์šฐํšŒํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์›์ž์  ์ž‘์—…์„ ์œ„ํ•ด sync/atomic ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํฌ์ธํ„ฐ ์ž‘์—…์€ ์›์ž์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์ž ๊ธˆ ๋˜๋Š” ๊ธฐํƒ€ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒค์น˜๋งˆํ‚น

๋ฒค์น˜๋งˆํ‚น์€ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์—์„œ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ํ‰๊ฐ€ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์›Œํฌ๋กœ๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๋ฉด ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋ฉฐ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Go์—๋Š” testing ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” ๋ฒค์น˜๋งˆํ‚น ์ง€์› ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์žฅ๋œ go test ๋ช…๋ น์€ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

๋ฒค์น˜๋งˆํฌ ํ•จ์ˆ˜๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ •์˜๋˜์ง€๋งŒ ์„œ๋ช…์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 func BenchmarkMyFunction(b *testing.B) { // Benchmarking code goes here... }

ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ *testing.B ๊ฐœ์ฒด์—๋Š” ๋ฒค์น˜๋งˆํ‚น์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • bN : ๋ฒค์น˜๋งˆํ‚น ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ณต ํšŸ์ˆ˜.
  • b.ReportAllocs() : ๋ฒค์น˜๋งˆํฌ ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ˆ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • b.SetBytes(int64) : ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž‘์—…๋‹น ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ์—๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฒค์น˜๋งˆํ‚นํ•  ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ฐ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฒค์น˜๋งˆํฌ ์ธก์ •์—์„œ ์„ค์ • ์‹œ๊ฐ„์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ํƒ€์ด๋จธ( b.ResetTimer() )๋ฅผ ์žฌ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.
  3. ์ฃผ์–ด์ง„ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋กœ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. for i := 0; i < bN; i++ .
  4. ์ ์ ˆํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ ๋ฒค์น˜๋งˆํ‚น ์ค‘์ธ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ์‹คํ–‰

์‹คํ–‰ํ•˜๋ ค๋Š” ๋ฒค์น˜๋งˆํฌ ๊ธฐ๋Šฅ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์ด ๋’ค๋”ฐ๋ฅด๋Š” -bench ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จํ•˜์—ฌ go test ๋ช…๋ น์œผ๋กœ ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

 go test -bench=.

์ด ๋ช…๋ น์€ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ๋ฒค์น˜๋งˆํฌ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ•ด๋‹น ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ์ •๊ทœ์‹์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„, ๋ฐ˜๋ณต ํšŸ์ˆ˜, ์ž‘์—…๋‹น ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(๊ธฐ๋ก๋œ ๊ฒฝ์šฐ)์„ ๋ณด์—ฌ์ฃผ๋Š” ํ‘œ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ ๋ถ„์„

๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ์˜์—ญ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ตฌํ˜„ ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๊ณ , ์ตœ์ ํ™”์˜ ์˜ํ–ฅ์„ ์ธก์ •ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์„ฑ๋Šฅ ํšŒ๊ท€๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Go ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ํŒ

์›Œํฌํ”Œ๋กœ๋ฅผ ์„œ๋น„์Šค๋กœ ์ „ํ™˜
๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๊ณ  ์ด๋ฅผ Go ๋ฐฑ์—”๋“œ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”.
AppMaster ์ฒดํ—˜

๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒค์น˜๋งˆํ‚นํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ๋‹ค์Œ์€ Go ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํŒ์ž…๋‹ˆ๋‹ค.

  • Go ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ : ์ข…์ข… ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐ ์ตœ์ ํ™”๊ฐ€ ํฌํ•จ๋œ ์ตœ์‹  ๋ฒ„์ „์˜ Go๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ์ธ๋ผ์ธ ํ•จ์ˆ˜ : ํ•จ์ˆ˜ ์ธ๋ผ์ธ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ๊ณต๊ฒฉ์„ฑ์„ ์ œ์–ดํ•˜๋ ค๋ฉด go build -gcflags '-l=4' ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(๊ฐ’์ด ๋†’์„์ˆ˜๋ก ์ธ๋ผ์ธ์ด ์ฆ๊ฐ€ํ•จ).
  • ๋ฒ„ํผ๋ง๋œ ์ฑ„๋„ ์‚ฌ์šฉ : ๋™์‹œ์„ฑ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ํ†ต์‹ ์— ์ฑ„๋„์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฒ„ํผ๋ง๋œ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์„ ํƒ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฐฐ์—ด ๋Œ€์‹  ์Šฌ๋ผ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํšจ์œจ์ ์ธ ์กฐํšŒ ๋ฐ ์กฐ์ž‘์„ ์œ„ํ•ด ๋‚ด์žฅ ๋งต ๋ฐ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์ตœ์ ํ™” - ํ•œ ๋ฒˆ์— ์กฐ๊ธˆ์”ฉ : ๋ชจ๋“  ๊ฒƒ์„ ๋™์‹œ์— ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๊ธฐ๋ณด๋‹ค ํ•œ ๋ฒˆ์— ํ•œ ์˜์—ญ์”ฉ ์ตœ์ ํ™”์— ์ง‘์ค‘ํ•˜์‹ญ์‹œ์˜ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋น„ํšจ์œจ์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐ ๊ธฐํƒ€ ์ตœ์ ํ™”๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋Ÿฌํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•˜๋ฉด ํ™•์žฅ์„ฑ, ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๋„๊ตฌ์˜ ๊ธฐ๋Šฅ๊ณผ ์ด ๊ธฐ์‚ฌ์—์„œ ๊ณต์œ ํ•˜๋Š” ์‹ฌ์ธต ์ง€์‹์„ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ๊ณ ์„ฑ๋Šฅ ๋ฐ ๋†€๋ผ์šด ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด Go(Golang)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋…ธ์ฝ”๋“œ ํ”Œ๋žซํผ์ธ AppMaster ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ณ ๋ถ€ํ•˜ ๋ฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ด์ƒ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. AppMaster ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

๋ฐ”๋‘‘์ด๋ž€?

Go ๋˜๋Š” Golang์€ Robert Griesemer, Rob Pike ๋ฐ Ken Thompson์ด Google์—์„œ ๋งŒ๋“  ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ํšจ์œจ์„ฑ, ๊ฐ•๋ ฅํ•œ ํƒ€์ดํ•‘ ๋ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์œผ๋กœ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Go์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

Go์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋” ๋‚˜์€ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ, ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ–ฅ์ƒ๋œ ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํšจ์œจ์ ์ธ ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Go์˜ ํ•ต์‹ฌ ์ตœ์ ํ™” ๊ธฐ์ˆ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Go์˜ ์ผ๋ถ€ ์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ์ˆ ์—๋Š” ๋™์‹œ์„ฑ ํ™œ์šฉ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํฌ์ธํ„ฐ ๊ด€๋ฆฌ, ๋ฒค์น˜๋งˆํ‚น ๋ฐ ๊ถŒ์žฅ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Go์—์„œ ๋™์‹œ์„ฑ์€ ์–ด๋–ป๊ฒŒ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋‚˜์š”?

๋™์‹œ์„ฑ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go๋Š” ๊ณ ๋ฃจํ‹ด ๋ฐ ์ฑ„๋„๊ณผ์˜ ๋™์‹œ์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ ๋™์‹œ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ๋ง์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋‚˜์š”?

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

Go์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํฌ์ธํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Go์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์žฌํ• ๋‹นํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ํ• ๋‹น์„ ํ”ผํ•˜๊ณ , ํฌ์ธํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Go์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ณ  ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํ‚น์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ Go์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๊นŒ?

๋ฒค์น˜๋งˆํ‚น์€ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์—์„œ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. Go๋Š” ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€์— ๋ฒค์น˜๋งˆํ‚น ์ง€์› ๊ธฐ๋Šฅ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AppMaster๋Š” Go๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋‚˜์š”?

AppMaster ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Go(Golang)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณ ๋ถ€ํ•˜ ๋ฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•„์ˆ˜์ ์ธ ๋†€๋ผ์šด ํ™•์žฅ์„ฑ๊ณผ ๊ณ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
Go์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” | AppMaster