Spring

[Spring] AOP

soowitty 2024. 1. 22. 14:54

 ๐Ÿ’ก ๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

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 ์ ์šฉ ์ „ / ์ ์šฉ ํ›„

 

  1. ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ ์ง„์งœ ์Šคํ”„๋ง ๋นˆ์ด ์•„๋‹Œ ๊ฐ€์งœ ์Šคํ”„๋ง ๋นˆ์„ ์•ž์— ์„ธ์›Œ๋‘”๋‹ค.
  2. ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ด ์ˆ˜ํ–‰๋œ๋‹ค.
  3. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋งˆ๋‹ค ์ธํ„ฐ์…‰ํŠธ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ๊ฐ€์งœ ์Šคํ”„๋ง ๋นˆ์„ ์‹คํ–‰ํ•œ๋‹ค.
  4. ๊ฐ€์งœ ์Šคํ”„๋ง ๋นˆ์ด ๋๋‚˜๋ฉด 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