hero background
I LOVE WHAT I DO

Hello World !
Let's Get it Engineering

์•ˆ๋…• ์„ธ๊ณ„! ๋‚˜์—๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ์ƒ์„ ๋ณด์—ฌ์ค˜์„œ ๊ณ ๋งˆ์›Œ

์นดํ…Œ๊ณ ๋ฆฌ โŒจ๏ธ

์ œ๊ฐ€ ๊ด€์‹ฌ์žˆ๊ฒŒ ๊ณต๋ถ€ํ•˜๋Š” ๋ถ„์•ผ์ž…๋‹ˆ๋‹ค.

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ

์ตœ์‹  ๊ธ€ ๐Ÿ“

์ƒˆ๋กญ๊ฒŒ ์ž‘์„ฑ๋œ ๊ธ€๋“ค์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.

  • [ํŒ”๋กœ์“ฐ๋ฃจ] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ, ์ด๋ฒˆ์—” ๋๊นŒ์ง€ ์šด์˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ?

    [ํŒ”๋กœ์“ฐ๋ฃจ] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ, ์ด๋ฒˆ์—” ๋๊นŒ์ง€ ์šด์˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ?

    0. ํ•œ์ค„ ์š”์•ฝ์š”์ฆ˜ AI๋ฅผ ์ž˜๋งŒ ํ™œ์šฉํ•˜๋ฉด ์ž˜ ๋ชจ๋ฅด๋˜ ๋ถ„์•ผ์˜ ๊ธฐ์ˆ ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ฐธ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์นจ ์‹œ๊ฐ„์ด ์ƒ๊ฒจ์„œ, ๊ทธ๋™์•ˆ ํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ํœด๋Œ€ํฐ์œผ๋กœ ์ฐ์€ ์Š› ์˜์ƒ์„ ๋ถ„์„ํ•ด ์Š›ํผ์„ ์ˆซ์ž๋กœ ๋ณด์—ฌ ์ฃผ๋Š” ๋†๊ตฌ ์•ฑ์„ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋งŒ๋“ค๊ณ  ๋๋‚ด์ง€ ์•Š๊ณ  ์˜ค๋ž˜ ์šด์˜ํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ๊ณ , ๊ทธ๋Ÿฌ๋ ค๋ฉด ์ œ๊ฐ€ ๋จผ์ € ๊พธ์ค€ํžˆ ์“ฐ๋Š” ์„œ๋น„์Šค์—ฌ์•ผ๋งŒ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋†๊ตฌ๋ฅผ ์ข‹์•„ํ•˜๊ธฐ์— ์ด๋Ÿฐ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.1. ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ์ด์œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ๊ฝค ์—ฌ๋Ÿฌ ๋ฒˆ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋๊นŒ์ง€ ์šด์˜ํ•ด ๋ณธ ๊ฑด ํ•˜๋‚˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ๋‹ค ๋งŒ๋“ค๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ๋งˆ์น˜๊ณ  ๋‚˜๋ฉด ๊ทธ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์†์ด ์ž˜ ๊ฐ€์ง€ ์•Š์•˜๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‚˜๋‘˜ ํ์ง€๋ถ€์ง€๋์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ์žฌ๋ฐŒ์Šต๋‹ˆ..

  • ์ฟ ํ‚ค vs ์„ธ์…˜ vs JWT, ์‹ค๋ฌด์—์„œ๋Š” ๋ญ๋ฅผ ์จ์•ผํ• ๊นŒ?

    ์ฟ ํ‚ค vs ์„ธ์…˜ vs JWT, ์‹ค๋ฌด์—์„œ๋Š” ๋ญ๋ฅผ ์จ์•ผํ• ๊นŒ?

    ์›น ์ธ์ฆ์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ(JWT)์ด ๋’ค์„ž์—ฌ์„œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค. "์…‹ ๋‹ค ๋น„์Šทํ•œ ๊ฑฐ ์•„๋ƒ?"๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๊ธฐ๋„ ํ•˜๊ณ , "JWT๊ฐ€ ์ตœ์‹ ์ด๋‹ˆ๊นŒ ๋ฌด์กฐ๊ฑด JWT"๋ผ๋Š” ๊ธ€๋„ ํ”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ ๋ฐฉ์‹์ด ์™œ ๋“ฑ์žฅํ–ˆ๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋ฉด, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋ฌด์—‡์„ ์จ์•ผ ํ•˜๋Š”์ง€๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ธ๋‹ค.์ด ๊ธ€์—์„œ๋Š” "์™œ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ํ•„์š”ํ•ด์กŒ๋Š”๊ฐ€"๋ถ€ํ„ฐ ์ถœ๋ฐœํ•ด์„œ, ๊ฐ๊ฐ์˜ ๊ตฌ์กฐ์™€ ๋ณด์•ˆ ํŠน์„ฑ, ํ•œ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ๊ทธ ํ•œ๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•˜๋Š”์ง€๊นŒ์ง€ ์ •๋ฆฌํ•œ๋‹ค. ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋ฉด์„œ ๊ฒช์€ ๋™์‹œ์„ฑ ์ด์Šˆ, ํ† ํฐ ๊ด€๋ฆฌ ์ „๋žต์˜ ์‹คํŒจ์™€ ๊ฐœ์„  ๊ณผ์ •๋„ ํ•จ๊ป˜ ๋‹ด์•˜๋‹ค.0. ๋ฐฐ๊ฒฝ: Statelessํ•œ HTTP์— State๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด๊ธฐ๋ณธ์ ์œผ๋กœ HTTP ํ”„๋กœํ† ์ฝœ์€ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋ฉด ๋‘˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ..

  • @Transactional ์–ด๋…ธํ…Œ์ด์…˜ ํ•ด์ฒด ๋ถ„ํ•ดํ•˜๊ธฐ

    @Transactional ์–ด๋…ธํ…Œ์ด์…˜ ํ•ด์ฒด ๋ถ„ํ•ดํ•˜๊ธฐ

    ์ตœ๊ทผ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ™œ์šฉํ•˜๋ฉด์„œ, ํŠธ๋žœ์žญ์…˜ ์–ด๋…ธํ…Œ์ด์…˜์— ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค.@Transactional(propagation = Propagation.REQUIRES_NEW)@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) ์œ„์™€ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์ธ๋ฐ, ๋ฌด์˜์‹์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ, ๊ฐ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋ฌด์—‡์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ๋œฏ์–ด๋ณด๊ณ  ์‹ถ์–ด์„œ ๋‚˜๋ฆ„ ํŒŒ๊ณ ๋“ค์–ด ๊ณต๋ถ€ํ•ด๋ดค๊ณ , ๊ทธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.1. ํŠธ๋žœ์žญ์…˜ ์ •์˜ํŠธ๋žœ์žญ์…˜์ด๋ž€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ์ž‘์—…์„ '์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜'์„ ์˜๋ฏธํ•œ๋‹ค. ์‚ฌ์‹ค ์ •์˜๋ผ๋Š”๊ฒŒ ์•„๋Š” ์‚ฌ๋žŒ์ด ๋ณผ๋• ์ดํ•ด๊ฐ€ ์ž˜๋˜์ง€๋งŒ, ์ฒ˜์Œ ์ ‘ํ• ๋•Œ๋Š” ๋˜๊ฒŒ ๋ฉ€๊ฒŒ ๋А๊ปด์ง€๋Š” ๊ทธ๋Ÿฐ๊ฒŒ ์žˆ๋‹ค. ๊ทธ๋Ÿด..

  • [์˜์•ฝํ’ˆ ๋ฐฐ์†ก ํ”„๋กœ์ ํŠธ] ์‹ค์‹œ๊ฐ„ ๊ธฐ์‚ฌ ์œ„์น˜ ๊ฐฑ์‹  ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐ

    [์˜์•ฝํ’ˆ ๋ฐฐ์†ก ํ”„๋กœ์ ํŠธ] ์‹ค์‹œ๊ฐ„ ๊ธฐ์‚ฌ ์œ„์น˜ ๊ฐฑ์‹  ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐ

    0. ํ•œ์ค„ ์š”์•ฝHTTP ๋‹จ๊ฑด ์กฐํšŒ -> SSE & Kotlin Flow ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ์˜์•ฝํ’ˆ ๋ฐฐ์†ก ํ”Œ๋žซํผ์€ ์ œ์•ฝํšŒ์‚ฌ์—์„œ ์ƒ์‚ฐ๋œ ์˜์•ฝํ’ˆ์„ ๋ณ‘์›,์•ฝ๊ตญ ๋ฐ ๊ธฐํƒ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” B2B ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.ํ•ด๋‹น ์„œ๋น„์Šค์˜ ๊ณ ๊ฐ์€ ์ƒ์‚ฐ๋œ ์˜์•ฝํ’ˆ์ด ์˜์•ฝํ’ˆ ๋ฐฐ์†ก ๊ทœ์น™ ๋ฐ ๊ทœ์ œ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ๋ฐฐ์†ก๋˜๊ณ  ์žˆ๋Š”์ง€, ํ˜„์žฌ ์ƒํ™ฉ์€ ์–ด๋– ํ•œ์ง€ ์ง„ํ–‰์ƒํ™ฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ์‹ค์ œ๋กœ ์˜์•ฝํ’ˆ์„ ๋ฐฐ์†กํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์ฐจ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐฐ์†ก ๊ธฐ์‚ฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜์•ฝํ’ˆ ์ „๋ฌธ ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด...)1. ๋ฐฐ๊ฒฝ - ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด์•ผ๋งŒ ๋ฐฐ์†ก ๊ธฐ์‚ฌ์˜ ์ตœ์‹  ์œ„์น˜๊ฐ€ ๋ณด์ด๋Š” ๋ฌธ์ œ์˜์•ฝํ’ˆ ๋ฐฐ์†ก ํ”Œ๋žซํผ์˜ ์‚ฌ์šฉ์ž ๋ฐ ๊ด€๋ฆฌ์ž ํ™”๋ฉด์—๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐฐ์†ก ๊ธฐ์‚ฌ์˜ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ธฐ์กด ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœ HTTP GET ์š”์ฒญ์œผ๋กœ ํ™”๋ฉด ์ตœ์ดˆ..

  • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฌธ์ž์—ด ๊ฒน์ณ์“ฐ๊ธฐ_ReplaceRange ํ™œ์šฉ

    [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฌธ์ž์—ด ๊ฒน์ณ์“ฐ๊ธฐ_ReplaceRange ํ™œ์šฉ

    ์ฝ”ํ…Œ๋ฅผ ํ•œ๋™์•ˆ ๋†“๋‹ค๊ฐ€... ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๋‹ค์‹œ ์ค€๋น„ํ•  ๊ฒธ ์‹œ์ž‘ํ•ด๋ณธ๋‹ค.์œ„ ๋ฌธ์ œ๋Š” ์‚ฌ์‹ค ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ์ž„ 1. ๋‚ด ํ’€์ดclass Solution { fun solution(my_string: String, overwrite_string: String, s: Int): String { var answer: String = "" for (i in 0..my_string.length - 1) { when { i answer+=my_string[i] s answer+=overwrite_string[i-s] i >= overwrite_string.length+s -> answer+..

  • [CANCER-FINE] ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํƒ„ํƒ„ํ•œ Entity ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

    [CANCER-FINE] ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํƒ„ํƒ„ํ•œ Entity ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

    1. ๋ฐฐ๊ฒฝJPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ์ •ํ˜•ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.@Entity@Table( name = "board", indexes = [Index(name = "idx_fts", columnList = "title, content", unique = false)]) class Board( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null @Column(nullable = false) var title: String, @Column(columnDefinition = "TEXT", nul..