본문 바로가기

Spring

(39)
FCM 알람 전송 재시도 구현하기 Docconneting프로젝트에서 알람 전송기능을 모두 구현했다하지만 알람을 전송하고 실패하는 경우가 분명히 발생하고, 이 경우에 사용자가 알람을 받지 못한다면 이건 꽤나 큰 문제라는 생각이 들었다그래서 이를 해결하기 위해서 알람 재시도를 구현해야겠다고 마음을 먹었다!문제 상황@Async("fcmExecutor") public void sendMulticastAlarm(List fcmTokenBatche, String content) { try { MulticastMessage message = MulticastMessage.builder() .setNotification(Notification.builder() ..
컨트롤러 테스트에 인증/인가가 들어있는 경우 @SpringBootTest를하면 모든것이 다 빈으로 등록이 되니까 자연스럽게 테스트가 됨@WebMvcTest 사용하면 컨트롤러만 빈으로 등록이되서 ArgumentResolver랑 JwtFilter 를 수동으로 등록을 해줘야 작동을 한다!JpaMetamodelMappingContext : Spring Data JPA의 자동 설정 중 하나인 JpaMetamodelMappingContext가 없어 생기는 빈 등록 예외를 방지하기 위해서 주입또한 컨트롤러는 Argument Resolver랑 Converter 같은걸 거치니까 새로운 객체가 생겨서 eq로 내용이 동일한지 확인해줘야함 기존에 @WebMvcTest를 사용했는데 수동으로 등록하지않았다면 AuthUser에 필드가 다 null이었음 ⇒ any()를 써버리..
FCM의 구조와 이를 구현하기 위한 고민(Feat : FCM토큰관리와 전송 메서드) FCM 구조무료로 메시지를 보낼 수 있는 교차 플랫폼 메시징 클라우드 서버 장점Firebase 플랫폼과 통합되어 있어 설정과 사용이 간편Firebase 콘솔에서 설정을 쉽게 관리할 수 있음안드로이드, iOS, 웹을 포함한 여러 플랫폼에서 사용 가능Google의 인프라를 기반으로 하여, 대량의 메시지를 안정적으로 처리할 수 있음FCM은 무료로 제공되며, 추가 비용 없이 사용할 수 있음주제 기반 메시징, 메시지 우선순위 설정, 다양한 메시지 타입 지원(알림 메시지, 데이터 메시지) 등 다양한 기능을 제공단점메시지 전송 및 전달 상태에 대한 세부적인 제어가 제한적 ex) 재시도 로직에 대한 상세한 제어가 어려움FCM은 Google 서비스에 의존적이므로, Google 서비스가 제한된 지역에서는 사용이 어려울 수..
알람 전송 구현 기술의 고민 이번에 우리 팀에서 기획한 프로젝트는 docconneting이라는 의사와의 채팅과 유료 질문이 가능한 프로젝트였다 알람 전송 시나리오채팅 결제가 성공하면 해당 의사에게 알람이 간다등록이 성공하면 해당 카테고리 의사에게 알람이 간다등록이 성공하면 해당 카테고리 의사에게 알람이 간다알람 조회시나리오는 이런식이다!여기서 나는 알람 전송 기능을 담당하게 되어서 알람을 구현하기 위해서 어떤기술을 사용해야 할지 고민을 해보게 됐다 알림 구현 기술들폴링 어떤 값을 확인하거나 갱신하는 과정정기적 폴링(Regular Polling) : 일정한 간격 또는 주기적으로 데이터를 확인하거나 갱신이벤트 기반 폴링(Event-based Polling) : 특정 이벤트가 발생했을 때만 데이터를 확인하거나 갱신 1) 짧은 폴링(Sho..
동적쿼리와 인덱싱 적용하여 성능 개선하기 (+ Like 검색은?) 구현할 기능이번에 구현할 기능은 의사 다건 조회였다.이때 검색 조건은 총 3가지였다.1. 아무 조건없이 그냥 페이징만 적용하여 조회하기2. 의사 전공별로 검색하기3. 의사 이름으로 검색하기3. 의사 이름 + 전공으로 검색하기 인덱스  고려 사항WHERE 에서 OR을 사용할 때는 or 연산자는 비교해야할 ROW가 더 늘어나기 때문에 풀 테이블 스캔이 발생할 확률이 높기에 걸어도 의미가 없을 수 있음복합 인덱스는 카디널리티(중복도)가 높은순에서 낮은순으로 할 것복합 인덱스에 사용되는 컬럼은 가급적 UPDATE가 안되는 값을 선정해야 함 -> 업데이트 되는 순간 인덱스를 무수히 다시 업데이트 하기 때문인덱스는 가급적 테이블 당 3-5개를 넘지 않도록 하는 것이 좋음 첫 번째 고민 : 조건이 3가지나 있기 때문..
컨트롤러 테스트 작성시 주의할 점 기능 구현을 완료한 다음 컨트롤러 부분 테스트 코드를 짜는 중이었다...컨트롤러 부분만 테스트 코드를 짜면 되니까 이제 금방 끝날 줄 알고 행복한 마음으로 룰루랄라 짜고 있던 도중 생각지도 못한 난관에 부딪히게 됐다@WebMvcTest(DoctorController.class)class DoctorControllerTest { @Autowired private MockMvc mockMvc; @MockitoBean private DoctorService doctorService; @Test public void 의사_단건_조회() throws Exception { // given long userId = 1L; String usernam..
QClass 구현 안 될때 해결법 의존성 다시 한 번 확인// QueryDSLimplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api" 터미널에 입력./gradlew clean compileJava그러면 아래 경로에 잘 생긴다!
QueryDSL을 이용하여 동적 쿼리 구현하기 1. 의존성 추가implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api"의존성이 제대로 추가되었다면 Q 클래스가 생성됨 2. QuerydslConfig 파일 생성@Configurationpublic class QuerydslCo..