Post

FCM

FCM

개발자가 안드로이드 ,IOS 및 웹 애플리케이션과 같은 모바일 및 웹 플랫폼으로 메시지를 안정적으로 전송하고 수신할 수 있도록 지원하는 구글의 클라우드 기반 메시징 솔류션 입니다.

FCM 아키텍처

FCM-diagram-png

사용 방법(Spring기준)

build.gradle

1
implementation 'com.google.firebase:firebase-admin:9.2.0'

firebase를 사용하기 위해서는 build.gralde에 코드를 추가 해줘야 합니다.

Firebase 연동 준비

먼저 Firebase에 프로젝트를 생성합니다. 새 프로젝트를 만들어줍니다.

그런다음 firebase-new-project-setting-png 자신이 만들고자 하는거에 맞게 선택합니다.

ios, android, web

  1. 앱등록
    • 패키지 이름은 자유입니다.
      • com.상위.하위
  2. 구성 파일 다운로드 후 추가

firebase-new-project-setting-2-png

  • 지금 바로 다운로드 하지 않아도 추후에 다운로드가 가능합니다.
  • 이 부분은 안드로이드 쪽에 설정해주면 됩니다.
    1. Firebase SDK 추가

firebase-new-project-setting-3-1-png

firebase-new-project-setting-3-2-png

  • SDK또한 지금 설정하지 않아도 추후에 설정이 가능합니다.
  • 이 부분 또한 안드로이드 쪽에 설정해주면 됩니다.
    1. 다음 단계

firebase-new-project-setting-4-png

  • 이제 이러면 프로젝트 셋팅은 끝났습니다.

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);
    }
}
  1. ClassPathResource를 사용하여 클래스패스에 위치한 “firebase/serviceAccountKey.json” 파일에서 Firebase의 서비스 계정 키를 로드합니다.
  2. InputStream을 사용하여 키 파일의 내용을 읽어들입니다.
  3. FirebaseApp.getApps()를 사용하여 Firebase에 등록된 기기 목록을 가져옵니다.
  4. Firebase 애플리케이션을 초기화하기 위해 검증을 수행 합니다.
    • 이미 초기화된 애플리케이션이 있는지 확인하고, 있다면 해당 애플리케이션을 사용합니다.
    • 초기화된 애플리케이션이 없다면, 새로운 FirebaseOptions를 구성하고, 이를 사용하여 새로운 FirebaseApp을 초기화합니다.
  5. 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는 알림이 올 경우, 벨소리를 커스텀해주는 메서드 입니다.

이처럼 이외에도 다양한 기능이 있습니다.

이를 활용하여 알람기능을 커스텀하여 만들수 있습니다.

This post is licensed under CC BY 4.0 by the author.