웹브라우저에 알림을 어떤 방식으로 구현하는 것이 좋을까?
후보는 SSE, WebSocket, FCM이었다.
처음에는 SSE를 통해 구현할 계획을 세웠다.
설정이 간편하고 단방향 통신방식을 이용하고 싶었기 때문이다.
하지만, 사용자가 접속중이지 않을 경우 알림을 대기시켜뒀다가 보내야 하는 점과 잘 사용되지 않는다는 점으로 인해 계획을 변경하기로 결정하였다.
WebSocket 역시 연결을 유지하며 사용해야 하기에 최종적으로 FCM을 사용하기로 결정하였다.
FCM은 사용자가 웹 페이지를 이용하지 않을 때에도 푸시기반 알림을 보낼 수 있으며 다양한 플랫폼에서 사용 가능하기 때문에 좋은 선택지가 된 것 같다.
FCM 기반의 알림기능을 구현하는데 시간이 소비된 부분은 최신버전의 의존성을 주입받지 않은 것이었다.
이로 인해 버전이 올라가며 사라진 message.getToken 메서드를 사용하여 토큰을 받아오지 못하였다.
공식문서를 참고하여 getToken 메서드로 변경이 되었음을 찾아 해결하였다.
firebase의 설정을 초기화하는 initializeFirebaseApp 메서드는 빈으로 등록할 필요가 없었다.
이처럼 initializeFirebaseApp()' is never used와 같은 경고메시지가 나타나는 경우에도 문제가 없을 수 있으니 자동완성기능을 무분별하게 사용하면 안된다.
엑세스키와 시크릿키 등 코드에 직접 포함하면 안되는 민감한 정보는 환경변수로 주입받는 등의 방법으로 사용해야 한다.
검색기능 구현 방식 후보
도입 이유
유저가 원하는 내용의 게시글을 골라서 볼 수 있는 편의성을 제공하기 위함
문제 상황
검색기능을 구현하는 방법 중 현재 게시판 상황에 맞는 효율적인 방법이 필요
해결 방안
1안) Query Method
간단하고 직관적이며 가독성이 좋다.
복합한 쿼리의 표현, 동적인 검색 조건을 다루기 어렵다.
2안) JPQL
객체간 관계를 고려한 검색과 일부 쿼리 튜닝이 가능하다.
쿼리가 문자열로 작성되어 컴파일 타임에 오류를 잡기 어렵다.
복잡한 쿼리 사용시 가독성이 낮아진다.
3안) Specification과 Criteria
동적인 검색조건을 쉽게 다루고 복잡한 검색 기능을 구현할 수 있다.
복잡한 쿼리 조합에 대한 코드가 비교적 복잡할 수 있으며 일부 코드 중복이 발생할 수 있다.
의견 조율
게시판에서의 검색은 복잡한 검색조건을 가지고 있지 않다.
작성일, 조회수 등의 정렬방법이 필요할 수 있다.
제목, 작성자, 날짜 범위 등 복잡한 검색조건이 필요할 수 있다.
의사 결정
모집글 게시판의 특성상 모집 완료 된 글의 중요성은 떨어지기 때문에 조회수나
날짜, 기간과 관련된 정렬이나 검색조건의 중요성 또한 떨어진다.
※ 따라서 간단한 검색기능을 구현하기 위해 QueryMethod 방식을 채택하도록 한다.
Pageable 페이징을 처리하기 위한 인터페이스
Page<> 페이징 된 데이터를 담을 수 있는 자료구조
return searchResultPage.map(PostResponseDto::new);
map 말고 다른 방법은 없는가?
if' statement can be replaced with 'switch' statement