Skip to content

db-jay/spring-proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 
Β 
Β 

Repository files navigation

Spring Proxy Pattern & AOP ν•™μŠ΅ ν”„λ‘œμ νŠΈ

Springμ—μ„œ ν”„λ‘μ‹œ νŒ¨ν„΄μ„ ν™œμš©ν•˜μ—¬ AOPκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ λ‹¨κ³„λ³„λ‘œ ν•™μŠ΅ν•˜λŠ” ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

ν•™μŠ΅ λ‚΄μš©

1. 순수 ν”„λ‘μ‹œ νŒ¨ν„΄

  • ν”„λ‘μ‹œ νŒ¨ν„΄: Subject μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ CacheProxyλ₯Ό 톡해 캐싱 κΈ°λŠ₯ μΆ”κ°€
  • λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄: MessageDecorator, TimeDecoratorλ₯Ό μ²΄μ΄λ‹ν•˜μ—¬ λΆ€κ°€ κΈ°λŠ₯ 적용

2. ꡬ체 클래슀 기반 ν”„λ‘μ‹œ

  • μΈν„°νŽ˜μ΄μŠ€ 없이 ꡬ체 클래슀λ₯Ό 상속받아 ν”„λ‘μ‹œ κ΅¬ν˜„
  • TimeProxyκ°€ ConcreteLogic을 상속받아 μ‹€ν–‰ μ‹œκ°„ μΈ‘μ •

3. JDK 동적 ν”„λ‘μ‹œ

  • Java Reflection APIλ₯Ό ν™œμš©ν•œ 동적 ν”„λ‘μ‹œ 생성
  • InvocationHandlerλ₯Ό κ΅¬ν˜„ν•˜μ—¬ 곡톡 둜직 적용
  • μΈν„°νŽ˜μ΄μŠ€ 기반으둜만 ν”„λ‘μ‹œ 생성 κ°€λŠ₯

4. Spring ν”„λ‘μ‹œ νŒ©ν† λ¦¬

  • ProxyFactoryλ₯Ό μ‚¬μš©ν•˜μ—¬ JDK 동적 ν”„λ‘μ‹œ/CGLIB μžλ™ 선택
  • Advice, Pointcut, Advisor κ°œλ… ν•™μŠ΅
  • μΈν„°νŽ˜μ΄μŠ€κ°€ 있으면 JDK 동적 ν”„λ‘μ‹œ, μ—†μœΌλ©΄ CGLIB μ‚¬μš©

5. 빈 ν›„μ²˜λ¦¬κΈ° (BeanPostProcessor)

  • μŠ€ν”„λ§ 빈 등둝 μ‹œμ μ— ν”„λ‘μ‹œλ‘œ ꡐ체
  • PackageLogTracePostProcessor둜 νŠΉμ • νŒ¨ν‚€μ§€μ˜ 빈만 ν”„λ‘μ‹œ 적용

6. μžλ™ ν”„λ‘μ‹œ 생성기

  • AnnotationAwareAspectJAutoProxyCreatorλ₯Ό ν†΅ν•œ μžλ™ ν”„λ‘μ‹œ 생성
  • Pointcut으둜 ν”„λ‘μ‹œ 적용 λŒ€μƒ 필터링

7. Spring AOP (@Aspect)

  • @Aspect, @Around μ• λ…Έν…Œμ΄μ…˜ 기반 AOP κ΅¬ν˜„
  • AspectJ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•œ Pointcut μ •μ˜
  • ProceedingJoinPoint둜 λŒ€μƒ λ©”μ„œλ“œ 호좜

ν”„λ‘œμ νŠΈ ꡬ쑰

src/
β”œβ”€β”€ main/java/hello/proxy/
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ v1/          # μΈν„°νŽ˜μ΄μŠ€ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚   β”‚   β”œβ”€β”€ v2/          # ꡬ체 클래슀 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚   β”‚   └── v3/          # μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚   β”œβ”€β”€ config/
β”‚   β”‚   β”œβ”€β”€ v1_proxy/    # μˆ˜λ™ ν”„λ‘μ‹œ μ„€μ •
β”‚   β”‚   β”œβ”€β”€ v2_dynamicproxy/  # JDK 동적 ν”„λ‘μ‹œ μ„€μ •
β”‚   β”‚   β”œβ”€β”€ v3_proxyfactory/  # ν”„λ‘μ‹œ νŒ©ν† λ¦¬ μ„€μ •
β”‚   β”‚   β”œβ”€β”€ v4_postprocessor/ # 빈 ν›„μ²˜λ¦¬κΈ° μ„€μ •
β”‚   β”‚   β”œβ”€β”€ v5_autoproxy/     # μžλ™ ν”„λ‘μ‹œ μ„€μ •
β”‚   β”‚   └── v6_aop/           # @Aspect AOP μ„€μ •
β”‚   └── trace/           # 둜그 좔적 μœ ν‹Έλ¦¬ν‹°
β”‚
└── test/java/hello/proxy/
    β”œβ”€β”€ pureproxy/       # 순수 ν”„λ‘μ‹œ/λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄ ν…ŒμŠ€νŠΈ
    β”œβ”€β”€ jdkdynamic/      # JDK 동적 ν”„λ‘μ‹œ ν…ŒμŠ€νŠΈ
    β”œβ”€β”€ proxyfactory/    # ν”„λ‘μ‹œ νŒ©ν† λ¦¬ ν…ŒμŠ€νŠΈ
    β”œβ”€β”€ advisor/         # Advisor ν…ŒμŠ€νŠΈ
    └── postprocessor/   # 빈 ν›„μ²˜λ¦¬κΈ° ν…ŒμŠ€νŠΈ

핡심 κ°œλ… 정리

κ°œλ… μ„€λͺ…
Advice ν”„λ‘μ‹œκ°€ ν˜ΈμΆœν•˜λŠ” λΆ€κ°€ κΈ°λŠ₯ (λ‘œκΉ…, νŠΈλžœμž­μ…˜ λ“±)
Pointcut 어디에 λΆ€κ°€ κΈ°λŠ₯을 μ μš©ν• μ§€ νŒλ‹¨ν•˜λŠ” 필터링 둜직
Advisor Advice + Pointcut을 ν•˜λ‚˜λ‘œ 묢은 것
@Aspect μ—¬λŸ¬ Advisorλ₯Ό νŽΈλ¦¬ν•˜κ²Œ μƒμ„±ν•˜λŠ” μ• λ…Έν…Œμ΄μ…˜

기술 μŠ€νƒ

  • Java 17+
  • Spring Boot
  • Gradle

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages