๐Ÿ’ป PROJECT/[Spring Boot, React] ๋…์„œ ์Šต๊ด€ ๊ด€๋ฆฌ ์„œ๋น„์Šค

[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] H2 ์˜ˆ์•ฝ์–ด ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ์ธํ•œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํŒจ ๋ฐ InitData ์˜ค๋ฅ˜

devCloud 2026. 5. 4. 10:26
728x90
TROUBLESHOOTING

H2 ์˜ˆ์•ฝ์–ด ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ์ธํ•œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํŒจ ๋ฐ InitData ์˜ค๋ฅ˜

1. ๋ฐœ์ƒ ๋ฐฐ๊ฒฝ

๋ฆฌํŒฉํ† ๋ง ๋‹จ๊ณ„์—์„œ ๋กœ์ปฌ ํ™˜๊ฒฝ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด InitData๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. InitData๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ž๋™์œผ๋กœ insertํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋‹ค.

 

H2 ์ธ๋ฉ”๋ชจ๋ฆฌ DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ธฐ ์œ„ํ•ด InitData๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ดํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ monthly_goals ํ…Œ์ด๋ธ”์„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” InitData ์‹คํ–‰ ์‹œ์ ์ด ํ…Œ์ด๋ธ” ์ƒ์„ฑ๋ณด๋‹ค ๋นจ๋ผ์„œ ์ƒ๊ธด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์‹ค์ œ ์›์ธ์€ H2 ์˜ˆ์•ฝ์–ด๋ฅผ ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

2. ๋ฌธ์ œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ค‘ InitData๊ฐ€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ insertํ•˜๋Š” ์‹œ์ ์— monthly_goals ํ…Œ์ด๋ธ”์„ ์ฐพ์ง€ ๋ชปํ•ด ์‹คํ–‰์— ์‹คํŒจํ–ˆ๋‹ค.

Table "MONTHLY_GOALS" not found; SQL statement:
insert into monthly_goals (created_at, goal_count, month, updated_at, user_id, year, id) values (...)

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๋ฉด ๋‹จ์ˆœํžˆ ํ…Œ์ด๋ธ”์ด ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ InitData๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค.


3. ์›์ธ ํŒŒ์•… ๊ณผ์ •

1๋‹จ๊ณ„ - InitData ์‹คํ–‰ ์‹œ์  ๋ฌธ์ œ๋กœ ์˜์‹ฌ

์ฒ˜์Œ์—๋Š” InitData ์‹คํ–‰ ์‹œ์ ์ด ํ…Œ์ด๋ธ” ์ƒ์„ฑ๋ณด๋‹ค ๋นจ๋ผ์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹คํ–‰ ์‹œ์ ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™„์ „ํžˆ ๋œฌ ์ดํ›„๋กœ ๋Šฆ์ถ”๊ธฐ ์œ„ํ•ด ApplicationReadyEvent๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹คํ–‰ ์‹œ์ ์„ ๋Šฆ์ถ˜ ๋’ค์—๋„ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹จ์ˆœํ•œ ์‹คํ–‰ ์ˆœ์„œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

 

2๋‹จ๊ณ„ - ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋กœ๊ทธ ํ™•์ธ

๋กœ๊ทธ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด๋‹ˆ create table monthly_goals ๋กœ๊ทธ๋Š” ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ฆ‰, Hibernate๊ฐ€ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์„ ์‹œ๋„ํ•˜๊ธด ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ƒ์„ฑ์— ์‹คํŒจํ•œ ์ƒํ™ฉ์ด์—ˆ๋‹ค.

 

3๋‹จ๊ณ„ - DDL ์‹คํ–‰ WARN ๋กœ๊ทธ ํ™•์ธ

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋กœ๊ทธ ์œ„์ชฝ์„ ํ™•์ธํ•˜์ž DDL ์‹คํ–‰ ์ค‘ ๊ฒฝ๊ณ  ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜์–ด ์žˆ์—ˆ๋‹ค.

GenerationTarget encountered exception accepting command : Error executing DDL "create table monthly_goals (...month integer not null...)"

[*]month integer not null

์›์ธ์€ month, year๊ฐ€ H2 ์˜ˆ์•ฝ์–ด์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. H2์—์„œ๋Š” ์˜ˆ์•ฝ์–ด๋ฅผ ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด monthly_goals ํ…Œ์ด๋ธ” ์ƒ์„ฑ์ด ์‹คํŒจํ–ˆ๋‹ค.

๊ฒฐ๊ตญ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ InitData๊ฐ€ insert๋ฅผ ์‹œ๋„ํ–ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ Table "MONTHLY_GOALS" not found ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ดˆ๊ธฐ MonthlyGoal ์—”ํ‹ฐํ‹ฐ ์ฝ”๋“œ๋‹ค. year, month ํ•„๋“œ๊ฐ€ ๋ณ„๋„ ์ปฌ๋Ÿผ๋ช… ์ง€์ • ์—†์ด ์‚ฌ์šฉ๋˜์–ด H2 ์˜ˆ์•ฝ์–ด์™€ ์ถฉ๋Œํ–ˆ๋‹ค.

AnnualGoal ์—”ํ‹ฐํ‹ฐ์˜ year ์ปฌ๋Ÿผ๋„ ๊ฐ™์€ ์ด์œ ๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ๋‹ค.

์ดˆ๊ธฐ AnnualGoal ์—”ํ‹ฐํ‹ฐ ์ฝ”๋“œ๋‹ค. year ํ•„๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ DB ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๋งคํ•‘๋˜๋ฉด์„œ H2 ์˜ˆ์•ฝ์–ด์™€ ์ถฉ๋Œํ–ˆ๋‹ค.


4. ํ•ด๊ฒฐ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ๋ช…์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋˜, ์‹ค์ œ DB ์ปฌ๋Ÿผ๋ช…๋งŒ H2 ์˜ˆ์•ฝ์–ด๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด @Column(name = ...)์„ ์‚ฌ์šฉํ•ด year๋Š” goal_year๋กœ, month๋Š” goal_month๋กœ ๋งคํ•‘ํ–ˆ๋‹ค.

MonthlyGoal ์—”ํ‹ฐํ‹ฐ์—์„œ @Column(name = "goal_year"), @Column(name = "goal_month")๋กœ DB ์ปฌ๋Ÿผ๋ช…์„ ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ๋‹ค.

AnnualGoal ์—”ํ‹ฐํ‹ฐ์—์„œ year ํ•„๋“œ๋ฅผ goal_year ์ปฌ๋Ÿผ์œผ๋กœ ๋งคํ•‘ํ•˜๋„๋ก ์ˆ˜์ •ํ•œ ์ฝ”๋“œ๋‹ค.

ํ•„๋“œ๋ช…์€ ๊ธฐ์กด์ฒ˜๋Ÿผ year, month๋ฅผ ์œ ์ง€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Java ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋Œ€์‹  DB ์ปฌ๋Ÿผ๋ช…๋งŒ goal_year, goal_month๋กœ ๋ณ€๊ฒฝํ•ด H2 ์˜ˆ์•ฝ์–ด ์ถฉ๋Œ์„ ํ”ผํ–ˆ๋‹ค.


5. ์ฐธ๊ณ 

  • H2์—์„œ๋Š” year, month, day, value, key ๋“ฑ์ด ์˜ˆ์•ฝ์–ด์— ํ•ด๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MySQL์—์„œ๋Š” ์ •์ƒ ๋™์ž‘ํ•˜๋”๋ผ๋„ H2์—์„œ๋Š” ์˜ˆ์•ฝ์–ด ์ปฌ๋Ÿผ๋ช… ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ์ƒ์„ฑ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MODE=MySQL ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์˜ˆ์•ฝ์–ด ์ถฉ๋Œ ๋ฌธ์ œ๊ฐ€ ํ•ญ์ƒ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ํ…Œ์ŠคํŠธ์šฉ H2๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ๋ช…์ด DB ์˜ˆ์•ฝ์–ด์™€ ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

6. ๋ฐฐ์šด ์ 

H2๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ปฌ๋Ÿผ๋ช…์ด H2 ์˜ˆ์•ฝ์–ด์™€ ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ํŠนํžˆ year, month์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„๋„ DB ์ž…์žฅ์—์„œ๋Š” ์˜ˆ์•ฝ์–ด์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ Hibernate์˜ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํŒจ๊ฐ€ ํ•ญ์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ๋‹จ๊ณ„์—์„œ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜๋กœ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํŒจ๊ฐ€ WARN ๋ ˆ๋ฒจ๋กœ๋งŒ ์ฐํžˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ insert ์‹œ์ ์—์„œ์•ผ Table not found ์˜ค๋ฅ˜๋กœ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, Table not found ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” insert ์‹คํ–‰ ์‹œ์ ๋งŒ ๋ณผ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ๋ณด๋‹ค ์•ž์„  DDL ์ƒ์„ฑ ๋กœ๊ทธ์—์„œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํŒจ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€๋„ ํ•จ๊ป˜ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
728x90