記錄

Spring) selectKey 본문

Web/Spring framework

Spring) selectKey

surhommejk 2018. 7. 23. 09:22

멀티쓰래드 상황에서 시퀀스 값을 사용할 때 한 번 사용한 시퀀스 값을 그대로 다시 사용해야 할 경우 currval를 하게되면 값을 보장 받지 못한다. 그 사이에 누군가 nextval를 사용했을 수 있기 때문이다. 프로젝트를 하던 중 이것 때문에 좀 찾아보다가 selectKey 를 발견하게 되었다.


selectKey는 채번을 미리 해서 그 값을 객체에 저장할 수 있는 기능이다


    <insert id="insertComment" parameterType="com.apollo.vo.CommentDTO">
        <selectKey keyProperty="cmtid" resultType="int" order="BEFORE">
         select seq_cmtid.nextval FROM DUAL
        </selectKey>
        insert into comments values(#{cmtid}, #{comments}, #{tid}, #{mid}, #{cmtkind}, sysdate)
    </insert>



위 코드에서는 selectKey가 가장 먼저 작동하면서 미리 시퀀스 값을 채번하여 keyProperty에 해당하는 "cmtid"라는 변수명을 찾아 CommentDTO에 set 하게 된다. 그리고 그 값을 이용해서 아래 insert into ~ 문을 실행하게 된다.


이 과정 자체는 nextval를 쓴 것과 다를 바가 없다. 하지만 이 전체 insert문을 실행하고 나면 파라미터로 사용한 CommentDTO 객체의 cmtid값이 사용한 시퀀스 값으로 set 되어 있다는 것이 중요하다. 바로 이를 활용할 수 있기 때문이다.

Comments