웹프로그램 개발 시 데이터베이스에 새로운 데이터를 INSERT하는 과정에서 자동으로 생성되는 기본 키(Primary Key)를 Java 객체에 매핑해야 할 경우가 많습니다. MyBatis는 이를 위해 두 가지 방법을 제공합니다: <selectKey>와 useGeneratedKeys. 이 두방식의 자동생서키 차이점을 알아보자.
1. selectKey란?
MyBatis의 <selectKey>는 INSERT 문을 실행하기 전 or 후에 별도의 SQL을 실행해, 생성된 키 값을 가져오는 방식입니다. 주로 순차적으로 증가 시퀀스를 사용하는 데이터베이스에서 사용됩니다.
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT user_seq.NEXTVAL FROM dual
</selectKey>
INSERT INTO users (id, name, email)
VALUES (#{id}, #{name}, #{email})
</insert>
위 예제에서 user_seq.NEXTVAL로 새로운 ID를 먼저 생성한 뒤, 해당 ID를 포함하여 INSERT를 수행합니다. order="BEFORE"는 SELECT 문이 INSERT 전에 실행된다는 의미입니다.
2. useGeneratedKeys란?
MySQL이나 SQL Server처럼 기본 키를 자동 증가(AUTO_INCREMENT)로 설정할 수 있는 DB에서는 useGeneratedKeys="true"를 사용하는 것이 일반적입니다. 이 경우, 개발자는 ID 값을 명시하지 않아도 되고, MyBatis가 DB에서 생성된 키를 자동으로 Java 객체에 설정해줍니다.
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, email)
VALUES (#{name}, #{email})
</insert>
이 방식은 MyBatis가 JDBC의 getGeneratedKeys()를 이용해 자동 생성된 키 값을 가져와 id 필드에 설정합니다. SQL 문에는 ID 컬럼이 명시되지 않기 때문에, 보다 간결하고 실수할 여지가 적습니다.
결론
<selectKey>는 시퀀스를 통해 직접 키를 생성하고 싶을 때, useGeneratedKeys는 DB가 자동으로 키를 생성해줄 때 사용하는 방식입니다. 사용하는 데이터베이스 환경에 따라 적절한 방법을 선택하면 됩니다.
MyBatis는 이처럼 다양한 방식으로 DB와의 연동을 유연하게 처리할 수 있게 도와줍니다. 실무에서 INSERT 후 ID를 사용하는 로직이 있다면, 이 두 가지 방법을 꼭 기억해두세요.