====== Id Generation 서비스 ====== ===== 개요 ===== 시스템을 개발할 때 필요한 유일한 ID를 생성하기 위해 사용하도록 서비스한다. ==== 주요 개념 ==== === Universally Unique Identifier(UUID) === UUID는 OSF(Open Software Foundation)에 의해 제정된 고유식별자(Identifier)에 대한 표준이다. UUID는 16-byte (128-bit)의 숫자로 구성된다.\\ UUID를 표현하는 방식에 대한 특별한 규정은 없으나, 일반적으로 아래와 같이 16진법으로 8-4-4-4-12 형식으로 표현한다. 550e8400-e29b-41d4-a716-446655440000 UUID 표준은 아래 문서에 기술되어 있다. * [[http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=2229|ISO/IEC 11578:1996 "Information technology -- Open Systems Interconnection -- Remote Procedure Call (RPC)"]] * [[http://www.itu.int/ITU-T/studygroups/com17/oid.html|ITU-T Rec. X.667 | ISO/IEC 9834-8:2005]] * [[http://tools.ietf.org/html/rfc4122|IETF Proposed Standard RFC 4122]] UUID는 다음 5개의 Version이 존재한다. * Version 1 (MAC Address)\\ : UUID를 생성시키는 컴퓨터의 MAC 어드레스와 시간 정보를 이용하여 UUID를 생성한다. 컴퓨터의 MAC 어드레스를 이용하므로 어떤 컴퓨터에서 생성했는지 정보가 남기 때문에 보안에 문제가 있다. * Version 2 (DCE Security)\\ : POSIX UID를 이용하여 UUID를 생성한다. * Version 3 (MD5 Hash)\\ : URL로부터 MD5를 이용하여 UUID를 생성한다. * Version 4 (Random)\\ : Random Number를 이용하여 UUID를 생성한다. * Version 5 (SHA-1 Hash)\\ : SHA-1 Hashing을 이용하여 UUID를 생성한다. ===== 설명 ===== ID 생성 방식으로는 [[#Universally Unique Identifier(UUID)|UUID]]를 생성하는 [[#UUID Generation Service]]와 sequence를 활용하는 [[#Sequence Id Generation Service]], 그리고 키제공을 위한 테이블을 지정하여 생성하는 [[#Table Id Generation Service]] 3가지가 있다. ==== UUID Generation Service ==== 새로운 ID를 생성하기 위해 UUID 생성 알고리즘을 이용하여 16 바이트 길이의 ID를 생성한다. String 타입의 ID 생성과 BigDecimal 타입의 ID 생성 두가지 유형 ID 생성을 지원한다.\\ 지원하는 방법은 설정에 따라서 [[#Mac Address Base Service]] , [[#IP Address Base Service]] , [[#No Address Base Service]] 세가지 유형이 있다. === Mac Address Base Service === MAC Address를 기반으로 유일한 Id를 생성하는 UUIdGenerationService == Configuration == 00:00:F0:79:19:5B == Sample Source == @Resource(name="UUIdGenerationService") private EgovIdGnrService uUidGenerationService; @Test public void testUUIdGeneration() throws Exception { assertNotNull(uUidGenerationService.getNextStringId()); assertNotNull(uUidGenerationService.getNextBigDecimalId()); } === IP Address Base Service === IP Address를 기반으로 유일한 Id를 생성하는 UUIdGenerationService == Configuration == 100.128.120.107 == Sample Source == @Resource(name="UUIdGenerationServiceWithIP") private EgovIdGnrService uUIdGenerationServiceWithIP; @Test public void testUUIdGenerationIP() throws Exception { assertNotNull(uUIdGenerationServiceWithIP.getNextStringId()); assertNotNull(uUIdGenerationServiceWithIP.getNextBigDecimalId()); } === No Address Base Service === IP Address 설정없이 Math.random()을 이용하여 주소정보를 생성하고 유일한 Id를 생성하는 UUIdGenerationService == Configuration == == Sample Source == @Resource(name="UUIdGenerationServiceWithoutAddress") private EgovIdGnrService uUIdGenerationServiceWithoutAddress; @Test public void testUUIdGenerationNoAddress() throws Exception { assertNotNull(uUIdGenerationServiceWithoutAddress.getNextStringId()); assertNotNull(uUIdGenerationServiceWithoutAddress.getNextBigDecimalId()); } ==== Sequence Id Generation Service ==== 새로운 ID를 생성하기 위해 Database의 SEQUENCE를 사용하는 서비스이다. 서비스를 이용하는 시스템에서 Query를 지정하여 아이디를 생성할 수 있도록 하고 [[#Basic Type Service]]와 [[#BigDecimal Type Service]] 두가지를 지원한다. === Basic Type Service === 기본타입 ID를 제공하는 서비스로 int,short,byte,long 유형의 ID를 제공한다. == DB Schema == CREATE SEQUENCE idstest MINVALUE 0; == Configuration == == Sample Source == @Resource(name="primaryTypeSequenceIds") private EgovIdGnrService primaryTypeSequenceIds; @Test public void testPrimaryTypeIdGeneration() throws Exception { //int assertNotNull(primaryTypeSequenceIds.getNextIntegerId()); //short assertNotNull(primaryTypeSequenceIds.getNextShortId()); //byte assertNotNull(primaryTypeSequenceIds.getNextByteId()); //long assertNotNull(primaryTypeSequenceIds.getNextLongId()); } === BigDecimal Type Service === BigDecimal ID를 제공하는 서비스로 [[#Basic Type Service|기본타입 ID 제공 서비스]] 설정에 추가적으로 useBigDecimals을 "true"로 설정하여 BigDecimal 사용하도록 한다. == DB Schema == CREATE SEQUENCE idstest MINVALUE 0; == Configuration == == Sample Source == @Resource(name="bigDecimalTypeSequenceIds") private EgovIdGnrService bigDecimalTypeSequenceIds; @Test public void testBigDecimalTypeIdGeneration() throws Exception { //BigDecimal assertNotNull(bigDecimalTypeSequenceIds.getNextBigDecimalId()); } === Database 별 설정 === == Oracle == * DB Schema :\\ %%CREATE SEQUENCE [START WITH ] [INCREMENT BY ] [MINVALUE ] [MAXVALUE ]%% * Query :\\ SELECT .NEXTVAL FROM DUAL == HSQL == * DB Schema :\\ %%CREATE SEQUENCE [AS {INTEGER | BIGINT}] [START WITH ] [INCREMENT BY ]%% * Query :\\ SELECT NEXT VALUE FOR FROM DUAL\\ (HSQL DB는 DUAL 테이블을 제공하지 않기 때문에 하나의 row를 가진 DUAL 테이블을 수동으로 생성해야 한다.) == IBM DB2 == * DB Schema :\\ %%CREATE SEQUENCE [START WITH ] [INCREMENT BY ] [MINVALUE ] [MAXVALUE ]%% * Query :\\ SELECT NEXT VALUE FOR FROM SYSIBM.SYSDUMMY1 == Sybase == * Sybase는 Sequence를 지원하지 않는다. == MS SQL Server== * MS SQL Server는 Sequence를 지원하지 않는다. == MySQL == * MySQL은 Sequence를 지원하지 않는다. ==== Table Id Generation Service ==== 새로운 아이디를 얻기 위해서 별도의 테이블을 생성하여 키값과 키값에 해당하는 아이디값을 입력하여 관리하여 제공하는 서비스로 table_name(CHAR 또는 VARCHAR타입), next_id(integer 또는 DECIMAL type)와 같이 두 칼럼을 필요로 한다. 별도의 테이블에 설정된 정보만을 사용하여 제공하는 [[#Basic Service]]와 prefix와 채울 문자열을 지정하여 String ID를 생성할 수 있는 [[#Strategy Base Service]]를 제공한다. === Basic Service === 테이블에 지정된 정보에 의해서 아이디를 생성하는 서비스로 사용하고자 하는 시스템에서 테이블을 생성해서 사용할 수 있다. == DB Schema == CREATE TABLE ids ( table_name varchar(16) NOT NULL, next_id DECIMAL(30) NOT NULL, PRIMARY KEY (table_name) ); INSERT INTO ids VALUES('id','0'); * ID Generation 서비스를 쓰고자 하는 시스템에서 미리 생성해야 할 DB Schema 정보임. == Configuration == * blockSize: Id Generation 내부적으로 사용하는 정보로 ID 요청시마다 DB접속을 하지 않기 위한 정보(지정한 횟수 마다 DB 접속 처리) * table: 생성하는 테이블 정보로 사용처에서 테이블명 변경 가능 * tableName: 사용하고자 하는 아이디 개별 인식을 위한 키 값(대개의 경우는 테이블 별로 아이디가 필요하기에 tableName이라고 지정함) == Sample Source == @Resource(name="basicService") private EgovIdGnrService basicService; @Test public void testBasicService() throws Exception { //int assertNotNull(basicService.getNextIntegerId()); //short assertNotNull(basicService.getNextShortId()); //byte assertNotNull(basicService.getNextByteId()); //long assertNotNull(basicService.getNextLongId()); //BigDecimal assertNotNull(basicService.getNextBigDecimalId()); //String assertNotNull(basicService.getNextStringId()); } === Strategy Base Service === 아이디 생성을 위한 룰을 등록하고 룰에 맞는 아이디를 생성할 수 있도록 지원하는 서비스로 위의 Basic Service에서 추가적으로 Strategy정보 설정을 추가하여 사용 할 수 있다. 단, 이 서비스는 String 타입의 ID만을 제공한다. == DB Schema == CREATE TABLE idttest( table_name varchar(16) NOT NULL, next_id DECIMAL(30) NOT NULL, PRIMARY KEY (table_name) ); INSERT INTO idttest VALUES('test','0'); * ID Generation 서비스를 쓰고자 하는 시스템에서 미리 생성해야 할 DB Schema 정보임. == Configuration == * strategy: 아래에 정의된 MixPrefix 의 bean name 설정 * prefix: 아이디의 앞에 고정적으로 붙이고자 하는 설정값 지정 * cipers: prefix를 제외한 아이디의 길이 지정 * fillChar: 0을 대신하여 표현되는 문자 == Sample Source == @Resource(name="Ids-TestWithGenerationStrategy") private EgovIdGnrService idsTestWithGenerationStrategy; @Test public void testIdGenStrategy() throws Exception { initializeNextLongId("test", 1); // prefix : TEST-, cipers : 5, fillChar :*) for (int i = 0; i < 5; i++) assertEquals("TEST-****" + (i + 1), idsTestWithGenerationStrategy.getNextStringId()); }