- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker로 Spring Boot 애플리케이션 구축하기
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로 저장합니다.
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 파일을 열고 다음과 같이 수정합니다.
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
파일을 열고 다음과 같이 수정합니다.
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로 저장합니다.
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로 저장합니다.
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 앱을 실행합니다.
~/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 공유는 허용합니다.