Choi Eun Kang ๐Ÿ‘‹

Junior Backend Developer

ํ•ญํ•ด99 6์ฃผ์ฐจ ํšŒ๊ณ (WIL)

Q. ์ธ์ƒ๊นŠ์—ˆ๋˜ ์ฃผ์ œ๋Š” ๋ฌด์—‡์ด์—ˆ๋‚˜์š”? ๋ถ„์‚ฐ๋ฝ๊ณผ ์บ์‹œ ์ „๋žต์ค‘ ์–ด๋–ค ์ฃผ์ œ๊ฐ€ ๋” ์ธ์ƒ๊นŠ์—ˆ๋‚˜์š”? ํ•ญํ•ด๋ฅผ ํ•˜๊ธฐ์ „ ๋ ˆ๋””์Šค๋ฅผ ์‚ฌ์šฉํ•ด์™”์„๋•Œ๋Š” JWT ํ† ํฐ์ •๋„๋กœ๋งŒ ํ•ด์™”์Šต๋‹ˆ๋‹ค. Key value ๊ธฐ๋ฐ˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ ๋ ˆ๋””์Šค๊ฐ€ ๋‹จ์ˆœํžˆ ์บ์‹ฑ์˜ ์—ญํ• ์„ ํ•˜์ง€ ์•Š๊ณ  Lock์œผ๋กœ์„œ์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฑธ ์ด๋ฒˆ๊ณผ์ œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์•Œ๊ฒŒ๋์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์—์„œ์˜ ์บ์‹ฑ์ „๋žต์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๋Š”๊ฑธ ์ฒ˜์Œ์•Œ๊ฒŒ๋์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐœ๋…์„ ํ†ตํ•ด ์–ด๋–ค ๊ตฌ์กฐ์ /์„ฑ๋Šฅ์  ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ๊ฐ€๋Šฅ์„ฑ์„ ๋А๊ผˆ๋‚˜์š”? ์•„์ง๊นŒ์ง€๋Š” ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด์„œ ์–ด๋А์ ์ด ๋ฌธ์ œ์ธ์ง€, ๊ทธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋– ์˜ค๋ฅด๋Š” ํ•œ๊ฐ€์ง€๋Š” ์บ์‹ฑ์ชฝ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ ‘๊ทผํ•˜๊ธฐ์ „์— ์บ์‹œ์ €์žฅ์†Œ(redis)์—์„œ ์บ์‹œํžˆํŠธ๊ฐ€๋˜๋ฉด ๋น ๋ฅธ ์‘๋‹ต์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค....

May 10, 2025

RDBMS ๋ฝ์„ ์‚ฌ์šฉํ•œ ๋™์‹œ์„ฑ๋ฌธ์ œ ํ•ด๊ฒฐ

๋™์‹œ์„ฑ ๋ฌธ์ œ (RaceCondition) ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๊ณต์œ ์ž์›์— ๋Œ€ํ•ด์„œ ๋™์‹œ์— ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ ‘๊ทผ ์š”์ฒญํ•  ๋•Œ ๊ณต์œ ์ž์›์˜ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง€๋Š” ํ˜„์ƒ. ๋ฐ๋“œ๋ฝ (DeadLock) 1 2 3 4 ํ™”์žฅํ’ˆ๊ฐ€๊ฒŒ ์—๋Š” ๋ฆฝ๋ฐค 1๊ฐœ, ์Šคํ‚จ๋กœ์…˜ 1๊ฐœ ๋ฅผ ํŒ๋งคํ•˜๊ณ  ์žˆ๋‹ค. - ์†๋‹˜ A๊ฐ€ ๋ฆฝ๋ฐค 1๊ฐœ๋ฅผ ์ง‘์—ˆ๋‹ค. - ์†๋‹˜ B๊ฐ€ ์Šคํ‚จ๋กœ์…˜ 1๊ฐœ๋ฅผ ์ง‘์—ˆ๋‹ค. ์†๋‹˜ A ๋Š” (B๊ฐ€ ์ง‘์€) ์Šคํ‚จ๋กœ์…˜์„ ์›ํ•˜๊ณ , ์†๋‹˜ B ๋Š” (A๊ฐ€ ์ง‘์€) ๋ฆฝ๋ฐค์„ ์›ํ•œ๋‹ค. ์†๋‹˜ A์˜ ์ž…์žฅ์—์„œ๋Š” ์†๋‹˜B๊ฐ€ ์Šคํ‚จ๋กœ์…˜์„ ๋‚ด๋ ค๋†“์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๊ณ  ์†๋‹˜ B์˜ ์ž…์žฅ์—์„œ๋Š” ์†๋‹˜A๊ฐ€ ๋ฆฝ๋ฐค์„ ๋‚ด๋ ค๋†“์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค....

April 22, 2025

RDBMS(Mysql)์—์„œ์˜ ์ธ๋ฑ์Šค ๊ฐœ๋… ์ •๋ฆฌ

๋งŒ๋Šฅ์€ ์—†๋‹ค. TradeOff๋Š” ์žˆ๋‹ค. ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ์ข‹์œผ๋ฉด ์“ฐ๊ธฐ์„ฑ๋Šฅ์ด ๊ตฌ๋ฆฌ๊ณ , ์“ฐ๊ธฐ์„ฑ๋Šฅ์ด ์ข‹์œผ๋ฉด ์ฝ๊ธฐ์„ฑ๋Šฅ์— ๊ตฌ๋ ค์ง„๋‹ค. ์ •๊ทœํ™” ์“ฐ๊ธฐ์„ฑ๋Šฅ์„ ๋†’์ž„์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์ผ๊ด€์„ฑ์„ ๋†’์ธ๋‹ค. ๋ฐ˜์ •๊ทœํ™” ์ฝ๊ธฐ์„ฑ๋Šฅ์„ ๋†’์ž„์œผ๋กœ์จ ์ผ๋ถ€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ Uncommitted Read - ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ์ฝ๊ธฐ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์—๋„ ์ ‘๊ทผํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ์ˆ˜์ค€ DirtyRead: ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜์— ์ ‘๊ทผํ•ด์„œ ์•„์ง ์ •์ƒ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ํ˜„์ƒ (ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ๋กค๋ฐฑ๋˜์–ด ์—†์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค) Committed Read - ์ปค๋ฐ‹๋œ ์ฝ๊ธฐ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒฉ๋ฆฌ์ˆ˜์ค€ Non-Repeatable Read: ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋™์ผํ•œ SELECT ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ปค๋ฐ‹์ „์˜ ๋ฐ์ดํ„ฐ์™€ ์ปค๋ฐ‹ํ›„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝํžˆ๋ฉด์„œ ๋‹ค๋ฅธ๊ฒฐ๊ณผ๊ฐ€ ์ƒ๊ธฐ๋Š” ํ˜„์ƒ Repeatable Read - ๋ฐ˜๋ณต๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž์‹ ๋ณด๋‹ค ๋นจ๋ฆฌ ์ˆ˜ํ–‰๋œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€...

April 14, 2025

์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ

์„œ๋ก  ๋‹จ์œ„ํ…Œ์ŠคํŠธ์˜ ๋ชฉ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๋•Œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ๋˜์–ด ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋„๋ฉ”์ธ์„ setter๋กœ ์„ค์ •์‹œ์ผœ์„œ ๋ชฉ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ ์  ๋ฌด๊ฑฐ์›Œ์ง€๋Š” ๋ถˆํŽธํ•จ์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Test void ์‹ ๊ทœ_์ž„์‹œ์˜ˆ์•ฝ์ƒํƒœ์˜_์˜ˆ์•ฝ๋„๋ฉ”์ธ_์ƒ์„ฑ์—_์„ฑ๊ณต๋œ๋‹ค() { // given long userId = 1L; long concertSeatId = 1L; User user = new User(userId, "์€๊ฐ•"); Concert concert = new Concert(1L, "ํ•ญํ•ด์™€ ํ•จ๊ป˜ํ•˜๋Š” TDD ๋‹จ์œ„ํ…Œ์ŠคํŠธ ์ฝ˜์„œํŠธ", "ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค"); // ๐Ÿ‘ˆ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ํ˜ธ์ถœ!...

April 13, 2025

์•„ํ‚คํ…์ณ ๊ณ ๋ฏผํ•˜๊ธฐ

ERD ๊ฐœ์„ ํ•˜๊ธฐ ๋ณด์™„ํ”ผ๋“œ๋ฐฑ1: ์œ ์ €์™€ ํ† ํฐ ํ…Œ์ด๋ธ” ๋ถ„๋ฆฌํ•˜๊ธฐ ๋ณด์™„ํ”ผ๋“œ๋ฐฑ2: ํ…Œ์ด๋ธ”์˜ ์—ญํ• ์„ ๊ณ ๋ฏผํ•ด์„œ ๋งŒ๋“ค๊ธฐ payments ๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ์— ๊ธˆ์•ก์ •๋ณด๊ฐ€ ์—†์–ด์„œ ์ฑ…์ž„์„ ๋‹คํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ. As-Is (1์ฐจ ์„ค๊ณ„) To-Be (2์ฐจ ์„ค๊ณ„) ํ…Œ์ด๋ธ”๊ฐœ์ˆ˜๋ฅผ 6๊ฐœ -> 8๊ฐœ ๋กœ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ(tokens) ํ…Œ์ด๋ธ” ์ถ”๊ฐ€ ํฌ์ธํŠธ ๋‚ด์—ญ(point_histories) ํ…Œ์ด๋ธ” ์ถ”๊ฐ€ payments ํ…Œ์ด๋ธ”์— ๊ฒฐ์ œ๊ธˆ์•ก(price) ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ์ œ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. 2์ฐจ ์„ค๊ณ„์•ˆ ๊ณ ๋ฏผํฌ์ธํŠธ 1๋ฒˆ์„ ์ฐธ๊ณ ํ•˜์—ฌ, ๋‚ ์งœ์—์„œ ์˜ˆ์•ฝ๊ฐ€๋Šฅ์—ฌ๋ถ€(is_available)์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ERD 2์ฐจ ์„ค๊ณ„์•ˆ ๊ณ ๋ฏผํฌ์ธํŠธ ๋Œ€๊ธฐ์—ดํ† ํฐ์˜ ๋Œ€๊ธฐ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด, ํ† ํฐํ…Œ์ด๋ธ”์— ๋Œ€๊ธฐ์ˆœ์„œ๋ฅผ ๊ธฐ์žฌํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ์š” ์•„๋‹ˆ๋ฉด ๋Œ€๊ธฐ์—ดํ๋ฅผ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜ํƒ€๋‚ด์–ด ๋Œ€๊ธฐ์ˆœ์„œ๋ฅผ ๊ธฐ์žฌํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”?...

April 5, 2025

ํ•ญํ•ด99 2์ฃผ์ฐจ ํšŒ๊ณ  (WIL)

๋ฉ˜ํ† ๋งํ•˜๋ฉด์„œ ๊นจ๋‹ฌ์€ ์  ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ๋ถ€์—ฌ์‹œ์ผœ์„œ ๋ถ„๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด TDD ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋™์•ˆ ์ฝ”๋”ฉ์„ํ•˜๋ฉด์„œ API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ–ˆ๋‹ค. ์ฝ”๋”ฉ์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค ํ•˜์ง€๋งŒ ๊ฒฌ๊ณ ํ•˜๊ฑฐ๋‚˜ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ์„ค๊ณ„๊ฐ€ ๋’ท๋ฐ›์นจ๋œ๋‹ค๋ฉด ์ฝ”๋”ฉ์€ ๋‹จ์ˆœํžˆ ๋ช…ํ™•ํ•œ ์„ค๊ณ„๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ์ˆ˜๋‹จ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์ œ ๋ฐœ์ œ์‹œ๊ฐ„์— ๋ฐœ์ œ ์ฝ”์น˜์ธ ํ—ˆ์žฌ๋‹˜์ด ๋ง์”€ํ•˜์‹  ๋ถ€๋ถ„์ด ๊ธฐ์–ต์ด ๋‚จ์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๋ฉด, โ€œ์ฝ”๋“œ๋ฅผ ์น˜๋Š” ํ–‰์œ„โ€ ๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” โ€œ์ˆ˜๋‹จโ€ ์ด ๋œ๋‹ค. ์„ค๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด, โ€œ์ฝ”๋“œ๋ฅผ ์น˜๋Š” ํ–‰์œ„โ€ ๋Š” ๋ถˆํ•„์š”ํ•œ โ€œ๋…ธ๋™โ€ ์ด ๋œ๋‹ค....

April 5, 2025

SpringBoot์—์„œ Swagger ๋„์ž…๋ถ€ํ„ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์— ๋ฐฐํฌ๊นŒ์ง€...(?)

์„œ๋ก  API๋ช…์„ธ์„œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ„์˜ ํ˜‘์—…์„ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ํ•„์š”ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋Š” API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ณต์œ ํ• ๋•Œ API๋ช…์„ธ์„œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. API ๋ช…์„ธ์„œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€ํ‘œ์ ์ธ ํˆด๋กœ๋Š” Swagger๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” Swagger ์„ ๋„์ž…ํ•˜๋Š” ๊ณผ์ •๊ณผ ์ค‘๊ฐ„์— ๊ฒช์€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ํ•ด๊ฒฐ๊ณผ์ • ๊ทธ๋ฆฌ๊ณ  ๋”๋‚˜์•„๊ฐ€์„œ ์ง์ ‘ github-action์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๊ณต์œ ํ•ด๋ณด๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ์— ์Šค์›จ๊ฑฐ ๋„์ž…ํ•˜๊ธฐ Java: 17 SpringBoot: 3.4.4 build.gradle ์— ์ถ”๊ฐ€ํ•˜๊ธฐ 1 2 3 4 5 6 7 dependencies { // Swagger UI implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' ...์ƒ๋žต... } application.yaml ์— ์ถ”๊ฐ€ํ•˜๊ธฐ 1 2 3 4 5 6 7 8 9 10 11 spring: application: name: hhplus-concert ....

April 4, 2025

ํ•ญํ•ด99 1์ฃผ์ฐจ ํšŒ๊ณ  (WIL)

๋ฉ˜ํ† ๋งํ•˜๋ฉด์„œ ๊นจ๋‹ฌ์€ ์  ํ†ตํ•ฉํ…Œ์ŠคํŠธ/์œ ๋‹›ํ…Œ์ŠคํŠธ ์˜ ๋ฒ”์œ„๋Š” ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๋‹ค. ํ†ตํ•ฉํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ธฐ์ค€์€ ๋‚ด๊ฐ€ ํ˜ธ์ถœํ•  ์นœ๊ตฌ๊ฐ€ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์œ„ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ 2๊ฐœ์ด์ƒ์˜ ํ•จ์ˆ˜๋‚˜ ์™ธ๋ถ€์˜์กด์„ฑ์ด ์žˆ๋Š”์ง€ e2e ๊ด€์ ์œผ๋กœ๋„ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„๊ฐœ๋ฐœ์ž ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋‚ด๋ถ€๋™์ž‘๋ณด๋‹ค๋Š” ํ˜ธ์ถœํ–ˆ์„๋•Œ ์‹ค์งˆ์ ์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ…Œ์ŠคํŠธ๋„ ๊ดœ์ฐฎ์€ ํŽธ. ๊ฐ€๊นŒ์šด ๋Œ€์ƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค DTO์ž…์žฅ์—์„œ๋Š” ์„œ๋น„์Šค ๋ฉ”์„œ๋“œํ•จ์ˆ˜ ํ•œ๊ฐœ๊ฐ€ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์™ธ์˜๊ฒƒ๋“ค์„ (์„œ๋น„์Šค์˜ ์˜์กด์„ฑ์„ ๋น„๋กฏํ•œ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์—๋Š” ํ•ด๋‹น๋˜์ง€์•Š์ง€๋งŒ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋Œ€์ƒ๋“ค์„) Mocking ์„ ํ•ด์•ผํ•œ๋‹ค. ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ๋ถ€์—ฌํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค....

March 29, 2025

synchronized ์™€ ReentrantLock ์€ ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์„๊นŒ?

๋™์‹œ์„ฑ์ œ์–ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์œ„ํ…Œ์ŠคํŠธ์— ์ ํ•ฉํ• ๊นŒ? ํ†ตํ•ฉํ…Œ์ŠคํŠธ์— ์ ํ•ฉํ• ๊นŒ? JVM ๋‚ด์—์„œ ๋™์‹œ์„ฑํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ ค๊ณ ํ•œ๋‹ค๋ฉด, synchornized, ReentrantLock, JVM ๋‚ด ํ(queue)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์„ฑ์ œ์–ด๋ฅผ ํ…Œ์ŠคํŠธํ• ๋•Œ ํ†ตํ•ฉํ…Œ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•ด์•ผ๋˜๋Š”๊ฑด์ง€ ์•„๋‹ˆ๋ฉด ์œ ๋‹›ํ…Œ์ŠคํŠธ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ๋ ์ง€ ์• ๋งคํ• ๊ฒ๋‹ˆ๋‹ค. ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š” ๊ฐ€์žฅ ์ž‘์€ ํ…Œ์ŠคํŠธ์ธ๋งŒํผ 1๊ฐœ ๋ฉ”์„œ๋“œ/ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ ํ๋ฅผ ์ด์šฉํ•ด์„œ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ฑฐ๋‚˜ ์ž ๊ธˆ(locking)์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋‹ค๋ฅธ์š”์ฒญ์ด ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๊ฑฐ๋‚˜, ํ๋ฅผ ์ด์šฉํ•ด์„œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ค˜์•ผํ•˜๋Š” ์—ญํ• ๊นŒ์ง€ ๊ฒ€์ฆ์„ ํ•ด์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ์–ด๋ ค์šธ๊ฑฐ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋™์‹œ์„ฑ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒ€์ฆํ•ด์•ผํ•˜๋ฏ€๋กœ, ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๋™์‹œ์ ์ธ ์ƒํ™ฉ์„ ์žฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค....

March 26, 2025

๊ฐ์ฒด์˜ ์ฑ…์ž„(๋„๋ฉ”์ธ ์ฃผ๋„)

๋ชฉ์  UserPointService ์˜ ์ถฉ์ „/์‚ฌ์šฉ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž ๋ƒ„์ƒˆ๋‚˜๋Š” ์ฝ”๋“œ? ํฌ์ธํŠธ ์ถฉ์ „ ๋กœ์ง ๊ฐœ์„ ์‹œํ‚ค๊ธฐ ์ˆ˜์ • ์ด์ „ (์ ˆ์ฐจ์ง€ํ–ฅ์ ) ํฌ์ธํŠธ ์ถฉ์ „ ๋‚ด๋ถ€๋กœ์ง ํ”Œ๋กœ์šฐ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // PointServiceImpl.java @Service @RequiredArgsConstructor public class PointServiceImpl implements PointService { @Override public ChargeResponse charge(ChargeRequest request) { long id = request.id(); long amount = request.amount(); UserPoint userPoint = this....

March 26, 2025