AOP 1
์๋ฐ, ์คํ๋ง ๊ฐ๋ฐ์๋ค์ ์ข ์ฐฉ์ญ์ด์, ์ฃผ๊ธฐ์ ์ผ๋ก ๋ค์ ๋์์ค๋ ๊ทธ๊ณณ, <ํ ๋น์ ์คํ๋ง 3.1>์ ๋๋์ด ์ฝ๋๋ค.
ํ์ฐฝ ๊ฐ๋ฐ ๊ฑธ์๋ง๋ฅผ ๋ง ๋ผ๊ณ ์คํ๋ง์ผ๋ก ์์ฅ์์ฅ ๊ธฐ์ด๋ค๋๋ฉฐ CRUD๋ฅผ ํ ๋์ฆ์, ํ ๋น์ ์คํ๋ง์ ์ฐฌ์ํ๊ณ ์๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ ๋ณด์๊ณ , ์ญ์ ์ง์์ด ๊น์ด์ง๋ ค๋ฉด, ์ฑ ์ ํตํด์ ์ง์์ ์ ๋ฆฌํ๊ณ ๊น์ด๋ฅผ ๋ค์ง๋ ์๊ฐ์ด ํ์ํ๊ฒ ๊ตฌ๋, ์๊ฐํ๋ค. ํ์ง๋ง, ๊ฐ๋ฐ์ ์ด์ ๋ง ๋ฐฐ์ด ๊ทธ๋์ ๋์๊ฒ ํ ๋น ์ฑ ์ ๋๋ฌด๋๋ ๋ฌด์๋ฌด์ํ๊ณ , ํ ๋น์ฑ ์ ์ฝ๋ค๊ฐ ๊ฐ๋ฐ์ ํฌ๊ธฐํ ์ฌ๋๋ค์ ์ฆ์ธ๋ ์ฌ๋ฟ ์ฝ๊ณ ๋๋, ์ด ์ฑ ์ ๊ฐ๋ฐ์๋ก์ ๋ ๋ฒ ๋ฃจ์ ์ด ํ์ํ ๋์ฆ์, ๋ค์ ๊บผ๋ด๋ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๊ธ์ด๋ค. ํด์ฌ ํ, ์ด์ง์ ์ค๋นํ๋ ๋์, ์ง์์ ๊น์ด๋ฅผ ์ข ๋ ๋ค์ ธ๋๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ์ง์ ๋์๊ด์์ (์๋ฌด๋ ๋น๋ ค๊ฐ์ง ์๋) ํ ๋น๋์ ์ฑ ์ ๋น๋ ค์ ์ฝ๊ธฐ ์์ํ๋ค. ์ฒ์์๋ ๊ฐ๋ณ๊ฒ ์ฝ๊ธฐ ์์ํ์ง๋ง, ์ฝ์ ์๋ก ์ธ์ฌ์ดํธ๊ฐ ์์ฌ, ๊ธฐ๋กํ๋ฉด์ ์ ๋๋ก ์ฝ๊ณ ์ถ์ด์ก๋ค. ๊ทธ๋์ ๋์ ์ธ์ปจ ๋ธ๋ ์ธ์ธ ์ด๊ณณ ๋ธ๋ก๊ทธ์ ์งง์ ๊ธ๋ค๋ก ๊ทธ ๋ด์ฉ์ ์ ์ด๋ณด๋ฉฐ, ํ ๋น๋์ผ๋ก๋ถํฐ ์ป์ ์ธ์ฌ์ดํธ๋ฅผ ๋ด๊ฒ์ผ๋ก ๋ง๋ค์ด๋ณด๊ณ ์ ํ๋ค.
์ง๊ธ๊น์ง
์๋น์ค ์ถ์ํ ๊ธฐ๋ฒ์ ํตํด์ ํธ๋์ญ์ ๊ธฐ์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์
ํ์ง๋ง, ํธ๋์ญ์ ๊ฒฝ๊ณ ์ค์ ์ ์ํด UserService ๋ด๋ถ์ ๋น์ฆ๋์ค ๋ก์ง๋ณด๋ค ํธ๋์ญ์ ์ ์ํ ์ฝ๋๊ฐ ๋ ๋ง์ ๋ฒ์๋ฅผ ์ฐจ์งํ๋ ๊ฒ, ํธ๋์ญ์ ์ฝ๋์ ๋น์ฆ๋์ค ๋ก์ง์ด ์์ด๊ฒ ๋๋ ๊ฒ์ด ๋ถ๋ง์กฑ์ค๋ฝ๋ค.
์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์๊น?
UserService ์ ์์๋ถํฐ ๋๊น์ง ํธ๋์ญ์ ๋ฒ์๊ฐ ์ค์ ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ทธ๊ณณ์ ์กด์ฌํ๋ ๊ฒ์ ๋ถ๊ฐํผํด๋ณด์.
๊ทธ๋ผ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์ ์์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ๋ง์ด๋ผ๋ ํ ์๋ ์์๊น?
ํ์ฌ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
Client : UserServiceTest โ UserService
๋ฌธ์ ์ : ์ง์ ์ ์ผ๋ก ํด๋์ค์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐํ ๊ฒฐํฉ์ํ์ด๋ค.
๋ฐ๊พผ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ฐ๊ฟ๋ณผ ์ ์์ง ์๋?
๋ฐ๊พธ๋ ค๋ ์ต์ข ๊ตฌ์กฐ
UserServiceTest - client
UserService - interface
UserServiceImpl - business logic
UserServiceTx - transaction
์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ๋ณด๊ธฐ์๋ ๋น์ฆ๋์ค ๋ก์ง ๋ฟ์ธ ์ฝ๋์ ํธ๋์ญ์ ์ด ์ ์ฉ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๊ฒ์ด๋ค.
1์ฐจ ๊ฐ์
UserService
interface ํ ํ๋ค.
UserServiceImpl
mail, upgradeLevels() ์ ์ธํ๊ณ ๋น์ฆ๋์ค ๋ก์ง ์ด์ธ์ ํธ๋์ญ์ ์ฝ๋๋ ๋ชจ๋ ์ ๊ฑฐํ๋ค.
UserServiceTx
ํธ๋์ญ์ ์๋ง ์ง์คํ๋ฏ๋ก, add(), upgradeLevels() ์์๋ DI ๋ฐ์ ๋ค๋ฅธ UserService ๊ตฌํ์ฒด์ ๋งค์๋๋ฅผ ํธ์ถํด์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ด์ฌํ์ง ์๋๋ค.
upgradeLevels() ์ transaction ๊ด๋ จ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ ํธ๋์ญ์ ์ฝ๋ ์ฌ์ด์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๋ ๋ถ๋ถ์ DI ๋ฐ์ ๋ค๋ฅธ UserService ๊ตฌํ์ฒด๋ฅผ ํธ์ถํ๋ค.
์ค์ ์ ๋ณด ๋ณ๊ฒฝํ๊ธฐ
์ด ๊ตฌ์กฐ๋ก ๊ฐ์ ํ๊ฒ ๋๋ฉด ์ต์ข ์์กด๊ด๊ณ๋ ์๋์ ๊ฐ๋ค.
client : UserServiceTest โ UserServiceTx โ UserServiceImpl
๋ฐ๋ผ์ ์ค์ ํ์ผ๋ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ
bean : userServiceTx โ transactionManager, userServiceImpl
bean : userServiceImpl โ userdao, mailSender
ํ ์คํธ ๋ณ๊ฒฝํ๊ธฐ
userService ๋ฅผ ์ง์ ์์ฑํ ์ฃผ์ ํ๋ ๋ฐฉ์ โ DI ํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
@AutoWired ์ ๊ฒฝ์ฐ, ๊ฐ์ฅ ๋จผ์ ์ผ์นํ๋ ํ์ ์ ํด๋์ค๋ฅผ ๊ฒ์ฌํ๊ณ , ์๋ค๋ฉด, bean ์ค์ ์์ ์ด๋ฆ์ด ๊ฐ์ ํด๋์ค๋ฅผ ๋งคํํด์ค๋ค. ์ด ๊ฒฝ์ฐ, userService ๋ ์ธํฐํ์ด์คํ ๋์ด ํด๋์ค๊ฐ ์ฌ๋ผ์ก์ผ๋, userService ๋ผ๋ ๋น ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ userServiceTx ๊ฐ ๋งคํ๋ ๊ฒ์ด๋ค.
1์ฐจ ๊ฐ์ ์ผ๋ก ์ธํ ์ฅ์
๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ userServiceImpl ์์ ํธ๋์ญ์ ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ธ ๋ด์ฉ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ๋ํ ํ ์คํธ๊ฐ ํจ์ฌ ์ฌ์์ก๋ค.
๊ณ ๋ฆฝ๋ ๋จ์ํ
์คํธ์ ํ์์ฑ
ํ ์คํธ ๋จ์๋ ์์์๋ก ์ข๋ค. ํ๋์ ํ ์คํธ์์๋ ํ๋์ ๊ธฐ๋ฅ๋ง์ ์ฒดํฌํ ์ ์๋๋ก ํด์ผํ๋ค.
๊ตฌ์กฐ๊ฐ ์๋ง์ด๋ผ๋ฉด ํ๋์ ๊ธฐ๋ฅ์ ํ ์คํธ ํ๊ธฐ ์ํด, ์์ญ๊ฐ์ ์์กด์ฑ๊ณผ ์ํฅ๋๋ฅผ ํ์ธํด์ผํ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด, UserService ์ ๋ ๋ฒจ์ ๊ธฐ๋ฅ์ธ upgradeLevels() ๋ฅผ ํ ์คํธ ํ๊ธฐ ์ํด์ UserDao, UserDaoJdbc, DataSource, DB, TransactionManager, JavaMailSenderImpl, JavaMail, MailServer ๊น์ง ๋ชจ๋ ๋ถ๋ถ์ด ์๋ฒฝํ๊ฒ ์ธํ ๋์ด์์ด์ผ ํ๋ค.
์ค๋ธ์ ํธ ๊ฐ ์์กด๋๋ฅผ ๋ฎ์ถ๊ณ ๊ณ ๋ฆฝ๋ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋์์์ด ๊ฐ์ ํด์ผํ๋ค.
๊ฐ์ ํ UserServiceTest ์ upgradeLevels()
getAll()์์๋ ๋ฏธ๋ฆฌ ์ค๋น๋ ์ฌ์ฉ์๋ค์ ๋ชฉ๋ก์ธ ์คํ ์ด ํ์ํ๊ณ update() ์์๋ ๋ชฉ ์ค๋ธ์ ํธ๋ก์ ๋์ํ๋ ํ ์คํธ ๋์ญ์ด ํ์ํ๋ค. โ MockUserDao ๋ฅผ ๋ด๋ถ ์คํํฑ ํด๋์ค๋ก ์์ฑํด๋ณด์. (UserDaoImpl)
์ด๋ ๊ฒ ๋๋ฉด UserServiceTest ๋ ์ธ๋ถ UserDao ๋ MailSender ์ ๊ฐ์ ์ธ๋ถ ๋น์ ์์กดํ ํ์๊ฐ ์์ผ๋ฏ๋ก, @AutoWired ๋ก ์ธํด ์ฃผ์ ๋ฐ๋ ๊ฒ์ด ์๋, ๋ด๋ถ์์ UserServiceImpl์ ์ง์ ์์ฑ ํด์ค์ผ๋ก์จ ํ ์คํธ๋ฅผ ์งํํ ์ ์๋ค. MockUserDao ์ญ์ ์ง์ DI ํด์ค๋ค.
์ฅ์
์ด์ DAO ๋ ์ธ๋ถ ๋ก์ง์ ์์กดํ์ง ์์ UserService ๋ง์ ๋น์ฆ๋์ค ๋ก์ง๋ง ํจ์จ์ ์ผ๋ก ํ ์คํธํ ์ ์๊ฒ ๋์๋ค.
๋๊ตฐ๋ค๋ ํ ์คํธ ์๊ฐ๋ DB ๋ฅผ ๊ฐ๋ค๊ฐ ์ค๋ ์๊ฐ์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์ด์ ๊ณผ ๋น๊ตํ๋ฉด 500๋ฐฐ์ด์ ๋นจ๋ผ์ง ๊ฒ์ ์ ์ ์๋ค. ํ ์คํธ ๊ฐ์๊ฐ ๋์ด๋ ์๋ก, ์ดํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ๊ทธ ํจ๊ณผ๋ ์์ฒญ๋๋ค.
๋จ์ํ
์คํธ์ ํตํฉํ
์คํธ
๋จ์ํ ์คํธ์ ๋ฒ์๋ ์ ํ๊ธฐ ๋๋ฆ์ด์ง๋ง, ๋ณดํต์ ๊ฒฝ์ฐ ํ ์คํธ ๋์ ํด๋์ค๋ฅผ ๋ชฉ ์ค๋ธ์ ํธ ๋ฑ์ ํ ์คํธ ๋์ญ์ ์ด์ฉํด ์์กด ์ค๋ธ์ ํธ๋ ์ธ๋ถ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ๊ณ ๋ฆฝ์์ผ์ ํ ์คํธ ํ๋ ๊ฒ์ ๋งํ๋ค.
ํตํฉํ ์คํธ์ ๊ฒฝ์ฐ, ๋ ๊ฐ ์ด์์, ์ฑ๊ฒฉ์ด๋ ๊ณ์ธต์ด ๋ค๋ฅธ ์ค๋ธ์ ํธ๊ฐ ์ฐ๋ํ๋๋ก ๋ง๋ค์ด ํ ์คํธํ๊ฑฐ๋, ์ธ๋ถ์ DB๋ ํ์ผ, ์๋น์ค ๋ฑ์ ๋ฆฌ์์ค๊ฐ ์ฐธ์ฌํ๋ ํ ์คํธ๋ฅผ ๋งํ๋ค.
๋ ๊ฐ ์ด์์ ๋จ์๊ฐ ๊ฒฐํฉํด์ ๋์ํ๋ฉด์ ํ ์คํธ๊ฐ ์ํ๋๋ ๊ฒ
๊ฐ์ด๋๋ผ์ธ
๋จ์ํ ์คํธ๋ฅผ ๋จผ์ ๊ณ ๋ คํ๋ค.
ํ๋์ ํด๋์ค๋ ์ฑ๊ฒฉ๊ณผ ๋ชฉ์ ์ด ๊ฐ์ ๊ธด๋ฐํ ํด๋์ค๋ฅผ ๋ช ๊ฐ ๋ชจ์์, ์ธ๋ถ์์ ์์กด๊ณผ๋๊ณ๋ฅผ ๋ชจ๋ ์ฐจ๋จํ๊ณ ํ์์ ๋ฐ๋ผ ์คํ ์ด๋ ๋ชฉ ์ค๋ธ์ ํธ ๋ฑ์ ํ ์คํธ ๋์ญ์ ์ด์ฉํ๋๋ก ํ ์คํธ๋ฅผ ๋ง๋ ๋ค.
์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผ๋ง ๊ฐ๋ฅํ ํ ์คํธ๋ง ํตํฉํ ์คํธ๋ก ๋ง๋ ๋ค.
DAO ์ ๊ฐ์ด DB ์ ์์กด์ ์ด๊ณ ๋ก์ง์ด ์๋ ์ฝ๋์ ๊ฒฝ์ฐ๋ ํตํฉํ ์คํธ๋ก ๋ง๋๋ ๊ฒ์ด ๋ซ๋ค. ์ด ํ ์คํธ๋ฅผ ์ ์์ฑํด๋์ด์ผ, ๋์ค์ DAO ๊ฐ ์ฐ์ด๋ ๋ค๋ฅธ ๊ณณ์์๋ ๋ชฉ์ค๋ธ์ ํธ๋ฅผ ํตํด DAO ์ญํ ์ ๋์ฒดํ ์ ์๋ค. DAO ์์๋ ์ ๋์ํ๋ฆฌ๋ผ๋ ๋ฏฟ์์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋จ์ํ ์คํธ๋ฅผ ๋ชจ๋ ํต๊ณผํ๋ค๊ณ ํด์, ์๋ก ์ฐ๊ด๋ ์ฝ๋๋ค์ด ๋ฐ๋์ ์ ๋์ํ๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์๋ค. ๊ทธ๋์ ์ฌ๋ฌ๊ฐ์ ๋จ์๊ฐ ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ๋์ํ ๋๋ฅผ ์ํ ํตํฉํ ์คํธ๋ ๋ฐ๋์ ํ์ํ๋ค. ํ์ง๋ง ์ด ํตํฉํ ์คํธ ๋ง์ ๋จ์ํ ์คํธ๊ฐ ์ถฉ๋ถํ ์ ์ด๋ฃจ์ด์ก๋ค๋ฉด, ์์ฑํ๊ธฐ๊ฐ ํจ์ฌ ์์ํ๋ค.
์คํ๋ง ํ ์คํธ ์ปจํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ๋ ํ ์คํธ ์ญ์ ํตํฉํ ์คํธ์ด๋ค. ๊ฐ๋ฅํ๋ฉด ์คํ๋ง์ ์ง์์์ด ์ง์ ์ฝ๋ ๋ ๋ฒจ์ DI ๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋จ์ํ ์คํธ ํ๋ ๊ฒ์ด ์ข๋ค. ํ์ง๋ง ์คํ๋ง ์ค์ ์์ฒด๋ ํ ์คํธ ๋์์ด๊ณ ๋ณด๋ค ์ถ์์ ์ธ ๋ ๋ฒจ์์ ํ ์คํธ ํด์ผํ ๊ฒฝ์ฐ๋ ์๋ค.
ํ ์คํธ ์ ์์ฑํ๋ฉด ์ฝ๋ ํ์ง์ ์์ฐ์ค๋ฝ๊ฒ ๋์์ง๋ค. ์ฝ๋๋ฅผ ์์ฑํ ๋, ์ด๋ป๊ฒ ํ ์คํธํ ์ ์์๊น ๊ณ ๋ฏผํ๋ ์ต๊ด์ ๋ค์ด๋๋ก ํ์.
๋ชฉ ํ๋ ์์ํฌ
๋จ์ํ ์คํธ๊ฐ ์ค์ํ๊ฑด ์์ง๋ง, ์์ฑํ๊ธฐ๊ฐ ๋๋ฌด ๊ท์ฐฎ๋ค. ์ค๋น๊ณผ์ ์ด ๋๋ฌด ๊ธธ๊ณ ๊ณ ๋จํ๋ค. ํด์ค์ผํ ๊ฒ์ด ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋คํํ๋ ๋ชฉ ์ค๋ธ์ ํธ๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑํ๋๋ก ๋์์ฃผ๋ ๋ค์ํ ๋ชฉ ์ค๋ธ์ ํธ ์ง์ ํ๋ ์์ํฌ๊ฐ ์กด์ฌํ๋ค!
Mockito ํ๋ ์์ํฌ - ์ฌ์ฉํ๊ธฐ ํธํจ
ํ๋ก์์ ํ๊ฒ
ํ์ฌ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
client : UserServiceTest โ ํต์ฌ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ฐฉ๊ฐํ๋ฉฐ UserService์ ๊ตฌํ์ฒด ํธ์ถ
UserServiceTx ๋ UserService๋ฅผ ๊ตฌํํ ์ํ, ํธ๋์ญ์ ์ฝ๋ ์ดํ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ํด ๋ ๋ค๋ฅธ UserService ๊ตฌํ์ฒด์ธ UserServiceImpl ํธ์ถ
UserServiceImpl ๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง ์คํ
์ฆ,
ํด๋ผ๋ฆฌ์ธํธ โ (ํต์ฌ๊ธฐ๋ฅ ์ธํฐํ์ด์ค + ๋ถ๊ฐ๊ธฐ๋ฅ) ํ๋ก์ โ (ํต์ฌ๊ธฐ๋ฅ ์ธํฐํ์ด์ค + ํต์ฌ๊ธฐ๋ฅ) ํ๊น
์ ํํ๋ก ์์ฒญ์ด ์ ๋ฌ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ๋ง์น ์์ ์ด ํ๊น์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๊ณ ์ฐฉ๊ฐํ๊ณ , ํ๋ก์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ต์ข ์ ์ผ๋ก ํ๊น์๊ฒ ๊ทธ ์์ฒญ์ ์์ํ๋ค. ํ๊น์ ์์๋ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.ํ๋ก์๋ ๋ ๊ฐ์ง๋ก ๊ทธ ๋ชฉ์ ์ ๋ฐ๋ผ ๊ตฌ๋ถ๋๋ค.
์ฒซ์งธ, ํด๋ผ์ด์ธํธ๊ฐ ํ๊น์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํ๊ธฐ ์ํด์ โ ํ๋ก์ ํจํด
๋์จฐ, ํ๊น์๊ฒ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๊ธฐ ์ํด์ โ ๋ฐ์ฝ๋ ์ดํฐ ํจํด
๋ฐ์ฝ๋ ์ดํฐ ํจํด
๋ชฉ์ : ํ๊น์๊ฒ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ฐํ์์์ ๋ค์ด๋๋ฏนํ๊ฒ ๋ถ์ฌํด์ฃผ๊ธฐ ์ํด์ ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ํจํด
์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ฐ์ด ์ฐ์ผ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ ์
ํด๋ผ๋ฆฌ์ธํธ โ ๋ผ์ธ๋๋ฒ ๋ฐ์ฝ๋ ์ดํฐ โ ์ปฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ โ ํ์ด์ง ๋ฐ์ฝ๋ ์ดํฐ โ ํ๊น : ์์ค์ฝ๋ ์ถ๋ ฅ ๊ธฐ๋ฅ
์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ํ๊น์ด ์ด๋ค ๋ฐ์ฝ๋ ์ดํฐ๋ก๋ถํฐ ์ฐ๊ฒฐ๋๋์ง ์ ์ ์๋ค. ๋ฐํ์์์ ํด๋ผ์ด์ธํธ๋ฅผ ํตํด์ ๋ค์ด๋๋ฏนํ๊ฒ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ก์ ํจํด
๋ชฉ์ : ํ๊น์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ์ถ๊ฐํ์ง ์์ผ๋ฉด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํด์ฃผ๋ ํ๋ก์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฝ๋์์ ์์ ์ด ๋ง๋ค๊ฑฐ๋ ์ ๊ทผํ ํ๊น ํด๋์ค ์ ๋ณด๋ฅผ ์๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ ๊ฐ์ ํจํด์ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
JDK์ ๋ค์ด๋ด๋ฏน ํ๋ก์
๊ฐ๋ฐ์๋ค์ ํ๋ก์์ ์ฅ์ ์๋ ๋ถ๊ตฌํ๊ณ ํ๋ก์๋ฅผ ์์ฑํ๊ธฐ์ ๊ท์ฐฎ์ํ๋ค.
ํ๋ก์ ์์ฑ์ ๋ฌธ์ ์
๋ถ๊ฐ ๊ธฐ๋ฅ์ด ํ์์๋ ๋งค์๋๋ ์ผ์ผํ ๊ตฌํํด์ ํ๊น์ผ๋ก ์์ํ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
์) UserService ์ add()
๋ํ ์ธํฐํ์ด์ค์ ๋ฉ์๋์ ์ถ๊ฐ๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ง๋ค ํจ๊ป ์์ ํด์ฃผ์ด์ผ ํ๋ค.
ํ๋ก์ ๋ด๋ถ์์ ์ค๋ณต์ฝ๋๊ฐ ๋ง์์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์) transaction ์ ํ์๋กํ๋ ๋งค์๋๊ฐ upgradeLevels() ์ด์ธ์, add(), delete() ๋ฑ๋ฑ ๋ง์์ง ๊ฒฝ์ฐ, ๋งค๋ฒ transaction ์ฝ๋๋ก ๊ฐ์ธ๊ณ ๊ทธ ๋ด๋ถ์์ ์์ฒญ์ ์์ํ๋ ์ฝ๋๋ฅผ ์ง์ผํ๋ค. ๊ฐ์ ๊ตฌ์กฐ์ ์ฝ๋๊ฐ ๋ฐ๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ : JDK ๋ค์ด๋ด๋ฏน ํ๋ก์
JDK ๋ค์ด๋ด๋ฏน ํ๋ก์๋ ๋ฆฌํ๋ ์ ๊ธฐ๋ฅ์ ์ด์ฉํด์ ํ๋ก์๋ฅผ ๋ง๋ค์ด์ค๋ค.
HelloUppercase ์์ ๋ฅผ ํตํ ๋ค์ด๋ด๋ฏน ํ๋ก์ ๋์๊ณผ์ ํ์ธ
์ง์ ๋ค์ด๋ด๋ฏน ํ๋ก์๋ฅผ ๊ตฌํํ์ ๋
์ธํฐํ์ด์ค์ ๋ชจ๋ ๋งค์๋๋ฅผ ๊ตฌํํด ์์ํ๋๋ก ์ฝ๋๋ฅผ ๋ง๋ค์ด์ผ ํ๊ณ
๋ถ๊ฐ๊ธฐ๋ฅ์ธ ๋ฆฌํด๊ฐ์ ๋๋ฌธ์๋ก ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ด ๋ชจ๋ ๋ฉ์๋์ ์ค๋ณต๋์ด ๋ํ๋๋ค.
๋ค์ด๋ด๋ฏน ํ๋ก์๋ฅผ ์ ์ฉํ์ ๋
๋์๋ฐฉ์
ํด๋ผ์ด์ธํธ โ ํ๋ก์ ํฉํ ๋ฆฌ์๊ฒ ํ๋ก์๋ฅผ ์์ฒญํ๊ณ , ๋ค์ด๋ด๋ฏน ํ๋ก์์ ๋งค์๋๋ฅผ ํธ์ถํ๋ค.
๋ค์ด๋ด๋ฏน ํ๋ก์๋ InvocationHandler ๋ฅผ ํตํด ๋งค์๋ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ค.
InvocationHandler ์์๋ ์์ฒญ์ ํ๊น์๊ฒ ์์ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ด๋ด๋ฏน ํ๋ก์์๊ฒ ์ ๋ฌํ๋ค.
๋ค์ด๋ด๋ฏน ํ๋ก์๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฆฌํด๊ฐ์ ๋ฐํํ๋ค.
๋ค์ด๋ด๋ฏน ํ๋ก์์ sayHello(), sayHi(), sayThankYou() โ InvocationHandler ์ invoke(Method) โHelloTarget์ sayHello(), sayHi(), sayThankYou()
๋ค์ด๋ด๋ฏน ํ๋ก์ ์ฅ์
Hello ์ธํฐํ์ด์ค์ ๋ฉ์๋๊ฐ ์์ฒญ๋๊ฒ ๋์ด๋ฌ์ ๋, ๋งค๋ฒ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ง ์์๋ ๋๋ค.
์) 3๊ฐ์์ 30๊ฐ๊ฐ ๋๋ค๋ฉดโฆ? ๋งค๋ฒ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค. ๋ค์ด๋ด๋ฏน ํ๋ก์๊ฐ ๋ง๋ค์ด์ง ๋, ์ถ๊ฐ๋ ๋ฉ์๋๊ฐ ์๋์ผ๋ก ํฌํจ๋๊ณ , ๋ถ๊ฐ๊ธฐ๋ฅ์ invoke() ๋ฉ์๋์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌํดํ์ ์ด ๋ค์ํ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํ ๊น?
๋ฆฌํดํ์ ์ ํ์ธํด์ ์คํธ๋ง์ธ ๊ฒฝ์ฐ๋ง ๋๋ฌธ์๋ก ๋ฐ๊ฟ์ฃผ์ด๋ ๋๋ค.
ํ๊น์ ์ข ๋ฅ์ ์๊ด์์ด ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
UpperCaseHandler
๋ผ๊ณ ์ ๋ค๋ดํ๊ฒ ๋ช ๋ช ํ ๋ค, ์ด ํ๋ก์๊ฐ ํ์ํ ๊ณณ์ด ์๋ค๋ฉด, ์ด๋ค ํ๊น์ด๋ผ๋ ์ฌ์ฉํ ์ ์๋ค.๋ฆฌํดํ์ ๋ฟ๋ง ์๋๋ผ ๋ฉ์๋์ ์ด๋ฆ์๋ ์กฐ๊ฑด์ ๊ฑฐ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๋ฉ์๋ ์ด๋ฆ์ด say ๋ก ์์ํ๋ ๊ฒฝ์ฐ๋ง ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ์ฝ๋์์์ ๊ฐ์ด ๊ฐ๋ฅํ๋ค.
return ret instanceof String && method.getName().startsWith("say") ? ((String)ret).toUpperCase() : ret;
๊ทธ๋ ๋ค๋ฉด, ๋ณธ๊ฒฉ์ ์ผ๋ก UserServiceTx ์๋ ๋ค์ด๋ด๋ฏน ํ๋ก์๋ฅผ ์ ์ฉํด๋ณด์!
TransactionHandler ์ ๋ค์ด๋ด๋ฏน ํ๋ก์๋ฅผ ์คํ๋ง์ DI ๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
๋ฌธ์ ์
๋ค์ด๋ด๋ฏน ํ๋ก์๋ ์ผ๋ฐ์ ์ธ ์คํ๋ง์ ๋น์ผ๋ก๋ ๋ฑ๋กํ ๋ฐฉ๋ฒ์ด ์๋ค.
์คํ๋ง ๋น์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค ์ด๋ฆ๊ณผ ํ๋กํผํฐ๋ก ์ ์๋๋๋ฐ, ๋ฆฌํ๋ ์ API ๋ฅผ ์ด์ฉํ์ฌ ๋น ์ ์์ ๋์ค๋ ํด๋์ค ์ด๋ฆ์ ๊ฐ์ง๊ณ ๋น ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.
๋ฌธ์ ๋ ๋ค์ด๋ด๋ฏน ํ๋ก์ ์ค๋ธ์ ํธ์ ํด๋์ค๋ ์ด๋ค ๊ฒ์ธ์ง ์ ์๊ฐ ์๋ค. Proxy ํด๋์ค์ newProxyInstance() ๋ผ๋ ์คํํฑ ํฉํ ๋ฆฌ ๋งค์๋๋ฅผ ํตํด์๋ง ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํฉํ ๋ฆฌ ๋น์ ์ด์ฉํ ํด๊ฒฐ๋ฐฉ๋ฒ
ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ๋ํดํธ ์์ฑ์๋ฅผ ํตํด ์ค๋ธ์ ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ ์ด์ธ์ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ ์ค ํ๋๊ฐ ํฉํ ๋ฆฌ ๋น์ ์ด์ฉํ ๋น ์์ฑ ๋ฐฉ๋ฒ์ด๋ค.
ํฉํ ๋ฆฌ ๋น์ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ FactoryBean ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด๋ค.
์์ : private ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์๋ Message ํด๋์ค
private ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๋ ์คํ๋ง์์ ๋น์ผ๋ก ๋ฑ๋กํ ์ ์๋ค. (์ฌ์ค ๋ฆฌํ๋ ์ ์ ๊ถํ์ด ๋ง๊ฐํ์ฌ ๊ฐ๋ฅ์ ํ๋ฐ, ์ง์ ์์ฑํ์ง๋ง๊ณ ์คํํฑ ๋ฉ์๋๋ฅผ ํตํด ์ฐํํ๋๋ก ์ ์ํด๋์ผ๋ฏ๋ก, ๊ทธ๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.)
Message ์์
UserService ์ ์ ์ฉ
ํ๋ก์ ํฉํ ๋ฆฌ ๋น ๋ฐฉ์์ ์ฅ์ ๊ณผ ํ๊ณ
์ฅ์
ํ๋ก์ ํฉํ ๋ฆฌ ๋น์ ์ฌ์ฌ์ฉ์ฑ : ์ด์ ํธ๋์ญ์ ์ด ํ์ํ ๋ชจ๋ ํด๋์ค์ ์ฝ๋ ๋ณ๊ฒฝ์์ด ๋น ์ค์ ์ ๋ณด๋ง ์ถ๊ฐํจ์ผ๋ก์จ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๊ฒ ๋๋ค. (์์ xml ์ฝ๋ ์ฐธ๊ณ )
ํ๋ก์๋ฅผ ์ ์ฉํ ๋์์ด ๊ตฌํํ๊ณ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํ๋ก์ ํด๋์ค๋ฅผ ์ผ์ผํ ๋ง๋ค์ง ์์๋ ๋๋ค. invocationHandler ๋ง ์ด์ฉํ๋ฉด ๋๋ค.
๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ์ฌ๋ฌ ๋ฉ์๋์ ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋์ง ์์๋ ๋๋ค. invocationHandler ์๋ง ์ ์ฉ์์ผ์ฃผ๋ฉด ๋๋ค.
ํ๊ณ
๋ฉ์๋ ๋จ์๋ก ์ผ์ด๋๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ์ฌ๋ฌ๊ฐ์ ํด๋์ค์ ๊ณตํต์ ์ธ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ผ์ด ๋ถ๊ฐํ๋ค.
ํ๋์ ํ๊น์ ์ฌ๋ฌ๊ฐ์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ค๊ณ ํ ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ค. ๋น๋ก ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์์ง๋ง, ๋น ์ค์ ์ ๋ณด๊ฐ ์์ฒญ๋๊ฒ ๋์ด๋๊ฒ ๋๋ค. ์ฌ์ง์ด๋ ์ด ์ค์ ์ ๋ณด๋ ํ๊น๊ณผ ์ธํฐํ์ด์ค๋ง ๋ค๋ฅธ ์ฑ๋ก ๊ฐ์ ๋ฐฉ์์ ์ฝ๋๊ฐ ์ค๋ณต๋๋ค.
์ด๋ป๊ฒ ํด๊ฒฐํ ๊น?
์คํ๋ง์ ํ๋ก์ ํฉํ ๋ฆฌ ๋น
๋ค์ํธ์ ๊ณ์!
Last updated