[Spring Data] @Transactional ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ณด๋ Spring์ ํธ๋์ญ์ ์ด์ผ๊ธฐ
Spring์ ํ ๋ฒ ์ฏค ์ฌ์ฉํด๋ณด์ จ๋ค๋ฉด Transactional ์ด๋ ธํ ์ด์ ์ ๋ํด ์๊ณ ๊ณ์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌด์์ ์ผ์ ๋ DB๋ ์ฐ๊ฒฐํ๊ณ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ํ ๋ ์ด๊ฑฐ ์ฐ๋ฉด ๋ผ. ๋ผ๊ณ ์๊ฐํ์๋ ๋ถ๋ค์ด ๊ณ์ จ์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ ๋์ ๊ทธ๋ ์ง ์์์ ๋ ์ ์ด๋ฐ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋์ง์ ๋ํด ํ ๋ฒ ์ฏค ๊ถ๊ธ์ฆ์ ๊ฐ์ ธ๋ณด์ ๋ถ๋ค์ด ๊ณ์ ๋ค๋ฉด ์ด ๊ธ์ ์ฐจ๋ถํ ์ฝ์ด ๋ณด์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
Transaction
ํธ๋์ญ์ ์ ๋ํด์๋ ๋ค๋ฅธ ๊ธ์์๋ ์ถฉ๋ถํ ์ธ๊ธ๋์ด ์๋ ๋ด์ฉ์ด์ง๋ง ์ฌ๊ธฐ์ ํ ๋ฒ ๋ ์ค๋ช ์ ๋๋ฆฌ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ ์ด์ผ๊ธฐํ๋ฉฐ DBMS ํน์ ๊ทธ ์ ์ฌํ ์์คํ ์์ ๋ฐ์ํ๋ ์ฐ์ฐ๋ค์ ์ํธ์์ฉ ๋จ์์ ๋๋ค.
์ข ๋ ์ฝ๊ฒ ์ค๋ช ์ ํด๋ณด๋ฉด, ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ํ๋๋ฅผ ์์ํ๊ฑฐ๋ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฌ๋ฌ ์์ ๋ค์ ์ํํ๋๋ฐ, ์ด๋ค์ ์ฑ๊ณตํ ์๋ ์๊ณ , ์คํจํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ด ๊ณ์ข์ ์๋ 40,000์ ์ค Rye๋ผ๋ ์ฌ๋์๊ฒ 30,000์์ ์ก๊ธํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ๊ทธ๋ฌ๋ ๋์ค ๋คํธ์ํฌ ์ฅ์ ๋ก ์ธํ์ฌ ๋ด ๊ณ์ข์ ์์ก์ 10,000์์ด ๋์์ง๋ง Rye๋ผ๋ ์ฌ๋์ 30,000์์ ๋ฐ์ง ๋ชปํ์์ต๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๊น์?
์ฐ๋ฆฌ๋ ์ก๊ธ์ด๋ผ๋ ์ผ๋ จ์ ๊ณผ์ ์ ์๋์ ์์๋ก ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
- ๋ด ๊ณ์ข์ ์๋ 40,000์์์ 30,000์์ ์ฐจ๊ฐํ๋ค.
- Rye ๊ณ์ข์ 30,000์ ์ถ๊ฐํ๋ค.
- ์ก๊ธ์ ์๋ฃํ๋ค.
์ฐ๋ฆฌ๋ ์ด ์ผ๋ จ์ ๊ณผ์ ์ ํ๋์ ํธ๋์ญ์ ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ๋๋ฐ, ์ฌ๊ธฐ์ ๋ง์ฝ ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด ํธ๋์ญ์ ์ ์คํจ๋ก ๋๋๊ฒ ๋์ด ๋ด ๊ณ์ข์ ์๋ ๋ณ๋ ์ฌํญ์ ROLLBACK๋์ด ์ง๋๋ค.
์ ์ฌํญ์ ๋ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
ํธ๋์ญ์ ๋ด ์ฐ์ฐ์ ๋ชจ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๊ทธ ๊ณผ์ ์ค๊ฐ์ ๋ค๋ฅธ ์ฐ์ฐ์ ์ํํ ์ ์๊ณ , ํ๋์ ์ฐ์ฐ์ด๋ผ๋ ์ค๋ฅ๊ฐ ์๊ฒผ๋ค๋ฉด ํด๋น ํธ๋์ญ์ ์ ์ทจ์๋๊ณ ๋ชจ๋ ์๋๋๋ก ๋๋์๊ฐ์ผ ํ๋ค. ๋ฐ๋์ ๋ชจ๋ ์ฐ์ฐ์ด ์ฑ๊ณตํด์ผ๋ง ํธ๋์ญ์ ์ด ์ฑ๊ณต๋๋ค๊ณ ๋ณธ๋ค.
์ด๋ฌํ ํธ๋์ญ์ ์ ์์น์ ์๋์น ์์ ๊ฐ์ด ์ ์ฅ๋๊ฑฐ๋ ์กฐํ๋๋ ๊ฑธ ๋ง์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์น์ ์ ์ ๋ฆฌํ ๊ฒ์ ๋ฐ๋ก ACID๋ผ๊ณ ํฉ๋๋ค.
https://ko.wikipedia.org/wiki/ACID
@Transactional
Transactional ์ด๋ ธํ ์ด์ ์ Spring Framework์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค. ์ด ์ด๋ ธํ ์ด์ ์ ์ํํ๋ ์์ ์ ๋ํด ์ ํธ๋์ญ์ ์์น์ด ์ง์ผ์ง๋๋ก ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ผ๋ก ์ง์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์๊ณ , ์ ์ธ๋ง ํด๋ ์ด ๊ณผ์ ์ด ์ ์ฉ๋์ด์ ์ ์ธ์ ํธ๋์ญ์ ์ด๋ผ๊ณ ๋ ํํํฉ๋๋ค.
์ด๋ฒ์ ์จ๋ผ์ธ ์ปคํผ์์์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ ์๋๋ฆฌ์ค๋ฅผ ์์๋ก ๋ณด๊ฒ ์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ํ๋๋ ์ฃผ๋ฌธ ๋ด์ญ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ด๊ณ , ํ๋๋ ์ฃผ๋ฌธ์ ์์ฑ ๋ฉ์๋์ ๋๋ค. ์ฃผ๋ฌธ์ ์์ฑํ๋ ๋ฉ์๋์ ๊ฒฝ์ฐ ์ฃผ๋ฌธ ๋ด์ญ ์์ฑ ํ ๊ฒฐ์ ๋ฅผ ์งํํ๊ฒ ๋๋๋ฐ, ๋ง์ฝ ๊ฒฐ์ ์งํ ๋ฉ์๋์์ ๊ฒฐ์ ๊ฐ ์คํจํ๋ฉด ์์ฑ๋ ์ฃผ๋ฌธ ๋ด์ญ์ Rollback ๋์ด ์๋ ์ฃผ๋ฌธ์ผ๋ก ์ธ์๋ฉ๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์๋ ๋ชจ์์ด ์์ต๋๋ค.
@Transactional์ ๊ธฐ๋ณธ์ ์ผ๋ก UnChecked Exception, Error๋ง์ ๋กค๋ฐฑํ๋ค.
์ฌ๊ธฐ์ UnChecked Exception์ด๋, ์๊ธฐ์น ๋ชปํ ์ค๋ฅ๋ฅผ ๋งํฉ๋๋ค. ์๊ธฐ์น ๋ชปํ ์ค๋ฅ๋, ๊ฐ๋ฐ์๊ฐ ์ ์ํ ์ค๋ฅ๊ฐ ์๋ ํ๋ ์์ํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๋ฐ์๋๋ ์ค๋ฅ๋ฅผ ๋งํ๋๋ฐ, ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ฒดํฌ ์นด๋๋ก ๊ฒฐ์ ํ์ ๋ ์์ก์ด ๋ถ์กฑํด์ ์๊ธด ๊ฒฐ์ ์คํจ๋ผ๋์ง, ์นด๋ ์ ์ง, ์นด๋ ์ ํจ๊ธฐ๊ฐ ์ด์ ๋ฑ์ผ๋ก ๋ฐ์ํ ์ ์๋ ์ค๋ฅ์ ๋ํด์๋ ๋กค๋ฐฑํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฐ ๊ฒฝ์ฐ๋ Transactional ์ด๋ ธํ ์ด์ ์์ rollbackedFor ํ๋ผ๋ฏธํฐ๋ก ๋กค๋ฐฑํ Exception ํด๋์ค๋ฅผ ์ ์ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฒ์ ์ฃผ๋ฌธ ๋ด์ญ์ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ๋จ์ํ ์ฝ๋๋ฅผ ๋ดค์ ๋๋ Transactional์ด ํ์์์ ์ ๋์ธ๋ฐ, ์ ์ฌ๊ธฐ์ Transactional์ด ํ์ํ ๊น์?
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ค, ๋ค๋ฅธ ๋ฉ์๋๋ ํจ์์์ ํด๋น ๊ฐ์ ์ ๊ทผํ์ ๋ ์๋ชป๋ ๊ฐ์ ๊ฐ์ ธ์ค์ง ์๋๋ก ํจ.
- ๋ง์ฝ ํด๋น ๋ฉ์๋์์ ์์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ์ฌ ๋ค๋ฅธ ๋ฉ์๋๋ ํจ์์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ํ์๋ฅผ ํ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ, ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์(commit)๋์ง ์๋๋ก ํจ.
์ด ๋ถ๋ถ์ ACID ์ค ์์์ฑ์ ํด๋นํฉ๋๋ค. ์ด๋ค ์์ ์ด ์์ ํ๊ฒ ์ฑ๊ณต, ํน์ ์คํจ๋ก๋ง ๋์ด์ผ ํ๋ฉฐ ์ค๊ฐ์ ์ฑ๊ณตํ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ๋ ์ต์ข ๋ถ๋ถ๊น์ง ์์ ๋ ์ฑ๊ณตํ์ง ๋ชปํ๋ค๋ฉด ๊ทธ ์์ ์ ์คํจ๋ก ๋๋๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
@Transactional์ ์๋ ์๋ฆฌ
๊ทธ๋ฌ๋ฉด ๋๋์ฒด ์ด Transactional์ ์ด๋ค์์ผ๋ก ๋์ํ๋ ๊ฑธ๊น์? ์๋ง JPA๋ฅผ ๊ณต๋ถํด๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด ์ด ์ด๋ ธํ ์ด์ ์ด ๋ง๋ฅ JPA์์๋ง ๋์ํ๋ ์ด๋ ธํ ์ด์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋ณธ๋ Transactional ์ด๋ ธํ ์ด์ ์ Spring Framework์์ ์ง์ํ๋ AOP ๋ฐฉ์์ ์ด๋ ธํ ์ด์ ์ด๋ฉฐ JPA ๋ฟ๋ง ์๋๋ผ Spring Data๋ก ๊ตฌํ๋ R2DBC, JDBC์์๋ ๋ชจ๋ ์ ์ฉ๋๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
(๋ ์ค์ํ ๊ฒ์ JPA๋ JDBC๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค)
AOP์ ๋ํด์ ์์ธํ ์์๋ณด์๋ ค๋ฉด, ์๋์ ๊ธ์ ์ฐธ๊ณ ํด๋ณด์ธ์.
์ฐ๋ฆฌ๋ Transactional์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ค์ ๋ก Java์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ป๊ฒ ์์ํ๋์ง์ ๋ํด ์์๋ณผ ๊ฒ์ ๋๋ค.
์ ์ฝ๋๋ ์ค์ Java์์ JDBC๋ฅผ ์ด์ฉํด DataSource(DB์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ด๋ ์ธํฐํ์ด์ค)์ ์ด๋ฅผ ํตํด ์ฐ๊ฒฐ ๊ฐ์ฒด์ธ Connection์ ์ด์ฉํด์ DB์ ํธ๋์ญ์ ์ ์ํํ๋ ๋ชจ์ต์ ๋๋ค.
์ค์ ๋ก Transactional ์ด๋ ธํ ์ด์ ์ ์ ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ง์ด๋ฉฐ Transactional์์ ๊ธฐ๋ณธ Exception์ ์์์ ๋งํ๊ฒ์ฒ๋ผ UnChecked Exception์ด ๊ธฐ๋ณธ๊ฐ์ธ ํํ๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ฝ๋๋ฅผ ๋ด๊ฐ ๋ง๋ ๋ฉ์๋์ ์ฝ์ ํ๊ฒ ๋๋๋ฐ, JVM์์ ์ด๋ ๊ฒ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๊ณ , ์คํ๋ง์์๋ ํ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ถ๋ถ์ ์ฐจํ ๋ค๋ฅธ ๊ธ์์ ๊น๊ฒ ๋ค๋ค ๋ณผ ๊ฒ์ ๋๋ค.
๊ฐ๋จํ๊ฒ๋ Transactional์ด ์์ ๊ฐ์ด ๋์ํ๊ณ , JPA์์๋ JPA๊ฐ ๊ฐ์ง๊ณ ์๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด ๋์ํฉ๋๋ค.
JPA์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด Entity ๊ฐ์ฒด๋ฅผ ์์ํ๋ ์ญํ ์ ๋ด๋นํ๊ณ ๊ทธ๋ค์ ํธ๋์ญ์ ์ Transactional ์ด๋ ธํ ์ด์ ์ด ์งํํ๋ ๊ฑธ๋ก ๋ณด๋ฉด ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์์ง์ด๊ธฐ ๋๋ฌธ์ @Transactional์ ์จ๋ ๋ณธ๋ ํธ๋์ญ์ ์ ์์น์ ์ ํํ ์งํฌ ์ ์์ต๋๋ค.
Spring์์๋ ๊ฐ์ ํธ๋์ญ์ ๋ด์์ ์ฌ๋ฌ๊ฐ์ EntityManager ์ธ์คํด์ค๋ฅผ ์์ฑํด๋ ํ๋์ EntityManager๋ก ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ ์์ ๊ฒฝ์ฐ ์์์ฑ ์ปจํ ์คํธ 1๊ฐ๋ง์ ์ฌ์ฉํฉ๋๋ค. ์ด ์ด์ผ๊ธฐ๋ ์ฐจํ propagation์ ๋ค๋ฃจ๋ฉด์ ์์ธํ ์ด์ผ๊ธฐ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@Transactional ์ต์
๋ง์ง๋ง์ผ๋ก Transactional ์ด๋ ธํ ์ด์ ์ ์ต์ ์ ๋ํด ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- isolation
ํธ๋์ญ์ ์์ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ ํ์ฉ ์์ค์ ์ค์ ํ๋ ๊ฐ์ผ๋ก JDBC์ isolation์ผ๋ก ๋์ํฉ๋๋ค. - propagation
ํธ๋์ญ์ ์ํ ์ค ๋ค๋ฅธ ํธ๋์ญ์ ์ํ์ ๋ผ์น๋ ์ํฅ์ ์ค์ ํ๋ ๊ฐ์ ๋๋ค. - noRollbackFor
ํน์ ์์ธ๊ฐ ๋ฐ์ํ๋ ํด๋์ค์ ๋ํด์๋ rollback์ ์ํํ์ง ์๋ ์ต์ ์ ๋๋ค. - rollbackFor
ํน์ ์์ธ๊ฐ ๋ฐ์ํ๋ ํด๋์ค์ ๋ํด rollback์ ์ํํ๋ ์ต์ ์ ๋๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก UnChecked๋ฅผ ํฌํจํฉ๋๋ค.) - timeout
์ง์ ํ ์๊ฐ ๋ด ๋ฉ์๋ ์ํ์ด ์๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ, rollback ํ๋ ์ต์ ์ ๋๋ค. (-1์ธ ๊ฒฝ์ฐ ๋ฌด์ ํ, ๊ธฐ๋ณธ๊ฐ) - readOnly
ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. (DML ์ฐ์ฐ์ด ์ํ๋๋ ๊ฒฝ์ฐ ์์ธ ๋ฐ์)
๋ง์น๋ฉฐ...
์ต๊ทผ์ Spring Data JDBC๋ฅผ ๋ค๋ฃจ๊ณ ๋์ Spring์ ์๋ Transactional ์ด๋ ธํ ์ด์ ์ด ๋จ์ํ JPA๋ง์ ์ํ ๊ฒ ์๋๋ผ๋ ๊ฒ์ ์์๊ณ , ์์ฑํ๊ณ ๋ ๋ค์์์ผ Spring์ ์ญ์ Framework ๋ผ๋ ๊ฑธ ๋ค์ ํ ๋ฒ ๋ผ์ ๋ฆฌ๊ฒ ๋๊ปด์ก์ต๋๋ค.
๋ณธ๋ ์ฐ๋ฆฌ๊ฐ Transactional ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ฅผ ๋ง๋ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ๋ ค๋ฉด ์ปค๋ฅ์ ์ ๋ง๋ค๊ณ , ์์ํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋์คํ ํ๊ฑฐ๋, Set์ผ๋ก ๋ฌถ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ก ๋ณด๋ด์ผ ํฉ๋๋ค. ๊ทธ ๋ฟ๋ง ์๋๋ผ ํธ๋์ญ์ ์ด ๋ฐ์ํ๋ ์ผ๋ จ์ ๊ณผ์ (begin ~ commit)์ ์ง์ ์ฝ๋์ ๋ด์์ ๊ตฌํํด์ผ ๋น๋ก์ DB ์๋ฒ์ ์ฐ๊ฒฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ด ์ธ์๋ Spring์์ Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Spring Configuration์ @EnableTransactionManagement ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ์ฌ TransactionManager ์ธํฐํ์ด์ค์ DB ์ฐ๊ฒฐ ์ ๋ณด ๊ฐ์ฒด์ธ DataSource๋ฅผ ์ฃผ์ ํ๋ ๋ฑ์ ์์ ์ ๊ฑฐ์ณ์ผ ํ์ง๋ง Spring boot์์ ์ด๋ฌํ ์ค์ ๋ค์ ๋ชจ๋ ํ ํ๋ฆฟ์ฒ๋ผ ์ ๋ง๋ค์ด๋จ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ Spring boot๋ฅผ ์ธ ๋ ๋งํผ์ ์ต๋ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋ค๋ ๊ฒ์ ์์๋์ ์ผ ํ ๊ฒ์ ๋๋ค.