UUID PK 생성
@Id @GeneratedValue(generator = "uuid2")
@GenericGenerator(name="uuid2", strategy = "uuid2")
@Column(columnDefinition = "BINARY(16)")
private UUID id;
- uuid와 uuid2의 차이점은 uuid는 RFC 4122 호환안됨 -> warn로그 쌓임
- BINARY(16)은 저장할 때 남는 길이는 RPAD 처리하고 저장하기때문에 예상치 못한값이 들어가고 조회할 수 없다.(필수설정)
spring Data JPA를 통한 CRUD는 전부 지원해 주는것 같다.
JDBCTemplate를 활용해서 batchInsert/Update 시에 UUID 사용하기
기본적으로 아이디 채번방식이 SEQUENCE를 제외하면 saveAll을 사용해도 bulkInsert/Update쿼리가 날라가지 않는다.(row갯수만큼 쿼리 요청이 간다) 이는 성능적인 측면에서 I/O가 많이 발생하고 애플리케이션서버에서 감당해야할 부하를 DB서버에서 감당해야하기때문에 좋지않다. 그래서 JPA가 아닌 JdbcTemplate를 사용해서 bulkInsert를 진행하는 방법이 있다.
uuid는 db에 들어갈때 16진수(hex)로 들어가기때문에 조회 쿼리를 다음과 같이 사용한다.
select * from table where id = unhex(replace('2f1c7db8-0012-43b6-b5e8-d2d4bed600a0','-',''));
그렇다면 insert 쿼리또한 다음과 같이 나간다.
INSERT INTO table(id) VALUES (UNHEX(REPLACE('77d521d4-0329-47eb-b644-3d46b6c67b01','-','')));
이제 자바코드로 위 쿼리를 풀어내야한다.JDBC에(batchInsert/Update)를 사용해야한다면...
private final JdbcTemplate jdbcTemplate;
public void batchInsertTable(List<Table> table) {
jdbcTemplate.batchUpdate("INSERT INTO Table (id) VALUES (?)",
new BatchPreparedStatementSetter() {
@Override
public void setValues(@NotNull PreparedStatement ps, int i) throws SQLException {
ps.setBytes(1, DatatypeConverter.parseHexBinary(table.get(i).getId().toString().replace("-", "")));
}
@Override
public int getBatchSize() {
return table.size();
}
});
}
'Springboot' 카테고리의 다른 글
Gradle 정리 (0) | 2023.08.17 |
---|---|
Spring boot AOP 사용시 request, response 객체 사용하기 (0) | 2023.08.17 |
CSRF 보호가 작동하는 방식 (0) | 2023.08.17 |
Bucket4j 기본 개념 (Spring boot Rate Limiter (0) | 2023.08.17 |
Spring boot 백엔드 아키텍쳐 Infra Layer (0) | 2023.08.17 |