ํ๋ ๋ถ๋ค์๊ฒ
๊ฐ๋จํ
์ด ๊ธฐ์ฌ์์๋ ์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก์ ๊ธฐ๋ณธ ์ฌํญ์ ๋
ผ์ํ๊ณ ์ด์ ๋ํ ์์ ๋ฅผ ๊ตฌํํฉ๋๋ค.
์ ์ก ๊ณ์ธต ํ๋กํ ์ฝ
์๋ก ๋ค๋ฅธ ํธ์คํธ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก์ธ์ค ๊ฐ์ ๋ ผ๋ฆฌ์ ์ฐ๊ฒฐ์ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ด์ ์์ ๋ณด๋ฉด ๋ ผ๋ฆฌ์ ์ฐ๊ฒฐ์ ํ๋ก์ธ์ค๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ ์ฑ๋์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด๋ (ํ์ํ ๊ฒฝ์ฐ) ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต ๋ฉ์์ง๋ฅผ ์กฐ๊ฐ์ผ๋ก ๋ถํ ํ๊ณ ๊ฐ ์กฐ๊ฐ์ ์ ์ก ๊ณ์ธต ํค๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ์ํ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ ์ก ๊ณ์ธต์ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ณด๋ธ ์ฌ๋์ ๋คํธ์ํฌ ๊ณ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค. ์ฌ๊ธฐ์ ์ธ๊ทธ๋จผํธ๋ ๋คํธ์ํฌ ๊ณ์ธต ํจํท(๋ฐ์ดํฐ๊ทธ๋จ)์ ์บก์ํ๋์ด ์ ์ก๋ฉ๋๋ค. ์์ ์ธก์์ ๋คํธ์ํฌ ๊ณ์ธต์ ๋ฐ์ดํฐ๊ทธ๋จ์์ ์ ์ก ๊ณ์ธต ์ธ๊ทธ๋จผํธ๋ฅผ ์ถ์ถํ์ฌ ์ด๋ฅผ ์ ์ก ๊ณ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค. ๋ค์์ผ๋ก, ์ ์ก ๊ณ์ธต์ ์์ ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก์ ์๋ฆฌ
์์ ํ ์์ ํ ์ฑ๋์ ํตํ ์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก
๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ์ ๋๋ค. ์ก์ ์ธก์ ๋จ์ํ ์์ ๊ณ์ธต์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ , ์ด๋ฅผ ํฌํจํ๋ ํจํท์ ์์ฑํ์ฌ ์ฑ๋๋ก ๋ณด๋ ๋๋ค.
์๋ฒ
package main
import (
"log"
"net"
)
func main() {
// IP-ะฐะดัะตั ัะตัะฒะตัะฐ ะธ ะฟะพัั
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// ัะพะทะดะฐะตะผ ัะพะบะตั ั ะฟะพััะพะผ
serverConn, err := net.ListenUDP("udp", serverAddr)
if err != nil {
log.Fatal(err)
}
// ะพัะปะพะถะตะฝะฝะพะต ะทะฐะบัััะธะต ัะพะตะดะธะฝะตะฝะธั
defer serverConn.Close()
// ัะพะทะดะฐะตะผ ะฑััะตั ะดะปั ะดะฐะฝะฝัั
buf := make([]byte, 1024)
// ะถะดะตะผ ัะพะตะดะธะฝะตะฝะธะต
for {
// ัะธัะฐะตะผ ะทะฐะฟัะพั
n, addr, err := serverConn.ReadFromUDP(buf)
// ะฟะตัะตะดะฐะตะผ ะดะฐะฝะฝัะต ะฒ ะะะ ะฅะะะ ััะพะฒะตะฝั: ะฒ ะฝะฐัะตะผ ัะปััะฐะต stdout
println(string(buf[0:n]), " form ", addr.IP.String())
if err != nil {
log.Fatal(err)
}
// ะพัะฒะตัะฐ ะฝะตั, ั.ะบ. ััะพ UDP + ะฝะฐะดะตะถะฝัะน ะบะฐะฝะฐะป
}
}
ํด๋ผ์ด์ธํธ
package main
import (
"fmt"
"log"
"net"
"time"
)
func main() {
// IP-ะฐะดัะตั ัะตัะฒะตัะฐ ะธ ะฟะพัั
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// ะปะพะบะฐะปัะฝัะน IP-ะฐะดัะตั ะธ ะฟะพัั
localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
// ัััะฐะฝะพะฒะบะฐ ัะพะตะดะธะฝะตะฝะธั
conn, err := net.DialUDP("udp", localAddr, serverAddr)
if err != nil {
log.Fatal(err)
}
// ะพัะปะพะถะตะฝะฝะพะต ะทะฐะบัััะธะต ัะพะตะดะธะฝะตะฝะธั
defer conn.Close()
for {
// ะฟะพะปััะตะฝะธะต ะดะฐะฝะฝัั
ะพั ะะะ ะฅะะะะ ััะพะฒะฝั
fmt.Print("ะะฒะตะดะธัะต ัััะพัะฝะพะต ะฟัะตะดะปะพะถะตะฝะธะต > ")
var msg string
_, err := fmt.Scanf("%s", &msg)
if err != nil {
log.Fatal(err)
}
// ะฟะตัะตะดะฐะตััั ะฟะพัะพะบ ะฑะฐะนั, ะฐ ะฝะต ัััะพะบะฐ
buf := []byte(msg)
// ะทะฐะฟะธัั (ะฟะตัะตะดะฐัะฐ) ะฒ ัะพะตะดะธะฝะตะฝะธะต
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
// 1 ัะตะบัะฝะดะพัะบั
time.Sleep(time.Second * 1)
}
}
์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฑ๋์ ํตํ ์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก
๋ค์ ๋จ๊ณ๋ ์ ์ก๋ ๋ชจ๋ ํจํท์ด ์ ์ก๋ ์์๋๋ก ์์ ๋์ง๋ง ์ฑ๋์ด ๋๋๋ก ์๊ณก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค๋ ์ฌ์ค๋ก ์ธํด ํจํท์ ๋นํธ๊ฐ ์์๋ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ค์ ๋ฉ์ปค๋์ฆ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ค๋ฅ ๊ฐ์ง;
- ํผ๋๋ฐฑ;
- ์ฌ์ ์ก.
์ ์ก์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๊ธฐ ์ํ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ถ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ ์ ์ก ํ๋กํ ์ฝ์ ARQ(์๋ ๋ฐ๋ณต ์์ฒญ) ํ๋กํ ์ฝ์ด๋ผ๊ณ ํฉ๋๋ค.
๋ํ ์์ ์๊ฐ ๋ง์ง๋ง ํจํท ์ ์ก ๊ฒฐ๊ณผ์ ๋ํ ์ ๋ณด๋ฅผ ์์ ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ์์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
TCP์์๋ ์ฌ์ฉ๋๋ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ ํจํท์ ์ํ์ค ๋ฒํธ๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ ํจํท์ ์ ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
ํจํท ์๊ณก ๋ฐ ์์ค์ด ๋ฐ์ํ ์ ์๋ ์ ๋ขฐํ ์ ์๋ ์ฑ๋์ ํตํ ์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก
๋ถํํ๊ฒ๋ ์๊ณก๊ณผ ํจ๊ป ๋คํธ์ํฌ์ ํจํท ์์ค์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
- ํจํท ์์ค ์ฌ์ค์ ๊ฒฐ์ ํ๊ณ ;
- ์์ค๋ ํจํท์ ์์ ์์๊ฒ ๋ค์ ์ ๋ฌํฉ๋๋ค.
๋ํ, ํจํค์ง ๋ถ์ค ์ธ์๋ ์์์ฆ ๋ถ์ค ๊ฐ๋ฅ์ฑ์ ๋๋นํด์ผ ํ๋ฉฐ, ๋ถ์ค๋ ๊ฒ์ด ์๋ ๊ฒฝ์ฐ ๋ฐฐ์ก์ด ์๋นํ ์ง์ฐ๋ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ๋์ผํ ์์
์ด ์ํ๋ฉ๋๋ค. ์ฆ, ํจํท์ด ์ฌ์ ์ก๋ฉ๋๋ค. ์๊ฐ์ ์ ์ดํ๊ธฐ ์ํด ์ด ๋ฉ์ปค๋์ฆ์ ๋๊ธฐ ๊ฐ๊ฒฉ์ ๋์ ๊ฒฐ์ ํ ์ ์๋ ์นด์ดํธ๋ค์ด ํ์ด๋จธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ํจํค์ง์
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)
์ก์ ์ธก์ ํจํท์ด ์ ์ก๋ ๋๋ง๋ค(์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๋ชจ๋) ํ์ด๋จธ๋ฅผ ์์ํ๊ณ ํ์ด๋จธ์ ์ค๋จ์ ์ฒ๋ฆฌํ๊ณ ์ค์งํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ ์ ์ก ํ๋กํ ์ฝ์ ์ฃผ์ ๊ฐ๋ ์ ์ต์ํด์ก์ต๋๋ค.
- ์ฒดํฌ์ฌ;
- ํจํค์ง์ ์์ ๋ฒํธ;
- ํ์ด๋จธ;
- ๊ธ์ ์ ์ด๊ณ ๋ถ์ ์ ์ธ ์์์ฆ.
ํ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ๊ฐ ์๋๋๋ค!
ํ์ดํ๋ผ์ด๋์ ํตํ ์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก ํ๋กํ ์ฝ
์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ณ ๋ คํ ๋ณํ์์๋ ์ ๋ขฐํ ์ ์๋ ์ ๋ฌ ํ๋กํ ์ฝ์ด ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค. RTT๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํต์ ์ฑ๋์์ ์ ๊ณตํ๋ ์ ์ก ์๋๊ฐ "๋๋ ค์ง๊ธฐ" ์์ํฉ๋๋ค. ํจ์จ์ฑ์ ๋์ด๊ณ ํต์ ์ฑ๋ ์ฉ๋์ ๋ ์ ํ์ฉํ๊ธฐ ์ํด ํ์ดํ๋ผ์ด๋์ด ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ดํ๋ผ์ด๋์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์์ต๋๋ค.
- ์ ์ก๋ ๋ชจ๋ ํจํท(์ฌ์ ์ก ์ ์ธ)์ ๊ณ ์ ํ๊ฒ ์๋ณํด์ผ ํ๋ฏ๋ก ์ํ์ค ๋ฒํธ์ ๋ฒ์๋ฅผ ๋๋ฆฝ๋๋ค.
- ์ก์ ์ธก๊ณผ ์์ ์ธก์ ๋ฒํผ๋ฅผ ๋๋ ค์ผ ํ ํ์์ฑ.
์ํ์ค ๋ฒํธ ๋ฒ์์ ๋ฒํผ ํฌ๊ธฐ ์๊ตฌ ์ฌํญ์ ํจํท ์์, ์์ค ๋ฐ ์ง์ฐ์ ๋ํ ์๋ต์ผ๋ก ํ๋กํ ์ฝ์ด ์ํํ๋ ์์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ํ์ดํ๋ผ์ด๋์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- N ํจํท์ ๋ค์ ๋ฐํํฉ๋๋ค.
- ์ ํ์ ๋ฐ๋ณต.
N ํจํท์ผ๋ก ๋์๊ฐ๊ธฐ - ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํ๋กํ ์ฝ
๋ฐ์ ์๋ ์ธ ๊ฐ์ง ์ ํ์ ์ด๋ฒคํธ๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค.
- ๋ ๋์ ์์ค์ ํ๋กํ ์ฝ๋ก ํธ์ถํฉ๋๋ค. ๋ฐ์ดํฐ ์ ์ก ๊ธฐ๋ฅ์ด "์์์" ํธ์ถ๋๋ฉด ์ก์ ์ธก์์๋ ๋จผ์ ์๋์ฐ๊ฐ ์ฑ์์ง๋ ์ ๋(์ฆ, ์์ ๋๊ธฐ ์ค์ธ N๊ฐ์ ์ ์ก ๋ฉ์์ง๊ฐ ์๋์ง)๋ฅผ ํ์ธํฉ๋๋ค. ์ฐฝ์ด ๋น์ด ์์ผ๋ฉด ์๋ก์ด ํจํท์ด ์์ฑ๋์ด ์ ์ก๋๋ฉฐ, ๋ณ์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ก์ ์ธก์์ ์์ ๊ณ์ธต์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ฉฐ ์ด๋ ์ฐฝ์ด ๊ฐ๋ ์ฐผ๋ค๋ ์๋ฌต์ ์ธ ํ์์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ ๊ณ์ธต์ ์ผ์ ์๊ฐ์ด ์ง๋ ํ ๋ค์ ๋ฐ์ดํฐ ์ ์ก์ ์๋ํฉ๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ ์กํ๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋งํ๊ฑฐ๋ ์ฐฝ์ด ๋น์ด ์์ ๋๋ง ์์ ๊ณ์ธต์ด ์ ์ก ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋๋ก ํ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ(์: ์ธ๋งํฌ์ด ๋๋ ํ๋๊ทธ)์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. .
- ํ์ธ์ ๋ฐ๊ณ ์์ต๋๋ค. ํ๋กํ ์ฝ์์ ์ํ์ค ๋ฒํธ๊ฐ N์ธ ํจํท์ ๊ฒฝ์ฐ ์ํ์ค ๋ฒํธ๊ฐ N๋ณด๋ค ์์ ๋ชจ๋ ํจํท์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ๋์์์ ๋ํ๋ด๋ ์ผ๋ฐ ์น์ธ์ด ๋ฐํ๋ฉ๋๋ค.
- ๋๊ธฐ ๊ฐ๊ฒฉ์ด ๋ง๋ฃ๋์์ต๋๋ค. ํจํท ๋ฐ ์์ ์ ์์ค ๋ฐ ์ง์ฐ ์ฌ์ค์ ํ์ธํ๊ธฐ ์ํด ํ๋กํ ์ฝ์ ํ์ด๋จธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ๊ฐ๊ฒฉ์ด ๋ง๋ฃ๋๋ฉด ๋ณด๋ด๋ ์ชฝ์์๋ ์ ์ก๋ ๋ชจ๋ ์น์ธ๋์ง ์์ ํจํท์ ๋ค์ ๋ณด๋ ๋๋ค.
์ ํ์ ๋ฐ๋ณต
์ฐฝ ํฌ๊ธฐ์ ์ฒ๋ฆฌ๋-์ ํ ์ง์ฐ ๊ณฑ์ด ํฐ ๊ฒฝ์ฐ ํ์ดํ๋ผ์ธ์ ๋ง์ ์์ ํจํท์ด ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋จ์ผ ํจํท ์ค๋ฅ๋ก ์ธํด ๋ง์ ์์ ํจํท์ด ์ฌ์ ์ก๋ ์ ์์ผ๋ฉฐ ๊ทธ ์ค ๋๋ถ๋ถ์ ํ์ํ์ง ์์์ต๋๋ค.
์
์๋จ
์๋ฒ
package main
import (
"bufio"
"fmt"
"log"
"net"
"strings"
)
func main() {
// ัะพะทะดะฐะตะผ ัะพะบะตั ั ะฟะพััะพะผ
ln, err := net.Listen("tcp", ":8081")
if err != nil {
log.Fatalln(err)
}
// ะพะถะธะดะฐะฝะธะต ะฒัะทะพะฒะฐ
conn, _ := ln.Accept()
for {
// ััะธััะฒะฐะฝะธะต ะดะฐะฝะฝัั
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// ะฒัะฒะพะด ัะพะพะฑัะตะฝะธั ะฒ stdout
fmt.Print("Message Received:", string(msg))
// ะฟะตัะตะฒะพะด ัััะพะบะธ ะฒ ะฒะตัั
ะฝะธะน ัะตะณะธััั
newMsg := strings.ToUpper(msg)
// ะพัะฟัะฐะฒะบะฐ ะดะฐะฝะฝัั
conn.Write([]byte(newMsg + "n"))
}
}
ํด๋ผ์ด์ธํธ
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
)
func main() {
// ัััะฐะฝะพะฒะบะฐ ัะพะตะดะธะฝะตะฝะธั
conn, err := net.Dial("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatalln(err)
}
for {
// ััะธััะฒะฐะฝะธะต ะดะฐะฝะฝัั
ั stdin
reader := bufio.NewReader(os.Stdin)
fmt.Print("Text to send: ")
// ะฟะพัััะพัะฝะพ
text, err := reader.ReadString('n')
if err != nil {
log.Fatalln(err)
}
// ะพัะฟัะฐะฒะบะฐ
fmt.Fprintf(conn, text+"n")
// ะฟัะธะตะผ
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// ะฒัะฒะพะด ะฟะพะปััะตะฝะฝะพะณะพ ะพัะฒะตัะฐ
fmt.Print("Msg from Server: " + msg)
}
}
์ถ๋ ฅ
์์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ก ๋ฐ ์ฌ์ฉ์ ๋ณด์ฅํ๋ ๋ฉ์ปค๋์ฆ
๊ธฐ๊ตฌ
์ ์ฒญ, ๋๊ธ
์ํ ํฉ๊ณ
์ ์ก๋ ํจํท์์ ๋นํธ ์ค๋ฅ๋ฅผ โโ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ด๋จธ
์๊ฐ ์ด๊ณผ ๊ฐ๊ฒฉ์ ์นด์ดํธ๋ค์ดํ๊ณ ๋ง๋ฃ๋ ์๊ธฐ๋ฅผ ๋ํ๋
๋๋ค. ํ์๋ ์ ์ก ์ค์ ํจํท์ด๋ ๊ทธ ์์ ์ด ์์ค๋ ํ๋ฅ ์ด ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํจํท์ด ์ง์ฐ๋์ด ์ ๋ฌ๋์์ง๋ง ์์ค๋์ง ์์๊ฑฐ๋(์๊ฐ ์ด๊ณผ ๊ฐ๊ฒฉ์ ์กฐ๊ธฐ ๋ง๋ฃ) ์์ ์ด ์์ค๋ ๊ฒฝ์ฐ ์ฌ์ ์ก์ผ๋ก ์ธํด ์์ ์ธก์์ ํจํท์ด ์ค๋ณต๋ฉ๋๋ค.
์ผ๋ จ ๋ฒํธ
๋ฐ์ ์์์ ์์ ์๋ก ์ ์ก๋๋ ๋ฐ์ดํฐ ํจํท์ ์์ฐจ์ ๋ฒํธ ์ง์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ์์ ๋ ํจํท์ ์ํ์ค ๋ฒํธ์ ์ฐจ์ด๊ฐ ์์ผ๋ฉด ์์ ์๊ฐ ํจํท ์์ค์ ๊ฐ์งํ ์ ์์ต๋๋ค. ๋์ผํ ํจํท ์ํ์ค ๋ฒํธ๋ ํจํท์ด ์๋ก ์ค๋ณต๋์์์ ์๋ฏธํฉ๋๋ค.
ํ์ธ
์์ ์ธก์์ ์์ฑ๋๊ณ ์ก์ ์ธก์ ํด๋น ํจํท ๋๋ ํจํท ๊ทธ๋ฃน์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ๋์์์ ๋ํ๋
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์น์ธ์๋ ์ฑ๊ณต์ ์ผ๋ก ์์ ๋ ํจํท์ ์ํ์ค ๋ฒํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ํ๋กํ ์ฝ์ ๋ฐ๋ผ ๊ฐ์ธ ํ์ธ๊ณผ ๊ทธ๋ฃน ํ์ธ์ด ๊ตฌ๋ถ๋ฉ๋๋ค.
๋ถ์ ์ ์ธ ํ์ธ
์์ ์๊ฐ ๋ณด๋ธ ์ฌ๋์๊ฒ ํจํท์ด ์๋ชป ์์ ๋์์์ ์๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ถ์ ์น์ธ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์์ ๋์ง ์์ ํจํท์ ์ํ์ค ๋ฒํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
์ฐฝํธ, ์ปจ๋ฒ ์ด์ดํ
ํจํท ์ ์ก์ ์ฌ์ฉํ ์ ์๋ ์ํ์ค ๋ฒํธ์ ๋ฒ์๋ฅผ ์ ํํฉ๋๋ค. ๋ฉํฐ์บ์คํธ์ ํธ๋์
ฐ์ดํฌ๋ ์น์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋นํด ํ๋กํ ์ฝ ์ฒ๋ฆฌ๋์ ํฌ๊ฒ ๋๋ฆด ์ ์์ต๋๋ค. ์์ผ๋ก ์ดํด๋ณด๊ฒ ์ง๋ง ์ฐฝ ํฌ๊ธฐ๋ ์์ ์ธก์ ์์ ๋ฐ ๋ฒํผ๋ง ๊ธฐ๋ฅ๊ณผ ๋คํธ์ํฌ ๋ถํ ์์ค์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค.
๋คํธ์ํน์ ์ํด Go๋ฅผ ์ฌ์ฉํ๋ ์ถ๊ฐ ์
ะ
์ถ์ฒ : habr.com