์คํ๋ง ํ๋ ์์ํฌ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ํ
์คํธ๋ฅผ ์งํํ ๋, ๊ฐํน org.hibernate.exception.SQLGrammarException
์ค๋ฅ๊ฐ ๋์์ ๋นํฉํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ด์ฉ์ ๋ํ ํด๊ฒฐ๊ณผ์ ์ด ๋ธ๋ก๊ทธ๋ค์ ์ ๋๋ก ๋์์์ง ์์ ๋ง์ด ๊ณ ์์ ํ๋ค..
๊ทธ ๋ฐฐ๊ฒฝ ๋ด์ฉ์ ๋ํด
๊ฐ์ด ๊ณต๋ถํด๋ฉด์ ์ค๋ฅ์ ๋ํด ํ์ ํด๋ณด์!
์ด ์ค๋ฅ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ํ ์ํ์ค๋ ํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์ ๋ ์ฃผ๋ก ๋ฐ์ํ๋๋ฐ
ํนํ, @DataJpaTest
๋ฅผ ์ฌ์ฉํ์ฌ JPA ๊ตฌ์ฑ ์์๋ฅผ ํ
์คํธํ๋ ๊ฒฝ์ฐ,
ํ
์คํธ ํ๊ฒฝ ์ค์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง์ง ์์์ ๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ฐ์ @DataJpaTest ์๋ํด ์์๋ณด๋๋ก ํด๋ณด์.
DataJpaTest๋?
@DataJpaTest
๋ Spring Boot์์ JPA ๊ด๋ จ ๊ตฌ์ฑ ์์๋ฅผ ํ
์คํธํ ๋ ์ฌ์ฉํ๋ ์ฃผ์ ์ด๋
ธํ
์ด์
์
๋๋ค. ์ด ์ด๋
ธํ
์ด์
์ ํ
์คํธ ์ค์ธ JPA ๊ตฌ์ฑ ์์๋ง์ ๋ก๋ํ๋ฉฐ, ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋
๋ฆฝ์ ์ธ ํ
์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
๋ฐ์ ๊ฐ๋ฅํ ์ค๋ฅ ์๋๋ฆฌ์ค
- ์ํ์ค ๋๋ฝ ์ค๋ฅ:์ด ์ค๋ฅ๋
@GeneratedValue
์ด๋ ธํ ์ด์ ์ผ๋ก ID๋ฅผ ๊ด๋ฆฌํ ๋ ํ์ํ ์ํ์ค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฑ๋์ด ์์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.org.hibernate.exception.SQLGrammarException: could not prepare statement [Sequence "FRANCHISE_SEQ" not found; SQL statement: select next value for franchise_seq [90036-214]] [select next value for franchise_seq]
- ํ
์ด๋ธ ๋๋ฝ ์ค๋ฅ:์ด ์ค๋ฅ๋ ํ
์คํธ ์ค ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์ ๋ ๋ํ๋๋ค.
org.hibernate.exception.SQLGrammarException: could not prepare statement [Table "FRANCHISE" not found (this database is empty); SQL statement: /* insert for enha.eodilo.domain.Franchise *]
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ต์ ๋ฐ๋ฅธ ๋ค๋ฅธ ์ค๋ฅ ๋ฐ์
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, @GeneratedValue
์ ๋ณ๋์ ์ ๋ต(strategy)์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ค.
๋ง์ฝ ์ ๋ต์ IDENTITY
๋ก ์ค์ ํ๊ฑฐ๋, MySQL ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธ ์ ๋ต์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์ Table not found
์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ํ
์คํธ ์ JPA๊ฐ ์๋์ผ๋ก ํ
์ด๋ธ์ ์์ฑํ์ง ์์ ๋ ๋ฐ์ํ๋ฉฐ, ํนํ ddl-auto
๊ฐ none
์ด๋ validate
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
ํด๋น๋ด์ฉ์ ์๋ ํฌ์คํ
์ฐธ์กฐ
์ฆ, @GeneratedValue ์ฌ์ฉ์
strategy ๊ฐ SEQUENCE ๋ฉด 1๋ฒ์ธ ์ํ์ค ๋๋ฝ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ
strategy ๊ฐ IDENTITY ๋ฉด 2๋ฒ์ธ ํ ์ด๋ธ ๋๋ฝ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ๋ป,
์ด์ ํด๋น ์ค๋ฅ์ ๋ํด ํด๊ฒฐ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. SQL ์คํฌ๋ฆฝํธ, Flyway, Liquibase ๋ฑ์ ์ฌ์ฉํ์ฌ ํ ์คํธ ์คํ ์ ์ ์คํค๋ง๋ฅผ ์ค๋น
SQL ์คํฌ๋ฆฝํธ ์ฌ์ฉํ๊ธฐ ์์
์ ์ ๊ฒฝ์ฐ์๋ SQL ์คํฌ๋ฆฝํธ๋ก ์์๋ฅผ ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
Spring Boot ํ๋ก์ ํธ์์๋ src/main/resources
๋๋ ํ ๋ฆฌ ์๋์ schema.sql
ํ์ผ์ ๋๊ณ ์ด ํ์ผ์ ํ
์ด๋ธ ์์ฑ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํ
์คํธ ํ๊ฒฝ์์๋ src/test/resources
์ schema.sql
์ ๋์ด ํ
์คํธ ์ ์ฉ ์คํค๋ง๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ schema.sql
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
CREATE TABLE franchise (
franchise_id BIGINT AUTO_INCREMENT PRIMARY KEY,
admin_id BIGINT,
name VARCHAR(255),
kind VARCHAR(255),
...
);
DROP SEQUENCE IF EXISTS franchise_SEQ;
CREATE SEQUENCE franchise_SEQ INCREMENT BY 50;
2. @DataJpaTest
์ properties
์ค์ ์ถ๊ฐ
ํ ์คํธ ์ด๋ ธํ ์ด์ ์ ์ง์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ์ฌ, ํ ์คํธ ์ค ID ์์ฑ ์ ๋ต ๋ฑ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
@DataJpaTest(properties = { "spring.jpa.hibernate.ddl-auto=update"})
3. ํ
์คํธ ์ ์ฉ application.yml
์ค์
spring:
jpa:
hibernate:
ddl-auto: update
ddl-auto ๋ฅผ none์ด๋ validate ๊ฐ ์๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
์ด ๋ฐฉ๋ฒ๋ค์ ํตํด, ํ
์คํธ ํ๊ฒฝ์์ @GeneratedValue
์ด๋
ธํ
์ด์
์ด ์ ์ฉ๋ ์ํฐํฐ์ ID๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌ๋๋ฉฐ, ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ๊ณผ ์ํ์ค๊ฐ ์กด์ฌํ์ง ์๋ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.