MyBatis์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด(MyObject)์˜ ํ•„๋“œ์— ํŠน์ • ๊ฐ’์„ ์„ธํŒ…ํ•  ๋•Œ selectKey ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์˜ˆ๋ฅผ๋“ค์–ด MyObject๊ฐ€ ์•„๋ž˜ ๋‘ ๊ฐœ์˜ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

String id;

String name;


MyBatis๋ฅผ ์ด์šฉํ•˜์—ฌ MyObject๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž…๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ด๋ฆ„๊ฐ’๋งŒ ํ™”๋ฉด์—์„œ ์ „๋‹ฌ๋ฐ›๊ณ  ID๋ฅผ ์ž๋™์œผ๋กœ sequence๋ฅผ ๋”ฐ์„œ ์ž…๋ ฅ ํ•ด์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ  MyObject์˜ idํ•„๋“œ์— ๊ฐ’ ์„ธํŒ…


<insert id="insert" parameterType="MyObject">

        <selectKey keyProperty="id" resultType="int" order="BEFORE">

            select nextval('sequence_id')

        </selectKey>

        <![CDATA[

        INSERT INTO person(id, name)

        VALUES (#{id}, #{name});

        ]]>

    </insert>


order="BEFORE" ์˜ต์…˜์€ insert ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์ „์— keyProperty์— ๊ฐ’์„ ์„ธํŒ…ํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.


์ž๋ฐ” ์†Œ์Šค๋‹จ์—์„œ ๊ฐ์ฒด์˜ id์— ๊ฐ’์„ ์„ธํŒ…ํ•˜์ง€ ์•Š๊ณ ์žˆ๋Š”๋ฐ ์ฟผ๋ฆฌ ์‹คํ–‰ ํ›„์— id๊ฐ’์ด ์„ธํŒ…๋˜์–ด์ ธ์„œ ๋‚˜์˜ค๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์ด๊ฒŒ ๋ญ”๊ฐ€ ์‹ถ์–ด ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์•Œ๊ฒŒ๋จ.


mybatis์„ค์ • ํŒŒ์ผ์—๋Š” userGeneratedKeys ์„ค์ •์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

<configuration>

    <settings>

        <setting name="cacheEnabled" value="false"/>

        <setting name="useGeneratedKeys" value="true"/>

        <setting name="defaultExecutorType" value="REUSE"/>

    </settings>

</configuration>




์œ„ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜ ์ €๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ผ€์ด์Šค๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ์ฟผ๋ฆฌ์— ์ง์ ‘ ์˜ต์…˜์œผ๋กœ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.


<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

์†์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์†์„ฑ์„ค๋ช…
id๊ตฌ๋ฌธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋‚ด ์œ ์ผํ•œ ๊ตฌ๋ถ„์ž
parameterType๊ตฌ๋ฌธ์— ์ „๋‹ฌ๋  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํด๋ž˜์Šค๋ช…์ด๋‚˜ ๋ณ„์นญ
parameterMap์™ธ๋ถ€ parameterMap ์„ ์ฐพ๊ธฐ ์œ„ํ•œ ๋น„๊ถŒ์žฅ๋œ ์ ‘๊ทผ๋ฐฉ๋ฒ•. ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋งคํ•‘๊ณผ parameterType์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋ผ.
flushCache์ด ๊ฐ’์„ true ๋กœ ์…‹ํŒ…ํ•˜๋ฉด ๊ตฌ๋ฌธ์ด ํ˜ธ์ถœ๋ ๋•Œ๋งˆ๋‹ค ์บ์‹œ๊ฐ€ ์ง€์›์งˆ๊ฒƒ์ด๋‹ค(flush). ๋””ํดํŠธ๋Š” false ์ด๋‹ค.
timeout์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง€๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€์‹œ๊ฐ„์„ ์„ค์ •ํ•œ๋‹ค. ๋””ํดํŠธ๋Š” ์…‹ํŒ…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๊ณ  ๋“œ๋ผ์ด๋ฒ„์— ๋”ฐ๋ผ ๋‹ค์†Œ ์ง€์›๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
statementTypeSTATEMENT, PREPARED ๋˜๋Š” CALLABLE์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์—๊ฒŒ Statement, PreparedStatement ๋˜๋Š” CallableStatement๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค. ๋””ํดํŠธ๋Š” PREPARED ์ด๋‹ค.
useGeneratedKeys(์ž…๋ ฅ(insert, update)์—๋งŒ ์ ์šฉ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•œ ํ‚ค (์˜ˆ๋ฅผ๋“ค์–ด MySQL๋˜๋Š” SQL Server์™€ ๊ฐ™์€ RDBMS์˜ ์ž๋™ ์ฆ๊ฐ€ ํ•„๋“œ)๋ฅผ ๋ฐ›๋Š” JDBC getGeneratedKeys๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋‹ค. ๋””ํดํŠธ๋Š” false ์ด๋‹ค.
keyProperty(์ž…๋ ฅ(insert, update)์—๋งŒ ์ ์šฉ) getGeneratedKeys ๋ฉ”์†Œ๋“œ๋‚˜ insert ๊ตฌ๋ฌธ์˜ selectKey ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ์— ์˜ํ•ด ๋ฆฌํ„ด๋œ ํ‚ค๋ฅผ ์…‹ํŒ…ํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์ •. ๋””ํดํŠธ๋Š” ์…‹ํŒ…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์นผ๋Ÿผ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ”„๋กœํผํ‹ฐ๋ช…์— ์ฝค๋งˆ๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ๋‚˜์—ดํ• ์ˆ˜ ์žˆ๋‹ค.
keyColumn(์ž…๋ ฅ(insert, update)์—๋งŒ ์ ์šฉ) ์ƒ์„ฑํ‚ค๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ๋ช…์„ ์…‹ํŒ…. ํ‚ค ์นผ๋Ÿผ์ด ํ…Œ์ด๋ธ”์ด ์ฒซ๋ฒˆ์งธ ์นผ๋Ÿผ์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(PostgreSQL ์ฒ˜๋Ÿผ)์—์„œ๋งŒ ํ•„์š”ํ•˜๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์นผ๋Ÿผ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ”„๋กœํผํ‹ฐ๋ช…์— ์ฝค๋งˆ๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ๋‚˜์—ดํ• ์ˆ˜ ์žˆ๋‹ค.
databaseId์„ค์ •๋œ databaseIdProvider๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” databaseId ์†์„ฑ์ด ์—†๋Š” ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์ผ์น˜ํ•˜๋Š” databaseId์™€ ํ•จ๊ป˜ ๋กœ๋“œ๋  ๊ฒƒ์ด๋‹ค. ๊ฐ™์€ ๊ตฌ๋ฌธ์—์„œ databaseId๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ์žˆ๋‹ค๋ฉด ๋’ค์— ๋‚˜์˜จ ๊ฒƒ์ด ๋ฌด์‹œ๋œ๋‹ค.