환자 영상 관리 프로그램 개발

jukim·2022년 1월 13일

C#

목록 보기
2/2

1. 프로그램 개발 목적

1) 데이터베이스 설계를 익히고, 데이터베이스를 활용해보기 위함
2) 이미지 데이터를 활용해 보기 위함
3) WPF를 이용하여 MVVM의 디자인 패턴으로 설계해 보기 위함
4) WPF를 이용한 UI 설계를 해보기 위함
5) C#언어를 이용해 개발해 보기 위함

  • 1차 버전
    Local환경에서 Client가 DB에 바로 접근하는 구조로 설계해 보기 위함
  • 2차 버전
    외부에 DB를 두고 Client - Server 구조로 각각의 역활을 나누어 구조를 설계해보기 위함

2. 프로그램 요구사항

  • 1차 버전

    1. 데이터베이스에 저장해 둔 환자 정보(영상정보, 생년월일, 전화번호, 차트번호, etc) 를 UI 화면에 보여주세요.
    2. 환자 영상을 선택해서 크게 보여주고, 그 영상을 컨트롤(회전, 뒤집기, 확대, 축소)를 할 수 있게 해주세요.
    3. 환자 영상의 종류(X-Ray, CT, MRI)별로 저장할 수 있고, 보여줄 수 있게 해주세요.
  • 2차 버전

    1. 데이터베이스에 저장해 둔 환자 정보(영상정보, 생년월일, 전화번호, 차트번호, etc) 를 UI 화면에 보여주세요.
    2. 최근 검색한 환자들의 정보를 리스트로 보여주고 선택하면 그 환자에 대한 정보를 볼 수 있게 해주세요.
    3. 환자 영상을 선택해서 크게 보여주고, 그 영상을 컨트롤(회전, 뒤집기, 확대, 축소)를 할 수 있게 해주세요.
    4. 환자 영상의 종류(X-Ray, CT, MRI)별로 저장할 수 있고, 보여줄 수 있게 해주세요.
    5. 환자 영상을 2분할, 4분할화면에 동시에 보여줄 수 있게 해주세요.
    6. 제품으로 쓸 수 있을 정도로 화면 디자인을 꾸며주세요.
    7. client - server 구조로 설계를 해주세요.

3. 데이터 베이스 설계

  • 1차 버전 (MongoDB)

< 환자 프로필 정보 Document > - Collection (직접 설계)

FieldValue
idObjectId
환자 번호 (= 차트 번호)long
환자 프로필 사진 경로string

< 환자 정보 Document > - Collection (직접 설계)

FieldValue
idObjectId
환자 번호 (= 차트 번호)long
환자 이름string
환자 주민번호string
환자 생년월일string
환자 전화번호string

< 환자 영상 정보 Document > - Collection (직접 설계)

FieldValue
idObjectId
원본 이미지 idObjectId
썸네일 이미지 idObjectId
환자 번호 (= 차트 번호)long
환자 영상 등록 날짜datetime
환자 영상 이미지 종류 (x-ray, ct, mri)int
환자 영상 원본 이미지 파일 이름string
환자 영상 썸네일 이미지 파일 이름string

< GridFS > - mongoDB에 영상을 업로드할 때 저장하는 방식 (자동으로 설계됨)

mongoDB에 있는 GridFS에 업로드함

<fs.chunks> - Collection
FieldValue
idObjectId
files idObjectId
nlong
dataBinary data
<fs.files> - Collection
FieldValue
idObjectId
lengthlong
chunkSizelong
uploadDatedatetime
md5string
filenamestring

  • 2차 버전 (MSSQL)

< 환자 정보 Design > - Table (직접 설계)

RowColumn
환자 번호 (= 차트 번호)int
환자 이름varchar(max)
환자 주민번호varchar(max)
환자 전화번호varchar(max)
환자 프로필 사진 경로varchar(max)

< 환자 영상 정보 Design > - Table (직접 설계)

RowColumn
환자 번호 (= 차트 번호)int
환자 영상 등록 날짜datetime
환자 영상 이미지 종류 (x-ray, ct, mri)int
환자 영상 원본 이미지 파일 이름string
환자 영상 썸네일 이미지 파일 이름string

< FileTable > - Table (FileTable 만들면 자동으로 design됨)

RowColumn
stream_iduniqueidentifier
file_streamvarbinary(max)
namenvarchar(255)
path_locator(primary key)hierarchyid
parent_path_locator(foreign key)hierarchyid
file_typenvarchar(255)
cached_file_sizebigint
creation_timedatetimeoffset(7)
last_write_timedatetimeoffset(7)
last_access_timedatetimeoffset(7)
is_directorybit
is_offlinebit
is_hiddenbit
is_readonlybit
is_archivebit
is_systembit
is_temporarybit

4. 구조 설계

  • 1차 버전 ( local 환경 )
    • DB(mongoDB)서버를 Local환경에 구축한 상황에서 구조를 설계하였음
      : Client에서 DB서버에 저장된 DB에 직접 접근하여 요청한 정보를 받아오는 구조
      [case1) 환자를 검색창에서 검색했을 때]
      - 구조 :
      1. client에서 환자 검색 ->
      2. mongoDB에서 검색한 환자에 관한 정보가 있는지 탐색 ->
      3. 있으면 그 정보 client가 받아서 화면에 환자 정보 보여줌
      [case2) 환자 정보 등록, 수정, 삭제 버튼을 눌렀을 때]
      - 구조 :
      1. client에서 신규 환자 정보 등록/환자 정보 수정/환자 정보 삭제 버튼 클릭 ->
      2. mongoDB에서 신규 환자 정보 등록/환자 정보 수정/환자 정보 삭제 수행 ->
      3. 수행 결과(성공/실패)에 관한 정보를 client에게 알려줌
      [case3) 환자 영상 가져오기버튼을 눌렀을 때]
      - 구조 :
      1. client에서 폴더 내에 있는 환자 영상 파일 클릭 ->
      2. 영상 파일을 이용해 썸네일 이미지를 만들고 그 썸네일 이미지와 원래 영상 파일을 mongoDB GridFS에 업로드하고 반환값으로 업로드한 썸네일 이미지와 원본 이미지의 objectID값 받아옴 ->
      3. 그 objectID값들과 영상정보를 mongoDB에 저장함 ->
      4. mongoDB GridFS에서 mongoDB의 영상정보 테이블에 있는 objectID값과 일치하는 이미지를 다운받아서 client에게 보내줌
  • 2차 버전 ( Client - Server 구조 )
    • DB(MSSQL)서버를 외부PC환경에 구축한 상황에서 구조를 설계하였음
      : Client에서 Server에게 gRPC를 통해 정보를 달라고 요청하면 Server가 DB서버에 저장된 DB에 접근하여 Client가 요청한 정보를 받아서 gRPC를 통해 Client에게 전달해주는 구조
      [case1) 환자를 검색창에서 검색했을 때]
      - 구조 :
      1. client에서 환자 검색 ->
      2. 검색 요청을 server에게 gRPC를 통해 전달 ->
      3. server에서 MSSQL에게 client가 요청한 정보 전달 ->
      4. MSSQL에서 검색한 환자에 관한 정보가 있는지 탐색 ->
      5. 있으면 그 정보 server에게 전송 ->
      6. server에서 gRPC를 통해 client에게 MSSQL에서 받은 정보 전달
      [case2) 환자 정보 등록, 수정, 삭제 버튼을 눌렀을 때]
      - 구조 :
      1. client에서 신규 환자 정보 등록/환자 정보 수정/환자 정보 삭제 버튼 클릭 ->
      2. 신규 환자 정보 등록/환자 정보 수정/환자 정보 삭제 요청을 server에게 gRPC를 통해 전달 ->
      3. server에서 MSSQL에게 client가 요청한 정보 전달 ->
      4. MSSQL에서 신규 환자 정보 등록/환자 정보 수정/환자 정보 삭제 수행 ->
      5. 수행 결과(성공/실패)에 관한 정보를 server에게 알려줌 ->
      6. server에서 gRPC를 통해 client에게 정보 전달
      [case3) 환자 영상 가져오기버튼을 눌렀을 때]
      - 구조 :
      1. client에서 폴더 내에 있는 환자 영상 파일 클릭 ->
      2. 영상 파일을 이용해 썸네일 이미지를 만들고 그 썸네일 이미지와 원래 영상 파일을 1Megabyte씩 잘라서 stream으로 server에게 gRPC로 보냄 ->
      3. server에서는 gRPC를 통해 받은 stream을 합쳐서 MSSQL에 있는 FileTable에 날짜를 조합하여 만든 고유 id로 파일을 저장함 ->
      4. 그 id값을 server에서 gRPC를 통해 client에 알려줌 ->
      5. 그 id값과 영상정보를 다시 server에게 gRPC를 통해 전송 ->
      6. 그 id값과 영상정보를 MSSQL에 저장함 ->
      7. MSSQL의 FileTable에서 MSSQL의 영상정보 테이블에 있는 id값과 일치하는 이미지를 server에 다운받음 ->
      8. server에서 다운받은 이미지를 client에게 gRPC를 통해 전송함

5. UI 설계

  • 1차 버전

    < 메인 화면 >

    < 이미지 선택했을 때 viewer 화면 >

  • 2차 버전

    client - < 메인 화면 >

    client - < 환자 정보, 영상 정보 보여주는 화면 >

    client - < 환자 영상 정보 컨트롤 할 수 있는 화면 >

    server - < server 화면 >

profile
21세기 모험가

0개의 댓글