๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/SQL

[MyBatis] Mapper ์„ค์ •๊ณผ ๋ฌธ๋ฒ•, ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜

by OR15A 2024. 1. 24.
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ํ”„๋กœ์ ํŠธ ๊ณผ์ œ ์ค‘ ์ž‘์„ฑํ•จ

 

xx_mapper.xml ์ƒ์„ฑ ๋ฐ ์„ค์ •
  • mapper ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ •
    • root-context.xml ํŒŒ์ผ์— mapper ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ
    • src/main/webapp/WEB-INF/spring/root-context.xml
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!---->
        <property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
    </bean>

 

  • ์„ค์ •ํ•œ ์œ„์น˜์— mapper.xml ์ƒ์„ฑํ•˜๊ธฐ

์ƒ์„ฑ์œ„์น˜

 

  • mapper.xml ํŒŒ์ผ ์ฝ”๋“œ ๊ตฌ์„ฑ
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--๊ทธ๋ƒฅ xmlํŒŒ์ผ์„ MyBatisํŒŒ์ผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ-->

<mapper namespace="documentMapper"> <!--Repository์—์„œ ์‚ฌ์šฉํ•  mapper์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„-->

	<!--์˜ˆ์‹œ ๋งคํผ-->
    <select id="getMaxDocumentId" parameterType="long" resultType="long">
        SELECT MAX(document_id)
        FROM xx_document
    </select>


</mapper>

 

  • MyBatis ์„ค์ • ํŒŒ์ผ mybatis-config.xml ์ƒ์„ฑ

mybatis-config.xml ์ƒ์„ฑ

 

  • mybatis-config.xml ํŒŒ์ผ ์ฝ”๋“œ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
        <typeAlias alias="Document" type="com.study.student.domain.Document"/>
        <typeAlias alias="์กฐํšŒ๊ฒฐ๊ณผํƒ€์ž…ํด๋ž˜์Šค๋ณ„๋ช…" type="ํ•ด๋‹น.ํด๋ž˜์Šค๊ฐ€.์œ„์น˜ํ•œ.์ฃผ์†Œ.ํด๋ž˜์Šค์ด๋ฆ„"/>
    </typeAliases>

</configuration>

 

  • ๋‹น์—ฐํžˆ ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•ด์•ผํ•จ(์ƒ๋žต)

 

 

 

๊ธฐ๋ณธ ๋ฌธ๋ฒ•
  • ํƒœ๊ทธ ์ข…๋ฅ˜ : update, insert, select, sql, resultMap, delete, cache, cache-ref,parameterMap
    • ํƒœ๊ทธ๋Š” SQL ์ฟผ๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๋งคํ•‘์„ ์ •์˜ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ 
    • ๊ฐ ํƒœ๊ทธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด๋‚˜ ์„ค์ •์— ๋Œ€ํ•œ ํŠน์ • ์ง€์‹œ๋ฅผ ์ œ๊ณตํ•จ

ํƒœ๊ทธ ์ข…๋ฅ˜

  • ๊ฐ ํƒœ๊ทธ๋ณ„ ์„ค๋ช… [์•„๋ž˜์˜ ๋”๋ณด๊ธฐ๋ฅผ ๋ˆ„๋ฅด์„ธ์š”]
๋”๋ณด๊ธฐ

1. <select>: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. `<select>` ํƒœ๊ทธ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ๋ฌธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋‹จ์ผ ๊ฐ์ฒด, ๊ฐ์ฒด์˜ ๋ฆฌ์ŠคํŠธ, ๋˜๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. <insert>: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ๋Š” ๋ณดํ†ต ์‚ฝ์ž… ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” SQL ๋ฌธ์„ ํฌํ•จํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ์˜ ํ‚ค(์˜ˆ: auto-increment)๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

3. <update>: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ๋Š” ์ˆ˜์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” SQL ๋ฌธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

4. <delete>: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ๋Š” ์‚ญ์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” SQL ๋ฌธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

5. <sql>: SQL ๋ฌธ์˜ ์ผ๋ถ€๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ ๋‚ด์— ์ •์˜๋œ SQL์€ ๋‹ค๋ฅธ SQL ๋ฌธ ๋‚ด์—์„œ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

6. <resultMap>: SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์™€ ์ž๋ฐ” ๊ฐ์ฒด ์‚ฌ์ด์˜ ๋งคํ•‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ๋Š” ๋ณต์žกํ•œ ์กฐ์ธ์ด๋‚˜ ๋ณตํ•ฉ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

7. <cache>: ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์˜ ๋‚ด์žฅ ์บ์‹œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์—ฌ, ๋™์ผํ•œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต ์š”์ฒญ ์‹œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. <cache-ref>: ๋‹ค๋ฅธ ๋งคํผ์—์„œ ์ •์˜๋œ ์บ์‹œ ์„ค์ •์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋งคํผ ๊ฐ„์— ์บ์‹œ ์„ค์ •์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

9. <parameterMap>: (๋” ์ด์ƒ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ) SQL ์ฟผ๋ฆฌ์˜ ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒœ๊ทธ๋Š” ํ˜„์žฌ๋Š” `<parameterType>` ์†์„ฑ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

  • ํƒœ๊ทธ์˜ ์†์„ฑ : 
    • ๋‹ค์–‘ํ•œ ์†์„ฑ๋“ค์€ SQL ์ฟผ๋ฆฌ์˜ ๋™์ž‘๊ณผ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•จ

ํƒœ๊ทธ์˜ ์†์„ฑ

  • ๊ฐ ์†์„ฑ์˜ ํŠน์ •ํ•œ ๋ชฉ์  ์„ค๋ช…  [์•„๋ž˜์˜ ๋”๋ณด๊ธฐ๋ฅผ ๋ˆ„๋ฅด์„ธ์š”]
๋”๋ณด๊ธฐ

1. parameterType: SQL ์ฟผ๋ฆฌ์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ Java ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” `<insert>`, `<update>`, `<delete>`, `<select>` ๋“ฑ์˜ ํƒœ๊ทธ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. resultType: `<select>` ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋  ๊ฐ์ฒด์˜ Java ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ๋ณธ ํƒ€์ž…, ๊ฐ์ฒด ํƒ€์ž… ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. resultMap: ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. `resultMap`์€ ๋‹ค์–‘ํ•œ ์ปฌ๋Ÿผ๊ณผ ๊ฐ์ฒด ์†์„ฑ ๊ฐ„์˜ ๋งคํ•‘ ๊ด€๊ณ„๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. databaseId: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”(์˜ˆ: MySQL, Oracle)๋ณ„๋กœ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ๋งคํผ ํŒŒ์ผ ๋‚ด์—์„œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. fetchSize: JDBC ๋“œ๋ผ์ด๋ฒ„์— ์˜ํ•ด ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ–‰(row)์˜ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. flushCache: ์ฟผ๋ฆฌ ์‹คํ–‰ ํ›„ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์˜ ๋‚ด๋ถ€ ์บ์‹œ๋ฅผ ๋น„์šธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ฟผ๋ฆฌ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

7. lang: ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ XML์ž…๋‹ˆ๋‹ค.

8. parameterMap: (๋” ์ด์ƒ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ) ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ด๋Š” `parameterType`์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

9. resultOrdered: ์ค‘์ฒฉ๋œ ๊ฒฐ๊ณผ ๋งคํ•‘์—์„œ ๊ฒฐ๊ณผ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ `true`๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

10. resultSets: ๋‹ค์ค‘ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

11. resultSetType: JDBC์˜ `ResultSet` ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `FORWARD_ONLY`, `SCROLL_SENSITIVE`, `SCROLL_INSENSITIVE` ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

12. statementType: ์‚ฌ์šฉํ•  JDBC statement ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. `STATEMENT`, `PREPARED`, `CALLABLE` ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

13. timeout: ์ฟผ๋ฆฌ ์‹คํ–‰์˜ ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

14. useCache: ํ•ด๋‹น ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์˜ ๋‚ด๋ถ€ ์บ์‹œ์— ์ €์žฅํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์กฐํšŒ ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†์„ฑ๋“ค์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด, ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋”์šฑ ํšจ์œจ์ ์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์˜ ์‚ฌ์šฉ์€ ๋งคํผ์˜ ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ฟผ๋ฆฌ๋ณ„ ์‚ฌ์šฉ์˜ˆ์‹œ
    <!-- ํŠน์ • document_id๋กœ Document ์กฐํšŒ -->
    <select id="selectDocumentById" parameterType="int" resultType="com.example.model.Document">
        SELECT document_id, title, content
        FROM Document
        WHERE document_id = #{documentId}
    </select>

 

  • myBatisConfig.xml์— ํƒ€์ž… ๋ณ„์นญ ๋“ฑ๋ก
    • ๋ณ„์นญ(Alias)์„ ์‚ฌ์šฉํ•˜์—ฌ parameterType๊ณผ resultType์„ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ณ„์นญ์„ ๋“ฑ๋กํ•˜๋ฉด, ์ „์ฒด ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ์— ์ด ๋ณ„์นญ์„ ์‚ฌ์šฉํ•ด์„œ ๋งคํ•‘ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— XML ์„ค์ •์„ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ์คŒ

 

  • mybatis-config.xml ์ƒ์„ฑํ•˜๊ธฐ
    • ์ƒ์„ฑ์œ„์น˜ : ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(MyBatis)์˜ mybatis-config.xml ํŒŒ์ผ ์œ„์น˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Java ํ”„๋กœ์ ํŠธ์˜ resources ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ๋‘๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž„

mybatis-config.xml ์ƒ์„ฑ ์œ„์น˜

 

  • ์ฝ”๋“œ ์˜ˆ์‹œ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
        <typeAlias alias="Document" type="com.example.model.Document"/>
    </typeAliases>
    
</configuration>
  • ๋ณ„์นญ ๋“ฑ๋ก ์ดํ›„์—๋Š” <select id="selectDocumentById" parameterType="int" resultType=" Document "> ๋ผ๊ณ  ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์Œ

 

  • ๋ฐ”์ธ๋”ฉ ํƒ€์ž… ํด๋ž˜์Šค ์ƒ์„ฑ์‹œ ์ฃผ์˜์ 
    • ์ปฌ๋Ÿผ๋ช…๊ณผ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ๋งค์นญ
      • ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ์ปฌ๋Ÿผ ์ด๋ฆ„๊ณผ ๋ฐ”์ธ๋”ฉ ํƒ€์ž… ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•จ
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปฌ๋Ÿผ๋ช…์ด user_name์ด๋ผ๋ฉด, ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋Š” userName๊ณผ ๊ฐ™์ด ์นด๋ฉœ ์ผ€์ด์Šค(CamelCase)๋กœ ๋งคํ•‘๋จ
    • ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ
      • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ๋งคํ•‘์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ SELECT ์ ˆ์˜ ์ปฌ๋Ÿผ ์ˆœ์„œ์™€ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•จ
      • resultMap์—์„œ <constructor> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜๋„ ์žˆ์Œ
    • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์˜ ์ค‘์š”์„ฑ
      • ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(์ธ์ž๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž)๋ฅผ ์‚ฌ์šฉํ•จ
      • ๋ฐ”์ธ๋”ฉ ํƒ€์ž… ํด๋ž˜์Šค์—๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ดํ•จ
    • ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ
      • ๋•Œ๋•Œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปฌ๋Ÿผ ํƒ€์ž…๊ณผ ์ž๋ฐ” ํด๋ž˜์Šค์˜ ํ•„๋“œ ํƒ€์ž…์ด ์ง์ ‘์ ์œผ๋กœ ๋งคํ•‘๋˜์ง€ ์•Š์„ ๋•Œ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ์ ‘๊ทผ์„ฑ
      • ํ”„๋กœํผํ‹ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋Œ€์‹ , getter์™€ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ์„ ๊ถŒ์žฅํ•จ
    • ํ•„๋“œ ๋„ค์ด๋ฐ
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปฌ๋Ÿผ๋ช…๊ณผ ์ž๋ฐ” ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ช…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ, @Result ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Œ

( to do ๊ฒช์—ˆ๋˜ ์˜ค๋ฅ˜ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ )

 

 

 

์žฌ์‚ฌ์šฉ๊ณผ ์กฐ๊ฑด ๊ฒ€์ƒ‰
  • ์ž์ฃผ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ๋ถ€๋ถ„ <sql><include> ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด์„œ ์žฌ์‚ฌ์šฉ ํ•˜๊ธฐ
    • SQL ์ฟผ๋ฆฌ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ

 

  •  ์žฌ์‚ฌ์šฉํ•  SQL ์กฐ๊ฐ์„ <sql> ํƒœ๊ทธ๋กœ ์ •์˜ํ•˜๊ธฐ (์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„)
<sql id="whereDocumentStatus">
    WHERE status = #{status}
</sql>

 

  • <sql> ํƒœ๊ทธ๋ฅผ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์—์„œ <include> ํƒœ๊ทธ๋กœ ํฌํ•จ์‹œ์ผœ ์žฌ์‚ฌ์šฉ ์‹œํ‚ค๊ธฐ
<select id="selectDocumentsByStatus" parameterType="map" resultType="Document">
    SELECT document_id, title, content
    FROM Document
    <include refid="whereDocumentStatus"/>
</select>

 

 

 

parameterType์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด์— null๊ฐ’์ด ์žˆ์„ ๋•Œ
  • ๊ฐ™์ด ๊ฐ์ฒด๊ฐ€ ์ „์ฒด ๊ฐ’์ด ์žˆ์„ ๋•Œ/์ผ๋ถ€ ๊ฐ’์ด null์ผ๋•Œ update๋ฌธ์„ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ค์ •ํ•˜๊ธฐ
  • #{๋ณ€์ˆ˜๋ช…, null๊ฐ’์ด์–ด๋„ ํƒ€์ž…์€ ์ด๊ฑฐ์•ผ ์•Œ๋ ค์ฃผ๊ธฐ}
    • ex) MANAGER_APPROVAL_ID = #{ managerApprovalId , jdbcType=NUMERIC }
    • ex) MANAGER_APPROVAL_DATE = #{ managerApprovalDate , jdbcType=DATE },
    <update id="updateDocument" parameterType="Document">
        update XX_DOCUMENT
        set title = #{title},  content = #{content}, APPROVAL_STATUS = #{approvalStatus},
            MANAGER_APPROVAL_ID = #{managerApprovalId,jdbcType=NUMERIC},
            MANAGER_APPROVAL_DATE = #{managerApprovalDate,jdbcType=DATE},
            DIRECTOR_APPROVAL_ID = #{directorApprovalId,jdbcType=NUMERIC},
            FINAL_APPROVAL_DATE = #{finalApprovalDate,jdbcType=DATE}
        where document_id = #{documentId}
    </update>

 

 

 

๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์ปฌ๋ ‰์…˜ ๋ฐ˜ํ™˜
  • resultType์„ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
  • Map์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ List<Map<String,Object>>
  • ํŠน์ • ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ(์ฆ‰, ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ์ฒด)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ์Œ

 

 

 

๋‚ด๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ํ–ˆ๋˜ ์‹ค์ˆ˜
  • mapper์—์„œ resultType์ด๋‚˜ parameterType์œผ๋กœ ์“ฐ๋Š” ๊ฐ์ฒด์— @NoArgsConstructor ์• ๋„ˆํ…Œ์ด์…˜ ๋ถ™์ธ ๊ฒƒ -> ์ผ๋ถ€ ํ•„๋“œ ๋ฐ”์ธ๋”ฉ์ด ์ž˜ ์•ˆ๋จ
    • ์กฐํšŒ ๊ฒฐ๊ณผ : Document(documentId=null, employeeId=null, title=์—ฐ๊ฐ„ ๋งˆ์ผ€ํŒ… ์ „๋žต ๋ฐ ์‹คํ–‰ ๊ณ„ํš, content=ํ™๋ณด ๋งŽ์ด ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค., approvalStatus=null, managerApprovalId=null, directorApprovalId=null, regDate=null, finalApprovalDate=null)
  • ์กฐํšŒ๊ฒฐ๊ณผ ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ
    •  java.sql.SQLException: ๋ถ€์ ํ•ฉํ•œ ์—ด ์œ ํ˜•: getLong not implemented for class oracle.jdbc.driver.T4CDateAccessor." 
  • ๋ณ€์ˆ˜๋ช… ์˜คํƒ€ 
    •  java.sql.SQLSyntaxErrorException: ORA-00904: "COLUMN_NAME": invalid identifier 
  • mapper ์•ˆ์˜ ์ฟผ๋ฆฌํƒœ๊ทธ id ์ค‘๋ณต์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜
    • java.lang.IllegalArgumentException: Mapped Statements collection already contains value for namespace.mapperId
  • ์˜ค๋ผํด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” SQL ํ‘œ์ค€ ๊ตฌ๋ฌธ ์‚ฌ์šฉ
    • FETCH FIRST ROW ONLY
    •  bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended 
  • mapper์˜ sql๋ฌธ ์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ž…๋ ฅํ•จ
    •  bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: invalid character 
  • ์กฐํšŒ๊ฒฐ๊ณผ ํƒ€์ž… ํด๋ž˜์Šค์˜ ํ•„๋“œ ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ์ˆซ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋•Œ
    •  ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index 7 out of bounds for length 7 
  • ์กฐ๊ฑด์ ˆ์—์„œ Enum์˜ ๊ฐ’ ๋น„๊ต์กฐ๊ฑด์„ ๋„ฃ์€ ๋ถ€๋ถ„์—์„œ ๋‚˜๋Š” ์˜ค๋ฅ˜
    •  java.lang.IllegalArgumentException: invalid comparison: com.study.student.giantUtil.ApprovalStatus and java.lang.String 
    • ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : mapper๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ Enum๊ทธ๋Œ€๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•ด์„œ ๋ฌธ์ž์—ด ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ
    • String approvalStatusStr = searchCondition.getApprovalStatus() != null ? searchCondition.getApprovalStatus().name() : null;
    • map.put("approvalStatus",approvalStatusStr);