전자정부 프레임워크 Wiki 에서는 시스템 개발시에 사용할 수 있는 유일한 ID를 생성할 수 있도록 제공하는 서비스라고 설명하고 있다. 업로드된 파일의 유일한 이름 또는 테이블의 Primary Key 역할을 할 ID를 생성하는 용도로 사용할 수 있다. ID를 생성하는 방법은 3가지가 있다.
- UUID Generation Service
- Sequence Id Generation Service
- Table Id Generation Service
Table Id Generation Service 에 대해서 알아보자. Table Id Generation Service 는 새로운 아이디를 얻기 위해서 별도의 테이블을 생성하여 키값과 키값에 해당하는 아이디값을 입력하여 관리해서 제공하는 서비스로 Basic Service 와 prefix 와 채울 문자열을 지정해서 String ID 를 생성하는 Strategy Base Service 를 제공한다.
Basic Service
1. 먼저 사용하고자 하는 시스템의 DB에 다음코드를 실행해서 테이블을 생성하자
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');
- ids는 ID를 관리하고자 하는 테이블 명이다.
- table_name 에는 ID값을 사용하고자 하는 테이블별로 값을 지정한다.
- next_id 는 마지막 ID값이다. 이 값이 1씩 증가하게 된다.
2. 프로젝트의 /src/main/resources/egoframework/spring/com/context-idgen.xml 에 다음 코드를 입력한다.
<bean name="basicService" class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService" destroy-method="destroy"> <property name="dataSource" ref="dataSource"/> <property name="blockSize" value="10"/> <property name="table" value="ids"/> <property name="tableName" value="id"/> </bean>
- dataSource 는 /src/main/resources/egoframework/spring/com/context-datasource.xml 에 정의한 빈의 id 값이다.
- blockSize 는 Id Generation 내부적으로 사용하는 정보로 ID 요청시 지정된 횟수가 될 경우만 DB에 접근해서 업데이트 한다.
- table 은 ID값을 관리하는 테이블 명이다.
- tableName 은 table 에서 지정한 테이블이 관리하는 각 테이블의 고유 값이다.
즉, ids 라고 하는 테이블에 table_name 필드의 값이 id 인 행의 필드 next_id 의 값을 가져온다.
3. 소스에서 사용
@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만 가능하다.
1. /src/main/resources/egoframework/spring/com/context-idgen.xml 에 추가로 다음 코드를 삽입한다.
<bean name="strategy" class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl"> <property name="prefix" value="TEST-"/> <property name="cipers" value="5"/> <property name="fillChar" value="*"/> </bean>
위 코드가 추가된 소스는 다음과 같다.
<bean name="Ids-TestWithGenerationStrategy" class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService" destroy-method="destroy"> <property name="dataSource" ref="dataSource"/> <property name="strategy" ref="strategy"/> <property name="blockSize" value="1"/> <property name="table" value="idttest"/> <property name="tableName" value="test"/> </bean> <bean name="strategy" class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl"> <property name="prefix" value="TEST-"/> <property name="cipers" value="5"/> <property name="fillChar" value="*"/> </bean>
- strategy 는 아래에 정의된 MixPrefix 의 빈 이름이다.
- prefix 는 ID 앞에 고정적으로 붙이고자 하는 문자열이다.
- cipers 는 prefix를 제외한 ID의 길이이다.
- fillChar 은 0을 대신해서 표현될 문자이다.
ID 값이 1 인 경우 위의 설정이 적용되면 'TEST-****1' 이 된다.