이재홍의 언제나 최신 Docker - Unit 12.3 MySQL 데이터베이스 설정하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Docker로 Spring Boot 애플리케이션 구축하기

이재홍 http://www.pyrasis.com

MySQL 데이터베이스 설정하기

MySQL 데이터베이스 Dockerfile은 따로 작성하지 않고, 공식 이미지인 mysql/5.7을 사용하도록 하겠습니다.

다음과 명령으로 네트워크와 볼륨, MySQL 데이터베이스 컨테이너를 생성합니다.

$ cd ~/gs-spring-boot/initial
~/gs-spring-boot/initial$ sudo docker network create spring-boot-network
~/gs-spring-boot/initial$ sudo docker volume create mysql-data
~/gs-spring-boot/initial$ sudo docker run -d --name db \
    -p 3306:3306 \
    --network spring-boot-network \
    -v mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=examplepassword \
    -e MYSQL_DATABASE=example \
    mysql:5.7

이번 예제에서는 앞에서 생성한 Spring Boot 앱의 ORM(Object Relational Mapping)인 Spring Data JPA를 사용하겠습니다.

먼저 application.properties 파일이 필요합니다. 다음 내용을 application.properties로 저장합니다.

~/gs-spring-boot/initial/src/main/resources/application.properties
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST}:3306/example
spring.datasource.username=root
spring.datasource.password=examplepassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • spring.datasource.url에는 jdbc:mysql://${MYSQL_HOST}:3306/example을 설정하여 앞에서 만든 MySQL 데이베이트 컨테이너에 연결할 수 있도록 합니다.
  • spring.datasource.username에는 root를 설정합니다.
  • spring.datasource.password에는 docker run 명령에서 -e MYSQL_ROOT_PASSWORD 옵션으로 지정한 값을 넣어줍니다. 여기서는 examplepassword입니다.
  • spring.datasource.driver-class-name에는 com.mysql.cj.jdbc.Driver를 설정합니다.

build.gradle 파일을 열고 다음과 같이 수정합니다.

~/gs-spring-boot/initial/build.gradle
plugins {
	id 'org.springframework.boot' version '2.7.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	runtimeOnly 'mysql:mysql-connector-java'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

그리고 HelloController.java 파일을 열고 다음과 같이 수정합니다.

~/gs-spring-boot/initial/src/main/java/com/example/springboot/HelloController.java
package com.example.springboot;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ResponseBody;

@RestController
public class HelloController {

	@Autowired
	private UserRepository userRepository;

	@GetMapping("/")
	public @ResponseBody Iterable<User> index() {
		User n = new User();
		n.setName("hello");
		n.setEmail("hello@world.com");
		userRepository.save(n);

		return userRepository.findAll();
	}

}

이제 ORM Entity 클래스를 생성합니다. 다음 내용을 User.java로 저장합니다.

~/gs-spring-boot/initial/src/main/java/com/example/springboot/User.java
package com.example.springboot;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // This tells Hibernate to make a table out of this class
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String name;

    private String email;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

그리고 Repository 인터페이스를 생성합니다. 다음 내용을 UserRepository.java로 저장합니다.

~/gs-spring-boot/initial/src/main/java/com/example/springboot/UserRepository.java
package com.example.springboot;

import org.springframework.data.repository.CrudRepository;

import com.example.springboot.User;

// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete

public interface UserRepository extends CrudRepository<User, Integer> {

}

다음 명령으로 Spring Boot 앱을 실행합니다.

우분투, CentOS
~/gs-spring-boot/initial$ MYSQL_HOST="127.0.0.1" ./gradlew bootRun
윈도우
PS C:\Users\pyrasis\gs-spring-boot\initial> $env:MYSQL_HOST="127.0.0.1"; .\gradlew.bat bootRun

웹 브라우저에서 http://<컨테이너 IP 주소 또는 도메인>:8080으로 접속해봅니다(Docker Desktop에서 실행했다면 http://127.0.0.1:8080입니다).

다음과 같은 데이터가 표시되면 MySQL 데이터베이스에 정상적으로 데이터를 쓰고 읽어온 것입니다(새로 고침하면 데이터가 계속 누적되서 표시될 것입니다).

[{"id":1,"name":"hello","email":"hello@world.com"}]

확인이 끝났으면 Ctrl+C를 눌러 Spring Boot 앱을 종료합니다.

그리고 데이터베이스 컨테이너도 삭제합니다.

$ sudo docker rm -f db

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2022-10-03