λ°˜μ‘ν˜•
AOP (Aspect-Oriented Programming)
μ„€λͺ…

μ—¬λŸ¬ λ‘œμ§λ‹¨μ— μ μš©λ˜μ–΄μ•Ό ν•  νŠΉμ • 쀑볡 λ‘œμ§μ„ μ—¬λŸ¬ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  μ μš©ν•˜λŠ” 것
흩어진 μ½”λ“œλ₯Ό ν•œκ³³μœΌλ‘œ λͺ¨μœΌμž!
νš‘λ‹¨ 관심에 따라 ν”„λ‘œκ·Έλž˜λ° ν•˜λŠ”κ²ƒ

β€» νš‘λ‹¨
λ™μ„œ λ°©ν–₯으둜 κ°€λ‘œμ§ˆλŸ¬ κ°€λŠ”κ²ƒ
β€» νš‘λ‹¨ 관심사 (Cross cutting concern)

λ‹€μˆ˜μ˜ λͺ¨λ“ˆμ— κ³΅ν†΅μ μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” 뢀뢄이 쑴재
λͺ¨λ“ˆλ³„λ‘œ λ°˜λ³΅λ˜μ–΄ μ€‘λ³΅ν•΄μ„œ λ‚˜νƒ€λ‚˜λŠ” λΆ€λΆ„λ°˜λ³΅κ³Ό 쀑볡은 λΆ„λ¦¬ν•˜μ—¬ ν•œκ³³μ—μ„œ ν‘œν˜„ν•΄μ•Ό ν•œλ‹€λΌλŠ”κ²ƒμ„ 항상 인지해야 함.
νŠΉμ§•

Aspect 으둜 ν‘œν˜„
둜직(Code) μ£Όμž…
λ‘œκΉ…, λ³΄μ•ˆ, νŠΈλžœμž­μ…˜ κΈ°λŠ₯이 반볡적으둜 λ‚˜νƒ€λ‚¨
AOPλŠ” ν”„λ‘μ‹œ 기반, μΈν„°νŽ˜μ΄μŠ€ 기반, λŸ°νƒ€μž„ 기반 이닀.

 

λ©”μ†Œλ“œμ— μ£Όμž…ν•  수 μžˆλŠ” μ˜μ—­

@Before: λŒ€μƒ λ©”μ†Œλ“œ μ‹œμž‘ μ „
@After: λŒ€μƒ λ©”μ†Œλ“œ μ‹œμž‘ ν›„
    @AfterReturning: λŒ€μƒ λ©”μ†Œλ“œ 정상 μ’…λ£Œ ν›„ 
    @AfterThrowing: λŒ€μƒ λ©”μ†Œλ“œ μ˜ˆμ™Έ λ°œμƒ → μ’…λ£Œ ν›„

 

AOP μš©μ–΄
Aspect μ—¬λŸ¬κ°œμ˜ Advice, μ—¬λŸ¬κ°œμ˜ Pointcut의 결합체λ₯Ό μ˜λ―Έν•˜λŠ” μš©μ–΄
Advisor ν•œκ°œμ˜ Advice, ν•œκ°œμ˜ Pointcut
Advice pointcut에 μ μš©ν•  둜직, 즉 λ©”μ„œλ“œλ₯Ό 의미 

@Before("execution( * runSomething())") 
public void before(JoinPoint joinPoint) { ... }
JoinPoint 연결점. μ—°κ²° κ°€λŠ₯ν•œ 지점. Aspect 적용 κ°€λŠ₯ 지점. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬κ°€ κ΄€λ¦¬ν•˜λŠ” 빈의 λͺ¨λ“  λ©”μ„œλ“œ

public void before(JoinPoint joinPoint) { ... }
Pointcut 자λ₯΄λŠ” 지점, Aspect 적용 μœ„μΉ˜ μ§€μ •μž. νš‘λ‹¨ 관심사λ₯Ό μ μš©ν•  타깃 λ©”μ„œλ“œλ₯Ό μ„ νƒν•˜λŠ” μ§€μ‹œμž.

@Before("execution( * runSomething())") → runSomething() μ‹€ν–‰ μ „ AOP을 μ‹€ν–‰ν•˜λΌλŠ” 뜻

 

Pointcut μ§€μ •μž κ΄€λ ¨

 
  execution

μΌμΉ˜ν•˜λŠ” λ©”μ„œλ“œ μ‹€ν–‰ 쑰인 ν¬μΈνŠΈμ— μ‚¬μš©λ©λ‹ˆλ‹€. 이것은 Spring AOP둜 μž‘μ—… ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ£Όμš” 포인트 μ»· μ§€μ •μžμž…λ‹ˆλ‹€.

  within
νŠΉμ • μœ ν˜• λ‚΄ κ²°ν•© 점에 λŒ€ν•œ 맀칭을 μ œν•œν•©λ‹ˆλ‹€ (Spring AOP μ‚¬μš©μ‹œ 맀칭 μœ ν˜• λ‚΄μ—μ„œ μ„ μ–Έ 된 λ©”μ†Œλ“œ μ‹€ν–‰).

  this
빈 μ°Έμ‘° (Spring AOP ν”„λ‘μ‹œ)κ°€ 주어진 μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€ 인 쑰인 포인트 (Spring AOP μ‚¬μš©μ‹œ λ©”μ†Œλ“œ μ‹€ν–‰)에 λŒ€ν•œ 맀칭을 μ œν•œν•©λ‹ˆλ‹€.

  target
λŒ€μƒ 객체 (ν”„λ‘μ‹œλ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 객체)κ°€ 주어진 μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€ 인 쑰인 포인트 (Spring AOP μ‚¬μš©μ‹œ λ©”μ„œλ“œ μ‹€ν–‰)에 λŒ€ν•œ 맀칭을 μ œν•œν•©λ‹ˆλ‹€.

  args
μΈμˆ˜κ°€ 주어진 μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€ 인 쑰인 포인트 (Spring AOP μ‚¬μš©μ‹œ λ©”μ„œλ“œ μ‹€ν–‰)에 λŒ€ν•œ 맀칭을 μ œν•œν•©λ‹ˆλ‹€.

  @target
μ‹€ν–‰ 객체의 ν΄λž˜μŠ€κ°€ 주어진 νƒ€μž…μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ κ°€μ§€κ³ μžˆλŠ” join point (Spring AOP μ‚¬μš©μ‹œ λ©”μ†Œλ“œ μ‹€ν–‰)둜 맀칭을 μ œν•œν•©λ‹ˆλ‹€.

  @args
전달 된 μ‹€μ œ 인수의 λŸ°νƒ€μž„ μœ ν˜•μ΄ 주어진 μœ ν˜•μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ κ°–λŠ” κ²°ν•© 지점 (Spring AOP μ‚¬μš©μ‹œ λ©”μ†Œλ“œ μ‹€ν–‰)에 λŒ€ν•œ 일치λ₯Ό μ œν•œν•©λ‹ˆλ‹€.

  @within
주어진 μ–΄λ…Έν…Œμ΄μ…˜ (Spring AOPλ₯Ό μ‚¬μš©ν•  λ•Œ 주어진 μ–΄λ…Έν…Œμ΄μ…˜μ΄μžˆλŠ” νƒ€μž…μ—μ„œ μ„ μ–Έ 된 λ©”μ†Œλ“œμ˜ μ‹€ν–‰)μ΄μžˆλŠ” νƒ€μž… λ‚΄μ—μ„œ 쑰인 ν¬μΈνŠΈμ— λŒ€ν•œ 맀칭을 μ œν•œν•©λ‹ˆλ‹€.

  @annotation
Join point의 주제 (Spring AOPμ—μ„œ μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œ)κ°€ 주어진 μ–΄λ…Έν…Œμ΄μ…˜μ„ κ°€μ§€κ³ μžˆλŠ” join point둜 맀칭을 μ œν•œν•©λ‹ˆλ‹€.

 

Pointcut ν‘œν˜„μ‹ 예제

 
  λͺ¨λ“  곡용 λ©”μ†Œλ“œ μ‹€ν–‰

execution(public * * (..))

  λ‹€μŒμœΌλ‘œ μ‹œμž‘ν•˜λŠ” 이름을 가진 λͺ¨λ“  λ©”μ†Œλ“œμ˜ μ‹€ν–‰ 
setexecution(* set * (..))

  AccountServiceμΈν„°νŽ˜μ΄μŠ€μ— μ˜ν•΄ μ •μ˜ 된 λͺ¨λ“  λ©”μ†Œλ“œμ˜ μ‹€ν–‰ 
execution(* com.xyz.service.AccountService. * (..))

  serviceνŒ¨ν‚€μ§€μ— μ •μ˜ 된 λͺ¨λ“  λ©”μ†Œλ“œ μ‹€ν–‰ 
execution(* com.xyz.service. *. * (..))

  μ„œλΉ„μŠ€ νŒ¨ν‚€μ§€ λ˜λŠ” ν•˜μœ„ νŒ¨ν‚€μ§€ 쀑 ν•˜λ‚˜μ— μ •μ˜ 된 λͺ¨λ“  λ©”μ„œλ“œ μ‹€ν–‰
execution(* com.xyz.service .. *. * (..))

  μ„œλΉ„μŠ€ νŒ¨ν‚€μ§€ λ‚΄μ˜ λͺ¨λ“  쑰인 포인트 (Spring AOPμ—μ„œλ§Œ λ©”μ„œλ“œ μ‹€ν–‰)
within(com.xyz.service. *)

 μ„œλΉ„μŠ€ νŒ¨ν‚€μ§€ λ˜λŠ” ν•˜μœ„ νŒ¨ν‚€μ§€ 쀑 ν•˜λ‚˜ λ‚΄μ˜ λͺ¨λ“  쑰인 지점 (Spring AOPμ—μ„œλ§Œ λ©”μ„œλ“œ μ‹€ν–‰)
within(com.xyz.service .. *)

  ν”„λ‘μ‹œκ°€ AccountServiceμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λͺ¨λ“  쑰인 포인트 (Spring AOPμ—μ„œλ§Œ λ©”μ„œλ“œ μ‹€ν–‰) 
this(com.xyz.service.AccountService)

 


 

μ°Έκ³ 


https://wikibook.co.kr/java-oop-for-spring/ (μ±…: μŠ€ν”„λ§ μž…λ¬Έμ„ μœ„ν•œ μžλ°” 객체지ν–₯의 원리와 이해)
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop

 

λ°˜μ‘ν˜•

'개발 > spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

νŠΈλžœμž­μ…˜  (0) 2021.11.25
Spring - μŠ€ν”„λ§ MVC 간단 정리  (0) 2021.06.05
Spring - DI (Dependency Injection)  (0) 2021.06.01
IOC/DI, DIμ‘μš©  (0) 2017.11.20
spring μ‹œμž‘, maven μ„€μΉ˜  (0) 2017.11.12

+ Recent posts