Spring

Spring/Spring & Spring Boot

[Spring] Example<T> ์ธํ„ฐํŽ˜์ด์Šค

์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค๊ฐ€ Example ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค. Example๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๊ณ , ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.  Example ์ธํ„ฐํŽ˜์ด์Šค๋ž€ ?Spring Data Core์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ, QBE(Query By Example)์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ฟผ๋ฆฌ ์กฐ๊ฑด์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.    ์ฃผ์š” ๊ฐœ๋…๋„๋ฉ”์ธ ๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ) ์ž์ฒด๋ฅผ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์œผ๋กœ ํ™œ์šฉNull ๊ฐ’์€ ๋ฌด์‹œ (ํ•„๋“œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ๋งŒ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ)๋™์  ์ฟผ๋ฆฌ ์ƒ์„ฑ ๊ฐ€๋Šฅ๋ณ„๋„์˜ JPQL์ด๋‚˜ SQL์„ ์ž‘์„ฑํ•  ํ•„์š” ์—†์Œ๐Ÿ‘‰ ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰์—์„œ๋Š” ์œ ์šฉํ•˜๊ฒ ์œผ๋‚˜.. ์‹ค๋ฌด์—์„œ๋Š” ๋ณต์žกํ•œ ๊ฒ€์ƒ‰์ด ๋” ๋งŽ์ด ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์ €๋Ÿฐ ๊ธฐ๋Šฅ์ด ์žˆ๊ตฌ๋‚˜ ์ •๋„๋งŒ ์•Œ์•„๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.    ์‚ฌ์šฉ ์˜ˆ์‹œUser probe = new User();..

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

[๐Ÿ“› Error] Object๋ฅผ List<XXXDto>๋กœ ์บ์ŠคํŒ…ํ•˜๋‹ˆ ํƒ€์ž… ๋ถˆ์ผ์น˜ ์—๋Ÿฌ ๋ฐœ์ƒ

๐Ÿ“› ์—๋Ÿฌ ์„ค๋ช…class java.util.LinkedHashMap cannot be cast to class com.XXXX. XXXX.app.interfaces.devices.service.dto.StatusDto ๐Ÿ‘‰ java.util.LinkedHashMap์„ StatusDto ๊ฐ์ฒด๋กœ ๊ฐ•์ œ๋กœ ์บ์ŠคํŒ…ํ•˜๋ ค ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ClassException์ด๋‹ค.Java์—์„œ ํƒ€์ž… ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š”๊ฑด๋ฐ, ์™œ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž... ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ๐Ÿ”ถ ์ˆ˜์ • ์ „ ์ฝ”๋“œ @Override public Flux getAll() { return deviceRepository.findByXXXX() .switchIfEmpty(Mono.error(n..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] Operators ไธญ

Sequence ๋ณ€ํ™˜ Operatorโœณ๏ธ mapupstream์—์„œ emit๋œ ๋ฐ์ดํ„ฐ๋ฅผ mapper function์„ ์‚ฌ์šฉํ•ด ๋ณ€ํ™˜ํ•œ ํ›„, downstream์œผ๋กœ emitmap() operator ๋‚ด๋ถ€์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ sequence๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ ์ง€์› Mono mono = Mono.just("Reactor") .map(String::toUpperCase);mono.subscribe(System.out::println); // ์ถœ๋ ฅ: REACTOR โœณ๏ธ flatMapupstream์—์„œ emit๋œ ๋ฐ์ดํ„ฐ๊ฐ€ Inner Sequence์—์„œ ํ‰ํƒ„ํ™” ์ž‘์—…์„ ๊ฑฐ์น˜๋ฉด์„œ ํ•˜๋‚˜์˜ Sequence๋กœ ๋ณ‘ํ•ฉ๋˜์–ด downstream์œผ๋กœ emitpublic class Example { public..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] Spring WebFlux

Spring WebFlux ๊ฐœ์š”Spring 5.0๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ ์€ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ Non-Blocking I/O ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.     Spring WebFlux ๊ธฐ์ˆ  ์Šคํƒ โœณ๏ธ Spring MVC์™€ Spring WebFlux ๊ธฐ์ˆ  ์Šคํƒ ๋น„๊ต  ๐Ÿ”ท ์„œ๋ฒ„Spring MVC์„œ๋ธ”๋ฆฟ ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›ŒํฌApache Tomcat๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ Blocking I/O ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘Spring WebFluxNon-Blocking I/O ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” Netty ๋“ฑ์˜ ์„œ๋ฒ„ ์—”์ง„์—์„œ ๋™์ž‘ ๐Ÿ”ท ์„œ๋ฒ„ APISpring MVC์„œ๋ธ”๋ฆฟ API ์‚ฌ์šฉSpring WebFlux Jetty๋‚˜ Undertow ๊ฐ™์€ ์„œ๋ฒ„ ์—”์ง„์—์„œ ์ง€์›ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ์Šค..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] Operators ไธŠ

Operator๋ž€ ?Reactive Stream์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ  ๐Ÿ”ท ํŠน์ง• ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ์ง€์—ฐ ์‹คํ–‰ (๊ตฌ๋…์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ์ฒ˜๋ฆฌ)๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ  Sequence ์ƒ์„ฑ์„ ์œ„ํ•œ Operatorโœณ๏ธ justOrEmptyjust()์˜ ํ™•์žฅ operator๋กœ์„œ, emitํ•  ๋ฐ์ดํ„ฐ๊ฐ€ null์ธ ๊ฒฝ์šฐ NullPooinException์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , onComplete signal์„ ์ „์†กjust()๋Š” Reactor์—์„œ ๊ฐ„๋‹จํ•˜๊ณ  ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ Reactive Stream์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์œ ์šฉ- Hot Publisher์ด๊ธฐ ๋•Œ๋ฌธ์— Subscriber์˜ ๊ตฌ๋… ์—ฌ๋ถ€์™€๋Š” ์ƒ๊ด€์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ emit.- ๊ตฌ๋…์ด ๋ฐœ์ƒํ•˜๋ฉด emit๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ replayํ•ด์„œ Sub..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 6. Sinks์™€ Scheduler

Sinks ๋ž€ ?Reactor์—์„œ ์ œ๊ณตํ•˜๋Š” Sinks๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ, Publisher ๋ฐ Subscriber ์—ญํ• ์„ ์ง€์›ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ generate() operator๋‚˜ create() operator๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์—์„œ signal์„ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, Sinks๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ signal์„ ์ „์†กํ•ด๋„ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค. ๐Ÿ’ก์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด๋ž€ ? ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜ ๊ฐ™์€ ๊ณต์œ  ์ž์›์— ๋™์‹œ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ์—๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.๋™์‹œ ์ ‘๊ทผ์„ ๊ฐ์ง€ํ•˜๊ณ , ๋™์‹œ ์ ‘๊ทผํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•จ์œผ๋กœ์จ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.    Sinks ์ข…๋ฅ˜ ๋ฐ ํŠน์ง• โœณ๏ธ Sink..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 5. Reactor

Reactor๋ž€ ? ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ  Spring Framework ํŒ€์— ์˜ํ•ด ๊ฐœ๋ฐœ๋œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ์˜ ๊ตฌํ˜„์ฒด๋กœ์„œ Spring WebFlux ๊ธฐ๋ฐ˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.โœณ๏ธ Reactor์˜ ํŠน์ง• Reactive StreamsNon-BlockingJava's Functional APIFlux[N]Mono[0|1]MicroservicesBackpressure  Mono ๊ธฐ๋ณธ ์˜ˆ์ œpublic class Example { public static void main(String[] args) { Mono .empty() .subscribe( none -> System.out.println(..

Spring/Spring WebFlux

[๐Ÿ“• Reactive] 4. Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ์‚ฌ์ „ ์ง€์‹

1. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ ์žˆ๋Š” ์ •์˜๋˜์–ด์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค (Java 8๋ถ€ํ„ฐ ์ง€์› ๊ฐ€๋Šฅ)ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅpublic class Example { public static void main(String[] args){ List cryptoCurrencies = SampleData.cryptoCurrencies; Collections.sort(cryptoCurrencies, new Comparator() { @Override public int compare(CryptoCurrency cc1, CryptoCurrency cc2) { r..

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