프로젝트 (Java)/예약마켓

[프로젝트] 3. Docker Compose를 활용한 로컬 개발 환경 구축

hihyuk 2024. 1. 24. 22:46

도커 컴포즈란?

Docker Compose는 여러 컨테이너의 관리를 단순화하고, 단일 서비스로 정의하여 관리할 수 있는 강력한 도구입니다. 이는 특히 복수의 서비스를 포함하는 어플리케이션을 개발할 때 그 진가를 발휘합니다. 복잡한 명령어 없이 docker-compose up 한 줄로 모든 서비스를 시작할 수 있으며, 이는 개발 과정을 크게 단순화시켜줍니다.

 

Docker Compose 기본 사용법

Docker Compose를 사용하기 위해서는 먼저 프로젝트의 루트 위치에 docker-compose.yml 파일을 생성해야 합니다. 이 파일 내에 서비스, 네트워크, 볼륨 등의 설정을 정의합니다.

 

예시: MySQL 서비스 설정

현재 프로젝트 폴더 루트 위치에 docker-compose.yml 파일을 만들어 주었습니다.

version: "3"
services:
  db:
    image: mysql:latest
    container_name: mysql-server
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./data/:/var/lib/mysql # -v 옵션 (디렉토리 마운트 설정)

이 설정은 최신 버전의 MySQL 이미지를 사용하여, 외부 포트 3307을 내부의 3306 포트에 바인딩합니다. 환경 변수로는 루트 패스워드를 설정하며, UTF-8mb4 문자 인코딩을 사용하도록 MySQL을 구성합니다. 또한, 로컬의 ./data/ 디렉토리를 컨테이너의 MySQL 데이터 디렉토리에 마운트하여 데이터를 영구적으로 저장합니다.

 

 

Docker Compose 실행

터미널에서 프로젝트 폴더로 이동한 후 아래 명령어를 실행하면, docker-compose.yml 파일에 정의된 모든 서비스가 시작됩니다.

docker-compose up -d

docker containers 실행만 해주면 db를 이용할 수 있습니다.

 

DB 연결 확인을 위한 사용자 엔티티 추가

package com.myshop.domain;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "users")
@NoArgsConstructor
@Getter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;
    @Column(name = "profile_img")
    private String profileImg;
    @Column(name = "introduce")
    private String introduce;
    @Column(name = "created_at")
    private LocalDateTime createdAt;

    @Builder
    public User(Long id, String name, String email, String password, String profileImg, String introduce, LocalDateTime createdAt) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.password = password;
        this.profileImg = profileImg;
        this.introduce = introduce;
        this.createdAt = createdAt;
    }

}

 

application.yml 설정

Spring Boot의 application.yml 설정 파일에서 데이터베이스 연결 정보를 구성합니다.

spring:
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        jdbc:
          time_zone: Asia/Seoul
        format_sql: true
        show_sql: true
  datasource:
    url: jdbc:mysql://localhost:3307/myshop?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
    username: root
    password: root

이 설정을 통해 애플리케이션이 Docker에서 실행 중인 MySQL 인스턴스에 성공적으로 연결되었는지 확인할 수 있습니다.

 

결론

Docker Compose는 복잡한 어플리케이션을 간편하게 관리할 수 있게 해주는 강력한 도구입니다. 이를 통해 개발 환경 구축 시간을 단축하고, 프로젝트의 이식성을 높일 수 있습니다. 개발 과정에서 겪는 환경 설정의 번거로움을 해소하고자 한다면, Docker Compose의 사용을 고려해보는 것이 좋습니다.