๋ชฉ์ฐจ
๋ฐฐ๊ฒฝ
์ ํฌ ๋ชจ๋ฝ์ ์คํ๋ฆฐํธ 5๋ฅผ ์์ํ๋ฉด์ ์๊ตฌ ์ฌํญ ์ด์ธ์ ํจ๊ป ํด์ผ ํ ์ผ๋ค์ ๋ํด ํ์๋ฅผ ํ์์ต๋๋ค. ์บ์ฑ ์๋ฒ, ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฑ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ค์ด ๋์๋๋ฐ ๊ทธ ์ค์์๋ ๋๋ฉ์ธ ์ฌ์ค๊ณ์ ๋ํ ์๊ตฌ๊ฐ ๊ฐ์ฅ ์ปธ์ต๋๋ค. ๋ชจ๋ ๋ฐฑ์๋ ํ์์ด ๋๋ฉ์ธ์ ๋ํ ๋๊ณต์ฌ๋ฅผ ์ํ๊ธฐ๋ ํ๊ณ , ๊ณ์ธต ๊ตฌ์กฐ ์ฌ์ค๊ณ์ ๋ํ ํฅ๋ฏธ๋ ์ปธ๊ธฐ๋๋ฌธ์ ์ด๋ฒ ์คํ๋ฆฐํธ 5์์ ๋๋ฉ์ธ ์ฌ์ค๊ณ๋ฅผ ๋๋์ ์ผ๋ก ํ๊ธฐ๋ก ๊ฒฐ์ ํ์์ต๋๋ค. ์ผ์ ์์ผ๋ก ์ผ๊ณผ ์ค์๋ ์ธ๋ฑ์ค, ์ฐ๋ ๋ ์ค์ ์ ํฌํจํ ์๊ตฌ ์ฌํญ, ์ผ๊ณผ ํ์ ์ฃผ๋ง์๋ ๋๋ฉ์ธ ์ฌ์ค๊ณ๋ฅผ ์งํํ๊ธฐ๋ก ํ์์ต๋๋ค.
๋ฌธ์ ์
๋จผ์ ์คํ๋ฆฐํธ 1-4๋ฅผ ์งํํ๋ฉด์ ๋๋ ์ฝ๋์ ๋ฌธ์ ์ ์ ๋ํด ๊ณต์ ํด ๋ณด์์ต๋๋ค.
โข
์์กด ๊ด๊ณ๊ฐ ์ฝํ์๋ค.
โฆ
Poll ย PollItem, PollItem ย PollResult ๋ฑ ์๋ก๊ฐ ์๋ก๋ฅผ ๋๋ฌด ์ ์๊ณ ์์ต๋๋ค.
โข
์๋น์ค ๊ณ์ธต ํ๋์ ๋ง์ ๋ก์ง์ด ์ง์ค๋ ๊ตฌ์กฐ์ด๋ค. โ ํ๋์ ๊ฐ์ฒด๊ฐ ๋๋ฌด ๋ง์ ์ญํ ์ ๊ฐ์ง๊ณ ์๋ค.
๋ฉ์๋ ํ๋๋ก ๋ชจ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ฝ์์ก๊ธฐ์ ์ผ๊ทธ๋ฌ์ง ์์
์์ ์ํฉ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ก๋ ์ํธ ์ฐธ์กฐํ๋ ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ ์ ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋น์ค ๊ณ์ธต์ ์์ด ์์ง๋๊ฐ ๋ถ์กฑํ๋ค๋ ์ ๋ฑ 2๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋จ๋ฐฉํฅ ์์กด์ฑ์ ๊ฐ์ง๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ๊ณ , ๊ฐ์ฅ ์ค์ฌ์ด ๋๋ ๋๋ฉ์ธ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฃ์ด ์์ง๋๋ฅผ ๋์ฌ์ผ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฆฌํฉํ ๋ง์ ํ๋ค๋ฉด ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์์ ํด์ผ ํ๊ณ , ์์ฐจ์ ์ผ๋ก ์์ํ ๊ณ์ธต, ์๋น์ค ๊ณ์ธต๋ ์ํฅ์ ๋ฐ๊ฒ ๋๋ ์ปค๋ค๋ ๊ณต์ฌ๋ฅผ ์งํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ํฉ์์ ์๋น์ค๋ ์ ์งํด์ผ ํ๊ธฐ๋๋ฌธ์ ์ฝ 4์ฃผ์ ๊ธฐ๊ฐ์ ์ก๊ณ ๋๋ฉ์ธ ์ฌ์ค๊ณ๋ฅผ ์์ํ์์ต๋๋ค.
๋ชฉํ
์ค๊ณ ๋ฐ ๊ฐ๋ฐํ๊ธฐ์ ์์ ์ฐ๋ฆฌ์ ๋ชฉํ๋ถํฐ ์๋ก ๋ค์ก๊ณ ์งํํ๋ ๊ฒ์ด ๋จผ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ค๊ณํ๊ณ ์ฝ๋๋ฅผ ์งค ๋ ์ปจ์
์ ์ก๊ณ ํญ์ ์ฐ๋ฆฌ์ ์ฒ ์น๊ณผ ์ด์ ๋ฅผ ์๊ฐํ๊ณ ์ ๋ฆฌํ๋๋ก ํ๋ค.
โ ๋ชจ๋ ์ฝ๋์ ์ด์ ์ ์๋๊ฐ ๋ฌป์ด๋๋ ๊ฒ์ด ์ฒซ๋ฒ์งธ ๋ชฉํ์์ต๋๋ค. ํ๋ก์ ํธ ์ด๊ธฐ์๋ ์๊ฐ ๋ด์ ์๋น์ค๋ฅผ ์์ฑ์์ผ์ผ ํ๊ธฐ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ถ๋ด๋ถ๋ด ์งฐ๊ณ , ์ดํ ์ง ์ฝ๋๋ฅผ ๋ค์ ๋ณด๋ฉด โ์ฐ๋ฆฌ๊ฐ ๋ ๋ฒจ 1, 2๋ ๋ญ ๋ฐฐ์ ๋๋ผโ ๋ผ๋ ์๊ฐ์ ๋ง์ด ํ๊ฒ ๋์์ต๋๋ค. ๋ฌผ๋ก ํ๋ก์ ํธ์ ์ํฉ๊ณผ ํ๊ฒฝ์ ๋ง๊ฒ ์ฝ๋ ํ๋ฆฌํฐ๋ ์ ์ ์ ์ณ๋๊ณ ์๋น์ค๋ฅผ ์๊ฐ ๋ด์ ๊ฐ๋ฐํ๋๊ฒ ๊ทธ ๋น์์ ๋ชฉํ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ ๊ฑฐ์๋ ์ฐ๋ฆฌ๊ฐ ์น์ฐ์! ๋ผ๋ ๋ง์ธ๋๋ก ๋ ๋ฒจ 1, 2๊ธฐ๊ฐ ๋ฐฐ์ด ํด๋ฆฐ ์ฝ๋, ์๋ฐ์ ํน์์ฑ ๋ฑ์ ํ์ฉํ์ฌ ์๋ฏธ์๊ณ ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ํ์์ต๋๋ค.
์์ ๋ชฉํ๋ฅผ ์กฐ๊ธ ๋ ๊ตฌ์ฒดํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โข
์์กด์ฑ ํ๋ฆ์ ๋จ๋ฐฉํฅ์ผ๋ก ๋ฐ๊พผ๋ค.
โข
๋๋ฉ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์๋กญ๊ฒ ๊ตฌ์ํด๋ณด๊ณ ๊ธฐ์กด์ ๊ตฌ์กฐ์ ๋น๊ตํด๋ณธ๋ค.
์์ธ๋ฅผ ๋ฐ๊ฒฌํ ๋๋ง๋ค ๊ฒ์ฆ ๋ก์ง์ ์ถ๊ฐํ๋ค๋ณด๋, ์ดํ ํด๋น ๋ก์ง์ ๋ณผ ๋ ์ด๋ค ๊ฒ์ฆ ๋ก์ง์ด์๋์ง ์ ๋ ํท๊ฐ๋ฆด ๋๊ฐ ๋ง์์ต๋๋ค(๊ทธ๋ฐ๋ฐ git blame ์ ๋ณด๋ฉด sungsan kim). ๊ทธ๋์ ์ด ๋ถ๋ถ์ ๋ํ ๊ฐ๋
์ฑ์ ๋์ด๊ณ ์ ํ์์ต๋๋ค. ๋ํ ๋ง์ ๋น์ฆ๋์ค ๋ก์ง๋ค์ด ์๋น์ค ๊ณ์ธต๊ณผ DB ์ฟผ๋ฆฌ์ ์ข
์์ ์ด์์ต๋๋ค. ์ด๋ฌํ ๋ก์ง๋ค์ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ด๋ถ์ ๋ฃ์ด ์์ง๋๋ฅผ ๋์ด๊ณ ์ ํ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์กด์ฑ์ ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๊ฒ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ์์ต๋๋ค. ๋๋ฉ์ธ๊ฐ์ ์๋ฐฉํฅ์ ๊ฐ์ง๊ณ , ์๋น์ค ๊ณ์ธต๊ฐ์์ ์๋น์ค๋ผ๋ฆฌ ์๋ก ์์กดํ๋ ๊ตฌ์กฐ๋ ์ํ ์ฐธ์กฐ์ ๋น ์ง ์ฐ๋ ค๊ฐ ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๋ฉ์ธ ์ค๊ณํ๊ธฐ
๋ฌธ์ ์์ธ ํ์
๊ธฐ์กด์ ์๋น์ค ๊ณ์ธต์์๋ ๋ ํฌ์งํ ๋ฆฌ์ ๋ฉ์๋์ ๋น์ฆ๋์ค ๋ก์ง์ด ํจ๊ป ์ด์ธ๋ ค ๋๊ณ ์์์ต๋๋ค. ์ด์ ๊ฐ์ ์ํฉ์ด ํน์ํ๋ค๊ณ ๋ณผ ์๋ ์์ต๋๋ค. JPA ๋ฉ์๋์ ๊ฐ๋จํ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ๊ฒ์ ์ต์ํ๊ณ , ์คํ๋ ค ๊ฐ๋ฐ ์ด๊ธฐ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์๊ธฐ๋๋ฌธ์
๋๋ค. ํ์ง๋ง ๊ฒ์ฆ ๋ก์ง๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ณต์กํด์ง๊ณ , ๋ค์ํ JPA ๋ฉ์๋๋ฅผ ํ์ฉํ๊ฒ ๋๋ฉด์ ์ ์ ์ ์ง, ๋ณด์ ํ๊ธฐ๊ฐ ํ๋ค์์ต๋๋ค. ๋ํ ๋๋ฉ์ธ ๊ฐ์ฒด์๋ getter ์ ์์ฑ์๊ฐ ๊ฐ๋ํ๊ณ ์์ฑ ์ ๊ฒ์ฆํ๋ ๋ก์ง์ด ์ ๋ถ์์ต๋๋ค.
๋ ๋ฒจ 1, 2 ๊ณผ์ ์์ ๋ฏธ์
์ ํ ๋์๋ ๋๋ฉ์ธ ๊ฐ์ฒด์์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์์ฃผ ๋ณด์ง ๋ชปํ์์ต๋๋ค. ๊ทธ๋์ ์ ์ด๋ ๊ฒ ๋์๋์ง ๊ณฐ๊ณฐํ ์๊ฐํด ๋ณด๋ค๊ฐ ์ ํฌ ์๋น์ค์ ํ์, ํ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ๋๋ฅผ ํ์ํ์ต๋๋ค. DB ์คํค๋ง๋ฅผ ๋จผ์ ์ค๊ณ๋ฅผ ํ ๋ค ํด๋น ํ
์ด๋ธ๊ณผ ์ฐ๊ด ๊ด๊ณ์ ๋ง์ถฐ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์์ต๋๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ ๊ฐ์ฒด๊ฐ ์ญํ ๊ณผ ์ฑ
์์ ๊ฐ์ง๋ ๊ตฌ์กฐ๊ฐ ์๋๋ผ, ๋ฐ์ดํฐ ์ค์ฌ์ ์ธ ๊ตฌ์กฐ๊ฐ ๋์๋ค๊ณ ์ถ์ธกํ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ DB๋ผ๋ ๊ฐ๋
์ด ์๋ ์ฝ์์ ์ธ๊ณ๊ด์์, ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ์ฌ๊ณ ํด๋ณด๊ธฐ๋ก ํ์์ต๋๋ค.
๋๋ฉ์ธ ์ค๊ณ ์ด์
์ ์ฒด ๊ธฐ๋ฅ์ด ํฌํ, ์ฝ์์ก๊ธฐ ๋ ๊ฐ์ง๊ฐ ์์๊ณ ์๊ฐ์ ํจ์จ์ฑ๊ณผ ํ์
์ ์ํด ๊ฐ ๊ธฐ๋ฅ์ ๋ ๋ช
์ฉ ๋งก์ ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ ๋๋ฉ์ธ ์ฌ์ค๊ณ๋ฅผ ์งํํ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์๋ฆฌ์ ์ ๋ ํฌํ, ์ฐจ๋ฆฌ์ ๋ฐฐ์นด๋ผ๋ ์ฝ์์ก๊ธฐ๋ฅผ ๋งก์์ต๋๋ค.
๋๋ฉ์ธ์ ๊ทธ๋ ค๋ณด๊ธฐ ์ ์, ๊ฑด์ถ๊ฐ ์์ ์ธ ์๋ฆฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋ง์ ํด์ฃผ์์ต๋๋ค.
โข
์๊ณต์ด ์๋๋ผ ๋์์ด๋์ ๊ด์ ์์ ์๊ฐํด๋ณธ๋ค.
โข
์ค๋ ฅ์ด ์์ด๋ฉด ๋์์ธ์ ํ๋ ๋จ๊ณ์์๋ ์๊ณต์ ์๊ฐํ ์ ์๋ ์ฌ๋์ด ๋์!
์ด ๋ง์ด ํฌ๊ฒ ์๋ฟ์์ต๋๋ค. ํ๋์ ๊ฑด๋ฌผ์ ์ง์ ๋์๋ ๋์์ด๋, ์๊ณต์ฌ ๋ฑ ๋ค์ํ ๋๋ฉ์ธ์ ๊ฐ์ง ์ฌ๋๋ค์ด ํ๋ ฅํ์ฌ ์์ฑํ๋ค๊ณ ํฉ๋๋ค. ๊ธฐ์กด์ ์ ํฌ๊ฐ ๋ง๋ ๊ฑด๋ฌผ์ ์๊ณต์ฌ๊ฐ ๋์์ธ๊น์ง ์ง์ ๊ฐ์
ํ์ฌ, ๋น ๋ฅด๊ฒ ์ง์ ์๋ ์์์ง๋ง ๋ฏธ์ ์ธ ์๋ฆ๋ค์์ด ์๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ ์ด๋๊ฐ ๊ณ๋จ์ด๊ณ ์ด๋๊ฐ ๋ฐฉ์ธ์ง ์์์ฐจ๋ฆฌ๊ธฐ ํ๋ ๊ตฌ์กฐ์์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ ๋์์ด๋๋ง ์์ผ๋ฉด ์๊ณต ์์ ํ์ํ ํจ์จ์ ์ธ ๊ณ๋จ ์, ์งํฑํ ์ ์๋ ์์ฌ ๋ฑ์ ์ค์ ๊ฑด์ค ํ์ฅ์์ ์์์ฐจ๋ฆฌ๊ธฐ๋ ํ๋ญ๋๋ค. ๊ทธ๋์ ์ฒ์์๋ ๋์์ด๋์ ์
์ฅ์์ ๊ฑด๋ฌผ ๋ด ๊ธฐ๋ฅ๋ค์ ๋ํ ์์น์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ ๋ฑ์ ๋ํด ๋์์ธํ๊ณ , ์ค์ ๊ฑด๋ฌผ์ ์ง์ ๋์๋ ๋ง๋ค์ด ๋์ ๋์์ธ์ ๋ฐํ์ผ๋ก ์ค์ ํ์ฅ์ ์ํฉ์ ๋ง๊ฒ ์์ ์ ํ๋ฉด์ ๋ฆฌ๋ชจ๋ธ๋ง์ ์์ฑํด ๋ณด๊ธฐ๋ก ํ์์ต๋๋ค.
โข
์ด์ ๋๋ฉ์ธ ๊ตฌ์กฐ
โข
์๋ก์ด ๋๋ฉ์ธ ๊ตฌ์กฐ ์ด์
๊ฐ ๋๋ฉ์ธ์, ์ง๊ธ๊น์ง ๋ง๋ ๋น์ฆ๋์ค ๋ก์ง์ ํ์ํ ์ต์ํ์ ๋ฉค๋ฒ ๋ณ์๋ง ๊ฐ์ง ์ ์๋๋ก ๊ตฌ์ฑํด ๋ณด์์ต๋๋ค. member๊ฐ team์ ์ํ๋์ง ํ์ธํ๋ ๋ก์ง์ ๊ณตํต ๋ก์ง์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฒ์ฆ ๋ก์ง์ ๊ธฐ์กด ๋๋ฉ์ธ์์ ๋ถ๋ฆฌํ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ Member ์ Team ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ํ์ฉํ ์ ์๋ ๋ก์ง์ด ์๊ธฐ๋๋ฌธ์ Member ์ Team ๊ฐ์ฒด๋ฅผ ๊ฐ์ ์ฐธ์กฐ๋ก ๋ฐ๊พธ์ด ์์กด๋๋ฅผ ๋ฎ์ถ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฐฉํฅ์ผ๋ก ์ฐธ์กฐํ๋ ๊ตฌ์กฐ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ์์ต๋๋ค. Poll Item ๊ฐ์ฒด์์ Poll ์ ๋ํ ์์กด์ ๋ถ๋ฆฌํ์๋๋ฐ, ์๋ฅผ ๋ค์ด Poll Item ์์๋ Poll ์ ์๋ ํฌํ ์ ๋ชฉ ๋ฑ๊ณผ ๊ฐ์ ์ ๋ณด๋ก ํ์ฉํ ์ ์๋ ๋ก์ง์ด ์๊ธฐ ๋๋ฌธ์ Poll Item ์์ Poll ์ ์ฐธ์กฐํ ํ์๊ฐ ์์์ต๋๋ค. ๋ํ Select Members(๊ตฌ Poll Result) ๋ ์์ ์ด ์ด๋ค Poll Item์ ํฌํํ๋์ง ์ ํ์๊ฐ ์์์ต๋๋ค. ํฌํ ํญ๋ชฉ ๋ด์ฉ์ ์ ํ ์ธ์(ํฌํ ๊ฒฐ๊ณผ)์์ ์ ํ์ ์์ด, ํฌํํ ๋ฉค๋ฒ์ ํฌํ ์ด์ ๋ง ์๋ฉด ๋๊ธฐ๋๋ฌธ์
๋๋ค. ๊ทธ๋์ Select Members ์์๋ Poll Item ์ ๋ํ ์์กด๋ ๋ถ๋ฆฌํ๊ฒ ๋์์ต๋๋ค.
๋๋ฉ์ธ ์ฌ์ค๊ณ JPA ์ ์ฉ
๋จผ์ ์ค๊ณํ ์ด๋ฏธ์ง์ ๋ง์ถฐ ๋๋ฉ์ธ ๊ฐ์ฒด์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋ง๋ ๋ค, JPA ์ ์ ์ฉํด ๋ณด๊ณ ์ ํ์์ต๋๋ค. JPA ์ ์ฉ ์ ์ฃผ์๊น๊ฒ ๋ด์ผํ ๋ถ๋ถ์ ๋ํด ๊ณ ๋ฏผํด ๋ณด์์ต๋๋ค.
โข
์์กดํ field ๊ฐ ์ ์ ํ๊ฒ column ๊ณผ ์ฐ๊ด ๊ด๊ณ๋ก ์ ์ฉ๋๋๊ฐ
โข
๋๋ฉ์ธ ๋ก์ง์ผ๋ก ์ถ๊ฐ, ๋ณ๊ฒฝ, ์ญ์ ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ ํ๊ฒ ์ ์ฉ๋๋๊ฐ
๊ฐ ๊ฐ์ฒด์ ์ผ๊ธ ์ปฌ๋ ์
์ผ๋ก ํฌ์ฅํ ๊ฐ์ฒด์ ๋ํด JPA ๋ @Embedded, @ElementCollection ๊ณผ ๊ฐ์ ์ด๋
ธํ
์ด์
์ผ๋ก ํ์ธํ๊ณ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ฉ์ธ ๋ก์ง์ผ๋ก ์ธํด ๋ณ๊ฒฝ๋ ์ฌํญ์ ๋ํด์๋ ๋ฐ๋ก update ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๋์ , JPA ๊ฐ dirty checking ์ผ๋ก ๋ณ๊ฒฝ์ ์ ํ์ธํ๊ณ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌ์ํ์์ต๋๋ค.
โข
@Embedded, @Embeddable
๊ฒ์ฆ ๋ก์ง๊ณผ ๋๋ฉ์ธ ๋ก์ง์ ๋ถ๋ฆฌํ๊ธฐ ์ํด title, items ๋ฑ์ ๋ณ์๋ ๊ฐ๊ฐ์ฒด์ ์ผ๊ธ ์ปฌ๋ ์
๊ฐ์ฒด๋ก ํฌ์ฅํ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ ๋ฌผ๋ก DB ์ ํ์
์ผ๋ก ์๊ธฐ์, ํด๋น ๊ฐ์ฒด ๋ด๋ถ์ DB ํ์
๊ณผ ๋งคํ๋ ์ ์๋ ๋ณ์๋ฅผ ์ฐพ๊ณ , ํด๋น ๋ณ์๋ฅผ DB ์ column ์ผ๋ก ์ ์ ํฉ๋๋ค.
โข
@ElementCollection
Specifies a collection of instances of a basic type or embeddable class.
์ปฌ๋ ์
์ ๊ฐ ํ์
์ผ๋ก ์ ์ฅํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋น๊ตํ ์ ์๋ ๋์์ @OneToMany ๊ฐ ์๋๋ฐ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ปฌ๋ ์
์ ์ ๋ค๋ฆญ์ผ๋ก ์ ์ ๋๋ ํ์
์ด @Entity ์ธ์ง @Embedded ๋๋ ๊ธฐ๋ณธ ํ์
(String, Integer)์ธ์ง์ ์ฐจ์ด์
๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
๊ด์ ์ผ๋ก ๋ณด์์ ๋๋ก ์ฐจ์ด์ ์ ์๊ฐํด๋ณด๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ์ ์ผํ๊ณ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ตฌ๋ถ์ด ๋๊ณ ๋
์์ ์ธ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ฑ๊ฒฉ์ ์ง๋๋์ง, ์๋๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํ๊ณ , ์๋ช
์ฃผ๊ธฐ๊ฐ ์์๋ ๊ฐ์ฒด์ ์ข
์์ ์ธ์ง๋ก ํ๋จํ์์ต๋๋ค.
SelectMembers ๋ผ๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ ๊ฐ๊ฐ์ ํฌํ ํญ๋ชฉ์ ๋ํ ํฌํ ์ด์ ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด์
๋๋ค. ํด๋น ๊ฐ์ฒด์์๋ ์ปฌ๋ ์
ํ์
์ผ๋ก ์์ ์ธ๊ธํ ํ๋จ์์ ํ์์ ์ํ์ฌ @ElementCollection ์ ์ฌ์ฉํ์๋๋ฐ์, ์กฐ๊ธ ํน์ดํ ์ ์ ์ปฌ๋ ์
์ค Map ์ ์ฌ์ฉํ๋ค๋ ์ ์
๋๋ค. ๊ฐ๊ฐ์ ํฌํ ํญ๋ชฉ์ธ Poll Item ์
์ฅ์์ ๋ณด์์ ๋ ์์ ์ ํฌํํ ์ฌ์ฉ์์, ์ฌ์ฉ์๊ฐ ํด๋น ํฌํ ํญ๋ชฉ์ ์ ํํ ์ด์ ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ํ๋นํ๊ณ , ํฌํ ํญ๋ชฉ์ ๋ํด ์ฌ์ฉ์๋ ํ ๋ฒ๋ง ํฌํํ ์ ์์ต๋๋ค. ๋ง์ฝ ๋ค์ ํฌํํ๋ค๋ฉด ์ด๋ ํฌํ ์ฌ์ ํ์ด๋ผ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ๋์ด, ๊ธฐ์กด์ ํด๋น ํฌํ ํญ๋ชฉ์์ ์ ํํ ๋ฉค๋ฒ(Map ์ Key)๋ฅผ ์ฐพ๊ณ , ๊ธฐ์กด์ ํฌํ ์ด์ (Value)๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JPA ๋ ์ด๋ฌํ Map ๊ณผ ๊ฐ์ ์ปฌ๋ ์
๋ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํด ์ค๋๋ค.
โข
@CollectionTable
Specifies the table that is used for the mapping of collections of basic or embeddable types.
@ElementCollection ์ ์์ฃผ ๋จ์ํ๊ฒ ์๊ฐํ์ฌ ์ฐ๊ด ๊ด๊ณ ๋งคํ์ ํ๋ค ๋ฅผ JPA์ ์๋ ค์ฃผ๋ ๊ฑฐ๋ผ๋ฉด, @CollectionTable ์ ์๋ก ์์ฑ๋๋ ์ปฌ๋ ์
ํ์
์ ๋ํ ํ
์ด๋ธ์ ๋ํ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ๋ช
์ํ๋ ๊ฒ์ด ๋ชฉ์ ์
๋๋ค. ์ฒ์์๋ ๋ณ์ ๋ช
์ด selectMembers ๋ผ์ ํ
์ด๋ธ ๋ช
์ผ๋ก select_members ๊ฐ ๋ค์ด๊ฐ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค. ํ์ง๋ง ์ ํฌ๋ ํ
์ด๋ธ ๋ช
์ ๋จ์๋ก ํต์ผํ๊ธฐ๋๋ฌธ์ name = "select_member" ๋ผ๋ ์ต์
์ ๋ฃ์ด์ฃผ์์ต๋๋ค. (์ถ๊ฐ. ํฌ์คํ
์ ํ๋ฉด์ name ์ต์
์ ๋ผ๊ณ ์คํํด๋ณด๋, poll_item_select_members ๋ผ๋ ํ
์ด๋ธ ๋ช
์ผ๋ก ๋งคํ ํ
์ด๋ธ ์ด๋ฆ์ฒ๋ผ ์์ฑ๋์์ต๋๋ค)
JPA ํ
์ด๋ธ ์์ฑ์ ์ํ ๊ธฐ๋ณธ์ ์ธ ์ธํ
์ด ์๋ฃ๋์ด ddl-auto ์ต์
์ create-drop ์ผ๋ก ์ ์ ๋ณ๊ฒฝํ ๋ค ๋ก์ปฌ ์๋ฒ์์ ์๋ฒ๋ฅผ ์คํํด ๋ณด์์ต๋๋ค.
๋ฌธ์ 1. ๋ถํ์ํ ๋งคํ ํ ์ด๋ธ ์์ฑ
Poll ๊ณผ Poll Item ์ฌ์ด ๊ตฌ์กฐ๋ @OneToMany ๋จ๋ฐฉํฅ์
๋๋ค. ๊ทธ๋์ Poll Item ์ ๋ํ ์ ์ด๊ถ์ Poll ์ด ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ์ง๋ง DB ์์๋ ์ด์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ๊ธฐ ์ํด์๋ Poll ์ ๋ํ ์ ๋ณด๋ฅผ Poll Item ์ด ์ธ๋ํค๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ @ManyToOne ์ด๋ผ๋ ์ด๋
ธํ
์ด์
์ด ์๋ค๋ฉด JPA ๋ ์ฐธ์กฐ ํ
์ด๋ธ์ ์ปฌ๋ผ์ ์ถ๊ฐํ๋ ๋์ , ๋ค๋๋ค ๊ด๊ณ์์ ์ฌ์ฉํ๋ ๋งคํ ํ
์ด๋ธ์ ์๋ก ์์ฑํฉ๋๋ค.
// ์์ฑ๋ ๋งคํ ํ
์ด๋ธ.
create table poll_values (
poll_id bigint not null,
values_id bigint not null
)
// auto increment ๋๋ PK ์์ด poll item id ์ unique ์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.
alter table poll_values
add constraint UK_svhq3p4dudwno4rl9gqxv0ohr unique (values_id)
alter table poll_values
add constraint FKklk455ytxmer2rri215keq7l9
foreign key (values_id)
references poll_item
alter table poll_values
add constraint FKhfe8b8s1xteaqqeoakyb1jkap
foreign key (poll_id)
references poll
Java
๋ณต์ฌ
ํ์ง๋ง Poll ๊ณผ Poll Item ๊ด๊ณ๋ ์ผ๋๋ค ๊ด๊ณ์ด๊ธฐ๋๋ฌธ์ ๊ตณ์ด ๋งคํ ํ
์ด๋ธ์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ @ManyToOne ์ ์ ์ฉํ๋ฉด ์๋ฐฉํฅ์ผ๋ก ํ๋ฅด๊ฒ ๋๊ณ , @ManyToOne ๋จ๋ฐฉํฅ์ ์ ํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ์์ ์ ์ด๊ถ์ Poll Item ์ ๋๊ฒจ์ฃผ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ง๊ธ์ ๊ตฌ์กฐ์์ ๊ธฐ์ ์ ์ผ๋ก ํ์ด๋ด์ผ ํด์ ๊ณ ๋ฏผํ๋ ์์ค์ 3๊ธฐ์ ์๋์๋ก๋ถํฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฃ๊ฒ ๋์์ต๋๋ค.
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "poll_id", nullable =false, updatable =false)
private List<NewPollItem> values =new ArrayList<>();
Java
๋ณต์ฌ
@JoinColumn ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ๊ณ , ์ต์
์ผ๋ก nullable ๊ณผ updatable ์ false ๋ก ์ค์ ํ๋ฉด JPA ๊ฐ ๋งคํ ํ
์ด๋ธ์ ์์ฑํ๋ ๋์ , ์ผ๋๋ค ๊ตฌ์กฐ์ ์ธ๋ํค ๊ตฌ์กฐ๋ก ์ค์ ํฉ๋๋ค.
create table poll_item (
id bigint generated by default as identity,
subject varchar(255),
poll_id bigint not null,
primary key (id)
)
alter table poll_item
add constraint FKs2aqtb9wm719gknvljgyf0ybp
foreign key (poll_id)
references poll
Java
๋ณต์ฌ
์์ ์ค์ ๋๋ถ์ @OneToMany ๋จ๋ฐฉํฅ์ธ ์ผ๋๋ค ๊ตฌ์กฐ๋ก ํ
์ด๋ธ์ ์ค์ ํ ์ ์์์ต๋๋ค.
๋ฌธ์ 2. ์ปฌ๋ผ๋ช ๋ณ๊ฒฝ
์ธ๋ ํค์ Map ์ key ๊ฐ ๋ณตํฉํค๋ก ์ค์ ๋๋ ๊ฒ์ ์๋ํ๋๋ก ์ ์์ฑ๋์์ต๋๋ค. ํ์ง๋ง element collection ์ ์ปฌ๋ผ ๋ช
์ด ์ ๋๋ก ๋ค์ด๊ฐ์ง ์์์ต๋๋ค.
create table select_member (
poll_item_id bigint not null,
values varchar(255),
select_members_key bigint not null,
primary key (poll_item_id, select_members_key)
)
Java
๋ณต์ฌ
์ปฌ๋ผ ๋ช
์ ์ค์ ํ๋ ค๋ฉด, Column ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด์ผ ํ๊ณ , key ๊ฐ์ ์๋ ํ์
์ ์ค์ ํ๊ธฐ ์ํด์๋ @MapKeyColumn ์ ํ์ฉํด์ผ ํฉ๋๋ค.
@ElementCollection
@CollectionTable(
name = "select_member"
)
@MapKeyColumn(name = "member_id")
@Column(name = "description", nullable = false)
private Map<Long, String> values = new HashMap<>();
Java
๋ณต์ฌ
์์ ๊ฐ์ด 2๊ฐ์ ์ด๋
ธํ
์ด์
์ ์๋ก ์ถ๊ฐํ ๋ค ๋ค์ ์คํํด ๋ณด์์ต๋๋ค.
create table select_member (
poll_item_id bigint not null,
description varchar(255) not null,
member_id bigint not null,
primary key (poll_item_id, member_id)
)
alter table select_member
add constraint FK1jy0jmpad4ay1rxsw15olkpq7
foreign key (poll_item_id)
references poll_item
Java
๋ณต์ฌ
์ปฌ๋ผ ๋ช
์ด ์ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฌธ์ 3. embedded ๊ฐ์ฒด ์ค๋ณต ์ฌ์ฉ
Poll ๊ฐ์ฒด๋ ๋๋ฉ์ธ ์ฌ์ค๊ณ๋ฅผ ํ๋ฉฐ ๊ธฐ์กด์ ์กด์ฌํ๋ Team ๊ฐ์ฒด๋ฅผ ๊ฐ ๊ฐ์ฒด Code ํ์
์ team code ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ฐธ์กฐ ํํ๋ก ๋ณ๊ฒฝํ์์ต๋๋ค. ์ ํฌ๋ ๋น์ฆ๋์ค ๋ก์ง ์, team ์ ๋ํ ์๋ณ์๋ก team id ๋์ ๋๋คํ 8์๋ฆฌ์ unique ์ ์ฝ ์กฐ๊ฑด์ด ์กด์ฌํ๋ team code ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ Poll ์์ team ์ ์๋ณ์๋ก team id ๋์ team code ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์์ต๋๋ค.
@Entity
public class Poll {
@Embedded
public Code teamCode;
@Embedded
public Code code;
}
Java
๋ณต์ฌ
์ฌ๊ธฐ์ code ๋ Poll ์์ ์๋ณ์๋ก ์ฌ์ฉ๋๋ ๋๋คํ 8์๋ฆฌ ๊ฐ์
๋๋ค. ๊ทธ๋์ team code ์ code(poll cod) ๋ชจ๋ ๊ฐ ๊ฐ์ฒด์ธ Code ๋ฅผ ํ์ฉํ์๊ณ , ์๋ฒ ๋ ํ์
์ผ๋ก ์ฌ์ฉํ์์ต๋๋ค. ํ์ง๋ง ์ด๋ก ์ธํด ์ปฌ๋ผ ๋ช
์ ์ค๋ณต์ด ๋ฐ์ํ์์ต๋๋ค. ์์ Poll ๊ฐ์ฒด๋ง ๋ณด์์ ๋๋ ๋ณ์๋ช
์ด ๋ค๋ฅด๊ธฐ์ ์๋ฌด๋ฐ ์๊ฐ์์ด ๋ฌธ์ ์ ์ ์ ํ ํ์
ํ์ง ๋ชปํ๋๋ฐ, ์ฌ์ค ๋น์ฐํ ๋ฌธ์ ์์ต๋๋ค. @Embedded ํ์
์ ์์ ์ธ๊ธ๋๋ ธ๋ฏ์ด @Embedded ํ์
๋ด๋ถ์ ํ๋๋ฅผ ์ปฌ๋ผ๋ช
์ผ๋ก ์ฌ์ฉํ๊ณ , ํด๋น ๊ฐ์ฒด์ ๋ด๋ถ ํ๋๋ code ๋ผ๋ ๋ณ์๋ช
์ ๊ฐ์ก๊ธฐ์, JPA ์์๋ Poll ํ
์ด๋ธ ์์ฑ์ ์ปฌ๋ผ๋ช
์ค๋ณต ์์ธ๊ฐ ๋ฐ์ํํ๊ฒ ๋ ๊ฒ์
๋๋ค.
@Column ์ด๋
ธํ
์ด์
๋ํ ์๋ฒ ๋ ํ์
๋ด๋ถ ํ๋์ ์ ์ฉ๋๊ธฐ๋๋ฌธ์ Poll ๊ฐ์ฒด์์๋ ํด๋น ํ๋์์ @Column ์ผ๋ก ๊ตฌ๋ถํ ์ ์์์ต๋๋ค.
// ๋ถ๊ฐ๋ฅ!! ๊ฐ์ ์์ธ ๋ฐ์
@Entity
public class Poll {
@Embedded
@Column(name = "team_code")
public Code teamCode;
@Embedded
@Column(name = "code")
public Code code;
}
Java
๋ณต์ฌ
โ๋ ์ค ํ๋๋ง @Embedded ํ์
์ผ๋ก ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ๋๋ String ์ ์ฌ์ฉํ ๊น,,โ ๋ผ๋ ๋ถ์ํ ์๊ฐ์ ์ ๊น ํ์์ง๋ง ๊ธฐ์ ์ ์ผ๋ก ํด๊ฒฐํด๋ณด๊ณ ์ ํ์์ต๋๋ค. ๊ทธ๋์ ์ปฌ๋ผ์ ์ ๋ณด๋ฅผ ์ค ์ ์๋ ์ฌ๋ฌ JPA ์ ๊ธฐ๋ฅ๋ค์ ์ฐพ์๋ณด๋ค๊ฐ JPA ์ ์ด๋
ธํ
์ด์
์ค @AttributeOverride ์ด๋
ธํ
์ด์
์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ์ด ์ด๋
ธํ
์ด์
์ ํ๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ์ ์๋๋ฐ, ํด๋น ์ด๋
ธํ
์ด์
์ ํ์ฉํ๋ฉด ์์ ๋ถ๊ฐ๋ฅ ์์์ @Column ์ฒ๋ผ Poll ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Entity
public class Poll {
@Embedded
@AttributeOverride(name = "code", column = @Column(name = "team_code"))
public Code teamCode;
@Embedded
@AttributeOverride(name = "code", column = @Column(name = "code"))
public Code code;
}
Java
๋ณต์ฌ
์ต์
์ค name ์ ์๋ฒ ๋ ํ์
๋ด๋ถ ๋ณ์ ์ค ์ค๋ฒ๋ผ์ด๋ ํ ๋ณ์๋ช
์ ์ง์ ํ ์ ์๊ณ , column ์ต์
์ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ฌ์ฉํ ์ปฌ๋ผ ๋ช
์ ์ง์ ํ ์ ์์ต๋๋ค.
์ฌ์ค๊ณ ์ ์ฉ ๊ฒฐ๊ณผ
์๋น์ค ๊ณ์ธต์์ ๋ถ๊ฐํผํ๊ฒ ์กด์ฌํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ก ์ฎ๊ฒจ ์ฝ๋์ ์์ง๋๋ฅผ ๋์ด๊ณ , ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค. ๋๋ถ์ ์๋น์ค ๊ณ์ธต์ ์ฝ๋์ ์๋ ์ค์ด ํต์ฌ ๋ก์ง ํ์
์ ๋์ฑ ์ ๋ฆฌํ์ฌ ์ ์ง, ๋ณด์ํ๊ธฐ ์์ํ ์ฝ๋๊ฐ ๋์์ต๋๋ค. ๋ํ ๊ธฐ์กด์๋ ๋จ์ํ @Entity, @ManyToOne, Spring Data JPA ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์๋๋ฐ, ์ค๊ณํ ๋ด์ฉ์ ์ ์ฉํ๋ ๊ณผ์ ์์๋ @CollectionTable, @AttributeOverride๋ฑ์ ์ด๋
ธํ
์ด์
๊ณผ ๋ํฐ ์ฒดํน์ ์ด์ฉํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ์ผ๋ก DB ์ ๋ ์ข
์์ ์ธ ๊ฐ์ฒด์งํฅ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง์ ์์์ต๋๋ค.
ํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ์ ์ด ๋จ์์์ต๋๋ค. ์ด์ ๊ฒ์๊ธ์์ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด @Query ์ด๋
ธํ
์ด์
์ผ๋ก JPQL ์ ์์ฑํ์ฌ ๋ถํ์ํ join ์ฟผ๋ฆฌ๋ฅผ ์์ ๊ณ , fetch join๊ณผ default_batch_fetch_size ์ต์
๋ฑ์ ํ์ฉํ์ฌ N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ๋ ๊ฒ์ฆ ๋ก์ง๊ณผ ์ํฐํฐ ์กฐํ๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฟผ๋ฆฌ๋ JPA ์ ๋ํฐ ์ฒดํน์ ๋งก๊ธฐ๋ค๋ณด๋ ๋ ๋ค์ N+1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ๋ ํ๊ณ , ์์ํ์ง ๋ชปํ๋ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋๊ธฐ๋ ํ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ ํ๋์ ๋ค์ ํ๋ฒ ๋ ํ๋ ๋ฐฉํฅ์ผ๋ก ์ก์์ต๋๋ค. ์ด์ ๊ดํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ
์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.