티스토리 뷰
DB쪽을 엄청 빠삭하게 아는건 아니지만
JPA 사용하다가 DB 마다의 구조적 차이점이 꽤 영향을 주는걸 알게 되면서 간단하게 남겨본다.
보통은 데이터베이스 - 스키마 - 테이블 구조로 되어있고
데이터베이스 설정을 하고 엔티티에서 테이블 이름만 지정해놓고 사용하면
기본 디폴트 스키마를 기준으로 테이블 조회를 하게 되는데
다른 데이터베이스나 스키마를 다중 참조해야 할 때,
이 부분이 DB마다의 계층구조로 약간 상이해지는걸 발견했다.
모든 DB의 구조를 잘 안다면 큰 문제가 없었겠지만,
몇가지 DB만 쭉 사용하다가 어쩌다가 다른 DB를 쓸때 동일하게 설정했는데
table이 없다는 오류를 보고서 왜!!! 를 시전한것 같다.
보통 oracle 은 하나의 인스턴스에 계정별 스키마로 접근하게 되어있어
@Entity
@Table(name = "sales", schema = "jpa")
이렇게 스키마로 구분해서 다른 스키마 테이블을 맵핑했었다.
문제를 야기한 녀석들은 mysql(mariadb) 와 mssql 이었다.
mssql 은 데이터베이스를 생성하면 기본 디폴트 스키마로 dbo 가 생성되고
mysql 이나 mariadb 는 3계층 구조이며,
데이터베이스와 스키마가 동등한 것 처럼 보인다. (툴에서 봐도 스키마의 존재는 보이지 않음)
mariadb (mysql) 같은 경우는 schema 를 사용하면 테이블을 찾지를 못했다.
그래서 catalog 로 썼더니 그제서야 제대로 인식했고
(이 부분은 NO_CATALOG , NO_SCHEMA 옵션 설정에 따라 동작방식의 차이가 있으리라 본다.)
@Entity
@Table(name = "board", catalog = "jpa_test")
mssql 은 catalog와 schema 를 다 지정해줘야 인식했다.
디폴트 스키마여서 안적어 줘도 될 줄 알았는데 다중으로 바라볼때는 못잡는 것을 확인했다.
@Entity
@Table(name = "post", catalog = "jpa", schema = "dbo")
이러한 차이점이 발생한다는 것을 알게되면서
DB 계층 구조나 구축환경에 따라 상이해지게 될 꺼라 본다.
참고블로그
'Java > JPA, QueryDSL' 카테고리의 다른 글
[JPA] Soft Delete 사용. (feat.@SQLDelete) (0) | 2024.11.01 |
---|---|
[QueryDSL] LocalDateTime 형식 DateTimeExpression 으로 년월(YYYYMM)만 비교하기 (0) | 2024.03.07 |
[QueryDSL] Projections, @QueryProjection 을 사용하여 DTO로 반환하기 (1) | 2023.11.13 |
[QueryDSL] 다중 Datasource 설정하기 (feat.@Qualifier 사용) (0) | 2023.11.13 |
[JPA] LocalContainerEntityManagerFactoryBean의 setJpaPropertyMap을 설정할 때 사용할 수 있는 key 값 목록 (0) | 2023.10.24 |