# ๐ 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)