์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- aws ์ฟ ํฐ
- docker-compose kafka
- ๋ค์ค ์ปจํ ์ด๋
- ์๋ฐ
- nGrinder
- ํ๋ก๊ทธ๋๋จธ์ค ์ปฌ๋ฌ๋ง๋ถ
- JPA
- ์ ํจ์ค ์ค์ผ์ค๋ฌ
- ์คํํ๋ ๋ฏธ์ค
- docker ps -a
- ์ ํจ์ค ๋น๋ ์ค๋ฅ
- docker
- Kafka
- s3 log ์ ์ฅ
- redis ํ ์คํธ์ฝ๋
- aws saa ํฉ๊ฒฉ
- ํ๋ก๊ทธ๋๋จธ์ค ํฉ์นํ์์๊ธ
- jvm ๋ฐ๋ฐ๋ฅ๊น์ง ํํค์น๊ธฐ
- Codedeploy ์ค๋ฅ
- ์๋ฒ ํฐ์ง๋ ๋์ปค ์ฌ์คํ
- redis ์กฐํ
- docker compose
- prod docker-compose
- AWS Certified Solutions Architect - Associate
- ํ์ดํผ๋ฐ์ด์
- s3 ์ด๋ฏธ์ง ์ ์ฅ
- s3 ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- ํ๋ก๊ทธ๋๋จธ์ค
- private subnet ec2 ๋ก์ปฌ ์ ์
- Entity
- Today
- Total
๐๐ข๐๐ โ๐๐๐ ๐๐๐ก๐๐ ๐๐๐๐โง
[Spring] AOP ๋ณธ๋ฌธ
[Spring] AOP
๐คRyusun๐ค 2022. 12. 11. 15:08AOP (Aspect Oriented Programming)
- ๊ด์ ์งํฅ ํ๋ก๊ทธ๋จ
- ์ด๋ค ๋ก์ง์ ํต์ฌ์ ์ธ ๊ด์ , ๋ถ๊ฐ์ ์ธ ๊ด์ ์ผ๋ก ๋๋๊ณ , ๊ทธ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ชจ๋ํ ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ํค์น์ง ์๊ณ ์ฌ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
- ํต์ฌ์ ์ธ ๊ด์ : ๊ฐ๋ฐ์๊ฐ ์ ์ฉํ๊ณ ์ ํ๋ ๋น์ฆ๋์ค ๋ก์ง.
- ๋ถ๊ฐ์ ์ธ ๊ด์ : ํต์ฌ ๋ก์ง์ ์ํํ๊ธฐ ์ํด ํ์ํ DB ์ฐ๊ฒฐ(JDBC), ๋ก๊น , ํ์ผ ์ ์ถ๋ ฅ ๋ฑ
AOP์ ์ฅ์ ๋๋ ์ฌ์ฉํ๋ ์ด์
- ๊ณตํต ๊ด์ฌ ์ฌํญ์ ํต์ฌ ๊ด์ฌ์ฌํญ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌ์์ผ ํต์ฌ ๋ก์ง์ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋ค.
- ๊ทธ์ ๋ฐ๋ผ ์ฝ๋์ ์ค๋ณต ์ ๊ฑฐ, ๊ฐ๋ ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฑ์ ๋์ผ ์ ์๋ค.
- ๊ฐ๊ฐ์ ๋ชจ๋์ ์์ ์ด ํ์ํ๋ฉด ๋ค๋ฅธ ๋ชจ๋์ ์์ ์์ด ํด๋น ๋ก์ง๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
AOP ์ฃผ์ ํค์๋
- Aspect
- ํฉ์ด์ง ๊ด์ฌ์ฌ(Crosscutting Concerns)๋ฅผ ๋ฌถ์ด์ ๋ชจ๋ํ ํ ๊ฒ. ํ๋์ ๋ชจ๋. Advice์ Point Cut์ด ๋ค์ด๊ฐ๋ค.
- Target
- Aspect๊ฐ ๊ฐ์ง๊ณ ์๋ Advice๊ฐ ์ ์ฉ๋๋ ๋์(ํด๋์ค, ๋ฉ์๋ ๋ฑ๋ฑ)์ ๋งํ๋ค.
- Advice
- ์ด๋ค ์ผ์ ํด์ผ ํ ์ง์ ๋ํ ๊ฒ. ํด์ผ ํ ์ผ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- Join Point
- Around Advice์์ ์ฌ์ฉํ ๊ณตํต ๊ธฐ๋ฅ ๋งค์๋๋ ๋๋ถ๋ถ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ ProceedingJoinPoint์ proceed() ๋งค์๋๋ง ํธ์ถํ๋ฉด ๋๋ค. ProceedingJoinPoint ์ธํฐํ์ด์ค์์ proceed()๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋๋ฐ์ด์ค ํน์ ๋์ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
- Around Advice์์ ์ฌ์ฉํ ๊ณตํต ๊ธฐ๋ฅ ๋งค์๋๋ ๋๋ถ๋ถ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ ProceedingJoinPoint์ proceed() ๋งค์๋๋ง ํธ์ถํ๋ฉด ๋๋ค. ProceedingJoinPoint ์ธํฐํ์ด์ค์์ proceed()๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋๋ฐ์ด์ค ํน์ ๋์ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
- Point Cut
- Join Point์ ์์ธํ ์คํ์ ์ ์ํ ๊ฒ. ์ด๋์ ์ ์ฉํด์ผ ํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
@Pointcut("execution(์์น)") = “ํด๋น ์์น์ ์๋ ๋ฉ์๋์ aop๋ฅผ ์ ์ฉํ๋ค”์ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ค๋ค.
- Join Point์ ์์ธํ ์คํ์ ์ ์ํ ๊ฒ. ์ด๋์ ์ ์ฉํด์ผ ํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฃผ์ Annotation
์ฃผ์ ํค์๋์ ์ด๋ ธํ ์ด์ ์ ๋ฐฐ์ ์ผ๋ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด AOP๋ฅผ ์ง์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ํด๋น ์์ ๋ ์คํ ์๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ธ๋ฐ์. ์คํ ์๊ฐ์ ์ถ๋ ฅํ๋ ์์ ๋ฅผ ๋ณด๋ฉด์ AOP ํน์ง์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์คํ๋ง AOP ๊ตฌํ
๋จผ์ aop๋ฅผ ์ฌ์ฉํ๊ธฐ์ํด์๋ dependency๋ฅผ ์ถ๊ฐ๋ฅผ ํด์ผ ํฉ๋๋ค. build.gradle ์ ๋ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ gradle ์๋ก๊ณ ์นจ์ ํด์ build ํด์ค๋๋ค. ํด๋น ์์ ์ ์๋ฃํด์ผ @Aspect Annotation์ด ์ธ์์ด ๋ฉ๋๋ค.
implementation 'org.springframework.boot:spring-boot-starter-aop'
์ฐ์ aop๋ฅผ ์ฌ์ฉํ์ง์๊ณ ํด๋น ์์ ์ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Custom annotation์ ํตํด์ ํด๋น annotation์ด ์ค์ ๋ ๋ฉ์๋๋ง ์คํ์๊ฐ์ ์ธก์ ํ ์ ์๋๋ก @Timer์ ์์ฑํ์์ต๋๋ค.
@Timer
@Target ์ Java compiler ๊ฐ annotation ์ด ์ด๋์ ์ ์ฉ๋ ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์์ ์ฌ์ฉํ Timerํด๋์ค ์์ ์ ์ธํ ElementType.TYPE, ElementType.METHOD์ ํ์
์ ์ธ๊ณผ ๋ฉ์๋ ์ ์ธํ ๋ ํด๋น Annotation์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค.
@Retention ์ ์ด๋ ์์ ๊น์ง ์ด๋
ธํ
์ด์
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ ธ๊ฐ์ง ์ค์ ํ๋ ์ด๋
ธํ
์ด์
์
๋๋ค. RetentionPolicy.RUNTIME์ ๋ฐํ์ ๋์์ ์ ์ง๋๊ณ , ๋ฐํ์์ ์ข
๋ฃํ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ๋ ์ด์์๋ค๋ ๋ฉํ ์ ๋ณด์
๋๋ค.
์ฃผ๋ก custom annotation์ ์ค์ ํ ๋ @Retention๊ณผ @Target annotation์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ค์, @GetMapping, @PostMapping, @DeleteMapping ์ปจํธ๋กค ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ RestApiController ํด๋์ค๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
RestApiController
์๊ฐ์ ์ธก์ ํ๊ธฐ ์ํด ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ์ ํธ ์ค ํ๋์ธ StopWatch๋ฅผ ์ฌ์ฉํฉ๋๋ค. aop๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๊ฐ์ ์ธก์ ํ๊ฒ ๋๋ค๋ฉด ๊ฐ ๋ฉ์๋๋ง๋ค
StopWatch stopWatch = new StopWatch();
stopWatch.start();
stopWatch.stop();
์์ ๊ฐ์ ๋์ผํ ์ฝ๋๋ฅผ ์ค๋ณต์ผ๋ก ์ ์ด์ค์ผ ํฉ๋๋ค.
๋น์ฆ๋์ค ๋ก์ง๊ณผ ์๊ด์๊ณ ์ค์ ๋ก์ง์ด ์๋ ๋ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ๋ชจ๋ ๋ฉ์๋์ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ด๊ฐ ์์ต๋๋ค. ์ด ํด๋์ค๋ ์๋น์ค ๋ก์ง์ธ ํต์ฌ ์ฝ๋๋ก๋ง ์ ์งํ ์ ์๊ฒ ๋ถ๊ฐ์ ์ธ ์ฝ๋๋ TimerAop ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋นผ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
TimerAop
Aop๋ก ๋์ํ๊ธฐ์ํด @Aspect ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๊ณ Spring์์ ๊ด๋ฆฌ๋ ์ ์๊ฒ @Component ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋๋ค.
@Pointcut ์๋ aop๋ฅผ ์ ์ฉ์ํฌ path๋ฅผ ์ ์ด์ค๋๋ค. proceedingJoinPoint.proceed()๋ aop๊ฐ ์ ์ฉ๋ ๋ฉ์๋ ์ ์ฒด๋ฅผ ์คํํฉ๋๋ค. ๋ง์ฝ ๋ฐํ๋๋ ๊ฐ์ด ์๋ค๋ฉด ์์ ํด๋์ค์ธ Object ํ์ ์ผ๋ก ๋ฐ์ต๋๋ค.
์๊ฐ์ ์ธก์ ํ๊ธฐ์ํด์ ์ ํ ์๊ฐ์ด ํ์ํ๋ฐ @before, @After์ ์๊ฐ์ ๊ณต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ @Around annotaion์ ์ฌ์ฉํฉ๋๋ค. @Around ์ด๋ ธํ ์ด์ ์ ๋์ ๊ฐ์ฒด์ ๋ฉ์๋ ์คํ ์ , ํ ์์ ์ ๊ณตํต๊ธฐ๋ฅ์ ์คํํฉ๋๋ค. ๊ณตํต ๊ธฐ๋ฅ์ ๊ตฌํํ ๋งค์๋, cut() ๋ฉ์๋์ enableTImer() ๋ฉ์๋๋ฅผ ์ ์ดํ๋ค๊ณ ์ค์ ํฉ๋๋ค.
์ฆ, @Around ์ด๋ ธํ ์ด์ ์ ํตํด cut(), enableTimer()์์ ์ค์ ํ aop ์ ์ฉ ์์น์ ๋ฉ์๋ ์คํ ์ ํ๋ก around() ๋ฉ์๋๊ฐ ์คํ๋๋ฉฐ ๊ธฐ๋ก์ ์ ์ฅํฉ๋๋ค.
RestApiController
aop๋ฅผ ๊ตฌํํํ RestApiController ํด๋์ค์๋ ์๋น์ค ๋ก์ง๋ง ๋จ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๊น๋ํด์ง ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฐ ์์ผ๋ก aop๋ฅผ ๊ตฌํํ๋ฉด ํต์ฌ ๋ก์ง์ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๊ฒ ๋ฉ๋๋ค.
'๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด๐ป > ๐๐ฉ๐ซ๐ข๐ง๐ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] JPA, ORM (0) | 2022.12.20 |
---|---|
[Spring] TestCode, TDD, JUnit, assertJ (0) | 2022.12.19 |
[Spring] Bean, Component (0) | 2022.12.09 |
[Spring] IoC (0) | 2022.12.09 |
[Spring] Spring MVC ๊ตฌ์กฐ (0) | 2022.11.02 |