ID로서의 도메인 객체는 몇 가지 복잡하고 미묘한 문제를 만듭니다
직렬화 / 직렬화
객체를 키로 저장하면 객체 그래프를 직렬화하는 것이 매우 복잡합니다. stackoverflow
재귀로 인해 JSON 또는 XML로 순진 직렬화를 수행 하면 오류가 발생합니다. 그런 다음 실제 인스턴스를 객체 인스턴스를 직렬화하고 재귀를 생성하는 대신 ID를 사용하도록 변환하는 사용자 정의 직렬 변환기를 작성해야합니다.
유형 안전을 위해 객체를 전달하고 ID 만 저장하면 관련 엔터티가 호출 될 때 지연로드하는 접근 자 메서드를 가질 수 있습니다. 2 단계 캐싱은 후속 호출을 처리합니다.
미묘한 참조 누출 :
생성자에서 도메인 객체를 사용하는 경우 순환 참조를 작성하면 실제로 사용되지 않는 객체에 대해 메모리를 회수하기가 매우 어려워집니다.
이상적인 상황 :
불투명 ID vs int / long :
는 id
이 식별 무엇인지에 대한 정보를 전달하지 않는 완전히 불투명 식별자해야한다. 그러나 시스템에서 유효한 식별자인지 확인해야합니다.
원시 유형은 이것을 깨뜨립니다.
int
, long
및 String
RDBMS 시스템의 식별자에 대한 가장 일반적으로 사용되는 원료 유형입니다. 수십 년 전으로 거슬러 올라간 실질적인 이유의 오랜 역사가 있으며, 모두 저축 space
이나 저축 time
또는 둘 다에 적합한 타협입니다 .
순차적 ID는 최악의 범죄자입니다.
순차 ID를 사용하면 기본적으로 시간적 의미 정보를 ID로 압축합니다. 그것이 사용될 때까지 나쁘지 않습니다 . 사람들이 ID의 의미 품질을 정렬하거나 필터링하는 비즈니스 로직을 작성하기 시작하면 미래의 관리자에게 고통의 세계를 설정합니다.
String
순진한 설계자들은 정보를 내용, 특히 시간적 의미론으로 포장 할 것이기 때문에 필드는 문제가된다.
이러한 있기 때문에,뿐만 아니라 분산 데이터 시스템을 구축하는 것은 불가능 할 12437379123
것입니다 없는 독특한 세계가. 분산 시스템의 다른 노드가 시스템에서 충분한 데이터를 얻을 때 같은 수의 레코드를 작성할 가능성은 거의 보장됩니다.
그런 다음 해킹이 해결되기 시작하고 전체가 엉망진창으로 쌓입니다.
거대한 분산 시스템 ( 클러스터 )을 무시하면 다른 시스템과 데이터를 공유하려고 할 때 완전한 악몽이됩니다. 특히 다른 시스템을 제어 할 수없는 경우.
ID를 전 세계적으로 고유하게 만드는 방법과 똑같은 문제가 발생합니다.
UUID는 다음과 같은 이유로 작성 및 표준화되었습니다.
UUID
Version
사용 하는 것에 따라 위에 나열된 모든 문제가 발생할 수 있습니다.
Version 1
MAC 주소와 시간을 사용하여 고유 한 ID를 만듭니다. 위치와 시간에 대한 의미 정보를 전달하기 때문에 나쁘다. 순진한 개발자가 비즈니스 논리를 위해 해당 정보에 의존하기 시작하는 것은 그 자체가 문제가 아닙니다. 또한 침입 시도에 악용 될 수있는 정보가 유출됩니다.
Version 2
사용하는 사용자 UID
또는 GID
domian 및 UID
또는 GUI
에서 시간 대신에 Version 1
이 나쁜대로입니다 Version 1
데이터 유출에 대한이 정보를 위험이 비즈니스 로직에 사용되는.
Version 3
비슷하지만 MAC 주소와 시간을 의미 적으로 의미가있는 어떤 것의 MD5
일부 해시로 대체합니다 byte[]
. 걱정할 데이터 누출이 없으므로 byte[]
에서 복구 할 수 없습니다 UUID
. 이를 통해 UUID
인스턴스 형식과 외부 키 를 결정적으로 만드는 좋은 방법을 제공합니다 .
Version 4
좋은 솔루션 인 난수만을 기반으로하며 의미 정보를 전혀 가지고 있지 않지만 결정적으로 다시 만들 수는 없습니다.
Version 5
그냥 Version 4
이지만 sha1
대신 사용 합니다 md5
.
도메인 키 및 트랜잭션 데이터 키
도메인 개체 ID에 대한 선호는 기술적 인 이유로 사용 Version 5
또는 사용 Version 3
이 제한된 경우 Version 5
입니다.
Version 3
많은 컴퓨터에 분산 될 수있는 트랜잭션 데이터에 적합합니다.
공간에 제약을받지 않는 한 UUID를 사용하십시오.
그것들은 고유 한 것으로 보장되어 한 데이터베이스에서 데이터를 덤프하고 다른 데이터베이스로 다시로드하므로 실제로 다른 도메인 데이터를 참조하는 중복 ID에 대해 걱정할 필요가 없었습니다.
Version 3,4,5
완전히 불투명하고 그것이 있어야하는 방식입니다.
a를 사용하여 단일 키를 기본 키로 UUID
가질 수 있으며 자연 복합 기본 키에 대한 복합 고유 인덱스를 가질 수 있습니다.
스토리지 않습니다 되지 해야 CHAR(36)
하나. UUID
색인을 생성 할 수있는 한 주어진 데이터베이스의 고유 바이트 / 비트 / 번호 필드에을 저장할 수 있습니다 .
유산
원시 유형이 있고이를 변경할 수없는 경우에도 코드에서 추상화 할 수 있습니다.
사용 Version 3/5
의 UUID
당신은에 전달할 수 Class.getName()
+ String.valueOf(int)
A와 byte[]
하고 다시 작성할과 결정적 불투명 참조 키가 있습니다.