soogoori

AWS

[AWS] SchedulerAsyncClient

์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด  AWS์—์„œ ์ œ๊ณตํ•œ ์ธํ„ฐํŽ˜์ด์ŠคInterface SchedulerAsyncClientํ•ด์„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Amazon EventBridge Scheduler์˜ ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅbuilder() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑ ๊ฐ€๋Šฅ SdkAsyncHttpClient ๊ตฌ์„ฑํ•˜์—ฌ non-blocking I/O ์ˆ˜ํ–‰EventBridge Scheduler์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ œ๊ณต      CreateScheduleRequest์Šค์ผ€์ค„๋Ÿฌ ์ž‘์—… ์ƒ์„ฑ ๋ฐ ์„ธ๋ถ€์‚ฌํ•ญ ์ง€์ • target : com.amazonaws.services.scheduler.model.Target์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง€์ •ํ•ด์„œ Target buildscheduleExpressionThe expression ..

Spring/Spring WebFlux

[WebFlux] flatMap๊ณผ map์˜ ์ฐจ์ด

Webflux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค flatMap๊ณผ map์ด ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฌ๋ฏ€๋กœ ์ •๋ฆฌ. ๋‘ ๋ฉ”์„œ๋“œ๋Š” Reactive Stream API ์ผ๋ถ€๋กœ Reactor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Mono์™€ Flux์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋‹จ, flatMap์ด ๋น„๋™๊ธฐ ์ž‘์—…์— ๋” ์ ํ•ฉ !  flatMap()์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ ์šฉ ๐Ÿ‘‰ 1:N ๋ณ€ํ™˜์›๋ณธ ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด Mono ๋˜๋Š” Flux ๋ฐ˜ํ™˜๋ฐ˜ํ™˜๋œ ์ŠคํŠธ๋ฆผ์€ flatten(ํ‰ํƒ„ํ™”)๋˜์–ด ๋‹จ์ผ Mono ๋˜๋Š” Flux๋กœ ํ•ฉ์ณ์ง@GetMapping("/user/{id}")public Mono getUser(@PathVariable String id) { return userRepository.findById(id) // ret..

Kotlin

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ™œ์šฉํ•œ ์ฝ”๋“œ ์ •๋ฆฌ + WebFlux + MongoDB

์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹น๊ทธ์ € ์žŠ์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์šฉ์ด๊ณ ...๐Ÿ“ + WebFlux์™€ MongoDB๋„ ์กฐ๊ธˆ ์ •๋ฆฌ์ˆ˜์‹œ๋กœ ์—…๋ฐ์ดํŠธ ์˜ˆ์ • .. ๐Ÿค“  Document (MongoDB)data class๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๋ชฉ์ ์˜ ํด๋ž˜์Šค ์„ ์–ธ๋ฐ์ดํ„ฐ ์ €์žฅ, ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์„œ๋“œ ์ž๋™ ์ƒ์„ฑ equals(), hashCode(), toString(), componentN(), copy() ๋“ฑ ์ƒ์„ฑ ๐Ÿ‘‰ ํ•„์š”์— ๋”ฐ๋ผ ์ง์ ‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์˜ ์ฃผ ์ƒ์„ฑ์ž์— ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ ๐Ÿ‘‰ val๋กœ ์„ ์–ธdata class User(val name: String, val age: Int)fun main() { val user1 = User("Alice", 30) val user2 = User("Bob", 25)..

AWS

[AWS] Amazon EventBridge Scheduler์™€ AWS Lambda ์‚ฌ์šฉํ•˜๊ธฐ

EventBridge Scheduler๋ฅผ ์ด์šฉํ•ด ์ •๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ํŠน์ • ์ด๋ฒคํŠธ์— ๋”ฐ๋ผ Lambda๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ˜ธ์ถœ๋œ Lambda๊ฐ€ ๋””๋ฐ”์ด์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋กœ์ง์„ ๊ตฌ์„ฑํ•ด์•ผํ–ˆ๋‹ค. Amazon EventBridge Scheduler์™€ AWS Lambda์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค.  AWS Lambda๋ž€ ?AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ์„œ๋น„์Šค๐Ÿ”น ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… : ์„œ๋ฒ„ ์ธํ”„๋ผ ๊ด€๋ฆฌ ํ•„์š”์—†์ด ์ฝ”๋“œ ์‹คํ–‰์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์ž‘์—… ๋‹จ์ˆœํ™” ๐Ÿ‘‰ Python, Node.js ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ˆ˜ ์ƒ์„ฑํ•ด์„๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ˜์†”์˜ ๊ธฐ๋ณธ ์ œ๊ณต ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์—์„œ ํ•จ์ˆ˜ ์ฝ”๋“œ ์ง์ ‘ ํŽธ์ง‘ ๊ฐ€๋Šฅ Java ๋ฐ C# ์ปดํŒŒ์ผ๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ๋นŒ๋“œ ๋จธ์‹ ์— ๋ฐฐํฌ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Lambda..

Kotlin

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ• ๊ณ ๊ธ‰ 2

๋žŒ๋‹ค๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๐Ÿ”ท ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐval printHello: () -> Unit = { println("Hello") }fun main() { val list = mutableListOf(printHello) list[0]() // ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด ()๋ฅผ ์จ์•ผํ•จ}// Hello๋ฆฌ์ŠคํŠธ์— ์ €์žฅ ํ›„ ์‚ฌ์šฉ  val list = mutableListOf(printHello)val func = list[0]func()// Helloํ•จ์ˆ˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ val printHello: () -> Unit = { println("Hello") }fun call(block: () -> Unit) { block()}fun main() { call(printHello)}// Hello๋‹ค๋ฅธ ..

Kotlin

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ• ๊ณ ๊ธ‰ 1

์ปฌ๋ ‰์…˜๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜ ํƒ€์ž… ๐Ÿ‘‰ List, Set, Mapfun main(){ // immutable val currencyList = listOf("๋‹ฌ๋Ÿฌ", "์œ ๋กœ", "์›") // add ๋ถˆ๊ฐ€ val numberSet = setOf(1, 2, 3, 4) val numberMap = mapOf("one" to 1, "two" to 2) // to ์ค‘์œ„ํ•จ์ˆ˜๋กœ key-value ๊ตฌ์กฐ ์ „๋‹ฌ // mutable // 1) List val mutableCurrencyList = mutableListOf() mutableCurrencyList.add("๋‹ฌ๋Ÿฌ") mutableCurrencyList.add("์œ ๋กœ") mutableCurrencyList..

Server

[DB] MongoDB

MongoDB ํŠน์ง•์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ NoSQL DB์‚ฌ์ „ ์ •์˜๋œ ์Šคํ‚ค๋งˆ ์—†์ด ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ์ €์žฅ ๐Ÿ‘‰ row, column ํ•„์š” X๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅ, ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ธ๋ฑ์Šค ์ง€์›๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ๊ฐ€ ๋งŽ์€ ์„œ๋น„์Šค ๐Ÿ‘‰ BSON ํ†ตํ•ด ์“ฐ๊ธฐ๊ฐ€ ๋น ๋ฅด๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๐Ÿ‘‰ collection์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ €์žฅ ๋ฐ ์กฐํšŒํ•˜๋Š” sharding ์ง€์› ex) IoT ๋ฐ ์„ผ์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์„œ๋น„์Šค ๐Ÿ‘‰ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ๋งŽ์ด ๋ฐœ์ƒ (์ด๋ฒคํŠธ ๋ฐœํ–‰)๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋‚˜๋ˆ ์„œ ์ €์žฅํ•˜๊ณ  ์‰ฝ๊ฒŒ ์„œ๋ฒ„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ  BSONBinary ํ˜•์‹์˜ JSONJSON๋ณด๋‹ค ๋น ๋ฅธ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ•„๋“œ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ์ธ์ฝ”๋”ฉ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง๋‹ค์–‘ํ•œ ํƒ€์ž… ์ง€์›document์˜ id : ObjectId..

Kotlin

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ• ๊ธฐ์ดˆ 2

์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ชจ๋“  ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” ์ตœ์ƒ์œ„ ์˜ˆ์™ธ ํด๋ž˜์Šค์ธ Throwable์„ ์ƒ์†ํ•จ์ž๋ฐ”์—์„œ checked exception์€ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด try-catch๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ throws ์˜ˆ์™ธ๋ฅผ ์ „ํŒŒํ•ด์•ผํ•˜๋‚˜, ์ฝ”ํ‹€๋ฆฐ์€ checked exception์„ ๊ฐ•์ œ X์ฝ”ํ‹€๋ฆฐ์—์„œ try-catch๋Š” ํ‘œํ˜„์‹val a = try { "1234".toInt() } catch (e: NumberFormatException) { println("catch ๋™์ž‘") }println(a) // 1234์ฝ”ํ‹€๋ฆฐ์—์„œ exception์„ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด throw ์‚ฌ์šฉfun failFast(message: String): { throw IllegalArgumentException(message)}Nothing ํƒ€์ž…์„..