Foundry
알림 시스템 설계
심화
핵심

수신 설정과 거부

보내지 않아야 하는 알림을 어떻게 걸러내나

요구사항에 수신 거부를 반드시 지킨다고 적었습니다. 이것은 취향 문제가 아니라 지키지 않으면 법을 위반하는 항목입니다. 그래서 다른 기능과 다르게 다룹니다.

설정은 하나가 아니다

"알림을 받겠다" 와 "받지 않겠다" 두 값으로는 부족합니다. 사용자가 원하는 것은 대개 그 중간입니다.

사용자가 원하는 것필요한 설정 축
결제 알림은 받고 마케팅은 싫다알림 종류별
푸시는 좋지만 문자는 싫다채널별
밤에는 안 받고 싶다시간대

세 축이 곱해집니다. 종류 20가지에 채널 3개면 조합이 60개입니다. 사용자에게 60개를 보여줄 수는 없으므로, 화면에서는 묶어서 보여주고 저장은 조합 단위로 합니다.

그리고 거부할 수 없는 알림이 있습니다. 비밀번호 변경 알림이나 결제 실패 알림은 사용자의 안전에 필요하므로 설정에서 빼 둡니다. 이것을 처음부터 구분해 두지 않으면, 나중에 "왜 이건 못 끄나" 라는 문의가 아니라 "중요한 걸 못 받았다" 라는 사고가 생깁니다.

확인은 보내기 직전에 한다

대량 발송에서는 목록을 만든 시점과 실제 발송 시점 사이가 멀다 100만 건 발송의 시간축 목록 생성 마지막 발송 몇 시간이 지난다 이 사이에 수신 거부한 사용자가 있다 목록을 만들 때 걸러내면 그 뒤의 거부를 놓친다 그래서 한 건을 보내기 직전에 다시 확인한다 확인이 값싸야 하므로 설정은 빠르게 읽을 수 있어야 한다

대량 발송은 대상 목록을 만든 뒤 실제 발송까지 오래 걸립니다. 100만 건을 초당 1천 건으로 보내도 20분이 넘습니다. 그 사이에 거부한 사용자가 반드시 있습니다.

목록을 만들 때 한 번 걸러내는 것으로 끝내면 그 뒤의 거부를 놓칩니다. 한 건을 제공자에게 넘기기 직전에 다시 확인해야 합니다.

이 확인이 피크 초당 1만 상황에서도 값싸야 합니다. 그래서 수신 설정은 빠르게 읽을 수 있는 형태로 따로 둡니다. 원본은 관계형 저장소에 두고, 발송 경로에서 읽는 사본을 캐시에 둡니다.

캐시가 틀리면 어느 쪽으로 틀려야 하나

사본을 두면 원본과 잠시 다를 수 있습니다. 이때 어느 방향으로 틀리는 것이 나은지 정해야 합니다.

상황결과
거부했는데 캐시가 아직 허용보내면 안 되는 것을 보낸다. 위반
허용했는데 캐시가 아직 거부받고 싶은 것을 못 받는다. 불만

둘은 무게가 다릅니다. 위반은 법적 문제이고 불만은 문의입니다. 그래서 거부는 즉시 반영하고 허용은 늦어도 됩니다. 거부 요청이 오면 캐시를 바로 지우고, 허용은 일반적인 갱신 흐름을 따릅니다.

거부 경로를 여러 개 열어야 한다

사용자가 거부하는 경로는 설정 화면만이 아닙니다.

메일의 수신 거부 링크
문자의 회신
푸시를 시스템 수준에서 끄기

앞의 둘은 우리 시스템으로 돌아옵니다. 반드시 받아서 설정에 반영해야 합니다. 세 번째는 우리가 알 수 없습니다. 제공자가 알려주는 실패 신호로 짐작할 뿐입니다.

끄기 어렵게 만드는 것은 손해입니다. 설정에서 못 끄면 사용자는 앱을 지우거나 스팸으로 신고합니다. 스팸 신고가 쌓이면 제공자가 우리 발송 전체의 도달률을 낮춥니다. 한 사용자의 거부를 막으려다 전체 도달률을 잃습니다.

면접에서 이렇게 나옵니다

Q.수신 설정을 켜기와 끄기 두 값으로 두면 어떤 문제가 생기나요

사용자가 원하는 것은 대개 중간이라서, 전부 끄는 쪽을 고르게 됩니다.

사용자가 원하는 것필요한 축
결제는 받고 마케팅은 싫다알림 종류별
푸시는 좋고 문자는 싫다채널별
밤에는 안 받고 싶다시간대

마케팅이 시끄러워서 전부 끄면 결제 실패 알림도 못 받습니다. 그러면 우리는 사용자를 잃고 사용자는 필요한 정보를 잃습니다.

세 축이 곱해집니다. 종류 20가지에 채널 3개면 조합 60개입니다. 화면에서는 묶어서 보여주고 저장은 조합 단위로 합니다.

흔한 실수: 거부할 수 없는 알림을 구분하지 않는 것. 비밀번호 변경이나 결제 실패는 설정에서 빼 두어야 합니다. 그러지 않으면 문의가 아니라 중요한 것을 못 받았다는 사고가 생깁니다.

Q.대량 발송에서 수신 거부를 언제 확인하시겠습니까

한 건을 제공자에게 넘기기 직전에 확인합니다.

100만 건을 초당 1천 건으로 보내도 20분이 넘습니다. 목록을 만든 시점과 마지막 발송 사이가 멉니다. 그 사이에 거부한 사용자가 반드시 있습니다.

목록 생성 시점에만 걸러내면 그 뒤의 거부를 놓친다

놓치면 보내면 안 되는 것을 보낸 것이고, 이것은 문의가 아니라 위반입니다.

이 확인이 피크 초당 1만 상황에서도 값싸야 하므로 수신 설정은 빠르게 읽을 수 있는 사본으로 발송 경로 옆에 둡니다.

흔한 실수: 확인을 발송 직전으로 옮기면서 원본 저장소를 그대로 읽는 것. 발송 한 건마다 관계형 저장소를 읽으면 피크에서 그 저장소가 먼저 넘어갑니다. 읽기 전용 사본이 함께 필요합니다.

Q.수신 설정 캐시가 원본과 다를 때 어느 방향으로 틀리는 것이 낫습니까

거부를 즉시 반영하고 허용을 늦추는 방향입니다. 두 오류의 무게가 다릅니다.

상황결과
거부했는데 캐시는 허용보내면 안 되는 것을 보낸다. 위반
허용했는데 캐시는 거부받고 싶은 것을 못 받는다. 문의

위반은 법적 문제이고 문의는 문의입니다. 그래서 거부 요청이 오면 캐시를 바로 지우고, 허용은 일반적인 갱신 흐름을 따릅니다.

같은 캐시인데 방향에 따라 갱신 정책이 다릅니다.

흔한 실수: 캐시 유효 기간 하나로 양쪽을 처리하는 것. 유효 기간을 위반을 막을 만큼 짧게 잡으면 원본 저장소 부하가 커지고, 부하를 줄일 만큼 길게 잡으면 위반이 생깁니다. 방향을 나누면 둘 다 해결됩니다.

Q.수신 거부를 어렵게 만들면 어떤 손해가 생기나요

한 사용자의 거부를 막으려다 전체 도달률을 잃습니다.

설정에서 못 끄면 사용자는 다른 방법을 씁니다.

앱을 지운다
스팸으로 신고한다

스팸 신고가 쌓이면 제공자가 우리 발송 전체를 의심하고 도달률을 낮춥니다. 그러면 거부하지 않은 사용자에게 가야 할 알림도 도착하지 않습니다.

거부 경로는 여러 개 열어 둡니다. 메일의 수신 거부 링크와 문자 회신은 우리 시스템으로 돌아오므로 반드시 받아서 설정에 반영합니다.

흔한 실수: 회신과 거부 링크를 형식적으로만 두고 처리하지 않는 것. 링크를 눌렀는데 계속 오면 사용자는 곧바로 스팸 신고로 갑니다. 경로를 여는 것과 처리하는 것은 별개 작업입니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

알림 시스템 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.