- Spring ์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ธ DI ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ค๋ค๋ฉด,
- AOP ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ฑธ์ณ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๋๋ก ์ง์ํ๋ ๊ฒ์ ๋๋ค.
- ๊ด์ (๊ด์ฌ) ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํด์๋๋๋ฐ ๋จ์ด๊ฐ ์๋ฟ์ง ์์์ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ๋ค๋ฅด๊ฒ ๋งํ๋ฉด ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ๋ฐ๊พผ๋ค๋ผ๊ณ ํ ์ ์์ต๋๋ค.
- ์ฆ, ๋์์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๋ฐ๊พธ์.
์ง๊ธ๋ถํฐ๋ ์ฝ๋๋ฅผ ๋ดค๋ค๋ ์ ์ ํ์ ์ค๋ช
์ด ์งํ๋ฉ๋๋ค.
๋ถ๊ฐ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ฐ๋ผ๋ณด๋ฉด ๊ฐ๊ฐ์ Service ๋ ์ํ ์๊ฐ ์ธก์ ์ ๋ํ๋ด๋ before, after ๋ฉ์๋๊ฐ ์ค๋ณต๋ฉ๋๋ค.
AOP ๋ ์ฌ๊ธฐ์๋ถํฐ ์์ํฉ๋๋ค.
- ๊ธฐ์กด OOP ์์ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ๋ค๋ฅด๊ฒ ํ์ฌ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ธ ์ธก๋ฉด์์ ๋ดค์ ๋ ๊ณตํต๋ ์์๋ฅผ ์ถ์ถํ์๋ ๊ฒ์ ๋๋ค.
- ์ด๋ ๊ฐ๋ก(ํก๋จ) ์์ญ์ ๊ณตํต๋ ๋ถ๋ถ์ ์๋ผ๋๋ค๊ณ ํ์ฌ, AOP ๋ฅผ Cross-Cutting ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- OOP : ๋น์ฆ๋์ค ๋ก์ง์ ๋ชจ๋ํ
- ๋ชจ๋ํ์ ํต์ฌ ๋จ์๋ ๋น์ฆ๋์ค ๋ก์ง
- AOP : ์ธํ๋ผ ํน์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ชจ๋ํ
- ์: ๋ก๊น , ํธ๋์ญ์ , ๋ณด์ ๋ฑ
- ๊ฐ๊ฐ์ ๋ชจ๋์ ์ฃผ ๋ชฉ์ ์ธ์ ํ์ํ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค
- ์ฑ๋ฅ ๊ฒ์ฌ
- ํธ๋์ญ์ ์ฒ๋ฆฌ
- ๋ก๊น
- ์์ธ ๋ฐํ
- ๊ฒ์ฆ
์ค ์๋ก, @Transactional, @Cache ๊ฐ์ ์ด๋
ธํ
์ด์
๋ค์ AOP ๋ฅผ ํ์ฉํ์ฌ ๋์ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ํฉ์ด์ง ๊ณตํต ๊ธฐ๋ฅ์ด ํ๋์ ์ฅ์์์ ๊ด๋ฆฌ๋๋ค๋ ์
- ๋ค๋ฅธ ์๋น์ค ๋ชจ๋๋ค์ด ๋ณธ์ธ์ ๋ชฉ์ ์๋ง ์ถฉ์คํ๊ณ ๊ทธ์ธ ์ฌํญ๋ค์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค๋ ์
- ์๋ ์ฉ์ด๋ค์ Spring ์์๋ง ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋ AOP ํ๋ ์์ํฌ ์ ์ฒด์์ ์ฌ์ฉ๋๋ ๊ณต์ฉ์ด์ ๋๋ค.
- ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ์ฌํ ๋์์ ๋งํฉ๋๋ค.
- ์ฌ๊ธฐ์ ํต์ฌ๊ธฐ๋ฅ์ ๋ด๋นํ๋
getBoards, getUsers๋ฅผ ํ๋ Service ๋ฅผ ๋งํฉ๋๋ค.
- ๊ฐ์ฒด ์งํฅ ๋ชจ๋์ ์ค๋ธ์ ํธ๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ ๋ถ๊ฐ๊ธฐ๋ฅ ๋ชจ๋์ ์ ์คํํธ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
- ํต์ฌ๊ธฐ๋ฅ์ ๋ถ๊ฐ๋์ด ์๋ฏธ๋ฅผ ๊ฐ๋ ํน๋ณํ ๋ชจ๋์ด๋ผ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
- ๋ถ๊ฐ๋ ๊ธฐ๋ฅ์ ์ ์ํ ์ด๋๋ฐ์ด์ค ์ ์ด๋๋ฐ์ด์ค๋ฅผ ์ด๋์ ์ ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ํฌ์ธํธ์ปท ์ ํจ๊ป ๊ฐ๊ณ ์์ต๋๋ค.
- ์ฐธ๊ณ ๋ก AOP (Aspect Oriented Programming) ๋ผ๋ ๋ป ์์ฒด๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ, ์ ์คํํธ๋ผ๋ ๋ ํนํ ๋ชจ๋๋ก ๋ง๋ค์ด์ ์ค๊ณํ๊ณ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ปํฉ๋๋ค.
- ์ค์ง์ ์ผ๋ก ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ด์ ๊ตฌํ์ฒด๋ฅผ ๋งํฉ๋๋ค.
- ํ๊ฒ ์ค๋ธ์ ํธ์ ์ข ์๋์ง ์๊ธฐ ๋๋ฌธ์ ์์ํ๊ฒ ๋ถ๊ฐ๊ธฐ๋ฅ์๋ง ์ง์คํ ์ ์์ต๋๋ค.
- ์ ์คํํธ๊ฐ ๋ฌด์ ์ ์ธ์ ํ ์ง๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค.
- ๊ฐ JoinPoint ์ ์ฝ์ ๋์ด ๋์ํ ์ ์๋ ์ฝ๋
- ๋ถ๊ฐ๊ธฐ๋ฅ์ด ์ ์ฉ๋ ๋์(๋ฉ์๋)๋ฅผ ์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ปํฉ๋๋ค.
- ์ฆ, ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ ์กฐ์ธํฌ์ธํธ๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ์ ์ ์ํ ๋ชจ๋์ ๋งํฉ๋๋ค.
- ์ด๋ค ํด๋์ค์ ์ด๋ JoinPoint ๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ฒฐ์
- ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น๋ฅผ ๋ปํฉ๋๋ค.
- ๋ค๋ฅธ AOP ํ๋ ์์ํฌ์ ๋ฌ๋ฆฌ Spring ์์๋ ๋ฉ์๋ ์กฐ์ธํฌ์ธํธ๋ง ์ ๊ณต ํ๊ณ ์์ต๋๋ค.
- ๋ฐ๋ผ์ Spring ํ๋ ์์ํฌ ๋ด์์ ์กฐ์ธํฌ์ธํธ๋ผ ํ๋ฉด ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค๊ณ ์๊ฐํด๋ ๋ฉ๋๋ค.
- ๋ชจ๋์ ๊ธฐ๋ฅ์ด ์ฝ์ ๋์ด ๋์ํ ์ ์๋ ์คํ ๊ฐ๋ฅํ ํน์ ์์น
- ํ๊ฒ์ ๊ฐ์ธ์ ํ๊ฒ์ ์์ฒญ์ ๋์ ๋ฐ์์ฃผ๋ Wrapping ์ค๋ธ์ ํธ์ ๋๋ค.
- ํธ์ถ์(Client)์์ ํ๊ฒ์ ํธ์ถํ๊ฒ ๋๋ฉด ํ๊ฒ์ด ์๋ ํ๊ฒ์ ๊ฐ์ธ๊ณ ์๋ ํ๋ก์๊ฐ ํธ์ถ๋์ด,
ํ๊ฒ ๋ฉ์๋ ์คํ ์ ์ ์ ์ฒ๋ฆฌ, ํ๊ฒ ๋ฉ์๋ ์คํ ํ, ํ์ฒ๋ฆฌ๋ฅผ ์คํ์ํค๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ํ๊ฒ ํด๋์ค์ ์ฝ๋ ๋ณ๊ฒฝ์์ด ์ ๊ท ๋ฉ์๋๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ๋งํฉ๋๋ค.
- ์ง์ ๋ ๊ฐ์ฒด์ ์ ์คํํธ๋ฅผ ์ ์ฉํ์ฌ ์๋ก์ด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
- PointCut ์ ์ํด ๊ฒฐ์ ๋ JoinPoint ์ ์ง์ ๋ Advice ๋ฅผ ์ฝ์ ํ๋ ๊ณผ์ (CrossCutting)
- ์๋ฅผ ๋ค์ด, A ๋ผ๋ ๊ฐ์ฒด์ ํธ๋์ญ์
์ ์คํํธ๊ฐ ์ง์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
- A ๋ผ๋ ๊ฐ์ฒด๊ฐ ์คํ๋๊ธฐ ์ , ์ปค๋ฅ์
์ ์คํํ๊ณ
์คํ์ด ๋๋๋ฉด ์ปค๋ฅ์ ์ ์ข ๋ฃํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ,
์ด ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ผ๋ก A ๊ฐ์ฒด๊ฐ ํธ์ถ๋๋ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๊ณผ์ ์ ์๋น ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
- A ๋ผ๋ ๊ฐ์ฒด๊ฐ ์คํ๋๊ธฐ ์ , ์ปค๋ฅ์
์ ์คํํ๊ณ
- ์ปดํ์ผ ํ์, ํด๋์ค ๋ก๋ ํ์, ๋ฐํ์๊ณผ ๊ฐ์ ์์ ์์ ์คํ๋์ง๋ง, Spring AOP ๋ ๋ฐํ์์์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.