본문 바로가기
개발 일지/iOS앱 가리봉라디오

가리봉라디오(iOS) - 1.0(3) 빌드로 재심사 등록, 저작권 이슈 있는 컨텐츠 제거

by 가리봉맨 2026. 1. 7.

직전 포스트에 쓴 대로 '가리봉 라디오'의 첫 버전인 1.0(1)이 리젝을 먹었다. 앱을 대폭 수정해서 다시 심사를 올렸다. 심사 버전은 '1.0(3)'인데 괄호 안의 3은 빌드 넘버다. 빌드 넘버 2는 TestFlight에만 배포했다. 앱의 정체성이 바뀔 정도로 많은 수정이 있었다. 리젝 관련 제세한 내용은 아래 포스트를 참고하시기 바란다.

https://bongman.tistory.com/1233

 

[iOS 앱] 가리봉 라디오, 버전 1.0 심사 거절 사유 및 대응

간단한 앱이라 무난히 통과될 줄 알았는데 첫 버전인 1.0부터 리젝(reject)을 먹었다.이 글을 보고 있는 다른 분들께 도움이 될 수도 있으니 전문을 아래 '더보기' 형태로 공유한다.더보기Hello, Thank

bongman.tistory.com

전체적인 수정 방향성은 'Claude Desktop' 앱의 채팅 모드를 통해서 정하고, 실제 코드 수정은 초반에 'Claude Desktop' 앱의 코드 모드에서 진행하다 멈추고, 터미널 상에서 'Claude Code'를 실행해서 대부분의 작업을 진행하고 마무리했다. 모델은 'Opus 4.5'만 사용했다. 스토어에 새로 업로드할 스크린샷 이미지 수정은 'ChatGPT Desktop' 앱의 도움을 받았다.

 

방송사 저작권 이슈 관련 수정

기존 핵심 컨텐츠를 대거 들어내는 것밖에는 방법이 없어서 결정을 내리기 쉽지 않았다. 작업 시작 전에 약간 심리 상담 느낌으로 Claude에게 의견을 물었다.

솔직한 소견을 말씀드리면, 이 문제가 기술적 이슈보다 더 근본적이고 어려운 문제입니다.
핵심은 이겁니다: KBS, MBC, SBS 등 방송사들의 스트리밍을 앱에서 제공하려면, 해당 방송사들로부터 공식적인 사용 허가 문서가 필요합니다.

현실적인 난관:
- 대형 방송사들은 대부분 자체 공식 앱을 운영 중
- 개인 개발자에게 스트리밍 권한을 부여할 유인이 거의 없음
- 설령 연락을 시도해도 답변조차 받기 어려울 가능성이 높음

공개된 스트리밍 URL을 "기술적으로 접근 가능하다"는 것과 "상업적 앱에서 사용해도 된다"는 것은 완전히 다른 문제입니다. Apple은 이 부분을 정확히 짚고 있습니다.
이 앱이 현재 구조 그대로 App Store에 출시되기는 상당히 어려워 보입니다. 앱의 방향 자체를 재고해야 할 수도 있는 상황입니다.

이미 알고 있는 내용이지만 마치 동료나 상사에게 확답을 들은 것 같아 결정을 내리는 데에 도움이 됐다. 한국 방송사 관련 컨텐츠를 모두 제거하고 저작권에 문제가 없는 공개 스트리밍 컨텐츠로 교체하기로 했다. Cluade에게 교체할 컨텐츠의 리스트업을 요청했고 아래와 같은 답을 얻었다.

좋은 소식이 있습니다. Radio Browser API가 완벽한 대안입니다.

Radio Browser API (radio-browser.info)

- 데이터 라이선스: Public Domain (완전 무료)
- 소프트웨어 라이선스: GPL (오픈소스)
- 스테이션 수: 약 50,000개 전 세계 인터넷 라디오
- 상업적 사용: 명시적으로 허용
- 기존 사용 사례: VLC, Rhythmbox 등 수많은 앱에서 이미 사용 중

공식 사이트에서 직접 밝히고 있습니다:
"Everyone is free to use the collected data in their works."

Radio Browser API 라는 것을 사용하면 기존 한국 방송사 컨텐츠를 유지하면서 저작권 문제도 해결할 수 있다는 것이다. 미심쩍었지만 아니면 원복 하면 되니까 일단 진행해 보기로 했다.

위 이미지와 같이 Claude Desktop 앱을 코드 모드로 변경하고, 'Radio Browser API' 기반으로 다시 구현할 계획을 세워서 보고하라고 요청했다. 아래는 이미지에 포함되지 않은 구현 계획서의 '배경'에 해당하는 내용이다.

현재 구현은 radio.bsod.kr 프록시 서비스를 통해 한국 라디오 방송국 스트림에 접근하고 있습니다. 이 방식은 저작권 문제로 앱 심사에서 거절되었습니다.
Radio Browser API는 커뮤니티가 관리하는 무료 라디오 방송국 데이터베이스로, 전 세계 라디오 방송국의 메타데이터와 스트림 URL을 제공합니다. 한국 라디오 방송국도 75개 이상 등록되어 있습니다.

방송사에서 공식 스트림 URL과 별도로 저작권에 문제없는 스트림 URL도 제공한다는 의미일까? 잘 이해가 안 됐지만 일단 코드 작성을 지시했다.

static let allStations: [RadioStation] = [
    RadioStation(name: "KBS 1Radio", streamURL: "https://radio.bsod.kr/stream/?stn=kbs&ch=1radio", category: .kbs),
    // ... 15개 고정 방송국
]

위의 하드코딩 버전이 아래와 같이 API를 호출해서 값을 얻어 오는 방식으로 수정됐다.

struct RadioStation: Identifiable, Codable, Hashable {
    let stationuuid: String      // Radio Browser UUID (고유 식별자)
    let name: String
    let url: String              // 원본 URL
    let urlResolved: String      // 실제 스트림 URL
    let codec: String            // MP3, AAC 등
    let bitrate: Int
    let tags: String             // 태그 (검색/필터용)
    let favicon: String?         // 방송국 아이콘 URL
    let country: String
    
    var id: String { stationuuid }
    
    // 카테고리는 name 또는 tags 기반으로 추론
    var category: StationCategory { ... }
}
반응형

구현 완료 후 테스트를 해봤는데 값을 얻어오는 방식만 달라졌을 뿐 방송사의 공식 스트림 URL을 사용하는 것은 달라지지 않았다. 예를 들어 KBS Classic FM 채널의 스트림 URL은 아래 페이지를 통해 얻어 오도록 변경됐는데, 결국 똑같이 duckdns.org:8088 서버를 사용하게 된다.

https://www.radio-browser.info/history/c038a859-7be1-11e9-aa30-52543be04c81

 

radio-browser.info

 

www.radio-browser.info

큰 기대하지 않고 작업했 것이라 바로 롤백을 지시했다. 다시 Claude Desktop 앱의 채팅 모드로 돌아가서 한국 방송사의 컨텐츠는 아예 제거하고 확실히 저작권에 문제가 없는 스트리밍 URL만 리스트업해 달라고 요청했다. 그리고 방송국에 따른 구분 대신 아래와 같은 카테고리로 구분하고 그 밑에 새로운 스트리밍 컨텐츠들을 추가하기로 결정했다.

  1. 집중/공부 — Lo-Fi, Ambient
  2. 휴식/수면 — Relaxation, Natur
  3. 클래식 — Classical, Modern Classical
  4. 카페/라운지 — Jazz, Bossa Nova, Lounge

cladue가 리스트업한 신규 스트리밍 컨텐츠(스테이션)의 출처는 아래와 같다.

  • RadioNOS (9개 스테이션) - 브라질 기반, Creative Commons 음악만 재생, 상업적 사용 명시적 허용
  • Public Domain Radio (2개 스테이션) - 스위스 기반, 1945년 이전 음원 (저작권 만료)
  • YourClassical (3개 스테이션) - 미국 공영라디오, 무료 스트리밍 제공
  • 기타 (2개 스테이션) - 무료 공개 스트림

카테고리 구분이나 신규 컨텐츠가 썩 마음에 들지는 않지만 일단 심사에 통과된 뒤 추후 앱 업데이트를 통해 다듬어 가려고 한다. 이에 대한 구현은 터미널 상에서 Claude Code로 진행했다. 아래와 같이 카테고리별 16개의 스테이션이 정리된 json 파일을 첨부해서 코드 작업을 요청했다.

https://github.com/Hamjoon/simple-radio-ios-app/commit/a0851bc274281a38253f8b58c041c68b6cd2225c

 

Replace Korean stations with international mood-based stations · Hamjoon/simple-radio-ios-app@a0851bc

- Remove KBS, MBC, SBS, EBS, CBS, TBS categories - Add 4 new mood categories: Focus, Relaxation, Classical, Cafe - Add 16 international stations from RadioNOS, YourClassical, etc. - Update category...

github.com

(나중에 내가 찾아 보려고) 커밋 페이지 링크를 공유한다.

 

재생 버튼을 눌러도 아무 반응이 없는 현상 대응

이전 포스트에 썼던 대로 반응이 없는 것이 아니라 해외에서 접근 시 딜레이가 커서 반응이 없는 것처럼 느껴진 것이라고 판단했다. 기본적으로 새로 추가된 컨텐츠가 대부분 미국에 서버를 두고 있어서 (애플 리뷰어 기준으로) 딜레이가 많이 줄어들 것으로 예상한다. VPN 앱으로 지역을 미국으로 설정하고 테스트해 봤는데 재생 버튼을 누르고 2~3초 정도면 음원 재생이 시작됐다. VPN을 꺼도(지역을 한국으로 설정한 것과 동일한 효과) 별 차이가 없었다.

만약 딜레이가 있어도 버그로 느끼지지 않도록 UI도 개선했다. 위의 이미지와 같이 재생 버튼을 누르면 실제 음원이 재생되기 전까지는 로딩 아이콘과 '연결 중..' 문구가 보이도록 처리했다. 그리고 딜레이 문제가 아니라 아예 연결에 실패한 경우에 대한 처리도 로직에 추가했다. 전체 작업 내역 및 코드 변경점은 아래 커밋을 참고하기 바란다. 물론 코딩 작업은 100% claude가 했다. 저장소는 특별한 문제가 생기지 않는 한 public으로 유지할 생각이다.

https://github.com/Hamjoon/simple-radio-ios-app/commit/8a54b4254a99cdbd5289cba55e80b12eebfb2bc5

 

feat: Add error handling and UI error state display · Hamjoon/simple-radio-ios-app@8a54b42

- RadioPlayer: Add error state variable and AVPlayerItem status observer - RadioPlayer: Set error messages for PLS load failure and network errors - NowPlayingView: Add error banner, loading state,...

github.com

 

버전 1.0(3) 빌드 및 재심사 등록

앱 버전은 1.0으로 유지하고 빌드 넘버만 3으로 올려서 심사를 다시 넣었다. 스크린샷도 다시 업로드했고, '프로모션 텍스트', '설명' 문구에서 저작권에 문제가 될 만한 문구를 모두 제거하거나 교체했다. 이제 또 기다리기만 하면 된다. 끝.

사업자 정보 표시
가리봉랩스(Garibong Labs) | 함동기 | 87, Jukjeon-ro | 사업자 등록번호 : 604-05-36402 | TEL : 010-5130-6483 | Mail : hamjoon@gmail.com | 통신판매신고번호 : 2026-용인수지-0037호 | 사이버몰의 이용약관 바로가기