6. 개발 가이드 - LikeLionTeam/BootHouse GitHub Wiki

1. ⚠️ Convention

1-1. Git Convention

  • fix : 버그 수정과 관련된 커밋 타입. Semantic Versioning의 Patch와 관련
  • feat : 새로운 기능에 대한 커밋 타입. Semantic Versioning의 Minor와 관련
  • build : 빌드 관련 파일 수정에 대한 커밋 타입
  • chore : 분류하기 어려운 자잘한 수정에 대한 커밋 타입
  • ci : CI 관련 수정에 대한 커밋 타입
  • docs : Documentation 수정에 대한 커밋 타입
  • style : 코드 의미에 영향을 주지 않는 수정에 대한 커밋 타입
  • refactor : 코드 리팩토링에 대한 커밋 타입
  • test : 테스트 코드 수정에 대한 커밋 타입

1-2. 코드 패턴

  1. 각 도메인 모듈 구성

    • 각 도메인 모듈은 controller, converter, infra, model, service 패키지로 구성된다.


  1. 엔티티와 모델 도메인
    • 엔티티(Entity)는 직접 다루지 않으며, model 패키지 안에 각 엔티티에 대응되는 도메인 모델을 생성한다.
    • converter 패키지를 통해 엔티티 <-> 도메인 모델 간 변환을 처리한다.

  1. 도메인 모델 처리
    • controller, service, infra 패키지 내에서 실제 기능은 모델 모데인을 사용해 처리한다.
    • 이를 통해, 특정 데이터베이스 기술과의 분리 유지가 가능해진다

  1. 패키지 역할
    • model : 엔디티에 대응되는 도메인 모델을 정의한다.

      • 생성자에 @Builder를 사용해서 변환을 용이하게 한다.
      • 필드 생성시 필요한 로직은 모델 내에서 처리한다.
        이를 통해, 데이터베이스에 종속된 기술(JPA)로부터의 분리로, 코드 유지보수성을 높일 수 있다.
    • converter : 비즈니스 로직에서 엔디티에 접근이 필요할 때, 모델 도메인과 엔디티 간의 변환을 담당한다.

    • service : 실제 비즈니스 로직과 예외 처리를 담당하며, 레포지토리 인터페이스를 통해 데이터 계층과 상호작용을 한다.

      • port 패키지에, 서비스에서 사용하는 레포지토리 인터페이스를 정의하고, 반환타입은 모두 '모델 도메인'으로 처리한다.
      • service 계층에서는 다른 도메인의 레포지토리 인터페이스를 호출할 수 있지만, 다른 도메인의 서비스를 직접 호출하는 것은 피하자.
    • infra : service 계층의 레포지토리 인터페이스의 실제 구현부.

    • controller : 오로지 해당 도메인의 서비스만 주입받아 처리하도록 한다.


2. 테스트 및 실행 방법

1) EC2 인스턴스 만들기 (우분투 사용)

2) dockerfile 작성

# 1단계: 빌드 이미지 설정
FROM openjdk:17-jdk-slim AS builder

# 작업 디렉토리 설정
WORKDIR /app

# Gradle Wrapper 및 빌드 파일 복사
COPY gradlew .
COPY gradle ./gradle
COPY build.gradle .
COPY settings.gradle .

# 각 서브프로젝트의 소스 코드 및 빌드 파일 복사
COPY db/build.gradle ./db/build.gradle
COPY db/src ./db/src
COPY view/build.gradle ./view/build.gradle
COPY view/src ./view/src

# 빌드 실행
RUN ./gradlew :view:build -x test

# 2단계: 실행 이미지 설정
FROM openjdk:17-jdk-slim

# 작업 디렉토리 설정
WORKDIR /app

# 빌드 결과물 복사
COPY --from=builder /app/view/build/libs/*.jar boothouse.jar

RUN mkdir -p /app/noticeImages

# 애플리케이션 실행 명령어 설정
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "boothouse.jar"]

# 포트 노출
EXPOSE 8080

멀티 스테이징 빌드 방법 사용


멀티 스테이징 빌드 방법

Dockerfile에서 여러 단계로 이미지를 빌드하는 방법으로 , docker 이미지의 크기를 줄이고 빌드 환경/실행 환경을 분리하여 최종 이미지를 효율적으로 생성

1단계 : Builder Stage (빌드 단계)

  • 소스 코드 및 빌드 스크립트를 복사하고, 빌드 실행 → jar파일 생성

2단계 : Final Stage (최종 이미지 단계)

  • 빌드 단계에서 생성된 jar 파일만 복사하여 포함
  • jar 파일을 실행하는 명령어 설정 후, 8080 포트 노출

3) docker-compose.yml 작성

version: '3.8'

services:
  app:
    image: [도커ID]/boothouse:latest
    container_name: boothouse-app
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: docker
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/boothouse?sslmode=disable&charSet=UTF-8
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: postgres
      SPRING_MAIL_HOST: smtp.gmail.com
      SPRING_MAIL_PORT: 587
      SPRING_MAIL_USERNAME: 
      SPRING_MAIL_PASSWORD: 
      AWS_ACCESS_KEY_ID: 
      AWS_SECRET_ACCESS_KEY: 
      AWS_REGION: ap-northeast-2
      NAVER_CLIENT_ID: 
      NAVER_CLIENT_SECRET: 
      WEBDRIVER_CHROME_DRIVER: 
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    container_name: boothouse-db
    environment:
      POSTGRES_DB: boothouse
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"
    volumes:
      - db_data:/var/lib/postgresql/data

  redis:
    image: redis:latest
    container_name: redis
    command: ["redis-server", "--requirepass", "1234"]
    ports:
      - "6379:6379"
    volumes:
      - ./redis-data:/data

volumes:
  db_data:
  redis-data:

‼️ docker-compose 파일은 여러 도커 컨테이너를 같이 띄워 실행하는 것을 정의 해둔 파일 이므로 이미지를 불러온 것들의 설정을 모두 포함해야함!

→ 기존 yml 토대로 빈 곳 작성

4) application.yml 배포용으로 수정

현재 로컬 절대경로로 지정되어있는 경로 수정

5) 로컬의 도커 이미지 도커 허브로 푸시

📌 dockerfile이 있는 디렉토리로 이동 후 명령어 실행

# 멀티 플랫폼 빌드를 위함
docker buildx create --use --name mybuilder
docker buildx inspect mybuilder --bootstrap

# 빌드
docker buildx build --platform linux/amd64,linux/arm64 -t [도커사용자명/프로젝트명]:latest --push .

5) EC2에 도커 및 도커 컴포즈 설치

⭐️ EC2 터미널에서 진행

  1. 도커 설치
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USE
  1. 도커 컴포즈 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

6) 로컬 환경의 docker-compose.yml을 EC2 환경으로 이동

📌 로컬 터미널(docker-compose.yml 파일이 있는 위치)에서 진행

scp -i "~/Downloads/boothouse.pem" docker-compose.yml [email protected]:~/

** ubuntu~~ 는 인스턴스→ 연결 → 예시란의 ubuntu~~를 붙여넣기(.pem 경로 주의)

:~/ 빼먹지 않도록 주의 !

⭐️ EC2 환경의 터미널에서 (우분투) 진행

7) EC2 인스턴스에 QEMU가 설치되어있는지 확인

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

** QEMU가 설치X → 다중 아키텍쳐 이미지 실행 X

** 로컬에도 QEMU 설치 필! (멀티플랫폼 빌드를 위해..)

8) 도커 이미지 가져오기

docker pull [도커닉네임]/boothouse:latest

9) docker-compse 파일 실행 (-d 옵션 : 백그라운드 실행)

docker-compose up -d

‼️ 이후 docker ps 명령어로 나의 컨테이너,의존 컨테이너가 실행되면 완료

코드를 수정하면, 도커이미지를 다시 빌드→풀→ 실행 반복

  • docker logs -f <컨테이너 ID>

    : 로그 확인 가능

  • docker stop <실행중인 프로젝트 컨테이너 ID>

    : 해당 프로젝트만 중지 (DB…는 중지 X)

  • docker-compose down

    : 현재 실행중인 모든 서비스 중지

EC2 환경 터미널 켜기

  1. .pem 파일을 다운받은 디렉토리로 이동
  2. EC2 인스턴스 → 연결 → SSH 클라이언트 → “ 예: “ 부분 복사
  3. 붙여넣기
⚠️ **GitHub.com Fallback** ⚠️