Kotlin 프로젝트에서도 AtomicReference 가 자주 등장하는데,
그 이유는 Kotlin이 Java 기반 JVM 위에서 동작하며, 완벽한 대체 기능이 없기 때문이다.
AtomicReference 는 락을 사용하지 않고(lock-free)
여러 스레드에서 동시에 안전하게 읽기/쓰기가 가능한 원자적 참조(Reference) 저장 객체이다.
Kotlin은 JVM 언어라 다음 Java concurrency primitives 를 그대로 사용한다.
Kotlin 자체에는 이와 동일한 기능을 제공하는 클래스가 없다.
Mutex 또는 synchronized는 락(lock)을 걸기 때문에 성능 오버헤드가 있다.
반면 AtomicReference는:
코루틴은 스레드를 옮겨가며 실행되므로
공유 데이터를 안전하게 관리해야 한다.
AtomicReference 없이는 다음 문제가 발생할 수 있다:
암호화 관련 파라미터(passphrase, salt, IV)는:
AtomicReference는 이 패턴에 정확히 맞는다.
파라미터 세팅 중 실패하면:
clear() // 전부 null로 초기화
이 과정을 Atomic하게 처리할 수 있다는 장점도 있다.
| 대체제 | 사용 가능? | 한계 |
|---|---|---|
| volatile | ❌ | 원자적 업데이트가 불가능 |
| MutableStateFlow | ⚠️ 가능하나 부적합 | 옵저버 패턴이라 오버헤드 큼 |
| Mutex | ⚠️ 사용 가능 | 락 기반이라 느리고 무거움 |
| synchronized | ⚠️ 사용 가능 | Java-style 락, 비효율적 |
| AtomicReference | ✅ 최적 | 가장 빠르고 안전 |
결론: AtomicReference가 가장 적합하고 효율적이다.
CryptoParameterMemoryStore 구조:
private val passphraseRef = AtomicReference<String?>(null)
private val saltRef = AtomicReference<ByteArray?>(null)
private val initializationVectorRef = AtomicReference<ByteArray?>(null)
즉, multiprocessing / coroutine 환경에서 가장 안전하고 빠른 방식이다.
Kotlin에서는 Java의 AtomicReference를 사용하는 것이 정상적이며,
특히 암호 파라미터처럼 thread-safe 하고 lock-free 메모리 저장이 필요할 때
AtomicReference가 가장 적합한 선택이다.