TCPCommand.go

package ipc

import (
	"crypto/rand"
	"encoding/hex"
	"errors"
	"fmt"
	"io"
	"time"
)

const (
	IDLengthLimit   = 256
	TypeLengthLimit = 256
)

type TCPCommand struct {
	ID     string
	Type   string
	Data   interface{}
	Sender io.ReadWriteCloser
}

func NewTCPCommand(commandType string, data interface{}) (*TCPCommand, error) {
	if !isValidType(commandType) {
		return nil, errors.New("invalid type")
	}

	return &TCPCommand{
		ID:   generateID(),
		Type: commandType,
		Data: data,
	}, nil
}

func generateID() string {
	timeHex := hex.EncodeToString([]byte(fmt.Sprintf("%x", time.Now().UnixNano())))
	randomBytes := make([]byte, 16)
	rand.Read(randomBytes)
	randomHex := hex.EncodeToString(randomBytes)
	return timeHex + randomHex
}

func isValidID(id string) bool {
	return len(id) < IDLengthLimit
}

func isValidType(commandType string) bool {
	return len(commandType) < TypeLengthLimit
}

func isValidSender(sender io.ReadWriteCloser) bool {
	return sender != nil
}

func (c *TCPCommand) SetID(id string) error {
	if !isValidID(id) {
		return errors.New("invalid id")
	}
	c.ID = id
	return nil
}

func (c *TCPCommand) SetType(commandType string) error {
	if !isValidType(commandType) {
		return errors.New("invalid type")
	}
	c.Type = commandType
	return nil
}

func (c *TCPCommand) SetData(data interface{}) {
	c.Data = data
}

func (c *TCPCommand) SetSender(sender io.ReadWriteCloser) error {
	if !isValidSender(sender) {
		return errors.New("invalid sender")
	}
	c.Sender = sender
	return nil
}

func (c *TCPCommand) GetID() string {
	return c.ID
}

func (c *TCPCommand) GetType() string {
	return c.Type
}

func (c *TCPCommand) GetData() interface{} {
	return c.Data
}

func (c *TCPCommand) GetSender() io.ReadWriteCloser {
	return c.Sender
}

์ฃผ์š” ์ƒ์ˆ˜

  • IDLengthLimit: ID์˜ ์ตœ๋Œ€ ๊ธธ์ด.

  • TypeLengthLimit: ํƒ€์ž…์˜ ์ตœ๋Œ€ ๊ธธ์ด.

TCPCommand ๊ตฌ์กฐ์ฒด

  • ID: ๋ช…๋ น์–ด์˜ ๊ณ ์œ  ์‹๋ณ„์ž.

  • Type: ๋ช…๋ น์–ด์˜ ํƒ€์ž….

  • Data: ๋ช…๋ น์–ด์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ.

  • Sender: ๋ช…๋ น์–ด๋ฅผ ๋ณด๋‚ธ ์†ก์‹ ์ž. ์†ก์‹ ์ž๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๋ฐ ๋ฉ”์„œ๋“œ

NewTCPCommand ํ•จ์ˆ˜

  • ์—ญํ• : ์ƒˆ๋กœ์šด TCPCommand ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…:

    • ๋ช…๋ น์–ด ํƒ€์ž…์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜๋ฉด ์ƒˆ๋กœ์šด TCPCommand ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ๊ณ ์œ ํ•œ ID์™€ ์ฃผ์–ด์ง„ ํƒ€์ž…, ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

generateID ํ•จ์ˆ˜

  • ์—ญํ• : ๊ณ ์œ ํ•œ ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…:

    • ํ˜„์žฌ ์‹œ๊ฐ„์„ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • 16๋ฐ”์ดํŠธ์˜ ๋ฌด์ž‘์œ„ ๊ฐ’์„ ์ƒ์„ฑํ•˜์—ฌ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋‘ ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ID๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

isValidID ํ•จ์ˆ˜

  • ์—ญํ• : ID์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ID์˜ ๊ธธ์ด๊ฐ€ ์ œํ•œ ๊ธธ์ด๋ณด๋‹ค ์งง์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

isValidType ํ•จ์ˆ˜

  • ์—ญํ• : ๋ช…๋ น์–ด ํƒ€์ž…์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ๋ช…๋ น์–ด ํƒ€์ž…์˜ ๊ธธ์ด๊ฐ€ ์ œํ•œ ๊ธธ์ด๋ณด๋‹ค ์งง์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

isValidSender ํ•จ์ˆ˜

  • ์—ญํ• : ์†ก์‹ ์ž์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ์†ก์‹ ์ž๊ฐ€ nil์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

SetID ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ID๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…:

    • ์ฃผ์–ด์ง„ ID๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜๋ฉด ID๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

SetType ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ํƒ€์ž…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…:

    • ์ฃผ์–ด์ง„ ํƒ€์ž…์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜๋ฉด ํƒ€์ž…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

SetData ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ๋ช…๋ น์–ด์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

SetSender ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ์†ก์‹ ์ž๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…:

    • ์ฃผ์–ด์ง„ ์†ก์‹ ์ž๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ํšจํ•˜๋ฉด ์†ก์‹ ์ž๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

GetID ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ๋ช…๋ น์–ด์˜ ID๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

GetType ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ๋ช…๋ น์–ด์˜ ํƒ€์ž…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

GetData ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ๋ช…๋ น์–ด์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

GetSender ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ๋ช…๋ น์–ด์˜ ์†ก์‹ ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค๋ช…: ๋ช…๋ น์–ด์˜ ์†ก์‹ ์ž๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์š”์•ฝ

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

Last updated