[๐ŸƒOpenRun] ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด ์ตœ์ ํ™” (2) - ์Šค์ผ€์ผ ์•„์›ƒ์— ๋”ฐ๋ฅธ ์ด๋ฒคํŠธ ์ค‘๋ณต ๋ฐœํ–‰๊ณผ SKIP LOCKED ๋ฌธ์ œ
ยท
ํ”„๋กœ์ ํŠธ
๐Ÿ“Œ ๋ฌธ์ œ ์ƒํ™ฉ๊ธฐ์กด ์•„์›ƒ๋ฐ•์Šค ๋ฐœํ–‰๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์•„๋ฌด๋Ÿฐ ๋ฝ ์—†์ด ๋‹จ์ˆœ SELECT ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค PENDING ๋ฐ์ดํ„ฐ๋ฅผ ๊ธ์–ด์™”๋‹ค.ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์Šค์ผ€์ผ ์•„์›ƒ์„ ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์˜ˆ์ƒ ๋˜์—ˆ๋‹ค.๋™์ผ ์ด๋ฒคํŠธ์˜ ์ค‘๋ณต ๋ฐœํ–‰์„œ๋ฒ„ A์™€ ์„œ๋ฒ„ B๊ฐ€ ๋™์‹œ์— SELECT๋ฅผ ๋˜์งˆ ๊ฒฝ์šฐ, ์„œ๋กœ๊ฐ€ ์•„์ง ์™„๋ฃŒ ์—…๋ฐ์ดํŠธ(PUBLISHED)๋ฅผ ์น˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ PENDING ํ–‰๋“ค์„ ์ค‘๋ณต์œผ๋กœ ์ฝ์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.๋ฉ”์‹œ์ง€ ํ์— ๊ฐ™์€ ์ทจ์†Œ ์ด๋ฒคํŠธ๊ฐ€ 2๋ฒˆ ๋ฐœ์†ก๋˜๋Š” ์ž์› ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Consumer ๋‹จ์˜ ๋ฉฑ๋“ฑ์„ฑ ๋กœ์ง์ด ์ตœ์ข… ๋ฐฉ์–ด์„  ์—ญํ• ์„ ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ํ‹€์–ด์ง€์ง„ ์•Š์ง€๋งŒ, ํ ์ธํ”„๋ผ ์ž์›์˜ ๋ถˆํ•„์š”ํ•œ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž ๊ธˆ ๊ฒฝํ•ฉ๋‘ ๋ฐœํ–‰๊ธฐ๊ฐ€ ์šฐ์—ฐํžˆ ๋™์ผํ•œ ํ–‰๋“ค์„ ๋ถ™์žก๊ณ  ๋™์‹œ์— ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  UPDATE WH..
[๐ŸƒOpenRun] ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด ์ตœ์ ํ™” (1) - N+1 ์ฟผ๋ฆฌ, ์Šค์ผ€์ค„๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ ๋ฌธ์ œ
ยท
ํ”„๋กœ์ ํŠธ
๐Ÿ“Œ ๊ฐœ์š”์˜ˆ์•ฝ ์ทจ์†Œ ์ž‘์—…์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. DB ์˜ˆ์•ฝ ์ƒํƒœ ๋ณ€๊ฒฝ (ํ™•์ •→์ทจ์†Œ)๊ฒฐ์ œ ์ทจ์†Œ API ํ˜ธ์ถœ ๋‘ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๊ฒŒ ๋˜๋ฉด ๊ฒฐ์ œ ์ทจ์†Œ API ์ง€์—ฐ ์‹œ DB ์ปค๋„ฅ์…˜์„ ๋ถ™์žก์•„ ๋ณ‘๋ชฉ์ด ์ƒ๊ธด๋‹ค.๊ทธ๋ ‡๋‹ค๊ณ  ํŠธ๋žœ์žญ์…˜ ๋ฐ–์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด DB ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ ์ด๋ฒคํŠธ ๊ฒฐ์ œ ์ทจ์†Œ๊ฐ€ ๋ˆ„๋ฝ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฆฌ์Šคํฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ฒฐ์ œ ์ทจ์†Œ API ํ˜ธ์ถœ์„ ๋น„๋™๊ธฐ๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋‘ ์ž‘์—…์„ ์›์ž์ ์œผ๋กœ ๋ฌถ๊ธฐ ์œ„ํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ํŠธ๋žœ์žญ์…˜์—์„œ ๋ถ„๋ฆฌํ•˜๋Š” ํŠธ๋žœ์žญ์…”๋„ ์•„์›ƒ๋ฐ•์Šค(Transactional Outbox) ํŒจํ„ด์„ ๋„์ž…ํ–ˆ๋‹ค. ์ „์ฒด์ ์ธ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๐Ÿ“Œ ๋ฌธ์ œ ์ƒํ™ฉOutboxPublisher ์Šค์ผ€์ค„๋Ÿฌ๋Š” batchSize ๋งŒํผ ์•„์›ƒ๋ฐ•์Šค ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•ด ๋ฉ”์‹œ์ง€ ํ์— ๋„ฃ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ƒ์„ธ ..
[๐ŸƒOpenRun] ์„ ์ฐฉ์ˆœ ์˜ˆ์•ฝ ๋™์‹œ์„ฑ ์ œ์–ด ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐ
ยท
ํ”„๋กœ์ ํŠธ
์ด ๊ธ€์€ ๐ŸƒOpenRun(์˜คํ”ˆ๋Ÿฐ) ํ”„๋กœ์ ํŠธ์˜ ์„ ์ฐฉ์ˆœ ์˜ˆ์•ฝ์˜ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.JVM ๋ฝ๋ถ€ํ„ฐ DB๋ฝ, ๋ฉ”์‹œ์ง€ ํ, Redis๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์ง์ ‘ ์‹คํ—˜ํ•˜๋ฉฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ์™€ ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput)์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด ๊ฐ ๋‹จ๊ณ„๋ณ„ ํ•œ๊ณ„์™€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฑฐ์ณ ์ตœ์ข… ๊ตฌ์กฐ์— ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ ๋นŒ๋“œ์—… ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ์ตœ๊ทผ ์„ ์ฐฉ์ˆœ ์˜ˆ์•ฝ ํ”„๋กœ์ ํŠธ์— ๋น„๋™๊ธฐ ๊ฒฐ์ œ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๊ฐ€ ์–ด๋А์ •๋„ ๋งˆ๋ฌด๋ฆฌ ๋˜์—ˆ๋‹ค. ๊ทธ ์ค‘ ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ณผ ๊ด€๋ จ๋˜๋Š”๋ฐ, ๊ทธ ๋ณ€ํ™” ๊ณผ์ •์ด ๊ฝค ๋ณต์žกํ•ด์„œ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋จผ์ € ๋งŒ์กฑํ•ด์•ผ ํ–ˆ๋˜ ์„œ๋น„์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ์ •์˜ํ•˜๊ณ , ๊ทธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ๊ฐœ์„ ๊นŒ์ง€ ๊ณผ์ •์„ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž. โœ… ์„œ๋น„์Šค ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์ œํ•œ๋œ ์ˆ˜๋Ÿ‰(Capa..
[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] ํŠธ๋žœ์žญ์…˜ ACID์™€ ์›์ž์„ฑ ๋ณด์žฅ์˜ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
ยท
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
ํŠธ๋žœ์žญ์…˜์ด๋ž€?ํŠธ๋žœ์žญ์…˜(Transaction)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์˜ ์ตœ์†Œ ๋‹จ์œ„๋‹ค. โœ”๏ธ ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜(All), ๋ชจ๋‘ ์‹คํŒจํ•ด์•ผ ํ•œ๋‹ค(Nothing) โœ”๏ธ ์ค‘๊ฐ„ ์ƒํƒœ๋Š” ์ ˆ๋Œ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋ฉด ์•ˆ ๋œ๋‹ค ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—… ๋ฌถ์Œ์ด๋‹ค.๊ณ„์ขŒ ์ด์ฒด → A ๊ณ„์ขŒ ์ถœ๊ธˆ + B ๊ณ„์ขŒ ์ž…๊ธˆ์˜ˆ์•ฝ ์ฒ˜๋ฆฌ → ์ขŒ์„ ์ฐจ๊ฐ + ์˜ˆ์•ฝ ์ƒ์„ฑ์ด ์ž‘์—…๋“ค์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜, ํ•จ๊ป˜ ์‹คํŒจํ•ด์•ผ ํ•œ๋‹ค. ACID ์›์น™ACID๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๋Š” 4๊ฐ€์ง€ ์„ฑ์งˆ์„ ์˜๋ฏธํ•œ๋‹ค. 1๏ธโƒฃ Atomicity (์›์ž์„ฑ) - All or NothingํŠธ๋žœ์žญ์…˜ ๋‚ด ๋ชจ๋“  ์ž‘์—…์ด ์™„์ „ํžˆ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜, ์–ด๋А ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ชจ๋‘ ์ทจ์†Œ(rollback) ๋˜์–ด์•ผ ํ•œ๋‹ค. 2๏ธโƒฃ Consisten..
[Java] HashMap ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ž‘ ๊ณผ์ •
ยท
Java
HashMap ์ฃผ์š” ํŠน์ง•HashMap์€ Java์˜ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜์œผ๋กœ, Key-Value ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ์กฐํšŒ์™€ ์‚ฝ์ž… ์†๋„๊ฐ€ ๊ฑฐ์˜ ์ผ์ •ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ์ด ๋•๋ถ„์— HashMap์˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. HashMap์€ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์šฐ์„ ์œผ๋กœ ์„ค๊ณ„๋œ ์ปฌ๋ ‰์…˜์ด๋ฉฐ, ๊ทธ ์†๋„๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ์—์„œ ๋‚˜์˜จ๋‹ค. HashMap์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐHashMap์€ ๊ฒฐ๊ตญ ๋ฐฐ์—ด์ด๋‹ค. ๋‚ด๋ถ€์— Node[] table์ด๋ผ๋Š” ๋ฐฐ์—ด์ด ์กด์žฌํ•œ๋‹ค.์ด ๋ฐฐ์—ด์˜ ๊ฐ ์นธ์„ ๋ฒ„ํ‚ท(bucket)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.transient Node[] table;HashMap์€ ์ด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ง์ ‘ ๊ณ„์‚ฐํ•ด์„œ ์ ‘๊ทผํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ์–ด๋””์— ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•ด์„œ ๊ทธ..
[Spring] @Secured ์‚ฌ์šฉ ์‹œ AccessDeniedException์ด CustomAccessDeniedHandler์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ด์œ 
ยท
Spring
Spring Security๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ @Secured ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋‚˜๋Š” @Secure ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „์— ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์— ๋”ฐ๋ผ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋„๋ก ์ฒ˜๋ฆฌํ–ˆ๋‹ค. @Operation(summary = "[๊ด€๋ฆฌ์ž] ๋ฆฌ์ŠคํŠธ ์กฐํšŒ", description = "๊ด€๋ฆฌ์ž ๋ฆฌ์ŠคํŠธ ์กฐํšŒ", security = @SecurityRequirement(name = "bearerAuth")) @Secured("ROLE_ROOT") // ๋ฃจํŠธ ๊ถŒํ•œ์ธ ์‚ฌ์šฉ์ž๋งŒ ํ—ˆ์šฉ @GetMapping("/list") public ResponseDto list(@RequestParam(required = false, de..
[Spring] Swagger์—์„œ MultipartFile + DTO ๋™์‹œ ์š”์ฒญ ์‹œ application/octet-stream ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ
ยท
Spring
Spring์—์„œ ํŒŒ์ผ๊ณผ JSON DTO๋ฅผ ๋™์‹œ์— ๋ฐ›๋Š” ๊ธฐ๋Šฅ์€ ์ƒ๊ฐ๋ณด๋‹ค ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.๋‚˜ ์—ญ์‹œ ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ํ•จ๊ป˜ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ DTO๋กœ ์ „๋‹ฌ๋ฐ›์•„์•ผ ํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, Swagger์—์„œ๋งŒ ์žฌํ˜„๋˜๋Š” ์ •์ฒด๋ถˆ๋ช…์˜ ์˜ค๋ฅ˜๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.Content-Type 'application/octet-stream' is not supported Swagger Multipart ์š”์ฒญ ์˜ค๋ฅ˜์ปจํŠธ๋กค๋Ÿฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค.@PostMapping( value = "/files", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public ResponseDto upload( @RequestPart("requestDto") RequestDto requestDto, ..
2025 ํšŒ๊ณ 
ยท
ํšŒ๊ณ 
ํšŒ๊ณ ๊ฐ€ ์ข€ ๋Šฆ์—ˆ๋‹ค...^^์‹œ๊ฐ„์ด ์ด๋ ‡๊ฒŒ๋‚˜ ๋น ๋ฅด๊ฒŒ ํ˜๋Ÿฌ๊ฐ€๋‹ค๋‹ˆ.. ๋งค๋ฒˆ ํšŒ๊ณ ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ด๋Ÿฐ ๋งˆ์Œ์ด๋‹ค. 2025๋…„, ๋‚˜์—๊ฒŒ ์–ด๋–ค ํ•ด์˜€๋‚˜ ๐Ÿ‘€ 2025๋…„์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด "๋งŽ์ด ํ”๋“ค๋ฆฌ๋ฉฐ ์„ฑ์žฅํ•œ ํ•ด"์˜€๋‹ค. ์™ธ๋ถ€์  ์š”์ธ์œผ๋กœ ์ธํ•ด ๋ฉ˜ํƒˆ์ด ๋งŽ์ด ํ”๋“ค๋ ธ๊ณ , ๋‹ค์‹œ ๋งˆ์Œ์„ ๋‹ค์žก๋Š” ๊ณผ์ •์—์„œ ๋‚˜๋Š” ์–ด๋–ค ๊ฒƒ์— ์˜ˆ๋ฏผํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š” ์‚ฌ๋žŒ์ธ์ง€, ๋ฌด์—‡์„ ์ถ”๊ตฌํ•˜๋ฉฐ ์–ด๋–ค ์‚ฌ๋žŒ์ด ๋˜๊ณ  ์‹ถ์€์ง€๋ฅผ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ์ด์ „๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋‹จ๋‹จํ•ด์กŒ๋‹ค๊ณ  ๋А๊ปด์„œ ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•ด๋ดค๋‹ค.์‹ค๋ฌด์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒฝํ—˜ํ–ˆ๊ณ , ๊ธฐ์ˆ ์ ์œผ๋กœ๋„ ์ด์ „๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ค„๋ดค๋‹ค. ์ผ์€ ๋ถ„๋ช…ํžˆ ํ•ด๋ƒˆ๊ณ , ๋ฐฐ์šด ๊ฒƒ๋„ ๋งŽ์•˜์ง€๋งŒ ๋งˆ์Œ์€ ๋Š˜ ๋ณต์žกํ–ˆ๋‹ค. ์˜ฌํ•ด๋Š” ์œ ๋‚œํžˆ ๋‚˜๋ฅผ ํž˜๋“ค๊ฒŒ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์•˜๋‹ค. ํ”ํžˆ '๋นŒ๋Ÿฐ' ๊ฐ™์€ ์‚ฌ๋žŒ์ด ๋‚ด ์ฃผ๋ณ€์— ์žˆ์—ˆ๊ณ , ๋“œ๋ผ๋งˆ์—์„œ๋‚˜ ๋ณด๋˜..
[Spring] ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก ๋ฐฉ์‹๊ณผ ์‹ฑ๊ธ€ํ†ค ๋ณด์žฅ ์›๋ฆฌ @Component vs @Bean
ยท
Spring
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํ๋ฆ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ์ด ๋ฐฉ์‹์˜ ์ฐจ์ด๋Š” ์Šคํ”„๋ง์ด ๋นˆ์„ ์ธ์‹ํ•˜๋Š” ์ถœ๋ฐœ์ ์ด ์–ด๋””๋ƒ์˜ ์ฐจ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. 1. ์„ค์ • ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ˆ˜๋™ ๋“ฑ๋ก ๋ฐฉ์‹ (@Configuration, @Bean)์Šคํ”„๋ง์€ ์›๋ž˜ “์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์–ธ์ œ, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ• ์ง€"๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ์ด ์ฒ ํ•™์ด ๊ฐ€์žฅ ์ง์ ‘์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ @Configuration๊ณผ @Bean์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.@Configurationpublic class MyClassConfig { @Bean public MyClass myClass() { return new MyClass(); }}@Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” ..
[Java] Enum์€ ์™œ ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅผ๊นŒ?
ยท
Java
Enum์ด๋ž€์„œ๋กœ ์—ฐ๊ด€๋œ ๊ณ ์ •๋œ ์ƒ์ˆ˜ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.๋‹จ์ˆœํžˆ ์ƒ์ˆ˜๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ์ปดํŒŒ์ผ ์‹œ์ ์— ํด๋ž˜์Šค ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋™์ž‘ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํด๋ž˜์Šค๋‹ค. Enum Class ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผpublic enum Example { ONE, TWO, THREE}์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜๋ฉด, ๊ฐœ๋…์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.public final class Example extends Enum { public static final Example ONE = new Example("ONE", 0); public static final Example TWO = new Example("TWO", 1); public static final E..