Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added public/posts/storyboardHelper/thumbnail.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/posts/project/spam_killer/thumbnail.png
Binary file not shown.
138 changes: 138 additions & 0 deletions src/posts/project/spam_killer_1/content.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
---
title: "[draft]스팸 문자/전화좀 그만해라 (1)"
date: 2024-11-22
desc: 지긋지긋한 스팸들...
thumbnail: /posts/spam_killer/thumbnail.jpg
---

![스팸 문자/전화좀 그만해라](/posts/spam_killer/thumbnail.jpg)

## 개인적인 잡담

요즘들어 갑지기 070 전화가 하루 한번 이상 오기 시작했다.

이전 회사에서 이런 스팸관련 전화/문자에 대해 구현한 경험이 떠올라
간단하게 개인용 앱을 만들어 보고, 관련 과정을 공유하려고 한다.

추가적으로, 이전회사에서 알게 된 내용이 있는데,

> SKT 통신사의 경우, T전화를 개발하는 부서가 전화의 수발신을 담당하는 회사(SKT)내에 존재한다.
한 회사이기 때문에, 개인정보 걱정없이 특정번호 수신을 미리 차단 가능하다.

> KT의 경우 이런 전화번호관련 개발회사(ex. 후후)가 자회사로 분리되어있다.
때문에, 전화수발신에 대해 관여하기 위해서는 복잡한 개인정보동의가 필요하다. (거의 불가능)

운나쁘게도, 난 KT를 사용하고 있다. ㅠㅠ

---

## 목표

### 1. 스팸전화 (`070` 시작번호) 차단

`010`으로 오는 전화는 어떤 전화인지 모르기때문에 차단하지 않기로 했다.

iOS의 경우, 전화와 관련되어 Callkit이라는 프레임워크를 제공하고 있다.

민감한 정보와 관련되다보니, 아주 제한적인 기능만을 제공하고 있는데, 이 기능 중 전화번호 저장/차단과 관련된 callkit extension을 사용해보려고 한다.

이전 개발시점(2019년)까지는 extension 하나당 최대 약20만개의 전화번호까지만 등록/차단이 가능했으나,
현재는 테스트해보니, 200만개까지 가능하다. (이런건 제발 공식문서에 기록좀 해붰으면 좋겠다.)

우리가 차단해야하는 번호는 070-xxxx-xxxx 형식으로, 경우의 수는 1억개의 패턴이 나온다.
이전에 20만개 차단일 경우에는 500개의 exntension을 설치&활성화해야함으로 불가능했으나,
현재는 200만개로, 50개면 추가해볼만 할것으로 판단된다.

callkit extension에는 여러가지 주의점이 존재하는데,
1. extension임으로, 메모리는 7mb정도만 사용이 가능함 (한계 메모리가 넘어가면, 강제종료됨)
2. 전화번호 등록시, sort가 되어있지 않으면 에러 발생
3. 한번에 2000개씩 저장(설정 불가능)되며, 2번과 같은 특징때문에 멀티쓰레드 처리가 불가능함

이러한 특징때문에, 1억개의 전화번호를 등록하려면 상당한 시간이 소모될 것으로 판단된다.
따라서, 스팸 등록시 현재 진행상황을 보여주는 화면도 필요할 것으로 판단된다.

또한, 설정 - 전화 - 전화번호차단에서 옵션을 on할때 바로 전화를 등록하면
50개의 extension을 한개씩 켜다가 답답해 죽을 수 있으니, 여기서 설정시에는 전화번호 등록을 안해야한다.

이전 경험상, 이런 extension을 한번에 여러개 키는 경우에, 시스템 에러가 발생(활성화 오류)하며 이런 에러를 수정하기 위해서는
문제가 되는 extension애서 이미 저장된 번호를 다 삭제한 뒤, 완료를 기다렸다 다시 저장해아한다.

그냥 편하게,
1. 하나에서 실패가 발생하면 모든 전화번호를 다시 저장한다.
2. enxtension에서 전화번호 저장 시작은 앱에서만 실행하며, 동시에 실행되는 extension 개수를 최대한 보수적으로 설정한다.

이렇게 하는게 나을 것 같다.



### 2. 스팸문자 차단

iOS에서는 스팸문자로 등록되면, 실시간 알람에 안뜨고, 문자 뱃지 카운트만 증가해주는 로직이 존재한다.
또한 스팸은 거래/광고/정크 타입으로 등록이 가능하며, 문자수신시 최초 1번만 등록이 가능하다.

무슨말이냐면, 최초로 수신되는 문자였을때만 문자내용이 extensino으로 전달되며,
이후에는 동일번호로는 extension 문자로 체크할 수 없다는 것이다.

또한 3~4초내에 스팸인지 아닌지 답을 주지 않으면, 비스팸으로 처리되는 로직도 있다.

문자수신 시점에만 실행되며, 프레임워크가 제공하는 형식의 API가 강제되며
개인정보를 판별할 수 있는 정보는 보낼 수가 없다. (sender/content만 서버로 전달 가능)

따라서 특정 사용자를 인식한다던가.. (예를 들어 회원인지 아닌지), 누구한테 보낸 문자인지 (receiver)를 알 수 없다.


스팸으로 등록된 문자는 문자 - 정크항목으로 들어가게 되며, 알람도 노출되지 않는다.

문제는, 해당 전화번호로 오는 문자를 다시 받고 싶은 경우인데...
이럴때 exntenion에서는 해결 할 수 있는 방법이 없다.

이미 수신된 문자가 있어서, 위의 조건(최초수신시에만 전달)이 되지 않으며,
전체 문자를 삭제하면, 최초 수신시에만 전달조건에는 일치하나, extension 로직상 다시 스팸으로 처리될 가능성이 높다.

뭐랄까... 해결책은 좀 생뚱맞을 수 있는데,
해당 문자에 대한 reply를 3번이상 하면 시스템에서 자동 해제 된다.

이런 제약과 문제점(?) 때문에, 후후앱 개발시 CS팀이 꾀나 고생했덜걸로 기억한다.



### 3. UI 및 구현

기존처럼 rxswift + storybaord를 사용할까 했는데,
이왕이면 공부할 겸, swiftUI + combine을 사용해보려고 한다.

이전회사에서 swiftUI로 일부화면을 구현해봤으나,
swiftUI + hostingViewController는 넘 비효츌적인 경우가 많아서, 일부분만 사용해봤었다.

이번에는 full swfitUI + combine에 ribs 구조를 사용해보려고 한다.

또한 50개의 extension을 생성/셋팅해아함으로,
수동으로 만드는 것보다 tuist를 사용, 자동으로 구축해보려고 한다.

UI는 토이프로젝트임을 감안해, 어디선가 많이 보던 UI를 최대한 비슷하게 구현해볼까 한다.

### 4. 서버구축

스팸문자의 경우, 앱 내에서 판별도 가능하지만, API를 통해 질의도 가능하다.
때마침 집에 Nas를 통한 웹서버를 구동중임으로, OpenAI API를 통한 스팸여부 판단로직을 구현해보려고 한다.



### 5. 테스트

자.. 문제의 테스트 항목까지 넘어왔다.
후후를 개발하면서도 느꼈지만, 시스템 항목 중 민감정보, 특히 전화번호/문자 관련해서는 Unit/UI 테스트가 불가능하다.

자동화 테스트라는게, 특정 기능(함수)를 호출하고 원하는 결과값이 나타나는지를 확인하는건데,

위의 두가지 extension은
1. 특정 기능에 대한 수동 호출 불가능 (스팸문자)
2. 기능에 대한 검증 불가능 (스팸문자)
3. 특정 기능 수행 및 검증을 위한 mocking 불가능 (전화차단)

따라서, extension에 대한 검증은 실제 테스트로 대채하며, 그 외에 항목은 최대한 테스트를 진행할 예정이다.

## 정리

이리저리 아이디어를 정리하다보니, 처음 생각보다 커진것 같다.
에상 목표는 1주일로 잡고, 최대한 빨리 정리해 올려보도록 노력하겠다.
139 changes: 139 additions & 0 deletions src/posts/project/spam_killer_2/content.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
---
title: "[draft]스팸 문자/전화좀 그만해라 (1)"
date: 2024-11-22
desc: 지긋지긋한 스팸들...
thumbnail: /posts/spam_killer/thumbnail.jpg
---

![스팸 문자/전화좀 그만해라](/posts/spam_killer/thumbnail.jpg)

## 개인적인 잡담

회사를 그만두고나서, 그동안 부족했던 부분에 대해서 여러가지 공부를 하려고 준비중이다.
그런데, 갑지기 070 전화가 하루 한번 이상 오기 시작했다.

이전에 [후후앤컴퍼니](/about)에서 이런 스팸관련 전화/문자에 대해,
여러가지 기능을 구현해본 경험이 있기 문에, 간단하게 개인용 앱을 만들어 보고, 관련 과정을 공유하려고 한다.

추가적으로, 이전회사에서 알게 된 내용이 있는데,

> SKT 통신사의 경우, T전화를 개발하는 부서가 전화의 수발신을 담당하는 회사(SKT)내에 존재한다.
한 회사이기 때문에, 개인정보 걱정없이 특정번호 수신을 미리 차단 가능하다.

> KT의 경우 이런 전화번호관련 개발회사(ex. 후후)가 자회사로 분리되어있다.
때문에, 전화수발신에 대해 관여하기 위해서는 복잡한 개인정보동의가 필요하다. (거의 불가능)

운나쁘게도, 난 KT를 사용하고 있다. ㅠㅠ

---

## 목표

### 1. 스팸전화 (070 시작번호) 차단

010으로 오는 전화는 어떤 전화인지 모르기때문에 차단하지 않기로 했다.

iOS의 경우, 전화와 관련되어 Callkit이라는 프레임워크를 제공하고 있다.

민감한 정보와 관련되다보니, 아주 제한적인 기능만을 제공하고 있는데, 이 기능 중 전화번호 저장/차단과 관련된 callkit extension을 사용해보려고 한다.

이전 개발시점(2019년)까지는 extension 하나당 최대 약20만개의 전화번호까지만 등록/차단이 가능했으나,
현재는 테스트해보니, 200만개까지 가능하다. (이런건 제발 공식문서에 기록좀 해붰으면 좋겠다.)

우리가 차단해야하는 번호는 070-xxxx-xxxx 형식으로, 경우의 수는 1억개의 패턴이 나온다.
이전에 20만개 차단일 경우에는 500개의 exntension을 설치&활성화해야함으로 불가능했으나,
현재는 200만개로, 50개면 추가해볼만 할것으로 판단된다.

callkit extension에는 여러가지 주의점이 존재하는데,
1. extension임으로, 메모리는 7mb정도만 사용이 가능함 (한계 메모리가 넘어가면, 강제종료됨)
2. 전화번호 등록시, sort가 되어있지 않으면 에러 발생
3. 한번에 2000개씩 저장(설정 불가능)되며, 2번과 같은 특징때문에 멀티쓰레드 처리가 불가능함

이러한 특징때문에, 1억개의 전화번호를 등록하려면 상당한 시간이 소모될 것으로 판단된다.
따라서, 스팸 등록시 현재 진행상황을 보여주는 화면도 필요할 것으로 판단된다.

또한, 설정 - 전화 - 전화번호차단에서 옵션을 on할때 바로 전화를 등록하면
50개의 extension을 한개씩 켜다가 답답해 죽을 수 있으니, 여기서 설정시에는 전화번호 등록을 안해야한다.

이전 경험상, 이런 extension을 한번에 여러개 키는 경우에, 시스템 에러가 발생(활성화 오류)하며 이런 에러를 수정하기 위해서는
문제가 되는 extension애서 이미 저장된 번호를 다 삭제한 뒤, 완료를 기다렸다 다시 저장해아한다.

그냥 편하게,
1. 하나에서 실패가 발생하면 모든 전화번호를 다시 저장한다.
2. enxtension에서 전화번호 저장 시작은 앱에서만 실행하며, 동시에 실행되는 extension 개수를 최대한 보수적으로 설정한다.

이렇게 하는게 나을 것 같다.



### 2. 스팸문자 차단

iOS에서는 스팸문자로 등록되면, 실시간 알람에 안뜨고, 문자 뱃지 카운트만 증가해주는 로직이 존재한다.
또한 스팸은 거래/광고/정크 타입으로 등록이 가능하며, 문자수신시 최초 1번만 등록이 가능하다.

무슨말이냐면, 최초로 수신되는 문자였을때만 문자내용이 extensino으로 전달되며,
이후에는 동일번호로는 extension 문자로 체크할 수 없다는 것이다.

또한 3~4초내에 스팸인지 아닌지 답을 주지 않으면, 비스팸으로 처리되는 로직도 있다.

문자수신 시점에만 실행되며, 프레임워크가 제공하는 형식의 API가 강제되며
개인정보를 판별할 수 있는 정보는 보낼 수가 없다. (sender/content만 서버로 전달 가능)

따라서 특정 사용자를 인식한다던가.. (예를 들어 회원인지 아닌지), 누구한테 보낸 문자인지 (receiver)를 알 수 없다.


스팸으로 등록된 문자는 문자 - 정크항목으로 들어가게 되며, 알람도 노출되지 않는다.

문제는, 해당 전화번호로 오는 문자를 다시 받고 싶은 경우인데...
이럴때 exntenion에서는 해결 할 수 있는 방법이 없다.

이미 수신된 문자가 있어서, 위의 조건(최초수신시에만 전달)이 되지 않으며,
전체 문자를 삭제하면, 최초 수신시에만 전달조건에는 일치하나, extension 로직상 다시 스팸으로 처리될 가능성이 높다.

뭐랄까... 해결책은 좀 생뚱맞을 수 있는데,
해당 문자에 대한 reply를 3번이상 하면 시스템에서 자동 해제 된다.

이런 제약과 문제점(?) 때문에, 후후앱 개발시 CS팀이 꾀나 고생했덜걸로 기억한다.



### 3. UI 및 구현

기존처럼 rxswift + storybaord를 사용할까 했는데,
이왕이면 공부할 겸, swiftUI + combine을 사용해보려고 한다.

이전회사에서 swiftUI로 일부화면을 구현해봤으나,
swiftUI + hostingViewController는 넘 비효츌적인 경우가 많아서, 일부분만 사용해봤었다.

이번에는 full swfitUI + combine에 ribs 구조를 사용해보려고 한다.

또한 50개의 extension을 생성/셋팅해아함으로,
수동으로 만드는 것보다 tuist를 사용, 자동으로 구축해보려고 한다.

UI는 토이프로젝트임을 감안해, 어디선가 많이 보던 UI를 최대한 비슷하게 구현해볼까 한다.

### 4. 서버구축

스팸문자의 경우, 앱 내에서 판별도 가능하지만, API를 통해 질의도 가능하다.
때마침 집에 Nas를 통한 웹서버를 구동중임으로, OpenAI API를 통한 스팸여부 판단로직을 구현해보려고 한다.



### 5. 테스트

자.. 문제의 테스트 항목까지 넘어왔다.
후후를 개발하면서도 느꼈지만, 시스템 항목 중 민감정보, 특히 전화번호/문자 관련해서는 Unit/UI 테스트가 불가능하다.

자동화 테스트라는게, 특정 기능(함수)를 호출하고 원하는 결과값이 나타나는지를 확인하는건데,

위의 두가지 extension은
1. 특정 기능에 대한 수동 호출 불가능 (스팸문자)
2. 기능에 대한 검증 불가능 (스팸문자)
3. 특정 기능 수행 및 검증을 위한 mocking 불가능 (전화차단)

따라서, extension에 대한 검증은 실제 테스트로 대채하며, 그 외에 항목은 최대한 테스트를 진행할 예정이다.

## 정리

이리저리 아이디어를 정리하다보니, 처음 생각보다 커진것 같다.
에상 목표는 1주일로 잡고, 최대한 빨리 정리해 올려보도록 노력하겠다.
Loading
Loading