Skip to content
This repository was archived by the owner on Dec 13, 2020. It is now read-only.

Latest commit

ย 

History

History
85 lines (69 loc) ยท 5.33 KB

File metadata and controls

85 lines (69 loc) ยท 5.33 KB

Spring AOP ์˜ ์ดํ•ด

  • Spring ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ DI ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์ค€๋‹ค๋ฉด,
  • AOP ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ฑธ์ณ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

AOP (Aspect-Oriented Programming)

  • ๊ด€์ (๊ด€์‹ฌ) ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด์„๋˜๋Š”๋ฐ ๋‹จ์–ด๊ฐ€ ์™€๋‹ฟ์ง€ ์•Š์•„์„œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์„ ๋ฐ”๊พผ๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ฆ‰, ๋Œ€์ƒ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ์ž.

์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋ดค๋‹ค๋Š” ์ „์ œ ํ•˜์— ์„ค๋ช…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
๋ถ€๊ฐ€๊ธฐ๋Šฅ์˜ ๊ด€์ ์—์„œ ๋ฐ”๋ผ๋ณด๋ฉด ๊ฐ๊ฐ์˜ Service ๋Š” ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ์ธก์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” before, after ๋ฉ”์†Œ๋“œ๊ฐ€ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
AOP ๋Š” ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ์กด OOP ์—์„œ ๋ฐ”๋ผ๋ณด๋˜ ๊ด€์ ์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ ์ธ ์ธก๋ฉด์—์„œ ๋ดค์„ ๋•Œ ๊ณตํ†ต๋œ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•˜์ž๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด๋•Œ ๊ฐ€๋กœ(ํšก๋‹จ) ์˜์—ญ์˜ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ์ž˜๋ผ๋ƒˆ๋‹ค๊ณ  ํ•˜์—ฌ, AOP ๋ฅผ Cross-Cutting ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • OOP : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ชจ๋“ˆํ™”
    • ๋ชจ๋“ˆํ™”์˜ ํ•ต์‹ฌ ๋‹จ์œ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
  • AOP : ์ธํ”„๋ผ ํ˜น์€ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์˜ ๋ชจ๋“ˆํ™”
    • ์˜ˆ: ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ๋ณด์•ˆ ๋“ฑ
    • ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์˜ ์ฃผ ๋ชฉ์  ์™ธ์— ํ•„์š”ํ•œ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค

AOP ๋Š” ์–ธ์ œ ์‚ฌ์šฉ๋˜๋Š”๊ฐ€

  • ์„ฑ๋Šฅ ๊ฒ€์‚ฌ
  • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ
  • ๋กœ๊น…
  • ์˜ˆ์™ธ ๋ฐ˜ํ™˜
  • ๊ฒ€์ฆ

์‹ค ์˜ˆ๋กœ, @Transactional, @Cache ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ AOP ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

AOP ์˜ ์žฅ์ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ํฉ์–ด์ง„ ๊ณตํ†ต ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜์˜ ์žฅ์†Œ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์ 
  • ๋‹ค๋ฅธ ์„œ๋น„์Šค ๋ชจ๋“ˆ๋“ค์ด ๋ณธ์ธ์˜ ๋ชฉ์ ์—๋งŒ ์ถฉ์‹คํ•˜๊ณ  ๊ทธ์™ธ ์‚ฌํ•ญ๋“ค์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ 

AOP ์šฉ์–ด

  • ์•„๋ž˜ ์šฉ์–ด๋“ค์€ Spring ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ AOP ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต์šฉ์–ด์ž…๋‹ˆ๋‹ค.

ํƒ€๊ฒŸ (Target)

  • ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•  ๋Œ€์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„  ํ•ต์‹ฌ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” getBoards, getUsers ๋ฅผ ํ•˜๋Š” Service ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์• ์ŠคํŽ™ํŠธ (Aspect)

  • ๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋“ˆ์„ ์˜ค๋ธŒ์ ํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ๋ชจ๋“ˆ์„ ์• ์ŠคํŽ™ํŠธ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
    • ํ•ต์‹ฌ๊ธฐ๋Šฅ์— ๋ถ€๊ฐ€๋˜์–ด ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ํŠน๋ณ„ํ•œ ๋ชจ๋“ˆ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๋ถ€๊ฐ€๋  ๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ ์–ด๋“œ๋ฐ”์ด์Šค ์™€ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์–ด๋””์— ์ ์šฉํ•  ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํฌ์ธํŠธ์ปท ์„ ํ•จ๊ป˜ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ AOP (Aspect Oriented Programming) ๋ผ๋Š” ๋œป ์ž์ฒด๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ, ์• ์ŠคํŽ™ํŠธ๋ผ๋Š” ๋…ํŠนํ•œ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

์–ด๋“œ๋ฐ”์ด์Šค (Advice)

  • ์‹ค์งˆ์ ์œผ๋กœ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด์€ ๊ตฌํ˜„์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ํƒ€๊ฒŸ ์˜ค๋ธŒ์ ํŠธ์— ์ข…์†๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์• ์ŠคํŽ™ํŠธ๊ฐ€ ๋ฌด์—‡ ์„ ์–ธ์ œ ํ• ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ JoinPoint ์— ์‚ฝ์ž…๋˜์–ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ

ํฌ์ธํŠธ์ปท (PointCut)

  • ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ์ ์šฉ๋  ๋Œ€์ƒ(๋ฉ”์†Œ๋“œ)๋ฅผ ์„ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ์กฐ์ธํฌ์ธํŠธ๋ฅผ ์„ ๋ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ ๋ชจ๋“ˆ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์–ด๋–ค ํด๋ž˜์Šค์˜ ์–ด๋А JoinPoint ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •

์กฐ์ธํฌ์ธํŠธ (JoinPoint)

  • ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ AOP ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋‹ฌ๋ฆฌ Spring ์—์„œ๋Š” ๋ฉ”์†Œ๋“œ ์กฐ์ธํฌ์ธํŠธ๋งŒ ์ œ๊ณต ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ Spring ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์กฐ์ธํฌ์ธํŠธ๋ผ ํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ์ด ์‚ฝ์ž…๋˜์–ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŠน์ • ์œ„์น˜

ํ”„๋ก์‹œ (Proxy)

  • ํƒ€๊ฒŸ์„ ๊ฐ์‹ธ์„œ ํƒ€๊ฒŸ์˜ ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›์•„์ฃผ๋Š” Wrapping ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ์ž(Client)์—์„œ ํƒ€๊ฒŸ์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ํƒ€๊ฒŸ์ด ์•„๋‹Œ ํƒ€๊ฒŸ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ํ”„๋ก์‹œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด,
    ํƒ€๊ฒŸ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „์— ์„ ์ฒ˜๋ฆฌ, ํƒ€๊ฒŸ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„, ํ›„์ฒ˜๋ฆฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํŠธ๋กœ๋•์…˜ (Introduction)

  • ํƒ€๊ฒŸ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ์—†์ด ์‹ ๊ทœ ๋ฉ”์†Œ๋“œ๋‚˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์œ„๋น™ (Weaving)

  • ์ง€์ •๋œ ๊ฐ์ฒด์— ์• ์ŠคํŽ™ํŠธ๋ฅผ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • PointCut ์— ์˜ํ•ด ๊ฒฐ์ •๋œ JoinPoint ์— ์ง€์ •๋œ Advice ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ • (CrossCutting)
  • ์˜ˆ๋ฅผ ๋“ค์–ด, A ๋ผ๋Š” ๊ฐ์ฒด์— ํŠธ๋žœ์žญ์…˜ ์• ์ŠคํŽ™ํŠธ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • A ๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „, ์ปค๋„ฅ์…˜์„ ์˜คํ”ˆํ•˜๊ณ 
      ์‹คํ–‰์ด ๋๋‚˜๋ฉด ์ปค๋„ฅ์…˜์„ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ ,
      ์ด ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์•ž์œผ๋กœ A ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      ์ด๋•Œ์˜ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์„ ์œ„๋น™ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ ํƒ€์ž„, ํด๋ž˜์Šค ๋กœ๋“œ ํƒ€์ž„, ๋Ÿฐํƒ€์ž„๊ณผ ๊ฐ™์€ ์‹œ์ ์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ, Spring AOP ๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.