Database/MySQL

[MyBatis / MySQL] useGeneratedKeys, keyProperty, keyColumn

phyho 2025. 4. 8. 17:53

 

* useGeneratedKeys="true"
DB에서 자동 생성된 기본 키(PK)값을 Java 객체로 가져올 수 있는 MyBatis 설정.
( JDBC의 getGeneratedKeys() 호출을 MyBatis가 자동으로 처리해준다 )

* keyProperty
Java 객체 필드명

* keyColumn
DB테이블 컬럼명

 

<insert id="insertTest"
        parameterType="com.test.TestDTO"
        useGeneratedKeys="true"
        keyProperty="id"
        keyColumn="id">
    INSERT INTO test_table (item_id, item_name, item_des)
    VALUES (#{itemId}, #{itemName}, #{itemDes})
</insert>

=> 해당 컬럼에 대한 AUTO_INCREMENT 설정 필요 (MYSQL) 
=> keyProperty 와 keyColumn 각각 이름 일치여부 주의

 

 

insert 이후에 생성된 키(id)를 받아 바로 update를 진행하는 경우
명확하게 insert된 행에 대한 update 가능!

 


 

* 내부 작동 흐름 (JDBC 기준)

1. SQL 실행 시 RETURN_GENERATED_KEYS 옵션 설정.

PreparedStatement ps = conn.prepareStatement(
    "INSERT INTO table (col1) VALUES (?)",
    Statement.RETURN_GENERATED_KEYS
);

=> 옵션 설정하면 DB는 자동 생성된 키 값을 함께 반환할 준비를 함.
useGeneratedKeys="true"  --->  MyBatis가 위 옵션을 설정해줌.

 

2. ps.executeUpdate() → INSERT 실행

insert쿼리가 db에 날아가고 DB는 자동으로 생성된 키를 백그라운드에서 저장.
( AUTO_INCREMENT 된 값을 세션 단위로(DB 커넥션) 보관 - MYSQL )

 

3. ps.getGeneratedKeys() 호출

ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
    long id = rs.getLong(1); // 생성된 ID
}

=> DB가 세션에 저장해둔 "생성된 키 정보"만 따로 추출.

 

결과적으로 MyBatis가 자동으로 위의 과정을 진행하고, 추출한 키값을 지정한 keyProperty에 매핑해준다.

 


 

** 트랜잭션(Transaction)  vs  커넥션(Connection)   vs  세션(Session)

더보기

 

* 트랜잭션(Transaction)
여러 DB 작업을 하나의 논리적 작업 단위로 묶은 것 
비즈니스 로직 중심 (Java → DB 흐름)

* 커넥션(Connection)
Java → DB로 명령을 보내는 물리적 통로
(JDBC 레벨에서의 DB 접속)

* 세션(Session)
DB에서 각 커넥션에 대해 유지하는 상태 정보 단위
(DB 내부 관점)

 

하나의 커넥션 객체(conn) 에 대해 

Connection conn = dataSource.getConnection(); // 커넥션 생성
conn.setAutoCommit(false); // 트랜잭션 시작

// INSERT, UPDATE 등 수행

conn.commit(); // 트랜잭션 커밋

conn.setAutoCommit(false) 이후의 작업이 하나의 트랜잭션이고,
이 커넥션이 닫히기 전까지 DB에서는 이걸 하나의 세션으로 관리.

 


 

* JDBC 관련

https://ittrue.tistory.com/250

 

[Java] JDBC란 무엇인가? - Java Database Connectivity

JDBC란? JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API이다. JDB

ittrue.tistory.com