hero background
I LOVE WHAT I DO

Hello World !
Let's Get it Engineering

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

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

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

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

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

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

  • ์ฟ ํ‚ค 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..

  • [CANCER-FINE] ํ”„๋กœ์ ํŠธ init

    [CANCER-FINE] ํ”„๋กœ์ ํŠธ init

    1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”ํ˜„์žฌ ์•”ํ™˜์ž์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์‚ฐ์žฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ํ™˜์ž์—๊ฒŒ fitํ•œ ์ •๋ณด๋ฅผ ์ฐพ๋Š”๊ฒƒ์ด ๋„ˆ๋ฌด ์–ด๋ ค์›€์•”ํ™˜์ž๋ฅผ ์œ„ํ•œ ๋งž์ถคํ˜• ์ •๋ณด ์ œ๊ณต ์‚ฌ์ดํŠธ2. ERD ๋‹ค์ด์–ด๊ทธ๋žจERD๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ณต์žกํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.3. ๊ธฐ์ˆ  ์ŠคํƒFrontEnd : React.js , html, css, javaScriptBackEnd : SpringBoot 3.3.4, Kotlin1.9, MySQL, Spring Data JPA, AOP, Functional Programming, JUnit54. ์ฐธ์—ฌ ์ธ์›์ž‘์„ฑ์ž ํ˜ผ์ž ์ง„ํ–‰5. ํ•ต์‹ฌ ๊ธฐ๋Šฅ1) ํšŒ์›ํšŒ์›๊ฐ€์ž…๋กœ๊ทธ์ธ๋กœ๊ทธ์•„์›ƒํšŒ์›์ •๋ณด์ˆ˜์ •ํšŒ์› ํƒˆํ‡ดSession ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ์œ ์ง€AOP ํ™œ์šฉํ•œ SessionCheckํšŒ์› ๋ณธ์ธ ์ •๋ณด์กฐํšŒ2) ๊ฒŒ์‹œ๊ธ€๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ(์ „์ฒด ๊ฒŒ์‹œ๊ธ€ ..