๋ฐ˜์‘ํ˜•

Programming/Kotlin 17

[Kotlin] spring boot MongoDB "field locale is not valid in" error ์—๋Ÿฌ ์›์ธ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Intro์•ˆ๋…•ํ•˜์„ธ์š”. spring boot + MongoDB + Kotlin ์—์„œ ์ƒˆ๋กœ์šด ์ปฌ๋ ‰์…˜ ๋‹คํ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ๋ฐ์ดํ„ฐ ์กฐํšŒ API ์‹คํ–‰ ์‹œ field locale is not valid in ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.  field locale is not valid in How to solve the problem@Document(collation = "eventSpec")class EventSpec( @Indexed var eventCode: Int?, var eventName: String?, ...)๊ธฐ์กด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.  @Document(collection = "eventSpec")class EventSpec( @Indexed var eventCode: ..

Programming/Kotlin 2025.01.15

[Kotlin] ์ฝ”ํ‹€๋ฆฐ Mono, Flux ๋ž€?

Intro์•ˆ๋…•ํ•˜์„ธ์š”:) ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ Mono, Flux ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ๋‹ค์‹œ ์ฝ”ํ‹€๋ฆฐ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๊ทธ์ƒˆ ๊ฐœ๋…์„ ์žŠ์–ด๋จน์–ด ๋‹ค์‹œ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ˜ญ ์ฝ”ํ‹€๋ฆฐ Mono, Fluxkotlin์—์„œ Mono, Flux๋Š” Reactor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ์„ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, Reactive Streams ํ‘œ์ค€์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Reactor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ)๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Spring WebFlux์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Spring WebFlux๋Š” Spring Framework์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฐ ๋…ผ๋ธ”๋กœํ‚น ์›น ์• ํ”Œ..

Programming/Kotlin 2024.11.18

[Kotlin] lateinit๋ž€?

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ์˜ lateinit ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. lateinit ์ฝ”ํ‹€๋ฆฐ์—์„œ "lateinit"๋Š” ๋ง ๊ทธ๋Œ€๋กœ late + init์ด ํ•ฉ์ณ์ง„ ๋œป์œผ๋กœ ๋‚˜์ค‘ ์ดˆ๊ธฐํ™”๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์ง€์—ฐ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Use ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ , ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Condition ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ผ ๋•Œ๋งŒ lateinit๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” non-null ํƒ€์ž…์ด์–ด์•ผ ํ•˜๋ฉฐ, primitive type์ด๋‚˜ String ๋“ฑ์˜ ํด๋ž˜์Šค ํƒ€์ž… ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜๋ฉด ..

Programming/Kotlin 2023.05.10

[Kotlin] Text '..' could not be parsed: Unable to obtain LocalDate from TemporalAccessor ์˜ค๋ฅ˜ ์›์ธ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ฝ”ํ‹€๋ฆฐ ์ŠคํŠธ๋ง์„ ์ฝ”ํ‹€๋ฆฐ ๋‚ ์งœ๋กœ ๋ณ€ํ™˜ํ•˜๋˜ ๋„์ค‘ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. import java.math.BigDecimal import java.math.RoundingMode import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.util.* fun main(args: Array) { val input = "2301" val formatter = DateTimeFormatter.ofPattern("yyMM", Locale.KOREA) val date = LocalDate.parse(input, formatter).minusYears..

Programming/Kotlin 2023.03.30

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ํŠน์ • ๋ฌธ์ž์—ด ๊ธฐ์ค€์œผ๋กœ ์ž๋ฅด๋Š” ๋ฐฉ๋ฒ• (split ํ•จ์ˆ˜ ์ด์šฉ)

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ž๋ฅด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. How to solve the problem ์ฝ”ํ‹€๋ฆฐ์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ž๋ฅด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•œ๋ฐ์š”, ์ €๋Š” split ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ŠคํŠธ๋ง์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ํ•ด๋‹น ์ŠคํŠธ๋ง์—์„œ split ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ '-' ๋ฌธ์ž์—ด ๊ธฐ์ค€์œผ๋กœ ์ž˜๋ผ์ค๋‹ˆ๋‹ค. fun main() { val string = "kotlin-typescript-javascript" val result = string.split('-'); println(result) println(result[0]) println(result[1]) println(result[2]) } ์œ„ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. [kot..

Programming/Kotlin 2023.03.14

[Kotlin] ์ž…๋ ฅ ๋ฐ›์€ ๋‚ ์งœ๋กœ ๊ฒฝ๊ณผ์ผ์ˆ˜ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• (get the day of the year as an integer in Kotlin)

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ ์ž…๋ ฅ ๋ฐ›์€ ๋‚ ์งœ๋กœ ๊ฒฝ๊ณผ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. How to solve the problem ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž…๋ ฅ ๋ฐ›์€ ๋‚ ์งœ๋กœ ํ•ด๋‹น ๊ฒฝ๊ณผ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /** * You can edit, run, and share this code. * play.kotlinlang.org */ fun main() { // ์œค๋…„ ํŒ๋ณ„ ๋ฉ”์†Œ๋“œ (1 ์œค๋…„, 0 ํ‰๋…„) fun isLeap(year: Int): Int { return if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 1 else 0 } fun dayOfYear(year: Int, month: Int, day: Int): Int {..

Programming/Kotlin 2023.03.02

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ํ˜„์žฌ ๋‚ ์งœ DateTime ์—์„œ ์‹œ๊ฐ„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฒ•

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ ํ˜„์žฌ ๋‚ ์งœ DateTime ์—์„œ ์‹œ๊ฐ„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. How to implement ์šฐ์„  LocalDateTime ์„ ํ†ตํ•ด ํ˜„์žฌ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„ plusHours ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ฐ’๋งŒํผ ์‹œ๊ฐ„์„ ๋”ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. import java.time.LocalDate import java.time.LocalDateTime fun main(args: Array) { val todayDateTime: LocalDateTime = LocalDateTime.now() println("Current date and time: $todayDateTime") println("Add 9 Hour date and time: ${today..

Programming/Kotlin 2023.02.13

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๋ฆฌ์ŠคํŠธ list ํŠน์ • ํ•„๋“œ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ(DESC) ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. How to do ์ฝ”ํ‹€๋ฆฐ ๋‚ด์žฅ ํ•จ์ˆ˜์ธ sortedByDescending ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ์š”, ๋‚ด๋ฆผ์ฐจ์ˆœ์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํŠน์ • ํ•„๋“œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. result.sortedByDescending { it.date } https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sorted-by-descending.html

Programming/Kotlin 2023.01.20

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๋ฌธ์ž์—ด ๊ต์ฒดํ•˜๊ธฐ / ๋ฌธ์ž์—ด์˜ ํŠน์ • ์ธ๋ฑ์Šค์— ๋ฌธ์ž ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ ๋ฌธ์ž์—ด (string)์˜ ํŠน์ • ์ธ๋ฑ์Šค ๋ฌธ์ž ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. How to do ์ธ๋ฑ์Šค ๋ฌธ์ž ๋ฐ”๊พธ๋Š” ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ, ์ €๋Š” substring() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด "20230116"์ด๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ธ๋ฑ์Šค 4 ์œ„์น˜์— "12"๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. substring() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒดํ•  ๋ฌธ์ž๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , + ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์„ ๋”ํ•ด์ค๋‹ˆ๋‹ค. println()์„ ํ†ตํ•ด ๋‚˜์˜จ ๊ฒฐ๊ณผ๋Š” "20231216" ์ž…๋‹ˆ๋‹ค. "01"์ด "12"๋กœ ์ž˜ ๋ฐ”๋€Œ์–ด ๋™์ž‘ํ•˜๊ณ  ์žˆ๋„ค์š” :) fun main() { var string = "20230116" val char = "12..

Programming/Kotlin 2023.01.16

[Kotlin] ์ฝ”ํ‹€๋ฆฐ mutableList ์ˆ˜์ • ๋ฐ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

Intro ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ mutableList ๋ฅผ ์ˆ˜์ • ๋ฐ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. MutableList ์ฝ”ํ‹€๋ฆฐ์—์„œ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” List๊ฐ€ ์•„๋‹Œ, mutableList๋กœ ์„ ์–ธํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ val, var ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, val๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , var์€ ์ฝ๊ธฐ ๋ฐ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. How to do ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ˆ˜์ • ํ˜น์€ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๊ณ , ์‚ญ์ œ๋ฅผ ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ removeAt() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. fun main() { val list: MutableList = mutableListOf() lis..

Programming/Kotlin 2023.01.16
๋ฐ˜์‘ํ˜•