๐ก ๊น์ํ๋์ ์คํ๋ง ์ ๋ฌธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
1. AOP๋?
Spring AOP
Spring AOP๋ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค. Spring AOP๋ ๊ณตํต์ ์ธ ๊ด์ฌ์ฌ(๋ก๊น
, ๋ณด์, ํธ๋์ญ์
)๋ฅผ ๋ชจ๋ํ
ํ์ฌ ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ ์ง ๋ณด์์ฑ์ ํฅ์ํ๋๋ฐ ๋์์ ์ค๋ค.
๐ AOP๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ฌ์ค๋ค!
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ (AOP, Aspect Oriented Programming)
AOP (Aspect Oriented Programming)
์ ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋, ๋ฉ์๋๋ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ํต์ฌ ๊ด์ฌ์ฌ์ ๊ณตํต ๊ด์ฌ์ฌ๋ก ๋ถ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ด๋ค. ์ด๋ ํต์ฌ ๊ด์ฌ์ฌ(core concern)๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์ผ ํ ๋ณธ๋์ ๊ธฐ๋ฅ์ด๊ณ , ๊ณตํต ๊ด์ฌ์ฌ(cross-cutting concern)๋ ์ฌ๋ฌ ๊ฐ์ฒด์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ฝ๋์ด๋ค.
์ฌ๋ฌ ๊ฐ์ ํด๋์ค๋ ๋ฉ์๋์์ ๋ฐ๋ณตํด์ ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ๋ชจ๋ํํ์ฌ ๊ณตํต ๊ด์ฌ์ฌ๋ก ๋ถ๋ฆฌํ๋ค.
AOP์ ํ์์ฑ
์๋ฅผ ๋ค์ด AOP์ ํ์์ฑ์ ์ค๋ช ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
ํ์ ๊ฐ์ ํจ์์ ํ์ ์กฐํ ํจ์๊ฐ ์คํ๋๋ ์๊ฐ์ ์ธก์ ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ค. ์ด๋, 1์ฐจ์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ ๋ฉ์๋์ ๋งจ ์๊ณผ ๋งจ ๋ค์ ํ์ฌ ์๊ฐ์ ์ธก์ ํ๋ ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ๊ฐ ๋ณ์์ ์ ์ฅํ ๋ค์ ๋ ๋ณ์์ ์ฐจ์ด๋ฅผ ๊ตฌํ๋ฉด ๋๋ค. ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋น์ฐํ ์ ์ง๋ณด์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ , ๋นํจ์จ์ ์ด๋ค. (์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋, ๋ชจ๋ ๋ก์ง์ ์ฐพ์๋ค๋๋ฉด์ ๋ณ๊ฒฝํด์ผ ํ๋ค. ์๊ฐ๋ง ํด๋ ์ด์ง๋ฌ์…)
์ด๋, AOP๋ฅผ ์ ์ฉํ๋ฉด ๋๋ค!
๋ค์๊ณผ ๊ฐ์ด ํต์ฌ ๊ด์ฌ์ฌ์ ๊ณตํต ๊ด์ฌ์ฌ๋ก ๋๋ ์ ์๋ค.
- ํต์ฌ ๊ด์ฌ์ฌ : ํ์ ๊ฐ์ , ํ์ ์กฐํ
- ๊ณตํต ๊ด์ฌ์ฌ : ์คํ ์๊ฐ ์ธก์
์คํ ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๋์ ๊ณตํต ๋ก์ง์ผ๋ก ๋ง๋ค๋ฉด, ํต์ฌ ๊ด์ฌ์ฌ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋ค. ๋ํ, ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ์๊ฐ ์ธก์ ์ ๋ํ ๋ก์ง๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ฏ๋ก ํธ๋ฆฌํ๋ค. ๋ํ, ์๊ฐ์ธก์ ๋ก์ง์ ์ ์ฉํ๊ณ ์ ํ๋ ๋์์ ์์ ํ๊ณ ์ ํ ๋๋ ๊ฐ๋จํ ์์ ๋ง์ผ๋ก ๊ฐ๋ฅํ๋ค.
์์ ๊ทธ๋ฆผ์ฒ๋ผ, AOP๋ฅผ ์ด์ฉํ์ฌ ์ฝ๊ฒ ์ํ๋ ํด๋์ค์ ๊ณตํต ๊ด์ฌ ์ฌํญ์ ์ ์ฉํ ์ ์๋ค.
2. AOP ์ ์ฉ
@Aspect
ํด๋น ํด๋์ค๊ฐ ๊ณตํต ๊ด์ฌ์ฌ ํด๋์ค์์ ์๋ ค์ฃผ๋ annotation์ด๋ค.
@Aspect๊ฐ ๋ถ์ฌ๋์๋ค๊ณ ํด์ ์๋์ผ๋ก Bean์ผ๋ก ๋ฑ๋ก๋๋ ๊ฒ์ด ์๋๋ฏ๋ก ๋ฐ๋ก ๋ฑ๋กํด์ฃผ๋ ์์ ์ด ํ์ํ๋ค. @Component๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, SpringConfig์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
์คํ๋ง๋น์ผ๋ก ๋ฑ๋กํ ๋
@Component ๋ถ์ด๊ธฐ
@Component
public class TimeTraceAop {
}
SpringConfig์ ๋ฑ๋ก
@Bean
public TimeTraceAop timeTraceAop() {
return new TimeTraceAop();
}
@Around
์ง์ ๋ ํจํด์ ํด๋นํ๋ ๋ฉ์๋์ ์คํ๋๊ธฐ ์ , ์คํ๋ ํ ๋ชจ๋์์ ๋์ํ๋ค.
@Around("execution(* hello.hellospring..*(..))")
hello.hellospringํจํค์ง ํ์์ ์๋ ๋ชจ๋ ํ์ผ์ ๊ณตํต ๊ด์ฌ์ฌ ํด๋์ค๋ฅผ ์ ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค.
ํ๋ก์ proxy
ํ๋ก์๋ ๋๋ฆฌ์๋ผ๋ ๋ป์ด๋ค. ์ด๋ ํ ํด๋์ค(Bean)๊ฐ AOP ๋์์ด๋ฉด ์๋ณธ ํด๋์ค ๋์ ํ๋ก์๊ฐ ๊ฐ์ธ์ง ํด๋์ค๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ง๊ณ , ํ๋ก์ ํด๋์ค๊ฐ ๋น์ ๋ฑ๋ก๋๋ค. ์ด๋ ๊ฒ ๋น์ ๋ฑ๋ก๋ ํ๋ก์ ํด๋์ค๋ ์๋ณธ ํด๋์ค๊ฐ ํธ์ถ๋๋ฉด ์๋์ผ๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํด์ค๋๋ค
AOP ์ ์ฉ ์ / ์ ์ฉ ํ
- ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋ ์ง์ง ์คํ๋ง ๋น์ด ์๋
๊ฐ์ง ์คํ๋ง ๋น
์ ์์ ์ธ์๋๋ค. ๋น์ง๋์ค ๋ก์ง
์ด ์ํ๋๋ค.- ๋ฉ์๋ ํธ์ถ๋ง๋ค ์ธํฐ์
ํธ๊ฐ ๊ฑธ๋ฆฌ๊ณ
๊ฐ์ง ์คํ๋ง ๋น
์ ์คํํ๋ค. ๊ฐ์ง ์คํ๋ง ๋น
์ด ๋๋๋ฉด joinPoint.proceed()๊ฐ์ง์ง ์คํ๋ง ๋น
์ ํธ์ถํ๋ค.
Reference
https://adjh54.tistory.com/133
https://velog.io/@limsubin/์คํ๋ง-AOP๋ฅผ-์์๋ณด์-์น์ 7-by-๊น์ํ
https://velog.io/@seyoung755/Spring-ํ๋ก์feat.-proxy-server๋-๋ฌด์์ผ๊น
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] JPA ๋ถํฐ Spring Data JPA๊น์ง (0) | 2024.04.14 |
---|---|
[Spring] welcome page ๋ง๋ค๊ธฐ (2) | 2024.01.03 |