๋ชฉ๋ก๊ฐœ๋ฐœ์ผ์ง€ (21)

DevLog ๐Ÿ˜ถ

[Spring] ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋กœ์ง์˜ ์ผ๋ถ€๋ฅผ stubbing ํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด, ์‹ค์ œ ๋นˆ ์ค‘์— ์ผ๋ถ€๋งŒ stubbing์„ ํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, ์™ธ๋ถ€ API๋ฅผ ํ†ต์‹ ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ…Œ์ŠคํŠธ์—์„œ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด๋ฐ, ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ณดํ†ต Spring Context์—์„œ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋นˆ์„ ๊ทธ๋Œ€๋กœ ๋“ฑ๋กํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ช‡ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ์กฐ์น˜๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด์ž.  โ˜๏ธŽ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค - ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•˜๊ฒŒ ๋˜๋ฉด, ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ๊ณ ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.  - ๋งŒ์•ฝ ์žฌ๊ณ ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์™ธ๋ถ€ API๋Š” ‘SUCCESS’๋ผ๋Š” ์‘๋‹ต์„, ์žฌ๊ณ ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ‘FA..

[MySQL] Replication์„ ํ™œ์šฉํ•˜์—ฌ Master-Slave DB ๋ถ„๋ฆฌํ•˜๊ธฐ (1)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ํšŒ์‚ฌ ๋“ค์–ด๊ฐ€๊ณ  ๋ธ”๋กœ๊ทธ๊ฐ€ ๋„ˆ๋ฌด ๋œธํ•ด์ง„ ๊ฒƒ ๊ฐ™์•„์„œ, ์ด์ „์— ์“ฐ๋ ค๋‹ค๊ฐ€ ๋ชป ์“ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•œ๋‹ค ๐Ÿฅน (๋ฌดํ•œ์˜ ์ž„์‹œ ์ €์žฅ...) ์‚ฌ๋‚ด์—์„œ Replication์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑด ์•Œ๊ณ  ์žˆ๋Š”๋ฐ, ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ MySQL์„ ํ™œ์šฉํ•˜์—ฌ Replication์ด ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ตฌ์ถ•ํ•ด๋ณด์•˜๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„์€ ๋” ๊ณต๋ถ€ํ•˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ํ•™์Šต ์šฉ๋„๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ธ€!  ๐ŸŒฑ ๋ณต์ œ๋ž€ ๋ฌด์—‡์ผ๊นŒ?๋ณต์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ master ๋…ธ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ slave ๋…ธ๋“œ์—๋„ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, MySQL์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋™๊ธฐ ๋ณต์ œ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜์—ฌ ๋‘˜ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค.์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋น„๋™๊ธฐ ๋ณต์ œ ..

[Intellij] ์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ„ฐ๋ง ์ง„ํ–‰ํ•˜๊ธฐ - Intellij๋ฅผ ํ™œ์šฉํ•œ ์ ์ง„์  ๋ฆฌํŒฉํ„ฐ๋ง

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ๋‚˜๋Š” ํ‰์†Œ์— ๋งˆ์šฐ์Šค๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๋งฅ๋ถ ํ„ฐ์น˜ํŒจ๋“œ๋ฅผ ์ •๋ง ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด์—ˆ์–ด์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ๋‹จ์ถ•ํ‚ค๋ฅผ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽธ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์ž๋™์œผ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์†๋„ ์ฐจ์ด๊ฐ€ ๋‚ฌ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ๋‹จ์ถ•ํ‚ค๋„ ๊ณต๋ถ€ํ• ๊ฒธ, ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด Intellij ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์Šคํ„ฐ๋”” ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. (๊ฐ“๋‚˜๋‹ˆ๊ฐœ๋ฐœ์ž๋‹˜ ๋•๋ถ„์— ๋งŽ์ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค ใ…Ž_ใ…Ž) ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์‚ฌ์šฉ๋œ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” ๋ฐฑ๋ช…์„ ๋‹˜์˜ ๊นƒํ—ˆ๋ธŒ๋ฅผ ๊ฐ€๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‚˜๋Š” ์‚ฌ๋‚ด์—์„œ ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค ๋ณด๋‹ˆ๊นŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ฝ”ํ‹€๋ฆฐ + Kotest๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์—ฐ์Šต์„ ํ•ด๋ณด์•˜๋‹ค. ์–ด๋–ค ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ–ˆ๋Š”์ง€๋Š” ์•„๋ž˜์˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹๋ณ„๋กœ ๋‚˜ํƒ€๋‚ด์—ˆ๋‹ค. GitHub - Cl8D/kotlin-exp..

[JPA] @Embedded ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ , ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „๋„ˆ๋ฌด ์˜ค๋žœ๋งŒ์— ์ž‘์„ฑํ•˜๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€...! ์ตœ๊ทผ์— ์‚ฌ๋‚ด์—์„œ ๋งค์šฐ ๋งŽ์ด ์“ฐ์ด๋Š” ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ฑฐ๊ธฐ์„œ ๋งŒ๋‚ฌ๋˜ ์ด์Šˆ๋“ค๊ณผ ๊ฐ„๋‹จํ•œ ์ƒ๊ฐ ๊ธฐ๋ก์„ ๋ธ”๋กœ๊ทธ์— ๋‚จ๊ธฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ด๋ฏธ ํŒ€ ๋‚ด์—์„œ ๊ณต์œ ๋„ ํ–ˆ์—ˆ๊ณ , ๋™๊ธฐ๋“ค์—๊ฒŒ๋„ ๊ณต์œ ํ•œ ๋‚ด์šฉ์ด๊ธฐ๋„ ํ•˜๊ณ , ์‚ฌ์‹ค ๋ณ„๊ฑฐ ์•„๋‹Œ ๊ฑฐ๋ผ ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค. ๐ŸŒฑ ๋ฌธ์ œ ์ƒํ™ฉ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•œ ๋„๋ฉ”์ธ์€ ์šฐ๋ฆฌ ํŒ€์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜์˜€๊ณ , ์ด๋ฏธ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์šด์˜๋˜๊ณ  ์žˆ์ง€๋งŒ ๊ต‰์žฅํžˆ ์˜›๋‚ ๋ถ€ํ„ฐ ๋ ˆ๊ฑฐ์‹œ๋กœ ๋‚ด๋ ค์˜ค๊ณ  ์žˆ๋˜ ๊ฐ์ฒด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ทœ ์ž…์‚ฌ์ž๊ฐ€ ๋ณด๊ธฐ์— ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์‚ฌ๋‚ด ๋„๋ฉ”์ธ์ธ ๋งŒํผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋น„์Šทํ•œ ๋Š๋‚Œ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ธํŒ…์„ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค.CREAT..

๊ฐœ๋ฐœ์ผ์ง€ 2023. 12. 16. 10:00
[Redis] Redis๋Š” ์–ธ์ œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? 1ํŽธ - ๋ถ„์‚ฐ๋ฝ ๊ตฌํ˜„ํ•˜๊ธฐ (2)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ ˆ๋””์Šค๋ฅผ ํ™œ์šฉํ•ด ๋ถ„์‚ฐ๋ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์กฐ๊ธˆ ๋” ์ƒ‰๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ ˆ๋””์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ๋ฝ์„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. โœ” Case 4 - Lua Script ํ™œ์šฉํ•˜๊ธฐ Redis 2.6 ๋ฒ„์ „์—์„œ ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ, ๋ ˆ๋””์Šค ์„œ๋ฒ„์—์„œ ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ ˆ๋””์Šค ๋‚ด๋ถ€์—์„œ๋Š” EVAL (ํ˜น์€ EVALSHA)์ด๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. EVAL script numkeys [key [key ...]] [arg [arg ...]] ๋งŒ์•ฝ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด๋ฅผ EVAL๋กœ ์ „์†กํ•˜๊ธฐ์—๋Š” ๋„คํŠธ์›Œํฌ ๋Œ€์—ญ์˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ ˆ๋””์Šค์—์„œ๋Š” SCRIPT LOAD ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ..

๊ฐœ๋ฐœ์ผ์ง€ 2023. 10. 17. 09:24
[Redis] Redis๋Š” ์–ธ์ œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? 1ํŽธ - ๋ถ„์‚ฐ๋ฝ ๊ตฌํ˜„ํ•˜๊ธฐ (1)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์กฐ๊ธˆ ์˜ค๋ž˜๋˜๊ธด ํ–ˆ์ง€๋งŒ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋„ค์ž„๋“œ๋ฝ์„ ํ†ตํ•œ ๋ถ„์‚ฐ๋ฝ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ๋งˆ์ง€๋ง‰ ํฌ์ŠคํŒ…์—์„œ ๋ ˆ๋””์Šค๋ฅผ ํ™œ์šฉํ•œ๋‹ค๊ณ  ๋งํ–ˆ์—ˆ๋Š”๋ฐ, ๊ณ„์† ๋ฏธ๋ฃจ๋‹ค๊ฐ€ ์ด๋ฒˆ์— ๋ ˆ๋””์Šค ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค. ๋ถ„์‚ฐ๋ฝ์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃจ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ ˆ๋””์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ”๋กœ ๋ถ„์‚ฐ๋ฝ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž. ๋˜ํ•œ, ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” Jmeter๋ฅผ ํ™œ์šฉํ•˜์˜€์ง€๋งŒ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” E2E ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๐ŸŒฑ ๊ตฌํ˜„ ์ƒํ™ฉ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž”์•ก์„ ์˜๋ฏธํ•˜๋Š” 'Balance'๋ผ๋Š” ๊ฐ’์—, 2๊ฐœ์˜ ์š”์ฒญ์ด ๋™์‹œ์— ๋“ค์–ด์™”์„ ๋•Œ ๋ ˆ๋””์Šค๋ฅผ ํ†ตํ•œ ๋ถ„์‚ฐ๋ฝ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ œ์–ดํ•ด๋ณด์ž. ์œ„์˜ ๊ฒฐ๊ณผ์—์„œ ์ตœ์•…์˜ ์ƒํ™ฉ์ด๋ผ๋ฉด Request 1, 2๋ฒˆ ๋ชจ๋‘ 80์ด๋ผ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ์ž”์•ก์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š์„..

๊ฐœ๋ฐœ์ผ์ง€ 2023. 10. 17. 09:23
[QueryDSL] QueryDSL ์‚ฌ์šฉ ์‹œ NPE๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๊ฒฐํ•˜๊ธฐ

๐ŸŒฑ ๋ฌธ์ œ ์ƒํ™ฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ผ์ด ๋งŽ์•„ QueryDSL์„ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ์ƒ‰๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. java.lang.NullPointerException: Cannot read field "id" because "co.kirikiri.domain.goalroom.QGoalRoomMember.goalRoomMember.goalRoom.roadmapContent.roadmap" is null NPE๋ฅผ ๋ณธ ๊ฑด ์˜ค๋žœ๋งŒ์ด์–ด์„œ ์กฐ๊ธˆ ์‚ฝ์งˆ์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๐ŸŒฑ ๋„๋ฉ”์ธ ๊ตฌ์กฐ ์ง€๋‚œ ํฌ์ŠคํŒ…๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋Š” ๊ฑฐ์˜ ๋™์ผํ•œ๋ฐ, ์œ„ ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋„๋ฉ”์ธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜๋‚˜์˜ ๋กœ๋“œ๋งต ๋ณธ๋ฌธ(RoadmapContent) ์ •๋ณด์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ..

[Spring] @SpringBootTest์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ ์‚ฌ์šฉํ•˜๊ธฐ - no Session ๋ฐฉ์ง€ํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฐ๋ฆฌ ํŒ€์˜ ๊ฒฝ์šฐ E2E ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ @SpringBootTest๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ ํŒ€์˜ ํŒ€์›๋ถ„์ด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค. failed to lazily initialize a collection of role: co.kirikiri.domain.roadmap.RoadmapContent.nodes.values: could not initialize proxy - no Session ์ƒํ™ฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. (์ถ”ํ›„ ์ฝ”๋“œ๋กœ ๋” ์ž˜ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ด๋‹ค.) A๋ผ๋Š” ์ƒ์„ฑ API์™€ B๋ผ๋Š” ์กฐํšŒ API๊ฐ€ ์žˆ์„ ๋•Œ, ํŒ€ ๋‚ด์—์„œ ๊ธฐ๋Šฅ์„ ์„ธ๋ถ„ํ™”ํ•œ ๋‹ค์Œ ๊ฐ์ž ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ B๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ์ ์— A๋ผ๋Š” API๊ฐ€ ์—†์–ด, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋•Œ repository๋ฅผ ..

[Gradle] Jacoco๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์„ค์ •ํ•˜๊ธฐ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฐ๋ฆฌ ํŒ€์€ CI ํ”Œ๋กœ์šฐ ๊ณผ์ • ์ค‘์—์„œ Jacoco๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ฆฌํฌํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ฒดํฌํ•˜๊ณ  ์žˆ๋‹ค. (ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง ์ฒ ์ €ํ•˜๊ฒŒ ํ•˜์ž๋Š” ์ทจ์ง€์ธ๋ฐ, ํŒ€์› ๋ชจ๋‘๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ์ข‹๋‹ค ๐Ÿ‘) CI์— ๋Œ€ํ•œ ๊ธ€์€ ๋‹ค์Œ์— ์™„์ „ํ•˜๊ฒŒ ๊ตฌ์ถ•๋œ ์ดํ›„์— ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ, ์˜ค๋Š˜์€ Jacoco์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ€๋ณ๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ณ ์ž ํ•œ๋‹ค. ๐ŸŒฑ Jacoco ์„ค์ •ํ•˜๊ธฐ Jacoco๋Š”, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋ถ„์„ํ•ด์ฃผ๋Š” ์ž๋ฐ”์˜ ๋ฌด๋ฃŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Jacoco ํ”Œ๋Ÿฌ๊ทธ์ธ์—๋Š” JacocoTestReport์™€ JacocoTestCoverageVerification Task ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” ์ด 2๊ฐ€์ง€๋ฅผ ์œ„์ฃผ๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.) - JacocoTestReport: ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒฐ๊ณผ..

๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž! ๋ถ„์‚ฐ๋ฝ ๊ตฌํ˜„ํ•˜๊ธฐ (๋„ค์ž„๋“œ๋ฝ - Named Lock ํ™œ์šฉํ•˜๊ธฐ)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ DB ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ '๋„ค์ž„๋“œ๋ฝ'์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋„ค์ž„๋“œ๋ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ„์‚ฐ๋ฝ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธ€์„ ๋ณด๊ณ  ํ•œ ๋ฒˆ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ „์ฒด ์†Œ์Šค์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ญ”๊ฐ€ ํ…Œ์ŠคํŠธ์šฉ ๋ ˆํฌ ๋งŒ๋“ค๊ธฐ ์• ๋งคํ•ด์„œ ๊ทธ๋ƒฅ ์•ˆ ์“ฐ๋Š” ๋ ˆํฌ์—๋‹ค๊ฐ€ ํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.) ๐ŸŒฑ ๋ถ„์‚ฐ๋ฝ์ด๋ž€? ๋ถ„์‚ฐ๋ฝ์ด๋ž€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์„ ์ ‘๊ทผํ•˜๋ฉฐ ๊ฒฝ์Ÿํ•˜๋Š” ์ƒํ™ฉ์„ 'Race Condition (๊ฒฝ์Ÿ ์ƒํƒœ)'๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ์ž๋ฐ”์—์„œ๋Š” 'synchronized'๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด..