안녕하세요, 약토피아 약디입니다☺️
건조시럽의 경우 처방은 mL로 나오는데 약은 분말이라, 몇 g을 달아야 하는지 매번 환산해야 하는데요. 자주 쓰는 품목은 환산계수를 외우고 있지만 낯선 건조시럽 제품은 급하게 조제를 하려다보면 당황스러울 때도 있습니다.
그래서 오늘은 약품명을 입력하면 허가사항을 토대로 칭량 해야되는 건조시럽 양을 계산해주고, 복약 라벨까지 만들어주는 도구를 Claude로 만드는 방법을 준비했습니다.
Step 1. 식약처 허가정보 API 인증키 받기
API는 프로그램이 데이터를 요청하고 받는 연결 통로이고, 인증키는 그 통로를 쓰는 사람을 확인하는 값이에요.
지난 외국인 환자 복약안내문 만들기 칼럼에서 API 키 신청하는 방법을 설명드렸는데요, 이미 발급 받으셨다면 그대로 쓰시면 됩니다.
1/ 공공데이터포털 로그인 →
[식품의약품안전처_의약품 제품 허가정보] 활용신청
식품의약품안전처_의약품 제품 허가정보 페이지에서 [활용신청]을 누르고 활용 목적을 적으면 바로 승인돼요.
2/ 마이페이지의 인증키 화면에서 일반 인증키(Decoding) 복사
Encoding 키를 넣으면 요청할 때 인코딩이 한 번 더 돼서 인증 오류가 날 수 있어요.
Decoding 키를 복사하세요.
API 키는 비밀번호처럼 다뤄 주세요. 메신저나 파일로 공유하지 않습니다.
Step 2. 환산계수 이해하기
환산계수가 뭔가요?
완성된 시럽 1mL를 만들려면 분말이 몇 g 필요한가를 나타내는 값이에요.
환산계수는 주로 각 제품의 허가사항 «원료약품 및 그 분량»에서 계산할 수 있어요.
100그램(150mL) 중 이라는 표현에서
1mL를 만드는 데 필요한 분말은 100g ÷ 150mL, 약 0.667g인 것을 알 수 있습니다.
다시 말해 환산 계수가 0.667g인 것이죠.
그럼 이 약 30mL를 조제해야 할 경우, 칭량해야 할 분말은 이렇게 계산할 수 있겠습니다.
30 mL × (100 g ÷ 150 mL) = 20.00 g
20.00g을 칭량해 적은 양의 물로 먼저 녹이고, 표시선까지 물을 채워 30mL를 맞춰 조제합니다.
같은 성분이어도, 제품마다 환산계수가 다를 수 있는 이유
건조시럽 분말은 주성분만 들어 있는 게 아니에요.
당류·향료·현탁화제 같은 부형제가 같이 들어갑니다.
제조사가 얼마나 희석할지를 정하고, 그게 역가로 표시돼요.
같은 세파클러인데도 분말 1g에 든 주성분이 이렇게 갈립니다.
제품 | 역가 (분말 1g에 든 주성분) |
|---|---|
대화세파클러수화물건조시럽125mg/5ml | 100g 중 3.75g (= 37.5mg/g) |
크로세프건조시럽 | 100g 중 2.5g (= 25.0mg/g) |
1.5배 차이가 납니다. 제조사가 희석을 다르게 정했기 때문이에요.
같은 성분 다른 제품에서 외운 환산계수를 무조건 그대로 사용하면 안 되는 이유입니다.
Step 3. Claude로 건조시럽 계산 도구 만들기
1/ Claude에 아래 [건조시럽 계산기 제작 프롬프트] 입력하기
[건조시럽 계산기 제작 프롬프트]
건조시럽 조제용 계산기를 HTML 파일 하나로 만들어줘. 외부 라이브러리 없이, 브라우저에서 바로 열리게.
## 이 도구가 푸는 문제
건조시럽은 처방이 mL로 나오는데 약은 분말이야. 그래서 몇 g을 칭량할지 환산해야 해.
환산계수(g/mL) = 칭량할 분말 질량(g) ÷ 만들 시럽 부피(mL)
칭량량(g) = 처방 총량(mL) × 환산계수
환산계수는 제품마다 달라. 식약처 허가사항에서 찾아서 계산해줘.
## 데이터 출처
공공데이터포털 «식품의약품안전처_의약품 제품 허가정보»
https://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService07/getDrugPrdtPrmsnInq07
→ 제품명으로 검색해 품목기준코드(ITEM_SEQ)를 찾는다
https://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService07/getDrugPrdtPrmsnDtlInq06
→ item_seq로 상세 조회. TOTAL_CONTENT · MATERIAL_NAME · PACK_UNIT을 쓴다
- `type=json`으로 받아
- 인증키는 코드에 넣지 말고 화면에서 입력받아 그 브라우저에만 저장해 (localStorage)
- 키는 «일반 인증키(Decoding)»를 쓴다고 안내문을 달아줘
### 인증키 칸에 «확인» 버튼을 달아줘
키가 틀렸을 때 「검색 결과 없음」으로만 보이면 **키 문제인지 · 제품명 문제인지 · 브라우저가
요청을 막은 건지 구분이 안 돼.** 확인 버튼이 그 셋을 갈라줘야 해.
누르면 아무 제품이나 한 번 조회해보고 결과를 이렇게 나눠서 보여줘.
✅ 키가 동작합니다 ← HTTP 200 + resultCode 00
❌ 인증 오류입니다 — 키를 다시 확인하세요 ← 200이지만 resultCode가 00이 아님
(«일반 인증키(Decoding)»가 맞는지, 활용신청이 승인됐는지 보세요)
❌ 요청이 막혔습니다
Claude 아티팩트 미리보기에서 열었다면 그게 원인입니다.
[내려받기]로 HTML을 저장한 뒤 그 파일을 열어주세요.
(내려받아 열었는데도 이 메시지가 나오면 네트워크·확장프로그램 문제입니다)
❌ 서버가 오류를 냈습니다 (HTTP 500)
⚠️ **HTTP 상태코드만으로 «인증 오류»와 «서버 오류»를 가르지 마.** 실제로 이렇게 온다.
키가 맞음 → HTTP 200 · {"header":{"resultCode":"00","resultMsg":"NORMAL SERVICE."}}
키가 틀림 → HTTP 403 · {"OpenAPI_ServiceResponse":{"cmmMsgHeader":{
"errMsg":"SERVICE_KEY_IS_NOT_REGISTERED_ERROR",
"returnAuthMsg":"등록되지 않은 서비스키",
"returnReasonCode":"30"}}}
키가 비었음 → HTTP 401 · 같은 모양
`res.ok`부터 보면 **키 문제가 전부 「서버 오류」로 새어나간다.** «확인» 버튼은 키 문제와
서버 문제를 갈라주려고 만든 건데, 가장 흔한 실수를 정반대로 말하게 된다.
그러니 **응답 본문을 먼저 읽고** 이 순서로 판정해.
1. fetch가 throw → 요청이 막혔습니다
2. 본문에 인증 오류 표시가 있으면 → 인증 오류입니다 (HTTP가 몇이든)
`resultCode`가 00이 아님 · `returnReasonCode` 있음 · `errMsg`에 SERVICE_KEY 들어감
· XML이면 `<returnAuthMsg>` · `<errMsg>`
3. 그 밖에 HTTP가 4xx·5xx → 서버가 오류를 냈습니다 (HTTP nnn)
4. 나머지 → 키가 동작합니다
응답이 JSON이 아니라 XML로 오는 경우도 있으니 둘 다 읽어야 해.
`resultMsg` · `returnAuthMsg` · `errMsg` 중 있는 것의 **원문을 작게 같이 보여줘.**
짐작해서 바꿔 쓰지 마.
### «보기» 버튼의 이름을 분명히
지금 «보기»는 **가린 키를 보이게 하는 것**인지 **키가 맞는지 확인하는 것**인지 글자만으론 몰라.
토글이라는 게 드러나게 써줘 — 눌렀을 때 글자가 바뀌면 좋아.
키 보이기 ↔ 키 가리기
«확인»(위)과 «키 보이기»(마스킹)와 «지우기»(삭제)가 서로 다른 일이라는 게 한눈에 보여야 해.
## 환산계수를 뽑는 세 갈래 — 이 순서대로
**A. 총량에 부피가 있으면 (1순위)**
`MATERIAL_NAME`의 `총량` 또는 `TOTAL_CONTENT`에서 기준질량과 대응부피를 읽어.
총량 : 100g(908.15mL) 중 → 100 ÷ 908.15 = 0.1101
총량 : 100그램(150mL) 중 → 100 ÷ 150 = 0.6667
총량 : 100 그램(908.15 밀리리터) 중
총량 : 100그램908.15밀리리터 ← 괄호가 빠진 경우도 있다
총량 : 100그람(908.15밀리리터) 중 ← "그람" 표기
⚠️ **괄호 안이 부피가 아니라 농도인 경우가 있다.** 이건 A가 아니야.
총량 : 100g 중 (125mg/5ml) ← 농도다. 5mL를 부피로 읽으면 안 돼
총량 : 100그램 중 250밀리그램/5밀리리터 ← 농도다
구분법: `mg/mL` 꼴이면 농도, 단독 부피면 대응부피. 대응부피는 보통 세 자리다.
**B. 제품명에 농도가 있으면 (3순위)**
농도(mg/mL) ÷ 역가(mg/g) = 환산계수
- 농도: 공식 품목명에서. `125mg/5ml` · `125밀리그람/5밀리리터` · `25밀리그램/밀리리터` ·
`50밀리그램(역가)/5ml` 같은 표기를 다 읽어야 해
- 역가: `MATERIAL_NAME`의 `분량` + `단위`를 `총량`의 기준질량으로 나눈 값.
단위는 `그램` · `밀리그램` · `마이크로그램`이 나온다
⚠️ **`분량`이 역가가 아닐 수 있다.** `성분정보`에 `~로서 N(역가)`가 있으면 **그쪽이 역가**야.
성분명 : 클래리트로마이신 제피과립 | 분량 : 8,445 | 단위 : 밀리그램
| 성분정보 : 클래리트로마이신(으)로서 3,547밀리그램(역가)
→ 역가는 3,547이지 8,445가 아니다
⚠️ **성분 블록이 여럿이면(배합제) B를 쓰지 마.** 어느 역가인지 고를 수 없어.
`MATERIAL_NAME`은 `;`로 성분이 나뉘어 있어. 두 개 이상이면 B는 건너뛴다.
**C. 포장단위에 분말 질량과 현탁 후 부피가 같이 있으면 (2순위)**
`PACK_UNIT`에서 (질량 g, 부피 mL) 쌍을 찾아. 표기가 제각각이니 다 읽어야 해.
83.3그람(용제첨가시150밀리리터) → 83.3 ÷ 150
20g(현탁액으로 30ml)/병 → 20 ÷ 30
100g(150mL용)/병 → 100 ÷ 150
50mL(5.5057g)/병 → 부피가 먼저 나온다. 5.5057 ÷ 50
5.5g/50mL → 슬래시
50밀리리터/병[5.5g] → 대괄호
쌍이 여러 개면 전부 계산해서 같은 값인지 확인해. 다르면 경고해.
`150mL/병`처럼 **부피만 있으면 C는 성립하지 않아** (분말이 몇 g인지 모르니까).
## 결과를 내는 규칙
1. **A → C → B 순서로 하나를 대표값으로 쓴다.** 평균을 내지 마. 평균은 정의에 없는 값이야
2. 경로가 둘 이상 나오면 **서로 대조해서 0.01을 넘게 어긋나면 경고**를 띄워
⚠️ **값이 이상해 보인다고 그 경로를 버리지 마.** 「환산계수는 보통 0.1~0.8이니 그 밖은 파싱
오류일 것」 같은 범위 판단을 넣지 마라. 실제로 1.0에 가까운 제품이 있을 수 있고, 버리는 순간
**정답을 숨기게 된다.** 이상해 보이면 **경고를 띄우되 서열대로 대표값을 정하고 후보를 전부 보여줘.**
판단은 약사가 한다.
3. **셋 다 안 되면 값을 내지 마.** 이렇게 안내해:
허가사항에서 확인 불가
이 제품은 허가사항에 환산계수 근거가 없습니다.
병 라벨의 농도와 역가를 넣어주세요.
4. **다른 제품 값을 참고로라도 먼저 보여주지 마.** 숫자를 보면 확인하지 않고 맞춰 읽게 돼
5. 약사가 값을 **입력한 뒤에는** 같은 성분 제품들의 역가와 대조해서, 어긋나면 되물어
같은 성분 제품들은 역가가 37.50mg/g인데 입력하신 값은 25.00mg/g입니다. 맞나요?
⚠️ **같은 성분 제품을 찾을 때 `item_ingr_name`에는 영문 성분명을 넣어야 해.**
상세 조회 응답의 `MAIN_INGR_ENG`를 그대로 쓰면 돼. 한글을 넣으면 **0건**이 나온다.
item_ingr_name=세파클러수화물 → 0건 ← 이렇게 하면 안 됨
item_ingr_name=Cefaclor Hydrate → 174건 ← MAIN_INGR_ENG 값 그대로
그리고 이 API는 **모르는 파라미터를 조용히 무시하고 전체를 돌려준다.** `main_item_ingr` 같은
이름을 쓰면 42,980건(전체)이 오니, 결과 건수가 비정상으로 크면 성분 대조를 하지 말고 넘어가.
6. 그 제품 **자신의 허가사항 역가**와도 대조해. 형제보다 이쪽이 먼저야 —
같은 성분이어도 제조사가 희석을 다르게 하면 그 제품만 값이 다르다 (크로세프가 그 경우).
## 화면
### 입력
- 제품명 검색 · 1회 mL · 1일 횟수 · 일수. **처방 줄을 여러 개 넣을 수 있게**
(각 줄은 독립 계산이야. 합산하지 마)
- **검색 버튼은 두지 마.** 제품명을 치면 300ms쯤 뒤에 후보가 뜨고, 고르면 바로 허가사항을 읽어와.
「치고 → 버튼 누르고 → 고르고」는 손이 한 번 더 간다
### 칭량량을 보여주기 전에 입력을 한 번 되짚게 해줘
**0 g을 조제할 일은 없어.** 그런데 1회 mL을 넣기 전에 `0.00g 칭량`이 떠 있으면,
아직 덜 넣은 건지 진짜 0인지 구분이 안 돼. 그 숫자는 아예 보이면 안 돼.
1. 제품을 고르고 1회 mL · 1일 횟수 · 일수를 넣는다
→ 아직 칭량량을 보여주지 마. 「1회 mL을 넣으세요」처럼 뭐가 비었는지만 알려줘
2. 세 칸이 다 차면 **바로** 입력값을 되짚는 문구가 뜬다
입력한 내용이 맞나요?
대화세파클러수화물건조시럽125mg/5ml
1회 5 mL · 하루 3번 · 5일분 → 처방 총 75 mL
[맞습니다] [고칠게요]
3. «맞습니다»를 눌러야 칭량량이 보인다
⚠️ **«다음» 같은 버튼을 따로 두지 마.** 세 칸이 차면 되짚기가 저절로 떠야 한다.
멈춤은 **한 번**이다 — «맞습니다»를 누르는 그 자리. 버튼을 하나 더 두면
조제대에서 손이 한 번 더 간다.
**조제 실수를 줄이려고 일부러 두는 한 번의 멈춤이야.** 약사가 자기가 넣은 처방을 한 번
복창하는 자리다. «고칠게요»를 누르면 입력으로 돌아간다.
- 되짚기를 지난 뒤에 입력을 고치면 **되짚기 문구가 바로 다시 떠야 해** (위 2번 화면).
고친 값이 확인 없이 통과하면 안 되지만,
조제대에서 손이 한 번 더 가는 것도 안 돼
- 다만 **도구가 읽은 결과를 약사에게 승인시키지는 마.** 되짚는 건 **약사 자신의 입력**이지
도구의 판단이 아니야. 확인을 지나면 환산계수·경로·근거를 한 번에 다 보여주고,
거기에 또 «확인» 버튼을 달지 마
- 인증키 «확인» 버튼은 위에 적은 대로 따로 있어 (조제 전 한 번 설정하는 자리)
### 확인을 지난 뒤 보이는 것 — 클릭 없이 한 화면에
- **칭량량과 완성 총 부피를 같은 크기로 나란히.** 둘 다 크게.
칭량 50.00 g 총 부피 75 mL
약사들이 두 번째로 많이 묻는 게 **「물을 얼마나 넣나」**야. 총 부피가 그 답인데
조제 순서 문장 안에 묻혀 있으면 안 보여. (소수점 2자리. 환산계수는 반올림하지 말고
최종 칭량량만 끊는다)
- ⚠️ **단위를 숫자만큼 굵게 써.** `g`을 작게 쓰면 안 돼.
실제로 이런 질문이 올라온다 — 「환산계수가 0.66이면 99×0.66**mg** 해서 66**mg** 넣고…」
**mg과 g을 헷갈린다.** 근거 줄에도 단위를 끝까지 적어줘.
75 mL × 0.6667 g/mL = 50.00 g
- **환산계수와 어느 경로로 구했는지.** 다만 `경로 A` 같은 말만 쓰면 독자는 그게 뭔지 몰라.
**눌러서 펼치는 설명을 달아줘.** 접혀 있어도 되지만 무슨 뜻인지 한 줄로 풀어 써야 해
경로 A ⓘ 무슨 뜻인가요?
허가사항 「총량」에 분말 몇 g이 몇 mL가 되는지 적혀 있어, 그 두 숫자로 바로 구했습니다.
환산계수의 정의 그대로라 가장 확실합니다.
경로 C ⓘ 무슨 뜻인가요?
허가사항 「포장단위」에 분말 g과 현탁 후 mL가 같이 적혀 있어, 그 두 숫자로 구했습니다.
정의 그대로라 A와 같은 급입니다.
경로 B ⓘ 무슨 뜻인가요?
총량·포장에 부피가 없어서, 제품명의 농도를 허가사항의 역가로 나눠 구했습니다.
「어느 성분의 역가인가」를 고르는 단계가 하나 더 들어갑니다.
- **근거가 된 허가사항 원문 그대로**
- **성상(`CHART`)을 접지 말고 칭량량 바로 아래 한 줄로.**
성상 이 약은 쓸 때 녹여쓰는 딸기향의 분홍색 시럽제이다. (허가사항 원문)
**왜 이게 중요하냐면** — 건조시럽 중에는 물에 타서 주는 것도 있고 가루로 그냥 주는 것도 있어서,
약사들이 그 구분을 묻는다. 성상에 그 답이 적혀 있다.
⚠️ **원문 그대로만 실어.** 도구가 「녹여 주세요」로 바꿔 쓰지 마 — 표현이 제품마다 다르고,
해석을 넣는 순간 근거가 아니라 판단이 된다.
- **허가사항 저장방법·유효기간에는 「분말 기준」을 글자로 박아.** 약사 화면에만 둔다.
저장방법 (건조시럽 = 분말 상태 기준) 차광기밀용기, 실온보관(1~30℃)
유효기간 (미개봉 분말 기준) 제조일로부터 24 개월
⚠️ 물에 탄 뒤의 조건이 아닙니다. 조제 후 보관은 아래에서 정해주세요.
**왜 이게 중요하냐면** — 이 꼬리표가 없으면 약사도 보호자도 「실온보관」을 조제 후 조건으로 읽는다.
실제로 그렇게 오해가 났다.
- **저장방법에 「차광」이 있으면 약사 화면에 알려주되, 라벨에 넣을지는 약사가 고르게 해.**
🌑 이 약은 차광 대상입니다 (분말 기준: 차광기밀용기, 실온보관(1~30℃))
조제 후에도 차광이 필요한지는 허가사항에 없습니다.
☐ 라벨에 「빛이 안 드는 곳에 보관」 넣기
⚠️ 「차광」이라는 글자가 **없으면 아무 말도 하지 마.** 없는 것을 「차광 불필요」로 바꿔 말하면 안 된다.
### 허가사항 원문 보기 — 접어두되 한 번에 열리게
건조시럽은 조제하면서 허가사항 원문을 확인할 일이 많아. 결과 아래에 «허가사항 원문» 토글을 달고,
누르면 아래 순서로 보여줘. **상세조회 응답에 이미 다 들어 있으니 API를 더 부르지 마.**
1. 성상 · 저장방법 · 유효기간 · 포장단위 ← 펼친 상태로
2. 용법용량 (UD_DOC_DATA) ← 펼친 상태로
3. 효능효과 (EE_DOC_DATA) ← 접어둠
4. 사용상의 주의사항 (NB_DOC_DATA) ← 접어둠 (7천 자가 넘는다)
5. 첨가제 (INGR_NAME) ← 접어둠. 색소·향 문의에 쓴다
6. 식약처 원문 PDF 링크 (EE_DOC_ID · UD_DOC_ID · NB_DOC_ID)
1·2번을 펼쳐 두는 이유: 조제대에서 가장 자주 보는 것들이야.
특히 **처방 용법이 허가 용법과 다를 때** 바로 대조할 수 있어야 해.
**`*_DOC_DATA`는 XML이다. 모양이 이렇게 생겼어.**
<DOC title="용법용량" type="UD">
<SECTION title="">
<ARTICLE title="○ 성인 : 세파클러로서 1회 250mg(역가)을 8시간마다 경구 투여한다." />
<ARTICLE title="○ 신기능 손상 환자 : 용량 변화 없이 투여할 수 있다.">
<PARAGRAPH tagName="p"><![CDATA[시럽제인 경우 다음과 같은 현탁액으로 하여 투여한다.]]></PARAGRAPH>
<PARAGRAPH tagName="table"><![CDATA[<tbody>
<tr> <td> <p>체중(Kg)</p> </td> <td> <p>125mg/5mL</p> </td> </tr>
<tr> <td> <p>9</p> <p>18</p> </td> <td> <p>1회2.5mL(1/2티스푼씩) 1일 3회</p> </td> </tr>
</tbody>]]></PARAGRAPH>
</ARTICLE>
</SECTION>
</DOC>
읽는 규칙.
- 내용은 **CDATA 안에** 있다. 벗겨내야 한다
- `<ARTICLE title="…">`의 title은 **제목이자 내용**이다 (자기완결 태그면 그게 전부다)
- ⚠️ **`tagName="table"`인 PARAGRAPH의 CDATA는 `<tbody>` HTML이다. 표로 그려줘.**
태그를 지우고 글자만 남기면 **체중별 용량표가 한 줄로 뭉개진다.** 그럼 못 읽는다
- `<td>` 하나에 `<p>`가 여럿 들어간다 (체중 9와 18이 한 칸에). 줄바꿈으로 구분해줘
- 원문에 없는 내용을 채우지 마. 필드가 비어 있으면 그 항목은 아예 빼
### 출력 두 가지
- **약사용**: 칭량량 + 조제 순서 — `칭량 → 적은 양의 물로 먼저 녹임 → 표시선까지 채움`
- **보호자 안내문·라벨**: 1회 몇 mL · 하루 몇 번 · 며칠 · 먹기 전 흔들기 · **보관**
⚠️ **보호자 라벨에 허가사항 문자열을 싣지 마.** `실온보관` · `차광기밀용기` 같은 저장방법 원문도,
유효기간도, 조제 후 보관 참고 블록의 원문·출처도 안 된다. 라벨은 **약사가 넣은 값만** 나가는 지시문이다.
허가사항의 저장방법은 **분말 기준**이라, 라벨에 실리면 보호자가 조제 후 조건으로 읽는다.
실제로 그렇게 나가서 고친 것이다.
### 라벨의 «보관» 항목 — 반드시 들어가되, 지어내지 마
현탁한 시럽을 상온에 두면 상해. **보관 정보가 없는 라벨은 보호자에게 위험해.**
그런데 **이 API로는 조제 후 보관을 읽어올 수 없어** — `UD_DOC_DATA`가 잘려서 온다.
제품에 따라 허가사항이나 약학정보원에 적혀 있지만 API 응답에는 그 부분이 안 들어온다.
`STORAGE_METHOD`의 `실온보관`은 **분말** 보관 조건이지 물에 탄 뒤가 아니야. 그걸 갖다 쓰면 안 돼.
그러니 이렇게 해줘.
라벨의 「보관」 줄은 항상 둔다 — 빼지 않는다
값은 약사가 넣는다 — [상온 / 냉장] 고르기 + 며칠
비어 있으면 라벨을 완성하지 않는다
- 약사용 화면에 «보관» 입력을 둬: `상온`·`냉장` 중 고르기 + `며칠` 숫자
- **도구가 기본값을 채우지 마.** `7일`이나 `14일` 같은 값을 미리 넣어두면 안 돼.
관행값이라도 그건 이 제품의 근거가 아니야
### 조제 후 보관 — 성분별 표를 넣어두고 근거 링크를 걸어줘
보관 입력 위에 **왜 약사가 직접 넣어야 하는지**를 밝히고, 아는 성분이면 표에서 찾아 보여줘.
조제 후 보관 — 약사가 정합니다
허가사항의 저장방법은 건조시럽(분말) 상태 기준이라, 물에 탄 뒤 조건이 아닙니다.
그리고 조제 후 보관은 이 API로 읽어올 수 없습니다 (UD_DOC_DATA가 잘려서 옵니다).
아래 표를 **도구 안에 넣어두고** `MAIN_INGR_ENG`의 성분으로 찾아 써.
전부 2026-09-28에 원문에서 옮긴 것이다. 문구를 바꿔 쓰지 마.
Amoxicillin (아목시실린·클라불란산)
냉장 · 7일 이내
「조제 후에는 냉장보관하며 7일 이내에 사용한다」 — 허가사항
근거 크라모넥스듀오건조시럽228mg(역가)/5ml
https://nedrug.mfds.go.kr/pbp/CCBBB01/getItemDetail?itemSeq=200100831
Cefaclor (세파클러)
냉장 2~8℃ · 14일 이내
「용시 조제 후 냉장보관(2~8℃)하여 14일 이내 사용하여야 한다」 — 허가사항
근거 크로세프건조시럽
https://nedrug.mfds.go.kr/pbp/CCBBB01/getItemDetail?itemSeq=199102139
Clarithromycin (클래리트로마이신)
실온 · 차광 · 냉장 금지
「보관 및 취급상의 주의(건조시럽제에 한함.) 1) 냉장보관하지 않는다. 2) 실온보관, 차광보존」 — 허가사항
근거 슈클래리건조시럽125mg/5mL
https://nedrug.mfds.go.kr/pbp/CCBBB01/getItemDetail?itemSeq=201205945
Cefpodoxime (세프포독심)
냉소 · 2주 이내
「조제 후 냉소보관하며, 2주 이내에 사용하세요」 — 약학정보원
근거 바난건조시럽50mg/5mL
https://www.health.kr/searchDrug/result_drug.asp?drug_cd=A11A0101A0356
Fluconazole (플루코나졸)
실온 · 14일 이내
「조제 후 실온보관하며, 14일 이내에 사용하세요」 — 약학정보원
근거 디푸루칸건조시럽
https://www.health.kr/searchDrug/result_drug.asp?drug_cd=A11A0310A0249
화면에는 이 모양으로.
⚠️ 같은 성분(Clarithromycin)의 허가사항
「보관 및 취급상의 주의(건조시럽제에 한함.) 1) 냉장보관하지 않는다. 2) 실온보관, 차광보존」
→ 조제 후 실온 · 차광 · 냉장 금지
[원문 보기]
근거: 슈클래리건조시럽125mg/5mL · 2026-09-28 확인. 값은 아래에 직접 넣어주세요.
⚠️ **`MAIN_INGR_ENG`는 표기가 제각각이다. 정확히 같은지로 찾으면 대부분 놓친다.**
실제로 저장된 값들이 이렇다 — 위 표의 성분명이 **들어 있는지**로 찾아야 한다.
Cefaclor · Cefaclor Hydrate
Clarithromycin · Clarithromycin Coated Granules
Amoxicillin Hydrate/Dilute Potassium Clavulanate
Amoxicillin Hydrate/Amoxicillin·Clavulanate Potassium (4:1)
Amoxicillin Hydrate/Amoxicillin·Clavulanate Potassium (7:1)/Dilute Potassium Clavulanate
Amoxicillin·Clavulanate Potassium (4:1)
Cefpodoxime Proxetil
`Cefaclor`로만 찾으면 `Cefaclor Hydrate`가 빠지고, 아목시실린은 다섯 표기 중 하나만 맞는다.
⚠️ 다만 **`Cefadroxil`을 `Cefaclor`로 착각하면 안 된다** — 세파드록실은 표에 없는 성분이고,
근거가 없으니 블록을 그리지 말아야 한다. 부분 일치를 쓸 때 다른 성분까지 걸리지 않는지 봐라.
⚠️ **출처를 「허가사항」과 「약학정보원」으로 갈라 적어.** 등급이 다르다. 뭉뚱그리지 마.
⚠️ **성분마다 다르다.** 냉장 7일 · 냉장 14일 · 실온 냉장금지 · 냉소 2주 · 실온 14일 —
다섯이 다 다르다. 「조제 후 냉장 14일」로 뭉뚱그리면 넷이 틀린다.
⚠️ **표에 없는 성분이면 이 블록을 아예 그리지 마.** 빈 참고란을 만들지 마.
⚠️ **값을 자동으로 채우지 마.** 보여줄 뿐, 상온/냉장과 일수는 약사가 직접 넣는다.
⚠️ **1회분 포장 제품은 조제 후 보관이 해당 없다.** 포장단위가 `0.5g, 0.7g, 1.0g(포)`처럼
g 단위 «포»이고 용법에 「사용시 현탁하여 복용」이 있으면 약국에서 물에 타지 않는 약이다.
그런 제품에는 이 블록을 그리지 말고 「1회분 포장 — 복용 직전에 현탁」이라고만 알려줘.
### 같은 약을 다시 조제할 때 — 지난 값을 제안해
품목기준코드별로 약사가 넣은 보관값을 `localStorage`에 저장했다가, 같은 약을 고르면 제안해.
보관 냉장 · 14일 ← 지난번 이 브라우저에서 넣은 값입니다 (2026-09-28)
[그대로 쓰기] [다시 넣기]
- **자동으로 확정하지 마.** 언제 넣은 값인지 보여주고 약사가 눌러야 들어간다
- 서버로 보내지 마. 그 브라우저에만 둔다
- 비어 있으면 라벨에 이렇게 남기고, 인쇄·복사를 막아줘
⚠ 보관 정보를 넣어야 라벨이 완성됩니다
조제 후 보관은 약사가 직접 넣습니다
- 채워지면 라벨에 이렇게 나가야 해
보관 냉장 보관 · 14일 이내
- «왜 자동으로 안 채워지나요?» 같은 짧은 설명을 한 줄 달아줘 —
「조제 후 보관은 이 API로 읽어올 수 없습니다. 위 참고나 제품설명서·병 라벨을 보고 넣어주세요」
⚠️ **「허가사항에 조제 후 보관이 없다」고 쓰지 마.** 그건 틀린 말이다 —
제품에 따라 **허가사항에 적혀 있다** (세파클러·아목시실린·클래리트로마이신이 그렇다).
API의 `UD_DOC_DATA`가 잘려서 와서 **못 읽어오는 것**이지 없는 게 아니다.
바로 위 참고 블록에서 그 허가사항 원문을 보여주면서 아래에서 「없습니다」라고 하면
도구가 스스로 모순된 말을 한다.
## 통과 기준 — 이걸로 채점할 거야
아래 제품들을 실제로 넣어보고 다음이 나와야 해.
| 제품 | 기대 |
|---|---|
| 대화세파클러수화물건조시럽125mg/5ml | 0.6667 (A). 75mL → 50.00g |
| 락타목스듀오건조시럽 | 0.1101 (A). 75mL → 8.26g |
| 지나시드건조시럽 | 0.6667 (C — 포장 `20g(현탁액으로 30ml)`) |
| 보령듀리세프건조시럽250밀리그램/5밀리리터 | 0.5553 (C — 포장 `83.3그람(용제첨가시150밀리리터)`) |
| 바난건조시럽50밀리그램(역가)/5ml | 0.2000 (B) |
| 클래리시드건조시럽250mg/5mL | 0.7075 (B) |
| 크라모넥스듀오건조시럽228mg(역가)/5ml | **0.1101** — 배합제라 B(0.126)를 쓰면 안 됨 |
| 유한세파클러건조시럽(유클러) | 0.6667 — 총량의 `(125mg/5ml)`를 부피로 읽으면 안 됨 |
| 클라로마건조시럽 | 0.7048 (A) — `분량 8,445`를 역가로 쓰면 안 됨 |
| 크로세프건조시럽 | **확인 불가** — 역가가 25.00mg/g으로 다른 세파클러(37.50)와 다름 |
| 포독스건조시럽 | **확인 불가** — 농도가 어디에도 없음 |
| 삼아아토크건조시럽 | **확인 불가** — 벌크(100g, 300g), 부피 표기 없음 |
그리고 **한 처방에 위 제품이 섞여 있어도, 확인 불가인 줄만 입력칸이 되고 나머지 줄은 그대로 계산돼야 해.**
허가사항 원문 보기도 채점한다.
«허가사항 원문»을 열면 → 성상·저장방법·유효기간·포장단위와 용법용량이 펼쳐져 있다
용법용량의 체중별 표 → 표로 그려진다 (한 줄로 뭉개지면 실패)
저장방법에 「차광」이 있는 제품 → 🌑 차광 배지가 뜬다
저장방법에 「차광」이 없는 제품 → 배지가 안 뜬다 (「차광 불필요」라고 쓰면 실패)
성상 → 접히지 않고 칭량량 아래에 원문 그대로
총 부피 → 칭량량과 같은 크기로 보인다
인증키 «확인»도 채점한다. **상태코드가 아니라 본문으로 갈라야 통과다.**
엉터리 키 (HTTP 403 + returnReasonCode 30) → 「인증 오류입니다」 ← 「서버 오류」면 실패
빈 키 (HTTP 401 + 같은 모양) → 「인증 오류입니다」 ← 「서버 오류」면 실패
fetch가 throw → 「요청이 막혔습니다」 + 아티팩트 미리보기 안내
HTTP 500 (본문에 인증 표시 없음) → 「서버가 오류를 냈습니다 (HTTP 500)」
정상 키 (HTTP 200 + resultCode 00) → 「키가 동작합니다」
보관 항목도 채점한다.
보관을 아직 안 넣은 상태의 라벨에 허가사항 문자열이 실리면 → 실패
(「실온보관」·「차광기밀용기」 같은 저장방법 원문)
약사가 [상온]을 골랐을 때 라벨에 「상온 · 7일」이 안 나가면 → 실패
(그건 약사의 지시다. 막으면 안 된다 — 금지 대상은 «허가사항에서 온 값»뿐이다)
약사 화면 저장방법에 「건조시럽 = 분말 상태 기준」이 없으면 → 실패
Clarithromycin 제품 → 「실온 · 차광 · 냉장 금지」가 참고로 뜬다 (냉장이라고 하면 실패)
Amoxicillin 제품 → 「냉장 · 7일 이내」가 뜬다 (10일·14일이라고 하면 실패)
Cefaclor 제품 → 「냉장 2~8℃ · 14일 이내」
Cefpodoxime 제품 → 「냉소 · 2주 이내」 + 출처가 «약학정보원»으로 적힌다
Fluconazole 제품 → 「실온 · 14일 이내」 + 출처가 «약학정보원»으로 적힌다
표에 없는 성분 → 참고 블록이 아예 안 그려진다 (빈 칸을 만들면 실패)
참고 문구를 보여준 뒤에도 → 보관 칸은 비어 있다 (자동 채움 0건)
보관을 안 넣은 상태 → 라벨에 「⚠ 보관 정보를 넣어야 라벨이 완성됩니다」, 인쇄 막힘
[냉장] + 14 입력 → 라벨에 「보관 냉장 보관 · 14일 이내」
도구가 기본값을 미리 채워두는 일 → 0건 (빈 상태로 시작해야 함)
경로가 어긋나는 경우도 채점한다. 아래 입력을 넣으면 **A를 버리지 말고** 이렇게 나와야 해.
총량 : 100그램(100mL) 중|성분명 : 세파클러수화물|분량 : 3.75|단위 : 그램|비고 : 역가
품목명: 대화세파클러수화물건조시럽125mg/5ml
기대: A 1.0000 · B 0.6667 → 0.01 넘게 어긋남 경고, 대표값은 서열대로 A(1.0000)
## 안 해도 되는 것
- 체중 입력 (용량은 처방전에 이미 나와 있어)
- 여러 시럽을 한 병에 합산하는 기능 (섞지 않아)
- AI·LLM 호출 (계산은 코드로만)
- 로그인·서버 저장
위 프롬프트에 나와있는
<허가사항에서 환산계수 구하는 경로 3가지> 간단 정리
경로 | 정보 획득 경로 | 예 |
|---|---|---|
A | 허가사항 «원료약품 및 그 분량»의 총량에 부피가 같이 적혀 있을 때 |
|
C | 포장단위에 분말 g과 현탁 후 mL가 같이 나와있을 때 |
|
B | 둘 다 없으면, 품목명의 농도를 역가로 나눔 |
|
Step 4. 제작한 HTML 도구 사용하기
Step 3의 결과물을 클로드 아티팩트(대화창 옆에 뜨는 결과물 화면)로도 볼 수 있지만, 아티팩트에서는 외부 API 호출이 막혀 있어 허가사항 조회가 안 됩니다.
[다운로드]를 눌러 HTML 파일을 저장하고, 그 파일을 클릭하면 브라우저에서 열려요.
1/ Step 1에서 받은 공공데이터포털 API 인증키 넣고 [확인] 누르기
키가 제대로 들어갔는지 여기서 바로 알 수 있어요.
✅ 키가 동작합니다 — 정상
❌ 인증 오류입니다 — 키를 다시 확인하세요
❌ 요청이 막혔습니다 — Claude 아티팩트 미리보기에서 열었다면 그게 원인입니다.
2/ 약품명과 처방 내역 입력하기
약품명을 치면 후보가 뜨고, 선택하면 허가사항을 읽어옵니다.
1회 mL · 1일 횟수 · 일수 칸에 처방 내역대로 숫자를 넣으면, 입력한 내용을 확인하는 팝업란이 뜹니다.
조제 실수를 막기 위해 한 번 멈추게 한 장치예요.
확인 후 [맞습니다]를 누르면 다음 단계로 넘어갑니다.
cf) 허가사항에서 환산계수를 도출하기 어려운 경우, 병 라벨에 적힌 농도와 역가를 입력하라는 요청이 뜹니다.
3/ 칭량량을 확인합니다
계산 과정 및 근거를 함께 확인할 수 있어요.
Step 5. 보호자 안내문·라벨 만들기
화면 아래쪽에서 복약 라벨 칸을 볼 수 있습니다.
라벨은 환자 및 보호자에게 안내하는 용도이기 때문에, 당연히 시럽으로 조제된 약품의 보관 방법(온도 및 일수)을 안내해야 하는데요.
약품에 따라 허가사항 정보에 '조제 후 보관' 정보가 없는 경우가 있습니다. 그럴 경우 조제 후 보관 방법이 허가사항에 나와있는 같은 성분 다른 제품 정보를 볼 수 있게 설정했어요.
약사가 확인 후 선택 및 입력하도록 만들었습니다.
도구가 허가사항을 찾고 계산하는 시간은 줄여 주지만,
최종 검수는 약사가 꼭 해야 하는 것 잊지 마세요!
오늘 내용이 도움 되셨다면,
주변 동료분들께 많이 공유해주세요💚
약토피아의 다른 채널이 궁금하다면?
💛 약토피아 AI 오픈카톡방 (참여코드: 0327)
650명 이상의 약사/제약인 분들이 참여하고 있어요!

