Native Record Values - kimjooyoon/meta-ontology-go GitHub Wiki

๊ธฐ๋ก์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ๋ณธ๋ฌธ์— ์ „๋‹ฌํ•˜๊ธฐ

์—…๋ฐ์ดํŠธ: 2026-10-04. ๊ฐœ๋ฐœ ํ›„๋ณด fa3c8927์˜ ๊ตฌํ˜„ #1223์€ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋๊ณ , main #1224์˜ ๋ฐฐํฌ ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์ณ main b629a664๋กœ ๋‘ ์‹คํ–‰๊ธฐ๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‹คํ–‰ ๋ช…๋ น์€ ์ด ์„ค์น˜ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ด€์ธก #9๋Š” 21๊ฐœ ๊ฒ€์‚ฌ ํ†ต๊ณผ ํ›„ ์—ฐ๊ตฌ main์œผ๋กœ ๋ณ‘ํ•ฉ๋์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค์น˜ ๋ฆฌ๋น„์ „๊ณผ ๋ณ‘ํ•ฉ ์ƒํƒœ๋Š” ํ˜„์žฌ ์ƒํƒœ์— ๋”ฐ๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ž‘์€ ์„œ๋ฅ˜๋ฅผ ์ž‘์—…๋Œ€ ์‚ฌ์ด์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค

Candidate๊ฐ€ ์ œ๋ชฉ๊ณผ ์ƒํƒœ๋ฅผ ๋‹ด๊ณ , ๋‹ค์Œ ํ™œ๋™์ด ์ƒํƒœ๋ฅผ ์ฝ์–ด Review๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ก์€ ์ด๋ฆ„๊ณผ ์ž๋ฆฌ๊ฐ€ ์ •ํ•ด์ง„ ์„œ๋ฅ˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ์€ ์„œ๋ฅ˜ ์ „์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๊ด€์ธก์—๋Š” ์‹ค์ œ ํ•„๋“œ๊ฐ’์ด ๋‚จ์Šต๋‹ˆ๋‹ค.

entity Candidate id "records://candidate" fields {
    field title id "records://candidate/title" type string required one
    field state id "records://candidate/state" type string required one
}
activity Propose(Integer, Text) -> Candidate computes `
if input0 >= 0 {
    return Candidate{title: input1, state: "ready"}
} else {
    return Candidate{title: input1, state: "wait"}
}`
activity Echo(Candidate) -> Candidate computes "return input"
bind Propose.result -> Echo.input

์ด๋Š” ์„ ์–ธ ๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ํ•  ๋•Œ๋Š” IntegerยทText์™€ ์กฐ๋ฆฝ ๊ทœ์น™๊นŒ์ง€ ํฌํ•จํ•œ ์•„๋ž˜ ์ „์ฒด ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•„๋“œ๋Š” ํ•„์ˆ˜ ๋ฌธ์ž์—ด ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ก์€ ์ตœ๋Œ€ 16๊ฐœ, ๊ฐ ๊ธฐ๋ก์˜ ํ•„๋“œ๋Š” ์ตœ๋Œ€ 16๊ฐœ์ด๋ฉฐ, ํ™œ๋™์˜ ์ž…๋ ฅ๋„ ์„ ์–ธ ์ˆœ์„œ๋กœ ์ตœ๋Œ€ 16๊ฐœ๊นŒ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ˆ˜ยท์ฐธ๊ฑฐ์ง“ยทํ…์ŠคํŠธ์™€ ๊ธฐ๋ก์„ ์„ž์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณธ๋ฌธ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋™์ž‘

๋™์ž‘ ์˜ˆ
์ „์ฒด ๊ธฐ๋ก ๊ตฌ์„ฑ Candidate{title: input1, state: "ready"}
ํ•„๋“œ ์ฝ๊ธฐ input.state
์ง€์—ญ๊ฐ’์œผ๋กœ ๋ณต์‚ฌ let copy = input
์ง€์—ญ๊ฐ’ ์ „์ฒด ๊ต์ฒด copy = Candidate{title: copy.title, state: "wait"}
์ „์ฒด ๊ธฐ๋ก ๋ฐ˜ํ™˜ return copy
๊ฐ™์€ ๊ธฐ๋ก ํƒ€์ž…์˜ ๊ฐ’ ๋น„๊ต input0 == input1

์ƒ์„ฑ์ž๋Š” ๋ชจ๋“  ์„ ์–ธ ํ•„๋“œ๋ฅผ ์ด๋ฆ„์œผ๋กœ ํ•œ ๋ฒˆ์”ฉ ์ฑ„์›๋‹ˆ๋‹ค. ์ž…๋ ฅ์€ ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ์ง€์—ญ๊ฐ’ ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” ์„ ์–ธํ•œ ์ˆœ์„œ์˜ Go ๊ฐ’ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์•ˆ์ •์  ID์—์„œ ํƒ€์ž…ยทํ•„๋“œ์˜ ์ด๋ฆ„์„ ์ •ํ•ฉ๋‹ˆ๋‹ค. JSON์—๋Š” ์†Œ์Šค์˜ title, state ๊ฐ™์€ ์ด๋ฆ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ ํ•„๋“œยท์—ฌ๋Ÿฌ ๊ฐ’ยท์ค‘์ฒฉ ๊ธฐ๋ก๊ณผ ๋‹ค๋ฅธ ํ•„๋“œ ํƒ€์ž…์€ ์ดํ›„ ์—”ํ‹ฐํ‹ฐ ํ”„๋กœํŒŒ์ผ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœยท๋ฐ˜๋ณตยท์™ธ๋ถ€ ํšจ๊ณผ๋Š” ๊ฐ ์‹คํ–‰ ๊ณ„์•ฝ์„ ๋” ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค

์˜ˆ์ œ์šฉ ์ƒˆ ์ฒดํฌ์•„์›ƒ์—์„œ ๊ด€์ธกํ•œ ํ›„๋ณด๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ค‘์ธ ํŒŒ์ผ์ด ์žˆ๋Š” ์ฒดํฌ์•„์›ƒ์€ ๋ณ€๊ฒฝ์„ ๋ณด์กดํ•˜๊ณ  ๋ณ„๋„ ์˜ˆ์ œ ํด๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

git clone --depth 1 https://github.com/kimjooyoon/meta-ontology-go.git
cd meta-ontology-go
git fetch --depth 1 origin b629a664ea4a667945ab5f894557f42e97cafa35
git switch --detach FETCH_HEAD
gooo_go_bin="$(GOTOOLCHAIN=go1.27.1 go env GOROOT)/bin/go"
"$gooo_go_bin" build -trimpath -o gooo ./cmd/gooo
./gooo body-compose \
  --source examples/body-codegen/native-records.gooo.fixture \
  --cases examples/body-codegen/native-records-cases.json \
  --out record-results

์ƒˆ ํด๋”์— ์›๋ณธ, ์„ ํƒ๋œ Gooo, Go ํ•จ์ˆ˜, ์—ฐ๊ฒฐ ๋“œ๋ผ์ด๋ฒ„์™€ ์‹ค์ œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ๊ฒฐ์ •๋ก ์ ์ž…๋‹ˆ๋‹ค. ์—ฌ์„ฏ ์‚ฌ๋ก€์˜ ๊ฐ ํ™œ๋™ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด 36/36์„ ์ถฉ์กฑํ•˜๋ฉด ์ œ๊ณตํ•œ ์ด๋ฆ„ ์žˆ๋Š” ๊ธฐ๋Œ€๊ฐ’ 36๊ฐœ์™€ ์ผ์น˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์ฒด ๋ชจ๋ธ์˜ ๊ณ ์ •๋œ ๊ณต๊ฐœ ํŒŒ์ผ ๋‘ ๊ฐœ๋ฅผ ๋ฐ›์•„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

hf download asketeddy/gooo-three-choice-feedback-tiny-v1 \
  models/set-feedback/fp32/model.json models/set-feedback/fp32/weights.bin \
  --revision 24238ca67048b36bc305731799985271bb752dd1 \
  --local-dir gooo-models
./gooo body-compose \
  --source examples/body-codegen/native-records.gooo.fixture \
  --cases examples/body-codegen/native-records-cases.json \
  --model gooo-models/models/set-feedback/fp32/model.json \
  --out record-model-results

๋ชจ๋ธ์€ Score์˜ ์ •์ˆ˜ ์—ฐ์‚ฐ ๋ฐฐ์น˜๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก์˜ ํ•„๋“œ ๊ตฌ์„ฑ๊ณผ ์ฝ๊ธฐ๋Š” Gooo์— ์ ์€ ๋ณธ๋ฌธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ชจ๋ธ๊ณผ ๊ฒฐ์ •๋ก  ๊ฒฝ๋กœ ๋ชจ๋‘ ๊ฐ™์€ ์ตœ์ข… ์†Œ์Šค์™€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ์ฒซ ํ›„๋ณด๋Š” 0/6, ํ›„์† ํ›„๋ณด๋Š” 6/6 ์˜ˆ์‹œ๋ฅผ ์ถฉ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๋Š” ์ด๋ฒˆ ์ž‘์—…์—์„œ ์ƒˆ๋กœ ํ•™์Šตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ €์žฅํ•œ ๊ตฌ์„ฑ์€ ์ƒˆ ์ถ”๋ก  ์—†์ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํด๋”๋Š” ๋งค๋ฒˆ ์ƒˆ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

./gooo body-compose \
  --source record-model-results/original.gooo \
  --cases record-model-results/cases.json \
  --composition record-model-results/composition.json \
  --out record-replay-results

๊ฒฐ๊ณผ๋ฅผ ์ฝ๋Š” ์ˆœ์„œ

  1. runtime.json์˜ finite_passed, finite_total๋กœ ์ž‘์„ฑํ•œ ๊ธฐ๋Œ€๊ฐ’์˜ ์ถฉ์กฑ ์ˆ˜๋ฅผ ๋ด…๋‹ˆ๋‹ค.
  2. traces[].deliveries[]์˜ actual๊ณผ expected๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ก ์ถœ๋ ฅ์€ actual_fields, ๋‹จ์ผ ๊ธฐ๋ก ์ž…๋ ฅ์€ input_fields, ์—ฌ๋Ÿฌ ์ž…๋ ฅ์€ inputs[].fields์—์„œ ํ•„๋“œ IDยท์ด๋ฆ„ยท์‹ค์ œ ๊ฐ’์„ ์„ ์–ธ ์ˆœ์„œ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.
  4. producer_id๋กœ ๊ทธ ๊ฐ’์„ ๋งŒ๋“  ํ™œ๋™์„ ์ฐพ์•„ ์•ž์„  ์‹ค์ œ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  5. realized.gooo๋ฅผ ๋‹ค์Œ ๊ฐœ๋ฐœ์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ๊ธฐ๋ก ์ž…๋ ฅ๊ณผ ๊ธฐ๋ก ๊ธฐ๋Œ€๊ฐ’์€ ์ •ํ™•ํ•œ ํ•„๋“œ ์ด๋ฆ„๊ณผ ๋ช…์‹œ์  ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ ์™„์ „ํ•œ JSON ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋ฉค๋ฒ„ ์ˆœ์„œ๋Š” ์ž์œ ์ด๋ฉฐ, ๊ฐ ๋ฌธ์ž์—ด์€ UTF-8 1,024๋ฐ”์ดํŠธ๊นŒ์ง€ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฝยท์ค‘๋ณตยท์ถ”๊ฐ€ ํ•„๋“œ์™€ nullยทํƒ€์ž… ์˜ค๋ฅ˜๋Š” ์ƒ์„ฑ ์ „์— ๊ฒฐ๊ณผ๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

์™„์ „์„ฑ๊ณผ ๋น„์šฉ์˜ ๊ด€์ธก

๊ฐ™์€ ์—ฌ์„ฏ ํ™œ๋™ ๊ทธ๋ž˜ํ”„์˜ ์—ด๋‘ ๋ฐ˜๋ณต ์ œ์–ด์—์„œ ์ถœ๋ ฅ 432/432, ์ž…๋ ฅ ์Šฌ๋กฏ 648๊ฐœ, ์—ฐ๊ฒฐ ์ „๋‹ฌ๊ฐ’ 432๊ฐœ, ํ•„๋“œ ๊ด€์ธก 1,152๊ฐœ, ์‹ค์ œ ์‹คํ–‰ 24ํšŒ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ ๊ด€์ธก์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์œ„์น˜๋ฅผ ํ•ฉํ•˜๋ฉฐ, ๊ฐ™์€ ๊ฐ’์ด ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์— ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ๋™์‹œ ๋‘ ์š”์ฒญ์€ 72/72๋กœ ์™„๋ฃŒ๋๊ณ , ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ž…๋ ฅ ์—ฌ๋Ÿ ๊ฐœ๋ฅผ ๋‘ ์ €์žฅ ๊ตฌ์„ฑ์— ์ „๋‹ฌํ•ด 96/96์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ ์žฌ์‹คํ–‰์˜ ์ƒˆ ์ถ”๋ก ์€ 0ํšŒ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ธฐ๋Œ€๊ฐ’ ํ•˜๋‚˜๋งŒ ready์—์„œ wait๋กœ ๋ฐ”๊พธ๋ฉด 35/36, ์ฆ‰ 97.22%๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ƒํƒœ ๊ฐ’๊ณผ ๋ฏธ์ถฉ์กฑ ๊ธฐ๋Œ€๊ฐ’๋„ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋น„์œจ์˜ ๋ถ„๋ชจ๋Š” ์ž‘์„ฑํ•œ ์œ ํ•œ ๊ธฐ๋Œ€๊ฐ’์ด๋ฉฐ, ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋ฉด ๊ทธ ๊ธฐ๋Œ€๊ฐ’์„ ์ถ”๊ฐ€ํ•ด ๊ด€์ธกํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์ถ”๋ก  ์ค‘์•™๊ฐ’์€ 26.9ฮผs, ์ „์ฒด ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ์€ ๋ชจ๋ธ 12.80msยท๊ฒฐ์ •๋ก  11.77ms, ๋นŒ๋“œยท์‹คํ–‰์„ ํฌํ•จํ•œ ๋ช…๋ น์€ ์•ฝ 344msยท335ms์˜€์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๊ด€์ธก ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•ฝ 83MiB์ด๋ฉฐ ์ž์‹ ๋นŒ๋“œ ๋น„์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ›„๋ณด๋Š” ๋ชจ๋ธ 2๊ฐœยท๊ฒฐ์ •๋ก  8๊ฐœ๋ฅผ ํ™•์ธํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ ํ‘œ๋ณธ์˜ ์ „์ฒด ์ƒ์„ฑ ์‹œ๊ฐ„์€ ๋ชจ๋ธ ์ชฝ์ด ์กฐ๊ธˆ ๊ธธ์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ CPU ์ƒ์Šน๋Ÿ‰์€ ๋ณ„๋„๋กœ ์ธก์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์›๋ณธยท์ธก์ •ยท์žฌํ˜„ ์ฝ”๋“œ.

์„ค์น˜๋ณธ๊ณผ ํ•„๋“œ๋ณ„ ์š”์•ฝ

์„ค์น˜๋ณธ์˜ ๋ณ„๋„ ์—ด๋‘ ๊ด€์ธก๋„ ์ถœ๋ ฅ 432/432ยทํ•„๋“œ ๊ด€์ธก 1,152๊ฐœ์™€ ๊ฐ™์€ ์ƒ์„ฑ ์ง€๋ฌธ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ถ”๋ก  ์ค‘์•™๊ฐ’์€ 29.7ฮผs, ์ƒ์„ฑ์€ ๋ชจ๋ธ 13.17msยท๊ฒฐ์ •๋ก  12.01ms, ๋ช…๋ น ์ „์ฒด๋Š” ์•ฝ 353msยท347ms์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๊ธฐ๋ก์„ ๋ฐ›์•„ ์ง€์—ญ๊ฐ’ ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋‹ค๋ฅธ ์˜ˆ์ œ๋Š” ์ƒˆ ์ƒ์„ฑยท์ €์žฅ ์žฌ์‹คํ–‰์—์„œ ๊ฐ ์ถœ๋ ฅ 8/8ยท์ถœ๋ ฅ ํ•„๋“œ 8/8์„ ์ถฉ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ„๋„ ์—ฐ๊ตฌ ์ €์žฅ์†Œ์˜ Go ๋„๊ตฌ๊ฐ€ ์ˆซ์ž์™€ ๋ฏธ์ถฉ์กฑ ํ•„๋“œ๋ฅผ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ์™€ ์„ค์น˜ ๊ด€์ธก์€ PR #10์˜ 21๊ฐœ ๊ฒ€์‚ฌ ํ›„ main์— ๋ณ‘ํ•ฉ๋์Šต๋‹ˆ๋‹ค. ์ด ์ปค๋ฐ‹์˜ ์ฒดํฌ์•„์›ƒ ๋ฃจํŠธ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go run ./cmd/record-completeness \
  --input publication/native-record-values-20261004/installed/partial.json

์ถœ๋ ฅ๊ณผ ๊ธฐ๋ก ์ถœ๋ ฅ ํ•„๋“œ๋Š” ๊ฐ๊ฐ 35/36 (97.22%)์ด๋ฉฐ, Propose.state์˜ ์‹ค์ œ ready์™€ ๊ธฐ๋Œ€ wait๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก ๊ธฐ๋Œ€๊ฐ’์„ ์ƒ๋žตํ•œ ์‹ค์ œ ์‹คํ–‰์—์„œ๋Š” ํ•ด๋‹น ์ถœ๋ ฅ ํ•„๋“œ 36๊ฐœ๋ฅผ ๋ฏธ๊ด€์ธก์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ํ•„๋“œ ์ ์ˆ˜๋Š” 0/0ยท๋น„์œจ์€ ๋ฏธ๊ด€์ธก์œผ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ์ž…๋ ฅยท์ถœ๋ ฅ์˜ ํ•„๋“œ ๊ด€์ธก 1,152๊ฐœ์™€ ๊ธฐ๋Œ€ ์ถœ๋ ฅ ํ•„๋“œ์˜ ๋ถ„๋ชจ๋Š” ๊ฐ์ž์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. --json์œผ๋กœ ์‚ฌ๋ก€ยทํ™œ๋™ยทํ•„๋“œ์™€ ์ฐจ์ด๋ฅผ ๋‹ค์Œ ์ž‘์—…์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ณธ ์›๋ณธ๊ณผ ๋น„์šฉ.

๋‹ค์Œ์—๋Š” ๊ธฐ๋ก ํ•„๋“œ์˜ ์„ ํƒ์ง€๋ฅผ assembling์— ํ‘œํ˜„ํ•˜๊ณ , ๊ธฐ๋Œ€ ํ•„๋“œ์™€ ๋น ์ง„ ๋ถ€๋ถ„์„ CLI๊ฐ€ ๋ฐ”๋กœ ์š”์•ฝํ•˜๋ฉฐ, ์ปดํŒŒ์ผํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋กํ˜• ๋„๋ฉ”์ธ ์‹คํ–‰ ๊ฒฝ๋กœ์˜ #874๋Š” ํ•ด๋‹น ๊ณ„์•ฝ์„ ๊ณ„์† ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž‘์€ ์‹คํ—˜: ๋ชจ๋ธ์ด ๊ธฐ๋ก์˜ ๋‚ด์šฉ์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค

์•„๋ž˜๋Š” ๋‹ค์Œ ๊ตฌํ˜„์˜ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค์น˜ ๊ธฐ๋Šฅ๊ณผ ๊ด€์ธก์€ ์œ„ ์ ˆ์—์„œ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Gooo๊ฐ€ ์„œ๋ฅ˜์˜ ์–‘์‹๊ณผ ํ—ˆ์šฉํ•  ๋ถ€ํ’ˆ์„ ์ •ํ•˜๊ณ , ๋ชจ๋ธ์ด ๊ฐ ์นธ์— ๋„ฃ์„ ๋ถ€ํ’ˆ์„ ๊ณ ๋ฅด๋Š” ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๋ชฉ์€ ํ—ˆ์šฉ๋œ ๋ฌธ์ž์—ด ์ž…๋ ฅ ์ค‘์—์„œ, ์ƒํƒœ๋Š” ์„ ์–ธํ•œ ๋‘ ๋ฌธ์ž์—ด ์ค‘์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์€ ์„ ์–ธํ•œ Boolean ์ž…๋ ฅ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์ด ์ œ์•ˆํ•  ๋Œ€์ƒ์€ ํƒ€์ž…์ด ๋งž๋Š” ์™„์ „ํ•œ ๊ธฐ๋ก ๋ณธ๋ฌธ์˜ ์œ ํ•œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

๋งก๊ธฐ๋Š” ๊ฒฐ์ • ์–ธ์–ด๊ฐ€ ๋จผ์ € ์ •ํ•  ๊ฒƒ ํ™•์ธํ•  ๊ด€์ธก
์ œ๋ชฉยท์š”์•ฝ์˜ ์ฐธ์กฐ ์„ ํƒ ํ—ˆ์šฉํ•  ์ž…๋ ฅ ์œ„์น˜ยทํ•„๋“œ IDยท๋ฌธ์ž์—ด ํƒ€์ž… ์˜ˆ์ƒ ํ•„๋“œ๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’์˜ ์ผ์น˜
์ƒํƒœยท์‚ฌ์œ  ๊ฐ’ ์„ ํƒ ํ—ˆ์šฉ๋œ ๊ฐ’๊ณผ ์กฐ๊ฑด์˜ ๋Œ€์•ˆ ์ฐธยท๊ฑฐ์ง“ ์–‘์ชฝ์—์„œ์˜ ๊ธฐ๋Šฅ ์ถฉ์กฑ
๋‹ค์Œ ํ›„๋ณด ์„ ํƒ ์‹œ๋„ ์˜ˆ์‚ฐ๊ณผ ๋‚จ์€ ํ›„๋ณด ์‹คํŒจ ํ•„๋“œ, ํ‰๊ฐ€ ์ˆ˜, ์„ ํƒ ์ˆœ์œ„
์ƒ์„ฑ ๊ฒฐ๊ณผ ์ด์–ด ์“ฐ๊ธฐ ๊ธฐ์ค€ ๋ณธ๋ฌธ๊ณผ ๊ณ ๋ฅธ ์„ ํƒ์˜ ์ฒดํฌํฌ์ธํŠธ ๋‹ค์Œ ์ƒ์„ฑ์˜ ์†Œ์Šคยท์ฝ”๋“œ ์ผ์น˜

์ฒซ ์‹คํ—˜์€ ์ง€๊ธˆ ์ง€์›ํ•˜๋Š” ํ•„์ˆ˜ ๋ฌธ์ž์—ด ๊ธฐ๋ก๊ณผ ์„ธ ๊ฐœ์˜ ์ด์ง„ ์„ ํƒ ์ •๋„๋กœ ๋ฒ”์œ„๋ฅผ ์žก์Šต๋‹ˆ๋‹ค. ํƒ€์ž…๊ณผ ํ•„๋“œ ์ฑ„์›€์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™•์ธํ•˜๊ณ , ์‹ค์ œ ๊ธฐ๋Šฅ์€ ์ž‘์„ฑํ•œ ๊ธฐ๋Œ€๊ฐ’์œผ๋กœ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‚ฐ ์•ˆ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์ถฉ์กฑํ•œ ํ›„๋ณด์™€ ๋‚จ์€ ํ•„๋“œ๋ฅผ ๊ธฐ๋กํ•ด ๋‹ค์Œ ์ž‘์—…์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋“  ์‚ฌ๋ก€๋ฅผ ๋งž์ถ”๋Š” ์ˆ˜์น˜์™€ ์˜ˆ์‚ฐ ํ›„ ์ถฉ์กฑ ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.

์‹คํ–‰ยท์ค‘๊ฐ„ ์—ฐ๊ฒฐ์€ Go๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์œ„์น˜๋Š” ์„ ์–ธ ์ˆœ์„œ์˜ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ํ‘œํ˜„ํ•˜๊ณ , ์™„์„ฑ๋œ ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๊ฐ’ ๊ตฌ์กฐ์ฒด๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒฐ์ •๋ก ์  ๊ฒฝ๋กœ๋ฅผ ์ธก์ •ํ•œ ๋’ค ์ž‘์€ ํŒ๋‹จ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ํ›„๋ณด ํ™•์ธ ๊ฐ์†Œ์™€ ์ถ”๊ฐ€ ์ถ”๋ก  ๋น„์šฉ์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํŠน์ง•์ด๋‚˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋งŒ๋“ค๋ฉด ๊ธฐ์กด ์ •์ˆ˜ ํŒ๋‹จ๊ธฐ์˜ ๊ด€์ธก๊ณผ ๊ฐ๊ฐ์˜ ์†Œ์Šคยทํ•™์Šต ์ง‘ํ•ฉ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์–ธ์–ด ์–‘์‹์˜ ์ž‘์€ ํŒ๋‹จ๋ถ€ํ„ฐ ํ‚ค์›Œ ํ•™์Šต ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.