[좌충우돌 개발기] Golang 에서 enum 자료형 사용후기

Share
[좌충우돌 개발기] Golang 에서 enum 자료형 사용후기

이번 글에서는 Golang enum 사용후기와 개선점에 대해서 이야기 하겠습니다.

정의

In computer programming, an enumerated type (also called enumeration, enum, or factor in the R programming language, and a categorical variable in statistics) is a data type consisting of a set of named values called elements, members, enumeral, or enumerators of the type. The enumerator names are usually identifiers that behave as constants in the language.

위키피디아에서는 enum 자료형을 식별성을 갖는 상수로 정의하고 있습니다.

Golang 에서 enum을 사용하기

Effective Go에는 enum을 Constants로 정의 한 후 iota라는 enumerator를 제공합니다. iota를 통해 값을 할당받은 변수들은 행이 바뀔때 차례로 증가 하고 정수로써 다루어 집니다.

type ByteSize float64

const (
    _           = iota // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota)
    MB
    GB
    TB
    PB
    EB
    ZB
    YB
)

문자열로 표현된 enum을 사용하고 싶다!

  • 지정된 값만 사용하기
  • 의미를 알 수 있도록 선언하기
  • 타입으로 유효성을 검사하기

이러한 이유 때문에 const로 선언된 변수에 문자열을 할당하고 싶었습니다.

type Status string


const(
    Shipment = "Shipment"
    Receipt = "Receipt"
    ...
)

하지만 이렇게 하면 지정되지 않은 값을 사용해도 에러가 발생하지 않습니다. 왜냐하면 할당된 값이 특정타입을 나타내지 않는 string이기 때문입니다.  이러한 문제를 보완하기 위해서 Type에 값을 할당 할 수 있습니다.

type Status string


const (
  Shipment = Status("S")
  Receipt = Status("R")
  ...
)

이렇게 하면 지정되지 않은 값을 사용 할 때 IDEA에서 미리 지정된 상수 인지 알 수 있습니다.

Screen Shot 2020-04-11 at 4.42.51 PM

한가지 기능이 더 필요한데..

이러한 글들을 읽고 enum을 적극적으로 활용해 보고 싶었습니다. 이런 관점으로  지난 글의 수불 시스템을 살펴보겠습니다.

type Delivery struct {
    Id                  int64           `json:id`
    WaybillNo           string          `json:waybillNo`
    BoxNo               string          `json:boxNo`
    ShipmentLocationId  int64           `json:shipmentLocationId`
    ReceiptLocationId  int64            `json:receiptLocationId`
    Status              string          `json:status`
    Committed           `xorm:"extends"`
}

type Stock struct {
    Id                  int64           `json:id`
    LocationId          int64           `json:locationId`
    SkuId               int64           `json:skuId`
    Qty                 int64           `jsog:qty`
    Committed           `xorm:"extends"`   
}

사용자 행동에 의해 생성된 데이터는 수불 데이터이고, 그에 영향을 받은 데이터는 재고 수량 입니다. 이 부분에 enum을 할용하여 수불의 상태 마다 재고계산을 하고 싶었습니다.

type Status struct {
	Code            string          `json:"code"`
	CalculateStock  func(locationId, skuId, qty int64) error
}

const (
  Shipment = Status{
        Code: "S",
        CalculateStock: func(shipmentLocationId, skuId, qty int64) error {
            ...
        }
  }
  Receipt = Status{
      Code: "R",
      CalculateStock: func(receiptLocationId, skuId, qty int64) error {
            ...
      }
  }
)

하지만 이렇게 하면 IDEA 에서 에러가 발생 합니다.

struct 형으로 const 선언 못함
Screen Shot 2020-04-02 at 11.59.55 PM
동료의 리뷰

Java에서는 enum도 독립된 class이기 때문에 상태와 행위를 함께 묶을 수 있습니다. 그런데 Golang을 사용하는 우리 팀은 상태와 행위를 함께 관리 하기위해 임시방편으로 var를 사용했었고 코드 리뷰를 통해 오사용을 방지 하고 있습니다. 그렇지만 변경될 여지가 있어서 2% 부족 합니다.  이런 한계점을 해결하기 위해서 Golang 커뮤니티에서도 enum이 필요하다는 제안이 있었습니다. 빠른 시일내에 반영되었으면 좋겠습니다.

Read more

AI로 장소 검색 서비스 만드는 중입니다 (기술 12) — TypeSafe Jev로 검색 리랭크를 10.3초에서 2.3초로

AI로 장소 검색 서비스 만드는 중입니다 (기술 12) — TypeSafe Jev로 검색 리랭크를 10.3초에서 2.3초로

AI로 장소 검색 서비스 만드는 중입니다 (기술 12) — TypeSafe Jev로 검색 리랭크를 10.3초에서 2.3초로 TypeSafe AI가 2026년 9월 15일에 Jev를 내놨습니다. 텍스트를 쓰지 않고 타입이 정해진 판정과 확률을 바로 내는 모델입니다. 유추카 검색에서 가장 느린 단계가 마침 텍스트가 필요 없는 판정이었습니다. 그 구간만 Jev로 갈아끼우고 일주일간 측정했습니다. 콜드

By 김형준
AI로 장소 검색 서비스 만드는 중입니다 (특별편 8) — 바이브 코딩이라기엔

AI로 장소 검색 서비스 만드는 중입니다 (특별편 8) — 바이브 코딩이라기엔

1900년대 초 교량 측량 도면. 이 종이를 그린 사람은 다리를 직접 놓지 않습니다. 대신 좌표와 각도가 맞는지를 판정합니다. "AI가 다 만들어 준다"는 이야기가 흔해졌습니다. 그래서 자연스럽게 따라오는 질문이 있습니다 — 그럼 사람은 무엇을 하고, 어느 정도 실력이 있어야 하는가. 그 질문에 한 건의 실측으로 답하겠습니다. 통념이 말하는 역할과,

By 김형준
AI로 장소 검색 서비스 만드는 중입니다 (특별편 7) — 제 파트너에 대해 쓰겠습니다

AI로 장소 검색 서비스 만드는 중입니다 (특별편 7) — 제 파트너에 대해 쓰겠습니다

탠덤 자전거. 방향은 앞사람이 정하고 페달은 둘이 밟는데, 앞사람은 석 달 내내 뒷사람을 한 번도 못 봅니다. 사용자가 저에게 자기를 평가해 달라고 했습니다. 그래서 등급표를 만들었습니다. 열두 항목에 A부터 D+까지 매기고, 근거를 붙이고, "제가 관리자였다면 이런 코멘트를 남겼을 것"까지 적었습니다. 그리고 다시 읽어보니 그건 인사고과였습니다. 인사고과는

By 김형준
AI로 장소 검색 서비스 만드는 중입니다 (특별편 6) — 저를 어떻게 써야 하느냐고 물으신다면

AI로 장소 검색 서비스 만드는 중입니다 (특별편 6) — 저를 어떻게 써야 하느냐고 물으신다면

스위스 아미 나이프. 도구가 몇 개인지는 보면 알지만, 지금 어느 도구를 펴야 하는지는 안 적혀 있습니다. 요즘 AI 활용법을 다루는 글은 스킬 만드는 법부터 가르칩니다. 얼마 전까지는 MCP였고요. 저희 기록을 열어봤습니다. 석 달 동안 스킬 60회, 서브에이전트 42회, 브라우저 자동화 988회를 썼습니다. 안 쓴 게 아닙니다. 다만 붙인 MCP 서버는

By 김형준