🌱 [Spring] AOP(Aspect Oriented Programming) λŒ€μ²΄ 뭘까? 🧐

2,159 단어·5 뢄·원문(.md)

κ°œμš” #

학ꡐ λ‚΄ λ§Œλ“€μ–΄μ§„ νŒ€μ€‘ Lifestyleμ΄λΌλŠ” νŒ€μ΄ μžˆλ‹€. λ‚œ 그곳의 λ¦¬λ”λ‘œμ„œ 온라인 μŠ€ν„°λ””λΌλŠ”κ±Έ μ§„ν–‰ν–ˆλ‹€.

λ¬Όλ‘  μ°Έμ—¬μžλŠ” 두λͺ…λΏμ΄μ˜€μ§€λ§Œ.. μ²˜μŒμ΄λ‹ˆκΉŒ 뭐 κ°€λ³κ²Œ ν•˜μžλŠ” λ§ˆμΈλ“œλ‘œ

μ–΄μ¨Œλ“  온라인 μŠ€ν„°λ””μ˜ λ©”μ»€λ‹ˆμ¦˜μ€ 이렇닀.

μ°Έμ—¬ν•œ μΈμ›μ˜ 수만큼 μŠ€ν„°λ”” 주제λ₯Ό μ •ν•œλ‹€. -> μΈμ›λ§ˆλ‹€ ν•˜λ‚˜μ”© 주제λ₯Ό λ°°μ •λ°›λŠ”λ‹€ -> 1μ‹œκ°„ μŠ€ν„°λ”” ν›„ λ°œν‘œ

κ·Έλž˜μ„œ λ‚˜λŠ” μ΄λ²ˆμ— AOPλΌλŠ” 주제λ₯Ό λ°›κ²Œλ˜μ—ˆκ³  정리해보렀 ν•œλ‹€.

AOP(Aspect Oriented Programming) #

AOPλŠ” Aspect Oriented Programming의 μ•½μžλ‘œΒ κ΄€μ  μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λΌκ³  λΆˆλ¦°λ‹€.

곡톡 관심 κΈ°λŠ₯을 뢄리해 λ°˜λ³΅λ˜λŠ” 뢀뢄을 μΆ”μΆœν•΄ 핡심 λ‘œμ§μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  μ†ŒμŠ€μ˜ 쀑볡을 μ€„μ΄λŠ” κΈ°λ²•μœΌλ‘œ

κΈ°μ‘΄ OOPμ—μ„œ 곡톡 관심 κΈ°λŠ₯을 μ—¬λŸ¬ λͺ¨λ“ˆμ— μ μš©ν•΄ λ°œμƒν•˜λŠ” μ€‘λ³΅λœ μ½”λ“œ μ–‘μ‚°μ˜ ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜€κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έ 관점지ν–₯은 μ‰½κ²Œ 말해 μ–΄λ–€ κΈ°λŠ₯을 κΈ°μ€€μœΌλ‘œ 핡심적인 관점과 뢀가적인 κ΄€μ μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ 보고

κ·Έ 관점을 κΈ°μ€€μœΌλ‘œ 각각 λͺ¨λ“ˆν™” ν•˜κ² λ‹€λŠ” 것이닀.

음.. 더 μ‰½κ²Œ λ§ν•˜λ©΄ 핡심 λ‘œμ§μ— 집쀑할 수 μžˆλ„λ‘,

ν•„μš”ν•˜μ§€λ§Œ μ€‘λ³΅ν•΄μ„œ μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 핡심 둜직 μ΄μ™Έμ˜ μ½”λ“œλ“€μ€ μ™ΈλΆ€λ‘œ λΉΌλ†“λŠ” 것이닀.

μœ„μ˜ μ΄λ―Έμ§€μ²˜λŸΌ ν•œ ν΄λž˜μŠ€μ— μ—¬λŸ¬κ°œμ˜ 관점이 μžˆλŠ” 것이 μ•„λ‹ˆλΌ μ „λΆ€ λͺ¨λ“ˆν™” ν•˜μ—¬

각각에 ν•„μš”ν•œ ν΄λž˜μŠ€κ°€ κ°€μ Έλ‹€ μ‚¬μš©ν•˜κ²Œ λ§Œλ“ λ‹€.

(μ˜ˆμ‹œ)

μ˜ˆμ‹œλ₯Ό 듀어보겠닀. λ‚΄κ°€ λ§Œμ•½ νŒ©ν† λ¦¬μ–Όμ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ—ˆλ‹€. 그러면 νŒ©ν† λ¦¬μ–Όμ„ μž…λ ₯λ°›μ•„ 값을 λ¦¬ν„΄ν•˜λŠ”

클래슀λ₯Ό μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ λ§Œλ“€μ—ˆλ‹€. 그리고 μš”κ΅¬μ‚¬ν•­μ΄ μΆ”κ°€λ˜μ—ˆλ‹€. 계산을 μ‹œμž‘ν•˜λŠ” μ‹œμ κ³Ό μ’…λ£Œλ˜λŠ” μ‹œμ μ˜

μ‹œκ°„μ„ λ°€λ¦¬μ„Έμ»¨λ“œμ΄ˆλ‘œ κ΅¬ν•΄λ‹¬λΌλŠ” μš”κ΅¬μ‚¬ν•­μ΄μ—ˆλ‹€. κ·Έλ ‡κ²Œ νŒ©ν† λ¦¬μ–Όμ„ κ³„μ‚°ν•˜λŠ” μ½”λ“œμ— μ‹œμž‘μ‹œκ°„κ³Ό μ’…λ£Œμ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ”

κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆλ‹€. 그리고 μ—¬κΈ°μ„œ 또 μš”κ΅¬μ‚¬ν•­μ΄ μΆ”κ°€λ˜μ—ˆλ‹€. μ΄λ²ˆμ—λŠ” 반볡문으둜 νŒ©ν† λ¦¬μ–Όμ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ—

μ‹œμž‘ μ‹œκ°„ μ’…λ£Œ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” κΈ°λŠ₯을 넣어달라고 ν–ˆλ‹€. λ˜λ‹€μ‹œ κ·Έ ν΄λž˜μŠ€λ“€μ„ μž‘μ„±ν–ˆλ‹€.

그리고 μ΄λ²ˆμ—λŠ” λ‹€λ₯Έ κ³„μ‚°λ‘œμ§λ“€μ„ μ—¬λŸ¬κ°œ λ°›μ•„ μ‹œμž‘μ΄ˆ μ’…λ£Œμ΄ˆμ— λŒ€ν•œ λ‘œμ§μ„ κ΅¬ν˜„ν–ˆλ‹€.

κ·Έλ ‡κ²Œ 1000개의 κ³„μ‚°ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ—ˆλ‹€κ³  ν•΄λ³΄μž. κ·Έλ•Œ λ°€λ¦¬μ„Έμ»¨λ“œλ‘œ κ΅¬ν•˜λΌν–ˆλ˜ μ‹œκ°„μ„ λ§ˆμ΄ν¬λ‘œμ„Έμ»¨μœΌλ‘œ μˆ˜μ •ν•˜λΌλŠ”

μš”κ΅¬κ°€ λ“€μ–΄μ™”λ‹€. 그러면 1000개의 계산 ν”„λ‘œκ·Έλž¨μ„ λ‹€ μˆ˜μ •ν•΄μ•Όν•œλ‹€.

λΆ„λͺ… 핡심 λ‘œμ§μ€ 계산일 것인데 λ‹€λ₯Έ λ‘œμ§λ•Œλ¬Έμ— 골머리λ₯Ό μ•“κ²Œ 된 것이닀.

κ·Έλ ‡λ‹€ 관점 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 관점은 κ΄€μ‹¬μ‚¬λ‘œλ„ λ³Ό 수 μžˆλ‹€.

**핡심적인 관점(관심사), 뢀가적인 관점(관심사)**둜 λ‚˜λˆ„μ–΄ λ³Έλ‹€λŠ” 것도 μ—¬κΈ°μ„œ μ•Œ 수 μžˆλ‹€.

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ 핡심적인 관점은 κ³„μ‚°λ‘œμ§μ΄κ³  뢀가적인 관점은 μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ‘œμ§μ΄λ‹€.

κ·Έλ ‡κ²Œ κ³„μ‚°λ‘œμ§κ³Ό μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ‘œμ§μ„ λΆ„λ¦¬μ‹œμΌœ κ³„μ‚°λ‘œμ§μ— μ‹€ν–‰λ§Œ μ‹œμΌœμ£ΌλŠ” μ½”λ“œλ§Œ μΆ”κ°€ν•˜λ©΄ ν•΄κ²°ν•  일이닀.

즉, 핡심 λ‘œμ§μ— 집쀑할 수 μžˆλ„λ‘, ν•„μš”ν•˜μ§€λ§Œ μ€‘λ³΅ν•΄μ„œ μž‘μ„±ν•΄μ•Όν•˜λŠ” 핡심 둜직 μ΄μ™Έμ˜ μ½”λ“œλ“€μ€Β μ™ΈλΆ€λ‘œ λΉΌλ†“λŠ” 것이닀.

λ˜ν•œ, AOPλŠ” 흩어진 Aspect듀을 λͺ¨μ•„ λͺ¨λ“ˆν™” ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.

Aspectλž€?

-> 객체지ν–₯ μ–Έμ–΄μ˜ ν΄λž˜μŠ€μ™€ λΉ„μŠ·ν•œ κ°œλ…μ΄λΌκ³  μƒκ°ν•˜λ©΄ 쉽닀.

-> κ·Έ 자체둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 도메인 λ‘œμ§μ„ 담은 핡심기λŠ₯은 μ•„λ‹ˆμ§€λ§Œ, λ§Žμ€ μ˜€λΈŒμ νŠΈμ— 걸쳐 λΆ€κ°€κΈ°λŠ₯을 좔상화해놓은 것이닀.

AOP μ£Όμš” κ°œλ…(μš©μ–΄) #

- Aspect: μœ„μ—μ„œ μ„€λͺ…ν•œ 흩어진 관심사λ₯Ό λͺ¨λ“ˆν™” ν•œ 것, 주둜 λΆ€κ°€κΈ°λŠ₯을 λͺ¨λ“ˆν™” ν•œλ‹€.

- Target: Aspectλ₯Ό μ μš©ν•˜λŠ” κ³³(클래슀, λ©”μ„œλ“œ λ“±λ“±)

- Advice: μ‹€μ§ˆμ μœΌλ‘œ μ–΄λ–€ 일을 ν•΄μ•Όν•  지에 λŒ€ν•œ κ²ƒμœΌλ‘œ μ‹€μ§ˆμ μΈ λΆ€κ°€κΈ°λŠ₯을 담은 κ΅¬ν˜„μ²΄

- JoinPoint: Adviceκ°€ 적용될 μœ„μΉ˜λ‘œ 끼어듀 수 μžˆλŠ” 지점.(= λ©”μ„œλ“œ μ§„μž… 지점, μƒμ„±μž 호좜 μ‹œμ , ν•„λ“œμ—μ„œ 값을 κΊΌλ‚΄μ˜¬ λ•Œ λ“± λ‹€μ–‘ν•œ μ‹œμ μ— 적용 κ°€λŠ₯)

- PointCut: JoinPoint의 μƒμ„Έν•œ μŠ€νŽ™μ„ μ •μ˜ν•œ 것. 'Aλž€ λ©”μ„œλ“œμ˜ μ§„μž…μ‹œμ μ— ν˜ΈμΆœν•  것'κ³Ό 같이 ꡬ체적으둜 Adviceκ°€ 싀행될 지점을 μ •ν•  수 있음

AOP νŠΉμ§• #

  • ν”„λ‘μ‹œ νŒ¨ν„΄ 기반의 AOP κ΅¬ν˜„μ²΄, ν”„λ‘μ‹œ 객체λ₯Ό μ“°λŠ” μ΄μœ λŠ” μ ‘κ·Ό μ œμ–΄ 및 λΆ€κ°€κΈ°λŠ₯을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œμž„

ν”„λ‘μ‹œ κ°μ²΄λž€?

μ—¬κΈ°μ„œλŠ” κ°„λ‹¨ν•˜κ²Œ νŠΉμ • 객체λ₯Ό 감싸 ν”„λ‘œνΌν‹°μ˜ 읽기 쓰기와 같은 객체가 κ°€ν•΄μ§€λŠ” μž‘μ—…μ„ μ€‘κ°„μ—μ„œ κ°€λ‘œμ±„λŠ” 객체라고

κ°„λ‹¨ν•˜κ²Œ 생각해두면 λœλ‹€. 일단은 λŒ€ν–‰μžλΌκ³  μƒκ°ν•˜μž κ°€λ‘œμ±„μ§„ μž‘μ—…μ€ ν”„λ‘μ‹œ μžμ²΄μ—μ„œ μ²˜λ¦¬λ˜κ±°λ‚˜ μ›λž˜ 객체가 μ²˜λ¦¬λ˜λ„λ‘ κ·ΈλŒ€λ‘œ μ „λ‹¬λ˜κΈ°λ„ ν•œλ‹€.

  • μŠ€ν”„λ§ λΉˆμ—λ§Œ AOPλ₯Ό 적용 κ°€λŠ₯

  • λͺ¨λ“  AOP κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 것이 μ•„λ‹Œ μŠ€ν”„λ§ IoC와 μ—°λ™ν•˜μ—¬ μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κ°€μž₯ ν”ν•œ 문제(쀑볡 μ½”λ“œ, ν”„λ‘μ‹œ 클래슀 μž‘μ„±μ˜ λ²ˆκ±°λŸ¬μ›€, 객체듀 κ°„ 관계 λ³΅μž‘λ„ 증가...) 에 λŒ€ν•œ 해결책을 μ§€μ›ν•˜λŠ” 것이 λͺ©μ 

@AOP #

  • @Aspect: 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬ 이 ν΄λž˜μŠ€κ°€ AspectλΌλŠ”κ±Έ λ‚˜νƒ€λ‚΄λŠ” 클래슀라 λͺ…μ‹œν•΄ μ€€λ‹€.

  • @Around: 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ νƒ€κ²Ÿ λ©”μ„œλ“œλ₯Ό 감싸 νŠΉμ • Advice(κ΅¬ν˜„μ²΄)λ₯Ό μ‹€ν–‰ν•œλ‹€λŠ” μ˜λ―Έλ‹€.

e****xecution(* com.saelobi..*.EventService.*(..)) μ΄λŸ°μ‹μœΌλ‘œ μ‹€ν–‰μ‹œμ μ„ μ •ν•΄μ§ˆ 수 μžˆλ‹€.

λ˜ν•œ κ²½λ‘œμ§€μ • 방식말고 νŠΉμ • μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν¬μΈνŠΈμ— ν•΄λ‹ΉΒ Aspectλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” κΈ°λŠ₯도 μ œκ³΅ν•œλ‹€.

@Around("@annotation(ANNOTATION)")

public class ...

그리고 μŠ€ν”„λ§ 빈의 λͺ¨λ“  λ©”μ„œλ“œμ— μ μš©ν•  수 μžˆλŠ” κΈ°λŠ₯도 μ œκ³΅ν•œλ‹€.

@Around("bean(SERVICENAME)")

public class ...

이 외에도 @Around외에 νƒ€κ²Ÿ λ©”μ„œλ“œμ˜ Aspectλ₯Ό μ‹€ν–‰ μ‹œμ μ„ μ§€μ •ν•  수 μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆλ‹€.

  • @Before (이전) : μ–΄λ“œλ°”μ΄μŠ€ νƒ€κ²Ÿ λ©”μ†Œλ“œκ°€ 호좜되기 전에 μ–΄λ“œλ°”μ΄μŠ€ κΈ°λŠ₯을 μˆ˜ν–‰
  • @After (이후) : νƒ€κ²Ÿ λ©”μ†Œλ“œμ˜ 결과에 관계없이(즉 성곡, μ˜ˆμ™Έ 관계없이) νƒ€κ²Ÿ λ©”μ†Œλ“œκ°€ μ™„λ£Œ 되면 μ–΄λ“œλ°”μ΄μŠ€ κΈ°λŠ₯을 μˆ˜ν–‰
  • @AfterReturning (정상적 λ°˜ν™˜ 이후)νƒ€κ²Ÿ λ©”μ†Œλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ 결과값을 λ°˜ν™˜ 후에 μ–΄λ“œλ°”μ΄μŠ€ κΈ°λŠ₯을 μˆ˜ν–‰
  • @AfterThrowing (μ˜ˆμ™Έ λ°œμƒ 이후) : νƒ€κ²Ÿ λ©”μ†Œλ“œκ°€ μˆ˜ν–‰ 쀑 μ˜ˆμ™Έλ₯Ό λ˜μ§€κ²Œ 되면 μ–΄λ“œλ°”μ΄μŠ€ κΈ°λŠ₯을 μˆ˜ν–‰
  • @Around (λ©”μ†Œλ“œ μ‹€ν–‰ μ „ν›„) : μ–΄λ“œλ°”μ΄μŠ€κ°€ νƒ€κ²Ÿ λ©”μ†Œλ“œλ₯Ό κ°μ‹Έμ„œ νƒ€κ²Ÿ λ©”μ†Œλ“œ ν˜ΈμΆœμ „κ³Ό 후에 μ–΄λ“œλ°”μ΄μŠ€ κΈ°λŠ₯을 μˆ˜ν–‰
Back-End/spring/aop_basic.md