Skip to content

Latest commit

ย 

History

History
145 lines (117 loc) ยท 5.72 KB

File metadata and controls

145 lines (117 loc) ยท 5.72 KB

context ๊ธฐ๋ณธ ๊ฐœ๋…

context ํŒจํ‚ค์ง€๊ฐ€ ํ•˜๋Š” ์—ญํ• 

  • ์‹œ๊ฐ„ ์ดˆ๊ณผ, ์ทจ์†Œ, ์š”์ฒญ ๋ฒ”์œ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ
  • ๊ณ ๋ฃจํ‹ด ์ƒ๋ช…์ฃผ๊ธฐ ์ œ์–ด
  • HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์š”์ฒญ ์ทจ์†Œํ–ˆ์„ ์‹œ, ๊ทธ์™€ ๊ด€๋ จ๋œ DB์กฐํšŒ/API ํ˜ธ์ถœ ๋“ฑ๋„ ์ทจ์†Œํ•ด์•ผ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ํ•˜์ง€ ์•Š์Œ
  • DB์ฟผ๋ฆฌ, ํƒ€์ž„์•„์›ƒ ๊ด€๋ฆฌ
    • ํŠน์ • ์ž‘์—…์ด ๋„ˆ๋ฌด์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ํƒ€์ž„์•„์›ƒ ์„ค์ •ํ•ด์„œ ์ž๋™์œผ๋กœ ์ข…๋ฃŒํ•ด์•ผ ํ•จ

context ํŒจํ‚ค์ง€ ์ฃผ๋ชฉ์ 

  • Context ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ , ์บ”์Šฌ๋ ˆ์ด์…˜(cancellation, ์ทจ์†Œ) ์ง€์›
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ(gRPC)

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

  • Deadline(), Done(), Err(), Value() ๋กœ ๊ตฌ์„ฑ๋œ ์ธํ„ฐํŽ˜์ด์Šค

context ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์ƒ์„ฑ

  1. context.Background()
    • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋นˆ Context
    • ๋ณดํ†ต main() ํ•จ์ˆ˜๋‚˜ ์ดˆ๊ธฐ ์„ค์ •์—์„œ ์‚ฌ์šฉ
  2. context.TODO()
    • ์•„์ง ์–ด๋–ค Context๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅผ ๋•Œ ์ž„์‹œ๋กœ ์‚ฌ์šฉ

context๋ฅผ ์ด์šฉํ•œ ์ œ์–ด

  1. context.WithCancel(parent)
    • cancel()์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ชจ๋“  ์ž์‹ Context๋„ ์ทจ์†Œ๋จ
    • ์ž์‹ Goroutine์ด ๋ถ€๋ชจ๊ฐ€ ์ทจ์†Œ๋๋Š”์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์Œ
  2. context.WithTimeout(parent, duration)
    • ์„ค์ •ํ•œ ์‹œ๊ฐ„(duration)์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์ทจ์†Œ๋จ
  3. context.WithDeadline(parent, time)
    • ํŠน์ • ์‹œ๊ฐ(time)๊นŒ์ง€ Context๊ฐ€ ์œ ํšจ
  4. context.WithValue(parent, key, value)
    • Context์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ์ž์‹ Goroutine์— ์ „๋‹ฌ

context๋ฅผ ํ™œ์šฉํ•œ ์ œ์–ด

ํ† ํ”ฝ ์ฝ์œผ๋ฉฐ ์ƒ๊ธด ์˜๋ฌธ ChatGPT...

๊ณ ๋ฃจํ‹ด ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์— ๋Œ€ํ•ด

๊ณ ๋ฃจํ‹ด์€ ๋ถ€๋ชจ์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค๊ณ  ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”๋ฐ, context๋ฅผ ์„ค๋ช…ํ• ๋•Œ๋Š” ContextํŒจํ‚ค์ง€๋กœ ๋ถ€๋ชจ๊ณ ๋ฃจํ‹ด์˜ ์‹คํ–‰์ด ๋๋‚ฌ์„ ๋•Œ ์ž์‹ ๊ณ ๋ฃจํ‹ด์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค๊ณ  ์–˜๊ธฐํ•˜๊ณ  ์žˆ์–ด. ๋‚ด๊ฐ€ ๊ณ ๋ฃจํ‹ด์— ๋Œ€ํ•ด ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”๊ฑธ๊นŒ? contextํŒจํ‚ค์ง€๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ์–˜๊ธฐํ•˜๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ณ ๋ฃจํ‹ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ค˜

๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ

  • gorutine์—๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ๋งž์Œ
  • ๋‹ค๋งŒ contextํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด์„œ ๊ณ ๋ฃจํ‹ด์— ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

chat gpt ์ „๋ฌธ

๋„ˆ์˜ ์ดํ•ด๊ฐ€ ๋งž์•„. Go์˜ Goroutine์€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋ผ. ํ•˜์ง€๋งŒ context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ Goroutine์ด ์ข…๋ฃŒ๋  ๋•Œ ์ž์‹ Goroutine๋„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์ด๊ฑธ โ€œ๋ถ€๋ชจ-์ž์‹ Goroutine ๊ด€๊ณ„โ€๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ์•ผ.

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

package main

import (
	"fmt"
	"time"
)

func worker() {
	for i := 0; i < 5; i++ {
		fmt.Println("์ž‘์—… ์ค‘...")
		time.Sleep(1 * time.Second)
	}
}

func main() {
	go worker()
	fmt.Println("๋ฉ”์ธ ํ•จ์ˆ˜ ์ข…๋ฃŒ")
}

์‹คํ–‰ ๊ฒฐ๊ณผ (๋ฉ”์ธ ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋จ)

๋ฉ”์ธ ํ•จ์ˆ˜ ์ข…๋ฃŒ
(๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๋จ, worker() ์‹คํ–‰ ์•ˆ ๋จ!)
  • worker() Goroutine์ด ๋ฉ”์ธ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ๊ณ„์† ์‹คํ–‰๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋ฉ”์ธ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Œ.
  • ์ฆ‰, ๊ณ ๋ฃจํ‹ด ์ž์ฒด๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†์ง€๋งŒ, ๋ฉ”์ธ Goroutine(ํ”„๋กœ์„ธ์Šค์˜ ์‹œ์ž‘์ )์ด ๋๋‚˜๋ฉด ๋ชจ๋“  Goroutine์ด ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Œ.

๐Ÿ”น context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ Goroutine์ด ์ข…๋ฃŒ๋  ๋•Œ ์ž์‹ Goroutine์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Œ Goroutine์ด ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ Goroutine์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์ž์‹ Goroutine์ด ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด. ์ด๋•Œ context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ Goroutine์˜ ์ข…๋ฃŒ ์‹œ์ ์— ๋งž์ถฐ ์ž์‹ Goroutine๋„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.

โœ… Context๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ชจ-์ž์‹ Goroutine ์ œ์–ด ์˜ˆ์ œ

package main

import (
	"context"
	"fmt"
	"time"
)

func worker(ctx context.Context) {
	for {
		select {
		case <-ctx.Done(): // ๋ถ€๋ชจ Context๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์—ฌ๊ธฐ์„œ ์ข…๋ฃŒ๋จ
			fmt.Println("์ž‘์—…์ด ์ทจ์†Œ๋จ!")
			return
		default:
			fmt.Println("์ž‘์—… ์ˆ˜ํ–‰ ์ค‘...")
			time.Sleep(1 * time.Second)
		}
	}
}

func main() {
	// WithCancel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ทจ์†Œ ๊ฐ€๋Šฅํ•œ Context ์ƒ์„ฑ
	ctx, cancel := context.WithCancel(context.Background())

	go worker(ctx) // worker Goroutine ์‹คํ–‰

	time.Sleep(3 * time.Second) // 3์ดˆ๊ฐ„ ์‹คํ–‰ ํ›„

	cancel() // Context ์ทจ์†Œ -> worker Goroutine๋„ ์ข…๋ฃŒ๋จ

	time.Sleep(1 * time.Second) // ์ข…๋ฃŒ ํ™•์ธ์„ ์œ„ํ•œ ๋Œ€๊ธฐ
	fmt.Println("๋ฉ”์ธ ํ•จ์ˆ˜ ์ข…๋ฃŒ")
}

๐Ÿ›  ์‹คํ–‰ ๊ฒฐ๊ณผ

์ž‘์—… ์ˆ˜ํ–‰ ์ค‘...
์ž‘์—… ์ˆ˜ํ–‰ ์ค‘...
์ž‘์—… ์ˆ˜ํ–‰ ์ค‘...
์ž‘์—…์ด ์ทจ์†Œ๋จ!
๋ฉ”์ธ ํ•จ์ˆ˜ ์ข…๋ฃŒ

์ด์ œ ๋ถ€๋ชจ Goroutine(main())์ด cancel()์„ ํ˜ธ์ถœํ•˜๋ฉด, worker() Goroutine๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ๋จ!

์ฆ‰, context๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถ€๋ชจ Goroutine์ด ์ข…๋ฃŒ๋  ๋•Œ ์˜๋„์ ์œผ๋กœ ์ž์‹ Goroutine๋„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“  ๊ฒƒ์ด์•ผ.

๐Ÿ”น ์ •๋ฆฌ: ์™œ โ€œ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„โ€๋ผ๊ณ  ๋ถ€๋ฅผ๊นŒ? โœ” Goroutine์€ ์›๋ž˜ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†์Œ! โœ” ํ•˜์ง€๋งŒ context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • Goroutine(๋ถ€๋ชจ)์ด ์ทจ์†Œ๋˜์—ˆ์„ ๋•Œ, ์—ฐ๊ด€๋œ ๋‹ค๋ฅธ Goroutine(์ž์‹)์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Œ โœ” ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๋ฉด โ€œ๋…ผ๋ฆฌ์ ์ธ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„โ€ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•จ ์ฆ‰, context๋Š” Goroutine์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ โ€œ๋…ผ๋ฆฌ์ ์ธ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๋„๊ตฌโ€ ๋ผ๊ณ  ๋ณด๋ฉด ๋ผ. ๐Ÿ˜†