๐๊ฐ์ ์ ๋ฆฌ ๋ ธํธ (15) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [์คํ๋ง MVC 1] ์๋ธ๋ฆฟ, ํ ํ๋ฆฟ์์ง, MVC ํจํด (2) ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋์ ๋ฐฉ์ ์คํ๋ง๋ถํธ๊ฐ ๋ด์ฅ๋ ํฐ์บฃ์๋ฒ๋ฅผ ๋์ฐ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด ์์ฒญ์ request, response๊ฐ์ฒด๋ก ๋ง๋ค์ด์ Servlet๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ์ด Servelt๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ด๋ค. HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ์๋ธ๋ฆฟ์ด HttpServletRequest๊ฐ์ฒด๋ก ๋ด์์ ์ฌ์ฉํ๊ฒ ํธ๋ฆฌํ๊ฒ ํด์ค๋ค. `HttpServletRequest` => [๋ฉ์๋, URL์ ๋ณด, ์ฟผ๋ฆฌ์คํธ๋ง // ํค๋ // Body]์ ๊ฐ์ ์์ฒญ๋ฉ์์ง๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ. ๊ฐ์ ์์ฒญ์ ๊ฐ์ ์์ ์ ์ฅํ ์ ์๋ ๊ณต๊ฐ์ ์ ๊ณตํ๋ฉด ์ธ์ ๊ด๋ฆฌ๋ ์ ๊ณตํ๋ค. HTTP ์์ฒญ ๋ฐ์ดํฐ ๋ฐฉ์ 3๊ฐ์ง GET - ์ฟผ๋ฆฌํ๋ฆฌ๋ฏธํฐ `ex) url?username=hello?age=20` POST - HTML FORM ๋ฉ์์ง ๋ฐ๋.. [์คํ๋ง MVC 1] ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ดํด (1) ์น์๋ฒ ์ ์ ๋ฆฌ์์ค ์ ๊ณต ์ ์ HTML, CSS, ์ด๋ฏธ์ง, ์์ ์) NGINX, APACHE ํ์ง๋ง ์ฝํ ์ธ ์ ํฌ๊ธฐ๊ฐ ์๋ฐฑ ๋ฉ๊ฐ๋ฐ์ดํธ ๊ฐ์ด ๋งค์ฐ ํฐ ๊ฒฝ์ฐ๋ ๋ค์์ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์ด๋ฅผ ์์ฒญํ์ ๋ ์น์๋ฒ๋ '๋คํธ์ํฌ ๋์ญํญ', '๋ผ์ฐํฐ ๋์ญํญ', '์ผ์ด๋ธ ๋์ญํญ' ๊ฐ์ข ์ ํ์ ๋๋ฌํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ์ ํ์ ๊ฑธ๋ ค๋ฒ๋ฆฌ๋ฉด ์น์๋ฒ๋ ์ผ๋ฐ ์์ฒญ๋ ์ฒ๋ฆฌํ ์ ์๋ '๋ง๋น'์ํ๊ฐ ๋๋ค. ์ฝํ ์ธ ํฌ๊ธฐ๊ฐ ํฌ๊ฑฐ๋ ์์ฒญ์ด ๋ง์์ ์น์๋ฒ์ ์ ํ์ด ๊ฑธ๋ฆด ๋ ํด๊ฒฐ๋ฐฉ๋ฒ ๋ก๋๋ฐธ๋ฐ์๋ก ๋ค์์ ์น์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๊ณ ์ฝํ ์ธ ์ถ๊ฐ์ ๋์ํ๊ธฐ ์ํด ๋คํธ์ํฌ ๋์ญ์ด ๋์ '๋ฏธ๋์ด ์ฝํ ์ธ ์๋ฒ'๋ฅผ ๋ฐ๋ก ๋๋ค. ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ฉด ์ฝํ ์ธ ์ ์ ์ก ์๋๊ฐ ๋๋ ค์ง๋ฏ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ฝํ ์ธ ์๋ฒ๋ฅผ ๋ฐฐ์นํ์ฌ ํธ๋ํฝ์ ๋ถ์ฐ์ํฌ ์ ์๋ค. ํ.. [Spring Cloud๋ก ๊ตฌํํ๋ ๋ง์ดํฌ๋ก์๋น์ค] Section. 12 ์ฅ์ ์ฒ๋ฆฌ์ Microservice ๋ถ์ฐ ์ถ์ & ๋ชจ๋ํฐ๋ง Circuit Breaker - ์ฅ์ ๊ฐ ๋ฐ์ํ๋ ์๋น์ค์ ๋ฐ๋ณต์ ์ธ ํธ์ถ์ด ๋์ง ๋ชปํ๊ฒ ์ฐจ๋จ - ํน์ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ๋์ฒด ์ํ ์ฐ๊ด๋ ์๋น์ค๊ฐ ํน์ ํ๊ณ์น ์ด์ ์คํจํ๋ค๋ฉด Circuit Breaker๋ Open. (์ฐจ๋จ or ๋์ฒด ๊ธฐ๋ฅ) ์ ์ ์๋ํ๋ค๋ฉด Circuit Breaker๋ Closed. Mircroservice ํต์ ์ ์ฐ์ ์ค๋ฅ USER์๋น์ค์ ์ฐ๊ด๋ ์๋น์ค๊ฐ ๋์ํ์ง ์์ ๋ ๋์ฒํ ๋ฐฉ์์ด ์์ด์ผํ๋ค. Resilience4j์์ Circuit breaking์ ํฌํจํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ก Customizerํ์ผ์ ์ ์ํด์ ์ํท๋ธ๋ ์ด์ปค ์์ธ ์ค์ ์ด๋ ์๊ฐ ์ ํ ์ค์ ์ ์์ธํ ์ ํ ์ ์๋ค. ๊ฐ๋จํ๊ฒ๋ ์์กด์ฑ์ ์ถ๊ฐํ๊ณ ์ค์ ์ ์๋ตํ๊ณ Ci.. [Spring Cloud๋ก ๊ตฌํํ๋ ๋ง์ดํฌ๋ก์๋น์ค] Section. 11 ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์ํ Kafka ํ์ฉ Apache Kafka - ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค ํ๋ก์ ํธ - ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํต์ผ๋ ๋์ ์ฒ๋ฆฌ๋, ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ง๋ ํ๋ซํผ ์ ๊ณต Kafka๊ฐ ๋์ค๊ฒ ๋ ๋ฐฐ๊ฒฝ ๋ฐ์ดํฐ๊ฐ ๋ง์๋ ํ์ฅ์ด ์ฉ์ดํ ์์คํ Kafka Broker ์คํ๋ kafka ์๋ฒ 3๋ ์ด์์ ๋ธ๋ก์ปค ํด๋ฌ์คํฐ ๊ตฌ์ฑ ์ค์ ์ฝ๋๋ค์ดํฐ๋ก 'Zookeeper' ์ฐ๋ ๋ฉํ๋ฐ์ดํฐ (Broker ID, Controller ID ์ ์ฅ) ๋ฆฌ๋ ๋ธ๋ก์ปค ๋ฌธ์ ๋ฐ์ ์ ์ฅ์ ๋์ํ๋ ์ญํ ๋๊ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ์๋นํ๋์ง ์ ๊ฒฝ์ฐ์ง์๊ณ ๋ฉ์์ง๋ฅผ ๊ตํํ๋ค. - kafka client JAVA, Python, Go, C++ ๋ฑ ๋ง์ ์ธ์ด๋ฅผ ์ง์ํ๋ค. Kafka ์คํํด๋ณด๊ธฐ Zookeeper ์คํ ./bin/zookeeper-server-start.. [Spring Cloud๋ก ๊ตฌํํ๋ ๋ง์ดํฌ๋ก์๋น์ค] Section. 10 ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ํต์ ๋๊ธฐ Http ํต์ AMQP๋ฅผ ํตํ ๋น๋๊ธฐ ํต์ (Config์๋ฒ์์ ๊ฐ ์๋น์ค๋ก ์ค์ ์ ๋ณด ๋๊ฒจ์ค๋ ์ฌ์ฉํ์) RestTemplate FeignClient - Rest Call์ ์ถ์ํํ Spring Cloud Netflix ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ธ ์ฒ๋ฆฌ Multiple Order Service - Users์ ์์ฒญ ๋ถ์ฐ ์ฒ๋ฆฌ - Orders ๋ฐ์ดํฐ ๋ถ์ฐ ์ ์ฅ -> ๋๊ธฐํ ๋ฌธ์ ๋ฐ์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค. ๋ ๊ฐ์ ์๋น์ค ์ธ์คํด์ค ์ฌ์ฉ ์ ๋ฐ์ํ๋ ๋ฌธ์ ํ๋์ ์ ์ ๊ฐ order์๋น์ค์ ์ฃผ๋ฌธ ์์ฒญ์ ๋ฃ์ผ๋ฉด ๋ถํ๋ถ์ฐ ์ฒ๋ฆฌ์ ์ํด ๊ฐ๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค์ DB์ ์ ์ฅ๋๋ค. *ํด๊ฒฐ๋ฐฉ๋ฒ* 1. ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (๋์์ฑ, ํธ๋์ญ์ ๋ฌธ์ ๋ฐ์ํ๋ ํด๊ฒฐํด์ผํจ) 2. ๋ ๋ฐ.. [Spring Cloud๋ก ๊ตฌํํ๋ ๋ง์ดํฌ๋ก์๋น์ค] Section. 9 ์ํธ์ฐจ ์ฒ๋ฆฌ๋ฅผ ์ํ Encryption๊ณผ Decryption Encryption types (์ํธํ ํ์ ) Symmetric Encryption (์๋ณตํธํ ๊ฐ์ ํค) Asymmetric Encryption (์๋ณตํธํ ๋ค๋ฅธ ํค)[private - public key] ์.๋ณตํธํ ๊ตฌ์ฑ๋ ์ํธํ๋์ด ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋ณตํธํํ์ฌ ๋ง์ดํฌ๋ก์๋น์ค์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ์.๋ณตํธํ ์ฌ์ฉํด๋ณด๊ธฐ config-server์ 'ecrypt.key' ๊ฐ์ bootstrap.yml์ ์ค์ ํด๋๋ค. ์๋ฒ๋ฅผ ์ฌ์คํํ์ฌ 'POST /encrypt'๋ฅผ ํตํด ์ํธํ๋ฅผ 'POST /decrypt'๋ฅผ ํตํด ๋ณตํธํ๋ฅผ ์งํํ ์ ์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ์ ๋ณด ์๋ณตํธํ ์ ์ฉ user๋ง์ดํฌ๋ก์๋น์ค์ ์๋ datasource์ค์ ์ ๋ณด๋ฅผ password ์ํธํํ์ฌ config-server์ user-service.y.. [Spring Cloud๋ก ๊ตฌํํ๋ ๋ง์ดํฌ๋ก์๋น์ค] Section. 8 Spring Cloud Bus๋ฅผ ์ด์ฉํ ์ค์ ์ ๋ณด ๋ณ๊ฒฝ Spring Cloud Bus ์ด์ ์ ์ฌ์ฉํ๋ Actuator Refresh๋ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์๋ฐฑ๊ฐ๋ผ๊ณ ํ๋ฉด config์ ๋ณด๊ฐ ๋ฐ๋๋ฉด ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์ refresh๋ฅผ ๋ชจ๋ ์์ฒญํด์ผํ๋ ๋จ์ ์ด ์๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด Spring Cloud Bus๋ฅผ ์ฌ์ฉํด๋ณด์. AMQP (๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด๋ฅผ ์ํ ๊ฐ๋ฐฉํ ํ๋กํ ์ฝ) - ๋ฉ์์ง ์งํฅ, ํ์, ๋ผ์ฐํ (Publisher-Subscriber), ์ ๋ขฐ์ฑ, ๋ณด์ - Erlang, RabbitMQ์์ ์ฌ์ฉ Kafkaํ๋ก์ ํธ (์คํ์์ค๋ฉ์์ง๋ธ๋ก์ปคํ๋ก์ ํธ) - ๋ถ์ฐํ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ - ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ RabbitMQ vs. Kafka Spring Cloud Bus ์ฌ์ฉํ๊ธฐ ๋ณ๊ฒฝ๋ ์ฌํญ์ Cloud Bus์ ์๋ฆฌ๊ณ Cloud Bus๊ฐ Con.. [Spring Cloud๋ก ๊ตฌํํ๋ ๋ง์ดํฌ๋ก์๋น์ค]Section.7 Configuration Service application๋ด๋ถ์์ ๊ตฌ์ฑ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋ ์ธ๋ถ ์์คํ ์ ํตํด์ ๊ตฌ์ฑ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋๋ก ํจ. Spring Cloud Config ๋ถ์ฐ ์์คํ ์์ ์๋ฒ, ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ ํ์ํ ์ ๋ณด๋ฅผ ์ธ๋ถ ์์คํ ์์ ๊ด๋ฆฌ ํ๋์ ์ค์ํ ๋ ์ ์ฅ์์์ ๊ตฌ์ฑ์์ ๊ด๋ฆฌ ๊ธฐ๋ฅ ๊ฐ ์๋น์ค๋ฅผ ๋ค์ ๋น๋ํ์ง ์๊ณ , ๋ฐ๋ก ์ ์ ๊ฐ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ํตํด DEV-UAT-PRODํ๊ฒฝ์ ๋ง๋ ๊ตฌ์ฑ ์ ๋ณด ์ฌ์ฉ ํ์๊ด๋ฆฌ, ์ํธํ๋ ๋ฐ์ดํฐ, ํ์ผ์ ์ฅ์ ๊ฐ๊ฐ์ ์ค์ ์ ๋ณด๋ฅผ ํ๋ฐ ๋ชจ์ ์ ์ฉํ ์ ์๋ค. ๋ํ ๋ชจ์์ง ์ค์ ์ ๋ณด๋ฅผ DEV, PROD ํ๊ฒฝ์ ๋ง๊ฒ ์ค์ ํ ์๋ ์๋ค. (application-dev.yml, application-prod.yml) Changed configuration values (๋ณ๊ฒฝ๋ C.. ์ด์ 1 2 ๋ค์