Skip to main content

Command Palette

Search for a command to run...

차근차근 Modern Spring Boot 3 기초 (2) 로컬에 쓴 Docker Compose

Docker Compose를 통해 프로젝트별 DB 등 도구 설치

Updated
차근차근 Modern Spring Boot 3 기초 (2) 로컬에 쓴 Docker Compose
M

Hello, I am Korean. Welcome, visitor. You are very cool. 안녕하세요, 저는 한국어입니다. 방문자여 환영한다. 당신은 매우 시원해.

도커 컨테이너의 활용

도커와 컨테이너를 낯설게 느끼는 초심자분들 중 일부는, 도커가 오직 배포를 위해서 사용하는 것이라고 이해하고 계셨습니다. 물론 도커와 컨테이너 개념은 배포 환경에서 아주 유용하게 활용되는 개념입니다. 하지만 로컬(개발자 컴퓨터)에서 개발 환경을 세팅하기 위해서 활용하기에도 손색이 없습니다.

  • 배포를 위해서

  • 로컬 작업을 편하게 하기 위해서

모두 활용할 수 있습니다.

프로젝트마다 독립된 DB 사용

🛢+🛢 Q. 여러 프로젝트에서 DB의 스키마와 테이블이 겹칩니다.

기본적으로 백엔드 시스템에서 DB와 상호작용하는 것은 매우 중요한 역할 중 하나입니다. 하지만 여러 프로젝트를 하기 위해, 매번 내 자리에 데이터베이스를 설치하고 서로 다른 프로젝트끼리 DB 스키마와 테이블 이름이 겹치지 않도록 번거롭게 관리해야 할까요?

로컬에서의 작업 편의를 위해 운영 환경에 영향을 줄지도 모르는 스키마, 테이블 관리 전략을 택하거나, 운영 환경과 너무 상이한 로컬 환경을 구성하는 것은 아무래도 현대적인 방식이 아닌 것 같습니다.

🎁 A. 우리는 도커 컨테이너의 독립성을 로컬에서 유용하게 활용할 수 있습니다.

도커 컨테이너는 독립된 환경을 갖습니다. 그리고 우리가 원할 때 언제든 쉽게 끄고 켜거나, 삭제 후 다시 설치할 수도 있죠. 이렇게 편리한 특징을 이해한다면, 프로젝트마다 아주 손쉽게 데이터베이스 등 도구를 독립적으로 관리할 수 있습니다.

프로젝트마다 완전히 독립된 데이터베이스를 사용할 수 있기 때문에, 데이터가 겹칠 일도 없으며 스키마, 테이블 이름을 관리하는 전략은 서로 다른 프로젝트에 전혀 영향을 주지 않습니다. 또 사용하지 않을 땐 쉽게 삭제하고, 나중에 다시 필요할 때 쉽게 설치할 수 있습니다. 이 과정을 위해 마치 번거로운 작업들이 필요할 것 같겠지만, 아주 간단하게 모든 작업이 완료됩니다.

Docker Compose를 통한 데이터베이스 설치

우리는 도커 컴포즈를 사용하기 위해 docker desktop을 설치했습니다. 도커 컴포즈는 여러 컨테이너 관리를 한 번에 쉽게 할 수 있게 도와주는 도구입니다.

도커 컴포즈는 도커 데스크톱과 독립적으로도 설치할 수 있는 도구지만, 가장 편리하게 설치하는 방법은 도커 데스크톱을 설치하는 것입니다. 또한 이후 도커 데스크톱을 통해 편하게 관리할 수 있습니다.
(단, 도커 데스크톱을 활용한다면 도커 데스크톱과 관련한 취약점 보고가 있는지 눈여겨 봐야 합니다.)

Docker Desktop 실행

도커 컴포즈 명령어를 수행할 수 있도록 우선 도커 데스크톱을 실행합니다.

만약 도커 컴포즈 명령어가 실행 가능한 명령 또는 프로그램이 아니라고 나온다면, 내 컴퓨터에 도커 데스크톱이 실행되고 있는지 확인하여야 합니다. 적어도 백그라운드에서는 돌고 있어야 합니다.

프로젝트에 Docker Compose 파일 작성

도커 컴포즈는 프로젝트와 독립적으로도 관리할 수 있습니다. 따라서 반드시 프로젝트 안에 도커 컴포즈 파일을 작성해야 하는 것은 아닙니다. 하지만, 우리는 프로젝트 단위로 도커 컴포즈를 관리하는 예정이기 때문에 프로젝트 안에 도커 컴포즈 파일을 작성하는 것이 관리하기 편리합니다.

도커 컴포즈 파일은 복잡한 파일 조합을 갖지 않고, 단일 파일로 모두 작성할 수 있기 때문에, 프로젝트의 루트 경로에 바로 작성하는 것이 이번 기초 프로젝트에 맞습니다.

다음 파일을 생성하고, 다음 내용을 붙여 넣어 작성합니다.

  • 파일 경로: 프로젝트의 루트 (이전 글에서 example-springboot3-webmvc 폴더)

  • 파일 이름: docker-compose.yml

  • 파일 내용

      version: "3"
    
      services:
        sample_postgres14:
          # postgresql 공식 이미지
          image: postgres:14
          # 환경 변수 (규약된 것들)
          environment:
            TZ: Asia/Seoul
            POSTGRES_DB: demo
            POSTGRES_USER: root
            POSTGRES_PASSWORD: root
            POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C'
          # 포트포워딩 (외부:내부)
          ports:
            # 외부: 변경해도 됨. 우리가 접속할 포트.
            # 내부: 변경하면 안 되는 경우가 많음. 컨테이너 내에서 취급되는 포트.
            - 5442:5432
          # 연결할 폴더들 (외부:내부)
          volumes:
            # 콜론의 왼쪽에 내 PC의 로컬 경로를 써도 됨.
            # 콜론의 왼쪽에 볼륨 컨테이너를 써도 됨.
            - sticky_volume_sample_postgres14:/var/lib/postgresql/data
            - ./db/initdb.d:/docker-entrypoint-initdb.d:ro
    
      volumes:
        sticky_volume_sample_postgres14:
    
  • #으로 시작하는 문장은 주석입니다.

  • 가장 아래 volumes에 작성한 것은 볼륨 컨테이너들입니다. (이 파일에선 하나만 작성하였음.)

  • 환경변수(environment)는 공식 이미지가 제공하는 목록을 참고하여 작성합니다.

  • 컨테이너 외부 포트(5442)가 우리가 접근 시 사용할 포트입니다.

  • 컨테이너 내부 포트(5432)는 각 이미지가 점유하는 경우가 많으며, 우리가 수정하지 않습니다.

위와 같이 만들었을 때, 데이터베이스 접속 정보입니다.

  • URL: jdbc:postgresql://localhost:5442/demo

    • host: localhost, port: 5442, DB name: demo
  • username: root

  • password: root

Docker Compose 실행

터미널 열기

명령어는 IDE에서 터미널 아이콘을 찾아 선택한 후, 터미널의 현재 경로(pwd)가 프로젝트 루트로 되어 있고, 프로젝트 루트에 정확하게 docker-compose.yml 파일이 존재해야 합니다.
(현재 경로에 있는 파일 목록 확인 명령어는 windows: dir, 그 외: ls입니다. 이 명령어를 입력하면 docker-compose.yml 파일이 보여야 합니다. 만약 올바른 경로가 아니라면, cd 명령어를 통해 올바른 경로로 이동하세요. cd ..은 상위 폴더로 이동, cd 폴더이름 또는 cd 폴더이름/폴더이름/폴더이름 형태로 다른 경로로 이동할 수 있습니다.)

도커 컨테이너 게시 및 실행

실행 명령어입니다. 실행할 수 없는 명령이라고 오류가 발생하면, 도커 데스크톱을 실행한 상태에서 다시 명령어를 입력하세요.

docker-compose up -d

실습에서는 위 명령어까지만 하면 됩니다. 아래 명령어들은 참고로 알아 둡니다.

(참고) 도커 컨테이너 내리기

기본적으로 볼륨 컨테이너를 보존합니다. 이 경우, 우리 실습 기준으로는 데이터가 보존됩니다.

docker-compose down

(참고) 볼륨 컨테이너까지 내리기

-v 옵션까지 붙여서 실행하면, 이 도커 컴포즈 파일로 관리하는 모든 컨테이너와 볼륨 컨테이너를 모두 내립니다.

docker-compose down -v

데이터베이스 접속 확인

우리 컴퓨터의 네트워크 설정에 복잡하고 이상한 것들이 없다면, DB 접속 도구를 통해 이 데이터베이스에 로컬호스트로 접근할 수 있을 것입니다.

만약 네트워크 설정 등 이유로 localhost 접근이 안 된다면, 네트워크 설정을 확인하여 내 PC의 IP를 통해 접근할 수 있습니다. 예를 들어, 내 PC에 할당된 내부 IP가 192.168.10.100이라면, DB URL을 jdbc:postgresql://192.168.10.100:5442/demo로 하여 접근해 보십시오.

접속 예(localhost)

  1. DBeaver 실행

  2. 새 접속(새 연결) 생성

  3. PostgerSQL 선택, 다음 버튼 클릭

  4. 접속 정보 입력

  5. Test Connection 클릭 (필요하다면 드라이버를 다운로드 받아야 합니다.)

  6. 성공하면 확인 누르고, 완료 선택

(참고) Spring Boot Docker Compose Support

스프링부트와 도커 컴포즈를 함께 사용하면, 이를 보조할 수 있는 도커 컴포즈 support가 있습니다.

⛔️ 우리는 안 씁니다.

이유는 다음과 같습니다.

  • Spring Boot Docker Compose Support를 통하여, 스프링 부트 앱을 실행할 때 도커 컴포즈 명령을 실행하여 컨테이너를 게시하고, 스프링 부트 앱을 종료할 때 컨테이너를 끄거나 종료하도록 설정할 수 있습니다.

    • 수동으로 할 때에 비해 메리트가 그다지 크지 않습니다.
  • 나온 지 얼마 되지 않았습니다. 그리고 우리 시스템에 명령어를 전달하는 것으로 보입니다.

    • 만약 취약점이 발견된다면, 이따금 치명적인 취약점이 될 수도 있습니다.

    • 작은 메리트(우리 손으로 명령어를 치지 않고 애플리케이션 생명 주기와 컨테이너 생명 주기를 연결해 관리하는 기능)를 위해 그런 취약점 가능성을 감수하고 싶지 않습니다.

참고로 우리가 사용하고 있는 도커 데스크톱 또한 취약점이 생길 수 있는 도구입니다. 그럼에도 사용하고 있기 때문에, spring boot docker compose support 또한 사용하고 싶다면 사용해 보셔도 됩니다.


< Prev

설치 및 IDE 세팅

Next >

Flyway를 통한 DDL 관리

More from this blog

클래스에 Serializable 인터페이스를 구현 받는 이유가 무엇인가요? #42

이 아티클은 깃허브 nettee-space 조직의 디스커션 #42 항목을 옮겨 온 것입니다.관련 논의: nettee-space/backend-sample-hexagonal-simple-crud/discussions/42 Question: 클래스에 Serializable 인터페이스를 구현 받는 이유가 무엇인가요? 여러 소스들을 접하면서 VO 객체 등에 Serializable를 구현받는 것을 많이 접했습니다. 저희 헥사고날(스터디 팀내 2단계 ...

Feb 7, 2025
클래스에 Serializable 인터페이스를 구현 받는 이유가 무엇인가요? #42

개념 2. JWT 액세스 토큰의 생성과 전달, Stateful한 리프레시 토큰의 생성, 전달, 보존

이전 글에서 정리에 꽤 힘을 뺐기 때문에, 이번 글에서는 서두와 부연설명을 줄이고 필요한 정보를 담아 전달해 보겠습니다. JWT 액세스 토큰 JWT 액세스 토큰은 인가에 직접 사용되는 토큰이고, stateless 하다는 장점이 있었습니다. 액세스 토큰의 생성 JWT(JSON Web Token)로 생성합니다. 비밀번호 인증 등 자격 검토 후 JWT를 발급합니다. JWT는 헤더, 페이로드, 시그니처 세 영역을 점(.) 기호로 구분한다고 했습니다....

Oct 23, 2024
개념 2. JWT 액세스 토큰의 생성과 전달, Stateful한 리프레시 토큰의 생성, 전달, 보존

Merge Simpson의 매너 있고 다정한 한국어 개발자 블로그

37 posts