브레인다이브
경력근거: 두 제품으로 보건교사의 업무와 학교 보건실의 구매 경험을 함께 개선하며, 새로운 시장으로 확장하고 있습니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
브레인다이브가 운영하는 스마일보건은 보건교사가 무료로 쓰는 학교 보건 행정 서비스로, 학생을 이름으로 찾아 증상을 고르면 처치·투약 기록이 남고 의약품 관리 기능도 있어요. 공고는 학교 보건실에 필요한 의약품 등을 파는 스마일몰과 함께 두 제품으로 보건실의 구매 경험까지 개선한다고 소개해요.
공고는 회사를 '학교 보건 행정 서비스 스마일보건과 학교 보건실에 필요한 의약품 등을 판매하는 스마일몰을 함께 운영합니다' 라고 소개하고, '두 제품으로 보건교사의 업무와 학교 보건실의 구매 경험을 함께 개선하며' 새로운 시장으로 넓혀 간다고 적어요. 보건실 약은 입고분마다 유효기간이 다르고 투약은 수업이 있는 날에만 생겨서, 입고 기록과 투약 기록을 맞춰 세지 않으면 남은 양과 다음 구매 때까지 쓸 양을 가늠하기 어려워요. 보건일지에 쌓인 투약 기록으로 다음에 살 약을 정하는 일은 보건교사의 업무와 보건실의 구매를 함께 다루는 이 공고의 방향과 바로 이어져요.
공고는 학교 보건 행정 서비스 스마일보건과, 학교 보건실에 필요한 의약품 등을 파는 스마일몰을 함께 운영한다고 소개해요. 스마일보건은 출시 2년 만에 전국 학교 보건실 30%가 쓰는 서비스가 됐다고 적었어요.
공고는 이 자리가 보건교사·학교 고객과 현업 동료를 직접 인터뷰하고, 화면 공유나 업무 기록으로 실제 일하는 방식을 관찰한다고 적어요. 그렇게 말로 나오지 않는 규칙과 예외를 찾아내는 일을 맡겨요.
자격 요건으로 데이터 모델링부터 화면, 배포까지 혼자서 끝낼 수 있는 분과, 만든 서비스를 실제 사용자에게 도입해 본 경험을 꼽았어요.
보건교사가 학교가 정한 구매 회차마다 이번에 살 약을 정하려고 여는 관리자 페이지예요. 약마다 지금 쓸 수 있는 양으로 다음 구매 때까지 버티는지, 다음 구매 전에 유효기간이 끝나는 양 때문에 모자라지는 않는지, 요즘 쓰지 않는 약은 무엇인지 알려 주고, 모자라는 약에는 더 살 양을 붙여 줘요. 받은 데이터를 담을 DB 설계와 기술·구조, 그리고 쓰는 속도를 잴 최근 기간은 지원자가 정해요.
학교 보건실을 맡은 보건교사예요. 보건실 약은 입고분마다 유효기간이 다르고 투약은 수업이 있는 날에만 나가서, 남은 양·쓰는 속도·유효기간·방학과 공휴일을 한꺼번에 따지지 않으면 다음 구매 때까지 무엇을 얼마나 사야 할지 정하기 어려워요.
보건실에서 학생에게 내주는 약과 물품의 코드표예요. 한 행이 약 하나이고 item_id 가 키예요. name 은 제품 이름과 함량·규격이고, unit 은 입고분과 투약 기록의 quantity 가 세는 단위(정·포·매·개)예요. 같은 약은 어느 학교에서나 같은 item_id·같은 이름이고, 일회용 밴드와 습윤 밴드처럼 이름 일부가 같은 다른 물품은 따로 있어요. 큰 데이터는 학교 200곳이 쓰는 약·물품 30종이고, 시작용은 그 가운데 솔빛중학교 보건실이 2학기에 가진 12종이에요.
전체 12행 가운데 앞 5행이에요.
| item_id | name | unit |
|---|---|---|
| IT-001 | 아세트아미노펜정 500mg | 정 |
| IT-002 | 이부프로펜정 200mg | 정 |
| IT-003 | 소화효소정 | 정 |
| IT-004 | 제산제 현탁액 15mL | 포 |
| IT-005 | 멀미약정 | 정 |
12행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 30행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "약·물품 하나. 키는 item_id.",
"additionalProperties": false,
"required": [
"item_id",
"name",
"unit"
],
"properties": {
"item_id": {
"type": "string",
"pattern": "^IT-[0-9]{3}$",
"description": "약·물품 코드. 이 표의 키예요. 같은 약은 어느 학교에서나 같은 코드예요."
},
"name": {
"type": "string",
"description": "제품 이름과 함량·규격. 같은 약은 어느 학교에서나 같은 글자예요."
},
"unit": {
"type": "string",
"enum": [
"정",
"포",
"매",
"개"
],
"description": "입고분과 투약 기록의 quantity 가 세는 단위예요."
}
}
}보건실에 약이 들어온 기록이에요. 한 행이 한 번에 들어온 같은 약·같은 유효기간의 묶음(입고분) 하나이고 lot_id 가 키예요. item_id 는 items.item_id 를 가리키고, school_id 는 약이 들어온 학교예요. kind 는 purchase(구매해서 들어옴)와 carryover(학기 초 재고 점검 때 남아 있던 약을 다시 올림) 둘 중 하나예요. 이 데이터에서 학교는 학기마다 개학 전에 재고 점검을 하고, 그때 남은 약을 원래 유효기간 그대로 carryover 입고분으로 올려요. 점검 전에 들어온 입고분에서는 점검 뒤로 더 꺼내 쓰지 않고, 점검 때 이미 유효기간이 지난 약은 올리지 않아요. received_at 은 보건실에서 입고를 등록한 시각이고, expires_on 은 상자에 적힌 사용기한으로 그날까지 쓸 수 있어요. 같은 학교·같은 약에서 한 재고 점검 때 올린 입고분과 그 뒤 다음 점검 전까지 들어온 입고분끼리는, 나중에 들어온 입고분의 유효기간이 먼저 들어온 입고분보다 이르지 않아요. 이 데이터에서 보건실은 같은 약이면 먼저 들어온 입고분(lot_id 가 앞선 것)부터 꺼내 쓰고, 유효기간이 지난 입고분에서는 꺼내지 않아요. 유효기간이 이미 지났는데 약이 남은 입고분, 다음 구매 전에 유효기간이 끝나는 입고분, 한 약에 유효기간이 다른 입고분이 둘인 경우, 구매할 약을 정한 다음 날 들어온 구매 입고분이 들어 있어요. 큰 데이터는 학교 200곳의 2026년 2월 말 재고 점검부터 10월 27일까지 입고분 전부이고, 시작용은 솔빛중학교의 8월 21일 재고 점검부터 10월 27일까지 입고분 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 20행 가운데 앞 5행이에요.
| lot_id | school_id | item_id | kind | received_at | quantity | expires_on |
|---|---|---|---|---|---|---|
| LT-007671 | SC-0418 | IT-001 | carryover | 2026-08-21T10:00:00+09:00 | 38 | 2026-10-16 |
| LT-007672 | SC-0418 | IT-001 | carryover | 2026-08-21T10:00:00+09:00 | 17 | 2027-08-31 |
| LT-007673 | SC-0418 | IT-002 | carryover | 2026-08-21T10:00:00+09:00 | 34 | 2026-10-30 |
| LT-007674 | SC-0418 | IT-002 | carryover | 2026-08-21T10:00:00+09:00 | 2 | 2027-05-31 |
| LT-007675 | SC-0418 | IT-003 | carryover | 2026-08-21T10:00:00+09:00 | 20 | 2026-11-06 |
20행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 9,766행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "보건실에 들어온 입고분 하나. 키는 lot_id.",
"additionalProperties": false,
"required": [
"lot_id",
"school_id",
"item_id",
"kind",
"received_at",
"quantity",
"expires_on"
],
"properties": {
"lot_id": {
"type": "string",
"pattern": "^LT-[0-9]{6}$",
"description": "입고분 번호. 이 표의 키예요. 같은 학교·같은 약에서는 먼저 들어온 입고분이 앞 번호이고, 같은 시각에 함께 올린 입고분은 유효기간이 이른 것이 앞 번호예요."
},
"school_id": {
"type": "string",
"pattern": "^SC-[0-9]{4}$",
"description": "약이 들어온 학교 코드. 모든 표에서 같은 학교는 같은 코드예요."
},
"item_id": {
"type": "string",
"pattern": "^IT-[0-9]{3}$",
"description": "들어온 약. items.item_id 를 가리켜요."
},
"kind": {
"type": "string",
"enum": [
"purchase",
"carryover"
],
"description": "purchase 는 구매해서 들어온 입고분, carryover 는 학기 초 재고 점검 때 그때 남아 있던 약을 원래 유효기간 그대로 다시 올린 입고분이에요."
},
"received_at": {
"type": "string",
"format": "date-time",
"description": "보건실에서 입고를 등록한 시각. 한국 시간(+09:00) ISO 8601, 초 단위."
},
"quantity": {
"type": "integer",
"minimum": 1,
"description": "들어온 양(items.unit 단위의 정수). carryover 는 점검 때 센 양이에요."
},
"expires_on": {
"type": "string",
"format": "date",
"description": "상자에 적힌 사용기한(한국 날짜). 이 날까지 쓸 수 있어요."
}
}
}보건실에서 학생에게 약이나 물품을 내준 기록이에요. 한 행이 한 번 내준 것이고 log_id 가 키예요. item_id 는 items.item_id 를 가리키고, school_id 는 stock_receipts.school_id 와 같은 학교 코드예요. quantity 는 그때 내준 양으로 items.unit 단위의 정수이고, given_at 은 보건교사가 보건일지에 투약을 남긴 시각이에요. 어느 입고분에서 꺼냈는지는 적혀 있지 않아요. 투약은 수업일에만 있고, 수업일이어도 투약이 하나도 없는 날이 있어요. 감기철에 쓰는 양이 늘어난 약, 학기 초에 많이 쓰다가 줄어든 물품, 체육대회 뒤 며칠 몰린 물품, 몇 주째 내준 적이 없는 약, 이른 아침 등교 시간의 투약, 구매할 약을 정한 다음 날의 투약이 들어 있어요. 큰 데이터는 학교 200곳의 2026년 3월부터 10월 27일까지 투약 전부이고, 시작용은 솔빛중학교의 8월 21일 재고 점검 뒤부터 10월 27일까지 투약 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 187행 가운데 앞 5행이에요.
| log_id | school_id | item_id | given_at | quantity |
|---|---|---|---|---|
| ML-0166813 | SC-0418 | IT-011 | 2026-08-24T09:03:06+09:00 | 1 |
| ML-0166927 | SC-0418 | IT-006 | 2026-08-24T09:38:45+09:00 | 1 |
| ML-0167051 | SC-0418 | IT-011 | 2026-08-24T10:17:00+09:00 | 1 |
| ML-0167477 | SC-0418 | IT-002 | 2026-08-24T12:25:25+09:00 | 1 |
| ML-0168361 | SC-0418 | IT-011 | 2026-08-25T08:36:29+09:00 | 1 |
187행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 234,979행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "보건실에서 약이나 물품을 한 번 내준 기록. 키는 log_id.",
"additionalProperties": false,
"required": [
"log_id",
"school_id",
"item_id",
"given_at",
"quantity"
],
"properties": {
"log_id": {
"type": "string",
"pattern": "^ML-[0-9]{7}$",
"description": "투약 기록 번호. 이 표의 키예요."
},
"school_id": {
"type": "string",
"pattern": "^SC-[0-9]{4}$",
"description": "약을 내준 학교 코드. stock_receipts.school_id 와 같은 코드예요."
},
"item_id": {
"type": "string",
"pattern": "^IT-[0-9]{3}$",
"description": "내준 약. items.item_id 를 가리켜요. 어느 입고분에서 꺼냈는지는 적혀 있지 않아요."
},
"given_at": {
"type": "string",
"format": "date-time",
"description": "보건교사가 보건일지에 투약을 남긴 시각. 한국 시간(+09:00) ISO 8601, 초 단위. 이 시각의 한국 날짜는 언제나 그 학교의 수업일이에요."
},
"quantity": {
"type": "integer",
"minimum": 1,
"description": "그때 내준 양(items.unit 단위의 정수)."
}
}
}학교마다 날짜별로 수업이 있는 날인지 적은 학사일정이에요. 한 행이 한 학교의 하루이고 school_id 와 date 묶음이 키예요. school_id 는 stock_receipts.school_id 와 같은 학교 코드이고, date 는 한국 날짜예요. day_type 은 school_day(수업일)·weekend(주말)·public_holiday(공휴일·대체공휴일)·school_closure(재량휴업일)·vacation(방학) 가운데 하나예요. 방학과 재량휴업일은 학교마다 달라요. 추석 연휴와 대체공휴일·한글날·재량휴업일이 몰린 주, 아직 오지 않은 다음 구매일까지의 날짜도 들어 있어요. 큰 데이터는 학교 200곳의 2026년 3월 1일부터 12월 31일까지 날짜 전부이고, 시작용은 솔빛중학교의 8월 21일부터 11월 23일까지 날짜 전부를 같은 값으로 잘라 낸 것이에요.
전체 95행 가운데 앞 5행이에요.
| school_id | date | day_type |
|---|---|---|
| SC-0418 | 2026-08-21 | vacation |
| SC-0418 | 2026-08-22 | weekend |
| SC-0418 | 2026-08-23 | weekend |
| SC-0418 | 2026-08-24 | school_day |
| SC-0418 | 2026-08-25 | school_day |
95행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 61,200행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "한 학교의 하루. 키는 (school_id, date) 묶음.",
"additionalProperties": false,
"required": [
"school_id",
"date",
"day_type"
],
"properties": {
"school_id": {
"type": "string",
"pattern": "^SC-[0-9]{4}$",
"description": "학교 코드. stock_receipts.school_id 와 같은 코드예요."
},
"date": {
"type": "string",
"format": "date",
"description": "한국 날짜."
},
"day_type": {
"type": "string",
"enum": [
"school_day",
"weekend",
"public_holiday",
"school_closure",
"vacation"
],
"description": "school_day 는 수업일, weekend 는 주말, public_holiday 는 공휴일·대체공휴일, school_closure 는 그 학교가 정한 재량휴업일, vacation 은 방학이에요. 공휴일이 주말·방학과 겹치면 public_holiday, 주말이 방학과 겹치면 weekend 로 적어요. 수업일이 아닌 날에는 보건실 투약이 없어요."
}
}
}학교가 정한 약품 구매 회차예요. 한 행이 한 학교의 구매 한 번이고 plan_id 가 키예요. school_id 는 stock_receipts.school_id 와 같은 학교 코드이고, school_name 은 학교 이름이에요. planned_on 은 보건교사가 이번 회차에 살 약을 정하는 날로, 이 기능이 '지금'으로 삼는 날이에요. 그날 수업이 끝난 뒤 정하므로 그날 투약까지 모두 기록에 들어 있어요. next_purchase_on 은 다음 회차에 산 약이 보건실에 들어오는 날로, 그날 수업부터는 다음 회차 약을 쓸 수 있어요. planned_on 뒤의 투약·입고도 다른 표에 그대로 남아 있어요. 큰 데이터는 학교 200곳의 2026년 구매 회차 전부이고, 시작용은 솔빛중학교의 10월 26일 회차 하나예요.
전체 1행 가운데 앞 1행이에요.
| plan_id | school_id | school_name | planned_on | next_purchase_on |
|---|---|---|---|---|
| PP-00747 | SC-0418 | 솔빛중학교 | 2026-10-26 | 2026-11-23 |
1행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 747행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "한 학교의 약품 구매 한 번. 키는 plan_id.",
"additionalProperties": false,
"required": [
"plan_id",
"school_id",
"school_name",
"planned_on",
"next_purchase_on"
],
"properties": {
"plan_id": {
"type": "string",
"pattern": "^PP-[0-9]{5}$",
"description": "구매 회차 번호. 이 표의 키예요."
},
"school_id": {
"type": "string",
"pattern": "^SC-[0-9]{4}$",
"description": "구매하는 학교 코드. stock_receipts.school_id 와 같은 코드예요."
},
"school_name": {
"type": "string",
"description": "학교 이름. 같은 school_id 는 어느 회차에서나 같은 이름이에요."
},
"planned_on": {
"type": "string",
"format": "date",
"description": "보건교사가 이번 회차에 살 약을 정하는 날(한국 날짜). 이 기능이 '지금'으로 삼는 날이에요. 그날 수업이 끝난 뒤 정하므로 그날 투약까지 모두 기록에 들어 있어요."
},
"next_purchase_on": {
"type": "string",
"format": "date",
"description": "다음 회차에 산 약이 보건실에 들어오는 날(한국 날짜). 그날 수업부터는 다음 회차 약을 쓸 수 있어요."
}
}
}근거: 두 제품으로 보건교사의 업무와 학교 보건실의 구매 경험을 함께 개선하며, 새로운 시장으로 확장하고 있습니다.