발생 에러
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM COFFEE WHERE COFFEE_ID = : coffeeId]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT * FROM COFFEE WHERE COFFEE_ID = [*]: coffeeId"; expected "ALL (, ANY (, SOME ("; SQL statement:
SELECT * FROM COFFEE WHERE COFFEE_ID = : coffeeId [42001-214]] with root cause
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT * FROM COFFEE WHERE COFFEE_ID = [*]: coffeeId"; expected "ALL (, ANY (, SOME ("; SQL statement:
SELECT * FROM COFFEE WHERE COFFEE_ID = : coffeeId [42001-214]
와 이 에러 뭔소린지 모르겠다.
; SQL statement:
SELECT * FROM COFFEE WHERE COFFEE_ID = : coffeeId [42001-214]] with root cause
다른건 뭔지 모르겠지만 이게 근원적인 오류라는 것을 알 수 있다(root cause)
초보 개발자의 입장에서 SQL을 직접 작성한 부분은 단 하나 존재하는데 그 사실을 잊고 JDBC문제인가? 라는 생각을 먼저 했다.
해결위한 접근 방법
1. Mapper 들을 통해 체크
지금 생각해보면 어리석은 생각이다. SQL 이 문제니 당연히 Repo 를 찾아야하는데
2. Service 체크
-------------------------------------------------------------------------------------------------------------------
여기까지는 내가 문제 해결 방향을 잘 못 잡았던 것
3. SQL 문제니 Repo를 찾자
내가 만든 CoffeeRepo에서 위의 쿼리문과 같은 쿼리문 발견
@Query("SELECT * FROM COFFEE WHERE COFFEE_ID = : coffeeId") //오답
@Query("SELECT * FROM COFFEE WHERE COFFEE_ID = :coffeeId") //정답
Optional<Coffee> findByCoffee(Long coffeeId);
}
정답과 오답을 전부 기입했다.
당신은 한눈에 차이가 보이는가?
음... 생각해보면 단순하다 . SQL문은 띄어쓰기 하나에도 영향을 받는 언어다. 그렇기에 저기 보이는 띄어쓰기 한칸이 문제가 된 것
이걸 처음 찾고 멘붕에 빠졌다.
진짜 일반 JAVA 배울 때는 디버그를 통해 쉽게 이해했던 것 같은데 SPIRNG은 내부로 들어가는 순간 아직 정신을 못차리겠다.
스프링의 작동 방식은 대충 이해했다고 생각했는데 다시 한번 봐야겠다.
'이전 학습 내용' 카테고리의 다른 글
| 2023.02.12 백업의 충실함 (0) | 2023.02.12 |
|---|---|
| 스트림 학습 1 (0) | 2023.01.12 |
| 띠용~~ (스프링 타임리프 경로의 문제) (0) | 2022.12.26 |
| 재귀 알고리즘의 분석 (0) | 2022.12.23 |
| java 이진 검색 알고리즘 (0) | 2022.12.13 |