[Spring][MyBatis][๊ฐœ๋…] ๐Ÿš€ MyBatis์™€ Spring์˜ ๋งค๋„๋Ÿฌ์šด ํ†ตํ•ฉ: SQL๊ณผ ๊ฐ์ฒด ๋งคํ•‘์˜ ๋น„๋ฐ€ ๐Ÿ”

๊น€์ƒ์šฑยท2024๋…„ 11์›” 3์ผ
0
post-thumbnail

๐Ÿ” MyBatis ๊ฐœ์š”์™€ ํŠน์ง•: SQL๊ณผ ๊ฐ์ฒด ๋งคํ•‘์˜ ๊ฐ„ํŽธํ•จ

MyBatis๋Š” Java ๊ฐ์ฒด์™€ SQL ๋ฌธ์„ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ORM(Object Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฅ์ ์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํฐ ํŠน์ง•์ž…๋‹ˆ๋‹ค. ๊ฐ ํ•ญ๋ชฉ๋ณ„๋กœ MyBatis์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์žฅ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“˜ MyBatis์˜ ์ฃผ์š” ํŠน์ง•

1. Java Object์™€ SQL๋ฌธ ์‚ฌ์ด์˜ ์ž๋™ Mapping ์ง€์›

  • ์„ค๋ช…: MyBatis๋Š” Java ๊ฐ์ฒด์™€ SQL ๋ฌธ ์‚ฌ์ด์˜ ๋งคํ•‘์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ, Java ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ : ๊ฐœ๋ฐœ์ž๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉฐ, MyBatis๊ฐ€ Java ๊ฐ์ฒด์™€ SQL ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ SQL ์‚ฌ์šฉ์˜ ์žฅ์ ์„ ๋™์‹œ์— ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. SQL์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ ๊ด€๋ฆฌ

  • ์„ค๋ช…: SQL ์ฟผ๋ฆฌ๋Š” ๋ณดํ†ต XML ํŒŒ์ผ ๋˜๋Š” ์™ธ๋ถ€ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : SQL ๋กœ์ง์„ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ, SQL ์ฟผ๋ฆฌ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด SQL ํŒŒ์ผ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3. Parameter Mapping ์ž๋™ํ™”

  • ์„ค๋ช…: MyBatis๋Š” Java ๊ฐ์ฒด์˜ ํ•„๋“œ ๊ฐ’์„ SQL ์ฟผ๋ฆฌ์— ์ž๋™์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์— ๋งคํ•‘ํ•˜๋Š” ์ž‘์—…์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ : ์ˆ˜์ž‘์—…์œผ๋กœ SQL์— ๊ฐ’์„ ๋„ฃ๊ณ  ๋นผ๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด ์†์„ฑ๋“ค์ด SQL ๋ฌธ์˜ WHERE ์กฐ๊ฑด์— ์ž๋™์œผ๋กœ ๋งคํ•‘๋˜์–ด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.

4. ์ƒˆ๋กœ์šด DB ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ•™์Šตํ•  ํ•„์š” ์—†์Œ

  • ์„ค๋ช…: Hibernate๋‚˜ JPA์™€ ๊ฐ™์€ ORM ํ”„๋ ˆ์ž„์›Œํฌ๋Š” SQL์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ƒˆ๋กœ์šด DB ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด MyBatis๋Š” SQL์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ•™์Šตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ต์ˆ™ํ•œ SQL ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๊ธฐ์กด SQL์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํŠนํžˆ ์œ ๋ฆฌํ•˜๋ฉฐ, SQL ๊ธฐ๋ฐ˜์˜ ์ž์œ ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. JDBC์˜ ๋ถˆํŽธํ•จ์„ ์ œ๊ฑฐ

  • ์„ค๋ช…: MyBatis๋Š” SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋ณ€ํ™˜์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๋ณต์žกํ•œ JDBC ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : JDBC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ–ˆ๋˜ ๋ณต์žกํ•œ ์ฝ”๋“œ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ค„์ด๊ณ , ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ SQL์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

6. ๋„๋ฉ”์ธ ๊ฐ์ฒด๋‚˜ VO ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ

  • ์„ค๋ช…: MyBatis๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋˜๋Š” VO(Value Object)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ 1:1๋กœ ๋งคํ•‘๋˜์–ด ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ์™€ Java ๊ฐ์ฒด๊ฐ€ ์ผ๋Œ€์ผ๋กœ ๋งคํ•‘๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„์™€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” MyBatis์˜ ์ฃผ์š” ํŠน์ง•: ๊ฐ„ํŽธ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์˜ ORM ํ”„๋ ˆ์ž„์›Œํฌ

MyBatis๋Š” ๊ฐ„๋‹จํ•œ ORM(Persistence Framework)์œผ๋กœ, JDBC์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  SQL๊ณผ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ž๋™ํ™”ํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ SQL ๋ถ„๋ฆฌ ๊ด€๋ฆฌ์™€ ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›์„ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์ธ ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค. ๊ฐ ํ•ญ๋ชฉ๋ณ„๋กœ MyBatis์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์žฅ์ ์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“˜ MyBatis์˜ ํŠน์ง•

1. ์‰ฌ์šด ์ ‘๊ทผ์„ฑ๊ณผ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ

  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ Persistence Framework:

    • MyBatis๋Š” ORM ์ค‘์—์„œ๋„ ๊ตฌ์กฐ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ์‰ฝ๊ฒŒ ๋ฐฐ์›Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐœ๋ฐœ์ž๋Š” SQL ๋ฌธ๋ฒ•์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด MyBatis ์—ญ์‹œ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JDBC ๊ธฐ๋Šฅ์„ ๋Œ€๋ถ€๋ถ„ ์ œ๊ณต:

    • MyBatis๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ XML ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ๋„ JDBC์˜ ๊ธฐ๋Šฅ์„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์ฆ‰, SQL์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ JDBC์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์€ ์ค„์–ด๋“ค์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ต์ˆ™ํ•œ SQL ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๊ฐ„ํŽธํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ JDBC ์ฝ”๋“œ ์ œ๊ฑฐ๋กœ ๊น”๋”ํ•œ ์†Œ์Šค์ฝ”๋“œ ์œ ์ง€:

    • JDBC์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, MyBatis๋Š” ์ด๋Ÿฌํ•œ ๋ณต์žกํ•จ์„ ์ž๋™ํ™”ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž๋™ parameter ์„ค์ •๊ณผ Query ๊ฒฐ๊ณผ ๋งคํ•‘:

    • MyBatis๋Š” SQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ parameter ์„ค์ •๊ณผ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋งคํ•‘์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค๋ฒˆ ๊ฐ’์„ ๋„ฃ๊ณ  ๋นผ๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ๋” ๋‹จ์ˆœํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

2. SQL๋ฌธ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ์˜ ๋ถ„๋ฆฌ

  • SQL ๋ณ€๊ฒฝ ์‹œ Java ์ฝ”๋“œ ์ˆ˜์ • ๋ถˆํ•„์š”:

    • MyBatis๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์™ธ๋ถ€ XML ํŒŒ์ผ์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, SQL ๋ฌธ๋ฒ• ๋ณ€๊ฒฝ ์‹œ Java ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    • ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ๊ฐ„์˜ ๋…๋ฆฝ์„ฑ์ด ๋ณด์žฅ๋˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • SQL ์ž‘์„ฑ๊ณผ ๊ฒ€ํ† ๋ฅผ ์ „๋ฌธ DBA์—๊ฒŒ ๋งก๊ธธ ์ˆ˜ ์žˆ์Œ:

    • SQL๊ณผ ์ฝ”๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด, SQL ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ DBA(Database Administrator)์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋งก๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” ๊ฐœ๋ฐœ์ž์™€ DBA ๊ฐ„์˜ ์—ญํ•  ๋ถ„๋‹ด์„ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์ ์ด๋ฉฐ, SQL ์ฟผ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

3. ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ง€์›

  • Java, C#, .NET, Ruby ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›:
    • MyBatis๋Š” Java๋ฟ ์•„๋‹ˆ๋ผ C#, .NET, Ruby์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ • ์–ธ์–ด์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”Œ๋žซํผ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. MyBatis๋Š” ์ด๋Ÿฌํ•œ ์–ธ์–ด ํ˜ธํ™˜์„ฑ์„ ํ†ตํ•ด ๋” ๋„“์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฑ„ํƒ๋  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

MyBatis์™€ MyBatis-Spring์„ ์‚ฌ์šฉํ•œ DB ์ ‘๊ทผ ๊ตฌ์กฐ: ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ์™€ ๋™์ž‘ ์›๋ฆฌ

MyBatis์™€ MyBatis-Spring์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ , SQL๊ณผ ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋•๋Š” ๊ตฌ์กฐ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๊ณ  ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Application Modules (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ)

  • Service:

    • Service ๊ณ„์ธต์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, Repository(Mapper)์— ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • Repository (Mapper):

    • MyBatis์˜ Mapper๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ Java ๊ฐ์ฒด์— ๋งคํ•‘ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Repository ๊ณ„์ธต์—์„œ๋Š” ์ด Mapper๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜๋ฐ›์Šต๋‹ˆ๋‹ค. Spring ํ™˜๊ฒฝ์—์„œ๋Š” Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋”์šฑ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

2. O/R Mapper (๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘)

  • MyBatis3:

    • MyBatis์˜ ์ตœ์‹  ๋ฒ„์ „์ธ MyBatis3๋Š” ๊ฐ์ฒด์™€ SQL ์ฟผ๋ฆฌ ๊ฐ„์˜ ๋งคํ•‘์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ๋Š” XML ํŒŒ์ผ์ด๋‚˜ ์• ๋…ธํ…Œ์ด์…˜ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐœ๋ฐœ์ž๋Š” Java ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ SQL ์‚ฌ์šฉ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MyBatis-Spring:

    • MyBatis-Spring์€ MyBatis์™€ Spring ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection) ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ MyBatis๋ฅผ ๋งค๋„๋Ÿฝ๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ ๊ฐ™์€ Spring์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. JDBC Interfaces (JDBC ์ธํ„ฐํŽ˜์ด์Šค)

  • JDBC Basic APIs:

    • MyBatis๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. JDBC๋Š” Java์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ API๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ณ  SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. MyBatis๋Š” JDBC API์˜ ๋ณต์žกํ•œ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”ํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ JDBC ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ๊ณผ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • DataSource (Configuration for Connect):

    • DataSource๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๋กœ, DB ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๊ณ  ์—ฐ๊ฒฐ ํ’€(Connection Pool)์„ ํ†ตํ•ด ํšจ์œจ์ ์ธ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. MyBatis์™€ Spring์—์„œ๋Š” DataSource ์„ค์ •์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ตœ์ ํ™”ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์›์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. JDBC Implementations (JDBC ๊ตฌํ˜„)

  • JDBC Driver:
    • JDBC ๋“œ๋ผ์ด๋ฒ„๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ ๊ณ ์œ ํ•œ JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์žˆ์œผ๋ฉฐ, MyBatis๋Š” ์ด ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „๋‹ฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

5. Persistence Layer (์˜์†์„ฑ ๊ณ„์ธต)

  • Database (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค):
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” MyBatis๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. MyBatis๋Š” ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL, Oracle, PostgreSQL ๋“ฑ)์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” MyBatis์™€ MyBatis-Spring์„ ํ™œ์šฉํ•œ Data Access Layer(๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต) ๊ตฌ์กฐ

MyBatis์™€ MyBatis-Spring์„ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์˜ ๊ตฌ์กฐ๋Š” ๊ฐ ๊ณ„์ธต์˜ ์—ญํ• ๊ณผ ํ๋ฆ„์„ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ฐ ๊ณ„์ธต๋ณ„๋กœ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ทธ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Presentation Layer (ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต)

  • Controller:
    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ด๋Š” HTTP ์š”์ฒญ์„ ๋ฐ›์•„ Service ๊ณ„์ธต์— ์ „๋‹ฌํ•˜๊ณ , Service์—์„œ ์ฒ˜๋ฆฌํ•œ ์‘๋‹ต์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต์€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ์—ฐ๊ฒฐ ์ง€์  ์—ญํ• ์„ ํ•˜๋ฉฐ, ์š”์ฒญ์„ Service๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. Service Layer (์„œ๋น„์Šค ๊ณ„์ธต)

  • Service:
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. Service ๊ณ„์ธต์€ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋Š” DAO ๊ณ„์ธต์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต์—์„œ ์ฃผ๋กœ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋„ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ServiceImpl:
    • Service ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋กœ, ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. DAO ๊ฐ์ฒด๋Š” ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)์„ ํ†ตํ•ด ์ด ๊ณ„์ธต์— ์ „๋‹ฌ๋˜๋ฉฐ, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

3. Data Access Layer (๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต)

  • DAO (Data Access Object):
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Service ๊ณ„์ธต์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด DAO๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. DAO๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, ๊ตฌํ˜„์ฒด๋Š” DAOImpl์„ ํ†ตํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.
  • DAOImpl:
    • DAO์˜ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋กœ MyBatis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. SqlSession ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ›์€ ๊ฒฐ๊ณผ๋Š” Java ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

4. MyBatis Framework (MyBatis ํ”„๋ ˆ์ž„์›Œํฌ)

  • SqlSession:
    • MyBatis์˜ ํ•ต์‹ฌ ๊ฐ์ฒด๋กœ, SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. select, insert, update, delete์™€ ๊ฐ™์€ SQL ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ด ๋ฐ์ดํ„ฐ์™€ ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ๋„์™€์ค๋‹ˆ๋‹ค.
  • SqlSessionFactory:
    • SqlSession์„ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด๋กœ, MyBatis ์„ค์ • ํŒŒ์ผ(sqlMapConfig.xml)์„ ๊ธฐ๋ฐ˜์œผ๋กœ SqlSession์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” MyBatis์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ํ•œ ๋ฒˆ ์„ค์ •๋œ ์ดํ›„๋กœ๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด SqlSession์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • sqlMapConfig.xml:
    • MyBatis์˜ ์„ค์ • ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด ๋ฐ ๋งคํผ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. MyBatis๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์ด ์ •์˜๋˜๋ฉฐ, SQL ์ฟผ๋ฆฌ์™€ ๋งคํ•‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ์ •๋ณด๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • mapper.xml:
    • SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ •์˜ํ•˜๋Š” ๋งคํผ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ฐ SQL ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ Java ๊ฐ์ฒด์— ๋งคํ•‘๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋ฉฐ, select ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋Š Java ๊ฐ์ฒด์— ๋งคํ•‘๋ ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • dbinfo.properties:
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URL, ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ์ด ํฌํ•จ๋˜๋ฉฐ, ์™ธ๋ถ€ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ํ™˜๊ฒฝ ์„ค์ •์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. Database (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ตœ์ข…์ ์œผ๋กœ MyBatis๊ฐ€ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. SqlSession์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋Š” ๋‹ค์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. MySQL, Oracle, PostgreSQL ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • ๋…น์ƒ‰ ํ™”์‚ดํ‘œ (DI, ์˜์กด์„ฑ ์ฃผ์ž…): ServiceImpl์— DAO ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๊ฐ„์ ‘์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋นจ๊ฐ„์ƒ‰ ํ™”์‚ดํ‘œ (request, ์š”์ฒญ): ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด Controller์—์„œ ์‹œ์ž‘๋˜์–ด Service ๊ณ„์ธต์œผ๋กœ ์ „๋‹ฌ๋˜๊ณ , ๋‹ค์‹œ DAO ๊ณ„์ธต์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋ณด๋ผ์ƒ‰ ํ™”์‚ดํ‘œ (wiring, ์—ฐ๊ฒฐ): SqlSessionFactory๊ฐ€ SqlSession์„ ์ƒ์„ฑํ•˜๊ณ , SqlSession์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ์ƒ‰ ํ™”์‚ดํ‘œ (DB access, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ): SqlSession์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

๐Ÿ” MyBatis์™€ MyBatis-Spring์˜ SQL ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค์™€ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

์ด ๊ตฌ์กฐ๋Š” MyBatis์˜ SQL ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. MyBatis์™€ Spring์˜ ํ†ตํ•ฉ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• ๊ณผ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


MyBatis ์ฃผ์š” Component

1. MyBatis Config File (์„ค์ • ํŒŒ์ผ)

  • ์„ค๋ช…: MyBatis์˜ ์„ค์ • ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, ๋งคํผ ํŒŒ์ผ ์œ„์น˜, ๊ธฐํƒ€ MyBatis ๋™์ž‘ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ํ†ตํ•ด MyBatis๊ฐ€ SQL ์ฟผ๋ฆฌ์™€ ๊ฐ์ฒด ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์„ค์ •์„ ์ฝ์–ด๋“ค์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ MyBatis์˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ๋‹ด๋‹นํ•˜์—ฌ, ์˜ฌ๋ฐ”๋ฅธ ์„ค์ •์— ๋”ฐ๋ผ MyBatis๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

2. SqlSessionFactoryBuilder (์ฒ˜์Œ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค)

  • ์„ค๋ช…: SqlSessionFactoryBuilder๋Š” MyBatis ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋นŒ๋” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด SqlSessionFactory ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด SqlSessionFactory๋Š” MyBatis์˜ ํ•ต์‹ฌ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

3. SqlSessionFactory

  • ์„ค๋ช…: SqlSessionFactory๋Š” SqlSession ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ˆ˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ SqlSession์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• : MyBatis์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ํ•„์š”ํ•œ SqlSession ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4. Application (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์š”์ฒญ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค)

  • ์„ค๋ช…: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด SqlSessionFactory์—์„œ SqlSession์„ ์ƒ์„ฑํ•˜์—ฌ, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

5. SqlSession (์š”์ฒญ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค)

  • ์„ค๋ช…: SqlSession์€ MyBatis๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : ๋งคํ•‘ ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ๋˜์–ด ์ข…๋ฃŒ ์‹œ ๋‹ซํžˆ๋Š” ๊ตฌ์กฐ๋กœ, ์š”์ฒญ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๋…๋ฆฝ์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

6. Mapping File (๋งคํ•‘ ํŒŒ์ผ - ์š”์ฒญ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค)

  • ์„ค๋ช…: ๋งคํ•‘ ํŒŒ์ผ์€ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ •์˜ํ•˜๋Š” XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด์˜ ๋งคํ•‘ ๊ทœ์น™์„ ์„ค์ •ํ•˜์—ฌ, MyBatis๊ฐ€ SQL ์‹คํ–‰ ์‹œ ์ž…๋ ฅ ๊ฐ’๊ณผ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ๊ฐ ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด์— ๋งคํ•‘๋ ์ง€๋ฅผ ์ด ํŒŒ์ผ์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

7. Database (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

  • ์„ค๋ช…: ์ตœ์ข…์ ์œผ๋กœ MyBatis๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : SqlSession์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ €์žฅ, ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์ด ์ด๊ณณ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํ๋ฆ„ ์„ค๋ช…

  1. ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค:

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ MyBatis Config File์„ ์ฝ์–ด MyBatis๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
    • SqlSessionFactoryBuilder๊ฐ€ ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์—๋งŒ ํ•œ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. ์š”์ฒญ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค:

    • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ SqlSessionFactory๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด SqlSession์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • SqlSession์€ ๋งคํ•‘ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด SqlSession์ด ์ƒ์„ฑ๋˜๊ณ , ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
    • SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” MyBatis์™€ MyBatis-Spring์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ ์„ค๋ช…

MyBatis๋Š” SQL ์ฟผ๋ฆฌ์™€ ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. MyBatis-Spring์€ Spring ํ”„๋ ˆ์ž„์›Œํฌ์™€ MyBatis์˜ ํ†ตํ•ฉ์„ ๋„์™€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ ์„ค์ •์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


MyBatis์™€ MyBatis-Spring์˜ ์ฃผ์š” Component

1. MyBatis ์„ค์ • ํŒŒ์ผ (sqlMapConfig.xml)

  • ์—ญํ• :
    • MyBatis ์„ค์ • ํŒŒ์ผ์€ MyBatis๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ณ  SQL์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์† ์ •๋ณด(URL, ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ)์™€ ๊ฐ์ฒด์˜ ๋ณ„์นญ ์„ค์ •, ๋งคํ•‘ ํŒŒ์ผ ์œ„์น˜ ๋“ฑ MyBatis๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ํŒŒ์ผ์€ MyBatis๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ๊ฐ์ข… ์„ค์ •์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ MyBatis์˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. SqlSessionFactoryBuilder

  • ์—ญํ• :
    • SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋นŒ๋” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. MyBatis ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SqlSessionFactory๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋นŒ๋”๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜์—ฌ MyBatis์˜ ์ „๋ฐ˜์ ์ธ ์„ค์ •์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ฐ์ฒด๊ฐ€ ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ํ•„์š”ํ•œ SqlSessionFactory๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๊ฐ์ข… ์„ค์ •์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

3. SqlSessionFactory

  • ์—ญํ• :
    • SqlSession ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ๋กœ, MyBatis์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด SqlSession์„ ์ƒ์„ฑํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • Thread-safeํ•˜์—ฌ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ ํ›„, ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด SqlSession์„ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • SqlSessionFactory๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ SqlSession์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ณ  SQL์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

4. SqlSession

  • ์—ญํ• :
    • SQL ์‹คํ–‰๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” MyBatis์˜ ํ•ต์‹ฌ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. MyBatis๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ•„์š”ํ•œ SQL ์ฟผ๋ฆฌ ์‹คํ–‰, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Thread-safeํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด SqlSession ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ๋งค ์š”์ฒญ ์‹œ SqlSession์ด ์—ด๋ฆฌ๊ณ  ์ž‘์—… ์™„๋ฃŒ ํ›„ ๋‹ซํžˆ๋Š” ๊ตฌ์กฐ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ฐ์ฒด๋Š” SQL ์‹คํ–‰๊ณผ ๋”๋ถˆ์–ด, ๋งคํ•‘ ํŒŒ์ผ์— ์ •์˜๋œ ๊ทœ์น™์— ๋”ฐ๋ผ SQL์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ Java ๊ฐ์ฒด์™€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

5. Mapping ํŒŒ์ผ (์˜ˆ: member.xml)

  • ์—ญํ• :
    • MyBatis์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋งคํ•‘ ํŒŒ์ผ๋กœ, SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ํŒŒ์ผ์—๋Š” SQL ์ฟผ๋ฆฌ์™€ ๊ฐ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์— ๋งคํ•‘ํ•˜๋Š” ๊ทœ์น™์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, select ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํŠน์ • Java ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •์ด ์ด ํŒŒ์ผ์— ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋งคํ•‘ ํŒŒ์ผ์€ XML ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, ๊ฐ์ฒด์™€ SQL ๊ฐ„์˜ ๋งคํ•‘ ์ž‘์—…์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด SQL ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” MyBatis-Spring ํ†ตํ•ฉ: ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ์™€ ์—ญํ• 

MyBatis-Spring ํ†ตํ•ฉ ๊ตฌ์กฐ๋Š” MyBatis์™€ Spring์ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ SQL ์ฟผ๋ฆฌ ์‹คํ–‰, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋ฉฐ, ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


MyBatis-Spring์˜ ์ฃผ์š” Component

1. SpringBean ์„ค์ • ํŒŒ์ผ (member.xml)

  • ์„ค๋ช…: SpringBean ์„ค์ • ํŒŒ์ผ์€ MyBatis์™€ Spring์ด ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์„ค์ •์„ ๋‹ด๊ณ  ์žˆ๋Š” XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ์ด ํŒŒ์ผ์€ MyBatis์˜ ๋งคํผ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ , DataSource ๋ฐ SqlSessionFactory ๋“ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์œ„ํ•œ Bean์„ ์„ค์ •ํ•˜์—ฌ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ Bean์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

2. SqlSessionFactoryBean

  • ์„ค๋ช…: MyBatis-Spring์˜ ํ•ต์‹ฌ Bean์œผ๋กœ, SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : Spring ํ™˜๊ฒฝ์—์„œ SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด MyBatis์˜ SqlSessionFactory๊ฐ€ Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ์—ฐ๊ฒฐ ํ’€ ์„ค์ •๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๊ณผ ํ†ตํ•ฉ๋˜์–ด, SQL ์„ธ์…˜์ด Spring ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ํ•˜์— ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. SqlSessionFactory

  • ์„ค๋ช…: SqlSessionFactory๋Š” SqlSession ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” MyBatis์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค SqlSession์„ ์ƒ์„ฑํ•˜์—ฌ SQL ์‹คํ–‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Spring ํ™˜๊ฒฝ์—์„œ๋Š” SqlSessionTemplate๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด, ์•ˆ์ „ํ•˜๊ฒŒ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

4. SqlSessionTemplate

  • ์„ค๋ช…: SqlSessionTemplate์€ SqlSession ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ Spring Bean์œผ๋กœ, Spring๊ณผ MyBatis ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋•๋Š” ์ฃผ์š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : SQL ์ฟผ๋ฆฌ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ(commit(), rollback(), insert(), delete(), selectOne(), selectList() ๋“ฑ)๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ SQL ์‹คํ–‰์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. SqlSessionTemplate์„ ์‚ฌ์šฉํ•˜๋ฉด Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

5. SqlSession ์ธํ„ฐํŽ˜์ด์Šค

  • ์„ค๋ช…: MyBatis์˜ ํ•ต์‹ฌ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, SQL ์ฟผ๋ฆฌ ์‹คํ–‰๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : SQL ์‹คํ–‰์„ ํฌํ•จํ•˜์—ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, Spring์—์„œ๋Š” SqlSessionTemplate์ด ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ SQL ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

6. MyBatis ์„ค์ • ํŒŒ์ผ (sqlMapConfig.xml)

  • ์„ค๋ช…: MyBatis์˜ ์„ค์ • ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด์™€ MyBatis์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : MyBatis๊ฐ€ SQL์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ์„ค์ • ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, ๋งคํผ ํŒŒ์ผ ๊ฒฝ๋กœ, ํŠธ๋žœ์žญ์…˜ ์„ค์ • ๋“ฑ์ด ์ด ํŒŒ์ผ์— ์ •์˜๋ฉ๋‹ˆ๋‹ค. Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ MyBatis์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์„ค์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

7. Mapping ํŒŒ์ผ (member.xml)

  • ์„ค๋ช…: SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ •์˜ํ•˜๋Š” MyBatis์˜ ๋งคํ•‘ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ๊ฐ SQL ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค Java ๊ฐ์ฒด์— ๋งคํ•‘๋˜๋Š”์ง€ ๊ทœ์น™์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งคํ•‘ ํŒŒ์ผ์„ ํ†ตํ•ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ž๋™์œผ๋กœ Java ๊ฐ์ฒด์— ๋ณ€ํ™˜๋˜์–ด ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ๋งคํ•‘ ์„ค์ •๋งŒ์œผ๋กœ SQL๊ณผ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. DataSource

  • ์„ค๋ช…: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” Spring์˜ DataSource ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ์—ฐ๊ฒฐ ํ’€์„ ๊ด€๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋†’์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์ด ๋™์‹œ์— ์—ด๋ฆฌ๊ณ  ๋‹ซํžˆ๋Š” ๊ณผ์ •์„ ๊ด€๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

9. MemberDaoImpl

  • ์„ค๋ช…: DAO(Data Access Object)์˜ ๊ตฌํ˜„์ฒด๋กœ, ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : SqlSessionTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” search(userid)๋‚˜ ํšŒ์›์„ ๋“ฑ๋กํ•˜๋Š” register(MemberDto) ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ MyBatis-Spring์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ์™€ ์—ญํ•  ๐ŸŽฏ

MyBatis-Spring์€ MyBatis์™€ Spring์ด ํ†ตํ•ฉ๋˜์–ด SQL ์ฟผ๋ฆฌ ์‹คํ–‰, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์†์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด ํ‘œ๋Š” MyBatis-Spring์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์„ค๋ช…ํ•˜๋ฉฐ, ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋ฉฐ ์ดํ•ดํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿ‘€


๐Ÿ› ๏ธ MyBatis-Spring์˜ ์ฃผ์š” Component

1. MyBatis ์„ค์ • ํŒŒ์ผ (sqlMapConfig.xml)

  • ์„ค๋ช…:
    • MyBatis ์„ค์ • ํŒŒ์ผ์€ Dto ๊ฐ์ฒด์˜ ๋ณ„์นญ(alias)๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ MyBatis๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ์„ค์ •์„ ๋‹ด๊ณ  ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ํ†ตํ•ด MyBatis๋Š” SQL๊ณผ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • MyBatis๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฐ์ฒด์™€ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ URL๊ณผ ๋งคํ•‘ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๊ธฐ์— ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

2. SqlSessionFactoryBean

  • ์„ค๋ช…:
    • SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Spring Bean์ž…๋‹ˆ๋‹ค.
    • ์ด Bean์€ MyBatis ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • MyBatis์˜ SQL ์„ธ์…˜ ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ ์—ฐ๋™๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • SQL ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์œ„ํ•œ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ Spring Bean์œผ๋กœ ๋“ฑ๋ก๋˜์–ด, ํŠธ๋žœ์žญ์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

3. SqlSessionTemplate

  • ์„ค๋ช…:
    • SqlSessionTemplate์€ MyBatis์—์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • SqlSession ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ Thread-safeํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์š”์ฒญ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • selectOne(), selectList(), insert(), update(), delete() ๋“ฑ์˜ ๋‹ค์–‘ํ•œ SQL ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜์—ฌ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • Spring์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ์™€ SQL ์‹คํ–‰์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋ฉฐ, MyBatis์™€ Spring์ด ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

4. Mapping ํŒŒ์ผ (member.xml)

  • ์„ค๋ช…:
    • MyBatis์—์„œ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘(ORM)์„ ์„ค์ •ํ•˜๋Š” XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • ๊ฐ SQL ์ฟผ๋ฆฌ์™€ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ค Java ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐํ• ์ง€๋ฅผ ์ •์˜ํ•˜์—ฌ, SQL ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ๋•Œ select ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ MemberDto ๊ฐ์ฒด์— ๋งคํ•‘๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋งคํ•‘ ํŒŒ์ผ์„ ํ†ตํ•ด ๊ฐ์ฒด์™€ SQL ์ฟผ๋ฆฌ ๊ฐ„์˜ ๋งคํ•‘์ด ํšจ์œจ์ ์ด๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

5. Spring Bean ์„ค์ • ํŒŒ์ผ (beans.xml)

  • ์„ค๋ช…:
    • Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ ๋ชจ๋“  Bean์„ ์ •์˜ํ•˜๋Š” XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • SqlSessionFactoryBean, SqlSessionTemplate, DataSource ์ •๋ณด ๋ฐ MyBatis ์„ค์ • ํŒŒ์ผ์„ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ, MyBatis์™€ Spring์ด ํ†ตํ•ฉ๋œ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด DataSource, SqlSessionFactory, SqlSessionTemplate ๋“ฑ์˜ ๊ฐ์ฒด๋“ค์ด ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ SQL ๋งคํ•‘์ด ์›ํ™œํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๐ŸŽฏ MyBatis3์˜ Mapper Interface: ๊ฐœ๋…๊ณผ ์—ญํ• 

MyBatis3์—์„œ ๋„์ž…๋œ Mapper Interface๋Š” MyBatis๊ฐ€ SQL์„ ๋” ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ Java ์ฝ”๋“œ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, SQL๊ณผ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ํ•ญ๋ชฉ๋ณ„๋กœ ์ž์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿš€


๐Ÿ’ก MyBatis3์˜ Mapper Interface ์ฃผ์š” ๊ฐœ๋…

1. Mapper Interface๋ž€?

  • ์„ค๋ช…:
    • Mapper Interface๋Š” MyBatis์—์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. MyBatis๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ XML ํŒŒ์ผ์— ๋ณ„๋„๋กœ ์ •์˜ํ•˜๋Š”๋ฐ, ์ด๋ฅผ Java์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋งคํ•‘๋œ SQL์„ Java ์ฝ”๋“œ์—์„œ ์‰ฝ๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • MyBatis๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ๋งคํ•‘ ํŒŒ์ผ์— ์ •์˜ํ•˜๊ณ , Java ์ฝ”๋“œ์—์„œ๋Š” Mapper Interface๋ฅผ ํ†ตํ•ด ๊ทธ SQL์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ , ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜์™€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

2. ํƒ€์ž… ์•ˆ์ „์„ฑ(Type Safe)์„ ๋ณด์žฅํ•˜๋Š” SQL ํ˜ธ์ถœ

  • ์„ค๋ช…:
    • Mapper Interface๋Š” MyBatis 3.x๋ถ€ํ„ฐ ๋„์ž…๋˜์–ด ํƒ€์ž… ์•ˆ์ „์„ฑ(Type Safety)์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ฃผ์–ด, ์•ˆ์ „ํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • ํƒ€์ž… ์•ˆ์ „์„ฑ์ด๋ž€, ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํ™•์ธํ•˜์—ฌ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” SQL ํ˜ธ์ถœ ์‹œ String ํƒ€์ž…์œผ๋กœ ๊ด€๋ฆฌ๋˜์–ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋นˆ๋ฒˆํ–ˆ์ง€๋งŒ, Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด: selectUserById(int userId)์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด userId๊ฐ€ int ํƒ€์ž…์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜์—ฌ, SQL ํ˜ธ์ถœ ์‹œ ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

3. ๋งคํ•‘ ํŒŒ์ผ๊ณผ์˜ ์—ฐ๊ฒฐ

  • ์„ค๋ช…:
    • Mapper Interface๋Š” ๋งคํ•‘ ํŒŒ์ผ์— ์ •์˜๋œ SQL ์ฟผ๋ฆฌ์™€ Java ์ฝ”๋“œ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋งคํ•‘ ํŒŒ์ผ์—์„œ SQL์ด ์ •์˜๋˜๋ฉด, ์ด๋ฅผ Mapper Interface๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜์—ฌ Java ์ฝ”๋“œ์—์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• :
    • ๋งคํ•‘ ํŒŒ์ผ์—์„œ SQL ์ฟผ๋ฆฌ์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„๊ณผ ๋งคํ•‘ ๊ทœ์น™์„ ์ •์˜ํ•œ ๋’ค, Java์˜ Mapper Interface์—์„œ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋กœ์จ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘ ์ž‘์—…์„ ๊ฐ„ํŽธํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋ฌธ์ œ์ 

MyBatis3์—์„œ Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์€ ์ฝ”๋“œ์˜ ์•ˆ์ „์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๋ฉฐ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ๋ถˆํŽธํ•จ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ๋ถ€๋ถ„์„ ์ƒ์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!


๐Ÿ”ธ Mapper Interface ๋ฏธ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค

1. SQL ํ˜ธ์ถœ ๋ฐฉ์‹

  • ์„ค๋ช…:
    • Mapper Interface ์—†์ด SQL์„ ํ˜ธ์ถœํ•˜๋ฉด, SqlSession ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉฐ, SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด session.selectOne("com.ssafy.MemberDao.search", userid)์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace)์™€ SQL ID๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ฌธ์ž์—ด์„ SQL ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ์ :
    • ์ด ๋ฐฉ์‹์€ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜คํƒ€๋‚˜ ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.
    • ๋˜ํ•œ, SQL ํ˜ธ์ถœ ๋ฐฉ์‹์ด ๋ณต์žกํ•ด์ ธ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

2. Namespace + SQL ID๋กœ ์ง€์ •

  • ์„ค๋ช…:
    • Mapper Interface๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, SQL ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ SQL ID๋ฅผ ์กฐํ•ฉํ•˜์—ฌ SQL์„ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, com.ssafy.MemberDao๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๊ณ  search๋Š” SQL ID๋กœ, ์ด ๋‘˜์„ "namespace + '.' + SQL ID" ํ˜•์‹์œผ๋กœ ๋ฌธ์ž์—ด์— ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ์ :
    • SQL ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ฌธ์ž์—ด๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ SQL ID๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฐ˜๋ณต์ ์ธ ๋ฌธ์ž์—ด ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์ง€๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
    • ์ด ๋ฐฉ์‹์€ SQL ID๊ฐ€ ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ID ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ํ˜ธ์ถœ์˜ ๋ฌธ์ œ์ 

  • ์„ค๋ช…:
    • SQL ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ์˜คํƒ€๋‚˜ ์ž˜๋ชป๋œ ๊ฐ’์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์‹ค์ˆ˜๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๊ฐ์ง€๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋˜ํ•œ, ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— IDE์˜ ์ฝ”๋“œ ๋ณด์กฐ ๊ธฐ๋Šฅ(code assist), ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์™„์„ฑ์ด๋‚˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์˜ ์ง€์›์„ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ์ :
    • ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ๋ฅ ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
    • ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์ด ํฌ๊ฒŒ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด IDE์—์„œ ์ฟผ๋ฆฌ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ง€์›๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜์—์„œ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ”น ๋งคํผ XML ํŒŒ์ผ ์„ค๋ช…

  • ๋งคํผ ํŒŒ์ผ์€ MyBatis์—์„œ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘ ๊ทœ์น™์„ ์ •์˜ํ•œ XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ์˜ <mapper namespace="com.ssafy.MemberDao">๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ, ์ด ํŒŒ์ผ์— ์ •์˜๋œ SQL ์ฟผ๋ฆฌ๋“ค์ด com.ssafy.MemberDao๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ•˜์—์„œ ๊ด€๋ฆฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • <select id="search" parameterType="String">๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•œ ๋ถ€๋ถ„์œผ๋กœ, ์—ฌ๊ธฐ์„œ search๋Š” SQL ID์ด๋ฉฐ, ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์€ "String"์ž…๋‹ˆ๋‹ค. ์ด ์ฟผ๋ฆฌ๋Š” userid๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ๋ฌธ์ œ์  ์š”์•ฝ

  • ์˜คํƒ€ ์œ„ํ—˜: ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ SQL์„ ์‹๋ณ„ํ•˜๋ฏ€๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋‚˜ SQL ID๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ์ง€๋˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„์—๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.
  • IDE ์ง€์› ๋ถ€์กฑ: ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์—์„œ๋Š” ์ž๋™์™„์„ฑ, ํƒ€์ž… ํ™•์ธ ๋“ฑ์˜ IDE ์ฝ”๋“œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด, ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

๐Ÿ” MyBatis3์˜ Mapper Interface ์‚ฌ์šฉ ์‹œ ๊ตฌ์กฐ์™€ ์ž‘๋™ ๋ฐฉ์‹

MyBatis3์—์„œ Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, SQL ํ˜ธ์ถœ์ด ๋”์šฑ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” MyBatis๊ฐ€ SQL๊ณผ Java ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ทธ ์—ญํ• ์„ ์ƒ์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š


๐ŸŒŸ MyBatis3์˜ Mapper Interface ์‚ฌ์šฉ ์‹œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์—ญํ• 

1. Mapper Interface๋ฅผ ํ†ตํ•œ SQL ํ˜ธ์ถœ

  • ์„ค๋ช…:
    • Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•  ํ•„์š” ์—†์ด ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋งŒ์œผ๋กœ SQL์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
    • userMapper.search(userid)์™€ ๊ฐ™์ด, userMapper๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•ด SQL์„ ์‹คํ–‰ํ•˜๋ฉฐ, userid๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • SQL ํ˜ธ์ถœ์ด ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

2. ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งคํ•‘๋œ SQL

  • ์„ค๋ช…:
    • MyBatis๋Š” Mapper Interface์™€ ๋งคํ•‘ ํŒŒ์ผ(XML)์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Mapper Interface์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, MyBatis๋Š” ๋งคํ•‘ ํŒŒ์ผ์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐ๋œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์•„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์กฐ:
    • ๋งคํ•‘ ํŒŒ์ผ์—์„œ <mapper namespace="com.ssafy.dao.UserMapper">๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ Mapper Interface์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ , <select id="search" parameterType="String">๋Š” SQL ID์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ •์˜ํ•˜์—ฌ search(userid) ๋ฉ”์„œ๋“œ๊ฐ€ SQL ์ฟผ๋ฆฌ์™€ ์—ฐ๊ฒฐ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

3. UserMapper Interface์˜ ๊ตฌ์„ฑ

  • ์„ค๋ช…:
    • UserMapper ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ Mapper Interface๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  SQL ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ์š”์†Œ:
    • search๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” userid๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ SQL ์ฟผ๋ฆฌ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜๋ฉฐ, IDE์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ ์ž‘์„ฑ์ด ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค.

4. Namespace์™€ SQL ID ๊ตฌ์„ฑ

  • ์„ค๋ช…:
    • MyBatis์—์„œ๋Š” ๋งคํ•‘ ํŒŒ์ผ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •ํ™•ํžˆ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก Namespace์™€ SQL ID๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ๋ฐฉ์‹:
    • ๋งคํผ ํŒŒ์ผ์˜ <mapper> ํƒœ๊ทธ์—์„œ namespace๋Š” packagename.InterfaceName ํ˜•์‹์œผ๋กœ ์ •์˜๋˜๋ฉฐ, SQL ID๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, com.ssafy.dao.UserMapper๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, search๊ฐ€ SQL ID๋กœ ์ง€์ •๋˜๋ฉฐ, search ๋ฉ”์„œ๋“œ๊ฐ€ XML์˜ <select id="search">์™€ ์ž๋™ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • ์ด๋ฅผ ํ†ตํ•ด Mapper Interface์™€ ๋งคํ•‘ ํŒŒ์ผ์ด ์ •ํ™•ํ•˜๊ฒŒ ๋งคํ•‘๋˜๋ฉฐ, SQL ํ˜ธ์ถœ์ด ์ง๊ด€์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

5. ๋งคํ•‘๊ณผ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์˜ ์—ฐ๊ฒฐ

  • ์„ค๋ช…:
    • Mapper Interface์™€ ๋งคํ•‘ ํŒŒ์ผ์„ ํ†ตํ•ด, ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์™€ SQL ID๊ฐ€ 1:1๋กœ ์—ฐ๊ฒฐ๋˜์–ด SQL๊ณผ Java ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
  • ์ž‘๋™ ๋ฐฉ์‹:
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๋งคํ•‘ ํŒŒ์ผ์˜ SQL ID๊ฐ€ ์ผ์น˜ํ•  ๊ฒฝ์šฐ, MyBatis๋Š” ์ด ๋‘˜์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ํ•ด๋‹น SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

โœจ ์ด ๊ตฌ์กฐ์˜ ์žฅ์ 

  1. ํƒ€์ž… ์•ˆ์ „์„ฑ:

    • ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋งž์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  2. IDE ์ฝ”๋“œ ์ง€์›:

    • Mapper Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด IDE์—์„œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ๊ณผ ์ฝ”๋“œ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด, ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฉ”์„œ๋“œ๋ฅผ ํด๋ฆญํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋กœ ์‰ฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ:

    • SQL ํ˜ธ์ถœ ์‹œ ์ง์ ‘ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ SQL์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๊ณ  SQL ํ˜ธ์ถœ์ด ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

๐ŸŒ MyBatis์™€ Spring์˜ ์—ฐ๋™: ๊ตฌ์กฐ์™€ ์„ค์ • ๋ฐฉ๋ฒ•

MyBatis๋ฅผ Spring๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, DI(์˜์กด์„ฑ ์ฃผ์ž…) ๋“ฑ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋”์šฑ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ MyBatis๋ฅผ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ์™€ Spring๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ  Spring๊ณผ์˜ ์—ฐ๋™์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์„ค์ •๊ณผ ์˜์กด์„ฑ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ MyBatis์™€ Spring ์—ฐ๋™์˜ ์ฃผ์š” ๊ฐœ๋…

1. MyBatis๋ฅผ Standalone(๋‹จ๋…)์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ์„ค๋ช…:
    • MyBatis๋ฅผ Standalone(๋‹จ๋…)์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, MyBatis์˜ SqlSessionFactory ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋ฐฉ์‹์€ Spring ์—†์ด MyBatis๋งŒ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • SqlSessionFactory๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ค์ •์ด ๋‹ค์†Œ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋‚˜ ์˜์กด์„ฑ ์ฃผ์ž… ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜์ง€ ์•Š์•„, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์—์„œ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Spring๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ์„ค๋ช…:
    • Spring๊ณผ ์—ฐ๋™ํ•˜๋ฉด MyBatis ๊ด€๋ จ ๊ฐ์ฒด๋“ค์„ Spring ์ปจํ…Œ์ด๋„ˆ์— Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ Spring์˜ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด MyBatis ๊ฐ์ฒด๋“ค์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • Spring์˜ DI(์˜์กด์„ฑ ์ฃผ์ž…)๋ฅผ ํ†ตํ•ด MyBatis์˜ SqlSessionFactory๋‚˜ SqlSessionTemplate ๊ฐ™์€ ๊ฐ์ฒด๋“ค์„ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ MyBatis ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ๋นˆ ์„ค์ •์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๊ฒฐํ•ด์ง‘๋‹ˆ๋‹ค.

3. Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

  • ์„ค๋ช…:
    • Spring์€ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋ฉฐ, MyBatis์™€ ์—ฐ๋™ํ•˜๋ฉด Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ž๋™ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • Spring์˜ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ณต์žกํ•œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด, Spring์ด ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ SQL ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Spring ์—ฐ๋™์„ ์œ„ํ•ด ํ•„์š”ํ•œ MyBatis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์„ค๋ช…:
    • MyBatis๋ฅผ Spring๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด MyBatis์˜ Spring ์—ฐ๋™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ์œ„ํ•ด Maven ๋˜๋Š” Gradle๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ๋„๊ตฌ์—์„œ mybatis์™€ mybatis-spring ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ์˜์กด์„ฑ:
    • mybatis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: MyBatis์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    • mybatis-spring ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: MyBatis์™€ Spring์„ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, Spring์˜ DI ๋ฐ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ์˜์กด์„ฑ ์„ค์ • ์˜ˆ์‹œ (Maven)

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>${org.mybatis-version}</version>
</dependency>

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>${org.mybatis-spring-version}</version>
</dependency>
  • ์„ค๋ช…:
    • ์œ„ ์„ค์ •์€ Maven์—์„œ MyBatis์™€ Spring์„ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์˜์กด์„ฑ์ž…๋‹ˆ๋‹ค.
    • mybatis๋Š” MyBatis ์ž์ฒด๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ, mybatis-spring์€ Spring ์—ฐ๋™์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    • ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์€ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒ MyBatis์™€ Spring ์—ฐ๋™: DataSource ์„ค์ •๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ

MyBatis์™€ Spring์„ ์—ฐ๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ๊ณผ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. Spring์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ •(DataSource)์„ ๊ด€๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ˆ์ „ํ•œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ Spring์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š


๐Ÿ“Œ DataSource ์„ค์ • ๊ฐœ์š”

1. Spring์—์„œ DataSource ๊ด€๋ฆฌ

  • ์„ค๋ช…:
    • Spring์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด(์˜ˆ: URL, ์‚ฌ์šฉ์ž๋ช…, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)๋ฅผ Spring์˜ ์„ค์ • ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด MyBatis ์„ค์ • ํŒŒ์ผ์—์„œ ์ผ๋ถ€ ์„ค์ •์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Spring์ด DataSource๋ฅผ ๋นˆ(Bean)์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด ๋นˆ์„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • DataSource ์„ค์ •์ด Spring ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์—์„œ ํ†ตํ•ฉ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

2. Spring ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ์—์„œ DataSource ์„ค์ •

  • ์„ค๋ช…:

    • ์ผ๋ฐ˜์ ์œผ๋กœ application-context.xml๊ณผ ๊ฐ™์€ Spring ์„ค์ • ํŒŒ์ผ์—์„œ DataSource๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์— ํ•„์š”ํ•œ ์ •๋ณด(์˜ˆ: URL, ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค, ์‚ฌ์šฉ์ž๋ช…, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์„ค์ • ํŒŒ์ผ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ตฌ์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ํŒŒ์ผ๋กœ, Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ DataSource๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ์š”์†Œ:

    • driverClass: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค ์ด๋ฆ„
    • url: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URL
    • username๊ณผ password: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ
  • ์˜ˆ์‹œ ์ฝ”๋“œ:

    <bean id="ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssafyweb?serverTimezone=UTC&amp;useUnicode=yes&amp;characterEncoding=UTF-8"/>
        <property name="username" value="ssafy"/>
        <property name="password" value="ssafy"/>
    </bean>
  • ์„ค๋ช…:

    • id="ds": DataSource๋ฅผ ds๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ, ํ•„์š” ์‹œ ์ด ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • driverClass์™€ url: MySQL ๋“œ๋ผ์ด๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์—ฐ๊ฒฐ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • username๊ณผ password: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์— ํ•„์š”ํ•œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

3. DataSource๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด

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

4. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ

  • ์„ค๋ช…:
    • MyBatis์™€ Spring์ด ์—ฐ๋™๋˜๋ฉด, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์—ญ์‹œ Spring์ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์˜ ์‹œ์ž‘, ์ปค๋ฐ‹, ๋กค๋ฐฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์ด ์ž๋™ํ™”๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • Spring์˜ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ค‘๊ฐ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ ๋กค๋ฐฑ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ Connection Pool ์„ค์ •

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด, JNDI(Java Naming and Directory Interface)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Connection Pool์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Connection Pool์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/ssafy"/>
</bean>
  • ์„ค๋ช…:
    • id="dataSource": JNDI๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” Connection Pool์„ ๊ด€๋ฆฌํ•˜๋Š” DataSource ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
    • jndiName: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•œ Connection Pool์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์„ ํ†ตํ•ด Connection Pool์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • Connection Pool์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๊ฐ€ ๋”์šฑ ํšจ์œจ์ ์ด๋ฏ€๋กœ ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ์•ˆ์ •์ ์ธ ๋™์ž‘์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ผ JNDI (Java Naming and Directory Interface): ์ด๋ฆ„์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ! ๐ŸŒ

JNDI๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋„คํŠธ์›Œํฌ์ƒ์˜ ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค์— ์ด๋ฆ„๋งŒ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ API์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋ฉ”์ผ ์„œ๋ฒ„ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์ž์›์„ ์ด๋ฆ„์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“Œ ์•„๋ž˜์—์„œ JNDI์˜ ๊ฐœ๋…๊ณผ ๊ทธ ํ™œ์šฉ์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


๐Ÿ“š JNDI์˜ ๊ฐœ๋…

  • JNDI๋Š” ์ด๋ฆ„๊ณผ ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ ๋„ค์ด๋ฐ ์„œ๋น„์Šค๋ฅผ ์ถ”์ƒํ™”ํ•œ API์ž…๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ฐ์ฒด๊ฐ€ ์–ด๋””์— ์œ„์น˜ํ•ด ์žˆ๋Š”์ง€ ๋ชฐ๋ผ๋„ ์ด๋ฆ„์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” JNDI์˜ ์ฃผ์š” ์šฉ๋„

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๐Ÿ—„๏ธ:

    • ์—ฐ๊ฒฐ ํ’€(Connection Pool)์„ ์„ค์ •ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(์˜ˆ: Tomcat, WebLogic)๊ฐ€ JNDI๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•˜๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฆ„์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์›๊ฒฉ ๊ฐ์ฒด ์ ‘๊ทผ ๐ŸŒ:

    • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ EJB (Enterprise Java Beans)์™€ ๊ฐ™์€ ์›๊ฒฉ ๊ฐ์ฒด๋ฅผ ์ด๋ฆ„๋งŒ์œผ๋กœ ์ฐพ์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, RMI(Remote Method Invocation) ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋„ JNDI๋ฅผ ํ™œ์šฉํ•ด ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ ๋ชฐ๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฉ”์ผ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๐Ÿ“ง:

    • JavaMail API์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฉ”์ผ ์„œ๋ฒ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”์ผ ์„œ๋ฒ„ ์ •๋ณด๊ฐ€ JNDI์— ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉด, ์ด๋ฆ„์œผ๋กœ ๋ฉ”์ผ ์„œ๋ฒ„์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋ฉ”์ผ ์ „์†ก, ์ˆ˜์‹  ์ž‘์—…์ด ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.
  4. ๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค ์—ฐ๋™ ๐Ÿ—‚๏ธ:

    • JNDI๋Š” LDAP(๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค)์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด, ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • LDAP ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์กฐ์ง์—์„œ ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โš™๏ธ JNDI์˜ ๋™์ž‘ ์›๋ฆฌ

  1. ๋„ค์ด๋ฐ ์„œ๋น„์Šค ์—ฐ๊ฒฐ ๐Ÿ”—:

    • JNDI๋Š” ๋„ค์ด๋ฐ ์„œ๋น„์Šค(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, EJB, LDAP)์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ฆ„์œผ๋กœ ๊ฐ์ฒด ๊ฒ€์ƒ‰ ๐Ÿ”:

    • Context.lookup("java:comp/env/jdbc/myDB")์ฒ˜๋Ÿผ ์ด๋ฆ„์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์Šต๋‹ˆ๋‹ค.
  3. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ด€๋ฆฌ ๐Ÿ—‚๏ธ:

    • JNDI๋Š” ๊ณ„์ธต์  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ตฌ์กฐ๋กœ, ๋””๋ ‰ํ„ฐ๋ฆฌ์ฒ˜๋Ÿผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: java:comp/env์€ Java ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ทธ ์•„๋ž˜์— jdbc/myDB๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  4. ๋ฆฌ์†Œ์Šค ๋ฐ”์ธ๋”ฉ ๋ฐ ํ•ด์ œ ๐ŸŽ›๏ธ:

    • ๋ฐ”์ธ๋”ฉ(binding)์„ ํ†ตํ•ด ์ด๋ฆ„๊ณผ ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    • ๋ฐ˜๋Œ€๋กœ, ํ•ด์ œ(unbinding)๋Š” ์ด๋ฆ„๊ณผ ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋Š์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก JNDI๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์˜ˆ์‹œ

1. Tomcat์—์„œ JNDI DataSource ์„ค์ • ์˜ˆ์‹œ

Tomcat์˜ context.xml ํŒŒ์ผ์—์„œ JNDI DataSource๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

<Resource name="jdbc/myDB"
          auth="Container"
          type="javax.sql.DataSource"
          maxTotal="100"
          maxIdle="30"
          maxWaitMillis="10000"
          username="dbuser"
          password="dbpassword"
          driverClassName="com.mysql.cj.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mydatabase"/>
  • name: JNDI์—์„œ DataSource๋ฅผ ์ฐธ์กฐํ•  ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • type: javax.sql.DataSource๋กœ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • url: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ URL.
  • username๊ณผ password: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์ฆ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

2. Java ์ฝ”๋“œ์—์„œ JNDI DataSource ์ฐธ์กฐ ์˜ˆ์‹œ

Java ์ฝ”๋“œ์—์„œ DataSource๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB");
Connection conn = ds.getConnection();
  • InitialContext: JNDI ๋„ค์ด๋ฐ ์„œ๋น„์Šค์˜ ์ง„์ž…์ ์œผ๋กœ, ๋„ค์ด๋ฐ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
  • lookup: ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ jdbc/myDB๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์—ฐ๊ฒฐ ํ’€์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • Connection: DataSource๋ฅผ ํ†ตํ•ด ์–ป์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๐ŸŒŸ JNDI์˜ ์žฅ๋‹จ์ 

๐Ÿ‘ ์žฅ์ 

  1. ์œ ์—ฐํ•œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ:
    • ๋ฆฌ์†Œ์Šค์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ์ด๋ฆ„๋งŒ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€์˜ ํ†ตํ•ฉ:
    • JNDI๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์„ค์ •์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ค์ •๋œ ์—ฐ๊ฒฐ ํ’€์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  3. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ง€์›:
    • ์›๊ฒฉ ๊ฐ์ฒด์™€ ๋ถ„์‚ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•œ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿ‘Ž ๋‹จ์ 

  1. ์ดˆ๊ธฐ ์„ค์ •์˜ ๋ณต์žก์„ฑ:
    • ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋งŒํผ ์„ค์ •์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดํ•ดํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐ ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ์˜์กด์„ฑ:
    • ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ์„œ๋ฒ„์— ์ข…์†์ ์ธ ์„ค์ •์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ผ MyBatis์™€ Spring์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์—ฐ๋™ ๐Ÿ”„

Spring์€ ๊ฐ•๋ ฅํ•œ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ฅผ MyBatis์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜๊ณ , ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž ์„ค์ •

  1. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋ž€?

    • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž(transactionManager)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. Spring์—์„œ DataSourceTransactionManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MyBatis์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ด€๋ฆฌ์ž๋Š” ํŠธ๋žœ์žญ์…˜์˜ ์‹œ์ž‘, ์ปค๋ฐ‹, ๋กค๋ฐฑ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, Spring๊ณผ MyBatis๊ฐ€ ์—ฐ๋™๋˜์–ด๋„ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž์˜ ๋นˆ ์„ค์ •

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    • id="transactionManager": ์ด ๋นˆ์€ transactionManager๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    • class: DataSourceTransactionManager ํด๋ž˜์Šค๋Š” JDBC ๊ธฐ๋ฐ˜์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” Spring ์ œ๊ณต ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
    • dataSource: ์ด ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ DataSource๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. dataSource๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  3. tx:annotation-driven ์š”์†Œ

    • tx:annotation-driven ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋‚ด์—์„œ ๋ฉ”์„œ๋“œ์— @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์„ค์ •

    <tx:annotation-driven transaction-manager="transactionManager" />
    • tx:annotation-driven: ์ด ์„ค์ •์„ ํ†ตํ•ด @Transactional ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค๊ฐ€ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • transaction-manager: transactionManager๋ฅผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ–‹๏ธ @Transactional ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

  • @Transactional: ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค ๋‹จ์œ„๋กœ ํŠธ๋žœ์žญ์…˜์„ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AOP (Aspect-Oriented Programming)๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜๋ฉฐ, Spring์ด ์ž๋™์œผ๋กœ ํŠธ๋žœ์žญ์…˜์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • AOP๋ฅผ ํ†ตํ•œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ: @Transactional์ด ์ ์šฉ๋œ ๋ฉ”์„œ๋“œ์—์„œ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๋ฉด ์ปค๋ฐ‹ํ•˜๊ณ , ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@Transactional
public void saveData() {
    // ์ด ๋ฉ”์„œ๋“œ์—๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    // ์„ฑ๊ณต ์‹œ ์ปค๋ฐ‹, ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค.
}

โšก ์ฃผ์š” ๊ฐœ๋… ์š”์•ฝ

  • transactionManager ์„ค์ •: JDBC ๊ธฐ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์—๋Š” Spring์˜ DataSourceTransactionManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • tx:annotation-driven ์„ค์ •: ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์ ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • @Transactional ์–ด๋…ธํ…Œ์ด์…˜: ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค์— ์ ์šฉํ•˜๋ฉฐ, Spring์˜ AOP๋กœ ํŠธ๋žœ์žญ์…˜์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ์ด์ 

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

์ด ๊ตฌ์กฐ๋Š” Spring๊ณผ MyBatis๊ฐ€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ๋•Œ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์ž‘์—…์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ๐Ÿ›ก๏ธ


๐Ÿ’ก MyBatis์™€ Spring ์—ฐ๋™ ์‹œ SqlSessionFactoryBean ์„ค์ • ๐Ÿ’ก

์ด ์„ค์ •์€ MyBatis์™€ Spring์„ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ธ SqlSessionFactoryBean์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. SqlSessionFactoryBean์€ MyBatis์—์„œ SQL ์ฟผ๋ฆฌ์™€ ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•˜๋Š” SqlSessionFactory ๊ฐ์ฒด๋ฅผ Spring์˜ ๋นˆ(Bean)์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.


๐Ÿ” SqlSessionFactoryBean ์„ค์ • ํ•ญ๋ชฉ

  1. SqlSessionFactory ์—ญํ• 

    • MyBatis ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  SQL ์ฟผ๋ฆฌ์™€ ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด๊ฐ€ SqlSessionFactory์ž…๋‹ˆ๋‹ค.
    • Spring ํ™˜๊ฒฝ์—์„œ๋Š” SqlSessionFactoryBean์„ ํ†ตํ•ด ์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Spring Bean์œผ๋กœ SqlSessionFactoryBean ๋“ฑ๋ก

    • Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ SqlSessionFactoryBean์„ ๋“ฑ๋กํ•˜๋ฉด, MyBatis๋Š” Spring์˜ DataSource์™€ ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด SQL ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ MyBatis ์„ค์ • ํŒŒ์ผ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ง€์ •ํ•˜์—ฌ MyBatis๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์›ํ™œํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“„ XML ์„ค์ • ์ฝ”๋“œ ์„ค๋ช…

<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
    <property name="mapperLocations">
        <list>
            <value>classpath:mapper/member.xml</value>
            <value>classpath:mapper/board.xml</value>
        </list>
    </property>
</bean>
  • id="sqlSessionFactoryBean": sqlSessionFactoryBean์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ด Bean์ด Spring ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
  • class="org.mybatis.spring.SqlSessionFactoryBean": ์ด ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด Spring์—์„œ MyBatis์™€ ์—ฐ๋™๋œ SqlSessionFactoryBean์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์†์„ฑ(Property) ์„ค์ • ์ƒ์„ธ ์„ค๋ช…

  • DataSource ์„ค์ •

    <property name="dataSource" ref="dataSource" />
    • dataSource ์†์„ฑ์€ MyBatis๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” DataSource ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ dataSource๋Š” ๋ณ„๋„๋กœ ์ •์˜๋œ DataSource Bean์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด SqlSessionFactory๊ฐ€ SQL ์„ธ์…˜์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MyBatis ์„ค์ • ํŒŒ์ผ (configLocation)

    <property name="configLocation" value="classpath:mybatis-config.xml" />
    • configLocation์€ MyBatis์˜ ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด mybatis-config.xml ํŒŒ์ผ์—๋Š” ์บ์‹œ, ๋งคํผ ์„ค์ •, ํŠธ๋žœ์žญ์…˜ ์„ค์ • ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • classpath: ์ ‘๋‘์–ด๋Š” ์„ค์ • ํŒŒ์ผ์ด ํด๋ž˜์ŠคํŒจ์Šค ๋‚ด์— ์œ„์น˜ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, MyBatis๋Š” ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ํ•„์š”ํ•œ ์„ค์ • ์ •๋ณด๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • Mapper ํŒŒ์ผ ์œ„์น˜ (mapperLocations)

    <property name="mapperLocations">
        <list>
            <value>classpath:mapper/member.xml</value>
            <value>classpath:mapper/board.xml</value>
        </list>
    </property>
    • mapperLocations๋Š” MyBatis์˜ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ •์˜ํ•œ ๋งคํผ ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.
    • <list> ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งคํผ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ์‹œ์—์„œ๋Š” member.xml๊ณผ board.xml ๋‘ ๊ฐœ์˜ ๋งคํผ ํŒŒ์ผ์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด XML ํŒŒ์ผ๋“ค์€ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘ ๊ทœ์น™์„ ์ •์˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋•์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ MyBatis์™€ Spring์˜ ํ†ตํ•ฉ: SqlSessionFactoryBean ์„ค์ •

์ด ์„ค์ •์€ MyBatis์™€ Spring์ด ํ†ตํ•ฉ๋˜์–ด SQL ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ SqlSessionFactoryBean ๊ตฌ์„ฑ ์š”์†Œ์™€ ์—ญํ• ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. SqlSessionFactoryBean์€ Spring์—์„œ MyBatis์˜ ํ•ต์‹ฌ SQL ์ž‘์—…์„ Bean์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ SqlSessionFactoryBean ์„ค์ • ์š”์†Œ ์„ค๋ช…

  1. SqlSessionFactoryBean ์„ค์ •

    • SqlSessionFactory๋Š” MyBatis์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, SQL ์ฟผ๋ฆฌ ์‹คํ–‰๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Spring ํ™˜๊ฒฝ์—์„œ ์ด ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด SqlSessionFactoryBean์„ Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์„ค์ •์„ ํ†ตํ•ด MyBatis์™€ Spring์ด ํ†ตํ•ฉ๋˜๊ณ , SQL ์ž‘์—…์„ ์œ„ํ•œ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์„ค์ • XML ์ฝ”๋“œ

    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.ssafy.*.model" />
        <property name="mapperLocations" value="classpath:mapper/*.xml" />
    </bean>

๐Ÿ” ๊ฐ ์†์„ฑ๋ณ„ ์—ญํ•  ์ƒ์„ธ ์„ค๋ช…

  • DataSource ์—ฐ๊ฒฐ ์„ค์ •

    <property name="dataSource" ref="dataSource" />
    • DataSource๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ์„ค์ •์œผ๋กœ, MyBatis๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ref="dataSource"๋Š” Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” DataSource Bean์„ ์ฐธ์กฐํ•˜์—ฌ MyBatis๊ฐ€ ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • TypeAlias ์„ค์ • (typeAliasesPackage)

    <property name="typeAliasesPackage" value="com.ssafy.*.model" />
    • typeAliasesPackage๋Š” ์ง€์ •๋œ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ๋‚ด์˜ ๋ชจ๋“  Java ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋ณ„์นญ(alias)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„์นญ์„ ํ†ตํ•ด Java ํด๋ž˜์Šค์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋งคํผ ํŒŒ์ผ์—์„œ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด com.ssafy.member.model.Member ํด๋ž˜์Šค๋Š” ๋ณ„์นญ Member๋กœ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์–ด, MyBatis ๋งคํผ ํŒŒ์ผ์—์„œ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Mapper XML ํŒŒ์ผ ์„ค์ • (mapperLocations)

    <property name="mapperLocations" value="classpath:mapper/*.xml" />
    • mapperLocations๋Š” MyBatis์˜ ๋งคํผ XML ํŒŒ์ผ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜์—ฌ, MyBatis๊ฐ€ SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • classpath:mapper/*.xml์€ mapper ํด๋” ๋‚ด์˜ ๋ชจ๋“  XML ํŒŒ์ผ์„ ๋งคํผ ํŒŒ์ผ๋กœ ์ง€์ •ํ•˜์—ฌ MyBatis์—์„œ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽ‰ MyBatis์™€ Spring ์—ฐ๋™: Mapper ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ๋ก ๋ฐฉ๋ฒ•

์ด ์„ค์ •์€ MyBatis์—์„œ SQL์„ ํ˜ธ์ถœํ•˜๋Š” Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋นˆ(Bean)์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์„ค์ • ๋ฐฉ์‹๊ณผ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•˜์—ฌ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ Mapper ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ๋ก ๋ฐฉ์‹

1๏ธโƒฃ [๋ฐฉ๋ฒ• 1] Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๋“ฑ๋ก

<bean id="boardMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.ssafy.board.model.mapper.BoardMapper"/>
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
  • MapperFactoryBean: Spring์—์„œ MyBatis์˜ Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • id="boardMapper": boardMapper๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ Spring์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด ์ด๋ฆ„์œผ๋กœ Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  • property name="mapperInterface": BoardMapper๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋“ฑ๋กํ•˜๋ฉฐ, ์ด Mapper๋Š” MyBatis ๋งคํผ ํŒŒ์ผ์—์„œ ์ •์˜๋œ SQL ์ฟผ๋ฆฌ์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • property name="sqlSessionFactory": sqlSessionFactory๋ฅผ ์ฐธ์กฐํ•˜์—ฌ SQL ์ฟผ๋ฆฌ ์‹คํ–‰์— ํ•„์š”ํ•œ ์„ธ์…˜์„ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.

๐Ÿ”น ์ด ๋ฐฉ์‹์˜ ํŠน์ง•:

  • ๊ฐœ๋ณ„ ๋“ฑ๋ก์ด๋ฏ€๋กœ ํŠน์ • Mapper ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋“ฑ๋กํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  Mapper๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆ˜๋™ ๋“ฑ๋กํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์ˆ˜์˜ Mapper๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ณ„์ ์ธ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ [๋ฐฉ๋ฒ• 2] Mapper Scanner ์‚ฌ์šฉ

<mybatis-spring:scan base-package="com.ssafy.*.model.mapper"/>
  • mybatis-spring:scan: MyBatis์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šค์บ๋„ˆ ํƒœ๊ทธ๋กœ, ์ง€์ •๋œ ํŒจํ‚ค์ง€์— ์†ํ•œ ๋ชจ๋“  Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • base-package="com.ssafy.*.model.mapper": com.ssafy.*.model.mapper ๊ฒฝ๋กœ ๋‚ด์˜ ๋ชจ๋“  Mapper ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์ด ๋ฐฉ์‹์˜ ํŠน์ง•:

  • ์—ฌ๋Ÿฌ Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•œ ๋ฒˆ์˜ ์„ค์ •์œผ๋กœ ์ผ๊ด„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งŽ์€ Mapper๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๊ณ  ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋ชจ๋“  Mapper๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด์  ์ •๋ฆฌ

ํŠน์„ฑ์ง์ ‘ ๋“ฑ๋ก (๋ฐฉ๋ฒ• 1)Mapper Scanner ์‚ฌ์šฉ (๋ฐฉ๋ฒ• 2)
์‚ฌ์šฉ ์šฉ๋„๊ฐœ๋ณ„์ ์ธ Mapper ๋“ฑ๋กํŠน์ • ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋ชจ๋“  Mapper ์ž๋™ ๋“ฑ๋ก
์žฅ์ ์„ธ๋ฐ€ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ๋งŽ์€ Mapper๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ผ๊ด„ ๋“ฑ๋ก ๊ฐ€๋Šฅ
๋‹จ์ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ๋ถˆํŽธํ•จํŒจํ‚ค์ง€ ๋‚ด ๋ชจ๋“  Mapper๊ฐ€ ๋“ฑ๋ก๋˜๋ฏ€๋กœ ๊ฐœ๋ณ„ ์กฐ์ • ์–ด๋ ค์›€
์„ค์ • ํŽธ์˜์„ฑ์ˆ˜๋™์œผ๋กœ ํ•˜๋‚˜์”ฉ ๋“ฑ๋ก์„ค์ • ๊ฐ„๋‹จ, ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋งŒ ์ง€์ •

โœจ MyBatis์™€ Spring ์—ฐ๋™์—์„œ์˜ Service ํด๋ž˜์Šค์™€ Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ƒํ˜ธ์ž‘์šฉ

์ด ์ฝ”๋“œ๋Š” MyBatis์™€ Spring์ด ์—ฐ๋™๋œ ํ™˜๊ฒฝ์—์„œ Service ํด๋ž˜์Šค์™€ Mapper ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.


๐Ÿ”น 1. Service Class

Service ํด๋ž˜์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. Spring์˜ DI(์˜์กด์„ฑ ์ฃผ์ž…)์„ ํ†ตํ•ด Mapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

@Service
public class ExampleServiceImpl implements ExampleService {

    private final ExampleMapper exampleMapper;

    public ExampleServiceImpl(ExampleMapper exampleMapper) {
        this.exampleMapper = exampleMapper;
    }

    @Override
    @Transactional
    public void processEntity(EntityDto entityDto) throws Exception {
        System.out.println("์ฒ˜๋ฆฌ ์ „: " + entityDto);
        exampleMapper.insertEntity(entityDto);
        System.out.println("์ฒ˜๋ฆฌ ํ›„: " + entityDto);

        List<FileInfoDto> fileInfos = entityDto.getFileInfos();
        if (fileInfos != null && !fileInfos.isEmpty()) {
            exampleMapper.insertFileInfos(fileInfos);
        }
    }
}

๐Ÿ’ก ์ฃผ์š” ์„ค๋ช…:

  • @Service: Spring์ด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์„œ๋น„์Šค Bean์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  • private final ExampleMapper exampleMapper: MyBatis์˜ Mapper ์ธํ„ฐํŽ˜์ด์Šค ExampleMapper๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. final ํ‚ค์›Œ๋“œ๋Š” ์˜์กด์„ฑ์ด ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•จ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž ์ฃผ์ž…: ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.
  • @Transactional: ์ด ๋ฉ”์„œ๋“œ ๋‚ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต ์‹œ ์ปค๋ฐ‹๋˜๊ณ , ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค.
  • ๋ถ€๊ฐ€์  ํŒŒ์ผ ์ •๋ณด ์ €์žฅ: entityDto์— ํฌํ•จ๋œ ํŒŒ์ผ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€, ๋งŒ์•ฝ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 2. Mapper Interface

Mapper ์ธํ„ฐํŽ˜์ด์Šค๋Š” MyBatis์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…(์‚ฝ์ž…, ์กฐํšŒ ๋“ฑ)์„ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, MyBatis๋Š” XML์ด๋‚˜ ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ ๋ฉ”์„œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” SQL์„ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

@Mapper
public interface ExampleMapper {

    void insertEntity(EntityDto entityDto) throws SQLException;

    void insertFileInfos(List<FileInfoDto> fileInfos) throws SQLException;

    List<EntityDto> listEntities(Map<String, Object> params) throws SQLException;

    int getTotalCount(Map<String, Object> params) throws SQLException;

    EntityDto getEntityById(int id) throws SQLException;
}

๐Ÿ’ก ์ฃผ์š” ์„ค๋ช…:

  • @Mapper: ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ MyBatis Mapper์ž„์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, Spring์—์„œ ์ž๋™์œผ๋กœ Bean์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
  • CRUD ๋ฉ”์„œ๋“œ:
    • insertEntity: ๋‹จ์ผ ์—”ํ‹ฐํ‹ฐ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
    • insertFileInfos: ์—ฌ๋Ÿฌ ํŒŒ์ผ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
    • listEntities: ์กฐ๊ฑด์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • getTotalCount: ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐœ์ˆ˜๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • getEntityById: ์ฃผ์–ด์ง„ ID์— ํ•ด๋‹นํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹จ์ผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด