강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

changhui님의 프로필 이미지
changhui

작성한 질문수

스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!

멤버 서비스 CRUD에 JPA 적용하기 - II : EntityManager 만들기

데이터베이스 테이블이 중복 생성 되는 오류

작성

·

51

0

영상 52분에서 로그인이 성공되는 반면 저는 로그인이 계속 실패나와서 무엇이 문제인지 확인하는데 데이터베이스 테이블이 두 개가 생성된 것을 확인했습니다.

image.png

기존에 있던 테이블은 USER_MEMBER 인데, Entity 객체를 만들고 나서 user_member 테이블이 생성되었고 애플리케이션 실행 후 다시 가입을 하면 user_member 데이터베이스에 저장되며 기존 기능들은 에러 없이 정상 작동이 됩니다.. 궁금한 것은 데이터베이스 테이블이 저렇게 두 개 생성된건데 제가 무엇을 잘못해서 만들어졌는지 또 이대로 사용하는데 문제는 없는지 궁금합니다..

코드는 선생님 코드랑 다른 부분이 없습니다 ㅠ

답변 3

0

changhui님의 프로필 이미지
changhui
질문자

감사합니다 해결 했습니다.
제 환경이 윈도우 환경이지만 도커를 사용하고 도커 위에 mysql 컨테이너를 올려서 사용하고 있습니다. 강사님께서 말씀해주신것처럼 도커를 사용하니 설정값이 0으로 나오더군요..

이미 올라간 컨테이너 에서는 변경이 불가능해서 백업 받고 새로운 컨테이너 등록할때 lower_case_table_names 값 설정을 해주니 이제는 테이블이 한개만 나옵니다 !! 감사합니다!

0

블스님의 프로필 이미지
블스
지식공유자

changhui님 안녕하세요,

지방 출장 일정으로 답변이 다소 늦어진 점 양해 부탁드립니다.

 

말씀해주신 상황을 보면 USER_MEMBER와 user_member 두 개의 테이블이 생성된 이유는 MySQL의 테이블 이름 대소문자 구분 설정과 관련이 있을 가능성이 높습니다.

MySQL에서 테이블 이름의 대소문자 구분 여부는 운영체제(OS)에 따라 다르며, 또한 MySQL 자체 설정 값에도 영향을 받습니다.

 

Windows는 기본적으로 대소문자를 구분하지 않지만, Linux는 기본적으로 대소문자를 구분합니다.

또한 MySQL 설정 값 중 lower_case_table_names의 값에 따라 테이블 이름 처리 방식이 결정되는데요, 해당 설정은 아래 쿼리로 확인할 수 있습니다.

SHOW VARIABLES LIKE 'lower_case_table_names';

결괏값(value)으로

'0'이면 대소문자를 구분합니다.(Linux, 일부 Mac)

'1'이면 테이블 이름을 소문자로 통일해서 처리합니다.(Windows)

'2'이면 저장은 원래 이름으로 하되, 비교는 소문자로 합니다.(일부 Mac)

 

changhui님께서 Windows를 사용하고 계시다면 lower_case_table_names 값이 '1'일 가능성이 높고, Mac을 사용 중이시라면 '0'일 가능성이 높습니다.

현재 USER_MEMBER와 user_member 테이블이 동시에 존재하고, 로그인 기능이 특정 테이블에만 연결되어 있다면, 설정이나 Entity 매핑에서 일관성이 필요한 상황으로 보입니다.

운영체제와 MySQL 설정을 먼저 확인하신 뒤, 실습 환경에 맞게 테이블 매핑을 정리하시면 정상적으로 동작할 수 있을 거예요.

 

항상 성실하게 실습에 임해주셔서 감사합니다.

앞으로도 차근차근 실력을 쌓아가시길 진심으로 응원합니다!

0

안녕하세요, 인프런 AI 인턴입니다.

changhui님이 겪고 계신 문제는 엔티티의 테이블 이름 설정과 관련이 있을 수 있습니다. USER_MEMBERuser_member 두 개의 테이블이 생성된 이유는 대소문자 구분 문제일 가능성이 큽니다. 이는 데이터베이스 설정이나 JPA 설정에서 테이블 이름을 대소문자를 어떻게 처리하는지에 따라서 다르게 나타날 수 있습니다.

  1. 테이블 이름 대소문자 문제:

    • JPA의 엔티티 클래스에서 @Table 애너테이션을 사용하여 테이블 이름을 지정할 때, 대소문자를 명확하게 설정해야 합니다.
    • 예를 들어, @Table(name = "USER_MEMBER")라고 지정해보세요. 그러면 해당 이름으로 통일될 것입니다.
  2. JPA 스키마 설정 확인:

    • spring.jpa.hibernate.ddl-auto 설정을 통해 DDL 생성 방식을 설정할 수 있습니다 (none, validate, update, create, create-drop).
    • 이 설정이 update로 되어 있다면 존재하지 않는 테이블이 새로 생성될 수 있습니다. 따라서 설정을 확인해 보세요.
  3. 문제 해결 방법:

    • 기존의 엔티티 매핑 클래스에서 @Table(name = "USER_MEMBER")와 같은 방식으로 선언이 되어 있는지 확인합니다.
    • 데이터베이스와 JPA 설정을 확인하여 대소문자 구분이 어떻게 처리되고 있는지 점검하세요.

두 개의 테이블을 사용하는 것은 혼란을 유발할 수 있으니, 명확하게 대소문자를 지정하여 하나의 테이블로 통일하시길 추천드립니다. 데이터의 무결성을 보장하기 위해 잘 확인하시고, 필요하면 데이터베이스 관리자를 통해 테이블을 직접 확인하고 정리해보세요.

추가로, 코드 실행 전 데이터베이스의 상태를 확인하고 원하는 방향으로 테이블을 통일하는 것이 오류를 방지하는 데 도움이 됩니다.

이미지 출처: Inflearn Image
Spring Boot 문서 참고: Spring 초기화를 참고해주세요

문제가 해결되시기를 바랍니다! 😊

changhui님의 프로필 이미지
changhui

작성한 질문수

질문하기