왜 Kotlin 코드에서 Java AtomicReference 를 사용하는가?

수호·2026년 1월 12일
post-thumbnail

Kotlin 프로젝트에서도 AtomicReference 가 자주 등장하는데,

그 이유는 Kotlin이 Java 기반 JVM 위에서 동작하며, 완벽한 대체 기능이 없기 때문이다.


🔒 AtomicReference란?

AtomicReference 는 락을 사용하지 않고(lock-free)

여러 스레드에서 동시에 안전하게 읽기/쓰기가 가능한 원자적 참조(Reference) 저장 객체이다.


✅ Kotlin에서 AtomicReference 를 사용하는 이유

1. Kotlin에는 완전한 대체품이 없음

Kotlin은 JVM 언어라 다음 Java concurrency primitives 를 그대로 사용한다.

  • AtomicReference
  • AtomicBoolean
  • AtomicInteger
  • AtomicLong

Kotlin 자체에는 이와 동일한 기능을 제공하는 클래스가 없다.


2. Lock-free라서 빠르고 경량

Mutex 또는 synchronized는 락(lock)을 걸기 때문에 성능 오버헤드가 있다.

반면 AtomicReference는:

  • 락을 사용하지 않고도 thread-safe
  • 읽기/쓰기가 매우 빠름

3. 여러 스레드/코루틴 환경에서도 안전

코루틴은 스레드를 옮겨가며 실행되므로

공유 데이터를 안전하게 관리해야 한다.

AtomicReference 없이는 다음 문제가 발생할 수 있다:

  • 레이스 컨디션(race condition)
  • 값 읽기와 쓰기 순서가 보장되지 않음
  • 스레드 전환 중 데이터가 꼬임

4. 불변 패턴(Immutable state) 유지에 유리

암호화 관련 파라미터(passphrase, salt, IV)는:

  • 한 번 생성되면 변경되면 안 되고
  • 여러 스레드에서 읽히며
  • 원자적으로 교체(CAS)되어야 함

AtomicReference는 이 패턴에 정확히 맞는다.


5. Base64 decode 실패 등에서 안정적으로 롤백 가능

파라미터 세팅 중 실패하면:

clear()  // 전부 null로 초기화

이 과정을 Atomic하게 처리할 수 있다는 장점도 있다.


🆚 AtomicReference 대체 옵션 비교

대체제사용 가능?한계
volatile원자적 업데이트가 불가능
MutableStateFlow⚠️ 가능하나 부적합옵저버 패턴이라 오버헤드 큼
Mutex⚠️ 사용 가능락 기반이라 느리고 무거움
synchronized⚠️ 사용 가능Java-style 락, 비효율적
AtomicReference✅ 최적가장 빠르고 안전

결론: AtomicReference가 가장 적합하고 효율적이다.


📌 CryptoParameterMemoryStore 에서 AtomicReference 를 쓰는 이유 요약

CryptoParameterMemoryStore 구조:

private val passphraseRef = AtomicReference<String?>(null)
private val saltRef = AtomicReference<ByteArray?>(null)
private val initializationVectorRef = AtomicReference<ByteArray?>(null)

필요한 특성이 모두 AtomicReference 에 들어있다:

  • thread-safe
  • lock-free
  • 값의 원자적 교체
  • null 허용
  • 실패 시 rollback 가능
  • 암호 파라미터처럼 민감한 데이터에 적합

즉, multiprocessing / coroutine 환경에서 가장 안전하고 빠른 방식이다.


📝 결론

Kotlin에서는 Java의 AtomicReference를 사용하는 것이 정상적이며,
특히 암호 파라미터처럼 thread-safe 하고 lock-free 메모리 저장이 필요할 때
AtomicReference가 가장 적합한 선택이다.

profile
처음부터 다시 시작!!

0개의 댓글