반응형
Spring MVC 기반 웹 애플리케이션에서 데이터베이스 처리 중 다음과 같은 예외가 발생할 수 있습니다.
에러 메시지 예시
org.springframework.web.util.NestedServletException: Request processing failed;
nested exception is org.springframework.jdbc.UncategorizedSQLException:
예외 구조 설명
이 예외는 두 단계로 구성되어 있습니다.
1. NestedServletException
- Spring MVC에서 컨트롤러 메서드 실행 중 발생한 예외를 감싼(wrapper) 예외
- 실제 원인은
nested exception is ...
아래에 나타남
2. UncategorizedSQLException
- Spring JDBC가 처리할 수 없는(분류되지 않은) 원시 JDBC 예외가 발생했음을 의미
- 즉,
SQLException
을 특정한DataAccessException
타입으로 분류하지 못했을 때 발생
주로 발생하는 원인
원인 | 설명 |
---|---|
SQL 문법 오류 | 구문 오류, 오타, 컬럼 누락 등 |
잘못된 파라미터 바인딩 | null 또는 타입 불일치 |
JDBC 드라이버 문제 | DB와 드라이버 간 호환성 문제 |
ResultSet 처리 오류 | 잘못된 컬럼 인덱스 접근 등 |
트랜잭션 처리 누락 | 수동 커밋 환경에서 커밋 누락 |
🛠️ 해결 방법
1. Root Cause 확인
로그의 가장 하단에 실제 발생한 SQLException
메시지가 있습니다.
예시:
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "INVALID_COLUMN": invalid identifier
이 메시지가 가장 중요합니다. 문제 해결은 여기서 시작됩니다.
2. SQL 로그 확인
- 실행된 SQL 문장을 직접 확인하고, DB에서 실행해보세요.
- Spring JDBC 템플릿을 사용했다면, 로그 레벨을 DEBUG로 올려 SQL 출력 확인
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.jdbc.sqlonly=DEBUG
3. 파라미터 확인
- SQL에 바인딩된 값이 null인지, 혹은 타입이 일치하는지 체크
- 예:
WHERE id = ?
에String
이 들어가야 하는데null
전달된 경우
4. 예외 분류를 위한 설정 고려
- Spring은 일부 DB 예외를 명확히 분류하지 못하고
UncategorizedSQLException
으로 감쌉니다. - 이 경우 SQLExceptionTranslator 커스터마이징을 고려할 수 있습니다.
✅ 결론
이 오류는 SQL 실행 중 발생한 예외가 Spring에 의해 랩핑되어 전달된 것입니다.
문제 해결의 핵심은 "가장 아래쪽에 있는 원시 SQL 예외 메시지를 파악하는 것"입니다.
기본적인 SQL 문법과 바인딩 문제를 먼저 점검하고, 필요시 SQL 로그를 출력하여 문제를 추적하는 것이 좋습니다.
반응형