# 의료 앱 백엔드 및 데이터베이스

> 의료 앱 백엔드와 데이터베이스가 처리해야 하는 내용, Anpheros가 관리형 의료 데이터베이스로 제공하는 부분, 백엔드에 남는 부분, 연결하는 세 가지 방법, 웹훅으로 동기화 상태를 유지하는 방법.

Source: https://developers.anpheros.com/ko/guides/medical-app-backend

**의료 앱 백엔드는 헬스케어 애플리케이션의 서버 측입니다. 환자 데이터를 저장하고, 누가 데이터를 볼 수 있는지 강제하며, 변경 이력을 유지하고, 실험실, 클리닉 및 기타 서비스와 통신합니다.** Anpheros를 사용하면 백엔드의 의료 부분, 즉 각 환자의 기록, 변경 이력, 동의, 출처, 감사, 실험실 가져오기 및 이벤트를 보유하는 헬스케어 데이터베이스는 API를 통해 플랫폼에서 제공되며, 자체 백엔드는 제품에 특정한 내용만 유지합니다.

## 의료 백엔드가 처리해야 하는 사항

| 책임 | 의료 분야에서 어려운 이유 | Anpheros 사용 시 |
|---|---|---|
| 의료 데이터 모델 | 수십 가지 종류의 데이터, 각 표준 코드 포함 | HL7 FHIR R4, 26가지 리소스 유형, LOINC / ICD-10 / ATC / UCUM |
| 버전 관리 | 의료 데이터는 수정되지만, 조용히 덮어쓰여지지 않음 | 모든 업데이트는 새 버전; 조건부 업데이트 시 `If-Match` |
| 문서 | 원본은 변경되지 않고 추적 가능해야 함 | SHA-256으로 불변 원본, 고객 관리 키로 암호화된 EU 스토리지 |
| 접근 제어 | 환자별, 애플리케이션별, 데이터 유형별 | 프로젝트 격리, 쌍별 ID, 카테고리 필터가 있는 OAuth 범위 |
| 동의 | 환자가 결정하고 마음을 바꿀 수 있음 | 30~365일 동안 부여, 철회 가능, FHIR `Consent`로 미러링 |
| 감사 | 환자와 규제 기관이 누가 무엇을 보았는지 질문함 | 모든 읽기 및 쓰기 기록이 환자에게 표시됨 |
| 출처 | 실험실의 값은 환자가 입력한 값이 아님 | 모든 쓰기에 작성자 유형, 조직, 실무자 및 소스 시스템 포함 |
| 통합 | 실험실은 CSV, HL7 v2, JSON 전송; 앱은 이벤트 필요 | 실험실 가져오기, FHIR 트랜잭션, 서명된 웹훅 |
| 안전한 재시도 | 중복된 약물 또는 결과는 임상 오류 | 모든 생성 시 `Idempotency-Key` |
| 테스트 데이터 | 실제 환자는 개발에 절대 포함될 수 없음 | 합성 환자가 있는 샌드박스 데이터베이스 |

## 백엔드에 유지해야 할 항목

- **사용자 및 계정** 정보와 각 사용자와 Anpheros 환자 ID(프로젝트에서 인식하는 쌍별 ID) 간의 매핑
- 의료 관련이 아닌 **제품 데이터**: 설정, 구독, 콘텐츠, 알림 일정
- **비즈니스 규칙**: 직원 중 누가 제품 내에서 어떤 환자를 볼 수 있는지에 대한 규칙
- **API 키**: 모바일 또는 웹 앱 내부에 절대 포함해서는 안 되는 항목

## 연결하는 세 가지 방법

**1. 백엔드에서 API 키 보유 (가장 일반적).** 앱이 백엔드로 호출하고, 백엔드가 `sk_live_` 키를 사용하여 Anpheros에 호출하며, 프로젝트에서 생성한 환자를 확인합니다.

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';
const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// GET /api/me/vitals in your backend, after your own authentication
export async function myVitals(user: { anpherosPatientId: string }) {
  const page = await anpheros.observations.list(user.anpherosPatientId, { category: 'vital-signs', limit: 50 });
  return page.data;
}
```

**2. 앱이 OAuth를 통해 환자를 대행.** 이미 Anpheros 기록이 있는 사용자의 경우, 모바일 또는 웹 앱은 PKCE를 사용하는 *공개* OAuth 클라이언트입니다. 사용자가 호스팅된 페이지에서 동의하면 앱은 해당 기록에 대한 30분 액세스 토큰과 순환 갱신 토큰을 받습니다. SDK는 이 흐름을 구현합니다(`OAuthFlow`).

**3. 서버 간 파트너.** 비밀 키(서버에 보관)를 가진 비밀 클라이언트는 authorization-code 흐름 또는 `client_credentials`을 사용할 수 있으며, 이는 해당 프로젝트에 대한 API 키와 유사하게 작동합니다.

## 백엔드 동기화 유지

폴링 대신 웹훅을 구독하십시오. 전달은 서명(`Anpheros-Signature`, 타임스탬프 및 본문에 대한 HMAC-SHA256), 최소 한 번 전달되며 순서가 바뀔 수 있습니다. 이벤트 ID로 중복을 제거하고 오래된 버전을 무시하십시오.

```ts
import { verifyWebhookSignature } from '@anpheros/sdk';

app.post('/anpheros/hook', express.raw({ type: 'application/json' }), async (req, res) => {
  const ok = await verifyWebhookSignature({ secret: process.env.ANPHEROS_WEBHOOK_SECRET!, header: req.header('anpheros-signature'), body: req.body });
  if (!ok) return res.status(400).end();
  const event = JSON.parse(req.body.toString());   // ids and versions only — read the resource if you need it
  res.status(204).end();
});
```

## 오류 및 제한 처리

- `404`은 레코드가 존재하지 않는다는 증거가 아니라 "사용자에게 보이지 않음"으로 처리하십시오.
- `403`은 자격 증명이 존재하지만 이 작업을 수행하지 못할 수 있음을 의미합니다. 누락된 범위 또는 다른 조직에서 작성한 리소스일 수 있습니다.
- `429`는 `Retry-After`과 함께 제공됩니다. SDK는 `5xx`와 마찬가지로 자동으로 대기하고 다시 시도합니다.
- 지원을 위해 실패한 호출의 `Anpheros-Request-Id`을 보관하십시오.

[오류](https://developers.anpheros.com/ko/guides/errors) · [제한 및 속도 제한](https://developers.anpheros.com/ko/guides/limits)

## 자주 묻는 질문

### 의료 앱은 어떤 데이터베이스를 사용해야 하나요?
의료 데이터를 표준화되고 버전 관리되는 형태로 유지하며 환자별로 접근을 제어하는 데이터베이스를 사용해야 합니다. Anpheros는 HL7 FHIR R4를 기반으로 구축된 관리형 의료 데이터베이스입니다. 각 환자의 기록은 버전 관리 및 검색이 가능하며, 모든 쓰기 작업에는 출처가 기록되고, 애플리케이션은 해당 기록을 생성했거나 환자가 동의한 경우에만 환자 데이터에 접근할 수 있습니다. 제품의 나머지 데이터(계정, 결제, 콘텐츠)는 자체 데이터베이스에 보관하세요. 자체 테이블을 설계하는 것에 대한 절충점은 [FHIR vs. 맞춤형 의료 데이터베이스](https://developers.anpheros.com/ko/guides/fhir-vs-custom-database)를 참조하세요.

### 의료 앱을 위한 무료 데이터베이스가 있나요?
네. Anpheros 샌드박스는 무료입니다. Google로 로그인하고 한 번의 클릭으로 키를 발급받으면 프로젝트당 30명의 합성 환자와 하루 최대 10,000개의 쓰기 작업을 사용할 수 있습니다. 프로덕션은 월 €99부터 시작하며 2,500명의 환자를 지원합니다. 첫 달은 무료이며, 프로덕션 접근은 데이터 처리 계약에 서명한 검증된 조직에 제공됩니다. [가격](https://developers.anpheros.com/ko/guides/pricing)을 참조하세요.

### 무료 샌드박스에 실제 환자 데이터를 보관할 수 있나요?
아니요. 샌드박스는 합성 데이터 전용입니다. 각 샌드박스 프로젝트는 자체 합성 환자를 가지며, 샌드박스 키는 프로덕션에 접근할 수 없습니다. 실제 환자 기록은 프로덕션 프로젝트에 보관해야 합니다.

## 관련 자료

- [FHIR 대 사용자 정의 의료 데이터베이스](https://developers.anpheros.com/ko/guides/fhir-vs-custom-database): 자체 테이블을 설계해야 할 때와 FHIR을 사용해야 할 때
- [TypeScript로 의료 API 구축 방법](https://developers.anpheros.com/ko/guides/healthcare-api-typescript): Express를 사용한 단계별 튜토리얼
- [Flutter로 의료 앱 구축 방법](https://developers.anpheros.com/ko/guides/healthcare-app-flutter): Dart SDK를 사용한 단계별 튜토리얼
- [의료 소프트웨어 개발](https://developers.anpheros.com/ko/guides/healthcare-software)
- [의료 앱 구축](https://developers.anpheros.com/guides/build-a-healthcare-app)
- [아키텍처](https://developers.anpheros.com/ko/guides/architecture)
- [의료 데이터 API](https://developers.anpheros.com/ko/guides/medical-data-api)
- [SDK](https://developers.anpheros.com/ko/guides/sdks)
