자바 스프링 부트 환경에서 데이터베이스 연동을 위해 JPA(Hibernate)와 MyBatis가 가장 많이 사용되지만, 프로젝트의 성격(성능, 복잡도, 패러다임)에 따라 다른 훌륭한 대안들이 존재합니다.
대표적인 라이브러리들을 카테고리별로 정리해 드립니다.
JPA의 복잡함(영속성 컨텍스트, 지연 로딩, 더티 체킹 등)을 덜어내고, MyBatis의 번거로운 SQL 관리를 개선하기 위해 나온 프로젝트입니다.
Repository 인터페이스를 제공하지만, 훨씬 단순합니다.스프링 프레임워크의 가장 기본적인 JDBC 추상화 라이브러리입니다.
SQL을 자바 코드로 작성할 수 있게 해주는 데이터베이스 매핑 라이브러리입니다.
비동기(Non-blocking) 애플리케이션을 위한 리액티브 관계형 데이터베이스 연동 라이브러리입니다.
엄밀히 말하면 독립적인 연동 라이브러리라기보다 JPA나 SQL 위에서 동적 쿼리를 작성하게 돕는 빌더입니다.
JPA와 유사한 ORM이지만, 아키텍처가 조금 다른 대안 라이브러리입니다.
| 라이브러리 | SQL 작성 방식 | 주요 특징 | 추천 상황 |
|---|---|---|---|
| Spring Data JDBC | 직접 작성/자동 | 단순함, 가벼움 | 복잡하지 않은 도메인 모델 |
| JdbcTemplate | 직접 작성 (String) | 기본 중의 기본, 제어권 최상 | 단순 작업, 성능 우선 |
| jOOQ | 자바 코드 (Type-safe) | SQL의 객체화, 안정성 고점 | 복잡한 쿼리가 많은 대형 프로젝트 |
| R2DBC | 직접 작성/자동 | 비동기, Non-blocking | 리액티브 시스템 (WebFlux) |
| Querydsl | 자바 코드 (Type-safe) | JPA의 단짝, 동적 쿼리 최강 | JPA 사용 시 필수 보조 도구 |
만약 MyBatis의 SQL 직접 제어 능력과 JPA의 생산성 사이에서 고민 중이시라면 jOOQ나 Spring Data JDBC를 검토해 보시는 것을 추천드립니다.
제시하신 두 가지 요구사항(다량의 데이터 벌크 인서트 + 프로시저 실행)을 충족하기 위해 가장 적합한 라이브러리는 **JdbcTemplate (Spring JDBC)**입니다.
그 이유와 구현 전략을 상세히 설명해 드립니다.
요구사항 1: 다량의 데이터 동적 Insert (Bulk Insert)
IDENTITY 식별자 전략을 쓸 경우 JDBC 수준의 batch insert가 비활성화되어 성능이 매우 떨어집니다.<foreach>를 사용하면 쿼리 문자열이 너무 길어져 파라미터 수 제한에 걸리거나 메모리 이슈가 발생할 수 있습니다.batchUpdate() 기능을 통해 수천~수만 건의 데이터를 하나의 네트워크 호출로 묶어서 보낼 수 있어 가장 빠릅니다. SQL을 직접 제어하므로 동적 생성도 자유롭습니다.요구사항 2: 프로시저 실행
SimpleJdbcCall이라는 강력한 유틸리티를 제공하여, 프로시저의 입출력 파라미터를 매우 직관적으로 다룰 수 있습니다.단순히 for문을 돌려 insert를 여러 번 실행하는 것이 아니라, batchUpdate를 사용해야 합니다.
public void bulkInsert(List<MyData> dataList) {
String sql = "INSERT INTO my_table (col1, col2) VALUES (?, ?)"; // 동적으로 구성 가능
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, dataList.get(i).getCol1());
ps.setString(2, dataList.get(i).getCol2());
}
@Override
public int getBatchSize() {
return dataList.size();
}
});
}
rewriteBatchedStatements=true (MySQL 기준) 옵션을 추가하면 성능이 극대화됩니다.SimpleJdbcCall을 사용하면 코드가 매우 깔끔해집니다.
public void executeProcedure(String paramValue) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("cleanup_procedure_name");
SqlParameterSource in = new MapSqlParameterSource()
.addValue("input_param", paramValue);
jdbcCall.execute(in);
}
| 라이브러리 | 벌크 인서트 성능 | 프로시저 호출 | 적합성 |
|---|---|---|---|
| JdbcTemplate | 최상 (Native Batch) | 매우 편리 | 가장 추천 |
| MyBatis | 상 (Batch Executor 사용 시) | 편리함 | 추천 (단, 설정이 JdbcTemplate보다 많음) |
| JPA (Hibernate) | 하 (Batch 처리가 까다로움) | 보통 | 비추천 (대량 데이터 처리에 부적합) |
| jOOQ | 상 (Type-safe함) | 매우 편리 | 추천 (단, 러닝커브와 유료 라이선스 고려 필요) |
JdbcTemplate을 사용하십시오.
spring-boot-starter-jdbc만 의존성에 있으면 바로 사용 가능합니다.만약 SQL을 자바 코드로 타입 안정성 있게 관리하고 싶다면 jOOQ가 두 번째 대안이 될 수 있지만, 단순히 위 두 가지 작업이 주 목적이라면 JdbcTemplate이 가장 효율적인 선택입니다.