![]() |
|||||
|---|---|---|---|---|---|
๋ฐ์ํ |
์ฐ๊ฑด์ฐฝ |
์ค์ง์ |
์๊ดํ |
์์์ฐ |
์์ฑ๋ฅ |
- ํ๋ก์ ํธ ๊ฐ์
- ์ฃผ์ ๊ธฐ๋ฅ
- ๊ธฐ๋ ํจ๊ณผ
- ํ๋ก์ ํธ ์ค๊ณ ๋ฌธ์
- ๋ฐฑ์๋ ์ค๊ณ ๋ฐ ๊ตฌ์ถ
- ํ๋ก ํธ์๋ ์ค๊ณ ๋ฐ ๊ตฌ์ถ
- ์์คํ ํตํฉ
MediHub๋ ๋ณ์ ๋ด ์๋ฃ์ง๊ณผ ์๋ฃ ๊ด๊ณ์๋ค์ด ํจ์จ์ ์ผ๋ก ํ์ ํ๊ณ ์ง์ ๊ณต์ ๋ฐ ์ถ์ ์ ํตํด ์๋ฃ ์๋น์ค์ ํ์ง์ ํฅ์์ํค๊ธฐ ์ํ ์ง์ ๊ด๋ฆฌ ์์คํ (KMS)์ ๋๋ค.
๋ณ์์ ์๋ฃ ์์ค์ ๊ฐ๊ฐ์ธ์ ์ง์๊ณผ ๋ค์ ์๋ฃ์ง์ ํ์ ์ผ๋ก ๊ฒฐ์ ๋๋ฏ๋ก ์ง์์ ํจ์จ์ ์ธ ๊ด๋ฆฌ์ ๋น ๋ฅธ ์ ๋ฐ์ดํธ๊ฐ ํ์์ ์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ณ์ ๋ด์์ ์ง์์ ์๋ฌต์ ์ง์์์ ๋ช ์์ ์ง์์ผ๋ก ๋ณํ๋์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฃ์ง๊ณผ ์ง์๋ค์ด ๊ฐ์ ๋ณด์ ํ ์ ๋ฌด ๊ฒฝํ, ์ง๋ฃ ์ง์นจ(CP), ์๋ฃ ๋ ผ๋ฌธ ๋ฑ์ ์กฐ์ง์ ์ผ๋ก ๊ณต์ ํ๊ณ ์ถ์ ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด MediHub๋ ๋ณ์ ๋ด ์ ๋ณด์ ์ผ์ํ๋ฅผ ์ถ์งํ๊ณ ์ค์๊ฐ ์ ๋ณด ๊ณต์ ์ ํ์ ์ ์ด์งํ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ฃ์ง ๋ฐ ๋ณ์ ์ง์๋ค์ด ์๋ฃ ์ผ์ด์ค, CP ๋ฑ ๋ถ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ ์์ง์ ํตํด ํ ๊ณณ์์ ํตํฉ์ โขํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๋ํ ์์ ์ ์๊ฒฌ์ ์์ ๋กญ๊ฒ ๊ฐ์งํ ์ ์๋ ๊ฒ์ํ๊ณผ ์ค์๊ฐ ์ฑํ
๊ธฐ๋ฅ์ ์ง์ ๊ฐ ํ์
๊ณผ ์ปค๋ฎค๋์ผ์ด์
์ ์ง์ํ์ฌ ์ฌ์ฉ์ ํธ์์ฑ์ ๊ทน๋ํํฉ๋๋ค.
- CP(Clinical Pathway): ๋ณ์ ๋ด ์น๋ฃ ๋งค๋ด์ผ ๋ฌธ์(CP)๋ฅผ ๋ณ์ ๋ด ๊ด๊ณ์๋ค์ด ์ฝ๊ฒ ์ ๊ทผํ๊ณ ์์ ์ ๊ฑด์ํ ์ ์๋ ๊ธฐ๋ฅ ์ ๊ณต
- Case Sharing(์๋ฃ ์ผ์ด์ค ๊ณต์ ): ํฌ๊ท๋ณ ์น๋ฃ ๋ฑ ๋ค์ํ ์๋ฃ ์ฌ๋ก ๊ณต์ ๋ฐ ๋ ผ์๋ฅผ ํตํ ์๋ฃ ์ฌ๊ณ ์๋ฐฉ ๋ฐ ์น๋ฃ ์ฑ๊ณผ ๊ฐ์
- ChatGPT + PubMed(๋ ผ๋ฌธ): ์ต์ ๋ ผ๋ฌธ๊ณผ ์ฐ๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ํตํด ์๋ฃ์ง์ด ํ์ํ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋๋ก ์ง์
- Medical Life(๋ถ์ ๊ฒ์ํ): ๋ถ์๋ณ ๊ฒ์ํ์ ํตํด ๊ฐ ๋ถ์์ ์ ๋ฌธ์ฑ์ ๋ฐํ์ผ๋ก ์ ๋ณด ๊ณต์ ๋ฐ ํจ์จ์ ์ธ ์ ๋ฌด ์ฒ๋ฆฌ ์ง์. ๋ค์ํ ์ง๊ตฐ ๊ฐ์ ์ ๋ณด ๊ต๋ฅ๋ฅผ ํตํด ์ง์์ ์ง์์ ์ธ ์ถ์ ๊ณผ ํ์ฅ ์ด์ง
- Elasticsearch: ๋๋์ ์๋ฃ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ๊ณ ๋ถ์ํ ์ ์๋๋ก ์ง์
- Newsapi: ์ต์ ์๋ฃ ๋ด์ค๋ฅผ ๊ฒ์ํ๊ณ ํตํฉํ์ฌ ๊ด๊ณ์๋ค์ด ์ ๋ณด์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ์ง์
- ์ต๋ช ๊ฒ์ํ(Anonymous Board) ๋ณ์ ๋ด ๋ชจ๋ ๊ด๊ณ์๊ฐ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ด๋ ์ง๋ฌธ์ ์์ ๋กญ๊ฒ ๊ฐ์งํ๊ณ ์ ๋ณด๋ฅผ ๊ณต์ ํ ์ ์๋ ํ๊ฒฝ ์ ๊ณต
- MediTalk(๋ฉ์ ์ ): ์๊ธ ์ํฉ์ด๋ ์ ์ํ ์์ฌ ๊ฒฐ์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ง์ ๊ฐ ์ค์๊ฐ์ผ๋ก ์ํตํ ์ ์๋ ๋ฉ์ ์ ๊ธฐ๋ฅ ์ ๊ณต
- ์๋ฆผ: ํ๋ก์ฐ ํ ์๋ฃ์ง์ด ์๋ก์ด CP๋ Case Sharing ๋ฑ์ ์์ฑํ์ ๋ ์ค์๊ฐ์ผ๋ก ์๋ฆผ ๋ฉ์์ง๋ฅผ ์ ์กํ์ฌ ์ต์ ์ ๋ณด๋ฅผ ์ ์ํ๊ฒ ๊ณต์ ํ๊ณ ํ์ ์ ์ด์ง
- ChatBot: ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด ์ ๋ณด ๊ฒ์์ ํธ์์ฑ ํฅ์
- ์๋ฃ ์๋น์ค ํ์ง ํฅ์: ์ ๋ฌด ํจ์จ์ฑโข์์ฐ์ฑโข๋์ ๋ฅ๋ ฅ ํฅ์ ๋ฑ์ ํตํ ์ฑ๊ณผ ๋์ถ ๋ฐ ์๋ฃ ํ๊ฒฝ์ ๋ฐ์ ์ ๊ธ์ ์ ์ธ ํจ๊ณผ ๊ธฐ๋
- ํ์์ ๋ง์กฑ๋ ์ ๊ณ : ์ต์ ์ฐ๊ตฌ ๊ฒฐ๊ณผ์ ์น๋ฃ ๋ฐฉ๋ฒ์ ์ ์ํ๊ฒ ๊ณต์ ํจ์ผ๋ก์จ ์์ค ๋์ ์๋ฃ ์๋น์ค ์ ๊ณตํ์ฌ ํ์์ ๋ง์กฑ๋ ์ ๊ณ
- ์ง์์ ์ง์์ ์ธ ์ถ์ ๊ณผ ํ์ฅ: ๋ณ์ ๋ด ๊ด๊ณ์๋ค์ ์ง์ ๊ณต์ ์ฑ๊ณผ ํ์ฉ์ฑ์ ๊ฐํํ์ฌ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ์ ๊ณ ์ ์์ฌ ๊ฒฐ์ ์์ค์ ์ฆ์ง
- ๋ณ์ ๋ด ํ์ ๋ฌธํ ํ์ฐ
MongoDB Schema
// chatMessageSchema.js
const mongoose = require('mongoose');
// ์ฒจ๋ถํ์ผ(Attachment) ์๋ธ๋ฌธ์ ์คํค๋ง ์ ์
const attachmentSchema = new mongoose.Schema({
originName: { type: String, required: false }, // ์๋ณธ ํ์ผ ์ด๋ฆ
url: { type: String, required: false } // S3 URL
});
// ChatMessage ์คํค๋ง ์ ์
const chatMessageSchema = new mongoose.Schema({
chatroomSeq: { type: Number, required: true }, // ์ฑํ
๋ฐฉ ์๋ณ์
senderUserSeq: { type: Number, required: true }, // ๋ฐ์ ์ ์ฌ์ฉ์ ์๋ณ์
type: { type: String, required: true }, // ๋ฉ์์ง ํ์
(์: text, file, image)
message: { type: String, required: false }, // ๋ฉ์์ง ๋ด์ฉ
createdAt: { type: Date, default: Date.now }, // ๋ฉ์์ง ์์ฑ ์๊ฐ (๊ธฐ๋ณธ๊ฐ ํ์ฌ ์๊ฐ)
isDeleted: { type: Boolean, default: false }, // ๋ฉ์์ง ์ญ์ ์ฌ๋ถ
attachment: { type: attachmentSchema, required: false } // ์ฒจ๋ถํ์ผ ์๋ธ๋ฌธ์
});
// ๋ณตํฉ ์ธ๋ฑ์ค ์ค์ (chatroomSeq, createdAt, isDeleted ๊ธฐ์ค์ผ๋ก ์ฟผ๋ฆฌ ์ต์ ํ)
chatMessageSchema.index(
{ chatroomSeq: 1, createdAt: 1, isDeleted: 1 },
{ name: "chatroom_createdAt_isDeleted_idx" }
);
// ๋ชจ๋ธ ๋ด๋ณด๋ด๊ธฐ
module.exports = mongoose.model('ChatMessage', chatMessageSchema);
| ๊ตฌ์ฑ์์ | ์ฌ์ |
|---|---|
| CloudFront(Frontend) | Vue.js, Vite |
| EKS | t3.large(2 vCPU, 8GB RAM), Nginx, Spring Boot |
| RDS | db.t3.medium(2 vCPU, 4GB RAM), MariaDB, MongoDB, redis |
| S3 | 5GB ํ์ค ์คํ ๋ฆฌ์ง, ์ด 2๊ฐ์ ๋ฒํท(ํ๋ก ํธ์๋ ํ๋ก์ ํธ, ์ ๋ก๋ ํ์ผ) |
๋จ์ ํ ์คํธ ๊ฒฐ๊ณผ์ (Sheet)






















.gif)

.gif)







.gif)


























.gif)
.gif)







.gif)
.gif)






