[DICOM] 영상을 가져오는 방법 — C-Move, C-Get, Modality Worklist

Oleg Pianykh, Digital Imaging and Communications in Medicine (DICOM) (Springer, 2008) 정리 5편
참고 챕터: Ch 7.5 – 7.10, Ch 8.1–8.3

 

C-Find로 "PACS에 뭐가 있는지" 알아냈으니, 이제 "그 영상을 실제로 가져오는" 방법을 다룰 차례.

 

이번 편의 핵심:

  • C-Get / C-Move — 영상 가져오기의 두 가지 방식
  • Modality Worklist (MWL) — RIS에서 일정 받기
  • DICOM 현장 용어 (ping/push/pull)
  • Conformance Statement의 진짜 의미 — SCU/SCP 역할 매칭
  • 보너스: Storage Commitment, Secondary Capture, Structured Report

여기까지 다 보면 PACS 통신의 모든 기본기가 완성된다.


1. 왜 C-Find만으론 부족한가?

C-Find로 "Study UID 목록"은 얻을 수 있지만, 실제 픽셀은 못 받는다. C-Find는 메타데이터만 응답함.

C-Find → "John Smith의 MR Study UID = 1.2.840.xxx 가 PACS에 있어요"
        ↓
        그래서? 영상 자체는?

→ 영상을 실제로 가져오는 두 가지 방식이 있다:

  1. C-Get — 단순. 같은 연결 위에서 영상 받아옴
  2. C-Move — 복잡. PACS가 별도 연결로 보내줌

두 방식은 동일한 SOP Class 패밀리지만 동작이 완전히 다르다.

 


2. C-Get — 단순한 영상 가져오기

2.1 동작 원리

C-Get은 C-Find + C-Store를 한 묶음으로 처리한다. 같은 association(연결) 안에서 영상이 돌아온다.

SCU (워크스테이션)          SCP (PACS)
  │                            │
  │  C-Get-Rq (Study UID)      │
  ──────────────────────────→
  │                            │
  │  C-Store-Rq (영상 1)        │  ← SCP가 SCU에게 거꾸로 보냄!
  ←──────────────────────────
  │                            │
  │  C-Store-Rsp                │
  ──────────────────────────→
  │  C-Store-Rq (영상 2)        │
  ←──────────────────────────
  │  ...                        │
  │                            │
  │  C-Get-Rsp Status=0xFF00    │  ← 진행 상황 보고
  │  (suboperation 카운트 포함)  │
  ←──────────────────────────
  │  ...                        │
  │  C-Get-Rsp Status=0x0000    │  ← 완료
  ←──────────────────────────

⚠️ 핵심 포인트: 같은 association 위에서 SCU가 일시적으로 C-Store SCP 역할을 한다. 즉 영상을 받으려면 SCU도 C-Store SCP를 구현해야 함.

 

2.2 C-Get SOP Class UID

Query Root SOP Class UID
Patient Root Q/R Get 1.2.840.10008.5.1.4.1.2.1.3
Study Root Q/R Get 1.2.840.10008.5.1.4.1.2.2.3
Patient-Study Root Q/R Get 1.2.840.10008.5.1.4.1.2.3.3 (Retired)

 

💡 SOP Class UID 패턴 기억하기:

  • C-Find: ...1.2.x.1
  • C-Get: ...1.2.x.3
  • C-Move: ...1.2.x.2

(x는 root 종류: 1=Patient, 2=Study, 3=Patient-Study)

 

2.3 C-Get IOD — 자유도가 낮다

C-Get은 C-Find와 달리 정확한 키만 받음. 와일드카드/range 매칭 안 됨.

(0008, 0052) Retrieve Level = "STUDY"
(0010, 0020) Patient ID = "12345"            ← 정확값
(0020, 000D) Study Instance UID = "1.2.84..." ← 정확값

→ 그래서 항상 C-Find를 먼저 해서 키를 얻고, 그 키로 C-Get 호출 하는 패턴이 표준.

 

사용자 검색어
   ↓ ("Smith 환자의 지난달 MR")
C-Find (wildcard, range 가능)
   ↓
Study UID 목록 받음
   ↓
C-Get (UID 정확값만)
   ↓
영상 다운로드

 

2.4 C-Get-Rsp의 진행률 필드

C-Get은 진행 상황을 상세히 보고:

Tag 의미
(0000, 1020) Remaining Suboperations (남은 개수)
(0000, 1021) Completed (성공한 개수)
(0000, 1022) Failed (실패한 개수)
(0000, 1023) Warning (경고로 끝난 개수)

→ PACS UI의 "다운로드 진행률 ████░░ 60%" 가 이걸로 만들어짐.

 


3. C-Move — 영상을 다른 곳으로 보내기

3.1 동작 원리 — 3주체

C-Move의 핵심 차이: 영상을 SCU가 아닌 제3의 AE로 보낼 수 있다.

   Workstation 1                Archive (PACS)              Workstation 2
   (C-Move SCU)                 (C-Move SCP)                (C-Store SCP)
       │                            │                            │
       │  C-Move-Rq                 │                            │
       │  Move Destination = WS2    │                            │
       ──────────────────────────→  │                            │
       │                            │                            │
       │                            │  새 association 열기        │
       │                            ──────────────────────────→  │
       │                            │                            │
       │                            │  C-Store-Rq (영상)         │
       │                            ──────────────────────────→  │
       │                            │  C-Store-Rsp                │
       │                            ←──────────────────────────  │
       │                            │                            │
       │  C-Move-Rsp Status=0xFF00  │                            │
       │  (진행률)                  │                            │
       ←──────────────────────────  │                            │
       │  ...                       │                            │
       │  C-Move-Rsp Status=0x0000  │                            │
       ←──────────────────────────  │                            │

 

3.2 C-Move SOP Class UID

Query Root SOP Class UID
Patient Root Q/R Move 1.2.840.10008.5.1.4.1.2.1.2
Study Root Q/R Move 1.2.840.10008.5.1.4.1.2.2.2
Patient-Study Root Q/R Move 1.2.840.10008.5.1.4.1.2.3.2 (Retired)

 

3.3 C-Move-Rq의 핵심 필드: Move Destination

(0000, 0600) Move Destination = "WORKSTATION_2"   ← AE Title

 

⚠️ 목적지는 AE Title만 적는다. IP/Port는 안 적음.
→ SCP가 자기 AE 목록에서 그 AE Title을 찾아서 IP/Port를 알아내야 한다.

 

3.4 ⚠️ 가장 큰 함정: SCP의 AE 등록부

C-Move SCP는 목적지 AE의 IP/Port를 미리 알고 있어야 한다.

❌ 시나리오:
AI 추론 앱 (= WS2) 가 PACS에 처음 연결
→ AI 추론 앱이 C-Find로 영상 검색 → 됨
→ AI 추론 앱이 C-Move로 자기 자신에게 보내달라고 요청
→ PACS: "AIAPP_AE가 누구야?" → ❌ 거부 (Unknown destination)

해결: PACS 관리자에게 AI 추론 앱의 (AE Title + IP + Port) 등록 요청 필수.

 

3.5 C-Move = C-Get 으로 쓰기

흔한 패턴: 자기 자신을 destination으로 지정

WS1                Archive             WS1 (= 자기 자신)
 │                   │                   │
 │ C-Move-Rq         │                   │
 │ Dest = WS1        │                   │
 ──────────────→    │                   │
 │                   │  C-Store-Rq      │
 │                   ──────────────→
 │                   │                   │

→ 효과상 C-Get과 동일. 그런데 굳이 별도 association을 여는 비효율.

 

3.6 실무 비밀

저자 의견:
대부분의 PACS가 C-Move를 사용하지만, 실제로는 자기 자신을 destination으로 지정해서 C-Get처럼 쓰는 경우가 대부분.

 

이유: C-Move SCP를 단순화하고, 진짜 3-주체 시나리오는 큰 PACS 내부 클러스터링에서만 쓰임.

 


4. C-Move vs C-Get 비교 ⭐

PACS 통신 모듈 개발 시 반드시 알아야 할 비교.

4.1 비교 표

  C-Get C-Move
Association 수 1개 (반전 사용) 2개 (별도)
목적지 지정 불필요 (자기) Move Destination 필수
사전 등록 SCP가 SCU만 알면 됨 SCP가 목적지 AE 사전 등록 필수
방화벽 친화성 ✅ Outbound만 ❌ Inbound 연결 필요
동적 환경 ✅ 좋음 ❌ 정적 환경에 적합
텔레라디올로지 ✅ 적합 ❌ 어려움
큰 PACS 내부 클러스터링
표준 위상 "Archaic" 취급 권장

 

4.2 방화벽 함정

회사/병원 방화벽 환경에서 흔히 발생:

회사 방화벽: outbound 허용, inbound 차단 (일반적 설정)

C-Echo (SCU → SCP): ✅ outbound, OK
C-Find (SCU → SCP): ✅ outbound, OK
C-Get  (SCU ↔ SCP, 같은 association): ✅ outbound로 시작, OK
C-Move (SCU → SCP, 그 다음 SCP → SCU의 새 연결): ❌ 두 번째가 inbound!

C-Move를 위해 방화벽 구멍을 뚫어야 함. 보안팀이 싫어함. VPN이 더 안전.

 

4.3 저자의 결론

"C-Move inside, C-Get outside"

  • 큰 PACS 내부 (한 통제된 환경 안): C-Move
  • 외부 시스템 (텔레라디올로지, 모바일): C-Get

 

4.4 AI 추론 앱 적용

AI 추론 앱은 병원 내부 시스템이라 C-Move 환경에 있을 가능성이 높다:

시나리오 1: 병원 내부 (가장 흔함)
  의사 워크스테이션이 PACS에 "이 환자 영상을 AIAPP_AE로 보내" 요청
  → PACS가 AI 추론 앱에 C-Store
  → AI 추론 앱은 단순히 "C-Store SCP"만 구현하면 됨

시나리오 2: AI 추론 앱이 직접 트리거
  AI 추론 앱이 C-Find로 영상 찾기 → C-Move로 자기에게 보내달라 요청
  → PACS에 AI 추론 앱 등록 필수
  → AI 추론 앱은 "C-Move SCU" + "C-Store SCP" 둘 다 구현

 

🛠 개발 우선순위:

  1. C-Store SCP (영상 받기) — 무조건 필요
  2. C-Echo SCU/SCP — 연결 테스트
  3. C-Store SCU (결과 보내기) — 추론 후 PACS로 송신
  4. C-Find SCU + C-Move SCU — AI 추론 앱이 능동적 검색하려면

 


5. Modality Worklist (MWL)

5.1 무엇인가?

MWL = "오늘 찍을 환자 명단을 modality에 미리 알려주는 서비스"

CT 기사가 출근하면 CT 화면에 오늘 검사할 환자 목록이 떠 있어야 한다:

  • 환자 이름, ID, 생년월일, 성별
  • 임신 여부, 알러지
  • 검사 종류, 시작 시간
  • 의뢰의, 판독의

이 데이터를 수동 입력하면 오타 폭격 → 큰 사고 원인. MWL로 자동 조회.

 

5.2 전체 데이터 흐름

[RIS / EMR]
    │  (환자 예약/오더)
    │  HL7 메시지
    ↓
[DICOM Broker / MWL Server]
    │  (HL7 → DICOM 변환)
    ↓
[MWL SCP]
    │
    │  C-Find-Rq (Modality=CT, AET=CT1)
    ←─────────────────────────────────  [CT Scanner = MWL SCU]
    │
    │  C-Find-Rsp (환자 목록)
    ─────────────────────────────────→
                                          ↓
                                       기사 화면에 환자 목록 표시
                                       기사가 환자 선택 → 자동 정보 입력

💡 RIS는 보통 HL7 표준을 쓰고 DICOM이 아님. 그래서 중간에 변환 broker가 필요. (HL7은 14편급 주제, 이 책 Ch 14)

 

5.3 MWL SOP Class UID

1.2.840.10008.5.1.4.31

 

5.4 MWL DIMSE = C-Find DIMSE 그대로

"The MWL DIMSE is nothing more than our good old friend C-Find DIMSE"

MWL은 C-Find와 메시지 구조가 동일. 차이는 SOP Class UID와 IOD 내용뿐.

 

5.5 MWL IOD 핵심 필드

Tag 내용
(0010, 0010) Patient Name
(0010, 0020) Patient ID
(0010, 0030) Birth Date
(0010, 0040) Sex
(0010, 21C0) Pregnancy Status
(0008, 0050) Accession Number (RIS 오더 번호)
(0032, 1032) Requesting Physician
(0008, 0090) Referring Physician
(0040, 0100) Scheduled Procedure Step Sequence (SQ)
(0040, 0001) Scheduled Station AET (어느 modality에서 찍을지)
(0040, 0002) Scheduled Start Date
(0040, 0003) Scheduled Start Time
(0008, 0060) Modality
(0040, 0006) Scheduled Performing Physician

 

5.6 ⚠️ 흔한 함정

Modality가 요구하는 attribute가 위 목록보다 많을 수 있음. 누락되면 modality가 MWL 응답 자체를 거부.

→ 항상 modality의 Conformance Statement 확인:

  • "이 modality는 어떤 필드를 필수로 요구하나?"
  • "지원하지 않는 필드가 들어오면 어떻게 처리하나?"

 

5.7 MWL이 AI 추론 앱과 직접 관련 있나?

대부분 직접 안 씀. MWL은 modality(촬영 장비) → MWL 서버 사이의 일이고, AI 추론 앱은 영상이 다 찍힌 뒤 처리하는 단계.

 

💡 예외: AI 추론 앱이 워크리스트 UI 를 제공해서 "오늘 분석할 환자 목록"을 보여주려면 MWL이나 그에 상응하는 정보를 RIS/PACS에서 받아야 함.

 


6. 현장 용어 — DICOM Ping / Push / Pull

PACS 엔지니어들은 표준 용어 안 씀. 다음 매핑 기억할 것:

현장 용어 표준
DICOM Ping C-Echo (Verification SOP)
DICOM Push C-Store (영상을 다른 AE로 보내기)
DICOM Pull C-Move 또는 C-Get (영상을 다른 AE에서 가져오기)

 

⚠️ "Test connection" 버튼 함정:
PACS UI의 "Test Connection" 버튼이 진짜 C-Echo인지, 단순 TCP ping인지 확인할 것.
TCP ping만 통과시키고 C-Echo 안 되는 PACS = 진짜 연결 안 되는 PACS.

 

6.1 push vs pull 작동 차이

  • Push (C-Store): 자동화에 적합. modality → archive 흐름.
  • Pull (C-Move/C-Get): 사람이 골라서. 워크스테이션에서 옛 검사 보기.

→ "Pull은 사실상 smart push" — 결국 영상은 C-Store로 옴.

 


7. SCU/SCP 역할 매칭 — Conformance Statement의 진짜 의미

7.1 SCU/SCP는 클라이언트/서버가 아니다

흔한 오해: "SCP = 서버, SCU = 클라이언트". 틀림.

SCU/SCP는 특정 SOP 클래스에 대한 역할일 뿐.

Digital Archive의 진짜 모습:
  - CT Storage SCP (CT 받음)
  - CT Storage SCU (다른 곳으로 CT 전송)         ← 클라이언트 역할도 함!
  - Study Root Q/R Find SCP (검색 받음)
  - Study Root Q/R Move SCP (검색 후 보내기)
  - Storage Commitment SCP
  - ...

같은 AE가 같은 SOP에 대해 SCU + SCP를 동시에 할 수도 있음.

 

7.2 Conformance Statement = SOP × Role 매트릭스

PACS 벤더가 주는 Conformance Statement는 결국 이런 표:

SOP SCU SCP
Verification
CT Image Storage
MR Image Storage
US Image Storage
Secondary Capture Storage
Study Root Q/R Find
Study Root Q/R Move
Patient Root Q/R Find
Modality Worklist
...    

두 AE가 통신하려면 한쪽이 SCU, 다른 쪽이 SCP를 같은 SOP에 대해 지원 해야 함.

 

7.3 ⚠️ 흔한 함정들

저자가 꼽은 사고 사례:

    1. Verification SCP 미지원
      → 그 장비로 C-Echo가 안 됨. 디버깅 불가능.
    2. MR Storage SCP만 지원, CT Storage SCP 미지원
      → 같은 archive인데 CT는 못 받음.
    3. Q/R Find SCU만 있고 SCP 없음
      → 그 워크스테이션을 다른 곳에서 검색할 수 없음.
    4. 이미지 압축(Transfer Syntax) 미지원
      → 텔레라디올로지에서 압축 보낼 수가 없음.
    5. 저자의 황당 사례:
      →  CR 장비가 "archive를 printer로 등록하라"고 요구. 즉 archive를 Print SCP로 인식하게 해야 동작.

 

7.4 PACS 모듈 개발 시 Conformance 체크리스트

PACS 벤더와 협의 시작 전 받아야 할 정보:

☐ Verification SOP (양방향)
☐ 받을 영상 SOP Class UID (CT/MR/US/...) - 어느 게 SCP인가?
☐ 보낼 결과 SOP Class UID (SC/SR) - 어느 게 SCP인가?
☐ Q/R Find/Move 지원 여부 + Root (Patient or Study)
☐ Transfer Syntax 지원 목록 (Implicit/Explicit, 압축)
☐ AI 추론 앱 AE를 destination으로 등록 가능한지
☐ 사설 Tag 처리 정책
☐ Storage Commitment 사용 여부
☐ Secondary Capture / Structured Report 지원 여부
☐ 최대 Association 수
☐ 권장 Timeout 값
☐ 에러 코드 (Status) 해석 문서

 


8. 보너스 — Beyond Basic SOP

AI 추론 앱 통신 모듈에서 추가로 알면 좋은 SOP들 (Ch 8).

8.1 Storage Commitment SOP

"진짜로 저장했어?" 를 확인하는 SOP.

1. AI 추론 앱 → PACS: C-Store (영상)
2. PACS: 받음 (C-Store-Rsp Status=0x0000)
   ↳ 하지만 진짜 영구 저장한 건지? 메모리에만 있고 곧 날아갈 수도?
3. AI 추론 앱 → PACS: Storage Commitment Request
4. PACS: "응, 영구 저장했어" 또는 "아니, 못 했어"

 

⚠️ 저자 경고:
Storage Commitment는 DICOM 프로토콜일 뿐, 실제 저장 보장은 운영 문제.
PACS 관리자가 디스크 비우려고 영상 삭제하면 어떤 SOP도 못 막음.

AI 추론 앱은 일반적으로 Storage Commitment 안 써도 됨. PACS 벤더가 요구하면 그때 구현.

 

8.2 Secondary Capture (SC) ⭐⭐

AI 추론 앱에서 가장 중요한 SOP.

SC = "modality에서 직접 찍은 영상이 아닌 영상" 을 DICOM으로 저장하는 형식.

 

용도:

  • 필름 스캔
  • 화면 캡처
  • AI 추론 결과 (segmentation 결과 등) ← AI 추론 앱 용도!
  • 3D 재구성 결과

SC SOP Class UID: 1.2.840.10008.5.1.4.1.1.7

 

8.3 ⚠️ SC의 흔한 함정 — Modality 라벨링

저자 예시:

CT perfusion 분석 후 컬러맵 생성
→ 원본 CT study에 추가하고 싶음
→ Modality를 "CT"로 라벨링?
   ❌ CT IOD 요구사항 불만족 (Hounsfield 스케일, monochrome 등)
   → CT 처리 함수가 에러
→ Modality를 "SC"로 라벨링?
   ❌ 단순한 PACS가 CT study 전송 시 SC 빠뜨림

해결: AI 추론 앱은 SC IOD로 만들되, Series 단위로 별도 생성. Study UID는 원본과 동일하게 유지 (이미 전편에서 다룸).

 

8.4 Structured Report (SR)

텍스트 + 영상 참조 + 측정값 을 한 객체에 담는 SOP.

AI 추론 앱의 추론 결과를 SR로 표현 가능:

  • "PI-RADS score: 4"
  • "Lesion location: peripheral zone, left mid"
  • "Lesion volume: 1.2 mL"
    • 해당 lesion이 보이는 영상 참조 (SOP Instance UID)
SOP UID
Basic Text SR 1.2.840.10008.5.1.4.1.1.88.11
Enhanced SR 1.2.840.10008.5.1.4.1.1.88.22
Comprehensive SR 1.2.840.10008.5.1.4.1.1.88.33

💡 SR은 검색 가능. SC 이미지는 이미지일 뿐이라 텍스트 검색 불가.
워크플로우에 SR을 적용하면 "PI-RADS 4 이상 환자 모두 찾기" 같은 쿼리 가능.

AI 추론 앱 출력 전략 옵션:

  1. SC + 결과 텍스트 burn-in (단순, 모든 PACS 지원)
  2. SC + SR (이상적, PACS가 SR 지원할 때)
  3. DICOM SEG (segmentation 전용 SOP, 최신 PACS)

PACS 벤더의 SR/SEG 지원 여부를 Conformance에서 확인.

 


9. AI 추론 앱 영상 수신 파이프라인 (완성)

이제 전체 그림이 보인다.

9.1 시나리오 A: PACS가 AI 추론 앱에 push

┌──────────────────────────────────────────────────────────────────┐
│  의사: "이 환자 AI 분석 돌려" 버튼 클릭                            │
│  PACS UI → 내부 워크플로우                                         │
└──────────────────────────────────────────────────────────────────┘
                              │
                              ▼
   [PACS] ──── C-Store (MR Image Storage SOP) ───→ [AI 추론 앱]
                                                          │
                                                          │ 영상 누적
                                                          │ (한 시리즈 30장)
                                                          ▼
                                                   [추론 트리거]
                                                          │ AI 모델
                                                          ▼
                                                   [Segmentation 결과]
                                                          │
                                                          ▼
                              ┌───────────────────────────┴────────┐
                              ▼                                    ▼
                  [SC Image 생성]                       [Structured Report 생성]
                  (overlay된 영상)                       (PI-RADS score 등)
                              │                                    │
                              └────────────┬───────────────────────┘
                                           ▼
                  [AI 추론 앱] ── C-Store ──→ [PACS]
                                           (Patient/Study UID 원본 유지,
                                            Series/SOP UID 새로 생성)
                                           │
                                           ▼
                              ┌──────────────────────────┐
                              │  PACS UI에서 원본 옆에     │
                              │  "AI 결과" 시리즈 추가됨    │
                              └──────────────────────────┘

 

9.2 시나리오 B: AI 추론 앱이 능동적으로 pull

[AI 추론 앱 UI] "환자 검색"
        │
        ▼
[AI 추론 앱] ── C-Find (Study Root) ──→ [PACS]
                                          │
                                          │ Patient + Modality + Date
                                          │ 조건으로 검색
        ←── C-Find-Rsp (Study UID 목록) ──
        │
        │ 사용자가 Study 선택
        ▼
[AI 추론 앱] ── C-Move ──→ [PACS]
              Dest=AIAPP_AE
                                          │
                                          │ PACS가 별도 association 열기
                                          ▼
[AI 추론 앱] ←── C-Store (영상들) ── [PACS]
        │
        ▼
   (이후 추론 → 결과 송신은 시나리오 A와 동일)

 

구현 필요 SOP 역할 (시나리오 A+B 모두):

Role SOP
SCU Verification, C-Find, C-Move, C-Store (결과 송신)
SCP Verification, C-Store (영상 수신)

 

9.3 Orthanc로 구현 시

Orthanc가 위 모든 SOP를 다 구현해줌. 우리는 HTTP REST로 조작:

import requests

# 1) PACS 등록 (Orthanc 설정)
# orthanc.json:
# "DicomModalities": {
#   "PACS": ["PACS_AE", "192.168.1.10", 104]
# }

# 2) C-Echo
r = requests.post("http://orthanc:8042/modalities/PACS/echo")

# 3) C-Find
r = requests.post(
    "http://orthanc:8042/modalities/PACS/query",
    json={"Level": "Study",
          "Query": {"PatientID": "12345",
                    "StudyDate": "20260601-",
                    "ModalitiesInStudy": "MR"}}
)
query_id = r.json()["ID"]

# 4) 결과 조회 → Study UID들 얻기
studies = requests.get(
    f"http://orthanc:8042/queries/{query_id}/answers"
).json()

# 5) C-Move (AI 추론 앱 = Orthanc 자기 자신에게)
r = requests.post(
    f"http://orthanc:8042/queries/{query_id}/retrieve",
    data="ORTHANC"   # Orthanc 자기 AE Title
)

# 6) 영상 도착 후 webhook으로 추론 트리거 가능
# orthanc.json:
# "LuaScripts": ["./on_store.lua"]

저수준 DICOM 메시지는 Orthanc가 다 처리. 우리는 비즈니스 로직만.

 


10. 핵심 정리

개념 한 줄
C-Get 단일 association, SCP가 SCU에게 C-Store. 단순. 방화벽 친화
C-Move 별도 association, 제3 AE 가능. 정적 환경 권장. 방화벽 함정
C-Move Dest AE Title만 적음. SCP가 IP/Port 미리 알아야 함
C-Get IOD 정확값만. Wildcard 안 됨. → C-Find로 키 먼저 얻음
저자 결론 "C-Move inside, C-Get outside"
MWL C-Find DIMSE 그대로. RIS에서 환자 일정 자동 조회. SOP UID = ...5.1.4.31
DICOM Ping/Push/Pull C-Echo / C-Store / C-Move(Get) 의 현장 용어
SCU/SCP 클라이언트/서버 아님. SOP별 역할. 같은 AE가 둘 다 가능
Conformance Statement SOP × Role 매트릭스. PACS 통신의 정답지
Storage Commitment 영구 저장 보장. 운영 문제. 보통 안 씀
Secondary Capture AI 결과 영상 저장에 표준. SOP UID = ...1.4.1.1.7
Structured Report 텍스트 + 측정값 + 영상 참조. 검색 가능. 권장 출력 형식
AI 추론 앱 필수 SOP Verification (양), C-Store SCP (영상 받기), C-Store SCU (결과 송신)

 


11. 다음 글에서 다룰 것

여기까지 DICOM 응용 메시지 (DIMSE) 의 핵심을 다 봤다. 하지만 우리는 한 가지를 얼버무리고 넘어왔다:

"두 AE가 통신하려면 먼저 Association 을 맺어야 한다"

 

이 Association이 어떻게 협상되는지, Transfer Syntax, Abstract Syntax, Presentation Context, PDU 가 뭔지 — DICOM 통신 디버깅의 80%가 일어나는 곳.

 

6편: DICOM Association — 통신을 떠받치는 인프라

  • TCP 연결 → DICOM Association 협상 과정
  • Abstract Syntax (어떤 SOP) ↔ Transfer Syntax (어떻게 인코딩) 협상
  • Presentation Context
  • A-Associate-RQ / AC / RJ
  • PDU (Protocol Data Unit)
  • 실제 Orthanc 로그 해석

여기를 알아야 "Association rejected", "Presentation context not accepted" 같은 흔한 에러를 직접 디버깅할 수 있다.

 


참고

  • Pianykh, O.S. Digital Imaging and Communications in Medicine (DICOM). Springer, 2008.
  • 공식 표준 매핑:
    • PS3.4 (Service Class Specifications) — Q/R, MWL 정의
    • PS3.7 (Message Exchange) — DIMSE 메시지 구조
  • 라이브러리:
    • pynetdicom — Python으로 C-Move/C-Get/C-Store/MWL 직접 구현 시
    • Orthanc REST API — 추상화된 인터페이스
  • DICOM SR 깊이 학습:
    • Clunie, D. DICOM Structured Reporting (2000) — 저자 추천