# 에러 키워드
- Schema-validation: missing table [tableName]
- spring.jpa.hibernate.ddl-auto=validate
- aws를 이용한 RDS(데이터베이스)서버에 배포 후 ddl-auto를 validate로 변경시 테이블을 찾을 수 없다는 에러
- lower_case_table_names
# 발단
현재 현대백화점에서 인턴을 하고 있다. 스프링부트를 이용하여 프로젝트를 진행중에 있고 로컬에서 개발하던 서버를 곧 있을 사내테스팅을 위해 테스팅서버에 aws의 RDS와 연동하고 난 후, ddl-auto를 validate로 변경했을때 에러가 발생했다. 내가 도메인으로 작성했던 @Entity들을 찾지 못하는 에러가 발생했다. 그러나 RDS에 접속해서 테이블들과 엔티티를 확인했을때는 정상적으로 존재했다.
에러 트레이싱을 유심히 살펴보면서 하이버네이트가 DB의 validate를 위해 찾았던 테이블 [comment]가 소문자임을 알았다. 나는 DB의 테이블명을 대문자로 따로 지정해줬는데, 이 과정에서 무엇인가 문제가 발생한것 같았다.
@RequiredArgsConstructor
@AllArgsConstructor
@Builder
@Slf4j
@Getter
@Entity
@Table(name = "COMMENT") // 대문자로 정의했다.
public class Comment extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "comment_id")
private Long id;
// .. 생략 ..
}
이 대문자와 소문자를 구별하는 과정에서 무엇인가 오류가 발생하는 것같은 낌새를 느꼈다. 그래서 관련 키워드를 찾았고 데이터베이스 설정에는 lower_case_table_names라는 설정값이 존재함을 알 수 있었다.
## lower_case_table_names
lower_case_table_names은 총 3가지의 속성이 존재함을 알 수 있었다.
- lower_case_table_names = 0
- 테이블 이름에 대한 대소문자 구분이 유지되며, 테이블 이름을 지정할 때 입력한 그대로 저장됨
- lower_case_table_names = 1
- 테이블 이름이 저장될 때 모두 소문자로 변환 ( 대소문자를 구분하지 않는다 )
- lower_case_table_names = 2
- 테이블 이름이 저장될 때 모두 대문자로 변환
신기하게도 내 local서버에서는 ddl-auto를 validate로 바꾸고 빌드를 해도 별다른 문제가 발생하지 않았다. 그래서 lower_case_table_names가 배포환경의 DB와 로컬 환경의 DB가 다르다면 해당 오류로 인해서 문제가 발생할 가능성이 높다고 판단하고 비교해보았다.
SQL쿼리문으로 DB에 아래의 쿼리를 날리면 해당 값에 대한 DB설정이 나온다.
SHOW VARIABLES LIKE 'lower_case_table_names'
신기하게도 로컬에서는 2의 셋팅값을 가지고 실행되고 있었다. 배포서버에서는 0의 값으로 실행되고 있었다. 여튼 이 해당값을 따로 대소문자를 구분하지 않도록 1의 설정값으로 변경시키도록 배포서버를 바꾸어 해결하기로 했다.
그러나 저 lower_case_table_names의 값을 1로 바꾸기 위해서는 RDS의 파라미터 그룹을 변경해줘야 한다. 파라미터 그룹을 변경하기 위해서는 결국 RDS를 다시만드는 방법밖에 없고 RDS를 다시 만드는 방법을 택해 해당 에러를 해결했고 정상적으로 validate로 DB를 가동시킬 수 있었다.
# 해결
💪TODO LIST
1. 새로운 RDS 파라미터 그룹 만들기 ( lower_case_table_name )을 1로 설정
1. 기존 RDS를 지우고 새로운 RDS 만들기 ( 가동중인 DB의 파라미터 그룹을 수정 할 수는 없다 )
RDS의 원하는 데이터베이스를 옵션으로 선택한다.
프리티어를 선택해주고, 마스터 사용자 이름과 패스워드를 적절히 입력한다.
사실 여기까지의 과정은 일반적으로 RDS를 등록하는것과 다를게 없지만, 미리 변경해둔 파라미터 그룹을 [추가 구성]을 클릭하고 난후 DB파라미터 그룹을 등록해야 한다.
파라미터 그룹은 아래를 보고 설정하여 생성하고 해당 RDS에 위처럼 등록해주면 된다. 이제 RDS를 다시 엮어주고 보안그룹의 InBound를 모두에게 열어주어 DB의 값에 접근 가능하게 해주면 세팅이 끝난다.
## 파라미터 그룹 설정하기
위 처럼 나에게 맞는 파라미터 그룹을 설정해줘야한다.
lower_case_table_names를 1로 설정해준다. 나는 이외에도 아래 3가지 항목을 하는김에 추가적으로 지정해줬다.
- time_zone을 Asia/Seoul
- char로 검색하면 나오는 6개의 항목을 utf8mb4 ( 이모지 저장 가능 )
- collation_connection과 collation_server을 utf8mb4_general_ci로 설정
# 마치며
배포 서버에서 validate로 잘 도는 것을 알 수 있다. 이로써 에러 처리 완료다.
배포서버에는 update, create 와 같은 설정을 사용하지 말라고해서, 이를 위해 적용하다가 만나 이슈였다. 그래도 잘 해결해서 다행이다.
# 참고
'• 개발 > Spring boot' 카테고리의 다른 글
[SpringBoot] Amazon Linux 2 AMI JDK11 설치 및 타임존 설정하기 (0) | 2023.08.08 |
---|---|
[SpringBoot&트러블슈팅] 연관관계 편의 메소드에서 @Builder를 사용할때 발생하는 NPE (0) | 2023.07.06 |
[트러블슈팅] 타임리프에서 소수점 반올림 하는 방법 (0) | 2023.05.20 |
[트러블슈팅] Github Action으로 스프링부트 CI/CD 적용중 생기는 경로 이슈 (0) | 2023.05.05 |
[Spring boot] 스프링부트 배포시 타임리프(Thymeleaf) 경로 에러 (0) | 2023.02.17 |