Spring Framework

Spring Framework/Spring & Spring Boot

[Spring/Spring Boot] SSE (Server-Sent Events)์™€ EventSource ์ ์šฉํ•ด๋ณด๊ธฐ

SSE (Server-Sent Events)๋ž€?์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ „์†กํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ(์ฃผ์‹ ์‹œ์„ธ, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์•Œ๋ฆผ ๋“ฑ)์— ์‚ฌ์šฉ๋˜๋ฉฐ HTTP ๊ธฐ๋ฐ˜์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์˜ EventSource API๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์•จ๋ŸฐAI์—๊ฒŒ ์งˆ๋ฌธ์„ ์š”์ฒญํ•˜๋ฉด ์‘๋‹ต์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ–ˆ๋‹ค.์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž !   WebClientService ์ฝ”๋“œ ๊ตฌํ˜„ - ๋น„๋™๊ธฐ๋กœ ..

Spring Framework/Spring & Spring Boot

[Spring/Spring Boot] CompletableFuture ๋น„๋™๊ธฐ ์ž‘์—…

xml ํ˜•์‹์˜ ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํŒŒ์‹ฑํ•˜๊ณ  DB์— ์ €์žฅํ•˜๋Š” ๋ฐ๊นŒ์ง€ 442์ดˆ(7๋ถ„ 22์ดˆ) ์†Œ์š”๋๋‹ค.ํ•œ ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐ 3~10์ดˆ ๊ฐ€๋Ÿ‰ ์†Œ์š”๋๊ณ , ์ด 115๊ณณ์„ ๊ฐ€์ ธ์™€์•ผํ•˜๋ฏ€๋กœ ์•ฝ 7-8๋ถ„ ์†Œ์š”๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์›Œ๋‚™ ๊ฐ€์ ธ์™€์•ผํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„ ์• ์ดˆ์— ์ฃผ์†Œ์ฐฝ์— xml์ด ์กด์žฌํ•˜๋Š” url์„ ์š”์ฒญํ–ˆ์„ ๋•Œ 3~5์ดˆ ์ •๋„ ์ง€์—ฐ๋จ์ด ๋ฐœ์ƒํ•˜๊ธด ํ–ˆ๋‹ค. ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค ์„ฑ๋Šฅ์„ ๊ฐœ์„ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฐฉ์‹๋“ค์„ ์‹œ๋„ํ•ด๋ดค๋‹ค... CompletableFuture ๋ž€?Java 8์—์„œ ์ถ”๊ฐ€๋œ ํด๋ž˜์Šค๋กœ ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์™„๋ฃŒ๋œ ๊ฒฐ๊ณผ๋‚˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ธฐ์กด์— ์žˆ๋˜ Java5์˜ Future ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•œ๊ณ„์ ์„ ๊ฐœ์„ ์‹œํ‚จ ๊ฒƒ์ด๋‹ค. ๋”๋ณด๊ธฐ๐Ÿ”น Future๋ž€ ?๐Ÿ‘‰ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ..

Spring Framework/๐Ÿ“› ์—๋Ÿฌ ๊ธฐ๋ก

[๐Ÿ“› Error] JsonParser.Feature.ALLOW_SINGLE_QUOTES

์–ด๋–ค ์ƒํ™ฉ์ธ์ง€...์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‘๋‹ต ๊ฐ’์„ ๋ฐ›์„ ๋•Œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ด๋‹ค.Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character (''' (code 39)): was expecting double-quote to start field name] with root cause  ํ•ด์„ํ•ด๋ณด๋ฉด ์‘๋‹ต ๊ฒฐ๊ณผ๊ฐ€ single quotes์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ ๊ฐ™๋‹ค.  ์ฐธ๊ณ ๋กœ ๋‚ด๊ฐ€ ์ž‘์„ฑ..

Spring Framework/๐Ÿ“› ์—๋Ÿฌ ๊ธฐ๋ก

[๐Ÿ“› Error] deleteAll()๊ณผ deleteAllInBatch()์˜ ์ฐจ์ด

DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ์กฐ๋ฆฌ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ save ํ•ด์•ผํ–ˆ๋‹ค.์ฒ˜์Œ์—๋Š” deleteAll()๋กœ ์‚ญ์ œํ•œ ํ›„ saveAll()ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.ํ•˜์ง€๋งŒ ์‹คํ–‰์‹œ์ผœ๋ณด๋‹ˆ ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. delete๊ฐ€ ๋˜์ง€ ์•Š๊ณ  save๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์ค‘๋ณต๋œ ํ‚ค๊ฐ€ ์žˆ๋‹ค๊ณ  ๋‚˜์˜ค๋Š” ๋“ฏํ•˜๋‹ค.    deleteAll()์ฃ„๋‹ค select๋งŒ ํ•˜๊ณ  delete๋Š” ํ•˜์ง€ ์•Š์•˜๋‹ค.๊ฒฐ๊ตญ delete๋ฅผ ํ•˜์ง€ ์•Š๊ณ  saveAll()์„ ๋งŒ๋‚˜ insertํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์ค‘๋ณต๋œ ํ‚ค๊ฐ€ ์žˆ๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค. ๐Ÿ”น deleteAll() deleteAll() ๋ฉ”์„œ๋“œ๋ฅผ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•ด๋ณด๋‹ˆ findAll()๋กœ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ๊ณ  ํ•˜๋‚˜์”ฉ ์‚ญ์ œํ•œ๋‹ค. ๊ฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ญ์ œํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์ด commit๋  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ..

Spring Framework/JPA

[JPA] @Column(unique=true)์™€ @UniqueConstraint

[Failed to add the foreign key constraint. Missing index for constraint 'FKe6nwysthx2dnq1ikoe3u9gkxp' in the referenced table 'area'] ์ด ERROR๊ฐ€ ์ฐธ ๊ฑฐ์Šฌ๋ ธ๋‹ค. ERROR์ž„์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์•Œ๋งž๊ฒŒ ๋“ค์–ด๊ฐ”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.  ๋Œ€์ถฉ ์–ด๋–ค ์—๋Ÿฌ์ธ์ง€๋Š” ํŒŒ์•…ํ–ˆ๋‹ค.area_code๊ฐ€ unique ์กฐ๊ฑด์ด ๊ฑธ๋ ค์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— FK ์ œ์•ฝ์กฐ๊ฑด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์ธ์ง€...Weather ์—”ํ‹ฐํ‹ฐ์™€ Area ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ผ๋Œ€์ผ ๋งคํ•‘๋˜์–ด์žˆ๊ณ ,referencedColumnName ์˜ต์…˜์„ ์ค˜์„œ AREA_CODE๋กœ Area ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค. @Entity@Table(name = "WEATHER")public class ..

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๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›น์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ..

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