EntityQL로 OneToMany (1:N) Bulk Insert 구현하기

• EntityQL은 JPA 기반이 아니기 때문에 OneToMany와 같은 연관관계 Insert/Update 등은 직접 구현해야 한다. 이를 위해 JDBC 스펙에 있는 'generatedKeys()'를 사용하여 부모 Entity를 모아 bulk insert한 후, 그 결과로 채번된 id들을 리턴받아 자식 Entity를 생성하여 bulk insert하는 과정을 거친다.
• JDBC의 'getGeneratedKeys()'는 Querydsl-SQL에서는 'executeWithKeys' 메소드로 사용할 수 있으며, 이 메소드는 JdbcTemplate에는 구현되어 있지 않다. 이 메소드를 사용하면 방금 batch insert가 된 값들의 채번된 Key들을 리턴 받을 수 있다.
• SimpleJdbcInsert의 `executeBatch`와 `executeAndReturnKey`를 이용해 oneToMany bulk insert를 구현하려 했지만, 전자는 특정 컬럼 지정이 불가능하고, 후자는 단일 row만 가능하여 구현하지 못했다. 대신, 부모 Entity를 bulk insert하기 전에 UUID를 발급하여 임시 컬럼에 저장하고, 이를 기반으로 부모 PK값과 자식 Entity들을 매핑하는 방식을 사용했다.
• 이를 위해 AcademyAndStudentBulkRepository에서는 전체 bulk insert flow를 담당하고, AcademyMatcherRepository에서는 bulk insert 후 return된 Academy.id를 통해 Academy.UUID를 조회한다. 마지막으로 AcademyUniqueMatcher에서는 AcademyMatcherRepository를 통해 조회된 UUID를 기반으로 부모 Entity와 자식 Entity를 매칭한다.

북마크
공유하기
신고하기