๐Ÿ’ป
Albert's Til
GitHub
  • ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๊ธฐ
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • ์˜ค๋ฅ˜ ์ฝ”๋“œ
      • ORM ๋„๊ตฌ
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • ๋””๋ฏธํ„ฐ ๋ฒ•์น™
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT ํ† ํฐ ์‚ฌ์šฉํ•œ ์ธ๊ฐ€
        • OAuth 2 Login
        • OAuth 2 ์ธ์ฆ
        • ์ธ๊ฐ€
        • ์ธ์ฆ
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud ์œ ํ˜•
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
        • ์—”์ง„์—‘์Šค(Nginx)
      • ์ฝ”๋“œ ์ž๋™ ๋ฐฐํฌ
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) ํ‚ค
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1์ฃผ์ฐจ ํšŒ๊ณ 
      • Spring Boot Project 2์ฃผ์ฐจ ํšŒ๊ณ 
      • Spirng Boot Project 3์ฃผ์ฐจ ํšŒ๊ณ 
      • Spring Boot Project 4์ฃผ์ฐจ ํšŒ๊ณ 
    • Foody Moody ํ”„๋กœ์ ํŠธ
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • ๊ธฐ์ˆ  ์Šคํƒ ์ ์šฉ ์ด์œ 
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • AOP์™€ OOP
  • AOP
  • ์ธํ”„๋ผ ๋กœ์ง
  • OOP
  • ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง
  • AOP ์šฉ์–ด
  • Aspect(๊ด€์ )
  • Join point (๊ฒฐํ•ฉ์ )
  • Pointcut (ํฌ์ธํŠธ์ปท)
  • Advice (์กฐ์–ธ)
  • Weaving (์œ„๋น™)
  • Filter:
  • Interceptor:
  • AOP:
  • Argument Resolver:
  • Filter, Interceptor, AOP์˜ ์žฅ๋‹จ์ 

Was this helpful?

  1. ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๊ธฐ
  2. Spring

Filter,Interceptor,AOP,Argument Resolver

AOP์™€ OOP

OOP๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ํ–‰์œ„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๋ฐ˜๋ฉด, AOP๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. AOP๋ฅผ ํ™œ์šฉํ•ด ์ธํ”„๋ผ ๋กœ์ง์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์€ ์ƒํ˜ธ ๋ณด์™„์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

AOP

๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์•ฝ์–ด๋กœ, ํ”„๋กœ๊ทธ๋žจ์˜ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(cross-cutting concern)๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์— ๊ฑธ์ณ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. AOP๋Š” ์ด๋Ÿฌํ•œ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ํ•„์š”ํ•œ ์œ„์น˜์—์„œ ์›๋ณธ ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AOP๋Š” ์ธํ”„๋ผ ๋กœ์ง ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ธํ”„๋ผ ๋กœ์ง

์ฃผ๋กœ ์‹œ์Šคํ…œ ๊ตฌ์ถ•๊ณผ ์šด์˜์„ ์œ„ํ•œ ๋กœ์ง์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋กœ๊น…, ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์ ์ธ ์ธก๋ฉด์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ๋Š” ๋กœ์ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ ๋กœ์ง์€ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ, ํ™•์žฅ์„ฑ, ๋ณด์•ˆ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์ ์ธ ์ธก๋ฉด์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ฃผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์„œ๋“œํŒŒํ‹ฐ ๋„๊ตฌ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

OOP

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์•ฝ์–ด๋กœ, ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. OOP์—์„œ๋Š” ๋ฐ์ดํ„ฐ์™€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด๋ผ๋Š” ๋‹จ์œ„๋กœ ์บก์Аํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š” ์ƒํƒœ์™€ ํ–‰์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. OOP๋Š” ์บก์Аํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ ๋“ฑ์˜ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ๋ชจ๋“ˆํ™”๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OOP๋Š” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๋น„์ง€๋‹ˆ์Šค ๋กœ์ง

ํŠน์ • ๋„๋ฉ”์ธ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์˜ ๊ทœ์น™, ํ”„๋กœ์„ธ์Šค, ์ž‘์—… ํ๋ฆ„ ๋“ฑ์„ ๋‹ค๋ฃจ๋Š” ๋กœ์ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์€ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๊ณ„์‚ฐ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์ ์šฉ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋กœ์ง์€ ์ฃผ๋กœ ๋„๋ฉ”์ธ ๋ชจ๋ธ, ์„œ๋น„์Šค, ์ปจํŠธ๋กค๋Ÿฌ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AOP ์šฉ์–ด

Aspect(๊ด€์ )

AOP์—์„œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™”ํ•œ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ์‚ฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์— ๊ฑธ์ณ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(cross-cutting concern)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์ด ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Aspect๋Š” ์ด๋Ÿฌํ•œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“ˆ์ด๋ฉฐ, AOP์—์„œ๋Š” ์ด๋Ÿฌํ•œ Aspect๋“ค์„ ์ •์˜ํ•˜๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Join point (๊ฒฐํ•ฉ์ )

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— Aspect๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ์ง€์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ์˜ˆ์™ธ ๋ฐœ์ƒ, ํ•„๋“œ ์ ‘๊ทผ ๋“ฑ์ด ๊ฒฐํ•ฉ์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AOP์—์„œ๋Š” ๊ฒฐํ•ฉ์ ์„ ์ •์˜ํ•˜๊ณ  ํ•ด๋‹น ์ง€์ ์— Aspect๋ฅผ ์ ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

๊ฒฐํ•ฉ์ ์˜ ํŒจํ„ด์„ ์ง€์ •ํ•˜์—ฌ Aspect๊ฐ€ ์ ์šฉ๋  ๊ฒฐํ•ฉ์ ์„ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

ํฌ์ธํŠธ์ปท์€ ํŠน์ • ๊ฒฐํ•ฉ์ ์„ ์„ ๋ณ„ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฒฐํ•ฉ์ ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜, ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๋“ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Advice (์กฐ์–ธ)

Aspect๊ฐ€ ๊ฒฐํ•ฉ์ ์— ์‚ฝ์ž…๋˜์–ด ์‹คํ–‰๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒฐํ•ฉ์  ์ „(before), ํ›„(after), ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ(around)์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.

Advice๋Š” Aspect๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ •์˜ํ•˜๊ณ , Aspect๊ฐ€ ์ ์šฉ๋˜๋Š” ์‹œ์ ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Weaving (์œ„๋น™)

AOP์—์„œ Aspect๋ฅผ ํƒ€๊ฒŸ ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„๋น™์€ ์ปดํŒŒ์ผ ์‹œ์ , ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ , ๋Ÿฐํƒ€์ž„ ์‹œ์  ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Aspect์™€ ํƒ€๊ฒŸ ์ฝ”๋“œ๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์ตœ์ข… ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Filter:

Servlet ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด,

    • ๋กœ๊น…, ์ธ์ฆ, ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด CharacterEncodingFilter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” Spring Security์—์„œ๋Š” Filter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • Request/Response์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์บ์‹œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Filter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Component
public class CustomFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ํ•„ํ„ฐ ์ดˆ๊ธฐํ™” ์ž‘์—…
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // ํ•„ํ„ฐ๋ง ์ž‘์—…
        chain.doFilter(request, response);
    }
 
    @Override
    public void destroy() {
        // ํ•„ํ„ฐ ์ข…๋ฃŒ ์ž‘์—…
    }
}

Interceptor:

Spring MVC์—์„œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ˜ธ์ถœ ์ „ํ›„์— ์‹คํ–‰๋˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „์— ๊ณตํ†ต์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด,

    • ๋กœ๊น…, ๊ถŒํ•œ ์ฒดํฌ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • ๋กœ๊น… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ๊ถŒํ•œ ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Interceptor๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@Component
public class CustomInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „ ์ž‘์—…
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ํ›„ ์ž‘์—…
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // ๋ทฐ ๋ Œ๋”๋ง ํ›„ ์ž‘์—…
    }
}

AOP:

Aspect Oriented Programming์˜ ์•ฝ์ž๋กœ, ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „ํ›„๋‚˜ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ์ ์— ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด,

    • ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ๋ณด์•ˆ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • HTTP ์š”์ฒญ์—์„œ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด Argument Resolver๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Aspect
@Component
public class CustomAspect {
 
    @Around("execution(* com.example.service.*.*(..))")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „ ์ฒ˜๋ฆฌ ์ž‘์—…
        Object result = joinPoint.proceed();
        // ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„ ์ฒ˜๋ฆฌ ์ž‘์—…
        return result;
    }
}

Argument Resolver:

Spring MVC์—์„œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ HTTP ์š”์ฒญ(request)์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด,

    • @RequestParam, @ModelAttribute, @PathVariable ๋“ฑ์˜ ์• ๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • @RequestParam์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ฒ˜๋ฆฌํ•œ๋‹ค

@Component
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {
 
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ธ์ง€ ํ™•์ธ
        return parameter.getParameterType().equals(CustomArgument.class);
    }
 
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // ๋ณ€ํ™˜ ์ž‘์—…
        CustomArgument customArgument = new CustomArgument();
        customArgument.setParam1(webRequest.getParameter("param1"));
        customArgument.setParam2(webRequest.getParameter("param2"));
        return customArgument;
    }
}

Filter, Interceptor, AOP์˜ ์žฅ๋‹จ์ 

Filter:

  • ์žฅ์ :

    • ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „/ํ›„์— ์ผ๊ด„์ ์ธ ๋กœ์ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณด์•ˆ, ์ธ์ฆ, ๋กœ๊น… ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์šฉ์ดํ•จ

    • ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ

  • ๋‹จ์ :

    • Spring ApplicationContext์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

      • Spring ApplicationContext์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ถ€ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. Spring ApplicationContext๋Š” ์Šคํ”„๋ง์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ApplicationContext๋ฅผ ์ด์šฉํ•˜์—ฌ Bean์„ ์ƒ์„ฑํ•˜๊ณ , ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Filter๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ApplicationContext์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ ApplicationContext๋ฅผ ์ด์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • DispatcherServlet ์ด์ „์— ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Spring MVC์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

      • Filter๋Š” DispatcherServlet ์ด์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด DispatcherServlet ์ดํ›„์— ์‹คํ–‰๋˜๋Š” Spring MVC์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋“ฑ์˜ ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, HandlerInterceptor๋Š” DispatcherServlet ์ดํ›„์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, Filter์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Interceptor:

  • ์žฅ์ :

    • HandlerMapping, HandlerAdapter ๋“ฑ Spring MVC์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „/ํ›„์— ์ผ๊ด„์ ์ธ ๋กœ์ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณด์•ˆ, ์ธ์ฆ, ๋กœ๊น… ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์šฉ์ดํ•จ

  • ๋‹จ์ :

    • Spring ApplicationContext์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

      • Interceptor๋Š” Filter์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ApplicationContext์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ApplicationContext๋ฅผ ์ด์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

AOP:

  • ์žฅ์ :

    • ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์„ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ

    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์™ธ์˜ ๊ธฐ๋Šฅ(ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ๋กœ๊น…, ๋ณด์•ˆ, ์บ์‹ฑ ๋“ฑ)์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•จ

    • OOP์˜ ๋‹คํ˜•์„ฑ๊ณผ ๊ฐ™์ด ์œ ์—ฐํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Œ

    • ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

  • ๋‹จ์ :

    • Proxy๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ

      • ์ด๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AOP๋Š” ๋Œ€๋ถ€๋ถ„ Proxy๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Proxy๋ฅผ ์ด์šฉํ•˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋กœ ์ธํ•ด ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋™์  ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ถ€ ๊ธฐ๋Šฅ์—์„œ๋Š” ์ œํ•œ์ ์ž„

      • ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ ์šฉํ•˜๊ธฐ์—๋Š” ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • AOP ์ž์ฒด๊ฐ€ ๋ณต์žกํ•œ ๊ฐœ๋…์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜์Œ์—๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AOP๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋กœ๊ทธ์™€ ๊ฐ™์€ ๋””๋ฒ„๊น… ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์„œ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ

      • ๋˜ํ•œ AOP๋Š” ๋””๋ฒ„๊น…์ด ์–ด๋ ต๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋“ฑ์˜ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ AOP๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ํŒ๋‹จํ•˜์—ฌ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Last updated 1 year ago

Was this helpful?