Spring boot + Docker

uchan·2023년 11월 12일
0

배경


ref: https://zero-base.co.kr/event/media_insight_contents_BE_language

아무리 python 이 트렌드 언어라고 하지만 현재 2023년까지도 대한민국 대부분 기업에서는 java 를 다룰 줄 아는 개발자를 선호하고 있다. 특히 백엔드 개발자 경우 java 를 이용한 spring boot 웹 프레임워크를 사용하는 것을 주로 살펴볼 수 있었는데, 나 같은 경우 python, ruby, typescript 를 주로 사용해보고 java 는 지금까지 다뤄보진 않았다 (과거 C# 을 사용했었기에 문법이 낯설진 않았다)
최근 알고리즘 문제 풀이도 자바로 작성하며 어느정도 익숙해지길 기대하고 있고, 이젠 spring boot 프레임워크를 다뤄보며 다재다능한 백엔드 개발자로서 성장해보고자 한다.

Spring boot

spring

엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크이다. 기존에는 개발자가 비즈니스 로직 + 기술 등 모두 고려하며 개발하였는데 spring 같은 프레임워크가 나오며 기본적인 설정을 통해 세팅을 한 다음 개발자는 오로지 비즈니스 로직에만 집중할 수 있도록 한다.

spring boot

spring 을 사용하여 서버를 구축한다고 해도 초기 설정이 만만치 않다. 그러나 spring boot 을 사용하면 spinrg 으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해줄 수 있다.

spring initializer


ref: https://start.spring.io/

링크에 들어가면 spring 초기 세팅을 위해 입력받는 폼이 나타난다.

입력 필드에 대하여

  • Project
    • Gradle 과 Maven 중 어떤 것을 사용하여 빌드할 건지 고른다
  • Language
    • 프로젝트에서 사용할 언어를 고른다. 나는 Java 를 선택했지만 요즘엔 코틀린도 대세라고 한다.
  • Spring Boot
    • spring boot 버전을 고른다. 나의 경우 사이드 프로젝트 팀 내에서 결정한 버전 2.7.x 버전을 선택하였다
  • Project Metadata
    • 프로젝트 앱 이름과, 그룹(팀) 이름 등을 설정해준다
  • Packaging
    • 패키지를 빌드할 때 확장자를 고르는건가?
  • Java
    • 사용할 자바 언어 버전을 선택한다

필드를 모두 입력하고 아래 generate 를 누르면 zip 파일이 다운로드된다. 이를 unzip 하면 내가 세팅한 프로젝트 폴더가 생성된다 (이전에 explore 버튼을 눌러서 프로젝트가 어떻게 세팅이 되는지 확인할 수도 있다)

Docker

이전에 학습했던 도커 기술을 적용하여 spring server 를 띄울 것이다.

사전 학습

  • Docker & Container
  • multi-stage Dockerfile
  • docker compose

Dockerfile

FROM openjdk:17-slim-buster AS base
ENV JAR_FILE_NAME=AlgoSolved-0.0.1-SNAPSHOT.jar


################################################################################
# for build
FROM base as builder

RUN apt-get -qq update > /dev/null && \
    DEBIAN_FRONTEND=noninteractive apt-get -yq --no-install-recommends install build-essential unzip > /dev/null

RUN useradd --uid 1000 --gid users --shell /bin/bash --create-home deploy
USER deploy

RUN mkdir /home/deploy/app
WORKDIR /home/deploy/app
COPY --chown=deploy:users . .
RUN ./gradlew build


################################################################################
# production
FROM base AS production
RUN useradd --uid 1000 --gid users --shell /bin/bash --create-home deploy
USER deploy

RUN mkdir /home/deploy/app
WORKDIR /home/deploy/app
COPY --chown=deploy:users --from=builder /home/deploy/app/build/libs/${JAR_FILE_NAME} /home/deploy/app/build/libs/${JAR_FILE_NAME}
EXPOSE 3000

ENTRYPOINT ["java", "-jar", "/home/deploy/app/build/libs/AlgoSolved-0.0.1-SNAPSHOT.jar"]
  • 이미지 크기를 줄이기 위해 다음을 고려하였다.
    • base 이미지는 openjdk slim 버전으로 갖고온다
    • multi-stage 를 적용하여 이미지 크기를 경량화한다.

docker-compose

version: '3.9'

services:
  db:
    container_name: postgresql
    image: postgres:15-alpine
    volumes:
      - /var/lib/postgresql/data
    restart: always
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
      POSTGRES_HOST_AUTH_METHOD: trust
      POSTGRES_INITDB_ARGS: --encoding=UTF-8
    ports:
      - '5432:5432'
    healthcheck:
      test: pg_isready -U postgres -h 127.0.0.1
      interval: 5s
      timeout: 120s

  server:
    build:
      context: .
      dockerfile: Dockerfile
      target: production
    container_name: algosolved-server
    depends_on:
      - db
    ports:
      - 3000:3000
  • 일단 사용할 db container 를 미리 만들어주었다 (아직 사용 X)
  • 그리고 서버는 db container 가 띄워진 다음 띄워지도록 하였다
  • multi-stage 가 적용된 Dockerfile 에서 최종 production 스테이지를 가져와 실행하도록 설정한다
  • (TODO) spring 조금 더 공부한 다음에 DB 연결해보기!!

웹 서버 띄워보기

spring boot 문서에 있는 튜토리얼을 따라해보기로 하였다

결과는...


spring 조금 더 공부하자...

0개의 댓글