๐ 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๋ฌธ๊ณผ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋์ ๋ถ๋ฆฌ
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 ์ธํฐํ์ด์ค)
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์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ด ์ด๋ฃจ์ด์ง๋ฉฐ, ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์ ์ฅ, ์
๋ฐ์ดํธํ๋ ๋ชจ๋ ์์
์ด ์ด๊ณณ์์ ์ํ๋ฉ๋๋ค.
๋ฐ์ดํฐ ํ๋ฆ ์ค๋ช
-
ํ ๋ฒ ์คํ๋๋ ํ๋ก์ธ์ค:
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ MyBatis Config File์ ์ฝ์ด MyBatis๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค.
- SqlSessionFactoryBuilder๊ฐ ์ค์ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก SqlSessionFactory๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์์๋ง ํ ๋ฒ ์คํ๋ฉ๋๋ค.
-
์์ฒญ๋ง๋ค ์คํ๋๋ ํ๋ก์ธ์ค:
- ์ฌ์ฉ์๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค, ์ ํ๋ฆฌ์ผ์ด์
์ 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 ์ฟผ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ํธ์ถํ ์ ์์ด ์ฝ๋ ์ ์ง๋ณด์์ฑ์ด ๋์์ง๋๋ค.
โจ ์ด ๊ตฌ์กฐ์ ์ฅ์
-
ํ์
์์ ์ฑ:
- ๋ฌธ์์ด์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก, ์ปดํ์ผ ๋จ๊ณ์์ ๋งค๊ฐ๋ณ์์ ๋ฐํ ํ์
์ด ๋ง์ง ์๋ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ์ก์๋ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฐํ์ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
-
IDE ์ฝ๋ ์ง์:
- Mapper Interface๋ฅผ ์ฌ์ฉํ๋ฉด IDE์์ ์๋์์ฑ ๊ธฐ๋ฅ๊ณผ ์ฝ๋ ์ง์์ ๋ฐ์ ์ ์์ด, ๋ฉ์๋ ์ด๋ฆ์ด๋ ๋งค๊ฐ๋ณ์ ํ์
์ค์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ๋ํ, ๋ฉ์๋๋ฅผ ํด๋ฆญํ์ฌ SQL ์ฟผ๋ฆฌ๋ก ์ฝ๊ฒ ์ด๋ํ ์ ์์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
-
๊ฐ๊ฒฐํ ์ฝ๋:
- 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 ์ค์
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์ ์ฃผ์ ์ฉ๋
-
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ ๐๏ธ:
- ์ฐ๊ฒฐ ํ(Connection Pool)์ ์ค์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ด๋ฅผ ์ฐธ์กฐํ๊ฒ ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ(์: Tomcat, WebLogic)๊ฐ JNDI๋ฅผ ํตํด ๋ฏธ๋ฆฌ ์ค์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ ๊ณตํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฆ์ ํตํด ๊ฐํธํ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
-
์๊ฒฉ ๊ฐ์ฒด ์ ๊ทผ ๐:
- ๋ถ์ฐ ์์คํ
์์ EJB (Enterprise Java Beans)์ ๊ฐ์ ์๊ฒฉ ๊ฐ์ฒด๋ฅผ ์ด๋ฆ๋ง์ผ๋ก ์ฐพ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, RMI(Remote Method Invocation) ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ JNDI๋ฅผ ํ์ฉํด ๊ฐ์ฒด์ ์์น๋ฅผ ๋ชฐ๋ผ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
๋ฉ์ผ ์๋ฒ ์ฐ๊ฒฐ ๐ง:
- JavaMail API์ ๊ฒฐํฉํ์ฌ ๋ฉ์ผ ์๋ฒ์ ์ํธ์์ฉํฉ๋๋ค.
- ๋ฉ์ผ ์๋ฒ ์ ๋ณด๊ฐ JNDI์ ๋ฑ๋ก๋์ด ์์ผ๋ฉด, ์ด๋ฆ์ผ๋ก ๋ฉ์ผ ์๋ฒ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ด ๋ฉ์ผ ์ ์ก, ์์ ์์
์ด ๊ฐํธํด์ง๋๋ค.
-
๋๋ ํฐ๋ฆฌ ์๋น์ค ์ฐ๋ ๐๏ธ:
- JNDI๋ LDAP(๋๋ ํฐ๋ฆฌ ์๋น์ค)์ ์ฐ๋ํ์ฌ ์ฌ์ฉ์ ์ ๋ณด, ์ธ์ฆ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
- LDAP ๊ฐ์ ๋๋ ํฐ๋ฆฌ ์๋น์ค๋ ๋๊ท๋ชจ ์กฐ์ง์์ ์ฌ์ฉ์์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
โ๏ธ JNDI์ ๋์ ์๋ฆฌ
-
๋ค์ด๋ฐ ์๋น์ค ์ฐ๊ฒฐ ๐:
- JNDI๋ ๋ค์ด๋ฐ ์๋น์ค(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, EJB, LDAP)์ ์ฐ๊ฒฐํ์ฌ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ํฉ๋๋ค.
-
์ด๋ฆ์ผ๋ก ๊ฐ์ฒด ๊ฒ์ ๐:
Context.lookup("java:comp/env/jdbc/myDB")
์ฒ๋ผ ์ด๋ฆ์ ํตํด ์ํ๋ ๋ฆฌ์์ค๋ฅผ ๊ฒ์ํ๊ณ , ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์ต๋๋ค.
-
๋ค์์คํ์ด์ค ๊ด๋ฆฌ ๐๏ธ:
- JNDI๋ ๊ณ์ธต์ ๋ค์์คํ์ด์ค ๊ตฌ์กฐ๋ก, ๋๋ ํฐ๋ฆฌ์ฒ๋ผ ํธ๋ฆฌ ํํ๋ก ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์:
java:comp/env
์ Java ์ปดํฌ๋ํธ ํ๊ฒฝ์ ๋ํ๋ด๋ฉฐ, ๊ทธ ์๋์ jdbc/myDB
๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ํฌํจ๋ฉ๋๋ค.
-
๋ฆฌ์์ค ๋ฐ์ธ๋ฉ ๋ฐ ํด์ ๐๏ธ:
- ๋ฐ์ธ๋ฉ(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์ ์ฅ๋จ์
๐ ์ฅ์
- ์ ์ฐํ ๋ฆฌ์์ค ๊ด๋ฆฌ:
- ๋ฆฌ์์ค์ ์์น๊ฐ ๋ฐ๋๋๋ผ๋ ์ด๋ฆ๋ง์ผ๋ก ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์์ ํตํฉ:
- JNDI๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์ ์ฝ๊ฒ ํตํฉ๋์ด ์ค์ ์ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ค์ ๋ ์ฐ๊ฒฐ ํ์ ์ฌ์ฌ์ฉํ์ฌ ํจ์จ์ฑ์ ๋์
๋๋ค.
- ๋ถ์ฐ ์์คํ
์ง์:
- ์๊ฒฉ ๊ฐ์ฒด์ ๋ถ์ฐ ๋ฆฌ์์ค๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ํ๊ณณ์์ ๊ด๋ฆฌํ๊ธฐ์ ์ข์ต๋๋ค.
๐ ๋จ์
- ์ด๊ธฐ ์ค์ ์ ๋ณต์ก์ฑ:
- ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋งํผ ์ค์ ์ด ๋ณต์กํ ์ ์์ผ๋ฉฐ, ์ดํดํ๊ณ ์ค์ ํ๋ ๋ฐ ๋ค์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ ์์กด์ฑ:
- ์ฃผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ฏ๋ก, ์๋ฒ์ ์ข
์์ ์ธ ์ค์ ์ด ๋ ์ ์์ต๋๋ค. ํน์ ํ๊ฒฝ์์๋ง ์๋ํ ๊ฐ๋ฅ์ฑ๋ ์์ต๋๋ค.
๐ผ MyBatis์ Spring์ ํธ๋์ญ์
๊ด๋ฆฌ ์ฐ๋ ๐
Spring์ ๊ฐ๋ ฅํ ํธ๋์ญ์
๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ MyBatis์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ๋์ฑ ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๊ตฌ์กฐ์์๋ ํธ๋์ญ์
๊ด๋ฆฌ์๊ฐ ์ด๋ป๊ฒ ์ค์ ๋๊ณ , ์ด๋
ธํ
์ด์
๊ธฐ๋ฐ ํธ๋์ญ์
์ฒ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๋ช
ํ๊ณ ์์ต๋๋ค.
๐ ๏ธ ํธ๋์ญ์
๊ด๋ฆฌ์ ์ค์
-
ํธ๋์ญ์
๊ด๋ฆฌ์๋?
- ํธ๋์ญ์
๊ด๋ฆฌ์(
transactionManager
)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ํธ๋์ญ์
๋จ์๋ก ๋ฌถ์ด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์
๋๋ค. Spring์์ DataSourceTransactionManager๋ฅผ ์ฌ์ฉํ์ฌ MyBatis์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์
์ ์ ์ดํฉ๋๋ค.
- ์ด ๊ด๋ฆฌ์๋ ํธ๋์ญ์
์ ์์, ์ปค๋ฐ, ๋กค๋ฐฑ์ ๋ด๋นํ๋ฉฐ, Spring๊ณผ MyBatis๊ฐ ์ฐ๋๋์ด๋ ์ด๋ฌํ ์์
์ ์๋์ผ๋ก ์ํํฉ๋๋ค.
-
ํธ๋์ญ์
๊ด๋ฆฌ์์ ๋น ์ค์
<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
๋ ํธ๋์ญ์
๊ด๋ฆฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
tx:annotation-driven
์์
- tx:annotation-driven ์ค์ ์ ์ถ๊ฐํ์ฌ ์ด๋
ธํ
์ด์
๋ฐฉ์์ผ๋ก ํธ๋์ญ์
์ ์ ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ๋ด์์ ๋ฉ์๋์ @Transactional ์ด๋
ธํ
์ด์
์ ๋ฌ์ ํธ๋์ญ์
์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
-
์ด๋
ธํ
์ด์
๊ธฐ๋ฐ ํธ๋์ญ์
์ค์
<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 ์ค์ ํญ๋ชฉ
-
SqlSessionFactory ์ญํ
- MyBatis ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ SQL ์ฟผ๋ฆฌ์ ํธ๋์ญ์
์์
์ ๋ด๋นํ๋ ํต์ฌ ๊ฐ์ฒด๊ฐ SqlSessionFactory์
๋๋ค.
- Spring ํ๊ฒฝ์์๋ SqlSessionFactoryBean์ ํตํด ์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋น๋กฏํ ๋ค์ํ ์์
์ ์ ์ดํ ์ ์์ต๋๋ค.
-
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 ์ค์ ์์ ์ค๋ช
-
SqlSessionFactoryBean ์ค์
- SqlSessionFactory๋ MyBatis์ ํต์ฌ ์ญํ ์ ๋ด๋นํ๋ฉฐ, SQL ์ฟผ๋ฆฌ ์คํ๊ณผ ํธ๋์ญ์
๊ด๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. Spring ํ๊ฒฝ์์ ์ด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด SqlSessionFactoryBean์ Bean์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
- ์ด ์ค์ ์ ํตํด MyBatis์ Spring์ด ํตํฉ๋๊ณ , SQL ์์
์ ์ํ ์ธ์
์ ์์ฑํ์ฌ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
-
์ค์ 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์ ํด๋นํ๋ ์ํฐํฐ๋ฅผ ๋จ์ผ ์กฐํํฉ๋๋ค.