[에러]
Docker에서 MySQL 컨테이너를 생성하며 기존 LibraryAPI에서 사용한 것과 마찬가지로
초기 데이터 .sql 을 데이터베이스에 기입하여 서버를 동작하려 했다.
하지만 초기 데이터.sql 을 Dockerfile 을 통해 MySQL 컨테이너의 기본 디렉토리에 복사했음에도
ERROR 1146 (42S02) at line 1: Table 'library_db.book' doesn't exist 에러, 즉 데이터의 테이블 부재
에러가 발생하여 MySQL 컨테이너가 실행되지 않았다.
[원인]
기존 LibraryAPI 에서는 application.yml 에서 Spring Data JPA의 ddl-auto 기능을 사용했다.
ddl-auto 기능은 @Entity 매핑된 엔티티 객체들을 자동으로 DB에 테이블로 생성해주는 역할이다.
하지만 Docker MySQL 컨테이너는 JPA의 ddl-auto 없이 MySQL 그 자체를 독립적으로 사용하는 것이다.
즉, Docker MySQL 컨테이너를 사용하려면
1. 초기 데이터 .sql 파일에서 어느 데이터베이스를 선택할지
2. 초기 데이터 .sql 파일에서 테이블을 언제 생성할 지 모두 수동으로 설정해주어야 했다.
[해결]
[기존 초기 데이터 book.sql 파일]
INSERT INTO book (BOOK_ID, BOOK_TITLE, BOOK_AUTHOR, BOOK_PUBLISHER)
VALUES (1, '해리포터','스네이프','Publisher A');
INSERT INTO book (BOOK_ID, BOOK_TITLE, BOOK_AUTHOR, BOOK_PUBLISHER)
VALUES (2, '삼국지','관우','Publisher A');
[2가지 원인을 해결한 초기 데이터 book.sql 파일]
USE library_db;
CREATE TABLE IF NOT EXISTS book (
BOOK_ID INT PRIMARY KEY,
BOOK_TITLE VARCHAR(255),
BOOK_AUTHOR VARCHAR(255),
BOOK_PUBLISHER VARCHAR(255)
);
INSERT INTO book (BOOK_ID, BOOK_TITLE, BOOK_AUTHOR, BOOK_PUBLISHER)
VALUES (1, '해리포터','스네이프','Publisher A');
INSERT INTO book (BOOK_ID, BOOK_TITLE, BOOK_AUTHOR, BOOK_PUBLISHER)
VALUES (2, '삼국지','관우','Publisher A');
[결론]
이 문제를 해결하는 2일 가까이 되는 시간동안 도커의 목적에 대해 조금 더 알게되었다.
도커는 애플리케이션에서 사용중(의존중)인 여러 서비스를 각 각 독립된 요소인 컨테이너로 분리하여
마이크로서비스 아키텍처를 쉽게 구성하고 관리한다는 목적이 있다.
즉, MySQL 데이터베이스를 독립된 요소로 관리하며 초기 데이터를 넣는다고 하면
MySQL 데이터베이스에서 .sql 초기 데이터가 들어갈 테이블을 별도로 생성해야 하는게 당연하지만,
기존 자바 애플리케이션에서는 @Entity 매핑된 엔티티 객체들의 테이블들을
자동으로 생성해주는 Spring Data JPA의 ddl-auto 기능과 이를 자동으로 MySQL에 적용시켜 사용해온 만큼
데이터베이스 테이블 생성의 필요성에 대해 전혀 예상하지 못했던 것이 원인같다.
한마디로 문제 해결의 핵심은 기술의 핵심 이해와 사고의 유연성 부족!! = 경험의 부족 ㅎㅎ
'마주쳤던 이슈 기록' 카테고리의 다른 글
#10. Docker - java.net.UnknownHostException: mysql (0) | 2023.06.01 |
---|---|
#9. Docker build - error from sender: context canceled (0) | 2023.05.29 |
#8. JUnit - The following parts of the payload were not documented (0) | 2023.05.19 |
#7. 로그인 이후 response Header에 JWT 미전달 (0) | 2023.05.18 |
#6. 유저의 행동 횟수 조건 reset = Spring Data JPA 자동메서드 (0) | 2023.05.11 |