Spring Framework/Spring & Spring Boot
์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentPrincipalName = authentication.getName(); UserDetails userDetails = (UserDetails) authentication.getPrincipal(); ์์ ์๋ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ด์ฉํด์ ์ ์ ๋ฅผ ๋ถ๋ฌ์๋ค. SecurityContext์ ์ธ์ฆ๋ Authentication ๊ฐ์ฒด๋ฅผ ๋ฃ์ด๋๊ณ ํ์ฌ ์ค๋ ๋ ๋ด์์ ๊ณต์ ๋์ด ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด getName()๋ง ๋ถ๋ฅผ ์๋ฐ์ ์๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ ์๋..
Spring Framework/JPA
์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ์คํ์ํค๋ฉด ์์ ๊ฐ์ WARN์ด ํ์๋๋ค. spring.jpa.open-in-view์ ๊ธฐ๋ณธ๊ฐ์ true์ด๋ฉฐ ํด๋นํ๋ WARN์ false ๊ฐ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ์์ด์ง๋ค. ๋ฐฐํฌ์ฉ ์ชฝ yml ํ์ผ์ spring.jpa.open-in-view๋ฅผ false๋ก ํด์ฃผ์๊ณ , ๋ก์ปฌ ์ชฝ์๋ ๋ณ๋ค๋ฅธ ์ง์ ์ ํ์ง ์๊ณ ๋ฐฐํฌํ๋๋ ๋ฐฐํฌ ์ฌ์ดํธ์์ ๊ธ ์ ์ฒด๊ฐ ์กฐํ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ๋ค. open-in-view:false ๋ฅผ ์ฃผ์์ฒ๋ฆฌํ๋ ๋คํํ ๊ธ ์ ์ฒด ์กฐํ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋ค. open-in-view๊ฐ ๋ฌด์์ด๊ธธ๋ ์กฐํ์ ์ํฅ์ ๋ฏธ์น๋์ง ์์๋ณด๊ฒ ๋ค! ๋๋ณด๊ธฐ ์์ ์ ๋ค์๋ ๊น์ํ ๊ฐ์ฌ๋์ '์ค์ ! ์คํ๋ง๋ถํธ์ JPA ํ์ฉ2 - API ๊ฐ๋ฐ ์ฑ๋ฅ์ต์ ํ' ๊ฐ์์์ ์น์
5 API ๊ฐ๋ฐ ๊ณ ๊ธ-์ค๋ฌด ํ์ ์ต์ ํ -..
Spring Framework/Spring & Spring Boot
Spring Security๋ฅผ ๊ตฌํํ๋ค๋ณด๋ฉด filter์ interceptor๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ํํฐ์ ์ธํฐ์
ํฐ์ ๋ํ ๊ฐ๋
์ ์ดํดํ๋ฉด Spring Security ๊ณผ์ ์ ํ์
ํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๊ธฐ์ ๊ธฐ๋กํ๋ค! โจ ์ฉ๋ - ๊ณตํต๊ด์ฌ์ฌํญ (Cross-cutting concern) ๐ ์น ์๋น์ค์์ ๋ก๊ทธ์ธ์ ํด์ผ ๋ค์ํ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์์ผ๋ฉฐ ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ผ ์ ๊ทผํ ์ ์๋ ํ์ด์ง๊ฐ ๋ค๋ฅด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํ ๋ชจ๋ ์ปจํธ๋กค๋ฌ ๋ก์ง์ ๋ก๊ทธ์ธ๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผํ ํ
๋ฐ... ์ด๋ ๊ฒ ๋๋ค๋ฉด ์ฝ๋๊ฐ ์ค๋ณต๋ ๊ฒ์ด๊ณ ๋ณต์กํด์ง ๊ฒ์ด๋ค. ๋ง์ ๋ก์ง์์ ๊ณตํต์ผ๋ก ๊ด์ฌ ์๋ ๋ถ๋ถ์ ๊ณตํต ๊ด์ฌ ์ฌํญ์ด๋ผ๊ณ ํ๋ฉฐ ์ด๋ฅผ ์คํ๋ง์ AOP๋ก๋ ํด๊ฒฐํ ์ ์์ง๋ง ์น์์๋ ์๋ธ๋ฆฟ ํํฐ์ ์คํ๋ง ์ธํฐ์
ํฐ๋ก ์ฒ๋ฆฌํ ์ ์..
Spring Framework/JPA
JPA ์ํฐํฐ์์ ์์ฑ์๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด ๋์ผ๋ฉด ๊ธฐ๋ณธ์์ฑ์(@NoArgsConstructor๋ฅผ ์ ์ํด์ผํ๋ค๋ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. + public, protected๋ก ์ ์ธํด์ผํจ ! ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ ์ํด์ผํ๋ ์ด์ ๋ฅผ ์ ํํ๊ฒ ์ค๋ช
ํ ์ ์์ด์ ์ ๋ฆฌํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๊ฒ ๋ค. ๐ ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด Java Reflection API์์ ๊ธฐ๋ณธ์์ฑ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. JPA๋ DB ๊ฐ์ ๊ฐ์ฒด ํ๋์ ์ฃผ์
ํ ๋, ๋์ ์ผ๋ก ์ํฐํฐ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์์ฑ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ Reflection์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ์๋ฐ์์๋ Reflection์ด๋ผ๋ API๋ฅผ ์ ๊ณตํ๋๋ฐ, ๊ทธ๋ผ Reflection์ ๋ญ๊น.... Java Reflection ์๋ฐ์์๋ Reflection์ด๋ผ๋ API๋ฅผ ์ ๊ณตํ๋ค. R..
Spring Framework/Spring WebFlux
Spring WebFlux๋ Reactive Stream API๋ฅผ ์ฌ์ฉํ์ฌ non-blocking, asynchronous๋ฅผ ์ง์ํ๋ ๋น๋๊ธฐ ์คํ๋ง ์น ํ๋ ์์ํฌ์ด๋ค. ์ด๋ ๋๋์ ์น ํธ๋ํฝ (I/O๊ฐ ๋ง์ ์น ์๋น์ค ๋ก์ง)์์ MVC์ ๋๋นํ์ฌ ํจ์จ์ ์ด๊ณ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ฉ๋๊ณ ์๋ค. ๋งค๋ฒ WebFlux์ ์ฑ๋ฅ์ด ์ข๋ค๊ณ ๋ ํ ์ ์์! ๋๋ณด๊ธฐ ๐ ๊ทธ๋ฌ๋ฉด ์ฃผ๋ก ์ด๋์์ ํ์ฉ๋๋...? ๋ง์ดํฌ๋ก์๋น์ค์์ ๋ค์ํ ๋์ ์์ฒญ์ ์ํํ๋ gateway server ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ํ ์น์์ผ ๋๋์ I/O๋ฅผ ์ฒ๋ฆฌํ๋ ์ค์๊ฐ ์ฑํ
์๋น์ค Spring MVC vs Spring WebFlux Spring ๊ณต์ ํ์ด์ง์ ๋์์๋ ํ๋ฅผ ํตํด ๋์ ์ฐจ์ด์ ์ ์ ์ ์๋ค. WebFlux๋ ๋น๋๊ธฐ/๋
ผ๋ธ..
Spring Framework/โ๏ธ Spring Cloud
Apache Kafka ๋ฐ์ดํฐ ๋๊ธฐํ Orders โ Catalogs Order Service์ ์์ฒญ๋ ์ฃผ๋ฌธ ์๋ ์ ๋ณด๋ฅผ Catalog Service์ ๋ฐ์ Order Service์์ Kafka Topic์ผ๋ก ๋ฉ์์ง ์ ์ก โ Producer Catalog Service์์ Kafka Topic์ ์ ์ก๋ ๋ฉ์์ง ์ทจ๋ โ Consumer Order-Service์ Catalog-Service์ Kafka ๊ธฐ๋ฅ ๊ตฌํ ์ถ๊ฐ ZooKeeperServer์ KafkaServer ๊ธฐ๋ + Eureka Server (discovery-service) ์คํ config-service, apigateway-service, order-service, catalog-service ์คํ ์๋ ๋ฐ์ดํฐ ์
๋ฐ์ดํธ ์๋ฃ Multip..
Spring Framework/โ๏ธ Spring Cloud
Microservices๊ฐ์ ํต์ ํ๊ธฐ ํด๋ผ์ด์ธํธ๊ฐ user-service์์ userId๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ ์์ฒญํ์ ์ ์ฌ์ฉ์์ ์ฃผ๋ฌธ์ด๋ ฅ๊น์ง ๊ฐ์ ธ์์ผํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด๋ฉด, ์์ฒญํ๋ userId ๊ฐ์ order-service์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํด์ผ ์ฃผ๋ฌธ์ด๋ ฅ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. RestTemplate๊ณผ FeignClient๋ฅผ ์ด์ฉํด ํด๋นํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์๋ณด์. RestTemplate RestTemplate์ http ํต์ ์ ์ ์ฉํ๊ฒ ํ ์ ์๋๋ก ์คํ๋ง์์ ์ ๊ณตํ๋ ํ
ํ๋ฆฟ์ด๋ค. Spring 5.0 ์ดํ๋ถํฐ ๋ ๊ฑฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์ฃผ๋์๋ค. 1๏ธโฃ user-service์ RestTemplate์ Spring Bean์ผ๋ก ๋ฑ๋ก @SpringBootApplication @Ena..
Spring Framework/โ๏ธ Spring Cloud
Configuration ์๋ฒ์์ ์ด๋ ํ ๊ฐ์ ๋ณ๊ฒฝ์์ผฐ์ ๋ microservices์ ๋ฐ์์ํค๊ธฐ ์ํด์ ์ด์ ์๋ actuator๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๋ง๋ค ์๋์ผ๋ก refresh ์์ผ์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์ ์๋นํ ๋ฒ๊ฑฐ๋กญ๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ฐ์ ์์ผ์ฃผ๋ ๊ฒ์ด Spring Cloud Bus ์ด๋ค. โSpring Cloud Bus๋ ? ๋ถ์ฐ์์คํ
์ ๋
ธ๋(microservice)๋ฅผ ๋ฉ์์ง ๋ธ๋ก์ปค(RabbitMQ)์ ์ฐ๊ฒฐํ์ฌ ์ํ ๋ฐ ๊ตฌ์ฑ์ ๋ํ ๋ณ๊ฒฝ์ฌํญ์ ์ฐ๊ฒฐ๋ ๋
ธ๋์๊ฒ ์ ๋ฌํด์ฃผ๋ ํ๋ ์์ํฌ์ด๋ค. ๐ก ๋ฉ์์ง ๋ธ๋ก์ปค๋? ๐ ์ ํ๋ฆฌ์ผ์ด์
, ์์คํ
๋ฐ ์๋น์ค๊ฐ ์๋ก ๊ฐ์ ํต์ ํ๊ณ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์๋๋ก ํด์ฃผ๋ ์ํํธ์จ์ด๋ก ๋ฉ์์ง๋ฅผ ๊ฒ์ฆ, ์ ์ฅ, ๋ผ์ฐํ
ํ..