Skip to content

Chiptune93/java.fcm-push.example

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Spring Boot FCM ν‘Έμ‹œ μ•Œλ¦Ό μ„œλΉ„μŠ€

κ°œμš”

이 ν”„λ‘œμ νŠΈλŠ” Spring Boot ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬μΆ•λœ Firebase Cloud Messaging(FCM) ν‘Έμ‹œ μ•Œλ¦Όμ„ μ „μ†‘ν•˜κΈ° μœ„ν•œ κ°•λ ₯ν•œ μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. Android 및 iOS 기기에 ν‘Έμ‹œ μ•Œλ¦Όμ„ μ•ˆμ •μ μœΌλ‘œ λŒ€κΈ°μ—΄μ— λ„£κ³  λ°œμ†‘ν•΄μ•Ό ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” κΈ°λŠ₯:

  • Spring Boot 톡합: μžλ™ ꡬ성, μ˜μ‘΄μ„± 관리 및 배포 μš©μ΄μ„±μ„ μœ„ν•΄ Spring Bootλ₯Ό ν™œμš©ν•©λ‹ˆλ‹€.
  • 비동기 전솑: λΆ€ν•˜ μƒν™©μ—μ„œλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 응닡성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ Spring의 @Async κΈ°λŠ₯을 ν™œμš©ν•œ λ…ΌλΈ”λ‘œν‚Ή ν‘Έμ‹œ μ•Œλ¦Ό λ°œμ†‘.
  • λŒ€κΈ°μ—΄ 기반 처리: ν‘Έμ‹œ λ©”μ‹œμ§€κ°€ μ €μž₯되고 μ²΄κ³„μ μœΌλ‘œ μ²˜λ¦¬λ˜λŠ” λŒ€κΈ°μ—΄ λ©”μ»€λ‹ˆμ¦˜(λ°μ΄ν„°λ² μ΄μŠ€ κ΅¬ν˜„ ν•„μš”)κ³Ό ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ 섀계.
  • 크둜슀 ν”Œλž«νΌ 지원: FCM을 톡해 Android와 iOS ν”Œλž«νΌ λͺ¨λ‘μ— μ•Œλ¦Όμ„ ν¬λ§·νŒ…ν•˜κ³  μ „μ†‘ν•˜λŠ” 둜직 포함.
  • ꡬ성 κ°€λŠ₯: FCM μ„œλ²„ μ„ΈλΆ€ 정보 및 μž‘μ—… μ‹€ν–‰ λ§€κ°œλ³€μˆ˜λŠ” application.properties와 Java ꡬ성을 톡해 외뢀화됨.

μ•„ν‚€ν…μ²˜

이 μ„œλΉ„μŠ€λŠ” λ‹€μŒκ³Ό 같은 μ£Όμš” ꡬ성 μš”μ†Œλ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€:

  • PushScheduleBean: λŒ€κΈ°μ—΄μ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•  보λ₯˜ 쀑인 ν‘Έμ‹œ μ•Œλ¦Όμ„ 주기적으둜 ν™•μΈν•˜λŠ” Spring 관리 빈(일반적으둜 @Scheduled μ»΄ν¬λ„ŒνŠΈμ΄λ‚˜, 이 λ²„μ „μ—μ„œλŠ” μŠ€μΌ€μ€„λ§ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μΆ”κ°€λ˜μ§€ μ•ŠμŒ).
  • PushDispatchService: κ°œλ³„ ν‘Έμ‹œ μ•Œλ¦Όμ˜ μ‹€μ œ 처리 및 전솑을 λ‹΄λ‹Ήν•˜λŠ” Spring @Service. μŠ€μΌ€μ€„λŸ¬λ‚˜ API μŠ€λ ˆλ“œκ°€ μ°¨λ‹¨λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ Spring의 @Async("taskExecutor") κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ μž‘μ—…μ„ λΉ„λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰.
  • PushSendService (μΈν„°νŽ˜μ΄μŠ€): ν‘Έμ‹œ μ•Œλ¦Όκ³Ό κ΄€λ ¨λœ 데이터 μ•‘μ„ΈμŠ€ μž‘μ—…μ„ μœ„ν•œ 계약을 μ •μ˜. λŒ€κΈ° 쀑인 λ©”μ‹œμ§€ μ°ΎκΈ°, μƒνƒœ μ—…λ°μ΄νŠΈ(예: WAIT, ING, COMPLETE, FAILED) 및 ν‘Έμ‹œ μ‹œλ„ λ‘œκΉ…μ„ μœ„ν•œ λ©”μ„œλ“œ 포함. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ™„μ „νžˆ μž‘λ™ν•˜λ €λ©΄ 이 μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„(예: Spring Data JPA λ˜λŠ” MyBatis μ‚¬μš©)이 ν•„μš”ν•©λ‹ˆλ‹€.
  • MyMap (μž„μ‹œ 클래슀): ν˜„μž¬ 이 ν΄λž˜μŠ€λŠ” HashMap<String, Object>λ₯Ό ν™•μž₯ν•˜λ©° μ»΄ν¬λ„ŒνŠΈ κ°„ 데이터 전솑에 μ‚¬μš©λ©λ‹ˆλ‹€. getString()κ³Ό getInt() 같은 헬퍼 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. 더 λ‚˜μ€ νƒ€μž… μ•ˆμ „μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ μœ„ν•΄ MyMap μ‚¬μš©μ„ νŠΉμ • 데이터 전솑 객체(DTO)둜 λŒ€μ²΄ν•˜λŠ” 것이 κ°•λ ₯히 ꢌμž₯λ©λ‹ˆλ‹€.
  • Spring Framework: μ˜μ‘΄μ„± μ£Όμž…, μ»΄ν¬λ„ŒνŠΈ 관리 및 비동기 싀행을 μœ„ν•œ 핡심 ν”„λ ˆμž„μ›Œν¬.
  • RestTemplate: FCM μ„œλ²„μ— HTTP POST μš”μ²­μ„ λ³΄λ‚΄λŠ” 데 μ‚¬μš©.
  • Jackson: FCM용 Java 객체λ₯Ό JSON νŽ˜μ΄λ‘œλ“œλ‘œ μ§λ ¬ν™”ν•˜κ³  FCM 응닡을 μ—­μ§λ ¬ν™”ν•˜λŠ” 데 μ‚¬μš©.

ꡬ성

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성은 주둜 src/main/resources/application.propertiesμ—μ„œ κ΄€λ¦¬λ©λ‹ˆλ‹€.

ꡬ성해야 ν•  μ£Όμš” 속성:

  • FCM μ„œλ²„ ν‚€: fcm.server.key=YOUR_FCM_SERVER_KEY (Firebase μ½˜μ†”μ—μ„œ 받은 μ‹€μ œ FCM μ„œλ²„ ν‚€λ‘œ YOUR_FCM_SERVER_KEYλ₯Ό λŒ€μ²΄ν•˜μ„Έμš”.)

  • FCM μ„œλ²„ URL: fcm.server.url=https://fcm.googleapis.com/fcm/send (μ΄λŠ” ν‘œμ€€ FCM λ ˆκ±°μ‹œ HTTP API μ—”λ“œν¬μΈνŠΈμž…λ‹ˆλ‹€. FCM v1 APIλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 이 URL이 λ³€κ²½λ©λ‹ˆλ‹€.)

  • 비동기 μž‘μ—… μ‹€ν–‰κΈ°: 비동기 μž‘μ—… μ‹€ν–‰κΈ°λŠ” syworks.base.config.AsyncConfig.javaμ—μ„œ κ΅¬μ„±λ©λ‹ˆλ‹€. 이 Java ꡬ성 ν΄λž˜μŠ€μ—μ„œ 직접 μ½”μ–΄ ν’€ 크기, μ΅œλŒ€ ν’€ 크기 및 λŒ€κΈ°μ—΄ μš©λŸ‰κ³Ό 같은 λ§€κ°œλ³€μˆ˜λ₯Ό μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    // AsyncConfig.java μ˜ˆμ‹œ
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(25);
    executor.setThreadNamePrefix("PushNotifier-");

μ „μ œ 쑰건

  • Java: 버전 11 (pom.xml에 λͺ…μ‹œλ¨).
  • Maven: ν”„λ‘œμ νŠΈ λΉŒλ“œμš©.
  • FCM μ„œλ²„ ν‚€: Firebase ν”„λ‘œμ νŠΈ μ½˜μ†”μ—μ„œ 얻을 수 있음.
  • λ°μ΄ν„°λ² μ΄μŠ€ 및 PushSendService κ΅¬ν˜„: λ©”μ‹œμ§€λ₯Ό λŒ€κΈ°μ—΄μ— λ„£κ³  μ‹œλ„λ₯Ό λ‘œκΉ…ν•˜κΈ° μœ„ν•œ λ°μ΄ν„°λ² μ΄μŠ€κ°€ ν•„μš”ν•©λ‹ˆλ‹€. μ„ νƒν•œ λ°μ΄ν„°λ² μ΄μŠ€ 기술과 μƒν˜Έ μž‘μš©ν•˜κΈ° μœ„ν•΄ PushSendService μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ„ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λΉŒλ“œ 및 μ‹€ν–‰ 방법

  1. application.properties ꡬ성:

    • fcm.server.key μ„€μ •.
    • PushSendService κ΅¬ν˜„μ— ν•„μš”ν•œ 경우 λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 속성 μ„€μ •(이 κΈ°λ³Έ ν”„λ‘œμ νŠΈμ—μ„œλŠ” 닀루지 μ•ŠμŒ).
  2. ν”„λ‘œμ νŠΈ λΉŒλ“œ:

    mvn clean package
  3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰:

    java -jar target/push-application-0.0.1-SNAPSHOT.jar

    (μ‹€μ œ μ•„ν‹°νŒ©νŠΈ 이름이 λ‹€λ₯Έ 경우 push-application-0.0.1-SNAPSHOT.jarλ₯Ό ν•΄λ‹Ή μ΄λ¦„μœΌλ‘œ λŒ€μ²΄ν•˜μ„Έμš”.)

μ°Έκ³ : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‹œμž‘λ˜μ§€λ§Œ, PushSendService의 ꡬ체적인 κ΅¬ν˜„μ΄ 제곡되고 Spring 빈으둜 ꡬ성될 λ•ŒκΉŒμ§€ ν‘Έμ‹œ μŠ€μΌ€μ€„λ§ 및 전솑 κΈ°λŠ₯이 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ£Όμš” ꡬ성 μš”μ†Œ

  • PushApplication.java (syworks.base.PushApplication): 메인 Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 클래슀. 비동기 처리λ₯Ό ν™œμ„±ν™”ν•˜κΈ° μœ„ν•΄ @SpringBootApplicationκ³Ό @EnableAsync둜 μ–΄λ…Έν…Œμ΄μ…˜μ΄ 달렀 μžˆμŠ΅λ‹ˆλ‹€.

  • AsyncConfig.java (syworks.base.config.AsyncConfig): PushDispatchService의 μž‘μ—…κ³Ό 같은 비동기 μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ThreadPoolTaskExecutor 빈(taskExecutor)을 μ •μ˜ν•˜λŠ” Spring @Configuration 클래슀.

  • PushScheduleBean.java (syworks.base.scheduler.PushScheduleBean): μŠ€μΌ€μ€„λ§λ˜λ„λ‘ μ˜λ„λœ μ„œλΉ„μŠ€ 빈. PushSendServiceλ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ€κΈ° 쀑인 ν‘Έμ‹œ λ©”μ‹œμ§€λ₯Ό μ‘°νšŒν•œ λ‹€μŒ PushDispatchService에 전솑을 μœ„μž„ν•©λ‹ˆλ‹€.

  • PushDispatchService.java (syworks.base.service.PushDispatchService): 이 μ„œλΉ„μŠ€λŠ” ν‘Έμ‹œ μ•Œλ¦Όμ„ μ „μ†‘ν•˜κΈ° μœ„ν•œ 핡심 λ‘œμ§μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. FCM λ©”μ‹œμ§€λ₯Ό κ΅¬μ„±ν•˜κ³ , RestTemplate을 톡해 μ „μ†‘ν•˜λ©°, PushSendServiceλ₯Ό μ‚¬μš©ν•˜μ—¬ κ²°κ³Όλ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€. sendPushNotification λ©”μ„œλ“œλŠ” λΉ„λ™κΈ°μ‹μž…λ‹ˆλ‹€.

  • PushSendService.java (μΈν„°νŽ˜μ΄μŠ€) (syworks.base.service.PushSendService): μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— ν•„μš”ν•œ 데이터 μ•‘μ„ΈμŠ€ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€(예: findPushStatus, getOldestWatingMsg, updateStatus, insertPushLog). ꡬ체적인 κ΅¬ν˜„μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

  • MyMap.java (syworks.base.common.MyMap): 데이터 전솑에 μ‚¬μš©λ˜λŠ” HashMap을 ν™•μž₯ν•˜λŠ” μž„μ‹œ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ½”λ“œ ν’ˆμ§ˆκ³Ό μœ μ§€λ³΄μˆ˜μ„± ν–₯상을 μœ„ν•΄ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” κ°•λ ₯ν•œ νƒ€μž…μ˜ DTO둜 λŒ€μ²΄ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€.

ν–₯ν›„ κ°œμ„  사항 / To-Do

  • PushSendService κ΅¬ν˜„: λ©”μ‹œμ§€ λŒ€κΈ°μ—΄ 및 λ‘œκΉ…μ„ μœ„ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έ μž‘μš©ν•˜κΈ° μœ„ν•΄ PushSendService의 ꡬ체적인 κ΅¬ν˜„(예: Spring Data JPA, JDBC λ˜λŠ” MyBatis μ‚¬μš©) 제곡.
  • MyMap을 DTO둜 λŒ€μ²΄: νƒ€μž… μ•ˆμ „μ„±κ³Ό μ½”λ“œ λͺ…확성을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ„œλΉ„μŠ€ 계측 κ°„ 데이터 전달을 μœ„ν•œ 데이터 전솑 객체(DTO) λ„μž….
  • 포괄적인 였λ₯˜ 처리: μΌμ‹œμ μΈ FCM 전솑 μ‹€νŒ¨μ— λŒ€ν•œ μž¬μ‹œλ„ λ©”μ»€λ‹ˆμ¦˜μ„ ν¬ν•¨ν•œ 였λ₯˜ 처리 κ°œμ„ .
  • FCM v1 API: 더 λ§Žμ€ κΈ°λŠ₯κ³Ό 더 λ‚˜μ€ λ³΄μ•ˆμ„ μœ„ν•΄ λ ˆκ±°μ‹œ FCM HTTP APIμ—μ„œ μƒˆλ‘œμš΄ FCM HTTP v1 API둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜(νŽ˜μ΄λ‘œλ“œ ꡬ쑰 및 인증 λ³€κ²½ ν•„μš”).
  • λ°λ“œ λ ˆν„° 큐: μ§€μ†μ μœΌλ‘œ 전솑에 μ‹€νŒ¨ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ „λž΅ κ΅¬ν˜„.
  • μŠ€μΌ€μ€„λ§ ꡬ성: PushScheduleBean에 @Scheduled μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜κ³  cron ν‘œν˜„μ‹μ„ application.propertiesλ₯Ό 톡해 ꡬ성 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ°.
  • λͺ¨λ‹ˆν„°λ§ 및 λ©”νŠΈλ¦­: ν‘Έμ‹œ λŒ€κΈ°μ—΄ 및 전솑 속도 λͺ¨λ‹ˆν„°λ§μ„ μœ„ν•΄ Spring Boot Actuator λ˜λŠ” Micrometer와 톡합.
  • λ‹¨μœ„ 및 톡합 ν…ŒμŠ€νŠΈ ν™•μž₯: ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ² μ΄μŠ€(예: H2)μ™€μ˜ μƒν˜Έ μž‘μš©μ„ ν¬ν•¨ν•˜λŠ” 톡합 ν…ŒμŠ€νŠΈλ₯Ό ν¬ν•¨ν•œ 더 포괄적인 ν…ŒμŠ€νŠΈ μΆ”κ°€.
  • λ³΄μ•ˆ: FCM μ„œλ²„ ν‚€ 관리와 κ΄€λ ¨λœ λ³΄μ•ˆ μΈ‘λ©΄ κ²€ν†  및 κ°•ν™”(예: Spring Cloud Config λ˜λŠ” ν™˜κ²½ λ³€μˆ˜ μ‚¬μš©).

About

fcm push request in spring (JAVA,URL Connection)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages