[MyBatis / MySQL] useGeneratedKeys, keyProperty, keyColumn
* 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