전자정부 프레임워크에 설정 파일 중 context-idgen.xml이라는 게
전자정부 프레임워크에서 시스템 개발 시에 사용할 수 있는 유일한 ID를 생성할 수 있도록 제공하는 서비스라고 설명하고 한다. 업로드된 파일의 유일한 이름 또는 테이블의 Primary Key 역할을 할 ID를 생성하는 용도로 사용할 수 있다. ID를 생성하는 방법은 3가지가 있다.
- UUID Generation Service
- Sequence Id Generation Service
- Table Id Generation Service
UUID Generation Service
새로운 ID를 생성하기 위해 UUID 생성 알고리즘을 이용하여 16 바이트 길이의 ID를 생성한다.
String 타입의 ID 생성과 BigDecimal 타입의 ID 생성 두 가지 유형 ID 생성을 지원한다.
지원하는 방법에 따라 아래 3가지 유형이 있다.
MAC Address를 기반으로 유일한 Id를 생성하는 UUIdGenerationService
<bean name="UUIdGenerationService" class="egovframework.rte.fdl.idgnr.impl.EgovUUIdGnrService">
<property name="address">
<value>00:00:F0:79:19:5B</value>
</property>
</bean>
@Resource(name="UUIdGenerationService")
private EgovIdGnrService uUidGenerationService;
@Test
public void testUUIdGeneration() throws Exception {
assertNotNull(uUidGenerationService.getNextStringId());
assertNotNull(uUidGenerationService.getNextBigDecimalId());
}
IP Address를 기반으로 유일한 Id를 생성하는 UUIdGenerationService
<bean name="UUIdGenerationServiceWithIP" class="egovframework.rte.fdl.idgnr.impl.EgovUUIdGnrService">
<property name="address">
<value>100.128.120.107</value>
</property>
</bean>
@Resource(name="UUIdGenerationServiceWithIP")
private EgovIdGnrService uUIdGenerationServiceWithIP;
@Test
public void testUUIdGenerationIP() throws Exception {
assertNotNull(uUIdGenerationServiceWithIP.getNextStringId());
assertNotNull(uUIdGenerationServiceWithIP.getNextBigDecimalId());
}
IP Address 설정 없이 Math.random()을 이용하여 주소 정보를 생성하고 유일한 Id를 생성하는 UUIdGenerationService
<bean name="UUIdGenerationServiceWithoutAddress" class="egovframework.rte.fdl.idgnr.impl.EgovUUIdGnrService">
</bean>
@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를 지정하여 아이디를 생성할 수 있도록 하고 지원 하는 방법에 따라 아래 2가지 방법이 있다.
기본 타입 ID를 제공하는 서비스로 int,short,byte,long 유형의 ID를 제공한다.
CREATE SEQUENCE idstest MINVALUE 0;
<bean name="primaryTypeSequenceIds" class="egovframework.rte.fdl.idgnr.impl.EgovSequenceIdGnrService"
destroy-method="destroy">
<property name="dataSource" ref="dataSource"/>
<property name="query" value="SELECT idstest.NEXTVAL FROM DUAL"/>
</bean>
@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 ID를 제공하는 서비스로 기본타입 ID 제공 서비스 설정에 추가적으로 useBigDecimals을 “true”로 설정하여 BigDecimal 사용하도록 한다.
CREATE SEQUENCE idstest MINVALUE 0;
<bean name="bigDecimalTypeSequenceIds" class="egovframework.rte.fdl.idgnr.impl.EgovSequenceIdGnrService"
destroy-method="destroy">
<property name="dataSource" ref="dataSource"/>
<property name="query" value="SELECT idstest.NEXTVAL FROM DUAL"/>
<property name="useBigDecimals" value="true"/>
</bean>
@Resource(name="bigDecimalTypeSequenceIds")
private EgovIdGnrService bigDecimalTypeSequenceIds;
@Test
public void testBigDecimalTypeIdGeneration() throws Exception {
//BigDecimal
assertNotNull(bigDecimalTypeSequenceIds.getNextBigDecimalId());
}
-
DB Schema :
CREATE SEQUENCE <sequence name> [START WITH <start value>] [INCREMENT BY <increment value>] [MINVALUE <min value>] [MAXVALUE <max value>] -
Query :
SELECT <sequence name>. NEXTVAL FROM DUAL
-
DB Schema :
CREATE SEQUENCE <sequence name> [AS {INTEGER | BIGINT}] [START WITH <start value>] [INCREMENT BY <increment value>] -
Query :
SELECT NEXT VALUE FOR <sequence name> FROM DUAL
(HSQL DB는 DUAL 테이블을 제공하지 않기 때문에 하나의 row를 가진 DUAL 테이블을 수동으로 생성해야 한다.)
-
DB Schema :
CREATE SEQUENCE <sequence name> [START WITH <start value>] [INCREMENT BY <increment value>] [MINVALUE <min value>] [MAXVALUE <max value>] -
Query :
SELECT NEXT VALUE FOR <sequence name> FROM SYSIBM.SYSDUMMY1
-
Sybase는 Sequence를 지원하지 않는다.
-
MS SQL Server는 Sequence를 지원하지 않는다.
-
MySQL은 Sequence를 지원하지 않는다.
Table Id Generation Service
Table Id Generation Service는 새로운 아이디를 얻기 위해서 별도의 테이블을 생성하여 키값과 키값에 해당하는 아이디 값을 입력하여 관리해서 제공하는 서비스로 Basic Service와 prefix와 채울 문자열을 지정해서 String ID를 생성하는 Strategy Base Service를 제공한다.
아래는 전자정부 예제에 나오는 내용이다.
DB 구조
CREATE TABLE ids ( table_name varchar(16) NOT NULL,
next_id DECIMAL(30) NOT NULL,
PRIMARY KEY (table_name));
INSERT INTO IDS VALUES('RTETNCVPL', 0);
INSERT INTO IDS VALUES('RTETNFAQ', 0);
민원접수번호, FAQ접수번호를 생성 예제
// 민원접수번호
<bean name="egovCvplCnsltIdGnr"
class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService"
destroy-method="destroy">
<property name="dataSource" ref="dataSource" />
<property name="strategy" ref="mixPrefixCvplCnslt" />
<property name="blockSize" value="10"/>
<property name="table" value="ids"/>
<property name="tableName" value="RTETNCVPL"/>
</bean>
// FAQ접수번호
<bean name="egovCvplFaqIdGnr"
class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService"
destroy-method="destroy">
<property name="dataSource" ref="dataSource" />
<property name="strategy" ref="mixPrefixCvplFaq" />
<property name="blockSize" value="10"/>
<property name="table" value="ids"/>
<property name="tableName" value="RTETNFAQ"/>
</bean>
blockSize - 카운터가 몇 이후에 DB 조회를 할 것인지 설정 [ 현재 1은 카운터가 1씩 늘어날 때마다 DB 조회함..]
table - dataSoure에 설정된 db의 테이블 이름 [현재 SEQ 테이블]
tableName - dataSoure 에 설정된 DB에 SEQ 테이블에 tableName 칼럼에 참조할 값
// 민원접수번호
@Resource(name="egovCvplCnsltIdGnr")
private EgovIdGnrService egovCvplCnsltIdGnr;
// FAQ접수번호
@Resource(name="egovCvplFaqIdGnr")
private EgovIdGnrService egovCvplFaqIdGnr;
public viod test() {
String CnsltId = egovCvplCnsltIdGnr.getNextStringId();
String faqId = egovCvplFaqIdGnr.getNextStringId();
}
Strategy Base Service
아이디 생성을 위한 룰을 등록하고 룰에 맞는 아이디를 생성할 수 있도록 지원하는 서비스이다. Basic Service에 추가로 Strategy 정보를 추가 설정해서 사용이 가능하다. 단, 이 서비스는 String 타입의 ID만 가능하다.
// 민원접수번호
<bean name="egovCvplCnsltIdGnr"
class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService"
destroy-method="destroy">
<property name="dataSource" ref="dataSource" />
<property name="strategy" ref="mixPrefixCvplCnslt" />
<property name="blockSize" value="10"/>
<property name="table" value="ids"/>
<property name="tableName" value="RTETNCVPL"/>
</bean>
<bean name="mixPrefixCvplCnslt"
class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl">
<property name="prefix" value="CVPL" />
<property name="cipers" value="5" />
<property name="fillChar" value="0" />
</bean>
// FAQ접수번호
<bean name="egovCvplFaqIdGnr"
class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService"
destroy-method="destroy">
<property name="dataSource" ref="dataSource" />
<property name="strategy" ref="mixPrefixCvplFaq" />
<property name="blockSize" value="10"/>
<property name="table" value="ids"/>
<property name="tableName" value="RTETNFAQ"/>
</bean>
<bean name="mixPrefixCvplFaq"
class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl">
<property name="prefix" value="FAQ" />
<property name="cipers" value="6" />
<property name="fillChar" value="0" />
</bean>
strategy: 아래에 정의된 MixPrefix의 bean name 설정
prefix: 아이디의 앞에 고정적으로 붙이고자 하는 설정값 지정
cipers: prefix를 제외한 아이디의 길이 지정
fillChar: 0을 대신하여 표현되는 문자
// 민원접수번호
@Resource(name="egovCvplCnsltIdGnr")
private EgovIdGnrService egovCvplCnsltIdGnr;
// FAQ접수번호
@Resource(name="egovCvplFaqIdGnr")
private EgovIdGnrService egovCvplFaqIdGnr;
public viod test() {
//int
int itnIdg = basicService.getNextIntegerId();
//short
short shortIdg= basicService.getNextShortId();
//byte
byte byteIdg = basicService.getNextByteId();
//long
long longIdg = basicService.getNextLongId();
//BigDecimal
BigDecimal bigIdg = basicService.getNextBigDecimalId();
//String
String strIdg= basicService.getNextStringId();
}
참고사이트
www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:fdl:id_generation
'dev > 스프링' 카테고리의 다른 글
스프링부트3 - ORM, JPA or 하이버네이트, 스프링데이터 or 스프링데어티 JPA (0) | 2024.02.14 |
---|---|
스프링부트3 - 테스트케이스 작성, junit @test작성, AssertJ (0) | 2024.02.02 |
[eclipse] export, import, maven 프로젝트 변환 (0) | 2021.01.28 |
[maven] GroupId, ArtifactId, Version (0) | 2021.01.27 |