본문 바로가기
개발/자바

Spring JDBC에서 새로운 엔티티를 insert하고, 자동 생성된 ID(PK) 받기

by mabyoungg 2025. 8. 3.

"PreparedStatement 생성 시 자동 생성 키를 반환하라는 옵션  설정: setReturnGeneratedKeys(true)"

 

구버전 프로젝트에서 keyHolder.getKey()의 값이 항상 null이 되며, .longValue()를 호출하면 NullPointerException 발생

 

1. JDBC 스펙은 자동 생성 키를 요청한 경우에만 Statement 또는 PreparedStatement에 getGeneratedKeys()를 통해 값을 돌려주도록 정의

2. 따라서 prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) 또는 Spring JDBC에서 같은 역할을 하는 PreparedStatementCreatorFactory#setReturnGeneratedKeys(true) 를 지정하지 않으면 드라이버는 키를 수집하지 않음

3. 반환 플래그를 주면 드라이버가 내부적으로 INSERT 실행과 동시에 생성된 키를 메모리에 보존해 getGeneratedKeys()로 즉시 전달

 

KeyHolder keyHolder = new GeneratedKeyHolder();
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(
        "insert into User (name, createdAt) values (?, ?)",
        Types.VARCHAR, Types.TIMESTAMP
);
factory.setReturnGeneratedKeys(true);
PreparedStatementCreator psc = factory.newPreparedStatementCreator(
        Arrays.asList(name, timestamp)
);
jdbcTemplate.update(psc, keyHolder);
Long id = keyHolder.getKey().longValue();