앱 서비스를 만들다보면 점점 필수가 되어가는 알림 기능 ..
FCM 연결해봅시다
구상 중인 FCM 알림 전송 로직은 다음과 같습니다.
알림 소실을 최소화하기 위해 RabbitMQ를 도입하고, 이벤트 발행 로직도 eventListener을 이용해 비동기로 처리할 계획입니다.
FCM 연결을 위한 Firebase 설정을 해봅시다.


implementation("com.google.firebase:firebase-admin:9.2.0")
resource/에 다운로드한 비공개 키 위치application.yml에 키 이름 명시fcm:
credentials:
path: classpath:${FIREBASE_KEY}
@Configuration
class FirebaseConfig(
@Value("\${fcm.credentials.path}") private val accountKey: Resource
) {
@PostConstruct
fun initialize() {
try {
val serviceAccount = accountKey.inputStream
val options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.build()
if (FirebaseApp.getApps().isEmpty()) {
FirebaseApp.initializeApp(options)
}
} catch (e: Exception) {
e.printStackTrace()
throw GeneralException(ErrorStatus.INITIAL_FIREBASE_INTERNAL_SERVER_ERROR)
}
}
}
앞서 계속해서 언급한 FCM Token이란, 사용자의 기기를 구분하기 위한 토큰입니다. 알림을 어떤 기기로 발송할지 구분하기 위해 필요한 정보죠.
이 FCM Token을 어떻게 관리해야 할까요
우선 User Entity에 FCM Token을 저장할 필드를 생성했습니다.
서비스의 확장성을 고려한다면 Token 테이블을 생성해서 1:N으로 관계를 맺을 수도 있으나, 품이 작은 관계로, 1:1 관계로 간주하고 user에 필드를 생성하는 방향으로 구현했습니다.
@Column
var fcmToken: String? = fcmToken
토큰 등록의 경우, 회원가입 시, 클라이언트로부터 FCM Token을 전달받아 entity에 함께 저장할 수 있겠습니다.
또한 로그아웃 및 회원탈퇴 시 해당 기기에 알림이 전송되면 안되므로, FCM Token을 삭제해야겠지요.
이번 포스팅에서는 우선적으로 FCM 연결을 위한 기본 세팅을 진행했습니다.
다음 포스팅부터는 FCM 전송로직, RabbitMQ 연결 등의 내용을 다루어보겠습니다.