용로그
article thumbnail

요즘 어떠한 서비스를 만드려고 하면 대부분 팀 단위로 진행할텐데요. 팀 단위로 프로젝트 진행 시 백엔드 배포 환경 구축이 안되었을 때 프론트엔드 개발자들이 API를 어떻게 테스트 해볼 수 있을까요?

 

프론트엔드를 담당하시는 분들은 대개 VSC를 사용하고 IntelliJ가 노트북에 설치되어 있지 않을 확률도 높습니다. 물론 VSC에서도 스프링부트가 잘 동작할테지만, IntelliJ가 익숙하니까요.

 

그럼 프론트엔드 개발자들이 맨날 IntelliJ에 들어가서 DB 설정을 하고, 서버를 키고 API를 테스트 해봐야하는 걸까요? 그렇지 않습니다. 요즘엔 도커에서 좋은 기능도 많이 제공해주더라구요.

 

이번 포스팅에서는 "공통 환경 설정"이라는 주제를 가지고 포스팅하려고 합니다. 현업에서는 어떻게 할지 모르지만 우선 제가 프로젝트를 진행하며 해왔던 방식을 소개하겠습니다.(현업에 계신 개발자 분들이 계신다면 어떻게 하는지 알려주세요!)

 

사전 준비물


우선 Docker로 동일한 컨테이너를 띄워 공통된 환경을 제공할 것이기 때문에 Docker Desktop을 설치해줍니다. IDE는 아무거나 써도 상관 없지만, 대중적인 IntelliJ를 사용하도록 하겠습니다.

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

최고의 Java 및 Kotlin IDE인 IntelliJ IDEA를 다운로드하세요

 

www.jetbrains.com

 

동작 원리


컨테이너를 띄우기 전에 어떻게 공통된 환경을 제공하는지 알아보도록 합시다. 도커로 데이터베이스 컨테이너는 띄워봤을지라도, 어떻게 프로젝트를 빌드할지 궁금하지 않으신가요?

 

배포해보신들은 예상하셨을지 모르겠지만, 자바에서는 프로그램, 클래스, 라이브러리 및 관련 리소스를 압축해놓은 jar라는 파일을 제공합니다. 이 jar 파일은 애플리케이션을 실행 및 배포를 하기 위해서 자주 사용됩니다.

 

IDE는 애플리케이션 자체를 가지고 있기 때문에 jar파일로 애플리케이션을 실행하지는 않습니다. 소스 코드를 컴파일하고 JVM에 올릴 뿐이죠. 하지만 저희는 IDE 대신 도커를 사용할 것이기 때문에, jar 파일을 가지고 애플리케이션을 실행해보려고 합니다. 

 

Dockerfile 생성


우선 애플리케이션을 docker 컨테이너에 띄우기 위해서 jar파일을 가져와야합니다. 우선 본인의 프로젝트에 jar파일의 위치를 확인합니다. 보통 프로젝트명/build/libs/*.jar 위치에 jar 파일이 있습니다.

 

만약 build 디렉터리가 보이지 않는다면? 기본적으로 build 디렉터리는 숨겨져있기 때문에 보이게 하고 싶다면 jar파일을 빌드해줍시다.
오른쪽의 코끼리 모양 -> build -> bootJar 더블 클릭

 

 

다음으로 jar파일을 실행하기 위한 dockerfile(확장자명 없음)을 생성합니다. 위치는 우선 src 디렉터리와 같은 레벨에 두도록 하겠습니다. 

 

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "/app.jar"]

 

  • FROM : Docker 이미지를 빌드할 때 기반이 될 이미지를 뜻한다. 위 경우 jdk17을 빌드한다.
  • ARG : Docker 빌드시 사용할 변수를 선언한다. 위 경우 JAR_FILE이라는 변수를 선언하고 값은 해당 프로젝트의 jar파일로 할당한다.
  • COPY : 빌드된 jar 파일을 Docker 이미지 내부로 복사한다. 이 때 JAR_FILE 변수가 사용되며, 복사한 파일 이름은 app.jar로 실행된다.
  • ENV : 컨테이너 내부에서 사용될 환경 변수를 뜻한다. 위 경우 TZ(TimeZone) 변수를 한국 시간으로 설정했다.
  • ENTRYPOINT : 컨테이너가 실행될 때 실행할 명령어를 설정한다. java -jar /app.jar 명령어가 실행되도록 설정되어 있으며, 이를 통해 빌드된 애플리케이션을 실행할 수 있다.

만약 Dockerfile의 위치를 src와 같은 레벨로 두지 않았다면 JAR_FILE을 다르게 설정하면 됩니다.

 

docker-compose.yml 생성


이젠 진짜 docker에 컨테이너를 띄우는 스크립트를 짜봅시다. 우선 DB환경을 제공하기 위해 DB 컨테이너 스크립트 먼저 작성합니다.  DB인바운드는 3306이지만, 아웃바운드는 13306이므로 외부접속시 주의하도록 합시다.

 

또한 docker-compose 스크립트를 모르는 경우 먼저 학습하고 보는 것을 추천합니다.

 

version: '3'

services:
  database:
    container_name: woowacourse
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_DATABASE: test
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: 1234
      TZ: 'Asia/Seoul'
    ports:
      - "13306:3306"
    command:
      - "mysqld"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    networks:
      - woowacourse_test_network

 

다음은 아까 만든 Dockerfile을 실행시킬 application 컨테이너 차례입니다. 주의할 점은 2depth가 시작이 되어야 한다.(services 아래 인덴트) 이 부분도 마찬가지로 인바운드 포트는 8080이지만, 아웃바운드 포트는 18080입니다.

 

  application:
    container_name: main-server
    restart: always
    build:
      dockerfile: Dockerfile
    ports:
      - "18080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://woowacourse:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "1234"
    depends_on:
      - database
    networks:
      - woowacourse_test_network
    env_file:
      - .env

 

전체 docker-compose.yml 코드는 다음과 같습니다.

 

version: '3'

services:
  database:
    container_name: woowacourse
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_DATABASE: test
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: 1234
      TZ: 'Asia/Seoul'
    ports:
      - "13306:3306"
    command:
      - "mysqld"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    networks:
      - woowacourse-test-network

  application:
    container_name: main-server
    restart: always
    build:
      dockerfile: Dockerfile
    ports:
      - "18080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://woowacourse:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "1234"
    depends_on:
      - database
    networks:
      - woowacourse-test-network
    env_file:
      - .env

networks:
  woowacourse-test-network:
    driver: bridge

 

실행하기


이제 컨테이너를 띄워봅시다. docker-compose.yml 파일이 있는 경로로 들어가서 아래의 명령을 실행합니다.

 

docker-compose -f docker-compose.yml up --build -d

 

그런 다음 docker-desktop을 보면 다음과 같이 컨테이너가 실행되고 있을 겁니다. 

 

 

실제로 포스트맨 또는 GET요청의 API를 브라우저에서 접속해보면 성공하는 것을 볼 수 있습니다. 당연히 외부 환경이기 때문에 아웃바운드 포트로 접속해야 합니다.

 

EX: localhost:18080/member

 

그리고 docker 컨테이너를 정지 및 종료시키고 싶다면 아래의 같은 명령어를 입력합니다.

 

docker-compose down

 

profile

용로그

@용로그

벨덩보단 용덩 github.com/wonyongChoi05