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์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํฌ์ธํฐ
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): ์ฒ๋ฆฌ๋์ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์ ๋น ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํธ ์๋ฅผ ์ค์ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฒค์น๋งํฌ ํ ์คํธ์๋ ๋ค์ ๋จ๊ณ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
- ๋ฒค์น๋งํนํ ๊ธฐ๋ฅ์ ํ์ํ ํ๊ฒฝ ๋ฐ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํฉ๋๋ค.
- ๋ฒค์น๋งํฌ ์ธก์ ์์ ์ค์ ์๊ฐ์ ์ ๊ฑฐํ๋ ค๋ฉด ํ์ด๋จธ(
b.ResetTimer())๋ฅผ ์ฌ์ค์ ํ์ญ์์ค. - ์ฃผ์ด์ง ๋ฐ๋ณต ํ์๋ก ๋ฒค์น๋งํฌ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
for i := 0; i < bN; i++. - ์ ์ ํ ์ ๋ ฅ ๋ฐ์ดํฐ๋ก ๋ฒค์น๋งํน ์ค์ธ ๊ธฐ๋ฅ์ ์คํํฉ๋๋ค.
๋ฒค์น๋งํฌ ํ ์คํธ ์คํ
์คํํ๋ ค๋ ๋ฒค์น๋งํฌ ๊ธฐ๋ฅ๊ณผ ์ผ์นํ๋ ์ ๊ท ํํ์์ด ๋ค๋ฐ๋ฅด๋ -bench ํ๋๊ทธ๋ฅผ ํฌํจํ์ฌ go test ๋ช
๋ น์ผ๋ก ๋ฒค์น๋งํฌ ํ
์คํธ๋ฅผ ์คํํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
go test -bench=.
์ด ๋ช ๋ น์ ํจํค์ง์ ๋ชจ๋ ๋ฒค์น๋งํฌ ๊ธฐ๋ฅ์ ์คํํฉ๋๋ค. ํน์ ๋ฒค์น๋งํฌ๋ฅผ ์คํํ๋ ค๋ฉด ํด๋น ์ด๋ฆ๊ณผ ์ผ์นํ๋ ์ ๊ท์์ ์ ๊ณตํ์ญ์์ค. ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ ํจ์ ์ด๋ฆ, ๋ฐ๋ณต ํ์, ์์ ๋น ์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น(๊ธฐ๋ก๋ ๊ฒฝ์ฐ)์ ๋ณด์ฌ์ฃผ๋ ํ ํ์์ผ๋ก ํ์๋ฉ๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ ๋ถ์
๋ฒค์น๋งํฌ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ํน์ฑ์ ์ดํดํ๊ณ ๊ฐ์ ์ด ํ์ํ ์์ญ์ ์๋ณํฉ๋๋ค. ๋ค์ํ ๊ตฌํ ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ๋น๊ตํ๊ณ , ์ต์ ํ์ ์ํฅ์ ์ธก์ ํ๊ณ , ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ ๋ ์ฑ๋ฅ ํ๊ท๋ฅผ ๊ฐ์งํฉ๋๋ค.
Go ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ถ๊ฐ ํ
๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ต์ ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒค์น๋งํนํ๋ ๊ฒ ์ธ์๋ ๋ค์์ 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์๋ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ ์ฑ๋ฅ ํน์ฑ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ pprof์ ๊ฐ์ ๊ธฐ๋ณธ ์ ๊ณต ๋๊ตฌ๊ฐ ์์ด ์ ๋ณด์ ์ ๊ฐํ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
Go์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ต์ ํํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ฌํ ๋นํ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ๊ณ , ๋ถํ์ํ ํ ๋น์ ํผํ๊ณ , ํฌ์ธํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. Go์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ฐ๋ฐ์๋ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ฒค์น๋งํน์ ํ๊ณ๋ฅผ ์ดํดํ๊ณ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์ํ ์กฐ๊ฑด์์ Go ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๋ถ์ํ๋ ํ๋ก์ธ์ค์ ๋๋ค. Go๋ ํ ์คํธ ํจํค์ง์ ๋ฒค์น๋งํน ์ง์ ๊ธฐ๋ฅ์ ๋ด์ฅํ๊ณ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋ง์ถคํ ๋ฒค์น๋งํฌ๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ณ ๋ถ์ํ ์ ์์ต๋๋ค.
AppMaster ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ธฐ ์ํด Go(Golang)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ณ ๋ถํ ๋ฐ ์ํฐํ๋ผ์ด์ฆ ์ฌ์ฉ ์ฌ๋ก์ ํ์์ ์ธ ๋๋ผ์ด ํ์ฅ์ฑ๊ณผ ๊ณ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.


