일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 우리에프아이에스
- 우리에프아이에스 #
- 클라우드 서비스 개발
- AWS
- 맥
- 클라우드 서비스 개발 #
- route 53
- spring
- sts
- Java
- 우리FIS아카데미 #
- 맥OS
- K-디지털트레이닝
- 로드밸런스
- 맥북
- 우리FISA #
- 도메인
- 우리FIS아카데미
- 글로벌소프트웨어캠퍼스
- Gradle
- mysql
- M2
- springboot
- jdk
- dbeaver
- HTTP
- 우리FISA
- https
- 리눅스
- Today
- Total
<<개발일지>>
Caused by: java.sql.SQLSyntaxErrorException: Table 'test8.cardlist' doesn't exist -작성중- 본문
Caused by: java.sql.SQLSyntaxErrorException: Table 'test8.cardlist' doesn't exist -작성중-
개발하는지호 2024. 4. 1. 13:48네, 정확히 말씀하셨습니다. spring.jpa.hibernate.ddl-auto=create 설정으로 애플리케이션을 시작할 때, JPA/Hibernate는 엔티티 클래스들을 스캔하고 해당하는 테이블을 데이터베이스에 생성합니다. 만약 엔티티 간에 관계가 정의되어 있고, 이 관계를 나타내는 외래 키(foreign key)나 조인 테이블(join table)이 필요한 경우, 이 관계에 해당하는 모든 엔티티의 테이블이 데이터베이스에 성공적으로 생성되어 있어야 합니다.
JPA/Hibernate가 테이블을 생성하는 과정에서 다음과 같은 상황이 발생할 수 있습니다:
- 순서 문제: JPA/Hibernate가 테이블 생성 순서를 관리하며, 관계에 있는 엔티티들의 테이블을 올바른 순서로 생성해야 합니다. 하지만, 특정 테이블에 대한 외래 키 생성을 시도할 때 참조되는 테이블이 아직 생성되지 않았다면, "테이블을 찾을 수 없다"는 오류가 발생할 수 있습니다.
- 참조 무결성 제약 조건: 외래 키 제약 조건을 만족시키기 위해서는, 참조하는 테이블이 먼저 존재해야 합니다. 만약 참조하는 테이블이 생성되기 전에 참조를 가지는 테이블을 생성하려고 한다면, 데이터베이스는 참조 무결성 제약 조건을 위배한다고 판단하여 오류를 발생시킬 수 있습니다.
- 트랜잭션 및 일관성: 데이터베이스는 일관성을 유지하기 위해 엄격한 규칙을 적용합니다. 외래 키로 연결되는 테이블들은 모두 생성되어 있어야 하며, 이들 사이의 관계는 데이터베이스의 참조 무결성 규칙을 준수해야 합니다.
하지만, 보통 JPA/Hibernate는 이러한 종속성과 생성 순서를 내부적으로 관리하여, 엔티티 간의 관계와 외래 키 제약 조건을 고려하여 올바른 순서로 테이블을 생성합니다. 따라서, 애플리케이션 시작 시 "테이블을 찾을 수 없다"는 오류가 나타나면, 이는 JPA/Hibernate가 테이블 생성 순서를 올바르게 관리하지 못하고 있는 것일 수 있습니다. 하지만 이러한 상황은 드물며, 대부분의 경우 JPA/Hibernate의 내부 로직이 순서 문제를 적절히 처리합니다.
문제가 지속되면, 엔티티 간의 관계 정의나 데이터베이스 연결 설정을 다시 확인하고, 필요한 경우 로그를 통해 구체적인 오류 메시지와 생성 순서를 확인하여 문제를 해결할 수 있습니다.

데이터베이스에 테이블이 성공적으로 생성되었고, 초기 "테이블을 찾을 수 없다"는 오류에도 불구하고 애플리케이션이 정상적으로 작동한다면, 이는 테이블 생성과 애플리케이션의 데이터 접근 사이에 발생하는 일시적인 타이밍 문제일 수 있습니다. 이 경우, 몇 가지 고려할 사항이 있습니다:
1. 로딩 및 초기화 순서 조정
- 애플리케이션의 구동 순서나 데이터 접근 로직을 조정하여, 모든 테이블이 완전히 생성되고 나서야 데이터 접근 로직이 실행되도록 할 수 있습니다. 예를 들어, Spring Framework를 사용하는 경우, 의존성 주입을 통해 로딩 순서를 제어하거나, 이벤트 리스너를 활용해 데이터베이스 초기화 후 특정 로직이 실행되도록 구성할 수 있습니다.
2. 지연 로딩 활용
- JPA에서는 @ManyToOne과 @OneToMany 같은 관계 매핑에서 fetch = FetchType.LAZY 설정을 통해 지연 로딩을 구현할 수 있습니다. 이를 통해 실제 엔티티의 관계가 접근되는 시점까지 관계의 로딩을 지연시킴으로써 초기 애플리케이션 로드 시 데이터베이스 관련 오류를 방지할 수 있습니다.
3. 애플리케이션 로그와 오류 메시지 검토
- 애플리케이션 로그와 오류 메시지를 자세히 검토하여, 테이블 생성과 관련된 오류가 실제로 어떤 시점에 발생하는지, 어떤 조건에서 발생하는지 분석합니다. 이 정보는 문제의 근본 원인을 찾고 해결책을 모색하는 데 도움이 됩니다.
4. 트랜잭션 관리와 오류 처리
- 트랜잭션 관리를 통해 데이터베이스 작업의 일관성과 무결성을 보장하고, 예외 처리 로직을 구현하여 특정 오류 발생 시 적절한 복구 또는 알림 로직이 실행되도록 할 수 있습니다.
5. 환경 및 설정 검토
- 데이터베이스 서버의 성능, 네트워크 지연, 하드웨어 자원 등 시스템 환경에 따라 테이블 생성과 애플리케이션의 데이터 접근 사이에 발생할 수 있는 타이밍 문제를 최소화하기 위해 환경을 최적화하거나, 설정을 조정할 필요가 있을 수 있습니다.
결론적으로, 테이블이 성공적으로 생성되었다면 이는 좋은 징조이지만, "테이블을 찾을 수 없다"는 초기 오류 메시지가 나타난 원인을 정확히 파악하고 해결하는 것이 중요합니다. 이는 잠재적인 데이터 무결성 문제나 미래의 오류를 예방하는 데 도움이 됩니다.
'JPA & JDBC' 카테고리의 다른 글
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl -작성중- (1) | 2024.04.01 |
---|---|
JDBC (0) | 2024.01.20 |
MySQL 잘못된 문법을 작성하면 발생하는 에러 (0) | 2024.01.18 |
"select * from todo where id = ?" 사용법 (1) | 2024.01.18 |
DB 데이터 불러올 때 [try catch finally 방식과 try resources 의 차이] (0) | 2024.01.16 |