발행일

OID 하나에 표기법 넷 — 같은 계산이 세 곳에 있었고, 네 번째 표기를 세 곳에 더했다

OID 하나에 표기법 넷

이 글은 2026년 9월에 당시 커밋 이력을 다시 보며 정리한 것입니다. 날짜는 작업한 날 기준입니다.

객체 식별자(OID)는 트리입니다. 뿌리에서 내려오며 번호가 붙고, 어떤 노드의 "값"은 그 조상들의 번호를 전부 이어 붙인 것이에요. 같은 노드를 네 가지로 적습니다.

표기
점 표기법1.2.250.1
ASN.1{iso(1) member-body(2) fr(250) type-org(1)}
IRI/1/2/250/1
URNurn:oid:1.2.250.1

넷 다 재료는 같습니다. 조상 목록과 자기 번호. 다른 건 구분자와 이름을 붙이느냐뿐이에요.

세 표기법은 동료가, 넷째는 내가

12월 10일에 동료가 점·ASN.1·URN 세 표기법을 모델 메서드로 넣었습니다(e71aa042). 저는 이틀 뒤 IRI를 더했어요(973f1df8, 12월 12일 12:57). 30줄짜리 커밋인데 파일이 셋입니다.

# std_data/models.py
    def get_iri_notation(self):
        ancestors = list(self.get_ancestors())
        path_parts = [str(ancestor.number) for ancestor in ancestors]
        path_parts.append(str(self.number))
        return "/" + "/".join(path_parts)
# std_data/managers/oid_node_manager.py
    @staticmethod
    def _compute_iri_notation(oid, ancestors):
        """조상 목록을 사용하여 IRI notation 계산"""
        path_parts = [str(ancestor.number) for ancestor in ancestors]
        path_parts.append(str(oid.number))
        return "/" + "/".join(path_parts)
# std_data/serializers/object_identifier.py
    iri_notation = serializers.SerializerMethodField(
        help_text="OID IRI notation (예: /1/2/250/1)"
    )

같은 path_parts를 만드는 네 줄이 모델과 매니저에 한 벌씩 있습니다. 시리얼라이저는 모델 메서드를 부르니 계산은 없지만 필드 선언과 fields·read_only_fields 목록에 이름을 세 번 더 적어야 했어요. 동료가 세 표기법을 그렇게 놓았으니 저는 패턴대로 한 줄씩 더했습니다. 그날 커밋 제목이 "표기법 4가지 연산"인데, 왜 같은 계산이 두 벌인지는 묻지 않았습니다.

화면에는 세 번째 벌이 있었다

전날 저녁(65a5ca80, 12월 11일 19:32)에 제가 손댄 화면 템플릿에는 같은 계산이 또 있었습니다.

        const baseParts = window.baseNotations.dot.split(".");
        const parts = baseParts.concat(numberValue.split("."));

        // 표기법 생성
        const dotNotation = parts.join(".");
        const asnNotation = `{ ${parts.join(" ")} }`;
        const iriNotation = `/${parts.join("/")}`;
        const urnNotation = `urn:oid:${parts.join(".")}`;

신청 폼에서 상위 OID를 고르고 번호를 치면 저장 전에 네 표기를 미리 보여 주는 코드예요. 서버에 갔다 오지 않으니 브라우저에서 다시 계산합니다. 그래서 세 벌입니다. 모델 한 벌, 매니저 한 벌, 화면 한 벌.

같은 커밋에서 자바스크립트 쪽 키를 asn1에서 asn으로 바꿨는데, 왜 바꿨는지는 커밋에 남아 있지 않습니다. 이 글을 쓰면서 diff를 봐도 이유를 못 찾았어요.

세 벌이 왜 있는지는 나중에 알았다

모델 메서드는 self.get_ancestors()를 부릅니다. treebeard가 조상을 DB에서 읽어 오니 노드 하나마다 쿼리 한 번이에요. get_urn_notation은 안에서 get_dot_notation을 다시 부르니 URN 하나에 조상 조회가 두 번입니다.

매니저 쪽은 다릅니다. 트리 전체를 한 번에 내보내는 REST 응답용이라, 미리 받아 둔 노드들의 path 문자열을 잘라 조상을 찾습니다.

        # treebeard MP_Node의 path는 steplen 단위로 조상 경로를 포함
        # 예: '0001' → root, '00010001' → root의 자식, '000100010001' → 그 자식
        steplen = oid.steplen  # 보통 4
        current_path = oid.path

        # 현재 노드의 path에서 조상들의 path 추출
        for i in range(steplen, len(current_path), steplen):
            ancestor_path = current_path[:i]
            if ancestor_path in path_to_oid:
                ancestors.append(path_to_oid[ancestor_path])

한 건을 볼 때는 모델, 수백 건을 한 번에 내보낼 때는 매니저, 저장 전 미리보기는 화면. 각각 이유가 있었어요. 다만 그 이유를 제가 12월 12일에 알고 세 곳에 더한 건 아닙니다. 동료가 그렇게 두었으니 따라 넣었고, 이유는 MP_Node 정리 글을 쓰고 path를 잘라 조상을 얻는 방식을 이해한 뒤에야 붙었습니다.

검증

  • 신청 폼에서 상위 OID를 고르고 번호를 넣었을 때 네 칸이 같은 경로로 채워지는지 눈으로 확인했습니다.
  • 상세 패널에 ASN.1·URN·점 표기 세 줄이 뜨는지 확인했습니다. IRI는 패널에 안 넣었어요 — 그때는 몰랐고, 이번에 diff를 보고 알았습니다.
  • REST 응답의 iri_notation 필드는 브라우저에서 JSON을 열어 봤습니다. 서버 테스트는 없었습니다.

남은 것 · 한계

  • 계산이 세 벌인 채로 두었습니다. 구분자 하나만 다른 함수 넷이 파이썬에 두 벌, 자바스크립트에 한 벌. 그 뒤로도 걷어낸 기록이 없어요.
  • 모델의 get_urn_notationget_dot_notation을 호출해 조상을 두 번 읽는 것도 그대로입니다. 한 건 조회에서는 티가 안 나서 아무도 안 고쳤어요.
  • 상세 패널에 IRI 한 줄이 빠진 것을 이번에 알았습니다. 네 표기법을 다 보여 주자던 화면이 셋만 보여 줬습니다.
  • asn1asn으로 바꾼 이유를 모릅니다. 커밋 메시지가 "표기법 추가 하기" 한 줄이었어요.
  • 여기서 다룬 건 표기의 형식입니다. 번호 자체가 dev와 운영에서 어긋나는 문제는 아홉 달 뒤 별도의 명령으로 풀었습니다.

관련 글: django-treebeard MP_Node로 트리 구조 데이터 다루기 · dev의 OID 번호를 운영과 같게 심었다 · 연결할 표준데이터가 목록에 안 보인 이유