MasterClient.go

package staff

import (
	"encoding/json"
	"fmt"
	"net"
	"sync"

	"saseul/config"
	"saseul/ipc"
)

// MasterClient ๊ตฌ์กฐ์ฒด๋Š” ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค.
type MasterClient struct {
	client *ipc.TCPClient
	mu     sync.Mutex
}

var instance *MasterClient
var once sync.Once

// Instance ํ•จ์ˆ˜๋Š” MasterClient์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
// ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
func Instance() *MasterClient {
	once.Do(func() {
		instance = &MasterClient{
			client: ipc.NewTCPClient(),
		}
		instance.connect()
	})
	return instance
}

// connect ํ•จ์ˆ˜๋Š” ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— TCP ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
func (mc *MasterClient) connect() {
	mc.client.Connect(config.MasterAddr, config.MasterPort)
}

// Send ํ•จ์ˆ˜๋Š” ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
// ๋™๊ธฐํ™”๋œ ์ ‘๊ทผ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
// ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
// ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๊ณ  ์ „์†กํ•œ ํ›„ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
func (mc *MasterClient) Send(commandType string, data interface{}) (string, error) {
	mc.mu.Lock()
	defer mc.mu.Unlock()

	if !mc.client.IsConnected() {
		mc.connect()
	}

	command := ipc.NewTCPCommand(commandType, data)
	response, err := mc.client.Send(command)
	if err != nil {
		return "", err
	}

	return response, nil
}

์ฝ”๋“œ ์„ค๋ช…

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

์ฃผ์š” ๊ตฌ์กฐ์ฒด์™€ ํ•จ์ˆ˜ ์„ค๋ช…

๊ตฌ์กฐ์ฒด: MasterClient

  • MasterClient ๊ตฌ์กฐ์ฒด๋Š” ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค.

  • ํ•„๋“œ:

    • client: ipc.TCPClient ํƒ€์ž…์˜ ํด๋ผ์ด์–ธํŠธ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

    • mu: ๋™๊ธฐํ™”๋œ ์ ‘๊ทผ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฎคํ…์Šค์ž…๋‹ˆ๋‹ค.

๋ณ€์ˆ˜: instance์™€ once

  • instance: MasterClient์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

  • once: sync.Once ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋กœ, MasterClient ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜: Instance

  • Instance ํ•จ์ˆ˜๋Š” MasterClient์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ once.Do๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  connect ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ: connect

  • connect ๋ฉ”์„œ๋“œ๋Š” ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— TCP ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ: Send

  • Send ๋ฉ”์„œ๋“œ๋Š” ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋œ ์ ‘๊ทผ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด connect ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ipc.NewTCPCommand๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๊ณ , mc.client.Send๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ์ „์†กํ•œ ํ›„ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์š”์•ฝ

์ด ์ฝ”๋“œ๋Š” MasterClient ๊ตฌ์กฐ์ฒด๋ฅผ ํ†ตํ•ด ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ MasterClient ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, TCP ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ๋ช…๋ น์„ ์ „์†กํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ณ ๋ฃจํ‹ด์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์„ค๋ช…

  1. MasterClient ๊ตฌ์กฐ์ฒด:

    • ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, client ํ•„๋“œ๋กœ ipc.TCPClient ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • mu๋Š” ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋ฎคํ…์Šค์ž…๋‹ˆ๋‹ค.

  2. ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค:

    • instance์™€ once๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MasterClient์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • Instance ํ•จ์ˆ˜๋Š” MasterClient์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , connect ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. connect ๋ฉ”์„œ๋“œ:

    • ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. config.MasterAddr์™€ config.MasterPort๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. Send ๋ฉ”์„œ๋“œ:

    • commandType๊ณผ data๋ฅผ ๋ฐ›์•„์„œ ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ค‘์—๋Š” ๋ฎคํ…์Šค๋ฅผ ์ž ๊ธˆ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋™์‹œ ์ ‘๊ทผ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

    • ์—ฐ๊ฒฐ์ด ๋Š์–ด์ ธ ์žˆ์œผ๋ฉด connect ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์‹œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ipc.NewTCPCommand๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๊ณ , mc.client.Send๋ฅผ ํ†ตํ•ด ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

    • ์‘๋‹ต์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Last updated