
웹 개발에서 MyBatis를 사용할 때, 데이터 삽입(insert) 후 자동 생성된 기본키(Primary Key, PK)를 리턴받아야 하는 경우가 자주 발생합니다. 예를 들어 게시글 작성 후 해당 글의 ID를 이용해 댓글을 작성하거나 상세 페이지로 이동할 때 등입니다. 오늘은 MyBatis insert 쿼리 실행 후 PK를 리턴받는 방법에 대해 자세히 정리해보겠습니다.
1. MyBatis에서 PK를 리턴받아야 하는 이유
데이터베이스 테이블에서 기본키는 대부분 AUTO_INCREMENT나 SEQUENCE를 통해 자동 생성됩니다. 이 값은 데이터 삽입 직후 객체에 반영되지 않기 때문에, 명시적으로 PK 값을 조회하거나 반환받는 설정이 필요합니다. 특히 자바 백엔드에서는 해당 ID 값을 이후 로직에 활용해야 하는 경우가 많아 반드시 알아야 할 기능입니다.
2. useGeneratedKeys 옵션 활용 방법
MyBatis에서는 가장 간단하게 useGeneratedKeys 속성을 사용해 자동 생성된 키를 객체에 주입할 수 있습니다.
아래는 대표적인 예시입니다.
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (name, email)
VALUES (#{name}, #{email})
</insert>
- useGeneratedKeys="true": JDBC의 getGeneratedKeys()를 사용
- keyProperty="id": 생성된 PK가 자바 객체의 어느 필드에 주입될지 명시
이 방법은 MySQL, MariaDB, H2 등 JDBC에서 getGeneratedKeys()를 지원하는 DB에서 효과적입니다.
3. keyProperty 설정으로 객체에 PK 매핑하기
위에서 언급한 keyProperty는 매우 중요합니다. 이 속성을 지정하지 않으면 insert는 성공하더라도 객체에는 ID 값이 들어가지 않습니다.
예를 들어 User라는 객체에 private Long id;가 있다면, keyProperty는 "id"로 지정해야 합니다.
해당 필드는 getter/setter가 필수이며, XML 또는 어노테이션 방식 모두 사용 가능합니다.
4. selectKey 방식으로 직접 조회하기
Oracle, PostgreSQL 등 일부 DB에서는 useGeneratedKeys 방식이 정상 작동하지 않을 수 있습니다.
이럴 경우에는 selectKey를 통해 PK를 직접 조회하여 삽입 전에 값을 가져올 수 있습니다.
<insert id="insertUser">
<selectKey keyProperty="id" resultType="long" order="BEFORE">
SELECT user_seq.NEXTVAL FROM dual
</selectKey>
INSERT INTO user (id, name, email)
VALUES (#{id}, #{name}, #{email})
</insert>
- order="BEFORE": insert 전에 key를 먼저 조회
- keyProperty="id": 조회된 값을 해당 객체 필드에 바인딩
- resultType="long": 시퀀스 결과 타입 지정
이 방식은 DB의 시퀀스(sequence)를 활용해야 하는 환경에서 매우 유용합니다.
5. 상황에 따라 방식 선택이 중요
- MySQL, H2, MariaDB: useGeneratedKeys 방식이 편리하고 직관적
- Oracle, PostgreSQL: selectKey 방식이 안정적
- DB 독립성을 확보하려면 추상화 계층을 잘 설계하거나, 환경별 Mapper를 나누는 것이 좋습니다.
✅ 마무리
MyBatis insert 후 PK를 리턴받는 방법은 데이터 흐름을 정확하게 제어하는 데 핵심입니다.
어떤 DB를 사용하는지에 따라 적절한 방법을 선택하고, keyProperty 설정을 통해 객체에 잘 매핑되도록 구성하는 것이 중요합니다.
현업에서도 자주 마주치는 부분이므로 꼭 숙지해두세요.