hanker

Spring - iBatis 와 MyBatis에서 selectKey 사용법 (INSERT 시 PK 가져오기) 본문

SPRING

Spring - iBatis 와 MyBatis에서 selectKey 사용법 (INSERT 시 PK 가져오기)

hanker 2025. 3. 8. 19:13
반응형

selectKey는 데이터 삽입(INSERT) 시 자동 생성된 키(Primary Key) 값을 가져오기 위해 사용하는 기능이다.

iBatis와 MyBatis 모두 selectKey를 지원하지만, 두 프레임워크에서 사용하는 방식에 차이가 있다.

 

이번 글에서는 iBatis와 Mybatis에서 selectKey의 사용법과 차이점을 알아보자.

 


1. iBatis에서 selectKey

 

selectKey는 데이터베이스에 INSERT를 수행할 때, 시퀀스나 자동 생성 키 값을 조회하여 객체에 할당하기 위해 사용한다.

 

  • selectKey 태그 옵션
    • type 옵션
      • type="pre": INSERT 실행 전에 키 값을 조회하여 해당 값을 INSERT 쿼리에 사용
      • type="post": INSERT 실행 후에 키 값을 조회하여 객체의 프로퍼티에 할당
    • keyProperty:
      • 조회된 키 값이 할당될 객체의 프로퍼티 이름을 지정
    • resultClass:
      • 조회된 키의 데이터 타입을 지정

 

사용 예제

<!-- iBATIS 매핑 파일 예제 -->
<insert id="insertUser" parameterClass="User">
    <!-- type 옵션: pre 방식으로, INSERT 전 키 조회 -->
    <selectKey keyProperty="id" resultClass="int" type="pre">
        SELECT SEQ_USER.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO USERS (ID, NAME, EMAIL)
    VALUES (#id#, #name#, #email#)
</insert>

 

  • <insert> 태그의 id는 매핑 파일 내에서 호출되는 INSERT 문의 식별자이며, parameterClass는 전달되는 파라미터의 객체 타입이다.
  • <selectKey> 태그 내의 SQL 문은 시퀀스 값을 조회하는 쿼리로, Oracle의 경우 DUAL 테이블을 사용하여 시퀀스의 다음 값을 가져온다.
  • keyProperty는 조회된 시퀀스 값이 저장될 객체의 프로퍼티(예, id)이며, resultClass는 반환값의 데이터 타입을 의미한다.
  • 이 방식(pre)은 INSERT 실행 전에 키 값을 조회하여, INSERT문의 VALUES 절에서 해당 키 값을 사용할 수 있도록 한다.

 


2. MyBatis에서 selectKey

 

iBatis에서 사용하는 이유와 동일하다.

 

  • selectKey 태그 옵션
    • keyProperty
      • 조회된 키 값을 저장할 객체 내의 프로퍼티 이름을 지정
      • 예를 들어, User 객체의 id 프로퍼티에 값을 할당하고 싶다면 keyProperty="id"로 지정 
    • resultType
      • 키 조회 결과의 데이터 타입을 지정
      • 일반적으로 int, long, String 등 데이터베이스 키 타입에 맞게 설정
    • order
      • 키 값을 조회하는 시점을 지정하는 옵
      • BEFORE: INSERT 실행 전에 키 값을 조회
      • AFTER: INSERT 실행 후에 키 값을 조회

 

사용 예제

<!-- MyBatis 매핑 파일 예제 -->
<insert id="insertUser" parameterType="User">
    <!-- INSERT 전에 시퀀스 값을 조회 -->
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        SELECT SEQ_USER.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO USERS (ID, NAME, EMAIL)
    VALUES (#{id}, #{name}, #{email})
</insert>

 

 

 

 

  • keyProperty="id": 조회된 시퀀스 값이 User 객체의 id 프로퍼티에 할당
  • resultType="int": 반환되는 시퀀스 값의 타입을 정수형으로 지정
  • order="BEFORE": INSERT 문 실행 전에 시퀀스 값을 미리 조회하여 INSERT 쿼리 내에서 사용

 

반응형