[Spring] AOP(Aspect Oriented Programming) ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

2025. 9. 15. 00:39ยท๐ŸŒฟSpring

๐Ÿ“Œ ํšก๋‹จ๊ด€์‹ฌ์‚ฌ์™€ AOP

ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋Š” ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์— ๊ณตํ†ต์ ์œผ๋กœ ๊ฑธ์ณ์ ธ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ์ธ์ฆ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

 

 

AOP(Aspect Oriented Programming)๋Š” ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ,

๋กœ์ง๋“ค์„ ํ•ต์‹ฌ์ ์ธ ๊ด€์ , ๋ถ€๊ฐ€์ ์ธ ๊ด€์ (ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ)์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•ต์‹ฌ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ๊ฑธ์ณ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณตํ†ต์ ์ธ ๊ด€์‹ฌ์‚ฌ๋ผ๋ฆฌ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ

  • ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ ,
  • ๊ฐœ๋ฐœ์ž๋Š” ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•˜๊ณ ,
  • ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ AOP์˜ ์ฃผ์š” ์šฉ์–ด

  • Aspect: ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•œ ๊ฒƒ
    • ์˜ˆ) ๋กœ๊น… ๊ธฐ๋Šฅ์„ Aspect๋กœ ์ •์˜
  • Join Point: Aspect๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ง€์ 
    • ์˜ˆ) ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ง€์ 
  • Advice: ํŠน์ • Join Point์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
    • ์˜ˆ) `@Before` `@After`
  • Pointcut: Advice๊ฐ€ ์ ์šฉ๋  Join Point๋ฅผ ์ง€์ •ํ•˜๋Š” ํ‘œํ˜„
    • A๋ž€ ๋ฉ”์†Œ๋“œ์˜ ์ง„์ž… ์‹œ์ ์— ํ˜ธ์ถœํ•  ๊ฒƒ๊ณผ ๊ฐ™์ด ๋”์šฑ ๊ตฌ์ฒด์ ์œผ๋กœ Advice๊ฐ€ ์‹คํ–‰๋  ์ง€์ ์„ ์ •ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ Spring์—์„œ AOP

Spring์—์„œ AOP๋Š” ํ”„๋ก์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ ํ”„๋ก์‹œ๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

'๋Œ€๋ฆฌ์ธ'์ด๋ž€ ๋œป์„ ๊ฐ€์ง€๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€ ๋Œ€์ƒ ๊ฐ์ฒด ์‚ฌ์ด์—์„œ ์ค‘๊ฐ„ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฐ์ฒด(Target Object)์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋Œ€์‹ , ๋Œ€๋ฆฌ ๊ฐ์ฒด(ํ”„๋ก์‹œ ๊ฐ์ฒด)๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ์‹ค์ œ ํ˜ธ์ถœ ํ๋ฆ„: ํด๋ผ์ด์–ธํŠธ → ํ”„๋ก์‹œ ๊ฐ์ฒด → AOP ๋กœ์ง ์‹คํ–‰  →  ์‹ค์ œ ๊ฐ์ฒด(Target)

ํ”„๋ก์‹œ๋Š” ์‹ค์ œ ๊ฐ์ฒด๋กœ ๊ฐ€๋Š” ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฆ‰, ์Šคํ”„๋ง์—์„œ AOP๊ฐ€ ํ”„๋ก์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์€

๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„์— ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ๋ณด์•ˆ ๊ฒ€์‚ฌ ๋“ฑ์˜ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋„ฃ๊ณ ์ž ํ•  ๋•Œ

์›๋ณธ ๊ฐ์ฒด(์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ์•ˆ์—์„œ ๋ถ€๊ฐ€ ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จ ์‹ค์Šต

  • ์„œ๋น„์Šค ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋“ค์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค
    ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „ ๋กœ๊น…์„ ์ฐ์–ด๋ณด์ž.

 

์Šคํ”„๋ง์—์„œ `@Aspect`๋ฅผ ์ด์šฉํ•ด AOP๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์œ„์™€ ๊ฐ™์ด ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ์žˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LoggingAspect {

  @Before("execution(* com.codeit.weatherwear.domain..*Service.*(..))")
  public void logBefore(JoinPoint joinPoint) {
    System.out.println("๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „: " + joinPoint.getSignature());
  }
}

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฃผ์˜ํ•  ์ 

  • Spring AOP๋Š” ์Šคํ”„๋ง ๋นˆ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Spring AOP๋Š” ๋Ÿฐํƒ€์ž„ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์Šคํ”„๋ง์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ๋นˆ๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. AOP ์ ์šฉ ๋Œ€์ƒ์ด๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
    • ์ดํ›„ ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ ์‚ฌ์‹ค ์ฃผ์ž… ๋ฐ›๋Š” ๊ฒƒ์€ ์›๋ณธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋ก์‹œ ๊ฐ์ฒด 
    • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋นˆ์— ๋Œ€ํ•ด์„œ๋งŒ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“œ๋ฏ€๋กœ Bean์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ž˜์Šค์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • private/static/final ๋ฉ”์„œ๋“œ์—๋Š” ์ ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • public/protected ๋ฉ”์„œ๋“œ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (Self Invocation)
    • AOP๋Š” ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋  ๋•Œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ™์€ ํด๋ž˜์Šค ์•ˆ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•„ AOP๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ„๋„ ๋นˆ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

[Spring] ์Šคํ”„๋ง AOP (Spring AOP) ์ด์ •๋ฆฌ : ๊ฐœ๋…, ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ AOP, @AOP
[Java] Spring Boot AOP(Aspect-Oriented Programming) ์ดํ•ดํ•˜๊ณ  ์„ค์ •ํ•˜๊ธฐ

Spring AOP ๊ณต์‹ ๋ฌธ์„œ

 

 

 

'๐ŸŒฟSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] AOP ๊ธฐ๋ฐ˜ API ์š”์ฒญ๋ณ„ ์ฟผ๋ฆฌ ํšŸ์ˆ˜ / ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ์นด์šดํ„ฐ ๊ตฌํ˜„  (0) 2025.11.02
[Spring] ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor) ์ฐจ์ด  (0) 2025.09.11
[Spring] DI(Dependency Injection) ์˜์กด์„ฑ ์ฃผ์ž…  (4) 2025.08.14
[Spring] IoC ์ œ์–ด์˜ ์—ญ์ „  (1) 2025.08.12
Spring์—์„œ ์บ์‹œ ์‚ฌ์šฉํ•˜๊ธฐ: CaffeineCache, @Cacheable, @CachePut, @CacheEvict  (1) 2025.06.12
'๐ŸŒฟSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring] AOP ๊ธฐ๋ฐ˜ API ์š”์ฒญ๋ณ„ ์ฟผ๋ฆฌ ํšŸ์ˆ˜ / ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ์นด์šดํ„ฐ ๊ตฌํ˜„
  • [Spring] ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor) ์ฐจ์ด
  • [Spring] DI(Dependency Injection) ์˜์กด์„ฑ ์ฃผ์ž…
  • [Spring] IoC ์ œ์–ด์˜ ์—ญ์ „
์†Œ์˜ ๐Ÿ€
์†Œ์˜ ๐Ÿ€
Hello World โœจ
  • ์†Œ์˜ ๐Ÿ€
    Soyoung's Dev Lab
    ์†Œ์˜ ๐Ÿ€
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ธ€์“ฐ๊ธฐ ๊ด€๋ฆฌ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (79)
      • ๐Ÿ“ข ๊ฒŒ์‹œํŒ (0)
      • ๐ŸŒฟSpring (20)
      • โ˜•Java (7)
        • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (7)
      • โš™๏ธ CS (26)
        • ๐Ÿ›œ ๋„คํŠธ์›Œํฌ (5)
        • ๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
        • ๐Ÿ–ฒ๏ธ์šด์˜์ฒด์ œ (9)
        • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜ (4)
      • ๐Ÿ“ค ๋ฐฐํฌ (4)
        • Docker (4)
        • AWS (0)
      • ๐Ÿ“ฐ ๊ธฐํƒ€ ๊ฐœ๋ฐœ ์ž๋ฃŒ (12)
      • ๐Ÿ–ฅ๏ธ ํ”„๋กœ์ ํŠธ (0)
      • ๐Ÿ‘ฉ‍๐Ÿ’ป ํ™œ๋™ & ํ›„๊ธฐ (1)
      • ๐Ÿต ์ด์•ผ๊ธฐ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํƒœ๊ทธ
  • ๋งํฌ

    • github
    • velog
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๊ฐœ๋ฐœ
    ๋ฐฐํฌ
    ์šด์˜์ฒด์ œ
    ๊ธฐ์ˆ  ๋ฉด์ ‘
    ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ
    ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    Spring
    GIT
    ๋„คํŠธ์›Œํฌ
    ์„œ๋ฒ„
    Spring Security
    docker
    ์ž๋ฃŒ๊ตฌ์กฐ
    ์œ„ํด๋ฆฌ ํŽ˜์ดํผ
    Java
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์†Œ์˜ ๐Ÿ€
[Spring] AOP(Aspect Oriented Programming) ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”