[Spring] h2 db가 아닌 MySQL db를 Todo 앱과 연결하기 (+ Docker 설치)

민지·2024년 2월 29일
0

Spring과 Spring Data Jpa는 어떤 데이터베이스든지 잘 활용할 수 있다.

우리는 MySQL DB를 Docker 컨테이너에서 생성할 것이다. 그리고 우리 어플리케이션에서 MySQL db를 연결할 것이다.

1. Docker 실행하기

1-1. Docker 실행방법

docker 어플 실행 명령어는 다음과 같다.

docker run --detach 
--env MYSQL_ROOT_PASSWORD=dummypassword 
--env MYSQL_USER=todos-user 
--env MYSQL_PASSWORD=dummytodos 
--env MYSQL_DATABASE=todos 
--name mysql 
--publish 3306:3306 
mysql:8-oracle

docker run 명령어로, mysql:8-oracle을 실행시키고 있다. 8-oracle 버전인 이유는, 모든 운영체제에서 이 도커를 실행시키는 특정 버전이기 때문.

또, 다양한 환경변수들을 설정하고 있다.
위 명령어 코드에서 순서대로, 데이터베이스의 루트 패스워드, 사용자 id, 사용자 비번, MySQL database명으로 todos를 만들고, 컨테이너에 mysql이라는 이름을 붙였다.
또한, 특정 포트 3306으로 지정했다. (MySQL - 보통 포트 3306에서 실행된다.)

1-2. Docker 실행 에러 해결 1 : 이미 사용 중인 포트

포트 3306은 이미 실행 중이라고 에러가 떴다.

해결하기 위해, 다른 포트번호를 사용하게끔 했다.

docker run --detach 
--env MYSQL_ROOT_PASSWORD=dummypassword 
--env MYSQL_USER=todos-user 
--env MYSQL_PASSWORD=dummytodos 
--env MYSQL_DATABASE=todos 
--name mysql 
--publish 3307:3306 
mysql:8-oracle

위 코드는, 호스트 포트를 3306이 아닌 3307로 변경한 코드다!

1-3. Docker 실행 에러 해결 2 : mysql 컨테이너가 이미 사용 중이다.

위 실행화면에서도 알 수 있듯이, 기존에 쓰던 mysql 컨테이너를 지우고 재생성시켰다.

에러 메세지에 따르면 컨테이너 이름 "/mysql"은 이미 "d9b450ef047cb00a2644f60103c7d06fdaa89e5201d92426c4b499c67744692f" 컨테이너에 의해 사용 중이라고 했다.

이전에 생성된 컨테이너를 제거하는 명령어는 다음과 같다.

docker rm d9b450ef047cb00a2644f60103c7d06fdaa89e5201d92426c4b499c67744692f

그러면 해당 이름의 컨테이너가 제거되고, 다시 docker run 명령어로 새 컨테이너를 실행시킬 수 있다.

1-4. Docker 실행 에러 해결 3 : 도커가 이미 실행 중이라 에러나서 지웠더니, -> 먼저 멈추라고 에러메시지가 떴다.

에러 메세지를 보면 이미 "mysql"이라는 이름의 컨테이너가 실행 중인 것으로 나왔다. 이 컨테이너를 제거해야 새로운 컨테이너를 실행할 수 있다. 하지만 컨테이너가 실행 중이기 때문에 바로 제거할 수 없다. 그러므로 컨테이너를 먼저 중지하고 제거해야 한다.

docker stop 999c3e025f0b59a838afc5348f94e54a9bb7630be4ed66baca212fa9ff7f07fa
docker rm 999c3e025f0b59a838afc5348f94e54a9bb7630be4ed66baca212fa9ff7f07fa

다음 명령어와 같이, docker stop -> docker rm을 하고 나면 -> docker run 명령어를 통해 도커를 실행할 수 있게 된다

그외 docker 명령어

docker container ls

현재 실행중인 모든 도커 컨테이너를 알려준다.

2. MySQL 실행하기

2-1. MySQL 의존성 주입

pom.xml에 다음과 같이 dependency를 추가해주면 된다.

<dependency>
	<groupId>com.mysql</groupId>
	<artifactId>mysql-connector-j</artifactId>
</dependency>

2-2. application.properties 설정 및 실행 확인

MySQL 포트가 3307로 매핑되어 있기에, 프로젝트 설정도 이에 맞게 변경되어야 한다.

스프링부트 어플리케이션에서 MySQL과의 연결을 설정할 때, 데이터베이스 url 포트번호를 3307로 지정해야 한다.

spring.datasource.url=jdbc:mysql://localhost:3307/todos
spring.datasource.username=todos-user
spring.datasource.password=dummytodos
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

spring.jpa.hibernate.ddl-auto=update <!-- h2데이터베이스 서버와 같이, 시작과 동시에 테이블을 만들고 싶어진다면 이 설정을 해줘야 함-->

중간에 하다가, localhost에서 연결을 거부했습니다. 라는 에러가 나서 거의 3시간을 헤맸는데.. 그냥 바보였다. 어플리케이션 시작 버튼이랑 pom.xml 시작 버튼을 헷갈려서 어플리케이션 실행이 안 된 것이었다.

하지만, 로그인해서 들어가면

todo data가 없다.

h2 db와 다르게, 실제 데이터베이스(mysql)에 연결하면, data.sql이 실행되지 않기 때문.

2-3. mysqlsh

실제로 mysql에 연결이 되었는지 체크하기 위해, 가장 간단하게 mysql 연결하는 방법인 mysqlsh를 사용할 것이다.

mysqlsh macOS 설치

https://dev.mysql.com/downloads/shell/ 여기에서
DMG Archive, arm64 OS 를 다운받음

mysqlsh 설치 확인 및 사용법

터미널에 mysqlsh 라고 치면,

\connect todos-user@localhost:3307 하고,
비번 : dummytodos (docker run에서 설정한 비번 참고)

사용자 아이디와 비밀번호로 연결했으니 -> 데이터베이스명을 이용해, 해당 데이터베이스 스키마(todos)에 접근한다.

\sql 명령어 후, sql 작성문을 쓸 수 있는 곳으로 들어가게 된다.

h2 서버와 달리, mysql 데이터베이스의 장점은, 설령 어플리케이션이 재설정되어도 데이터가 날라가지 않는 것 !!!!!!




참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/

profile
배운 내용을 바로바로 기록하자!

0개의 댓글