====== 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()); } [[http://192.168.100.11:8090/svn/eGovFramework/RTE/DEV/trunk/Foundation/egovframework.rte.fdl.idgnr/src/test/java/egovframework/rte/fdl/idgnr/EgovUUIdGnrServiceTest.java|소스보기]] ==== 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()); }