개발 slecs

SMS 포워딩 발신번호를 여러 개 등록할 수 있게 개선한 과정

목차

SMS 포워딩 기능을 다루다 보면 "특정 발신번호에서 온 메시지만 전달해야 한다"는 요구사항이 자주 나온다. 초기에는 발신번호 1개만 지원했는데, 실제 사용하는 사람들은 여러 개를 등록해야 하는 상황이 자주 발생했다. 은행 여러 곳, 배송업체 여러 곳, 각각 다른 번호로 오는 중요한 메시지들을 모두 한 번에 필터링하려는 거였다.

왜 지금 이 기능이 필요했는가

처음엔 내가 "개수 제한이 필요할까?"라고 생각했다. 대부분의 사용자는 1~2개 번호만 등록할 거라고 가정했으니까. 그런데 코드리뷰나 사용자 피드백을 들어보니 패턴이 보였다. 한 번호만 관심 있는 게 아니라, 실생활에서 수신해야 할 "출처"가 여럿인 거다. 하나하나 앱을 재설정하거나 여러 앱을 실행하는 건 말도 안 되고, 결국 한 번에 여러 번호를 지정할 수 있는 방식이 맞았다.

이 결정은 사용 시나리오를 먼저 이해하는 것이 얼마나 중요한지 보여준다. 팀이 작을수록 사용자의 목소리가 바로 요구사항이 되는데, 처음 설계할 때 그걸 놓치면 나중에 이렇게 기능 추가를 할 때 더 큰 비용이 든다.

입력 방식: 쉼표 구분을 선택한 이유

여러 번호를 입력받는 방식은 몇 가지 옵션이 있다.

방식 장점 단점
쉼표 구분 (01012345678, 01087654321) 간결, 텍스트 복사 용이 공백 처리 필요
줄바꿈 구분 각 번호가 명확함 텍스트 에디터 필요, 모바일에선 번거로움
플러스 버튼으로 항목 추가 UI로 명확함 구현 복잡, 모바일에선 여전히 번거로움
정규식 패턴 강력함 사용자 진입장벽 높음

쉼표 구분을 선택한 건 모바일 앱의 UX 제약KISS 원칙 때문이다. 사용자가 설정 화면에서 한 번에 입력할 수 있고, 저장할 때도 문자열 하나로 저장하면 된다. 나중에 파싱할 때 split(",")과 trim() 정도면 충분하다.

// SmsReceiver에서의 매칭 로직 개요
String[] allowedNumbers = savedNumbers.split(",");
for (String num : allowedNumbers) {
    if (incomingSms.getOriginatingAddress()
            .equals(num.trim())) {
        // 매칭됨, 포워드
    }
}

물론 쉼표 양옆의 공백 처리는 필수다. 사용자는 "01012345678, 01087654321" 같이 띄어쓸 가능성이 높으니까.

구현: 설정과 필터 로직의 분리

MainActivity.kt에서는 사용자가 번호를 입력받고 저장하는 부분이, SmsReceiver.kt에서는 실제 SMS가 들어올 때 그 번호와 매칭하는 부분이 담당한다.

이렇게 설정 로직과 필터 로직을 분리하는 건 중요하다:

  • MainActivity: 입력 검증, 포맷팅 (앞뒤 공백 제거, 빈 항목 제거)
  • SmsReceiver: 저장된 설정을 읽고 들어온 메시지의 발신번호와 매칭만 수행

만약 SmsReceiver에서 매번 문자열을 파싱하고 정규화한다면, SMS가 들어올 때마다 불필요한 처리를 반복하게 된다. 특히 모바일 앱에선 배터리와 응답성이 중요하니까, 핫패스(hot path)는 최대한 가볍게 유지해야 한다.

배운 점과 앞으로의 주의점

이 작업을 하면서 몇 가지 깨달은 게 있다:

  1. 초기 설계의 "충분함"은 착각이다: "1개 번호면 되겠지"라는 추정이 틀렸고, 결국 한 번의 추가 작업으로 이어졌다. 처음부터 "여러 개"를 염두에 두고 데이터 구조를 설계했다면 더 쉬웠을 것.

  2. 입력 포맷은 사용자 관점에서 선택한다: 개발자 입장에선 정규식이나 JSON이 낫겠지만, 모바일 폼에서 일반 사용자가 빠르게 입력할 방식은 쉼표다.

  3. 유효성 검사는 입력 시점에: 사용자가 저장할 때 공백을 제거하고 빈 항목을 필터링해두면, 필터 로직은 그냥 비교만 하면 된다.

  4. 비슷한 기능 확장을 고려한다: 나중에 "이 번호는 제외", "정규식 지원", "번호 그룹" 같은 요청이 들어올 수 있다. 지금 데이터 구조가 그런 확장을 막지 않는지 확인하는 게 좋다.

이 정도면 사용자들이 필요한 유연성을 가지면서도 코드는 간결하게 유지할 수 있을 것 같다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.