Skip to content

Latest commit

Β 

History

96 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ’Š λ©”λ””νŒ¨μŠ€ (Medipass) β€” Backend

μ•½ λ΄‰νˆ¬ ν•œ μž₯이면, ν•΄μ™Έ λ°˜μž… μ€€λΉ„κ°€ λλ‚©λ‹ˆλ‹€.

"이 μ•½, κ·Έ λ‚˜λΌμ— 가져가도 λ˜λ‚˜μš”?"

해외여행에 약을 κ°€μ Έκ°ˆ λ•Œ μ–΄λ–€ 성뢄이 규제 λŒ€μƒμΈμ§€, μ–΄λ–€ μ„œλ₯˜λ₯Ό μ€€λΉ„ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ •λΆ€ μ›μ²œ 데이터 κΈ°μ€€μœΌλ‘œ νŒμ •ν•΄ μ£ΌλŠ” μ—¬ν–‰μž μ˜μ•½ν’ˆ λ°˜μž… μ€€λΉ„ μ„œλΉ„μŠ€μ˜ λ°±μ—”λ“œμž…λ‹ˆλ‹€.

μ•½ λ΄‰νˆ¬λ₯Ό μ΄¬μ˜ν•˜λ©΄ OCR둜 약을 읽어 μ‹μ•½μ²˜ μ˜μ•½ν’ˆ 정보와 λ§€μΉ­ν•˜κ³ , μ—¬ν–‰ κ΅­κ°€λ₯Ό κ³ λ₯΄λ©΄ 성뢄별 μ‹ ν˜Έλ“± νŒμ •κ³Ό μ€€λΉ„ μ„œλ₯˜ 체크리슀트λ₯Ό λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€. μ„œλ₯˜λŠ” AWS S3에 λ³΄κ΄€ν•˜κ³ , ν˜„μ§€μ—μ„œ λ¬Έμ œκ°€ 생기면 μž¬μ™Έκ³΅κ΄€ μ—°λ½μ²˜μ™€ ν˜„μ§€μ–΄ μ„€λͺ…λ¬ΈκΉŒμ§€ μ œκ³΅ν•©λ‹ˆλ‹€.


πŸ”Ή μ£Όμš” κΈ°λŠ₯

1. πŸ” 인증 / 인가

  • 카카였 OAuth2 μ†Œμ…œ 둜그인
  • 둜그인 성곡 μ‹œ JWT λ°œκΈ‰ β†’ 이후 λͺ¨λ“  μš”μ²­μ€ Authorization: Bearer <token> 헀더 μ‚¬μš©
  • λ‚΄ 계정 정보 쑰회

2. πŸ“· μ•½ λ΄‰νˆ¬ 인식 & λ³΅μ•½μΉ΄λ“œ

  • μ•½ λ΄‰νˆ¬ 사진 μ—…λ‘œλ“œ β†’ CLOVA OCR둜 μ•½ν’ˆλͺ…Β·μš©λ²• μΆ”μΆœ
  • μΆ”μΆœ κ²°κ³Όλ₯Ό μ‹μ•½μ²˜ μ˜μ•½ν’ˆ API의 ν’ˆλͺ©μ½”λ“œ κΈ°μ€€μœΌλ‘œ 맀칭·검증
  • 인식이 μ• λ§€ν•˜λ©΄ μ œν’ˆλͺ…μœΌλ‘œ 후보 λͺ©λ‘ 검색해 μ‚¬μš©μžκ°€ 직접 선택
  • ν™•μ •λœ 약을 λ³΅μ•½μΉ΄λ“œλ‘œ 등둝 (쑰제일자·처방일수·1회 λ³΅μš©λŸ‰Β·λ³΅μš© 횟수)

3. ✈️ μ—¬ν–‰ 등둝 & λ°˜μž… νŒμ •

  • μ—¬ν–‰(μΆœλ°œμ§€Β·λ„μ°©μ§€Β·κΈ°κ°„) 등둝 및 κ°€μ Έκ°ˆ μ•½ 선택
  • 성뢄별 μ‹ ν˜Έλ“± νŒμ • β€” λ°˜μž… κ°€λŠ₯ / μ€€λΉ„ ν•„μš” / λ°˜μž… λΆˆκ°€
  • μˆ˜λŸ‰ ν•œλ„κ°€ μžˆλŠ” 성뢄은 μ†Œμ§€λŸ‰μ„ 계산해 ν•œλ„μ™€ 비ꡐ
  • νŒμ • κ·Όκ±°(μ›μ²œ λ¬Έμ„œΒ·κΈ°μ€€μΌ) 및 ꡭ가별 λ°˜μž… κ·œμ • 쑰회

4. βœ… μ€€λΉ„ μ„œλ₯˜ 체크리슀트

  • νŒμ • 결과에 따라 ν•„μš”ν•œ μ„œλ₯˜Β·ν–‰λ™ ν•­λͺ©μ„ μžλ™ 생성
  • ν•­λͺ©λ³„ μ™„λ£Œ 체크, μ •λΆ€ 곡식 μ‹ μ²­ νŽ˜μ΄μ§€ 링크 μ—°κ²°
  • μ—…λ‘œλ“œκ°€ ν•„μš”ν•œ ν•­λͺ©μ€ PDF 첨뢀 (μ΅œλŒ€ 10MB, PDF μ‹œκ·Έλ‹ˆμ²˜κΉŒμ§€ 검증)

5. πŸ—‚οΈ μ„œλ₯˜ν•¨

  • μ—…λ‘œλ“œν•œ μ„œλ₯˜λ₯Ό AWS S3에 μ €μž₯ (DBμ—λŠ” 객체 ν‚€λ§Œ 보관)
  • 쑰회 μ‹œλ§ˆλ‹€ 만료 μ‹œκ°„μ΄ μžˆλŠ” presigned URL을 λ°œκΈ‰ν•΄ λ―Έλ¦¬λ³΄κΈ°Β·λ‹€μš΄λ‘œλ“œ 제곡
  • μ•½ν’ˆλ³„ μ„œλ₯˜ λͺ©λ‘ 쑰회, μ„œλ₯˜ μ‚­μ œ

6. πŸ†˜ ν•΄μ™Έ κΈ΄κΈ‰ λŒ€μ‘

  • 외ꡐ뢀 μž¬μ™Έκ³΅κ΄€ API 연동 β€” ν˜„μ§€ λŒ€μ‚¬κ΄€Β·μ˜μ‚¬κ΄€ μ—°λ½μ²˜ 쑰회
  • 볡용 쀑인 약을 ν˜„μ§€μ–΄ μ„€λͺ…λ¬ΈμœΌλ‘œ λ³€ν™˜ (OpenAI) β€” ν˜„μ§€ λ³‘μ›Β·μ•½κ΅­Β·μ„Έκ΄€μ—μ„œ μ œμ‹œ

🌏 규제 데이터 νŒŒμ΄ν”„λΌμΈ

이 μ„œλΉ„μŠ€μ˜ 핡심은 μ •λΆ€ μ›μ²œ λ¬Έμ„œμ—μ„œ 뽑아낸 규제 λ°μ΄ν„°μž…λ‹ˆλ‹€. λ‚˜λΌλ§ˆλ‹€ λ¬Έμ„œ ν˜•μ‹μ΄ 달라, μ˜€ν”„λΌμΈμ—μ„œ μ •κ·œν™”λœ TSV둜 μΆ”μΆœν•΄ 두고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘ν•  λ•Œ UPSERT λ°©μ‹μœΌλ‘œ μ μž¬ν•©λ‹ˆλ‹€.

πŸ“„ μ •λΆ€ μ›μ²œ λ¬Έμ„œ(PDF)
      β”‚  μ˜€ν”„λΌμΈ μΆ”μΆœ (pdfplumber)
      β–Ό
πŸ“‹ μ •κ·œν™” TSV  (μ„±λΆ„λͺ… Β· λΆ„λ₯˜ Β· κΈˆμ§€ μ—¬λΆ€ Β· μˆ˜λŸ‰ ν•œλ„ Β· 기쀀일)
      β”‚  μ•± 기동 μ‹œ μžλ™ 적재 (UPSERT β€” id μœ μ§€, λͺ©λ‘ μ΄νƒˆλΆ„μ€ λΉ„ν™œμ„±)
      β–Ό
πŸ—„οΈ ingredient_regulation / requirement_template
      β”‚
      β–Ό
βš–οΈ νŒμ • μ—”μ§„  β†’  μ‹ ν˜Έλ“± + μ€€λΉ„ μ„œλ₯˜ 체크리슀트
κ΅­κ°€ μ›μ²œ λΆ„λ₯˜ 체계
πŸ‡―πŸ‡΅ 일본 후생노동성 λ§ˆμ•½λ‹¨μ†λΆ€(NCD) κ·œμ œμ•½λ¬Ό λͺ©λ‘ N(λ§ˆμ•½) Β· P(ν–₯μ •μ‹ μ„±) Β· SRM(κ°μ„±μ œ μ›λ£Œ)

μƒˆ κ΅­κ°€ μΆ”κ°€λŠ” CountryRegulationSource Β· CountryRequirementSource κ΅¬ν˜„μ²΄ ν•˜λ‚˜μ™€ TSV ν•œ λ²Œμ„ λ”ν•˜λ©΄ λλ‚˜λ„λ‘ 섀계돼 μžˆμŠ΅λ‹ˆλ‹€.


πŸš€ 기술 μŠ€νƒ

  • Language / Runtime: Java 21 (Temurin)

  • Framework: Spring Boot 4.1.0, Spring Web MVC, Spring Data JPA, Bean Validation

  • Database: MySQL (Hibernate / JPA)

  • Auth: Kakao OAuth2 Login, Spring Security, JWT (jjwt 0.12.3)

  • Storage: AWS S3 (AWS SDK for Java v2, Presigned URL)

  • External API: μ‹μ•½μ²˜ μ˜μ•½ν’ˆμ •λ³΄, 외ꡐ뢀 μž¬μ™Έκ³΅κ΄€, CLOVA OCR, OpenAI

  • Docs: springdoc-openapi 3.0.3 (Swagger UI)

  • Build / Deploy: Gradle (Wrapper), Docker, GitHub Actions

  • Etc.: Lombok, JPA Auditing


πŸ—οΈ μ•„ν‚€ν…μ²˜ κ°œμš”

πŸ“± Mobile / Web
    β”‚  카카였 둜그인 Β· JWT
    β–Ό
πŸ’Š Medipass Backend (Spring Boot)
    β”‚
    β”œβ”€β–Ά πŸ—„οΈ MySQL           도메인 데이터 Β· 규제 λ§ˆμŠ€ν„°
    β”œβ”€β–Ά πŸͺ£ AWS S3          μ„œλ₯˜ 원본 (Presigned URL λ°œκΈ‰)
    β”‚
    β”œβ”€β‡„ πŸ“· CLOVA OCR       μ•½ λ΄‰νˆ¬ 인식
    β”œβ”€β‡„ πŸ₯ μ‹μ•½μ²˜ API       μ˜μ•½ν’ˆ ν’ˆλͺ© Β· μ„±λΆ„ 쑰회
    β”œβ”€β‡„ πŸ›οΈ 외ꡐ뢀 API       μž¬μ™Έκ³΅κ΄€ μ—°λ½μ²˜
    └─⇄ πŸ€– OpenAI          ν˜„μ§€μ–΄ μ„€λͺ…λ¬Έ 생성
  • μ™ΈλΆ€ APIλŠ” λͺ¨λ‘ global/*/client μ•„λž˜ μ „μš© ν΄λΌμ΄μ–ΈνŠΈλ‘œ 감싸, 도메인 μ½”λ“œκ°€ μ™ΈλΆ€ μŠ€νŽ™μ— 직접 묢이지 μ•Šκ²Œ ν–ˆμŠ΅λ‹ˆλ‹€.
  • 규제 νŒμ •μ€ μ™ΈλΆ€ 호좜 없이 우리 DB만으둜 μ™„κ²°λ˜μ–΄, μ™ΈλΆ€ API μž₯애와 λ¬΄κ΄€ν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.
  • μ„œλ₯˜λŠ” DB에 URL을 μ €μž₯ν•˜μ§€ μ•Šκ³  객체 ν‚€λ§Œ λ³΄κ΄€ν•œ λ’€ 쑰회 μ‹œλ§ˆλ‹€ λ§Œλ£Œν˜• URL을 λ°œκΈ‰ν•©λ‹ˆλ‹€.

πŸ“ νŒ¨ν‚€μ§€ ꡬ쑰

src/main/java/com/medipass/server
β”œβ”€ domain
β”‚  β”œβ”€ user         # μ‚¬μš©μž, 카카였 OAuth2 둜그인
β”‚  β”œβ”€ country      # κ΅­κ°€ λ§ˆμŠ€ν„°
β”‚  β”œβ”€ medication   # μ•½ λ΄‰νˆ¬ μŠ€μΊ” Β· μ‹μ•½μ²˜ λ§€μΉ­ Β· λ³΅μ•½μΉ΄λ“œ
β”‚  β”œβ”€ regulation   # 규제 μ„±λΆ„ Β· μ„œλ₯˜ ν…œν”Œλ¦Ώ Β· νŒμ • μ—”μ§„
β”‚  β”‚  └─ source      # ꡭ가별 규제/μ„œλ₯˜ Source
β”‚  β”œβ”€ trip         # μ—¬ν–‰ Β· 여행별 μ•½ Β· 체크리슀트
β”‚  β”œβ”€ document     # μ„œλ₯˜ μ—…λ‘œλ“œ Β· μ„œλ₯˜ν•¨
β”‚  β”œβ”€ emergency    # μž¬μ™Έκ³΅κ΄€ 데이터
β”‚  └─ sos          # κΈ΄κΈ‰ μ—°λ½μ²˜ Β· ν˜„μ§€μ–΄ μ„€λͺ…λ¬Έ
└─ global
   β”œβ”€ config       # Security, Web, CORS μ„€μ •
   β”œβ”€ jwt          # JWT ν•„ν„° Β· Provider Β· UserDetails
   β”œβ”€ oauth        # 카카였 OAuth2 ν•Έλ“€λŸ¬
   β”œβ”€ s3           # S3 μ—…λ‘œλ“œ Β· Presigned URL
   β”œβ”€ ocr          # CLOVA OCR ν΄λΌμ΄μ–ΈνŠΈ
   β”œβ”€ mfds         # μ‹μ•½μ²˜ API ν΄λΌμ΄μ–ΈνŠΈ
   β”œβ”€ mofa         # 외ꡐ뢀 API ν΄λΌμ΄μ–ΈνŠΈ
   β”œβ”€ openai       # OpenAI ν΄λΌμ΄μ–ΈνŠΈ Β· ν”„λ‘¬ν”„νŠΈ
   β”œβ”€ response     # 곡톡 응닡 (ApiResponse / Success / Error)
   β”œβ”€ exception    # μ „μ—­ μ˜ˆμ™Έ 처리
   β”œβ”€ filter       # μš”μ²­ ID ν•„ν„°
   β”œβ”€ entity       # BaseEntity (JPA Auditing)
   └─ init         # 초기 데이터 λ‘œλ” (κ΅­κ°€ Β· 규제 Β· μ„œλ₯˜ ν…œν”Œλ¦Ώ)

πŸ”Œ μ£Όμš” API

Swagger UI와 OAuth2 둜그인 경둜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ—”λ“œν¬μΈνŠΈλŠ” 인증이 ν•„μš”ν•©λ‹ˆλ‹€.

μ‚¬μš©μž Β Β·Β  /api/users

Method Endpoint μ„€λͺ…
GET /me λ‚΄ 계정 정보 쑰회

μ˜μ•½ν’ˆ Β Β·Β  /api/medications

Method Endpoint μ„€λͺ…
POST /scans μ•½ λ΄‰νˆ¬ 이미지 인식 (OCR)
GET /candidates μ œν’ˆλͺ…μœΌλ‘œ μ‹μ•½μ²˜ μ˜μ•½ν’ˆ 후보 검색
POST / OCR 확인 결과둜 μ˜μ•½ν’ˆ 등둝
GET / λ³΅μ•½μΉ΄λ“œ λͺ©λ‘ 쑰회
GET /cards ν™ˆ ν™”λ©΄ λ³΅μ•½μΉ΄λ“œ 쑰회
GET /{medicationId}/card λ³΅μ•½μΉ΄λ“œ 단건 상세 쑰회
GET /{medicationId}/documents μ•½ν’ˆλ³„ μ„œλ₯˜ λͺ©λ‘ 쑰회

μ—¬ν–‰ Β Β·Β  /api/trips

Method Endpoint μ„€λͺ…
POST /analyze μ—¬ν–‰ 정보 뢄석
POST / μ—¬ν–‰ 등둝
GET /checklog μ—¬ν–‰ λͺ©λ‘ (체크둜그)
GET /medications 여행에 담을 수 μžˆλŠ” μ•½ λͺ©λ‘
GET /{tripId} μ—¬ν–‰ 상세 쑰회
PATCH /{tripId}/title μ—¬ν–‰ 제λͺ© μˆ˜μ •
DELETE /{tripId} μ—¬ν–‰ μ‚­μ œ

여행별 μ•½ Β· 체크리슀트 Β Β·Β  /api/trips/{tripId}/medications/{tripMedicationId}

Method Endpoint μ„€λͺ…
GET /destination 도착 κ΅­κ°€ λ°˜μž… κ·œμ • 쑰회
GET /basis νŒμ • κ·Όκ±° 쑰회
GET /checklist μ€€λΉ„ 체크리슀트 쑰회
PATCH /checklist/{checklistItemId} 체크리슀트 μ™„λ£Œ μƒνƒœ λ³€κ²½
POST /checklist/{checklistItemId}/document 체크리슀트 μ„œλ₯˜ μ—…λ‘œλ“œ

μ„œλ₯˜ν•¨ Β Β·Β  /api/documents

Method Endpoint μ„€λͺ…
GET / μ„œλ₯˜ν•¨ 메인 쑰회
GET /{documentId} μ„œλ₯˜ 보기 (미리보기 URL λ°œκΈ‰)
POST /{documentId}/download μ„œλ₯˜ λ‹€μš΄λ‘œλ“œ URL λ°œκΈ‰
DELETE /{documentId} μ„œλ₯˜ μ‚­μ œ

규제 νŒμ • Β· SOS

Method Endpoint μ„€λͺ…
POST /api/regulations/judge μ„±λΆ„ 규제 νŒμ •
POST /api/sos/contacts ν˜„μ§€ μž¬μ™Έκ³΅κ΄€ μ—°λ½μ²˜ 쑰회
POST /api/sos/scripts ν˜„μ§€μ–΄ μ„€λͺ…λ¬Έ 생성

πŸ‘₯ νŒ€ ꡬ성 (Backend)


μ •μ’…μ§„

μ‘°μœ€μ§€
Backend Backend
@ThreeeJ @yj-044

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages