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