@@ -21,19 +21,41 @@ public class DeviceTokenServiceImpl implements DeviceTokenService {
2121 @ Transactional
2222 @ Override
2323 public Long register (String tokenId , Long memberId ) {
24- Member member = memberRepository .findMemberById (memberId ).orElseThrow (
25- () -> new GeneralException (ErrorStatus .NO_SUCH_MEMBER )
26- );
27- if (member == null ) {
28- throw new DatabaseException (ErrorStatus .NO_SUCH_MEMBER );
24+ Member member = memberRepository .findMemberById (memberId )
25+ .orElseThrow (() -> new GeneralException (ErrorStatus .NO_SUCH_MEMBER ));
26+
27+ // 1) 같은 회원 + 같은 토큰이 이미 있으면 → active = true 로만 복구
28+ // (가장 정확한 쿼리: findByMemberIdAndToken)
29+ var sameTokenOpt = deviceTokenRepository .findByMemberIdAndToken (memberId , tokenId );
30+ if (sameTokenOpt .isPresent ()) {
31+ DeviceToken exist = sameTokenOpt .get ();
32+ exist .setActive (true );
33+ deviceTokenRepository .save (exist );
34+ return exist .getId ();
35+ }
36+
37+ // 2) 같은 회원 + 다른 토큰 → 그 회원의 기존 active 토큰 전부 비활성화
38+ // (현재 보유 메서드 활용: 활성 토큰 문자열 가져와 deactivate)
39+ var activeTokens = deviceTokenRepository .findActiveTokensByMemberId (memberId );
40+ if (!activeTokens .isEmpty ()) {
41+ // 현재 등록하려는 tokenId 와 다른 것들만 비활성화
42+ var toDeactivate = activeTokens .stream ()
43+ .filter (t -> !t .equals (tokenId ))
44+ .toList ();
45+ if (!toDeactivate .isEmpty ()) {
46+ deviceTokenRepository .deactivateTokens (toDeactivate );
47+ }
2948 }
3049
31- DeviceToken dt = deviceTokenRepository .findByToken (tokenId )
32- .map (deviceToken -> { deviceToken .setActive (true ); return deviceToken ; })
33- .orElse (DeviceToken .builder ().member (member ).token (tokenId ).active (true ).build ());
34- deviceTokenRepository .save (dt );
50+ // 3) 새 토큰 insert (다른 회원이 같은 토큰을 갖고 있어도 상관 없이 insert)
51+ DeviceToken newToken = DeviceToken .builder ()
52+ .member (member )
53+ .token (tokenId )
54+ .active (true )
55+ .build ();
56+ deviceTokenRepository .save (newToken );
3557
36- return dt .getId ();
58+ return newToken .getId ();
3759 }
3860
3961 @ Transactional
0 commit comments