# ๐ŸŽ€ 2020-10-10 BE ๊ณต๋ถ€๋ฐฉ ๐ŸŽ€ ## 1. ๋ฌด์—‡์„ ๊ณต๋ถ€ํ•ด๋ณผ๊นŒ์š”? - ๋™๊ธฐ? ๋น„๋™๊ธฐ? - ๋ธ”๋กœํ‚น? ๋…ผ๋ธ”๋กœํ‚น? ---------- - Netty ํƒœ๋ฆฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ ๊ณ ์„ฑ๋Šฅ ํ”„๋กœํ† ์ฝœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ **๋น„๋™๊ธฐ์‹ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ** Netty๋ฅผ ์จ์•ผํ•˜๋Š” ์ด์œ ? 1. ๊ณ ์„ฑ๋Šฅ 2. ์“ฐ๊ธฐ ํŽธํ•˜๋‹ค.(์œ ์—ฐํ•˜๊ณ  ์‰ฝ๋‹ค) Netty๊ฐ€ ๊ณ ์„ฑ๋Šฅ์ธ ์ด์œ ๋Š”? - Non-Blocking Asynchronous ์ฒ˜๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ - ์ ์€ ์Šค๋ ˆ๋“œ๋กœ ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ - GC๋ถ€ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” Zero-copy ByteBuf ์ง€์› Netty๊ฐ€ ์“ฐ๊ธฐ ํŽธํ•œ ์ด์œ ๋Š”? - ๊ฐ์ข… ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ(์ฝ”๋ฑ) ๊ธฐ๋ณธ ์ง€์› - ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์‰ฝ๊ฒŒ ์กฐ๋ฆฝํ•ด ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ - ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ฒ˜๋ฆฌ ์—†์ด๋„..? NIO(non-blocking input output)? ๊ธฐ์กด์˜ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•  ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•ด์•ผํ•จ(1:1r๊ด€๊ณ„) ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ• ๊ฒฝ์šฐ ๊ทธ ์ˆ˜๋งŒํผ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ -> ๋ฆฌ์†Œ์Šค๋‚ญ๋น„, ๋ฌดํ•œ๋Œ€๊ธฐํ˜„์ƒ ๋ฐœ์ƒ => ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด NIOํƒ„์ƒ (๋น„๋™๊ธฐ) - ํด๋ผ์ด์–ธํŠธ ๋‹น ์Šค๋ ˆ๋“œ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ์—๊ฒŒ ํ†ต์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์ ์ธ ํ†ต์‹  ๊ตฌ์กฐ ๊ฐ€๋Šฅ ===> ์ˆœ์ˆ˜ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ด๋Ÿฌํ•œ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๋Š”๊ฒƒ์€ ์–ด๋ ต ======> ์ด๊ฑธ ์ด๋ฏธ ๊ตฌํ˜„ํ•ด์„œ ๋„์™€์ฃผ๋Š” ์• ๊ฐ€ ๋„คํ‹ฐ - Netty vs Servlet Container - Servlet+Servlet Container - Servlet ์›นํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•˜๋Š” Servlet ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ ๊ทœ์น™์„ ์ง€ํ‚จ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ , ์ฆ‰ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‘๋‹ตํ•˜๋Š” ์—ญํ• . - ํŠน์ง• 1. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•ด ๋™์ ์œผ๋กœ ์ž‘๋™ 1. Java Thread๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ž‘ 1. mvc ํŒจํ„ด์—์„œ Controller๋กœ ์ด์šฉ - Servlet Container (vs. WAS??) ์„œ๋ธ”๋ฆฟ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์ปจํ…Œ์ด๋„ˆ. (์„œ๋ธ”๋ฆฟ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•ด์„œ ์Šค์Šค๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ) ์ฆ‰, servlet์— ๋ช…์‹œ๋˜์–ด ์žˆ๋Š”๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์š”์ฒญ์„ ๋ฐ›๊ณ  ์‘๋‹ต์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์›น์„œ๋ฒ„์™€ ์†Œ์ผ“์„ ๋งŒ๋“ค์–ด ํ†ต์‹ ํ•œ๋‹ค. - ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์š”์ฒญ์ด ์˜ฌ ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ž๋ฐ” ์“ฐ๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๋Š”๋ฐ, HTTP ์„œ๋น„์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด, ์“ฐ๋ ˆ๋“œ๋Š” ์ž๋™์œผ๋กœ ์—†์–ด์ง. ์ „์†กํ•˜๋Š” Servlet ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ ๊ทœ์น™์„ ์ง€ํ‚จ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ  --------- ์—ฐ์ฃผ - ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ(SaaS) - ์™œ ํ•„์š”ํ•ด? - ์„œ๋น„์Šค ํ™•์žฅ์„ฑ - ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์‰ฝ๊ฒŒ ๋ฐฐํฌ๊ฐ€๋Šฅ - ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ ์ง€์†์ ์ธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅ - ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Security Spring Security์—์„œ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค(OAuth2, JWT, ๊ธฐ๋ณธ์ธ์ฆ)๋ฅผ Cloud์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ์žฅ์ ์€ Cloud์—์„œ ์‚ฌ์šฉํ•˜๋Š” API Gateway์— ์ธ์ฆ ๊ณผ์ •์„ ๋„ฃ๊ธฐ ํŽธํ•˜๋„๋ก ํ•ด์ค€๋‹ค. - JWT+Spring Security์˜ ๋ฌธ์ œ์  - ๋งค ์š”์ฒญ๋งˆ๋‹ค ์‚ฌ์šฉ์ž๋””ํ…Œ์ผ์„œ๋น„์Šค์˜ ์‚ฌ์šฉ์žDB์— ๋“ค๋Ÿฌ ํ™•์ธํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ๋‹ค - Spring Security vs Spring Cloud Security - Spring Cloud๋Š” Spring Cloud Gateway๋ฅผ ์ง€์›ํ•ด์ค€๋‹ค. Gateway์—์„œ Security๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. - ํ•˜์ง€๋งŒ ํ•„์ž๋Š” 1) ๋งค์š”์ฒญ๋งˆ๋‹ค DB์— ๋“ค๋Ÿฌ ์‚ฌ์šฉ์ž๋””ํ…Œ์ผ์„œ๋น„์Šค ํ™•์ธ 2) ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Security๋ฅผ ์‚ฌ์šฉ - ์ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฑ„ํƒํ•˜์ง€ ์•Š๊ณ  cutom global filter๋ฅผ ๋งŒ๋“ค์–ด ๊ฒŒ์ดํŠธ์›จ์ด์— ์ ์šฉํ–ˆ๋‹ค. - Spring Cloud Zuul vs Spring Cloud Gateway - Spring Cloud์˜ ์ดˆ์ฐฝ๊ธฐ ๋ฒ„์ „์—์„œ๋Š” Netfilx OSS(Open Source Software)์— ํฌํ•จ๋œ ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜๋กœ์„œ API Gateway ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” Zuul ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ Spring Cloud + Zuul์˜ ํ˜•ํƒœ๋ฅผ Spring Cloud Zuul์ด๋ผ๊ณ  ํ•œ๋‹ค. Zuul์€ ์„œ๋ธ”๋ฆฟ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ(Synchronous), ๋ธ”๋กœํ‚น(Blocking) ๋ฐฉ์‹์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. - ๊ทธ๋Ÿฌ๋‹ค ์ตœ๊ทผ(?) ๋น„๋™๊ธฐ(Asynchronous), ๋…ผ๋ธ”๋กœํ‚น(Non-Blocking) ๋ฐฉ์‹์ด ๋Œ€์„ธ๊ฐ€ ๋˜๋ฉด์„œ ํ•ด๋‹น ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋Š” Zuul2๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. - ํ•˜์ง€๋งŒ Zuul์€ Spring ์ƒํƒœ๊ณ„์˜ ์ทจ์ง€์™€ ๋งž์ง€ ์•Š์•„, Spring Cloud Gateway์—์„œ๋Š” Zuul2๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  API Gatewway ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” Spring Cloud Gateway๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. - Spring Cloud Gateway๋„ Zuul2์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋™๊ธฐ, ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค. ๋˜ํ•œ Spring ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— Spring ์„œ๋น„์Šค์™€์˜ ํ˜ธํ™˜๋„ ์ข‹๋‹ค. ๋” ๋‚˜์•„๊ฐ€ ์ตœ๊ทผ์— Zuul2์™€ Spring Cloud Gateway์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๋Š” ๊ธ€์ด ๋งŽ์ด ์˜ฌ๋ผ์˜ค๋Š”๋ฐ Spring Boot2์™€ Spring Cloud2๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ ๋œ ์ดํ›„์—๋Š” Spring Cloud Gateway๊ฐ€ ์„ฑ๋Šฅ์ด ๋” ์ข‹๋‹ค๋Š” ๋ถ„์„๋„ ์žˆ๋‹ค(์ฐธ๊ณ ) - Spring Cloud Gateway๋Š” Netty ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋•Œ๋ฌธ์— ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋‚˜ WAR๋กœ ๋นŒ๋“œ๋œ ๊ฒฝ์šฐ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ## ์ฐธ๊ณ ์ž๋ฃŒ [[API Gateway + Refresh JWT ์ธ์ฆ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ] Spring boot + Spring Cloud Gateway + Redis + mysql JPA 1ํŽธ](https://velog.io/@tlatldms/API-Gateway-Refresh-JWT-%EC%9D%B8%EC%A6%9D%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-Spring-boot-Spring-Cloud-Gateway-Redis-mysql-JPA-1%ED%8E%B8)