λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Spring

Spring message ChannelInterceptor λ©”μ„œλ“œ νŠΉμ§•

by ν‘μ‹œλ°” 2023. 7. 23.

πŸ™„ λ°°κ²½

ν”„λ‘œμ νŠΈμ—μ„œ Websocket + STOMPλ₯Ό ν™œμš©ν•˜μ—¬ μ ‘μ†μž μ—¬λŸ¬ λͺ…이 λ™μ‹œμ— μž‘μ—…ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•΄μ•Ό ν•˜λŠ” 과정이 μžˆμ—ˆλ‹€. λ©”μ‹œμ§•μ„ μ „μ†‘ν•˜κΈ° μ „κ³Ό 후에 νŠΉμ • 처리λ₯Ό ν•΄μ•Όν•˜λŠ” 과정이 μžˆμ—ˆλŠ”λ°, κ·Έλ•Œ ChannelInterceptor μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄ μ•Œκ²Œ λ˜μ—ˆλ‹€.

ChannelInterceptor

ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  λ“±λ‘ν•˜μ—¬, λ©”μ‹œμ§€κ°€ 솑/μˆ˜μ‹ λ˜κΈ° μ „ λ©”μ‹œμ§€μ˜ 데이터 검증 및 λ³€ν™˜μ„ ν•  수 μžˆλ‹€.

ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λŠ” 총 6개의 λ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  있으며 κΈ°λŠ₯은 λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€.

1. preSend()

- λͺ¨λ“  μœ ν˜•μ˜ 채널에 λŒ€ν•΄ ν˜ΈμΆœλœλ‹€.

- λ©”μ‹œμ§€κ°€ μ‹€μ œλ‘œ μ±„λ„λ‘œ μ „μ†‘λ˜κΈ° 전에 ν˜ΈμΆœλœλ‹€.

- λ©”μ‹œμ§€(Message)와 MessageChannel에 λŒ€ν•œ μ°Έμ‘°λŠ” 인터셉터 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

- ν•΄λ‹Ή μ‹œμ μ„ ν™œμš©ν•΄μ„œ νŠΉμ • 처리만 ν•˜λŠ” 경우(λ©”μ‹œμ§€ μˆ˜μ • X), λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ λ™μΌν•œ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.

-  null을 λ°˜ν™˜ν•˜μ—¬ λ©”μ‹œμ§€ preSend()의 전솑을 막을 μˆ˜λ„ μžˆλ‹€.

2. postSend()

- λͺ¨λ“  μœ ν˜•μ˜ 채널에 λŒ€ν•΄ ν˜ΈμΆœλœλ‹€.

MessageChannel.send() 호좜 직후에 ν˜ΈμΆœλœλ‹€.

- sent λ§€κ°œλ³€μˆ˜(boolean)λŠ” λ©”μ‹œμ§€ μ‹œλ„κ°€ μ„±κ³΅ν–ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

3. preReceive()

- 폴링 κ°€λŠ₯ν•œ 채널(PollableChannel)에 λŒ€ν•΄μ„œλ§Œ ν˜ΈμΆœλœλ‹€.

- PollableChannel.receive() λ©”μ„œλ“œμ— μ˜ν•΄ λ©”μ‹œμ§€κ°€ λ°˜ν™˜λ˜κΈ° 전에 ν˜ΈμΆœλœλ‹€.

- falseλ₯Ό λ°˜ν™˜ν•˜λ©΄ λ©”μ‹œμ§€ 전달이 μ°¨λ‹¨λœλ‹€.

4. postReceive()

- 폴링 κ°€λŠ₯ν•œ 채널(PollableChannel)에 λŒ€ν•΄μ„œλ§Œ ν˜ΈμΆœλœλ‹€.

-  PollableChannel.receive() λ©”μ„œλ“œκ°€ μ „λ‹¬λœ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©ν•˜λ©°, μˆ˜μ‹  λ©”μ„œλ“œλ‘œ λ°˜ν™˜ν•˜κΈ° 직전에 ν˜ΈμΆœλœλ‹€.

-  ν•΄λ‹Ή μ‹œμ μ„ ν™œμš©ν•΄μ„œ νŠΉμ • 처리만 ν•˜λŠ” 경우(λ©”μ‹œμ§€ μˆ˜μ • X), λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ λ™μΌν•œ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.

5. afterSendCompletion()

- μ˜ˆμ™Έ λ°œμƒ 여뢀에 관계없이 μˆ˜μ‹  μ™„λ£Œ ν›„ ν˜ΈμΆœλœλ‹€.

- μ μ ˆν•œ λ¦¬μ†ŒμŠ€ 정리가 κ°€λŠ₯ν•˜λ‹€.

- preSend()κ°€ λ©”μ‹œμ§€(Message)λ₯Ό λ°˜ν™˜ν•˜λŠ” κ²½μš°μ—λ§Œ ν˜ΈμΆœλœλ‹€.

- preSend()κ°€ null을 λ°˜ν™˜ν•˜λŠ” 경우 ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

6. afterReceiveCompletion()

- μ˜ˆμ™Έ λ°œμƒ 여뢀에 관계없이 μˆ˜μ‹  μ™„λ£Œ ν›„ ν˜ΈμΆœλœλ‹€.

- μ μ ˆν•œ λ¦¬μ†ŒμŠ€ 정리가 κ°€λŠ₯ν•˜λ‹€.

- preReceive()κ°€ trueλ₯Ό λ°˜ν™˜ν•˜λŠ” κ²½μš°μ—λ§Œ ν˜ΈμΆœλœλ‹€.

REFERENCE

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/messaging/support/ChannelInterceptor.html

λŒ“κΈ€