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

확인이 안 되면 클립보드로 내려줘

~10 min · clipboard-fallback, safety-over-convenience, graceful-degradation, visible-failure

Level 0식은 부싯돌
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"조심스러운 도구가 확신이 안 설 때 할 수 있는 제일 좋은 일은 아무것도 안 하는 거야. 대신 결과는 손에 쥐여주고."

거부하는 게 곧 기능이야

이 트랙의 모든 확인엔 실패했을 때 가는 길이 있고, 전부 같은 자리로 이어져. 클립보드. 그 자리가 내가 뜻한 자리라고 확인이 안 되면 Flint 는 안 넣어. 네이티브로 다시 읽은 게 안 맞거나, 불투명한 데서 다시 꺼낸 글이 다르거나, 창이 바뀌었거나. 바뀐 글을 클립보드에 올려놓고 알려주지. 확인 안 된 자리에 붙여넣기를 거부하는 건 Flint 가 미안해할 한계가 아니라, 삽입 층이 하는 제일 중요한 일이야. 한 번도 거부 안 하는 확인은 확인이 아니거든.

되돌릴 수 있는 게 되돌릴 수 없는 걸 이겨

계산은 전부 '되돌릴 수 있느냐' 에 걸려 있어. Flint 가 짐작으로 엉뚱한 데 붙이면 피해가 되돌릴 수 없을 수 있어. 내 글이 채팅에 올라가버리거나, 엉뚱한 내용이 깔끔하게 되돌릴 방법도 없이 덮어써지거나. 반대로 Flint 가 사양하고 결과를 클립보드에 올려두면 최악이라 봐야 약간 번거로운 정도야. 내가 직접, 키 한 번으로, 진짜 원하는 자리에 붙이면 되니까. 드물게 벌어지는 참사랑 일상적인 잔손질 중에선 매번 잔손질을 고르는 거지. 시간이 벌어진 뒤엔 편한 것보다 안전한 게 먼저야. 언제나.

네이티브 확인됨?  -- 예 --> 접근성으로 곧장 교체   (제일 좋음)
        | 아니오
불투명 확인됨?    -- 예 --> 붙여넣어 교체          (괜찮음)
        | 아니오
                  ---------> 클립보드 + 알림       (안전한 길)

확인 못 한 길은 전부 같은 안전한 자리로 떨어진다. 확인 못 한
자리에 넣는 갈래는 아예 없다.

조용히 실패하지 말고 말해줘

이 길은 사용자가 그런 줄 알아야만 굴러가. 아무 신호도 없이 결과가 조용히 클립보드에 앉아 있으면 사용자한텐 친 게 아무 일도 안 한 것처럼 느껴지거든. 설계 전체가 막으려던 바로 그 '이거 고장 났네' 인상이지. 그래서 이 길은 눈에 보여야 해. 짧은 알림이 결과가 클립보드에 있으니 붙이면 된다고 말해주는 거야. 그러면 사용자가 무슨 일이 있었는지 알아. '안전하게 못 바꾸겠으니 글을 손에 쥐여줬구나' 하고, 다음에 뭘 할지도 알고. 보이는 물러남은 설계대로 도는 기능이고, 조용한 물러남은 버그랑 구별이 안 돼.

안전을 확인 못 한 뒤엔 되돌릴 수 있는 쪽을 고르고, 그걸 알려줘. 두 가지가 같이 가야 해. 위험한 행동을 거부하는 게 사용자를 지키고, 대신 뭘 했는지 말해주는 게 사용자한테 주도권을 남겨. 하나만 하면 데이터로 도박을 하거나 사용자를 어리둥절하게 만들거나 둘 중 하나야. 조심스러운 도구가 실패할 땐 피해는 조용하고 알림은 시끄러워야 해. 망가진 것도 없고 숨긴 것도 없게.
모델 호출을 아껴 쓰는 얘기랑 이어져. 같은 생각으로 보면, 넣을 수 없다는 걸 이미 아는 상황에선 — 예를 들어 접근성 권한이 없을 때(Track 7) — 추론 호출을 아예 하지 말아야 해. 여기선 호출이 이미 끝났고 자리가 낡아버린 경우라 결과를 클립보드로 건져내는 거고. 들어갈 땐 못 쓸 호출을 안 쓰고, 나올 땐 이미 쓴 결과를 안 버리는 거지.

Code

판단, 그리고 언제나 열려 있는 안전한 출구·swift
func place(_ result: String, into snap: TargetSnapshot) {
    if let element = proveNative(snap) {
        replaceSelection(with: result, in: element)      // 제일 좋은 길
    } else if proveOpaque(snap) {
        pasteReplace(result)                             // 확인된 붙여넣기
    } else {
        copyToClipboardAndNotify(result)                 // 짐작으로는 안 넣는다
    }
}

func copyToClipboardAndNotify(_ result: String) {
    NSPasteboard.general.clearContents()
    NSPasteboard.general.setString(result, forType: .string)
    notify("결과를 클립보드에 뒀어. 자리가 옮겨가서 넣지는 않았고.")
    // 보이고, 되돌릴 수 있고, 정직하게. 붙이는 건 사용자가 정한다.
}

External links

Exercise

'자리가 낡았을 때' 를 놓고 두 가지 설계를 비교해봐. 가, 지금 앞에 있는 데다 그냥 넣는다. 나, 클립보드에 올려놓고 알려준다. 각각 제일 잘 풀렸을 때, 보통일 때, 최악일 때를 따져봐. 그다음, '조용히 클립보드에만 올려놓기' 가 가보다 안전한데도 왜 나보다 나쁜지 설명해봐.
Hint
가는 운 좋으면 맞고, 최악엔 엉뚱한 앱에 내 글이 되돌릴 수 없게 올라가. 나는 제일 잘 풀리든 최악이든 결국 '내가 직접 붙인다' 라서 피해가 정해져 있고 되돌릴 수 있고. 조용한 클립보드는 가보다 안전하지만 나보다 나빠. 사용자가 친 것과 아무 일도 안 한 것을 구별할 수가 없거든. 결과는 말없이 앉아 있고, 앱은 고장 난 걸로 읽히고, 되돌릴 수 있다는 장점도 되돌릴 게 있는 줄 몰라서 못 쓰게 되니까.

Progress

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

댓글 0

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

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