본문 바로가기

전지적라온시점

MyBatis에서 자동 생성된 PK값 조회하기 – useGeneratedKeys vs selectKey 완전 정리 본문

Development/Mybatis

MyBatis에서 자동 생성된 PK값 조회하기 – useGeneratedKeys vs selectKey 완전 정리

최라온 2025. 5. 20. 21:35
728x90
반응형
SMALL

MyBatis에서 자동 생성된 PK값 조회하기 – useGeneratedKeys vs selectKey 완전 정리

데이터베이스에 INSERT 쿼리를 실행한 후, 자동 생성된 PK(primary key) 값을 Java 객체로 가져오는 방법은 MyBatis 실무에서 자주 쓰이는 기능입니다. MyBatis에서는 useGeneratedKeysselectKey 두 가지 방법으로 이를 지원합니다. 이 글에서는 두 방식의 차이점, 사용법, 주의사항을 예제를 통해 명확히 설명합니다.

1. 전제 조건 – PK 자동 생성

MyBatis에서 PK를 자동으로 가져오기 위해서는 DB에서 auto_increment 또는 sequence 같은 자동 생성 메커니즘이 설정되어 있어야 합니다. 또한, Java 객체에 해당 필드가 있어야 하고 setter도 필요합니다.

2. useGeneratedKeys 방식 (MySQL 등)

MySQL, H2, MariaDB 등은 JDBC의 getGeneratedKeys 기능을 지원하므로 useGeneratedKeys를 사용할 수 있습니다.

예: UserMapper.java

@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insertUser(User user);

설명

  • useGeneratedKeys = true: JDBC에서 생성된 키를 반환하도록 설정
  • keyProperty = "id": Java 객체의 필드명
  • 조건: DB에서 해당 컬럼이 auto_increment 되어 있어야 함

3. selectKey 방식 (Oracle, PostgreSQL 등)

Oracle, PostgreSQL 등은 JDBC 키 자동 추출을 지원하지 않기 때문에 <selectKey>를 사용해야 합니다. 이 방식은 직접 시퀀스 등을 조회해서 id 값을 먼저 구한 후 insert합니다.

예: UserMapper.xml

<insert id="insertUser" parameterType="User">

  <selectKey keyProperty="id" resultType="long" order="BEFORE">
    SELECT users_seq.NEXTVAL FROM dual
  </selectKey>

  INSERT INTO users(id, name, age)
  VALUES(#{id}, #{name}, #{age})

</insert>

속성 설명

  • keyProperty: Java 객체 필드명
  • resultType: 키의 타입 (Long, int 등)
  • order: BEFORE → insert 전에 실행 / AFTER → insert 후 실행

4. 주요 차이점 비교

항목 useGeneratedKeys selectKey
지원 DB MySQL, H2, MariaDB Oracle, PostgreSQL, 모든 DB
쿼리 위치 @Options에 설정 XML 내 selectKey 태그
실행 순서 INSERT 후 BEFORE/AFTER 설정 가능
SQL 필요 여부 불필요 시퀀스 조회 SQL 필요

5. 실무 팁

  • MySQL, MariaDB 등에서는 useGeneratedKeys 사용 권장
  • Oracle, PostgreSQL에서는 selectKey로 시퀀스를 먼저 조회해야 함
  • Java 객체에 setter가 없으면 id 값이 주입되지 않음
  • JUnit 테스트 시 PK가 주입되었는지 검증 필요

6. 결론

MyBatis에서 insert 후 자동 생성된 키를 조회하는 기능은 실무에서 매우 자주 사용됩니다. useGeneratedKeys는 간단하고 직관적이지만, DB 제약이 있으므로 상황에 따라 selectKey 방식도 이해하고 적용할 수 있어야 합니다. 프로젝트 DB 종류에 따라 적절한 방식으로 설정해 보세요.

728x90
반응형
LIST