웹프로그래밍으로 돈벌이를 하고 있는 본인은 늦었지만 요즘 JPA를 경험하고 있다.
기본적인 내용들은 검색을 하면 많이 알 수 있지만, 곳곳에 필요한 특정 내용은 쉽게 찾을 수가 없었다.
그런 내용 중에 시행착오를 격으며 성공한 방법을 남겨서 나와 같은 어려움에 처한 개발자들에게 도움이 되고자 한다.
JPA Entity를 생성할 때, 개발자가 정의한 방법으로 ID를 생성하는 방법에 대해서 기술하고자 한다.
Custom ID Generator를 만들기 위해서는 IdentifierGenerator, Configurable Class를 구현하면 가능하다.
두 Class모두 org.hibernate.id package에 있으며 IdentifierGenerator Class는 실제로 ID를 생성하는 로직을 구현. Configurable Class는 ID생성을 위해 필요한 속성값을 처리한다.
아래의 예제 소스코드는 JDBC 를 통해 SQL로 ID를 생성한다.
(DB의 시퀀스를 사용하는 방법은 @SequenceGenerator가 있다. 이 방법은 구글에서 검색하면 바로 관련 내용을 찾아볼 수가 있으니 참고하자)
각설하고 실제 소스코드를 보면서 알아보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
public class IdGenerator implements IdentifierGenerator, Configurable {
// 속성값 처리를 위한 Const
public static final String METHOD = "method";
...
// 전달받은 속성값
private String method;
// 속성값 처리 메소드 override
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
method = ConfigurationHelper.getString(METHOD, params);
....
}
// ID 생성 처리 메소드 override
@Override
public Serializable generate(SharedSessionContractImplementor session, Object obj) {
String sql = null;
switch(method) {
case "SEQUENCE":
sql = "SELECT " + sequenceName + ".NEXTVAL FROM DUAL":
break;
default;
break;
}
// JDBC Connection
Connection con = null;
try {
con = session.getJdbcConnectionAccess().obtainConnection(); // 공유세션으로부터 jdbc connection을 얻는다
CallableStatement callStatement = con.prepareCall(sql);
callStatement.executeQuery(); // SQL를 실행
Result rs = callStatement.getResultSet();
if(rs.next()) {
newId = rs.getString(1); // 결과값 추출
}
} catch (SQLException sqlException) {
throw new HibernateException(sqlException);
} finally {
try {
if(!con.isClosed()) {
con.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
return newId;
}
}
|
cs |
위의 소스코드를 보면 2가지 메소드가 있다. 하나는 ID Generator를 사용할 때, 필요한 속성값들을 처리하는 configure 메소드, 나머지 하나는 실제로 Id를 생성하는 generate 메소드이다.
이렇게 작성한 Id Generator를 어떻게 쓰는지 코드로 보자.
Entity 내에서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Getter
@Setter
@Entity(name = "TB_USER")
public class USER {
@GenericGenerator(name = "idGenerator", strategy = "com.jpa.IdGenerator",
parameters = {@Parameter(name = IdGenerator.METHOD, value = "SEQUENCE")})
@GeneratedValue(generator = "idGenerator")
@Column
private String userId
....
}
|
cs |
@GenericGenerator 를 사용하여 Generator를 정의한다.
name은 개발자가 임의로 정의하고, @GeneratedValue에서 사용한다.
strategy는 위의 IdGenerator가 위치해 있는 package와 Class 경로를 입력한다.
parameters는 필요한 속성값을 정의한다.
위의 소스코드를 보면 GenericGenerator annotation과 generatedValue annotation을 사용하고 있다. ID 생성이 필요한 컬럼 속성값 위에 정의하면 사용할 수 있다.
생성되는 ID는 새로운 Entity객체를 생성하고, Persist가 되는 단계에 개발된 Generator가 동작하게 된다.
짜임새 있게 기술하지는 않았지만, JPA를 하고 있는 개발자들은 보면 알 수 있을 것이라고 생각된다.
'프로그래밍(JPA)' 카테고리의 다른 글
DB Table 정보로 Entity 정보 생성하는 Java service 개발하기 (0) | 2020.09.26 |
---|---|
Entity Relation 시, ID Generator로 생성한 ID FK로 자동 할당하기 (0) | 2020.09.19 |