본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

보내기 전에 정해

~11 min · selection-before-send, rekindle-lesson, privacy, offline

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"원격 호출을 아예 안 짓는 오프라인 요청은 못 새. 그건 약속이 아니라 모양이야."

Rekindle 유산

Firekeeper 의 글쓰기 형제 Rekindle 이 오프라인 모드에 대해 빡빡한 규칙을 배웠고, Firekeeper 가 그걸 그대로 물려받았어. 프로바이더 선택은 바이트 하나가 프로세스를 떠나기 전에 끝난다. 지금 켜져 있는 연결 모드가 먼저 구체적인 프로바이더로 결정돼. 요청은 그다음에야 만들어지고 나가고. 사소한 디테일처럼 들리지. 사실은 진짜 오프라인과 오프라인 연극을 가르는 전부야.

두 아키텍처, 하나의 치명적 차이

폴백을 짜는 방법 두 가지를 비교해 봐. 실패하면 폴백 하는 설계는 원격 호출을 먼저 시도하고, 실패했을 때만 로컬로 돌려. 그 말은 오프라인으로 처리하려던 요청이 누가 확인하기도 전에 이미 네트워크 호출을 시도했거나 최소한 준비했다는 뜻이야. 보내기 전에 선택 하는 설계는 고른 모드에서 프로바이더를 미리 정해. 그러면 오프라인 요청은 로컬 프로바이더로 가고 원격 호출은 아예 지어지지도 않아. 실패하면 폴백하는 쪽은 아무것도 안 샜기를 바라는 거고, 보내기 전에 고르는 쪽은 샐 수가 없게 구조로 막아 버리는 거야.

실패하면 폴백 (연극):
  원격 호출 짓기 -> 전송 시도 -> 실패? -> 이제 로컬로   # 원격이 시도됐어!

보내기 전에 선택 (진짜):
  고른 모드 읽기 -> 오프라인? -> 로컬 호출만 짓기        # 원격이 존재 안 함

왜 조심하는 것보다 구조가 나은가

실패하면 폴백하는 설계도 조심스러운 확인으로 안전하게 만들 수는 있어. '온라인일 때만 보내고, 나가기 전에 꼭 취소해' 처럼. 그런데 조심성은 약해. 리팩터 한 번, 레이스 한 번, 잊어버린 분기 하나면 원격 호출이 새어 나가. 보내기 전에 고르는 방식은 조심성에 안 기대. 오프라인 모드에선 원격 요청을 짓는 코드 경로에 아예 닿지를 않아. 그러니 샐 게 없지. 안전이 위에 볼트로 조여 붙인 가드가 아니라 제어 흐름에서 따라 나오는 성질이면, 실수로 되돌릴 수가 없어.

프라이버시를 가드가 아니라 모양으로 만들어. 확인으로 지키는 프라이버시는 확인 없이 전송에 닿는 변경 하나면 뚫려. '오프라인이면 안 보냄' 같은 거. 구조로 지키는 프라이버시는 리팩터를 견뎌. '오프라인 경로는 원격 호출을 아예 안 짓는다' 처럼, 위험한 코드가 그 경로에 없으니까. 위험한 게 가드만 된 아키텍처보다, 아예 닿지 않는 아키텍처를 골라.

Code

프로바이더가 요청 존재 전에 모드에서 해결됨·swift
func cleanup(_ req: CleanupRequest, mode: ConnectionMode) async -> CleanupResult {
    // 프로바이더를 먼저 해결. 오프라인 모드는 로컬 프로바이더를 돌려주고,
    // 이 경로에선 원격 URLSession/curl 호출이 아예 안 지어짐.
    let provider: CleanupProvider = switch mode {
        case .localMiniOllama: OllamaMiniPippaProvider()   // localhost 만
        case .pippaFullThisMac: CwkPippaProvider(.localhost)
        case .pippaFullTailscale: CwkPippaProvider(.tailscale)
    }
    // 이제야 요청이 지어짐 — 어디로 가는지 이미 아는 프로바이더가.
    return await provider.clean(req)
}
// '원격 시도하고, 로컬로 폴백' 하는 분기가 없어.
// 새는 코드가 안 닿으니 오프라인이 못 새.

External links

Exercise

오프라인이나 '로컬 전용' 모드를 내세우는 앱을 하나 골라봐. 그 안전이 가드인지, 그러니까 '확인하고 나서 어쩌면 전송' 인지, 아니면 모양인지, 그러니까 '전송 코드가 오프라인 경로에 아예 없음' 인지 따져봐. 어떤 리팩터가 모양 버전은 안 깨면서 가드 버전만 깰 수 있을까?
Hint
가드 버전은 플래그를 다시 확인하지 않고 전송에 닿는 변경마다 깨져. 새로 넣은 조기 반환, 자리를 옮긴 조건문, 확인과 전송 사이의 레이스 같은 것들. 모양 버전은 깨뜨릴 전송 코드가 오프라인 경로에 없어. 프라이버시가 걸린 일에서 '가드됨' 보다 '닿지 않음' 이 이기는 이유가 바로 이 튼튼함이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.