SPRING
2020.02.05 / 11:16

[eGovFrame] Table Id Generation Service

코로나
추천 수 13

전자정부 프레임워크 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' 이 된다.



출처: https://roadrunner.tistory.com/410 [삶의 조각들]