Skip to content

Latest commit

 

History

History
203 lines (166 loc) · 6.36 KB

README.md

File metadata and controls

203 lines (166 loc) · 6.36 KB

🍞 대동빵지도

스크린샷 2021-11-15 오후 5 26 57

빵 맛집을 한번에 모아보고, 더 나은 빵🥐 라이프를 위해 함께 만들어가는 어플리케이션 "대동빵지도" 의 백엔드 Repository 입니다.


👩🏻‍💻👨🏻‍💻 대동빵지도 Back-end

이지은 이해인 황지수

📱 기술 스택

  • Java 8
  • Spring Boot 2.4
  • Spring Data JPA + QueryDsl
  • Gradle
  • Junit5

| 운영환경(prod) 인프라 구성

  • AWS ECR
  • AWS Elastic Beanstalk (ALB + EC2(docker))
  • AWS RDS (postgreSQL)
  • AWS S3
  • Github Actions CI/CD

| 개발환경(dev) 인프라 구성

  • AWS Elastic Beanstalk (ALB + nginx + EC2(springboot))
  • AWS RDS (postgreSQL)
  • AWS S3
  • AWS Route 53 + AWS Certificate Manager
  • Github Actions CI/CD

| 데이터베이스 구조

스크린샷 2021-11-14 오후 10 41 23



개발환경(dockerdev) 로컬에서 띄워보기

로컬환경에서 띄울 때 하기와 같은 구조로 진행했습니다.

  • 로컬환경에 docker가 이미 설치되어 있다는 가정하에 작성하였으며, MAC 환경(Intel/Apple M1)에서 테스트하였습니다.

하기와 같은 구조로 파일 생성 및 git clone이 완료되면 Gradle bootJar 명령어로 Jar 파일 생성 후, docker 설정 최상단 디렉토리(하기 구조라면 dev-docker)에서 하기와 같이 docker-compose를 띄워줍니다.

Intel Mac 기준

docker compose up -d --build

Apple M1 모델의 경우만 아래와 같은 명령어로 실행시켜야 합니다.

ARCH=arm64 docker-compose -f docker-compose.yml up -d

[로컬 환경 디렉토리 구조]

dev-docker
│   docker-compose.yml
│
│   .env
│
└───app/
│   │
│   └───bread-map-backend/
│       │   해당 디렉토리 하위에 git clone을 통해 bread-map-backend 레포를 받아주세요!
│   
└───db/
    │   Dockerfile-postgres
    │   
    └───data/
    │
    └───init.d/
        └───init-user-db.sh

[ .env 파일 ]

DB_USER_ID=postgres
DB_USER_PASSWORD=postgres
APP_DB_USER=dev
APP_DB_PASS=postgres
APP_DB_NAME=dev_db
DB_BUILD_CONTEXT=./db
POSTGRES_HOME_DIR=./db
APP_BUILD_CONTEXT=./app/bread-map-backend
S3_ACCESSKEY=자신의 AWS S3 ACCESSKEY
S3_SECRETKEY=자신의 AWS S3 SECRETKEY
S3_RESION=자신의 AWS S3 RESION
S3_BUCKET=자신의 AWS S3 BUCKET 이름(이미지가 저장될 버킷 디렉토리)

[ docker-compose.yml ]

version: "3"
services:
  db:
    container_name: postgres
    restart: always
    build:
      context: "${DB_BUILD_CONTEXT}"
      dockerfile: Dockerfile-postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: "${DB_USER_ID}"
      POSTGRES_PASSWORD: "${DB_USER_PASSWORD}"
      APP_DB_NAME: "${APP_DB_NAME}"
      APP_DB_USER: "${APP_DB_USER}"
      APP_DB_PASS: "${APP_DB_PASS}"
    volumes:
      - ${POSTGRES_HOME_DIR}/data:/var/lib/postgresql/data
  app:
    container_name: daedong-bread-backend
    build:
      context: "${APP_BUILD_CONTEXT}"
      dockerfile: Dockerfile-dev
    ports:
      - "8080:8080"
    environment:
      S3_ACCESSKEY: "${S3_ACCESSKEY}"
      S3_SECRETKEY: "${S3_SECRETKEY}"
      S3_RESION: "${S3_RESION}"
      S3_BUCKET: "${S3_BUCKET}"
      DB_HOSTNAME: db
      DB_PORT: 5432
      DB_DBNAME: "${APP_DB_NAME}"
      DB_USERNAME: "${APP_DB_USER}"
      DB_PASSWORD: "${APP_DB_PASS}"
    depends_on:
      - db
  • app용 dockerfile의 경우, git clone하여 bread-map-backend 레포지토리를 받으면, 레포 최상단에 Dockerfile-dev라고 있습니다.
    • 운영과 구분하여 사용하기 위해 Dockerfile-dev로 생성하였습니다.
  • app에 설정된 environment는 applciation-dockerdev.yml에서 사용될 변수들입니다.
    • Dockerfile-dev에 의해 active-profile이 dockerdev로 설정되어집니다.

[ Dockerfile-postgres ]

FROM postgres:12.8
COPY ./init.d /docker-entrypoint-initdb.d

Apple M1 모델의 경우만 arm64에 맞는 이미지로 pull 되도록 합니다.

FROM arm64v8/postgres:12.8
COPY ./init.d /docker-entrypoint-initdb.d
  • postgresql 기본 설치만 진행할 경우에는, postgreSQL용 dockerfile 없이 docker-compose를 통해 가능합니다.
  • 다만, init 시 database 생성 및 extension 생성을 위해 위와 같이 dockerfile을 추가로 구성하였습니다.

[ init-user-db.sh ]

#!/bin/bash
set -e

echo "START INIT-USER-DB";

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
  CREATE USER $APP_DB_USER WITH PASSWORD '$APP_DB_PASS';
  CREATE DATABASE $APP_DB_NAME;
  GRANT ALL PRIVILEGES ON DATABASE $APP_DB_NAME TO $APP_DB_USER;
  \connect $APP_DB_NAME $POSTGRES_USER
  BEGIN;
    CREATE EXTENSION CUBE;
    CREATE EXTENSION EARTHDISTANCE;
  COMMIT;
EOSQL
  • app에서 사용할 user 생성 및 database 구성
  • superuser로 스위칭 후 earthdistance용 extension 설치

유의사항

데이터 베이스를 모두 초기화 해야하거나 처음부터 셋팅할 때의 상황을 가정하여 작성했습니다. 리뷰 혹은 메뉴 등록 시, bread_categories 테이블에 기획단계에 정의 해둔 12개의 카테고리 값들이 미리 저장이 되어있어야 합니다.

(식사빵/구움과자류/마카롱/케이크/크림빵/도넛/추억의빵/과자류/크로와상/쿠키/파이디저트/기타)

저장이 안되어있다면, 양방향 맵핑관계로 설정 된 엔티티 특성 상 오류가 발생하니 유의바랍니다! 😷