-
[Spring] Spring MVC์์ AOP ์ค์ (feat. ๋ฃจํธ ์ปจํ ์คํธ์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ)Backend/Spring 2023. 10. 24. 11:56728x90
๐ฅ AOP
- ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Aspect Oriented Programming)
- ํต์ฌ ๊ด์ฌ ์ฌํญ๊ณผ ๊ณตํต ๊ด์ฌ ์ฌํญ์ ๋ถ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
- ํต์ฌ ๊ด์ฌ ์ฌํญ์ ์ ์ฉ๋๋ ๊ณตํต ๊ด์ฌ ์ฌํญ์ ๋ํด ๋ชจ๋๋ก ๋ง๋ค์ด ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ํต์ฌ ๋ก์ง์ ์ง์คํ๋ค.
- ์คํ๋ง์์ AOP
- target์ ๋ํด ํ๋ก์๋ก ๊ฐ์ธ๊ณ
- ํ๋ก์๊ฐ ๋ฉ์๋ ํธ์ถ์ด๋ ๋ฐํ ์์ ์ด๋ฅผ ๊ฐ๋ก์ฑ์
- advice์ ๋ฐ๋ผ Aspect์ ์ฝ๋๋ฅผ ์คํํ๊ฑฐ๋ target ํจ์๋ฅผ ํธ์ถํ๋ค.
๐ Spring MVC์ AOP ์ ์ฉํ๊ธฐ
๊ณตํต ๊ด์ฌ ์ฌํญ (Aspect)
- ๊ณตํต ๊ด์ฌ ์ฌํญ์ ๋ํด ๋ชจ๋ ์์ฑ
- @Aspect ์ ๋ ธํ ์ด์ ์ ํตํด ๊ณตํต ๊ด์ฌ ์ฌํญ์์ ์ค์
- @Pointcut ์ ๋ ธํ ์ด์ ๊ณผ, ์์ (@Before, @AfterReturning, @AfterThrowing, @After, @Around)์ ์ค์ ํ์ฌ Advice ์์ฑ
Controller, Service, Repository ๋ชจ๋ ๋ฉ์๋๋ง๋ค ๋ก๊ทธ๋ฅผ ์ฐ๋ Aspect
@Component @Aspect public class LoggingAspect { private final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("execution(* com..*.controller.*.*(..)) || execution(* com..*.model..*.*(..))") public void allMethod() {}; @Before("allMethod()") public void debug(JoinPoint jp) { logger.debug("{} ๋ฉ์๋ ์คํ - ์์ฒญ ํ๋ผ๋ฏธํฐ {}", jp.getSignature(), jp.getArgs()); } }
xml ์ค์
root-contex.xml
- ์น๊ณผ ๊ด๋ จ๋ ์ค์ ์ ์ ์ธํ ๋๋จธ์ง ์ค์ ์ ํ๋ xml
- controller๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋น ๋ฑ๋ก
- aop๋ฅผ ์ํ auto-proxy ์ค์
<context:component-scan base-package="com..model, com..util, com..aop"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
servlet-contex.xml
- ์น๊ณผ ๊ด๋ จ๋ ์ค์ ์ ํ๋ xml
- controller ๋น ๋ฑ๋ก
- controller์ ๋ํด aop๋ฅผ ์ ์ฉํ๊ธฐ ์ํ auto-proxy ์ค์
<context:component-scan base-package="com.*.controller" /> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
๐ AOP ์ค์ ์ ๋ฐ๋ฅธ ์๋ ๋ฐฉ์
์ค๋ณต๋ ๋น์ ๋ํ Spring MVC์ ๋น ์ ํ
- ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋ฃจํธ ์ปจํ ์คํธ์ ๋น์ ์ค๋ณต์ผ๋ก ์ ์ํ ์ ์๋ค.
- ์ด๋ ์๋ธ๋ฆฟ ์ปจํ
์ค์ ๋น์ด ๋ฃจํธ ์ปจํ
์คํธ์ ๋น์ ๊ฐ๋ฆฐ๋ค.
- ์ฆ ๋์ผํ ์ด๋ฆ์ ๋น์ด ์ ์๋์ด ์๋ค๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋น์ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
- ์๋ธ๋ฆฟ ์ปจํ
์คํธ์์ ๋น์ ์ฐพ์ ์ ์๋ค๋ฉด ๋ฃจํธ ์ปจํ
์คํธ์ ๋น์ ์ฌ์ฉํ๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ํด๋น ์ด๋ฆ์ ๋น์ด ์๋ค๋ฉด, ์คํ๋ง์ ๋ฃจํธ ์ปจํ ์คํธ์์ ํด๋น ์ด๋ฆ์ ๋น์ ๊ฒ์ํ๋ค.
- ๋น์ ์ฐ์ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ธ๋ฆฟ ์ปจํ
์คํธ์ ๋ฃจํธ ์ปจํ
์คํธ์ ๋น์ ๊ตฌ์ฑํ ๋ ์ค๋ณต ์ ์์ ์ฃผ์ํด์ผํ๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์คํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ๋ ๋น(ex controller)๋ฅผ ์ ์ํ๊ณ ,
- ๋ฃจํธ ์ปจํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ํด์ผํ๋ ๋น(ex service, repository)๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉํ๋ค.
1. ๋ชจ๋ ๋น์ aop๋ฅผ ์ ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ
# servlet-context.xml <context:component-scan base-package="com.*.controller" /> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> # root-context.xml <context:component-scan base-package="com..model, com..util, com..aop"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- ์์ ์ค์ ํ์ผ ์ฒ๋ผ ์ค์ ํ์ ๊ฒฝ์ฐ root, servlet context ๋ชจ๋ auto-proxy ์ค์ ์ด ์๊ธฐ ๋๋ฌธ์
- ๋ชจ๋ ๋น์ ๋ํด์ proxy๋ก ๊ฐ์ธ์ง๋ค.
- ๋ฐ๋ผ์ ๋ชจ๋ controller, service, repository ์์ฒญ ์์ ๋ก๊น ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
- ์ด๋ controller๋ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋น, ๋๋จธ์ง๋ ๋ฃจํธ ์ปจํ ์คํธ์ ๋น์ ์ฌ์ฉํ๋ค.
2. controller ๋น์ aop๋ฅผ ์ ์ฉํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ
# servlet-context.xml <context:component-scan base-package="com.*.controller" /> # root-context.xml <context:component-scan base-package="com..model, com..util, com..aop"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- ์๋ธ๋ฆฟ ์ปจํ ์คํธ์์ auto-proxy ์ค์ ์ ์ ๊ฑฐํ๋ค.
- ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋น์ ์ฌ์ฉํ๋ controller๋ ํ๋ก์๋ก ๊ฐ์ธ์ง์ง ์๊ณ
- ๋ฃจํธ ์ปจํ ์คํธ์ ๋น์ ์ฌ์ฉํ๋ ๋๋จธ์ง ๋น๋ค์ ๋ํด์๋ ๋ฃจํธ ์ปจํ ์คํธ์ ์ค์ ์ ๋ฐ๋ผ auto-proxy๊ฐ ์ ์ฉ๋๋ค.
3. ์๋ธ๋ฆฟ, ๋ฃจํธ ๋ชจ๋ controller ๋น์ ๊ฐ์ง ๋ aop๋ฅผ ์ ์ฉํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ
# servlet-context.xml <context:component-scan base-package="com.*.controller" /> # root-context.xml <context:component-scan base-package="com" /> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- ๋ฃจํธ ์ปจํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์กด์ฌํ๋ ๋ชจ๋ ๋น์ ๊ฐ์ง๊ณ ์๋ค.
- ์ด๋ ์คํ๋ง์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ controller ๋น์ ์ ํํ๊ณ ๋๋จธ์ง ๋น์ ๋ฃจํธ ์ปจํ ์คํธ์์ ์ ํํ๋ค.
- ๋ฐ๋ผ์ ๋๋จธ์ง ๋น์ ๋ํด์๋ง auto-proxy๊ฐ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ controller ๋น์ ๋ํด์๋ aop๊ฐ ์ ์ฉ๋์ง ์๋๋ค.
- controller์ ๋น์ด ๋ฃจํธ ์ปจํ ์คํธ์๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ auto-proxy ์ค์ ์ด ์ ์ฉ๋๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง
- ์คํ๋ง์ด ์ฌ์ฉํ๋ controller ๋น์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋น์ด๊ธฐ ๋๋ฌธ์ aop๊ฐ ์ ์ฉ๋์ง ์๋๋ค
๐ก ๊ฒฐ๋ก
- ์คํ๋ง ์ปจํ ์ด๋์ ์๋ ๋ฐฉ์์ ๋ฐ๋ผ aop ์ค์ ์ ์ ์
- ์ค๋ณต๋ ๋น ์ค์ ์ ํผํ๊ณ , aop๋ฅผ ์ ์ฉํ ์ปจํ ์คํธ์ ๋ํด auto-proxy ์ค์
728x90'Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ