๊ธฐ์กด JDBC๋ฅผ ์ฌ์ฉํ์ ๋ ์ ํ๋ฆฌ์ผ์ด์
๋น์ฆ๋์ค ๋ก์ง๋ณด๋ค SQL
๊ณผ JDBC API
๋ฅผ ์์ฑํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ๋ณด๋๋ค. ๋ฌผ๋ก , ์ฝ๋ ์ค๋ณต์ ์์ ๊ธฐ ์ํด์ Ibatis
๋ JDBCTemplate
๊ฐ์ SQLMapper
๋ฅผ ๋์
ํ์ง๋ง ์ฌ์ ํ ๋ฐ๋ณตํด์ ์์
์ ํด์ผ ํ๋ค.
๋ํ ๋ฐ์ดํฐ๋ฅผ ํ
์ด๋ธ์ ๋ง์ถฐ์ ๋ณด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๊ตฌ์กฐ๋ ํ
์ด๋ธ ํํ์ ์์กด์ ์ด๊ฒ ๋ ์๋ฐ์ ์์๊ณ ์ค๊ณ ๋ํ ๊ฐ์ฒด ์ค์ ์ด ์๋ ํ
์ด๋ธ ์ค์ ์ผ๋ก ์ค๊ณ๊ฐ ๋ ์๋ฐ์ ์์๋ค.
์ฆ, ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ๋ง์ ๋ํ ์ฅ์ ์ ํฌ๊ธฐํ๊ณ ๋ฐ์ดํฐ ์ค์ฌ ๋ชจ๋ธ๋ก ์ค๊ณ ํจ๋ฌ๋ค์์ด ๋ฐ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ ์ ๋ง๋ค์ด์ง ๊ฒ์ด ์์์ผ๋ ๋ฐ๋ก ORM ํ๋ ์์ํฌ๋ค. ORM ํ๋ ์์ํฌ๋ ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ฐ์ ์ฐจ์ด๋ฅผ ์ค๊ฐ์์ ํด๊ฒฐํด ์ฃผ๋ ์ญํ ์ ํ๊ณ ์๋ค.
JPA๋ ์๋ฐ ORM ๊ธฐ์ ํ์ค
์ด๋ค. ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ค์ด๊ณ ๊ฐ๋ฐ์๋ ๊ฐ๋ฐ์ ์กฐ๊ธ ๋ ์ง์คํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค์ด์ค๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ค.
์ผ๋ฐ์ ์ธ JDBC๋ฅผ ์ด์ฉํ์ ๋ DAO์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
์ 3๊ฐ์ง ๊ณผ์ ์ CRUD
์์ ๋ชจ๋ ๋์ผํ ์ ์ฐจ์ด๋ฉฐ ์ด๋ ๋ฐ๋ณต์ ์ธ ์์
์ด๋ค. ๋ํ Connection
ํ๊ณ ์ด๋ฅผ Close
ํด์ฃผ๋ ์์
๊น์ง ํฌํจํด์ผ ํ๋ค. ๋ฌผ๋ก JDBCTemplate
์์ Connection
๊ณผ Close
์์
์ ๋ํ ๋ฐ๋ณต์ ํด๊ฒฐํด ์ฃผ์์ง๋ง, ์ฌ์ ํ SQL ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์์ฐํ ์๋ฐ์ ์๋ค.
member๋ผ๋ ๊ฐ์ฒด๋ฅผ DB์ ์ ์ฅํ๊ณ ์ ํ๋ฉด member ํ๋๋ค์ ๊บผ๋ด์จ ๋ค SQL์ ์ฝ์
ํ๋ ์์
์ ์งํํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์์
์ ์์ ๋งํ 3๊ฐ์ง ์ ์ฐจ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
ํ์ง๋ง ๋์์ด DB๊ฐ ์๋ Collection์ List๋ผ๊ณ ๊ฐ์ ์ ํด๋ณด์
List<Member> list = new ArrayList();
list.add(member);
์ฐ๋ฆฌ๋ ๋จ์ํ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ด๊ฒ์ด ๋ฐ์ดํฐ ์ค์ฌ์ด ์๋ ๊ฐ์ฒด์งํฅ ์ค์ฌ์ ๊ฐ๋ฐ์ด๊ณ ์ฐ๋ฆฌ๋ ์ด์ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ๋ฅผ ์ํ๋ค.
SQL์ ์ด์ฉํ DAO๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ ๋ ๊ฐ์๊ธฐ ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ก์ด ๊ธฐ๋ฅ์ ์๊ตฌํด์ ํ ์ด๋ธ์ ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐ์์ผ์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ์ด๋ด ๊ฒฝ์ฐ ๊ธฐ์กด์ ์ง์ธ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์์ ํด์ผ ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก SQL ๋ฌธ์ ๋ฐ๊พธ๊ฒ ๋จ์ผ๋ก์จ ๊ฐ์ฒด์ ํ๋๋ฅผ ๋ฐ๊พธ๊ณ ์ด์ ๊ดํ ์ฝ๋๋ ๋ณ๊ฒฝํด ์ฃผ์ด์ผ ํ๋ค. ๋ง์ฝ ์ด๋ ๊ฒ ๊ด๋ จ๋ ์ฝ๋๊ฐ 100๊ฐ, 1000๊ฐ ์๋ค๋ฉด ์ ๋ถ ๋ค ๋ฐ๊ฟ์ค์ผ ํ๋ค.
๊ฐ์ฒด๊ฐ ์ฐ๊ด๋ ์ฝ๋, ๊ฐ์ฒด๋ค์ ์ฌ์ฉํ ์ ์์์ง ์์์ง๋ ์ฌ์ฉํ๋ SQL์ ๋ฌ๋ ค ์๋ค.
์ด๋ฐ ๋ฐฉ์์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์ฌ์ฉํด์ SQL์ ์จ๊ฒจ๋ ์ด์ฉ ์ ์์ด DAO๋ฅผ ์ด์ด์ ์ด๋ค SQL์ด ์คํ๋๋์ง ํ์ธํด์ผ ํ๋ค๋ ์ ์ด๋ค.
์ด๋ฌํ SQL์ ์์กด์ ์ธ ์ํฐํฐ๋ค์ ๋ณ๋์ด ์ฌํ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ์ ๋ขฐํ ์ ์์ผ๋ฉฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก SQL๊ณผ JDBC API๋ฅผ ๋ถ๋ฆฌํ๋ค ํ๋๋ผ๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐํ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ SQL์ ์ง์ ๋ค๋ฃฐ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ์์ฝํ์๋ฉด ์๋์ ๊ฐ๋ค.
JPA
๋ ๊ธฐ์กด์ ๊ฐ๋ฐ์๊ฐ ์ง์ SQL ๊ตฌ๋ฌธ์ ๊ธฐ์ ํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ JPA API
๋ฅผ ์ด์ฉํจ์ผ๋ก์จ JPA๊ฐ ๊ฐ๋ฐ์ ๋์ ์ ์ ์ ํ SQL์ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค.
์ฆ, ๊ฐ๋ฐ์๋ JPA API๋ง ์ฌ์ฉํ๋ฉด SQL ๊ตฌ๋ฌธ์ ๊ธฐ์ ํ์ง ์์๋ ๋๋ค.
์ ์ฅ ๊ธฐ๋ฅ
persist(Entity)
: ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค. INSERT SQL์กฐํ ๊ธฐ๋ฅ
find(Entity.class, id)
: ๊ฐ์ฒด ํ๋๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ค. SELECT SQL์์์ฑ ์ปจํ
์คํธ
๋ฅผ ์ด์ฉํด์ ์กฐํํ ๋ฐ์ดํฐ ์ํฐํฐ์ ๊ฐ์ ์์ ํ๋ฉด ํธ๋์ญ์
์ ์ปค๋ฐ ํ ๋ ๊ฐ์ด ์์
์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ ํ๋ฉด์ ๊ทธ ๋ด๋ถ์ ๋ณต์ก์ฑ๋ ์ ์ ์ปค์ง๋ค.
์ฆ, ์ง์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ ์ผ์ ๋์์์ด ์ฆ๊ฐํ๋ ๋ณต์ก์ฑ๊ณผ์ ์ธ์์ด๋ค.
๋ณต์ก์ฑ์ ์ ์ดํ์ง ๋ชปํ๋ฉด ๊ฒฐ๊ตญ ์ ์ง ๋ณด์ํ๊ธฐ ์ด๋ ค์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ๋๋ค.
๊ฐ์ฒด์งํฅ ์ธ์ด
์์๋ ์์, ๋คํ์ฑ, ์ถ์ํ, ์ ๋ณด ์๋
๋ฑ์ ์ง์ํด ์ฃผ๋ฉฐ ์ด๋ฅผ ์ด์ฉํด ๋ณต์ก์ฑ์ ์ ์ดํด ์ค๋ค. ํ์ง๋ง ๋ฐ์ดํฐ ์ค์ฌ์ด ๋์ด๋ฒ๋ฆฐ ๊ฐ์ฒด๋ ์ด๋ฌํ ๊ฐ์ฒด์งํฅ ์ธ์ด์ ์ฅ์ ์ ์ฌ์ฉํ๊ธฐ ํ๋ค์ด์ง๊ณ
์ด๋ก ์ธํด ๋ณต์ก์ฑ๋ ํฌ๊ฒ ์ฆ๊ฐ
ํ๋ค. ๊ฐ์ฒด๊ฐ ๋จ์ํ๋ฉด ์๊ด์ด ์์ง๋ง ๊ฐ์ฒด๊ฐ ์์๋ฐ์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(ํ๋๋ก ์ฌ์ฉ) ํ๊ณ ์๋ค๋ฉด ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ๋ ์ฝ์ง ์๋ค.
์๋ฅผ ๋ค๋ฉด ํ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ผ ํ๋๋ฐ ํ์ ๊ฐ์ฒด๊ฐ ํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ํ ๊ฐ์ฒด๋ ๊ฐ์ด ์ ์ฅํด ์ค์ผ ํ๋ค. ๋ง์ฝ ๊ทธ๋ฌ์ง ์์ ๊ฒฝ์ฐ ํ์ ๊ฐ์ฒด๋ ํ ๊ฐ์ฒด์์ ์ฐ๊ด์ฑ์ ์์ด๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋์ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ์ฅ์ ์ ์ ์งํ๊ณ ์ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ์ง์ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ง๋ ฌํ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๊ธฐ ์ด๋ ต๋ค๋ ๋ฌธ์ ์ ์ด ์์ผ๋ฏ๋ก ํ์ค์ฑ์ด ์๊ณ ์ฌ์ฉํ๊ธฐ ๊น๋ค๋กญ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ๋์ ๋ฐฉ๋ฒ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ธ๋ฐ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ๊ตฌ์กฐํ๋์ด ์๊ณ ์งํ์ ์ธ ์ฌ๊ณ ๋ฅผ ์๊ตฌํ๋ค.
์ฆ ์ถ์ํ, ์์, ๋คํ์ฑ ๊ฐ์ ๊ฐ๋ ์ด ์๊ณ ์ด๋ก ์ธํด ๊ฐ์ฒด๋ ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ์ค๊ณ๋ฅผ ํ๊ฒ ๋์๋ค.
๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํ์๋ฉด ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์งํฅํ๋ ๋ชฉ์ ์ด ์๋ก ๋ค๋ฅด๊ณ ๋์ ๊ธฐ๋ฅ๊ณผ ํํ๋ ๋ค๋ฅด๋ฏ๋ก ์ด๋ฅผ ํจ๋ฌ๋ค์ ๋ถ์ผ์น
๋ผ ๋งํ๋ค.
๊ฐ์ฒด
: ๋ค์ํ ๊ฐ์ฒด์ ์ฅ์ ์ ์ด์ฉํ ๋ณต์ก์ฑ ํด์RDB
: ๋ฐ์ดํฐ ์ค์ฌ ๊ตฌ์กฐํ ๋ฐ ์งํฉ์ฑ ๊ฐ์กฐ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฐ๋ผ๋ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ก ๊ฐ๋ฐํ๊ณ ๋ฐ์ดํฐ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด์ผ ํ๋ค๋ฉด, ๊ฒฐ๊ตญ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ค๊ฐ์์ ํด๊ฒฐํด์ผ ํ๋ค.
์ด์ ์ด๋ฌํ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ๊ฐ๋ฐ์๊ฐ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฌธ์ ์ ์ ์ดํด๋ณด์
๊ฐ์ฒด๋ ์์์ด๋ ๊ฐ๋ ์ด ์์ง๋ง ํ ์ด๋ธ์ ์๋ค. ๊ทธ๋๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง์์ ์ด์ผ๊ธฐํ๋ ์ํผ ํ์ ์๋ธ ํ์ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์์๊ณผ ๊ฐ์ฅ ์ ์ฌํ ํํ๋ก ํ ์ด๋ธ์ ์ค๊ณํ ์ ์๋ค.
class Item{}
class Album extends Item{}
class Movie extends Item{}
class book extends Item{}
ํ์ง๋ง ์ด๋ ๊ฒ ๋ถ๋ฆฌํ ์ํ์์ SQL์ ์ํํ ๊ฒฝ์ฐ ์ต์ 2๋ฒ์ ์ํํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด Album ๊ฐ์ฒด
์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ์ด์ค ๋ Album ๊ฐ์ฒด
๋ Item ๊ฐ์ฒด
๋ฅผ ์์๋ฐ๊ณ ์๊ธฐ์ Item ๊ด๋ จ ๋ฐ์ดํฐ
๋ ๊ฐ์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
ํ์ง๋ง ๊ฐ์ฒด๋ก์๋ ์ฐ๊ด์ด ์์ง๋ง ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ์์๋ Album๊ณผ Item ํ ์ด๋ธ์ ๋ถ๋ฆฌ๋์ด ์๊ธฐ์ ์๋์ ๊ฐ์ ์์ ์ ๊ฑฐ์ณ์ผ ํ๋ค. ์ด๋ ์กฐํ, ์์ , ์ญ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
INSERT INTO Item ...
INSERT INTO Album ...
๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์ฐธ์กฐ์ ์ ๊ทผํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์กฐํ
ํ๋ค.
๋ฐ๋ฉด์ ํ
์ด๋ธ
์ ์ธ๋ํค
๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ํ
์ด๋ธ๊ณผ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์กฐ์ธ์ ์ฌ์ฉํด์ ์ฐ๊ด๋ ํ
์ด๋ธ์ ์กฐํํ๋ค.
class Member{
Team team; // ์ฐธ์กฐ
...
Team getTeam(){
return team;
}
}
๊ฐ์ฒด์์๋ ํ ๋ฒ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ํ ์ด๋ธ์์๋ 2๋ฒ์ ๋๋ ์ ์ฒ๋ฆฌํด์ผ ๋๋๋ฐ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
User user = findUser();
Team team = user.getTeam();
๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๋ฐฉ์์ ๋จ์ํ๊ฒ ๊ฐ์ฒด ๋ด์ ์์๋ค์ ์ด์ฉํ๋ฉด ์ฝ๋ค.
User user = userDao.findUser();
Team team = TeamDao.findTeam(user.getTeamId());
ํ์ง๋ง ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ์ง ๋ค๋ฉด ์์ ๊ฐ์ด DAO๋ฅผ 2๊ฐ ์์ฑํ๊ณ 2๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ์ฌ ์์ ์ ์ํํด์ผ ํ๋ค. ์ด์ ๋ ์์ ๋งํ๋ฏ์ด ํ ์ด๋ธ์ด 2๊ฐ๋ก ๊ตฌ๋ถ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. (ํ ์ด๋ธ์ 2๊ฐ๋ก ๋๋ ๊ฒ์ด ์๋ชป์ด๋ผ๋ ์๊ธฐ๋ ์๋๋ค.)
์ด๋ ๋ฏ ๊ฐ์ฒด์ ํ ์ด๋ธ์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น์ฑ์ผ๋ก ์ธํด ์์ ๊ฐ์ด ์ ๊ทผ์ ํ๊ฒ ๋๊ณ ๋ถํ์ํ ์ฐ์ฐ ๊ณผ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค.
๊ทธ๋ ๋ค๊ณ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋์์ธํ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์ข๋ค๋ ์๊ธฐ๋ ์๋๋ค. DB์์๋ User๊ฐ ๊ธฐ์ค์ด๋ Team์ด ๊ธฐ์ค์ด๋ JOIN์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์์ง๋ง ๊ฐ์ฒด์์๋ User์์ Team์ ๋์ถํ ์ ์์ง๋ง Team์์ User๋ฅผ ๋์ถํ๊ธฐ๋ ํ๋ค๋ค.
class Member{
Long teamId; // ์ฐธ์กฐ
...
}
class Team{
Long id;
}
์ด๋ ๊ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ ํ ์ด๋ธ์์ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ ๋๋ ํธ๋ฆฌํ๋ค. ์๋ํ๋ฉด ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ๋์ํ์ฌ ์ฒ๋ฆฌํด ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์ฌ์ค Team_ID ์ธ๋ ํค๊ฐ์ ๋ณด๊ดํ๋ teamId ํ๋์๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ฐ๊ด๋ Team์ ์ฐพ๋ ์ฐ์ฐ์ด ์ถ๊ฐ์ ์ผ๋ก ์๊ธฐ๋๊ฐ ์๋ชป๋ ์ฝ๋๋ก ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ฐ๊ด๋ Team๋ ๊ฐ์ด ๋ณํํ๊ฑฐ๋ ๋ถ์ผ์น์ฑ์ ๋ ์ง ์๊ฒ ๊ด๋ฆฌํด์ผ ํ๋ ๋ณต์ก์ฑ์ด ์๊ธด๋ค. ์ด๋ฐ ๋ฐฉ์์ ๋ฐ๋ฅด๊ฒ ๋๋ฉด ๊ฐ์ฒด ์งํฅ์ ์ฅ์ ์ ์์ด๋ฒ๋ฆฌ๊ฒ ๋๋ ๊ฒ์ด๋ค.
class Member{
Team team; // ์ฐธ์กฐ
...
getTeam(){
return team;
}
}
class Team{
Long id;
}
์ด์ฒ๋ผ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ชจ๋ธ๋ง์ ํ ๊ฒฝ์ฐ ๊ฐ์ฒด ๊ฐ์ ์ฐ๊ด์ฑ์ ๋ํ ๋ฌธ์ ๋ ์์ด์ง๋ค. ๋์ ํ ์ด๋ธ ๊ธฐ์ค์ผ๋ก ๋ค์ ๋ณธ๋ค๋ฉด ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๊ธฐ๋ ์ฝ์ง ์๋ค. ์๋ํ๋ฉด ํ๋์ ๊ฐ์ฒด๋ฅผ ์ชผ๊ฐ์ ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ๋๋๋ ๋ก์ง์ ์์ฑํด ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. (์ด ๊ฐ์ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ๋๊ฐ DAO์์ ์ถ๊ฐ๋ก ๋ก์ง์ ์ง์ฃผ์ด์ผ ํ๋ค.)
๊ฐ์ฒด ๋ชจ๋ธ
์ ์ธ๋ ํค๊ฐ ํ์ ์๊ณ ๋จ์ง ์ฐธ์กฐ๋ง ์์ผ๋ฉด ๋๋ค.
ํ
์ด๋ธ
์ ์ฐธ์กฐ๊ฐ ํ์ ์๊ณ ์ธ๋ ํค๋ง ์์ผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ์ ์ด ๊ฐ์ ํจ๋ฌ๋ค์์ ๋ง์ถ๊ธฐ ์ํด์ ๊ฐ๋ฐ์๊ฐ ์ค๊ฐ์์ ๋ณํ ์ญํ ์ ํด์ผ ํ๋ค. ์ด๋ฌํ ๋ณํ ์ญํ ์ ์๋ฅผ ๋ ๋ค๋ฉด,
member.getTeam().getId;
์์ฒ๋ผ ๊ฐ์ฒด ๋ด์ id ํ๋๋ฅผ ํตํด ID ๊ฐ์ ์ด์ฉํ ํ ์ด๋ธ ์ฐธ์กฐ๋ฅผ ์งํํ๋ฉด ๋๋ค.
ํ์์ด ์์๋ ํ์ ์กฐํํ ๋๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๋ ํ์ ์ฐพ์ผ๋ฉด ๋๋๋ฐ, ์ด์ ๊ฐ์ ๊ณผ์ ์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์
์ด๋ผ ํ๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋ฅผ ์ด์ฉํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ๊ฒ
์ ์๋ฏธํ๋ค.
๋ค์์ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์ฝ๋์ด๋ค.
member.getOrder().getOrderItem()...
ํ์ง๋ง ๋ค์ SQL์ ์ฌ์ฉํ์ฌ member์ team์ ๋ํ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ, Order์ ๊ฐ์ด ๋ค๋ฅธ ๊ฐ์ฒด ๊ทธ๋ํ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก null ๊ฐ์ ๊ฐ์ง๊ณ ์ด๋ ํ์์ ํ ์ ์๊ฒ ํ๋ค.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
// null -> member์ team์์๋ง ํ์ผ๋ฏ๋ก order_id ๊ฐ์ด ์๋๋ผ๋ ์กฐ์ธ์ ์ ํด์ ๋ฐ์ดํฐ๊ฐ ์๋ค.
member.getOrder();
์ฆ, SQL์ ์ง์ ๋ค๋ฃจ๋ฉด ์ฒ์ ์คํํ๋ SQL์ ๋ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ด๋๊น์ง ํ์ํ ์ ์๋์ง ์ ํด์ง๋ค.
์ด๊ฒ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๊ฐ์ฒด ๊ทธ๋ํ๊ฐ ๋ค๋ฅธ๋ฐ ์ธ์ ๋์ด์ง์ง ๋ชจ๋ฅผ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํจ๋ถ๋ก ํ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์์๊ฒ๋ ํฐ ์ ์ฝ์ด๋ค. (SQL ์ฟผ๋ฆฌ๋ ์ด๊ฒ์ ์ฌ์ฉํ๋ ๋ฉ์๋์ ๋ํด์๋ ์์งํ๊ณ ๊ด๋ฆฌํด์ผ ํ๋ ์ด๋ ค์์ด ์๋ค.)
public void process(){
Member member = memberDAO.find(memberId); // SQL ์คํ
member.getTeam(); // ์์ ์ฟผ๋ฆฌ๋ก Team ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ ๊ฐ๋ฅํ๊ฐ?
member.getOrder().getDelivery(); // Order ๊ฐ์ฒด ๊ทธ๋ํ ํ์ ๊ฐ๋ฅํ๊ฐ?, ๊ฐ๋ฅํ๋๋ผ๋ Delivery๋?
}
์ ์ฝ๋์ ๊ฐ์ด ์ธ์ ๋์ด์ง์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ์๋ DAO๋ฅผ ์ด์ด์ SQL์ ์ง์ ํ์ธํด์ผ ํ๋ค. ์์ ๋งํ๋ฏ์ด SQL์ ์์กด์ ์ธ ๊ฐ๋ฐ๋ก ๋ ผ๋ฆฌ์ ์ผ๋ก ์ข ์๋์ด์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค.
๋ฐ๋๋ก
๊ฐ์ฒด ๊ทธ๋ํ ํ์์ ์ํด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ JOIN ํ์ฌ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ฑ๋ฅ์ ์ผ๋ก ๋ง์ ์ด์๊ฐ ์๋ค. ๊ฒฐ๊ตญ ์ํฉ์ ๋ฐ๋ผ์ DAO์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๋ง๋ค๊ณ ์ฌ์ฉํด์ผ ํ๊ณ ์ด๋ฅผ ์์ง ๋ฐ ๊ด๋ฆฌํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ธฐ๋ณธ ํค์ ๊ฐ์ผ๋ก ๊ฐ ROW
๋ฅผ ๊ตฌ๋ถํ๋ค.
๋ฐ๋ฉด์ ๊ฐ์ฒด๋ ๋์ผ์ฑ ๋น๊ต
์ ๋๋ฑ์ฑ ๋น๊ต
๋ผ๋ 2๊ฐ์ง ๋น๊ต ๋ฐฉ๋ฒ์ด ์๋ค.
๋์ผ์ฑ ๋น๊ต
: == ๋น๊ต
, ๊ฐ์ฒด์ ์ฃผ์ ๊ฐ์ ๋น๊ต๋๋ฑ์ฑ ๋น๊ต
: equals() ๋น๊ต
, ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ ๋น๊ต๋ฐ๋ผ์ ํ ์ด๋ธ์ ๋ก์ฐ๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์๋ ์ฐจ์ด๊ฐ ์๋ค.
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
..Member๋ฅผ ์ป๊ธฐ ์ํ DB ๋ก์ง..
return new Member(DB ๋ก์ง์ ํตํด ์ป์ ๊ฐ);
Member member1 = memberDAO.getMember(100);
Member member2 = memberDAO.getMember(100);
System.out.println(member1 == member2) // ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ค๋ฅด๋ฏ๋ก false ์ถ๋ ฅ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด์ ์ผ๋ก ๋ณด๋ฉด ๋์ ๊ฐ์ ๋ฐ์ดํฐ์ด์ง๋ง ์๋ฐ ์ฝ๋๋ฅผ ํตํด์๋ ๋์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ๊ณ ๋์จ๋ค. ๋ฌผ๋ก equals()๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฑ์ฑ์ ๋ํ true๋ฅผ ์ป์ ์ ์์ง๋ง ๋์ผ์ฑ์ ๋ํด์ false ๊ฐ์ ๊ฐ์ ธ์ผ ๋๋ค๋ ๊ฒ์ด ๋์ผํ ๋ฐ์ดํฐ์์๋ ๊ทธ ์๋ฆฌ๊ฐ ๋ง์ง ์๋ค
Member member1 = list.get(0);
Member member2 = list.get(0);
System.out.println(member1 == member2) // ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๊ฐ์ผ๋ฏ๋ก true ์ถ๋ ฅ
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ DB๊ฐ ์๋ ๊ฐ์ฒด์งํฅ ๊ด์ ์ผ๋ก๋ง ๋ณธ๋ค๋ฉด true ๊ฐ์ ๊ฐ์ง ๊ฒ์ด๋ค.
์ด๋ฌํ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ก์ฐ๋ฅผ ์กฐํํ ๋๋ง๋ค ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ์ฝ์ง ์๋ค. ์ฌ๊ธฐ์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๋ ์ํฉ๊น์ง ๊ณ ๋ คํ๋ฉด ๋ฌธ์ ๋ ๋ ์ด๋ ค์์ง๋ค.
์์๋ ๊ฐ์ฒด๋ฅผ ํ
์ด๋ธ ๋ถ๋ฆฌ๋ฅผ ์ด์ฉํด ๋ถ๋ฆฌํ์๊ธฐ์ ์ฐ๋ฆฌ๋ 2๋ฒ์ SQL ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค.
JPA๋ ์ด๋ฌํ ์์๊ณผ ๊ด๋ จ๋ ํจ๋ฌ๋ค์์ ํด๊ฒฐํด ์ฃผ๋๋ฐ ๋ง์น ์๋ฐ ์ปฌ๋ ์
์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ฏ์ด JPA์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค.
public void save (Item item, Album album){
String insertSQL1 = "INSERT INTO ITEM...";
String insertSQL2 = "INSERT INTO ALBUM...";
...
st.executeUpdate(insertSQL1);
st.executeUpdate(insertSQL2);
...
}
public void save(Album album)(){
jpa.persist(album);
}
์ด๋ ๋ฏ ๋จ์ album ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์์์ ๋ํ ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ผ ์ ์๊ณ ๊ฐ์ฒด์งํฅ์ ์ฅ์ ์ ์ด์ฉํ ์ ์๋ค.
JPA๋ ์ฐ๊ด๊ด๊ณ์ ๊ด๋ จ๋ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค๋ค.
member.setTeam(team);
jpa.persist(member);
๊ฐ๋ฐ์๋ ๊ธฐ์กด ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์ JPA API๋ฅผ ์ฌ์ฉํด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. JPA๋ ์ฐธ์กฐ๋ฅผ ์ธ๋ ํค๋ก ๋ณํํด์ ์ ์ ํ INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค. ๊ฐ์ฒด๋ฅผ ์กฐํํ ๋ ์ธ๋ ํค๋ฅผ ๋ณํํ๋ ์ผ๋ JPA๊ฐ ์ฒ๋ฆฌํด ์ค๋ค.
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
๊ธฐ์กด ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ SQL์ ๋ฐ๋ผ ํ์ํ ์ ์๋ ๊ฐ์ฒด์ ๋ฒ์๊ฐ ์ ํ๋์์๋ค. (JOIN ์ ํ๋ฉด ๋ชป ๊ฐ์ ธ์จ๋ค.) ํ์ง๋ง JPA๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ๋ง์๊ป ํ์ํ ์ ์๋ค.
Member member = jpa.find(Member.class, memberId);
member.getOrder().getOrderItem().getOrderOptionGroup().getOderOption()...
JPA๋ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ์ ์ ํ SELECT SQL์ ์คํํ๋ค. ์ด ๊ธฐ๋ฅ์ ์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃฌ๋ค๊ณ ํด์ ์ง์ฐ ๋ก๋ฉ
์ด๋ผ๊ณ ํ๋ค. JPA๋ ์ง์ฐ ๋ก๋ฉ
์ ํฌ๋ช
ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก JPA์ ๊ด๋ จ๋ ์ด๋ค ์ฝ๋๋ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค.
์ฆ, ์ฌ์ฉํ๋ ์์ ์ ์กฐํ๋ฅผ ์คํํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
// ์ฒ์ ์กฐํ ์์ ์ SELECT MEMBER SQL
Member member = jpa.find(Member.class, memberId);
Order order = member.getOrder();
order.getOrderDate(); // Order๋ฅผ ์ฌ์ฉํ๋ ์์ ์ SELECT ORDER SQL
๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ์งํฅํ๋ ํจ๋ฌ๋ค์์ด ์๋ก ๋ค๋ฅด๋ค. ๋ฌธ์ ๋ ์ด ํจ๋ฌ๋ค์์ ์ฐจ์ด๋ฅผ ๊ทน๋ณตํ๋ ค๊ณ ๊ฐ๋ฐ์๊ฐ ๋๋ฌด ๋ง์ ์๊ฐ๊ณผ ์ฝ๋๋ฅผ ์๋นํ๋ค๋ ์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ด๋ ค์ด ๋ฌธ์ ๋ ์ ๊ตํ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์ ํ ์๋ก ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ๋์ฑ ํ์ํ๋ค
JPA๋ ์ด๋ฌํ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ๊ณ ์ ๊ตํ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์ ์ ์งํ๊ฒ๋ ๋์์ค๋ค. ๋ฌด์กฐ๊ฑด ์ข๋ค๋ ๋ง์ ์๋์ง๋ง ๊ฐ๋ฐ์๋ ์ด๋ก ์ธํด ๋์ฑ ๊ฐ๋ฐ์๋ง ์ง์คํ ์ ์๊ฒ ๋์๋ค.