MyBatis에서 update 또는 insert 후 키 값을 리턴받는 방법

MyBatis를 사용하여 데이터베이스 작업 후 자동 생성된 키 값을 반환받는 방법에 대해 알아보겠습니다. 특히 MySQL 환경에서 useGeneratedKeys 옵션 selectKey 태그를 활용하는 방법을 중심으로 설명합니다. 또한, INSERT 작업에서는 useGeneratedKeys를, UPDATE와 MERGE 작업에서는 selectKey를 사용하는 것이 일반적입니다.

1. INSERT 작업 후 키 값 반환: useGeneratedKeys와 keyProperty

MySQL의 자동 증가 컬럼을 활용할 때는 useGeneratedKeys 옵션을 사용하는 것이 가장 간단하고 효율적입니다. 이 옵션은 JDBC의 getGeneratedKeys 메서드를 통해 자동 생성된 키 값을 가져옵니다.

사용법

  • useGeneratedKeys="true": 자동 생성된 키를 반환받도록 설정합니다.
  • keyProperty="컬럼명": 반환받고자 하는 키 값을 매핑할 객체의 속성을 지정합니다.

예제 코드

<update id="updateExample" parameterType="ExampleVO">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    UPDATE example_table
    SET name = #{name}, email = #{email}
    WHERE id = #{id}
</update>
 

설명

  1. useGeneratedKeys="true"를 설정하면 MyBatis가 데이터베이스의 자동 증가 컬럼 값을 반환받습니다.
  2. keyProperty="id"는 반환된 키 값을 매핑할 VO 객체의 속성을 지정합니다. 예를 들어, ExampleVO 객체의 id 필드에 자동 증가된 값이 저장됩니다.
  3. MySQL과 같은 자동 증가 컬럼을 지원하는 데이터베이스에서 사용하기 적합합니다.

2. UPDATE 및 MERGE 작업 후 키 값 반환: selectKey

UPDATE나 MERGE 작업에서는 데이터 삽입과 달리 자동 생성된 키를 바로 사용할 수 없는 경우가 많습니다. 이때는 MyBatis의 <selectKey> 태그를 이용하여 별도의 SELECT 쿼리로 키 값을 조회할 수 있습니다.

사용법

  • selectKey 태그: SQL 실행 전(BEFORE) 또는 후(AFTER)에 별도의 SELECT 쿼리를 실행하여 키 값을 가져옵니다.
  • keyProperty="컬럼명": 반환받고자 하는 키 값을 매핑할 객체의 속성을 지정합니다.
  • resultType="타입": 반환되는 키 값의 데이터 타입을 지정합니다.

예제 코드 (UPDATE)

<update id="updateExample" parameterType="ExampleVO">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    UPDATE example_table
    SET name = #{name}, email = #{email}
    WHERE id = #{id}
</update>

예제 코드 (MERGE)

<insert id="mergeExample" parameterType="ExampleVO">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO example_table (id, name, email)
    VALUES (#{id}, #{name}, #{email})
    ON DUPLICATE KEY UPDATE
        name = VALUES(name),
        email = VALUES(email)
</insert>
 

설명

  1. <selectKey> 태그는 SQL 실행 후(AFTER)에 실행되어, 마지막으로 삽입 또는 업데이트된 키 값을 조회합니다.
  2. MySQL에서는 LAST_INSERT_ID() 함수를 사용하여 마지막으로 생성된 AUTO_INCREMENT 값을 가져옵니다.
  3. 이 방식은 UPDATE나 MERGE 작업에서 유용하며, 복합적인 로직으로 PK를 생성해야 할 때 적합합니다.

3. 두 방법의 차이점 및 사용 시점

특징 INSERT (useGeneratedKeys) UPDATE/MERGE (selectKey)
지원 DB MySQL (자동 증가 컬럼 지원) MySQL
키 생성 방식 DB 내부에서 자동 생성 SELECT 쿼리를 통해 수동 조회
사용 목적 INSERT후 AUTO_INCREMENT 키를 가져올 때 업데이트 또는 머지 후 키를 가져올 때

4. 주의사항

  1. 동시성 문제 방지:
    • LAST_INSERT_ID()는 세션 단위로 작동하므로, 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
  2. 속성 매핑 확인:
    • 반환받은 키 값은 VO 객체에 매핑되므로, 적절한 속성 이름과 타입을 지정해야 합니다.
  3. MERGE 문법 활용:
    • MySQL의 ON DUPLICATE KEY UPDATE 구문은 INSERT와 UPDATE를 동시에 처리할 수 있어 편리합니다.

MyBatis에서 INSERT 작업 후 자동 생성된 키 값을 반환받으려면 간단하고 효율적인 useGeneratedKeys 옵션을 사용하는 것이 좋습니다. 반면, UPDATE와 MERGE 작업에서는 <selectKey> 태그를 활용하여 마지막으로 삽입되거나 업데이트된 키 값을 가져올 수 있습니다.

 

이 두 가지 방법을 적절히 조합하면 다양한 데이터베이스 작업에서 효율적으로 PK(Primary Key)를 관리하고 후속 작업에 활용할 수 있습니다!