Skip to content

โ† ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๐Ÿน Go (Golang) ์ƒ์„ธ ๊ฐ€์ด๋“œ โ€‹

"๊ตฌ๊ธ€์ด ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(MSA) ์ธํ”„๋ผ๋ฅผ ์œ„ํ•ด ๊นŽ์•„ ๋งŒ๋“  ๋‹จ๋‹จํ•˜๊ณ  ๊ทน๋„๋กœ ํšจ์œจ์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ ์–ธ์–ด"


๐Ÿ’ก 1. 30๋…„์ฐจ ์„ ๋ฐฐ์˜ ์‰ฌ์šด ์„ค๋ช… โ€‹

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

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

  • ๋น„์œ ํ•˜์ž๋ฉด: ๋ถˆํ•„์š”ํ•œ ๋ฌด๊ฒŒ์™€ ์˜ต์…˜์„ ์ „๋ถ€ ๋นผ๋ฒ„๋ฆฐ, ๋ ˆ์ด์‹ฑ๊ณผ ์†๋„ ๋ฐฐ๋‹ฌ๋งŒ์„ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ๋ผˆ๋Œ€ ๊ตต์€ ์Šคํฌ์ธ  ๋ฐ”์ดํฌ(์˜คํ† ๋ฐ”์ด)์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ 2. ์–ด๋””์— ์ฃผ๋กœ ์“ฐ์ด๋‚˜์š”? โ€‹

  1. ํด๋ผ์šฐ๋“œ ๋ฐ ์ธํ”„๋ผ ์‹œ์Šคํ…œ: ํ˜„๋Œ€ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ์˜ ํ‘œ์ค€ ๋„๊ตฌ์ธ Docker(๋„์ปค) ์™€ Kubernetes(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค) ๊ฐ€ 100% Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ณ ์„ฑ๋Šฅ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐฑ์—”๋“œ: ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์šฉ ์›น ์„œ๋ฒ„ API ๋ฐ MSA ํ™˜๊ฒฝ์˜ ํ•ต์‹ฌ ์—”์ง„์œผ๋กœ ๋งนํ™œ์•ฝํ•ฉ๋‹ˆ๋‹ค.

โš–๏ธ 3. ์žฅ์ ๊ณผ ๋‹จ์  (์„ ๋ฐฐ์˜ ์†”์ง ํ•œ๋งˆ๋””) โ€‹

  • ์žฅ์  (๊น”๋”ํ•จ๊ณผ ์•ˆ์ •์„ฑ):
    • ์••๋„์  ์„ฑ๋Šฅ & ๊ฒฝ๋Ÿ‰ํ™”: ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งค์šฐ ์ ๊ฒŒ ๋จน๊ณ , ๊ณ ๋ฃจํ‹ด(Goroutine)์ด๋ผ๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ๋™์‹œ์„ฑ ์—ฐ์‚ฐ์„ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์”ฉ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฌธ๋ฒ•์˜ ํ†ต์ผ: ์ •๋‹ต ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ํ•˜๋‚˜๋กœ ํ†ต์ผ๋˜๋ฏ€๋กœ, ๋ˆ„๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋”๋ผ๋„ ๋˜‘๊ฐ™์ด ์ฝ๊ธฐ ์‰ฌ์›Œ ํ˜‘์—… ํšจ์œจ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์  (์ง€๋‚˜์นœ ๋‹จ์ˆœํ™”):
    • ํด๋ž˜์Šค ์ƒ์† ์—†์Œ: ์ „ํ†ต์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ(Java ๋“ฑ)์˜ ์ƒ์† ๊ฐœ๋…์ด ์—†๊ณ  ๊ตฌ์กฐ์ฒด์™€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ง€์›ํ•˜์—ฌ ์ดˆ๊ธฐ ์„ค๊ณ„ ์‹œ ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ: ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ ์—๋Ÿฌ ์ฒดํฌ ๋ฌธ๊ตฌ(if err != nil)๊ฐ€ ์ˆ˜์—†์ด ๋ฐ˜๋ณต๋˜๋Š” ๊ท€์ฐฎ์Œ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ 4. ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ ์ฝ”๋“œ โ€‹

Go ์–ธ์–ด ํŠน์œ ์˜ ๊ฐ€๋ณ๊ณ  ์ง๊ด€์ ์ธ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ(Goroutine) ๊ธฐ๋ณธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

go
package main

import (
	"fmt"
	"time"
)

// ์ผ๊พผ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•  ๋…๋ฆฝ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
func sayHello(workerID int) {
	fmt.Printf("์ผ๊พผ %d๋ฒˆ: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์‹œ์ž‘!\n", workerID)
}

func main() {
	// 'go' ํ‚ค์›Œ๋“œ ํ•˜๋‚˜๋กœ ๋ฉ”์ธ ์‹คํ–‰ ํ๋ฆ„๊ณผ ๋ณ„๊ฐœ์ธ ์ดˆ๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ(๊ณ ๋ฃจํ‹ด)๋ฅผ ์ฆ‰์‹œ ๋„์›๋‹ˆ๋‹ค.
	go sayHello(1)
	go sayHello(2)

	// ๊ณ ๋ฃจํ‹ด์ด ์™„๋ฃŒ๋  ์‹œ๊ฐ„์„ ์ž ๊น ๋ฒŒ์–ด์ค๋‹ˆ๋‹ค.
	time.Sleep(100 * time.Millisecond)
	fmt.Println("๋ฉ”์ธ ์„œ๋ฒ„: ๋ชจ๋“  ๋น„๋™๊ธฐ ๋ช…๋ น ์ „์†ก ์™„๋ฃŒ!")
}

๐ŸŽฏ 5. ์ดˆ๋ณด์ž ์ถ”์ฒœ ๊ณต๋ถ€ ๋ฐฉํ–ฅ โ€‹

  1. Go๋Š” ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ์ธ A Tour of Go ์‚ฌ์ดํŠธ๊ฐ€ ์ •๋ง ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๊ผญ ํ•œ ๋ฒˆ ์ •์ฃผํ–‰ํ•ด ๋ณด์„ธ์š”.
  2. ํฌ์ธํ„ฐ(*, &)์˜ ๊ฐœ๋…์„ ๊ฐ€๋ณ๊ฒŒ ์ดํ•ดํ•œ ๋‹ค์Œ, **๊ตฌ์กฐ์ฒด(Struct)**์™€ **์ธํ„ฐํŽ˜์ด์Šค(Interface)**๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด ๋‹ค๋ฃจ๋Š” ์‹ค์Šต์„ ํ•ด๋ณด์„ธ์š”.
  3. Go์˜ ํ‘œ์ค€ ํŒจํ‚ค์ง€(net/http)๋งŒ์œผ๋กœ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•ด๋ณด๋Š” ์—ฐ์Šต์„ ํ•˜๋ฉด ์›น ๋ฐฑ์—”๋“œ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ์ €์ ˆ๋กœ ๊นจ์šฐ์ณ์ง‘๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ง€์‹DB โ€” ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์œ„ํ•ด