728x90
반응형
1. 시퀀스 기반 (SELECT user_seq.NEXTVAL FROM DUAL)
오라클과 같은 시퀀스 지원 DB에서 사용
<insert id="insertTest" parameterType="Member">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT member_seq.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO members (id, name, email)
VALUES (#{id}, #{name}, #{email})
</insert>
- selectKey를 사용하여 INSERT 전에 시퀀스 값을 미리 가져옴
- keyProperty="id"로 ID 값을 자동 매핑함
2. 시퀀스 테이블 기반 (sequence_table에서 순번 관리)
MySQL처럼 시퀀스가 없는 DB에서 사용
2.1
<update id="updateSequence">
UPDATE sequence_table
SET seq_value = seq_value + 1
WHERE seq_name = 'member_seq'
</update>
- 매퍼에 작성해서 직접 update 쿼리 날려주는 방법
2.2
<select id="getSequence" resultType="int">
SELECT seq_value FROM sequence_table WHERE seq_name = 'member_seq'
</select>
- select 해서 사용하는 방법 (후처리 해줘야 함)
2.3
<insert id="insertTest" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
UPDATE sequence_table
SET seq_value = seq_value + 1
WHERE seq_name = 'member_seq';
SELECT seq_value FROM sequence_table WHERE seq_name = 'member_seq';
</selectKey>
INSERT INTO members (id, name, email)
VALUES (#{id}, #{name}, #{email})
</insert>
- 시퀀스 테이블에서 seq_value 증가 후 조회
- selectKey를 통해 id 값을 가져와 INSERT 실행
실무에서 어떻게 선택하나?
1. 오라클이면?
- 시퀀스 (SELECT user_seq.NEXTVAL FROM DUAL)을 사용 → 제일 안정적이고 빠름
2. MySQL이면?
- AUTO_INCREMENT → 가장 일반적이고 성능 좋음
- sequence_table 사용 → 샤딩 환경 또는 비즈니스 로직상 필요할 때만 사용
결론
- MyBatis에서는 selectKey를 시퀀스와 함께 사용
- MySQL에서는 AUTO_INCREMENT가 가장 많이 사용됨
- 특별한 이유가 없다면 AUTO_INCREMENT가 가장 좋은 선택
- JPA 쓰자...
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_generator")
@SequenceGenerator(name = "member_seq_generator", sequenceName = "member_seq", allocationSize = 1)
private Long id;
}
- sequenceName = "member_seq" → DB의 시퀀스 명과 동일하게 설정
- allocationSize = 1 → 시퀀스가 1씩 증가하도록 설정 (DB와 일치해야 함)
- 시퀀스를 사용하면 동시성 문제 없이 안정적
- JPA가 알아서 NEXTVAL을 호출해 주기 때문에 수동 쿼리 필요 없음
728x90
반응형
'실무' 카테고리의 다른 글
[DB] ROWNUMBER와 RANK의 차이 | 민민의 하드디스크 - 티스토리 (1) | 2025.03.09 |
---|---|
[DB] ROWNUM 사용 시 주의점/활용법 | 민민의 하드디스크 - 티스토리 (0) | 2025.03.07 |