Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ jobs:
envs: >-
DB_PASSWORD,GCS_BUCKET,GCS_BACKUP_BUCKET,
KAKAO_CLIENT_ID,KAKAO_CLIENT_SECRET,KAKAO_REDIRECT_URI_PROD,KAKAO_REDIRECT_URI_STAGING,KAKAO_ADMIN_KEY,
JWT_SECRET_KEY,FIREBASE_SERVICE_ACCOUNT_KEY
JWT_SECRET_KEY,FIREBASE_SERVICE_ACCOUNT_KEY,FCM_FAKE_LATENCY_MS
script: |
chmod +x /home/ubuntu/cockple/scripts/deploy.sh
bash /home/ubuntu/cockple/scripts/deploy.sh \
Expand All @@ -89,3 +89,5 @@ jobs:
KAKAO_ADMIN_KEY: ${{ secrets.KAKAO_ADMIN_KEY }}
JWT_SECRET_KEY: ${{ secrets.JWT_SECRET_KEY }}
FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}
# [부하테스트용] FCM 지연(ms) 토글. GitHub Variable로 관리(미설정 시 빈값→deploy.sh에서 0). PR 없이 값 변경+deploy 재실행으로 on/off.
FCM_FAKE_LATENCY_MS: ${{ vars.FCM_FAKE_LATENCY_MS }}
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ services:
environment:
JAVA_TOOL_OPTIONS: "-Xms128m -Xmx512m"
SPRING_PROFILES_ACTIVE: staging
# [부하테스트용] FCM 인위적 지연(ms). 미설정 시 0=비활성. staging 전용.
FCM_FAKE_LATENCY_MS: ${FCM_FAKE_LATENCY_MS:-0}
DB_PASSWORD: ${DB_PASSWORD}
GCS_BUCKET: ${GCS_BUCKET}
KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
Expand Down
1 change: 1 addition & 0 deletions scripts/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ KAKAO_REDIRECT_URI_STAGING=${KAKAO_REDIRECT_URI_STAGING}
KAKAO_ADMIN_KEY=${KAKAO_ADMIN_KEY}
JWT_SECRET_KEY=${JWT_SECRET_KEY}
FIREBASE_SERVICE_ACCOUNT_KEY=${FIREBASE_SERVICE_ACCOUNT_KEY}
FCM_FAKE_LATENCY_MS=${FCM_FAKE_LATENCY_MS:-0}
EOF

echo "${FIREBASE_SERVICE_ACCOUNT_KEY}" > /home/ubuntu/cockple/firebase-service-account.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.google.firebase.messaging.WebpushFcmOptions;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import umc.cockple.demo.domain.chat.enums.ChatRoomType;
Expand All @@ -24,6 +25,9 @@ public class FcmService {
private final MemberRepository memberRepository;
private final FirebaseMessaging firebaseMessaging;

@Value("${fcm.fake-latency-ms:0}")
private long fakeLatencyMs;

@Transactional
public void registerFcmToken(Long memberId, String fcmToken) {
Member member = memberRepository.findById(memberId)
Expand All @@ -33,6 +37,10 @@ public void registerFcmToken(Long memberId, String fcmToken) {
}

public void sendNotification(Member member, String title, String content) {
if (applyFakeLatencyAndSkip(member.getId())) {
return;
}

String fcmToken = member.getFcmToken();
if (fcmToken == null || fcmToken.isBlank()) {
log.info("FCM 토큰 없음 - memberId: {}, 알림 전송 생략", member.getId());
Expand All @@ -58,6 +66,10 @@ public void sendNotification(Member member, String title, String content) {

public void sendChatNotification(Member member, String title, String content,
Long chatRoomId, ChatRoomType chatRoomType) {
if (applyFakeLatencyAndSkip(member.getId())) {
return;
}

String fcmToken = member.getFcmToken();
if (fcmToken == null || fcmToken.isBlank()) {
log.info("FCM 토큰 없음 - memberId: {}, 채팅 알림 전송 생략", member.getId());
Expand Down Expand Up @@ -86,6 +98,22 @@ public void sendChatNotification(Member member, String title, String content,
}
}

/**
* 부하테스트용 FCM 지연 주입.
*/
private boolean applyFakeLatencyAndSkip(Long memberId) {
if (fakeLatencyMs <= 0) {
return false;
}
try {
Thread.sleep(fakeLatencyMs);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
log.info("[FCM][FAKE] 지연주입 {}ms 후 실전송 스킵 - memberId: {}", fakeLatencyMs, memberId);
return true;
}

/**
* 채팅 알림 클릭 시 이동할 경로(상대경로)를 생성한다.
* webpush.fcm_options.link 로 전달되어 FCM이 클릭 시 네이티브로 이동시킨다.
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ jwt:
access-token-validity: 900000
refresh-token-validity: 1209600000

fcm:
fake-latency-ms: 0

logging:
level:
org.hibernate.SQL: WARN
Expand Down
Loading