โ๏ธ์๋ฌ ๋ฉ์์ง
Error executing DDL "drop table if exists user cascade " via JDBC [Syntax error in SQL statement "drop table if exists [*]user cascade "; expected "identifier";]
๐ป ๊ฐ๋ฐ ํ๊ฒฝ
- Framework : Spring Boot`3.2.3`
- DB : MySQL(๋ก์ปฌ), H2(ํ ์คํธ)
- Library : JPA, QueryDSL`5.0.0`
- Test : JUnit
๐ ์์ธ
Spring์์ JPA Repository ํ ์คํธ๋ฅผ ์งํํ๋๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค.
DB๋ ๋ก์ปฌ์์ ๊ฐ๋ฐ์ ์ํด MySQL์ ์ฌ์ฉํ๊ณ ์์ง๋ง, ํ ์คํธ๋ฅผ ์ํด์ ๋ด์ฅํ ์ธ๋ฉ๋ชจ๋ฆฌ DB์ธ H2๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค.
๊ทธ๋ฆฌ๊ณ `@BeforeEach`์์ ํ ์คํธ ์คํ ์ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ธฐ ์ํด ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํด์ฃผ๋ ์์ ์ ํด์ฃผ๊ณ ์์๋ค.
์๋ฌ๋ User Entity์ ์ฐ๋๋ `userRepository`์์ `deleteAll()`์ ์คํํ๋ ๋ฐ ๋ฐ์ํ๋ค.
@DataJpaTest
@Import(QueryDSLConfig.class)
class XXXRepositoryTest {
@Autowired
UserRepository userRepository;
...
@BeforeEach
public void setUp() {
/* ๊ธฐ์กด ๋ฐ์ดํฐ ์ญ์ */
userRepository.deleteAll(); //์ฌ๊ธฐ์ ์๋ฌ ๋ฐ์
...
}
...
}
Error executing DDL "drop table if exists user cascade " via JDBC [Syntax error in SQL statement "drop table if exists [*]user cascade "; expected "identifier";]
user ํ ์ด๋ธ์ ๋๋กญํ๋ ๊ณผ์ ์์ SQL ๋ฌธ๋ฒ ์๋ฌ๊ฐ ๋ฌ๋ค. ์๋ณ์๊ฐ ํ์ํ๋ค๊ณ ํ๋ค.
์๋ณ์๋ ์์ ๋ฐ์ดํ(')๋ ํฐ ๋ฐ์ดํ(")์ ๋ฌถ์ฌ์ ์ฌ์ฉ๋๋ค.
์๋ณ์๊ฐ ํ์ํ ์ด์ ๋ user๊ฐ H2์ ์์ฝ์ด์ด๊ธฐ ๋๋ฌธ์ ์์ฝ์ด๋ก ์ธ์๋๋ค. ๋ฐ๋ผ์ ํ ์ด๋ธ๋ช ์ผ๋ก user๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
MySQL์์๋ ํ ์ด๋ธ๋ช ์ผ๋ก user๋ฅผ ์ฌ์ฉํด๋ ๋ฌธ์ ๊ฐ ์์์ง๋ง, H2์์๋ ์๋๋ค.
H2 ๊ณต์๋ฌธ์์ Advanced ์น์ ์ ๊ฐ๋ฉด ์์ฝ์ด(Keywords) ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค.
๐ก ํด๊ฒฐ
๋ฐฉ๋ฒ1) User Entity ์ด๋ฆ ๋ณ๊ฒฝ
๊ตฌ๊ธ๋ง์ ํ๋ฉด ๊ฐ์ฅ ๋ง์ด ๋์ค๋ ํด๊ฒฐ์ฑ ์ค ํ๋๋ก User Entity์ ์ด๋ฆ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํ๋ผ๊ณ ํ๋ค.
Entity ํด๋์ค์ @Table ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ ๋ณต์ํ์ธ `Users`๋ ๋น์ทํ ๋ป์ ์ด๋ฆ์ธ `Member`๋ก ๋ณ๊ฒฝํ๋ผ๊ณ ํ๋ค.
@Table(name = "users")
public class User {
...
}
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ํ์ง๋ง, ํ ์ด๋ธ ์ด๋ฆ์ด User๋ก ๋ฐ๋์ด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๊ฐ๋ฐํ๋ฉด์ ๊ตฌ์ถํ๋ DB์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋์๋ค. User ํ ์ด๋ธ๊ณผ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ ํ ์ด๋ธ์์ FK๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. (๊ธฐ์กด ์ฝ๋์ ๋งคํ์ด user๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ๋งคํ๋๋ ๊ฐ์ฒด๋ค์ users๋ก ์์ ํด์ค์ผ ํ๋๋ฐ ์ํด์ค์ ๊ทธ๋ ๋ค.)
๊ธฐ์กด์ ๊ฐ๋ฐํ๊ณ ์๋ DB์ ํ ์ด๋ธ์ด ์๋ค๋ฉด ์ข์ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์๋ค. ํ ์คํธ์ ์ค์ ํ์ผ(application.yml)์์ user๊ฐ ์์ฝ์ด๊ฐ ์๋์ ๋ช ์ํด์ฃผ๋ฉด ๋๋ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ด ํ๊ฒฝ์์๋ ์๋จนํ๋ค. ํด๊ฒฐ์ด ์๋๋ค.
spring:
datasource:
url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER
๋ฐฉ๋ฒ2) ์์ฝ์ด๋ฅผ ์๋ณ์๋ก ์ฌ์ฉํ๊ธฐ
ํ ์ด๋ธ ์ด๋ฆ์ด ๋ฐ๋๋ ๊ฒ์ด ์ซ์ด์ User๋ฅผ Entity์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์์ฝ์ด๋ฅผ ์๋ณ์๋ก ์ฌ์ฉํด์ผ ํ๋ค.
๋ฐฑํฑ(`)์ ์ฌ์ฉํด์ ์์ฝ์ด๋ฅผ ๊ฐ์ธ๋ฉด ์๋ณ์๋ก ์ธ ์ ์๋ค.
H2 ์์ฝ์ด์ธ user๋ฅผ `@Table` ์ด๋ ธํ ์ด์ ์ ํตํด ํ ์ด๋ธ์ ์ด๋ฆ์ ๋ฐฑํฑ(`)์ผ๋ก ๊ฐ์ธ์ค์ ์ ์ํด์ฃผ์.
@Table(name = "\"user\"")
๐ ์ฐธ๊ณ
- https://mag1c.tistory.com/434#google_vignette
- Spring Data JPA (H2 database) is returning DDL error during table creation : https://stackoverflow.com/questions/70797504/spring-data-jpa-h2-database-is-returning-ddl-error-during-table-creation