Spring Framework

Spring Framework/Spring & Spring Boot

[Spring] Spring Security @AuthenticationPrincipal

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentPrincipalName = authentication.getName(); UserDetails userDetails = (UserDetails) authentication.getPrincipal(); ์˜ˆ์ „์—๋Š” ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์œ ์ €๋ฅผ ๋ถˆ๋Ÿฌ์™”๋‹ค. SecurityContext์— ์ธ์ฆ๋œ Authentication ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด๋‘๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ ๊ณต์œ ๋˜์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด getName()๋งŒ ๋ถ€๋ฅผ ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋˜ ์—†๋Š”..

Spring Framework/JPA

[Spring/JPA] Open-in-view์™€ @Transactional

์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์œ„์™€ ๊ฐ™์€ 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] ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor)

Spring Security๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด filter์™€ interceptor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด Spring Security ๊ณผ์ •์„ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๊ธฐ์— ๊ธฐ๋กํ•œ๋‹ค! โœจ ์šฉ๋„ - ๊ณตํ†ต๊ด€์‹ฌ์‚ฌํ•ญ (Cross-cutting concern) ๐Ÿ‘‰ ์›น ์„œ๋น„์Šค์—์„œ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ ๋กœ์ง์— ๋กœ๊ทธ์ธ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ• ํ…๋ฐ... ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋  ๊ฒƒ์ด๊ณ  ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค. ๋งŽ์€ ๋กœ์ง์—์„œ ๊ณตํ†ต์œผ๋กœ ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์ด๋ฅผ ์Šคํ”„๋ง์˜ AOP๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›น์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ..

Spring Framework/JPA

[Spring/JPA] JPA Entity๊ฐ€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ ธ์•ผํ•˜๋Š” ์ด์œ  - Reflection

JPA ์—”ํ‹ฐํ‹ฐ์—์„œ ์ƒ์„ฑ์ž๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด ๋†“์œผ๋ฉด ๊ธฐ๋ณธ์ƒ์„ฑ์ž(@NoArgsConstructor๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. + public, protected๋กœ ์„ ์–ธํ•ด์•ผํ•จ ! ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•ด์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์—†์–ด์„œ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ๋‹ค. ๐Ÿ‘‰ ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด Java Reflection API์—์„œ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. JPA๋Š” DB ๊ฐ’์„ ๊ฐ์ฒด ํ•„๋“œ์— ์ฃผ์ž…ํ•  ๋•Œ, ๋™์ ์œผ๋กœ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Reflection์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” Reflection์ด๋ผ๋Š” API๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿผ Reflection์€ ๋ญ˜๊นŒ.... Java Reflection ์ž๋ฐ”์—์„œ๋Š” Reflection์ด๋ผ๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค. R..

Spring Framework/Spring WebFlux

[Spring WebFlux] 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

[Spring Cloud] ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ Apache Kafka ํ™œ์šฉ

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

[Spring Cloud] Microservices๊ฐ„์˜ ํ†ต์‹  - RestTemplate & FeignClient

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

[Spring Cloud] Spring Cloud Bus์™€ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Config ์ •๋ณด ๋ฐ˜์˜ํ•˜๊ธฐ

Configuration ์„œ๋ฒ„์—์„œ ์–ด๋– ํ•œ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผฐ์„ ๋•Œ microservices์— ๋ฐ˜์˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์ด์ „์—๋Š” actuator๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋งˆ๋‹ค ์ˆ˜๋™์œผ๋กœ refresh ์‹œ์ผœ์ฃผ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐœ์„ ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด Spring Cloud Bus ์ด๋‹ค. โ“Spring Cloud Bus๋ž€ ? ๋ถ„์‚ฐ์‹œ์Šคํ…œ์˜ ๋…ธ๋“œ(microservice)๋ฅผ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค(RabbitMQ)์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ƒํƒœ ๋ฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๐Ÿ’ก ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ž€? ๐Ÿ‘‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์‹œ์Šคํ…œ ๋ฐ ์„œ๋น„์Šค๊ฐ€ ์„œ๋กœ ๊ฐ„์— ํ†ต์‹ ํ•˜๊ณ  ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒ€์ฆ, ์ €์žฅ, ๋ผ์šฐํŒ…ํ•˜..

soogoori
'Spring Framework' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก