본문으로 건너뛰기

듀오랩스 모듈 UNIT

사업자등록 확인, 주소 검색, 알림 발송처럼 프로젝트마다 새로 짜던 기능을 패키지 하나로 묶었습니다. 화면은 DEUX 가, 기능은 UNIT 이 맡습니다. 둘 다 @duolabs-deux 이름으로 나가서 설치 설정이 같습니다.

모든 유닛이 밟는 순서

유닛마다 하는 일은 달라도 순서는 같습니다. 앞의 두 칸에서 걸리면 밖으로 나가지 않습니다. 오타 하나가 외부 API 한도를 쓰지 않게 하려는 것입니다. 실패는 여섯 가지 말로만 알립니다. 설계 원칙에 자세히 있습니다.

  1. 1

    정규화

    하이픈·공백을 걷고 형식을 맞춘다

  2. 2

    로컬 검증

    검증 숫자처럼 밖에 묻지 않고 알 수 있는 것

  3. 3

    캐시

    같은 값을 짧은 시간에 다시 묻지 않는다

  4. 4

    외부 호출

    타임아웃·재시도·오류 분류가 붙은 한 번

유닛 29개

  • 사업자베타

    사업자등록 확인

    사업자등록번호의 형식·검증 숫자를 먼저 거르고 국세청 상태를 조회한다. 번호·개업일자·대표자명의 진위도 확인한다

    @duolabs-deux/unit-biz-registry
  • 일정베타

    공휴일·영업일

    주말은 달력으로 바로 답하고, 공휴일은 한국천문연구원 특일 정보로 확인한다. N영업일 뒤 날짜를 계산한다

    @duolabs-deux/unit-holidays
  • 형식베타

    한국 형식

    전화번호(종류·하이픈·+82), 사업자등록번호(검증 숫자), 법인등록번호, 원·한글 금액, 끝소리에 맞는 조사(을/를·이/가·으로/로 등), 파일 크기(경계에서 넘치지 않는 KB·MB). 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-kr-format
  • 형식베타

    한국 날짜

    서버 시간대와 상관없이 한국 날짜 키·자정·벽시계를 낸다. 날짜 문자열 셈, DB DATE 칸, 서버와 브라우저가 같은 글자를 내는 표기. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-kr-date
  • 파일베타

    표 파일

    CSV·xlsx·zip 을 라이브러리 없이 쓰고 읽는다. 엑셀에서 복사한 표의 머리글·값으로 열을 추정하고, 사용자가 고친 열 지정으로 데이터를 연결한다. 브라우저에서도 돈다

    @duolabs-deux/unit-sheet-io
  • 세무베타

    한국 부가세

    공급가액·세액·합계(부가세 포함가 역산 포함, 끝수 처리 명시), 줄 합산과 합계 계산의 차이, 신고 기간·기한, 세금계산서 발급·전송 기한, 승인번호, 수정 사유 표, 과세·영세율·면세. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-kr-tax
  • 계산베타

    한국 급여

    달별 4대보험 요율 표, 국민연금 기준소득월액 상하한, 사업장 규모별 고용보험, 근로소득 간이세액(근사, 국세청 표를 꽂을 수 있다), 10원 미만 절사. 밖에 묻지 않는다

    @duolabs-deux/unit-kr-payroll
  • 알림베타

    텔레그램 알림

    텔레그램 봇으로 메시지를 보낸다. 4096자를 넘는 글은 나누거나 자르고, 한도(retry_after)는 기다려 다시 보내며, 차단·없는 대화방은 「받는 쪽이 영구히 없다」로 따로 알린다

    @duolabs-deux/unit-telegram
  • 주소베타

    한국 행정구역

    시도 이름을 한 모양으로(특별자치도 개편 포함), 주소에서 시도·시군구를 읽고, 외부 지오코딩 없이 지역 좌표를 짐작한다. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-kr-region
  • 사업자베타

    한국 상호

    법인격 표기((주)·㈜·주식회사·Co.,Ltd 등)·전각·띄어쓰기를 걷은 비교 키, 지점 분리, 같은 회사 판정. 한쪽이 다른 쪽을 품는다고 같은 회사로 보지 않는다. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-kr-company
  • 연락처베타

    이메일 주소

    형식 검증·정규화(한글 도메인 포함), 글 속에서 주소 뽑기, 흔한 도메인 오타 제안(navre.com → naver.com), 메일을 받는 도메인인지(MX) DNS over HTTPS 로 확인

    @duolabs-deux/unit-email-addr
  • 업무베타

    문서 번호

    견적·발주·전표 번호(INV-2026-0001 · PR-2607-001)의 형식·파싱과 원자적 발급. 같은 범위의 두 발급이 같은 번호를 받지 않는다. 기간은 한국 날짜로 가른다

    @duolabs-deux/unit-doc-number
  • 화면베타

    목록 상태

    주소의 정렬·쪽·쪽당 건수를 허용 목록과 상한으로 읽고, 쪽 나누기·번호 띠·정렬 토글·주소 만들기를 한다. 버린 입력을 같이 알려 준다. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-list-state
  • 검색베타

    RAG 텍스트

    마크다운을 헤딩 경로를 지키며 검색용 조각으로 나눈다. 코드펜스·표·목록을 자르지 않고, 최소·최대 크기와 겹침을 지킨다. 임베딩 입력 만들기, RRF 로 검색 결과 합치기, 코사인 유사도. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-rag-text
  • 위치베타

    위치 셈

    하버사인 거리(asin 클램프), 경계에서 넘치지 않는 한국어 거리 표기, 도보 분, 경계 상자. 좌표는 { lat, lng } 객체로만 받고 [경도, 위도] 배열은 변환 함수로만 드나든다

    @duolabs-deux/unit-geo
  • 계산베타

    결정적 난수

    같은 시드는 언제나 같은 수열. 문자열 시드(FNV-1a), mulberry32, [0, 1) 보장, 정수·고르기·섞기·가중치, 이름 붙인 독립 수열(fork), 키마다 따로 정하는 hashUnit

    @duolabs-deux/unit-seeded
  • 기록베타

    감사 이력 차이

    바뀐 칸만 { 칸: [전, 후] }. 키 순서와 무관한 깊은 비교, 시각까지 보는 Date, Decimal·bigint, 날짜 칸·무시할 칸·가릴 칸 옵션. 결과는 JSON 으로 그대로 저장된다

    @duolabs-deux/unit-audit-diff
  • AI베타

    LLM 호출

    OpenAI 호환 서버와 Ollama 에 채팅·임베딩을 보낸다. 흘려 받기(SSE·NDJSON), 토큰 사용량, 그리고 「모델이 없다」와 「서버가 죽었다」를 가르는 오류 분류. 주소는 소비 앱이 명시한다

    @duolabs-deux/unit-llm-client
  • 알림베타

    모바일 푸시

    APNs(iOS)·FCM v1(Android)로 푸시를 보낸다. SDK 없이 키로 서명하고, 기기별 결과를 돌려주며, 앱이 지워진 기기는 「받는 쪽이 영구히 없다」로 따로 알려 토큰을 지우게 한다

    @duolabs-deux/unit-push
  • 글베타

    마크다운 손질

    렌더러 앞뒤에 끼운다. 물결 하나(1~2주)가 취소선이 되는 것을 막고, 렌더된 HTML 에서 헤딩 id 와 목차를 같이 만들며, 한글 slug·평문·요약·읽는 시간을 낸다. 렌더러와 살균은 소비 앱이 고른다

    @duolabs-deux/unit-markdown
  • 글베타

    피드·sitemap

    RSS 2.0·Atom·JSON Feed·sitemap 을 같은 입력으로 만들고, XML 에 넣을 수 없는 글자를 걸러 피드가 통째로 깨지지 않게 한다. ETag·Last-Modified 로 304 를 판정해 다시 묻는 리더에게 본문을 보내지 않는다

    @duolabs-deux/unit-feed
  • 파일베타

    HTML → PDF

    HTML 한 장을 PDF 로. 이미 떠 있는 Chromium 에 붙어 인쇄하고(의존성 없음), 모든 단계에 시간 상한, 밖으로 나가는 요청 차단, HTML·PDF 크기 상한을 둔다. Node 전용

    @duolabs-deux/unit-html-pdf
  • 파일베타

    이미지 정책

    올린 사진을 규격대로 다시 굽는다. 픽셀·바이트 상한, 자동 회전 후 EXIF·GPS 제거, 썸네일·카드·크게 보기 프리셋, webp·avif·jpeg, 움직이는 이미지 처리, 콘텐츠 해시 파일 이름. sharp 는 소비 앱이 넣는다

    @duolabs-deux/unit-image-policy
  • 주소베타

    한국 주소

    도로명·지번·우편번호·건물명으로 주소를 찾고, 주소를 좌표로, 좌표를 행정구역으로 바꾼다. 공급자가 달라도 같은 결과 모양이고, 공급자가 거부할 검색어는 묻기 전에 거른다

    @duolabs-deux/unit-kr-address
  • 날짜베타

    한국 음력

    한국천문연구원 기준 음력과 양력을 오간다(1900~2049, 윤달 포함). 설·추석 연휴와 부처님오신날, 간지와 띠. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-kr-lunar
  • 검색베타

    한글 검색

    초성 검색(ㄷㅎㅁㄱ → 대한민국)과 낱자 단위 매칭(입력 중인 「한ㄱ」도 맞음), 강조 위치, 점수 정렬, 서버와 브라우저가 같은 가나다 정렬, 한/영 전환을 잊은 「gksrnr」. 밖에 묻지 않고 브라우저에서도 돈다

    @duolabs-deux/unit-hangul-search
  • 운영베타

    업타임 점검

    주소가 뜨는지 재고 정상·지연·장애·모름으로 판정한다. 나쁘면 한 번 더 재고, 연속 기준으로 알림을 확정하며, 한국 날짜 하루 막대로 모은다. 못 잰 것은 정상으로 치지 않는다

    @duolabs-deux/unit-uptime-probe
  • 모바일베타

    앱 잠금

    생체 인증(실패하면 기기 암호)으로 앱을 연다. 못 쓰는 기기는 잠그지 않고, 기기에 맞는 이름(Face ID · 지문)을 쓰며, 취소와 실패를 가른 문구를 내고, 백그라운드 유예가 지나면 다시 잠근다. expo-local-authentication 은 소비 앱이 넣는다

    @duolabs-deux/unit-app-lock
  • 모바일베타

    푸시 받기

    앱 쪽 푸시. 권한은 한 번만 묻고, 네이티브 토큰(APNs · FCM)을 서버에 등록 · 해제하며, 토큰이 바뀌면 다시 등록하고, 알림을 눌러 연 data 를 화면 하나로 읽는다(꺼진 앱을 켠 경우 포함). 보내는 쪽은 푸시 유닛이다. expo-notifications 는 소비 앱이 넣는다

    @duolabs-deux/unit-push-receive