자카λ₯΄νƒ€ 메일 ν”„λ‘œλ°”μ΄λ” 였λ₯˜

πŸ‘©β€πŸ’» μ‚¬μš©μž 둜그인 μ‹œ 2μ°¨ 인증 메일이 μ•ˆμ™€μš”

κ°œλ°œμ€‘μΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λ₯Ό QAκ°€ λ°°ν¬ν•˜κ³ λ‚˜μ„œ μ‚¬μš©μž 둜그인 μ‹œ 2차인증을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μΈμ¦μ½”λ“œ 메일이 μˆ˜μ‹ μ΄ μ•ˆλœλ‹€λŠ” 버그 리포트λ₯Ό ν•΄μ£Όμ—ˆμ–΄μš”. κ°‘μžκΈ° μ–΄λ–€ 문제둜 인해 이메일이 λ°œμ†‘λ˜μ§€ μ•Šμ•˜λŠ”μ§€μ™€ 해결과정에 λŒ€ν•΄μ„œ κ³΅μœ ν•΄λ³΄λ €κ³  ν•©λ‹ˆλ‹€.

문제 원인 뢄석

λ¨Όμ €, ν•΄λ‹Ή μ„œλ²„μ—λŠ” μ˜ˆμ™Έ 상황을 좔적할 수 μžˆλ„λ‘ Sentryκ°€ λ„μž…λ˜μ–΄ μžˆλŠ” μƒνƒœμ˜€μŠ΅λ‹ˆλ‹€. Sentry μ—μ„œλŠ” μˆ˜μ§‘λœ μ˜ˆμ™Έκ°€ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μ¦‰μ‹œ μ•Œμ•„μ±„μ§€ λͺ»ν•˜λŠ” 상황에 ν•΄λ‹Ήν•©λ‹ˆλ‹€. μ•„λ¬΄νŠΌ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ 둜그λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ λ¦¬λˆ…μŠ€ μ„œλ²„μ— μ ‘μ†ν•˜κ³  도컀 μ»¨ν…Œμ΄λ„ˆμ— 기둝된 졜근 둜그λ₯Ό μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

# docker compose logs --since '2024-09-06T16:00+09:00' app
docker compose logs --since '5m' app
app | ... caused by: Not provider of jakarta.mail.util.StreamProvider was found

도컀 μ»΄ν¬μ¦ˆμ—μ„œ –since μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ›ν•˜λŠ” μ‹œμ λΆ€ν„°μ˜ 둜그λ₯Ό 확인할 수 μžˆμ–΄μš”

μ„œλ²„ λ‘œκ·Έμ—λŠ” μœ„μ™€ 같이 자카λ₯΄νƒ€ λ©”μΌμ˜ StreamProviderλ₯Ό 찾을 수 μ—†λ‹€λŠ” 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚¨μ•„μžˆμ—ˆλŠ”λ°μš”. μ²˜μŒλ³΄λŠ” 였λ₯˜ λ©”μ‹œμ§€ μ΄λ―€λ‘œ ꡬ글 검색을 ν•΄λ³΄λ‹ˆ 자카λ₯΄νƒ€ 메일 κ΄€λ ¨ κΉƒν—ˆλΈŒμ— 이슈둜 λ“±λ‘λœ λ‚΄μš©μ΄ μžˆμŒμ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 이슈 λ‚΄μš©μ€ μ  ν‚¨μŠ€ ν”ŒλŸ¬κ·ΈμΈμ—μ„œ Jakarta Mail API 2.1.1 을 μ‚¬μš©ν•˜λ©΄ μœ„μ™€ λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ™μΌν•˜κ²Œ μ  ν‚¨μŠ€μ—μ„œ λ°œμƒν•œ 것은 μ•„λ‹ˆμ§€λ§Œ μ‹€ν–‰κ°€λŠ₯ν•œ Jar μ—μ„œ ν΄λž˜μŠ€λ‘œλ”κ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠλŠ”λ‹€λŠ” 이슈λ₯Ό λ³΄κ²Œλ˜μ—ˆκ³  자카λ₯΄νƒ€ 메일에 λŒ€ν•œ 라이브러리 버전을 ν™•μΈν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— ν•΄λ‹Ήλ˜λŠ” μŠ€ν”„λ§ λΆ€νŠΈ 3.1.2의 μ˜μ‘΄μ„± 버전 μ •λ³΄μ—μ„œ 검색을 ν•΄λ³΄λ‹ˆ μ•„λž˜μ™€ 같이 νŒŒμ•…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • org.eclipse.angus:angus-mail:1.1.0
  • org.eclipse.angus:angus-activation:2.0.1
  • jakarta.mail:jakarta.mail-api:1.1.0
  • jakarta.activation:jakarta.activation-api:2.1.2

μš°μ„  λ³€κ²½μ‚¬ν•­μ—μ„œ μ˜μ‹¬λ˜λŠ” 뢀뢄이 λ°œκ²¬λ˜μ§€ μ•Šμ•˜κΈ°μ— μ˜μ‘΄μ„± 버전을 λ³€κ²½ν•˜μ—¬ 배포λ₯Ό μ‹œλ„ν•΄λ³΄μ•„μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. build.gradle에 μ•„λž˜μ™€ 같이 Jakarta Mail API 2.1.3 λ₯Ό μΆ”κ°€ν•˜κ³  λΉŒλ“œ 및 배포λ₯Ό μˆ˜ν–‰ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

build.gradle
ext { set('angus-mail.version', '2.0.3') // from 1.1.0 set('jakarta-mail.version', '2.1.3') // from 2.1.2 }

μƒˆλ‘­κ²Œ 배포된 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλ„ 메일이 λ°œμ†‘λ˜μ§€ μ•Šμ•˜κ³  μ•„λž˜μ™€ 같은 μƒˆλ‘œμš΄ 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚¨μ•˜μŠ΅λ‹ˆλ‹€.

Provider for jakarta.activation.spi.MailcapRegistryProvider cannot be found

Jakarta Mail API 버전을 λ³€κ²½ν•˜λ©΄ jakarta.activation-api 도 변경될거라 μƒκ°ν–ˆλŠ”λ°μš”. λ””νŽœλ˜μ‹œ 트리λ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μ§€ μ•Šμ€κ²Œ λŒ€μ‘ κ³Όμ •μ—μ„œμ˜ μ‹€μˆ˜μ˜€μŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 jakarta-activation 에 λŒ€ν•œ 버전을 μΆ”κ°€λ‘œ μ§€μ •ν•˜κ³  λ‹€μ‹œ λ°°ν¬ν–ˆμŠ΅λ‹ˆλ‹€.

build.gradle
ext { set('angus-mail.version', '2.0.3') set('angus-activation.version', '2.0.2') // from 1.1.0 set('jakarta-mail.version', '2.1.3') set('jakarta-activation.version', '2.1.3') // from 2.1.2 }

πŸ‘©β€πŸ’» 2μ°¨ 인증 메일 μ œλŒ€λ‘œ μ™€μš”β€Ό

일단 κΈ‰ν•˜κ²Œ 해결은 λ˜μ—ˆμœΌλ‹ˆ λ‹€ν–‰μ΄μ§€λ§Œ 더 μžμ„Έν•œ λ‚΄μš©μ— λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄μ•„μ•Όκ² μ£ ? λ¨Όμ €, μ˜μ‘΄μ„± 버전을 μ˜¬λ¦¬λŠ” 것은 λ§Žμ€ ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•œ μœ„ν—˜ν•œ μž‘μ—…μž„μ„ λ˜λŒμ•„λ΄μ•Όν•©λ‹ˆλ‹€. ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” λ¦΄λ¦¬μ¦ˆν•œ μ œν’ˆμ€ μ•„λ‹ˆμ—ˆκΈ°μ— 운영 ν™˜κ²½μ΄ μ—†μ—ˆκ³  λ¬Έμ œκ°€ λ°œμƒν–ˆλ˜ 것은 ν…ŒμŠ€νŠΈ μ—”μ§€λ‹ˆμ–΄κ°€ κΈ°λŠ₯ 확인할 수 μžˆλŠ” ν…ŒμŠ€νŠΈ ν™˜κ²½μ΄μ—ˆκΈ°μ— κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, ν•΄λ‹Ή 였λ₯˜λŠ” 둜컬 ν™˜κ²½μ—μ„œ μΈν…”λ¦¬μ œμ΄ IDE둜 μ‹€ν–‰λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” λ°œμƒν•˜μ§€ μ•Šμ•˜λŠ”λ°μš”. μ‹€ν–‰κ°€λŠ₯ν•œ Jar μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€λŠ” μ •λ³΄λŠ” λ¬Έμ œκ°€ ν•΄κ²°ν•˜κ³ λ‚˜μ„œ 더 μžμ„Έν•œ λ‚΄μš©μ„ 찾아보고 μ •λ¦¬ν•˜λŠ” λ‹¨κ³„μ—μ„œ μ•Œκ²Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‘œμ»¬μ—μ„œ λΉŒλ“œν•˜κ³  싀행해보지 μ•Šμ€ 접근에 λŒ€ν•΄μ„œλŠ” μ•„μ‰¬μš΄ λΆ€λΆ„μœΌλ‘œ μƒκ°λ˜λ―€λ‘œ κ°œμ„ ν•΄μ•Όν•  λΆ€λΆ„ κ°™μŠ΅λ‹ˆλ‹€.

문제 ν•΄κ²° 정리

Not provider of jakarta.mail.util.StreamProvider was found
Provider for jakarta.activation.spi.MailcapRegistryProvider cannot be found

  • μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ ForkJoinPoolλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Executable Jar μ—μ„œ ν΄λž˜μŠ€λ‘œλ”κ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šμ„ 수 있음
  • λ¬Έμ œκ°€ λ˜μ—ˆλ˜ μ½”λ“œμ—λŠ” ParallelStream 을 μ‚¬μš©ν–ˆκΈ°μ— λ‚΄λΆ€μ μœΌλ‘œ ForkJoinPool을 ν˜ΈμΆœν•˜λŠ” μƒνƒœ
  • Jakarta Mail 2.1.2 μ΄ν•˜ λ²„μ „μ—μ„œ ν΄λž˜μŠ€λ‘œλ”κ°€ Jakarta Provider SPIλ₯Ό 찾을 수 μ—†λŠ” 결함이 있음
  • Jakarta Mail 2.1.3 을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” Angus Mail Provider 2.0.3 을 좔가해야함

β€» Angus Mail 은 Jakarta Mail Specification 2.1+ 에 λŒ€ν•œ κ΅¬ν˜„μ²΄ ν”„λ‘œμ νŠΈλΌκ³  ν•΄μš”.

κ°μ‚¬ν•©λ‹ˆλ‹€.