이 프로젝트는 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
인터페이스의 구현을 제공해야 합니다.
-
application.properties
구성:fcm.server.key
설정.PushSendService
구현에 필요한 경우 데이터베이스 연결 속성 설정(이 기본 프로젝트에서는 다루지 않음).
-
프로젝트 빌드:
mvn clean package
-
애플리케이션 실행:
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로 대체하는 것이 권장됩니다.
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 또는 환경 변수 사용).