[ํŒ€ ํ”„๋กœ์ ํŠธ - ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ, zero9] ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… - ๋ฐฐํฌ ์งํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋™ ์‹คํŒจ: Flyway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ ํ–‰ ๋ฌธ์ œ

1. ๐Ÿ›‘ ํ˜„์ƒ ํŒŒ์•… (Symptoms)EC2 ๋ฐฐํฌ ์งํ›„ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋กœ๊ทธ์ƒ Table not found , Validation failed ๋“ฑ DB ์Šคํ‚ค๋งˆ ๊ด€๋ จ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘์„ ๋ฐ˜๋ณตํ•ด๋„ ๋ฌธ์ œ ์ง€์†2. ๐Ÿ” ์›์ธ ๋ถ„์„ (Root Cause)๋ฒ”์ธ: DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋™ ์ˆœ์„œ ๋ฌธ์ œ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— RDS์— ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์ด ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœFlyway๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ถ„๋ฆฌ๋œ ๊ตฌ์กฐ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ์ด ํ•„์š”ํ–ˆ์Œ3. โœ… ํ•ด๊ฒฐ ๋ฐฉ์•ˆ (Resolution)Step 1. Flyway๋ฅผ ๋…๋ฆฝ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ธฐ๋™ ์ˆœ์„œ ๋ช…์‹œDocker Compose์—์„œ Flyway๋ฅผ ๋ณ„๋„ ์„œ๋น„์Šค๋กœ ์ •์˜depends_o..

  • textsms

[ํŒ€ ํ”„๋กœ์ ํŠธ - ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ, zero9] ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… - Docker Compose ๋ฐฐํฌ ์ค‘ ์„œ๋น„์Šค ๊ธฐ๋™ ์‹คํŒจ: ์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํฌ ์˜คํ•ด

1. ๐Ÿ›‘ ํ˜„์ƒ ํŒŒ์•… (Symptoms)Docker Compose๋กœ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ ์‹คํ–‰ (docker ps ) ๋˜์—ˆ์Œ์—๋„ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Redis / RabbitMQ / Elasticsearch์— ์—ฐ๊ฒฐ ์‹คํŒจ๋กœ์ปฌ์—์„œ๋Š” ์ •์ƒ ๋™์ž‘ํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ EC2 ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ ์—๋Ÿฌ ๋ฐœ์ƒ2. ๐Ÿ” ์›์ธ ๋ถ„์„ (Root Cause)๋ฒ”์ธ: ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ์˜ localhost ์˜คํ•ดDocker ํ™˜๊ฒฝ์—์„œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋…๋ฆฝ๋œ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ localhost ๋Š” → Redis / RabbitMQ / Elasticsearch๊ฐ€ ์•„๋‹Œ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ด๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ ์—†๋˜ ์„ค์ •์ด ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฆ‰์‹œ ์žฅ์• ๋กœ ์ „ํ™˜3. โœ… ํ•ด๊ฒฐ ๋ฐฉ์•ˆ (Resolu..

  • textsms

[ํŒ€ ํ”„๋กœ์ ํŠธ - ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ, zero9] ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •

1. Docker Compose ๊ธฐ๋ฐ˜ ๋‹จ์ผ ์„œ๋ฒ„ ๋ฐฐํฌ๋ฐฐ๊ฒฝEC2 ๋‹จ์ผ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ Redis, RabbitMQ, Elasticsearch ๋“ฑ ์—ฌ๋Ÿฌ ์˜์กด ์„œ๋น„์Šค๋ฅผ ํ•จ๊ป˜ ์šด์˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์น˜•๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ ํ™˜๊ฒฝ ๊ตฌ์„ฑ๊ณผ ์‹คํ–‰ ์ˆœ์„œ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.๊ณ ๋ คํ•œ ์„ ํƒ์ง€๊ฐ ์„œ๋น„์Šค๋ฅผ EC2์— ์ง์ ‘ ์„ค์น˜ํ•˜์—ฌ ๊ฐœ๋ณ„ ์‹คํ–‰Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ˆ˜๋™ ์‹คํ–‰Docker Compose๋ฅผ ํ™œ์šฉํ•œ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ๊ฒฐ์ • ๋ฐ ์ด์œ Docker Compose๋ฅผ ์‚ฌ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (JAR), Flyway, Redis, RabbitMQ, Elasticsearch (Nori ๋ถ„์„๊ธฐ ํฌํ•จ)๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฐํฌ ๋‹จ์œ„๋กœ ์ •์˜ํ•˜์—ฌ ํ™˜๊ฒฝ ๊ตฌ์„ฑ๊ณผ ์‹คํ–‰์„ ํ‘œ์ค€ํ™”depends_on ๊ณผ ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ†ต..

  • textsms

์ข€๋น„ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ถ€ํ™œ - 0.1์ดˆ์˜ ๋™์‹œ์„ฑ ์‚ฌํˆฌ ๐ŸŽ๏ธ

1. ๋ฌธ์ œ ์ •์˜๐Ÿšจ ๊ณ ๊ฐ ์ปดํ”Œ๋ ˆ์ธ ๋ฐ ์šด์˜ ์ด์Šˆ๊ณ ๊ฐ - "์ข…๋ฃŒ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ๋Š”๋ฐ ์™œ ์•„์ง ๊ฒฐ์ œ๊ฐ€ ๋˜์ฃ ? ๐Ÿคท๐Ÿป‍โ™€๏ธ ๊ฒฐ๊ตญ ๋‚˜์ค‘์— ์ทจ์†Œ ๋‹นํ–ˆ์–ด์š”"์šด์˜ - "00:00 ์ข…๋ฃŒ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋Œ๋ ธ๋Š”๋ฐ, ์ผ๋ถ€ ๊ฒŒ์‹œ๋ฌผ์ด ์—ฌ์ „ํžˆ 'ํŒ๋งค ์ค‘'์œผ๋กœ ๋‚จ์•„ ์ถ”๊ฐ€ ์ฃผ๋ฌธ์ด ๋“ค์–ด์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค."๐ŸงŸ‍โ™€๏ธ ํ˜„์ƒ - ์ข€๋น„ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ถ€ํ™œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ '์ข…๋ฃŒ'์‹œ์ผฐ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋น„์Šทํ•œ ์‹œ๊ฐ„๋Œ€์— ๋ฐœ์ƒํ•œ ๋‹ค๋ฅธ ์ž‘์—… (ex. ์œ ์ €์˜ ์ฃผ๋ฌธ ์ทจ์†Œ, ํƒ€ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์žฌ๊ณ  ๋ณต๊ตฌ ๋“ฑ)์— ์˜ํ•ด ๊ฒŒ์‹œ๋ฌผ ์ƒํƒœ๊ฐ€ ๋‹ค์‹œ 'ํŒ๋งค ์ค‘'์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ํ˜„์ƒ ๋ฐœ์ƒ ๐Ÿ” ์›์ธ ๋ถ„์„๊ฐฑ์‹  ๋ถ„์‹ค๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ํŒŒ๊ดด ๋ฐœ์ƒ: ๋™์ผํ•œ ์‹œ๊ฐ„์— ์Šค์ผ€์ค„๋Ÿฌ (์ข…๋ฃŒ ๋กœ์ง)์™€ ์‚ฌ์šฉ์ž ์š”์ฒญ (์ฃผ๋ฌธ ์ทจ์†Œ / ์žฌ๊ณ  ๋ณต๊ตฌ)์ด ๊ฐ™์€ DB ๋กœ์šฐ๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•˜๋ ค ์‹œ๋„JPA sa..

  • textsms

[ํŒ€ ํ”„๋กœ์ ํŠธ - ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ, zero9] ์žฌ๊ณ  ์ฐจ๊ฐ - ๋น„๊ด€์  ๋ฝ ํ…Œ์ŠคํŠธ

1. ๋ฌธ์ œ ์ƒํ™ฉ (Problem)์ƒํ™ฉ: ๊ณต๊ตฌ (์žฌ๊ณ  5๊ฐœ)์— 100๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์ฃผ๋ฌธ์„ ์‹œ๋„ํ•˜๋Š” ์ƒํ™ฉ์˜ˆ์ƒ๋˜๋Š” ๋ฌธ์ œ: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์žฌ๊ณ ๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋ฉด์„œ, ์‹ค์ œ ์žฌ๊ณ ๋ณด๋‹ค ๋งŽ์€ ์ฃผ๋ฌธ์ด ์ƒ์„ฑ๋˜๋Š” ์ดˆ๊ณผ ํŒ๋งค (Over-selling) ํ˜„์ƒ ์šฐ๋ ค 2. ํ•ด๊ฒฐ ์ „๋žต - ๋น„๊ด€์  ๋ฝ (Pessimistic Lock)์„ ํƒ ์ด์œ : ์žฌ๊ณ  ๋ฐ์ดํ„ฐ๋Š” ์ถฉ๋Œ์ด ์žฆ์€ (High Contention) ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ, ์‹คํŒจ ํ›„ ์žฌ์‹œ๋„ํ•˜๋Š” ๋‚™๊ด€์  ๋ฝ๋ณด๋‹ค DB ์ˆ˜์ค€์—์„œ ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋น„๊ด€์  ๋ฝ์ด ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ณด์žฅ์— ์œ ๋ฆฌํ•˜๋‹ค๊ณ  ํŒ๋‹จ๊ตฌํ˜„ ๋ฐฉ์‹: LockModeType.PESSIMISTIC_WRITE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SELECT ์‹œ์ ๋ถ€ํ„ฐ ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ๊นŒ์ง€ ํ•ด๋‹น ๋กœ์šฐ(Row)์— ์ž๋ฌผ์‡ ๋ฅผ ๊ฑธ์–ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จ@Lock..

  • textsms

[25.12.31 TIL] ๋ฒ ์ด์ง ์„ธ์…˜ - Hello Spring

01. ์›น ์„œ๋ฒ„ ํ๋ฆ„ 02. ์Šคํ”„๋ง์ด๋ž€ ?Ioc ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ-> ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ IoC ๊ธฐ๋ฐ˜์˜ DI๋ฅผ ์ œ๊ณตํ•˜๋Š” ApplicationContext๋ผ๋Š” IoC ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. ์ด ๊ตฌ์กฐ๋ฅผ spring-boot-starter-web ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜์กด์„ฑ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฉ‹์ง„ ์›น์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 03. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ (IoC ์ปจํ…Œ์ด๋„ˆ)์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ (IoC ์ปจํ…Œ์ด๋„ˆ)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ๊ฐœ์ฒด์— ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์š”์ฒญ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•œ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. 04. ์Šคํ”„๋ง ๋นˆ (Spring Bean)IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด์„œ ์ƒ์„ฑ..

  • textsms