Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] FCM Enum Message 생성 및 테스트 API 구현 #130

Merged
merged 4 commits into from
Nov 20, 2023

Conversation

kyeong-hyeok
Copy link
Member

@kyeong-hyeok kyeong-hyeok commented Nov 20, 2023

💡 연관된 이슈

close #129

📝 작업 내용

  • Enum 타입 NotificationMessage 생성
  • FCM 테스트 API 구현

💬 리뷰 요구 사항

상황별로 알림 메시지를 보여주기 위해 NotificationMessage를 Enum 타입으로 만들었습니다!
ErrorCode와 같은 형식이라고 생각하면 이해하기 쉬울 것 같습니다!

또한 테스트 코드를 실행하는 데 있어 의존성 문제가 발견되었습니다. (실행에는 문제 없음)

User
Errors occurred while building effective model from C:\Users\m\.gradle\caches\modules-2\files-2.1\com.squareup.okio\okio\2.2.2\bed31d1a3df050fdbc028510e3d92ac4bbc9e4bb\okio-2.2.2.pom:
	'dependencies.dependency[com.squareup.okio:okio:2.2.2]' for com.squareup.okio:okio:2.2.2 is referencing itself. in com.squareup.okio:okio:2.2.2

build.gradle에 해당 의존성 관련 설정은 없었지만, 에러가 발생할 가능성을 대비해 의존성 버전을 업데이트해 해결했습니다.

그리고 저희가 현재 이동봉사자와 이동봉사 중개 테이블이 나뉘어서 FCM token도 따로 각각 테이블을 만들어서 저장해뒀는데, 컬럼에 FCM token을 넣는 것과 현재 방식 중에 어떤 방식이 더 좋을지 고민입니다!
컬럼에 저장하는 건 정규화에 맞지 않는 설계인 거 같다고 생각해 테이블을 분리했는데 고민입니다!

@kyeong-hyeok kyeong-hyeok added ✨ Feature 기능 개발 Priority: Low 우선순위 낮음 🐯 Koeyhk 담당자 labels Nov 20, 2023
@kyeong-hyeok kyeong-hyeok linked an issue Nov 20, 2023 that may be closed by this pull request
2 tasks
Copy link
Member

@hojeong2747 hojeong2747 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 의존성으로 문제 없이 빌드되면 현재 설정을 가면 될 것 같습니다!

@@ -66,6 +66,7 @@ dependencies {
// firebase
implementation 'com.google.firebase:firebase-admin:6.8.1'
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.2.2'
implementation 'com.squareup.okio:okio:2.7.0'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'com.squareup.okhttp3' 를 사용하면서 'com.squareup.okio:okio'의 특정 버전을 명시적으로 지정하지 않았을 때 발생하는 오류인 것 같습니다. okhttp 라이브러리는 내부적으로 okio 라이브러리를 사용하기 때문에, okhttp의 특정 버전이 요구하는 okio의 버전이 자동으로 끌어져 오는데 이 과정에서 문제가 발생했던 것 같아요!

의존성을 추가함으로써, okio이 명시적인 버전을 지정했고 이게 호환성 문제를 해결한 것으로 보입니다! okhttp 4.2.2와 okio 2.7.0은 서로 호환되는 버전이라고 합니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자세하게 찾아보고 리뷰 남겨 주셔서 감사합니다!
의존성을 추가하고 사용하는 데 충돌 문제도 종종 있는 거 같아요!
firebase 최신 버전에 대한 의존성을 추가하고 로직을 깔끔하게 변경하려고 했었지만, log 라이브러리와의 충돌이 나서 롤백했는데 이 부분 슬랙에 조금 더 적어두었습니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

슬랙 확인했는데 내일 좀 더 꼼꼼히 살펴보고 올테니 다시 이야기 해봐요~!
레퍼런스가 부족하다면, 직접 만드셔도 좋을 듯 합니다 😉

})
@PostMapping("/fcm-test")
public ResponseEntity<Void> testFcmToken(@Valid @RequestBody FcmTokenRequest request) {
fcmService.sendMessageTo(request.fcmToken(), APPLICATION.getTitleWithLoc("서울 강남구", "서울 도봉구"), APPLICATION.getBodyWithName("포윗유"));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우와 enum 활용 완전 유용하네요! 이렇게 해서 enum 타입과 enum 클래스에 선언한 메소드를 활용할 수 있군요👍

Copy link
Member Author

@kyeong-hyeok kyeong-hyeok Nov 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

알림 메시지를 어떻게 설정할까 고민하다가 동일한 형태라면 enum으로 관리하는 게 좋을 것 같다고 생각하고 구현했는데 다행이네요~!

}

public String getBodyWithName(String name) {
return name + body;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum 타입에 체이닝으로 메소드 호출할 수 있는 걸 활용한 좋은 예시 같아요!

Copy link
Member

@hojeong2747 hojeong2747 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FCM 토큰을 별도의 테이블에 저장하는 경우

장점

  • 사용자가 여러 기기를 사용할 경우 각 기기별로 다른 토큰을 저장할 수 있음
  • 토큰과 관련된 추가 정보(기기 유형, 등록 날짜 등)를 저장할 필요가 있을 때 쉽게 확장 가능
  • 데이터베이스 정규화 원칙에 따라 중복을 최소화하고 데이터 무결성을 유지함

단점

  • 사용자 정보와 토큰 정보 조회할 때 조인 작업 필요
  • 별도 테이블 관리

FCM 토큰을 사용자 테이블의 컬럼으로 포함하는 경우

장점

  • 사용자 정보와 토큰이 동일한 테이블에 있어 단일 조회로 모든 정보 조회 가능

단점

  • 각 사용자가 여러 기기를 사용할 경우, 토큰 관리가 복잡해질 수 있음
  • 중복 데이터가 발생할 수 있으며, 데이터 무결성 유지가 어려워질 수 있음

@hojeong2747
Copy link
Member

결론

사용자당 여러 기기를 사용하는 경우가 많다면 별도의 테이블을 유지하는 게 좋음
토큰과 관련된 추가 데이터를 관리할 필요가 있을까? (먼 미래에 있을 듯)
-> 정규화, 유연성이 중요하다면 별도 테이블을 유지하고, 간소화와 빠른 개발이 중요하면 사용자 테이블에 컬럼을 추가한다!

현재 방식대로 가는 게 공수가 많이 들지 않으면 이대로 가고, 그게 아니라면 변경하면 될 것 같습니다! 현재 방식대로 가도 될 것 같은데 어떤가요~?

@kyeong-hyeok
Copy link
Member Author

사용자가 여러 기기를 사용할 경우 별도 테이블을 유지하는 게 좋다고 생각합니다!
확장성과 정규화 부분을 생각하면 분리해도 괜찮을 것 같은데, 다른 문제가 있는지 생각해 봐야 할 것 같아요.
보통은 유저 id로 토큰을 조회하는 경우가 많아 이 부분에서 따로 join은 필요하지 않을 것 같습니다! 함께 고민해 주셔서 감사합니다~~

@hojeong2747
Copy link
Member

우리의 설계에선 조인이 필요하지 않고, 확장성, 정규화 부분까지 고려하면 지금 방식으로 가면 좋을 것 같은데! 저도 더 알아보고 오겠습니다.
많이 고민하시고 적용해 보고 추가 안건까지~! 아주 좋습니다. 고생하셨어용 🥰

@kyeong-hyeok kyeong-hyeok merged commit 2aa40f8 into develop Nov 20, 2023
1 check passed
@kyeong-hyeok kyeong-hyeok deleted the feat/129-fcm-test branch November 20, 2023 15:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ Feature 기능 개발 🐯 Koeyhk 담당자 Priority: Low 우선순위 낮음
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature] FCM Enum Message 생성 및 테스트 API 구현
2 participants