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>
설명
- useGeneratedKeys="true"를 설정하면 MyBatis가 데이터베이스의 자동 증가 컬럼 값을 반환받습니다.
- keyProperty="id"는 반환된 키 값을 매핑할 VO 객체의 속성을 지정합니다. 예를 들어, ExampleVO 객체의 id 필드에 자동 증가된 값이 저장됩니다.
- 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>
설명
- <selectKey> 태그는 SQL 실행 후(AFTER)에 실행되어, 마지막으로 삽입 또는 업데이트된 키 값을 조회합니다.
- MySQL에서는 LAST_INSERT_ID() 함수를 사용하여 마지막으로 생성된 AUTO_INCREMENT 값을 가져옵니다.
- 이 방식은 UPDATE나 MERGE 작업에서 유용하며, 복합적인 로직으로 PK를 생성해야 할 때 적합합니다.
3. 두 방법의 차이점 및 사용 시점
특징 | INSERT (useGeneratedKeys) | UPDATE/MERGE (selectKey) |
지원 DB | MySQL (자동 증가 컬럼 지원) | MySQL |
키 생성 방식 | DB 내부에서 자동 생성 | SELECT 쿼리를 통해 수동 조회 |
사용 목적 | INSERT후 AUTO_INCREMENT 키를 가져올 때 | 업데이트 또는 머지 후 키를 가져올 때 |
4. 주의사항
- 동시성 문제 방지:
- LAST_INSERT_ID()는 세션 단위로 작동하므로, 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- 속성 매핑 확인:
- 반환받은 키 값은 VO 객체에 매핑되므로, 적절한 속성 이름과 타입을 지정해야 합니다.
- MERGE 문법 활용:
- MySQL의 ON DUPLICATE KEY UPDATE 구문은 INSERT와 UPDATE를 동시에 처리할 수 있어 편리합니다.
MyBatis에서 INSERT 작업 후 자동 생성된 키 값을 반환받으려면 간단하고 효율적인 useGeneratedKeys 옵션을 사용하는 것이 좋습니다. 반면, UPDATE와 MERGE 작업에서는 <selectKey> 태그를 활용하여 마지막으로 삽입되거나 업데이트된 키 값을 가져올 수 있습니다.
이 두 가지 방법을 적절히 조합하면 다양한 데이터베이스 작업에서 효율적으로 PK(Primary Key)를 관리하고 후속 작업에 활용할 수 있습니다!
'IT > 데이터베이스' 카테고리의 다른 글
MySQL에서 JSON 필드 사용하기 (0) | 2025.03.31 |
---|---|
MyBatis에서 INSERT 성공 여부 확인하기 (2) | 2025.03.28 |
MySQL INSERT 중복 데이터 처리: 무시하기와 덮어쓰기 (0) | 2025.03.28 |