DBeaver로 MariaDB 데이터베이스 관리하기

nooori·2024년 7월 3일

MariaDB에 접속해서 테이블을 만들고 데이터를 관리하고 하려면 tool이 필요한데 windows 환경도 제공해주는 DBeaver를 설치하고 사용해보았다.

새 데이터베이스 연결

DBeaver를 설치하고 나서 '새 데이터베이스 연결'로 새로운 connection을 만든다.

Password에는 전에 컨테이너 실행할 때 설정해뒀던 비밀번호를 입력하고 Test Connection 버튼을 눌러서 Connected라는 문구가 뜨면 완료해서 연결을 마무리하면 된다.

데이터베이스 생성

이렇게 localhost가 생기고 여기에다가 이제 Database를 만들면 된다. localhost를 선택할 다음 오른쪽 버튼을 눌러 'Create' -> 'Database'를 하면 다음과 같은 창이 뜬다.

데이터베이스 이름을 지정하고 Charset은 utf8mb4, Collation은 utf8mb4_unicode_ci로 지정하고 확인하면 된다. 원래 Charset은 utf8인걸로 알고 있는데 utf8은 없고 utf8mb4가 있어서 뭐가 다른지 봤더니 utf8로 세팅이 되어있으면 이모지가 입력되지 않아서 이를 해결하기 위해 나온게 utf8mb4라고 한다. 이모지를 사용할 것 같진 않지만 그래도 utf8이 없으니 utf8mb4로 설정했고 collation도 그에 맞게 설정하면 dev database가 만들어진 것을 볼 수 있다. 아래 링크를 참고했고 혹시 utf8와 utf8mb4의 차이점에 대해 더 자세히 알고 싶으면 들어가서 읽어보는 것을 추천한다!
https://cirius.tistory.com/1769

테이블 생성

그럼 이제 Databases와 그 외 파일들도 생성이 되고 이제 이 Databases에서 테이블을 생성하면 된다. Databases 파일 아래에 생성된 'dev' database에서 오른쪽 버튼을 눌러 'Create' -> 'Table'을 하면 테이블을 생성할 수 있는 창이 뜬다.

에러? SQL 편집기에서 직접 작성하기

table 이름을 입력하고 아래 save 버튼을 누르니

이런 창과 함께 테이블을 생성할 수 없다는 창이 떴다🤯 에러 메시지를 살펴 보니 MariaDB 서버 버전에 맞는 문법을 찾지 못해서 발생하는 오류로 주로 SQL 쿼리 문법이 잘못되었을 때 이럴 수 있다고 한다. 뭔가 테이블을 만들때 설정을 해야하는 것 같은데 DBeaver가 처음이다 보니까 어려웠다. 그래서 그냥 SQL 편집기를 열어서 거기서 CREATE문으로 테이블을 생성하는 걸 시도해봤다. 테이블에 들어가야 하는 내용들은 미리 만들어뒀던 제품 생성 페이지에서 입력해야하는 것 외에도 더 필요한 정보들을 바탕으로 생성했다.

테이블을 생성할 때 필수적으로 입력되어야 하는 열은 NOT NULL로 설정하고, 기본값이 필요한 열은 DEFAULT 옵션을 사용했다. 추가적인 설명이 필요한 경우에는 COMMENT를 추가했으며, 양의 정수만 입력될 수 있도록 UNSIGNED 옵션을 부여했다. createddate 열은 기본값을 현재 시간으로 설정하기 위해 current_timestamp를 사용했다. 그리고 product 테이블의 sellerid와 categoryid 열은 각각 seller 테이블과 category 테이블의 id 열을 참조하도록 관계를 설정했다. 그리고 image 테이블의 productid는 product 테이블의 id를 참조하니 이것도 외래키로 설정했다. 이 관계 설정에서는 상대 테이블의 기본키만을 참조할 수 있음을 유의해야 한다.

또 다시 에러! 테이블을 생성할 수 없다

저장을 한 다음에 ctrl + enter로 반영이 되는지 봤는데 에러가 났다😦

SQL Error [1005] [HY000]: Can't create table dev.t_product (errno: 150 "Foreign key constraint is incorrectly formed") 

진짜 말 그대로 외래 키 설정이 잘못되어서 dev.t_product 테이블을 생성할 수 없다는 것! 그래서 문법이 틀린 곳은 없는지 외래키와 참조 테이블을 중심으로 다시 보았다.

SQL 문법 다시 살펴보기

틀린 곳이 꽤 있었는데 우선 image 테이블의 productid는 product 테이블의 id를 참조하는데 image 테이블이 product 테이블보다 먼저 생성되었다. id를 참조하려고 해도 그 시점에는 product 테이블을 생성되지 않았으니 참조가 불가능하다. 반드시 참조할 테이블보다 뒤에 만들어야한다. 그래서 image 테이블을 product 테이블 뒤로 순서를 바꿨다. 그리고 정말 중요한 것 중에 하나인데 참조하는 외래키의 데이터 타입을 반드시 동일하게 해주어야한다. sellerid는 seller 테이블의 id를 참조하는데 seller 테이블의 id를 살펴보면 데이터 타입이 INT SIGNED인데 참조하는 sellerid는 INT 타입이다. 이렇게 타입이 다르면 안되고 반드시 동일하게 맞춰줘야한다. 그래서 같은 방법으로 categoryid도 수정해주었고 image 테이블의 productid product 테이블의 id를 참조하는데 데이터 타입이 맞지 않아서 product 테이블의 id 타입을 INT SIGNED로 맞춰주었다.

이제 테이블이 생성이 되겠지하고 이 이후로 몇십번을 확인하고 고치고 해봐도 같은 에러(Can't create table dev.t_image)가 나오면서 테이블을 생성할 수 없다고 했다. 혹시 오타가 있나 싶어 오타도 살펴보고 외래키에서 자꾸 에러가 나길래 데이터 타입, 순서, 기본키 등을 여러 차례 다 확인해봐도 문제를 해결할 수 없었다. 사실 여기서 거의 3시간은 보낸 거 같다.

해결방법을 찾다!

그래도 이 문제를 해결하려고 열심히 검색하는 도중에 만난 블로그(https://algorithmstudy-mju.tistory.com/154)에서 해결법을 찾았다! powershell에서 MariaDB에 접속해서 직접 테이블을 생성하는 것이다! SQL 편집기에서 category, seller, user는 만들어졌어서 에러가 났던 product를 만들어보았다.

그리고 SHOW로 dev 테이블을 확인해보았더니 product 테이블이 성공적으로 잘 생성된 것을 볼 수 있었다🤗 같은 방법으로 image 테이블도 생성했다.

그리고 제품을 팔고 제품을 등록하는 판매자도 한명은 등록되어 있어야할 것 같아서 INSERT로 판매자 한명을 추가했다. 그리고 SELECT 문으로 잘 되었는지 확인해보았는데 성공적으로 잘 들어가져있는걸 볼 수 있다! 아직도 잘 모르겠지만 애초에 SQL 편집기에서 작성하면 안되는거였을 수도 있겠다라는 생각이 들었다.

DBeaver에서 데이터 추가하기

후에 SQL을 작성해보는 과정에서 필드 하나가 더 필요해서 이것저것 만져보면서 DBeaver에서 테이블 필드 만드는 법을 익히게 되었다. 직접 작성하는 것보다 훨씬 간단해서 뭔가 허탈하기도 했지만 그래도 CREATE문으로 테이블 생성하고 외래키 관계 설정을 직접 작성해보았다는 것에 의미를 두기로 했다. 그리고 필요한 데이터 2가지정도 추가해보았다. row 추가한 다음에 필요한 데이터들 입력하고 save를 누르면 되는데 productname 데이터타입을 varchar(20) 해뒀더니 제목이 너무 길어서 에러가 났다. 그래서 varchar(100)으로 수정해주었더니 저장할 수 있었다.

마무리

데이터베이스도 실제로 처음 다뤄보았는데 DBeaver 툴도 사용법이 나한텐 쉽지 않아서 막막했지만 그래도 재밌는 경험이었다. 대학교 때 데이터베이스 수업을 정말 재밌게 들었는데 이론적으로는 많은 것을 배웠지만, 실제로 데이터베이스를 다뤄보지는 못했다. 과제나 시험도 직접 수기로 작성했었고 결과도 눈으로 확인할 수 없었지만 수업 내용 자체가 좋았고 데이터베이스가 알면 알수록 재밌었다. 그렇게 이론만 알고 있던 내용들을 직접 작성해보니 예전에 공부했던 내용들도 생각나면서 기분 좋게 문제들을 해결할 수 있었고 덕분에 중간에 놓지 않고 마무리할 수 있었다고 생각한다. 에러나 문제를 만나지 않았다면 시간은 오래 걸리지 않았을수도 있지만 문제들을 해결하면서 많은 것을 배웠다. 명령어를 공부하면서 데이터베이스가 어떻게 작동하고 연결되는지도 파볼 수 있었다. 이번 프로젝트를 통해 이론과 실무를 연결짓는 좋은 경험이었다😊 다음 포스트에서는 SQL 작성하는 것에 대해 이야기볼 계획이다!

0개의 댓글