[Spring] JPA(Java Persistance API) ๊ธฐ๋ณธ

[์›๋ณธ ๋งํฌ]

JPA๋Š” ORM(Object Realation Mapping) ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋‹ค.
์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๋ฉด, OOP ์–ธ์–ด์˜ ๊ฐ์ฒด์™€, SQL DB๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  JPA ์ž์ฒด๋Š” ๊ทธ๋ƒฅ ์ธํ„ฐํŽ˜์ด์Šค๋ผ์„œ ํ˜ผ์ž ์ž‘๋™ํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ, Hibernate, EclipseLink ๋“ฑ์ด ์žˆ๋‹ค.
๋ณดํ†ต ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ ๋” ์“ฐ๋Š”๊ฒƒ๊ฐ™๋‹ค.

๋จผ์ € ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณ ๋ฅด๊ณ , ์˜์กด์„ฑ์„ ์ด๋ž˜์ €๋ž˜ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
๋‚œ mysql์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ž˜ ์„ธํŒ…ํ•ด๋†“๊ณ 


์†์„ฑ ํŒŒ์ผ์—, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ uri๊ณผ, ์‚ฌ์šฉ์ž๋ช…, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

์•ˆํ•˜๋ฉด ์‹คํ–‰๋„ ์•ˆ๋œ๋‹ค.



์—”ํ‹ฐํ‹ฐ

๊ทธ๋ฆฌ๊ณ  @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค.
์ด๊ฒŒ ๋ฐ”๋กœ ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰(Row) ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํƒ€์ž…์ด๋‹ค.
๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๊ณ , ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ”์€ ์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ

์ด๋ ‡๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ํ•„๋“œ์˜ ์ด๋ฆ„์„ ์ผ์น˜์‹œํ‚ค๊ณ , ๋””ํดํŠธ ์ƒ์„ฑ์ž๋ฅผ ๊ผญ ๋‘ฌ์•ผํ•œ๋‹จ๊ฑธ ์žŠ์ง€ ๋ง์ž.
Getter๋‚˜ Setter๋Š” ๋ญ ๋‘ฌ๊ณ  ๋˜๊ณ , ์•ˆ ๋‘ฌ๋„ ๋˜๊ณ .

๊ทธ๋ฆฌ๊ณ  Entity์˜ ์ธ์ž๋กœ ํ…Œ์ด๋ธ”๋ช…์„ ์คฌ๋Š”๋ฐ, ์ด๋ฆ„์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค๋ช…์„ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
Table ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


Column ์–ด๋…ธํ…Œ์ด์…˜

๊ฐ ์†์„ฑ(์—ด:column)์˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Column ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ์‹ค์ œ ์†์„ฑ๋ช…๊ณผ ํ•„๋“œ์˜ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.



Jpa ๋ ˆํฌ์ง€ํ† ๋ฆฌ

๊ทธ๋‹ค์Œ์— ํ•  ๊ฑด ์ ‘๊ทผ์šฉ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” ํŠน์ • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•œ๋‹ค.

JpaRepository์— ์ •์˜ํ•œ ์—”ํ‹ฐํ‹ฐํƒ€์ž…๊ณผ Long๋งŒ ์ง‘์–ด๋„ฃ์œผ๋ฉด ๋œ๋‹ค!
๊ตฌํ˜„์€ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์Šคํ”„๋ง์ด ์•Œ์•„์„œ ๋งˆ์ˆ ์„ ๋ถ€๋ ค์„œ ์ฑ„์›Œ์ค€๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ์ €๊ฑธ ํ•œ๋ฒˆ ๋Œ๋ ค๋ณด์ž
์ผ๋‹จ์€ ์ฝ”๋“œ์˜ ๋‹จ์ˆœํ•จ์„ ์œ„ํ•ด main ํ•จ์ˆ˜์—์„œ๋งŒ ๋Œ๋ ค๋ณผ ๊ฒƒ์ด๋‹ค.
run ๋ฉ”์„œ๋“œ๋Š” context ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—ฌ๊ธฐ์„œ ๋นˆ ๊ฐ์ฒด๋“ค์„ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์œ„์˜ NameRepository ํด๋ž˜์Šค๋Š” @Repository๋ฅผ ๋‹ฌ์•˜์œผ๋ฏ€๋กœ ๋‹น์—ฐํžˆ ๋นˆ์ฆˆ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋œ๋‹ค.
JpaRepository์—” ์ด๋Ÿฐ์ €๋Ÿฐ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘์—์„œ๋„ findAll์€ select *์˜ ํšจ๊ณผ๋ฅผ ๋‚ธ๋‹ค.
์—”ํ‹ฐํ‹ฐ๋ฅผ ์ „๋ถ€ ๊ฐ€์ ธ์˜จ๋‹จ ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋Œ๋ฆฌ๋ฉด


์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์™ธ์— ์ง์ ‘ ๊ฒ€์ƒ‰์šฉ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๊นŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์ถ”๊ฐ€ ์„ ์–ธ์„ ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿผ ๋ญ

์ž˜ ์ฐพ์•„์˜จ๋‹ค.

์—ฌ๊ธฐ์„  ๋‹จ์ˆœํ•จ์„ ์œ„ํ•ด์„œ ๋Œ€์ถฉ main์—์„œ๋งŒ ๋Œ๋ ธ์ง€๋งŒ,
์ œ๋Œ€๋กœ ์“ฐ๋ ค๋ฉด ํ•„๋“œ์—์„œ @Autowired ๋“ฑ์œผ๋กœ ์ฃผ์ž…ํ•˜๋ฉด ๋œ๋‹ค.



๋ฐ์ดํ„ฐ ์‚ฝ์ž…

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ save ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

URI๋กœ name ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์„œ DB์— ์‚ฝ์ž…ํ•˜๋„๋ก ํ–ˆ๋‹ค.


์ž˜ ๋“ค์–ด๊ฐ„๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์‚ฝ์ž… ์‹œ๋„ ์‹œ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

jpa jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist

์ด๊ฒŒ... ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ž๋™ ๋งคํ•‘ ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ๊ธฐ๋Šฅํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋ ‡๋‹ค.
๊ทธ๋Ÿผ ์—”ํ‹ฐํ‹ฐ ์ •์˜์—์„œ strategy๋ฅผ AUTO์—์„œ IDENTITY๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ํ•ด๋‹น ์‹๋ณ„์ž ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

์•„๋‹ˆ๋ฉด ์ปฌ๋Ÿผ๋ช…์„ ๋ช…์‹œํ•ด๋„ ์ข‹๋‹ค.



๋ฐ์ดํ„ฐ ์‚ญ์ œ

๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋ ค๋ฉด delete ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
deleteById๋Š” id๋ฅผ ๋ฐ›์•„์„œ ๋ฐ”๋กœ ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ €๊ฑธ ๋Œ๋ฆฌ๋ฉด

์ด๋ ‡๋˜ ๊ฒŒ

์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•˜๋ฉด

๋‚ ๋ผ๊ฐ„๋‹ค.


์ฐธ์กฐ
[์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” ์ž๋ฐ” ์›น ๊ฐœ๋ฐœ]
https://blog.woniper.net/255
https://blog.woniper.net/258
https://stackoverflow.com/questions/49813666/table-dbname-hibernate-sequence-doesnt-exist