개발모음집

fcm token 중복없이 저장하기 본문

Android

fcm token 중복없이 저장하기

void 2017. 8. 8. 13:56

fcm_no not null primary key auto_increment , fcm_token, fcm_email 칼럼으로 FCM_TB 이라는 테이블을 만들었고,

fcm 알림이 오면  이메일과 토큰을 저장해주었다.


$sql = "INSERT INTO FCM_TB (fcm_token, fcm_email) VALUES('$token','$userId') ON DUPLICATE KEY UPDATE fcm_token = '$token'";


ON DUPLICATE KEY UPDATE 문은 select할 때 primarykey와 동일한 값이 없으면 데이터를 insert 하고, 있으면 update하는 구문이다.


이런식으로 구현하니 한 디바이스에서 한 아이디로 자동로그인만 한다면 에러가 나지않았다.

하지만 로그아웃을 하고 로그인 액티비티로 가면 빈 로우가 삽입되고, 같은 이메일로 로그인하면 새로운 토큰값을 할당받아 내 디비에 저장하는 일이 발생하였다. 구조파악을 해보니  ON DUPLICATE KEY UPDATE 문은 primary키로 중복을 체크하는 것이었다. 

내 primary키는 auto_inclement속성을 주어서 계속 증가하니 중복체크를 해도 중복이 될리가 없었고, 계속 insert하는 문제가 있었던 것.


그래서 FCM_TB의 fcm_no 컬럼을 삭제하고, fcm_email을 primary키로 변경하였다.


참고블로그를 참고하여

$sql = "INSERT INTO FCM_TB (fcm_token, fcm_email) VALUES('$token','$userId') ON DUPLICATE KEY UPDATE fcm_email = '". $userId . "', fcm_token = '$token'";

그리고 fcm 알림이 오면 이런 식으로 insert해주었는데

ON DUPLICATE KEY UPDATE fcm_email = '". $userId . "', fcm_token = '$token'";

fcm_email을 검색해서 이미 있으면 update를 하고, 이메일이 없다면 insert하라는 문장이다.

이렇게 하니까 중복해서 디비로우값이 추가되던가 null row가 추가되는 경우는 없어졌고,

한 디바이스에서 두 아이디를 로그인하면, 토큰값은 동록하고 디비에 fcm_email만 변경되는 것을 확인하였다.