Springboot

spring data JPA에서 Pk를 UUID로 관리해 보자

25G 2023. 8. 17. 19:26

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();
                    }
                });
    }