[설계] 알림 서비스 확장과 일괄 처리

도현김·2023년 7월 28일
post-thumbnail

1. 알림 서비스의 확장

우리는 초기 요구사항 정의시 식재료가 임박했을 때 사용자가 해당 식재료를 소진할 수 있게 알림을 보내는 서비스를 제공하고자 했다. 그러나 구현 기능이 늘어나면서 알림 서비스 또한 확장해야할 필요가 생겼다.

기존에 생각했던 서비스는 그저 사용자에게 메시지를 보내는 것이었고 전송된 알림을 클릭했을 때 아무런 이벤트가 발생하지 않았다. 하지만 현재 출시되어 있는 여러 서비스를 보면 알림을 클릭했을 때 해당 기능으로 바로 이동하는 서비스를 제공한다. 그렇기 때문에 우리도 그러한 서비스를 구현하고자 한다.

알림서비스확장

위의 그림을 보면 아래 처럼 동작하는 것을 확인 할 수 있다.

  • 공지사항 알림 : 종 버튼 클릭 → 공지사항 알림 클릭 → 공지사항 상세 페이지
  • 댓글 좋아요 알림 : 종 버튼 → 좋아요 알림 클릭 → 해당 댓글이 있는 레시피 댓글 목록
  • 식재료 등록 알림 : 종 버튼 → 식재료 등록 알림 클릭 → 식재료로 세팅되어 있는 식재료 추가 페이지
  • 소비기한 임박 알림 : 종 버튼 → 소비기한 임박 알림 클릭 → 회원의 소비기한이 지난 식재료 목록 페이지

정리하자면 기존에 식재료 임박 알림 메시지만 제공하던 알림 서비스를 공지사항, 소비기한 임박 알림, 식재료 등록 알림, 댓글 좋아요 알림으로 확장하며 알림을 클릭했을 때 해당 기능으로 바로 갈 수 있는 서비스를 제공한다.

2. 알림 도메인 수정

알림 서비스를 확장함에 따라 알림 도메인도 수정한다. 수정 전과 후의 컬럼들은 아래와 같다.

  • 수정 전 : 알림 식별자, 메시지, 알림 발송시간, 회원 식별자
  • 수정 후 : 알림 식별자, 알림 아이콘, 메시지, 알림 유형, 알림 발송시간, 이동될 페이지 경로, 읽음 유무, 회원 식별자

도메인 수정의 핵심은 이동하게 될 페이지 경로를 추가하는 것이다. 페이지 경로를 URL로 저장함으로써 사용자에게 전송된 알림이 클릭되었을 때 그에 따른 페이지로 바로 이동할 수 있도록 서비스를 제공한다.

그리고 알림 메시지의 종류별로 구분할 수 있도록 알림 아이콘, 알림 유형이 추가되었고 알림을 읽음 여부도 확인하기 위해 알림 읽음 유무도 추가하였다.

3. 서버 분리

그리고 우리는 서버를 메인 서버인 API 서버와 또 다른 서버인 배치 서버를 분리하여 운용하도록 결정했다. 그 이유는 서버 사용량이나 트래픽이 두 서버에서 다른 시간대에 발생되기 때문이다. API 서버는 트래픽이 상시적으로 발생하지만 배치 서버는 자정이나 특정 시간에 일괄적으로 전체 데이터를 스캔하여 작업을 수행하기 때문이다. 따라서 특정 시간에 서버의 사용량이 확 오를 수가 있다. 그렇기 때문에 서버를 두개로 분리하여 운용하는 것으로 결정했다.

  • API 서버 :
    • 레시피, 식재료, 회원 등, 도메인에 접근하는 사용자의 요청 처리
    • 로그인, 로그아웃, 토큰 관리와 같은 보안
  • 배치 서버 :
    • 모든 사용자에게 일괄적으로 알림을 전송하거나 오래된 알림을 삭제
    • 데이터베이스에 삭제 처리된 데이터 완전 삭제 (북마크, 식재료, 댓글)

서버는 분리하지만 데이터의 무결성을 유지해야 하기 때문에 DB는 하나로 운용되어야 한다.

4. 알림 기능

  1. 메인 페이지나 알림 아이콘 표시되어 있는 페이지에서 알림 아이콘의 상태를 조회할 수 있다.
  2. 아래의 알림 조회알림 생성/전송을 통해서 알림 아이콘의 상태가 변경된다.

4.1 알림 조회 (알림 아이콘 비활성화)

  1. 알림 아이콘을 클릭하여 알림을 조회하면 알림 아이콘의 빨간 점이 사라지고 비활성화 된다.
  2. 알림 목록의 하나의 요소에는 아이콘, 알림 유형, 알림 메시지, 알림 생성 시간 등이 표시된다.
  3. 알림 메시지는 최신순으로 정렬되어 표시되며 그것과 관계없이 가장 우선적으로 조회되는 메시지는 유통기한 임박 알림 (1일 전/3일 전) 이다.
  4. 한번에 조회되는 알림 메시지의 수는 10개이며 스크롤을 내리면 10개씩 추가적으로 조회된다.
  5. 특정 알림을 최초 클릭하기 전에는 안 읽음 표시로 해당 알림의 배경이 회색으로 보인다.
  6. 특정 알림을 최초로 클릭하면 읽음 표시로 해당 알림의 배경이 흰색으로 변한다.
  7. 특정 알림을 클릭하면 알림의 유형에 따라 특정 페이지로 이동하여 각각의 기능을 편리하게 사용할 수 있다.

4.2 알림 생성/전송 (알림 아이콘 활성화)

  1. 아래의 모든 종류의 알림이 생성되어 사용자에게 전송되면 알림 아이콘이 활성화 된다.
  2. 식재료 유통기한 임박시 사용자에게 알림 전송
    1. 매일 자정, 사용자마다 냉장고 정보를 종합하여 유통기한이 임박한 식재료에 관한 알림 메시지를 전송한다.
    2. 알림은 총 2개이며 1일 남은 식재료에 관한 알림과 3일 남은 식재료에 관한 알림 2개를 전송한다.
    3. 해당 알림 메시지를 클릭하면 임박한 식재료에 관한 식재료 목록(1일 전 or 3일 전)이 조회된다.
      1. 식재료가 1개라면 “~~의 유통기한이 1일 남았습니다” 라는 메시지를 보낸다
      2. 식재료가 n개라면 “~~ 외 n-1개의 유통기한이 1일 남았습니다” 라는 메시지를 보낸다.
  3. 댓글 좋아요 발생시 작성자에게 알림 전송
    1. 특정 사용자가 내가 남긴 레시피 댓글에 ♥️버튼을 누르면 나에게 알림 메시지가 전송된다.
    2. 해당 알림 메시지를 클릭하면 해당 레시피의 댓글 전체 목록으로 이동한다.
    3. 알림 메시지는 “~님이 ~의 댓글을 좋아합니다.” 이며 “~~~”는 닉네임으로 표시된다.
  4. 특정 식재료를 DB에 등록하도록 요청한 사용자에게 식재료 등록 가능 알림 전송
    1. 사용자 요청 식재료를 DB에 일괄 등록하는 작업은 매월 1일, 15일에 진행된다.
    2. 사용자가 특정 식재료를 DB에 등록하도록 요청했을 때는 식재료명과 단위를 함께 입력하여 요청하였다.
    3. 그러므로 사용자가 제안했던 식재료의 가장 많은 단위를 채택하여 DB에 등록한다.
    4. 그 후 특정 식재료를 DB에 등록하도록 요청한 사용자들에게 특정 식재료를 등록할 수 있다는 알림을 전송한다.
      1. 알림 메시지는 "회원님이 요청했던 " ~~~를 이제 냉장고에 담을 수 있습니다. (식재료 추가하기)”이다.
      2. 해당 알림 메시지를 클릭하면 해당 식재료를 추가하는 페이지로 이동한다.
    5. 그 후 현재까지 쌓여있던 요청된 식재료들의 목록을 DB에서 일괄 삭제한다.

5.데이터 삭제 기능

5.1 알림 삭제

  1. 매일 자정, 모든 사용자를 대상으로 알림을 삭제한다.
    1. 유통기한 임박 알림을 전송하기 전에 알림 삭제를 진행한다.
    2. 유통기한 임박 알림은 매일 자정마다 보내기 때문에 전날에 보냈던 내용을 매일 삭제한다.
    3. 그 외의 알림은 현재 날짜를 기준으로 14일 이전에 전송되었던 모든 알림을 삭제한다.

5.2 삭제 처리된 데이터 완전 삭제

  1. 매월 1일, 15일 마다 댓글 삭제나 식재료 삭제 그리고 북마크 취소 등으로 인해 삭제 처리된 데이터를 일괄적으로 완전히 데이터베이스에서 삭제한다.
  2. 댓글 → 식재료 → 북마크 순으로 제거
profile
안녕하세요! 신입 개발자 김도현입니다.

0개의 댓글