FCM
FCM
개발자가 안드로이드 ,IOS 및 웹 애플리케이션과 같은 모바일 및 웹 플랫폼으로 메시지를 안정적으로 전송하고 수신할 수 있도록 지원하는 구글의 클라우드 기반 메시징 솔류션 입니다.
FCM 아키텍처
사용 방법(Spring기준)
build.gradle
1
implementation 'com.google.firebase:firebase-admin:9.2.0'
firebase를 사용하기 위해서는 build.gralde에 코드를 추가 해줘야 합니다.
Firebase 연동 준비
먼저 Firebase에 프로젝트를 생성합니다. 새 프로젝트를 만들어줍니다.
ios, android, web
- 앱등록
- 패키지 이름은 자유입니다.
- com.상위.하위
- 패키지 이름은 자유입니다.
- 구성 파일 다운로드 후 추가
- 지금 바로 다운로드 하지 않아도 추후에 다운로드가 가능합니다.
- 이 부분은 안드로이드 쪽에 설정해주면 됩니다.
- Firebase SDK 추가
- SDK또한 지금 설정하지 않아도 추후에 설정이 가능합니다.
- 이 부분 또한 안드로이드 쪽에 설정해주면 됩니다.
- 다음 단계
- 이제 이러면 프로젝트 셋팅은 끝났습니다.
BackEnd(Spring) 설정
FCMConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Configuration
public class FCMConfig {
@Bean
FirebaseMessaging firebaseMessaging() throws IOException {
ClassPathResource resource = new ClassPathResource("firebase/serviceAccountKey.json");
InputStream refreshToken = resource.getInputStream();
FirebaseApp firebaseApp = null;
List<FirebaseApp> firebaseAppList = FirebaseApp.getApps();
if (firebaseAppList != null && !firebaseAppList.isEmpty()) {
for (FirebaseApp app : firebaseAppList) {
if (app.getName().equals(FirebaseApp.DEFAULT_APP_NAME)) {
firebaseApp = app;
}
}
} else {
FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.fromStream(refreshToken))
.build();
firebaseApp = FirebaseApp.initializeApp(options);
}
return FirebaseMessaging.getInstance(firebaseApp);
}
}
ClassPathResource
를 사용하여 클래스패스에 위치한 “firebase/serviceAccountKey.json” 파일에서 Firebase의 서비스 계정 키를 로드합니다.InputStream
을 사용하여 키 파일의 내용을 읽어들입니다.FirebaseApp.getApps()
를 사용하여 Firebase에 등록된 기기 목록을 가져옵니다.- Firebase 애플리케이션을 초기화하기 위해 검증을 수행 합니다.
- 이미 초기화된 애플리케이션이 있는지 확인하고, 있다면 해당 애플리케이션을 사용합니다.
- 초기화된 애플리케이션이 없다면, 새로운
FirebaseOptions
를 구성하고, 이를 사용하여 새로운FirebaseApp
을 초기화합니다.
FirebaseMessaging.getInstance(firebaseApp)
을 호출하여FirebaseMessaging
객체를 생성하고 빈으로 등록합니다.
이렇게 FCM의 설정파일이 끝나면 Spring에서 @Configuration어노테이션이 되어있기 때문에 이 클래스를 설정 클래스로 인식합니다.
해당 클래스 내에 @Bean어노테이션이 달리 메소드들은 빈을 정의하게 됩니다.
이로 인해 firebaseMessaging메소드는 FirebaseMessaging객체를 생성하고 설정합니다.
이 빈은 Spring 컨텍스트에 등록되며, 다른 컴포넌트에서 주입하여 사용할 수 있습니다.
MessageService.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Service
@RequiredArgsConstructor
public class MessageService{
public void send_message(String topic, String title, String body) throws FirebaseMessagingException {
Message message = Message.builder()
.setTopic(topic)
.setNotification(Notification.builder()
.setTitle(title)
.setBody(body)
.build())
.setAndroidConfig(AndroidConfig.builder()
.setNotification(AndroidNotification.builder()
.setChannelId("high_importance_channel")
.build())
.build()
)
.build();
String send = FirebaseMessaging.getInstance().send(message);
}
...... //다른 메서드 구현시 사용
}
MessageController.class
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@AllArgsConstructor
@RequestMapping("/message")
public class MessageController {
private final MessageService messageService;
@PostMapping("/send")
public void send_message(@RequestBody MessageDto messageDto) throws FirebaseMessagingException {
messageService.send_message(messageDto.getTopic(), messageDto.getTitle(), messageDto.getBody());
}
.....//다른 Controller구현시 사용
}
Controller와 Service 클래스 구현시, 알림 기능을 보낼 수 있습니다.
위의 예제는 토픽을 기준으로 작성한 코드입니다.
.setTopic(topic)
- 넘겨 받은 토믹을 셋팅하는 메서드 입니다.
.setNotification(Notification.builder() .setTitle(title) .setBody(body)
1
.build())
- setTitle은 제목을 정해주는 메서드입니다.
- setBody는 실질적인 내용이 들어가는 메서드입니다.
.setAndroidConfig(AndroidConfig.builder() .setNotification(AndroidNotification.builder() .setChannelId(“high_importance_channel”) .build()) )
- setChanneld는 알림이 올 경우, 벨소리를 커스텀해주는 메서드 입니다.
이처럼 이외에도 다양한 기능이 있습니다.
이를 활용하여 알람기능을 커스텀하여 만들수 있습니다.