







name: Java CI/CD with Gradle
on:
pull_request:
branches: [main, develop]
permissions:
contents: read
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
jobs:
build:
runs-on: ubuntu-22.04
permissions:
pull-requests: write
steps:
- name: 레포지토리 체크아웃
uses: actions/checkout@v4
with:
token: ${{ secrets.SUBMODULE_TOKEN }}
submodules: true
- name: JDK 17 설치
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: gradlew 권한 부여
run: chmod +x gradlew
- name: Gradle 통해 빌드
run: ./gradlew clean build
- name: DockerHub 로그인
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker 이미지 이름 및 환경 설정
run: |
if [[ "${{ github.event.pull_request.base.ref }}" == "main" ]]; then
echo "IMAGE_NAME=fashion-forecast-prod" >> $GITHUB_ENV
elif [[ "${{ github.event.pull_request.base.ref }}" == "develop" ]]; then
echo "IMAGE_NAME=fashion-forecast-dev" >> $GITHUB_ENV
fi
- name: 도커 빌드 & 푸시
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
platforms: linux/amd64
tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: 배포 타겟 설정
run: |
if [[ "${{ github.event.pull_request.base.ref }}" == "main" ]]; then
echo "DEPLOY_ENV=prod" >> $GITHUB_ENV
elif [[ "${{ github.event.pull_request.base.ref }}" == "develop" ]]; then
echo "DEPLOY_ENV=dev" >> $GITHUB_ENV
fi
- name: EC2 원격 접속 및 Docker compose
uses: appleboy/ssh-action@master
with:
username: ${{ secrets.EC2_DEV_USERNAME }}
host: ${{ secrets.EC2_DEV_HOST }}
key: ${{ secrets.EC2_DEV_PRIVATE_KEY }}
script_stop: true
script: |
sudo docker pull ${{ env.DOCKERHUB_USERNAME }}/fashion-forecast-${{ env.DEPLOY_ENV }}:latest
sudo docker compose -f docker-compose-${{ env.DEPLOY_ENV }}.yml down
sudo docker compose -f docker-compose-${{ env.DEPLOY_ENV }}.yml up -d
sudo docker image prune -f
No |
Work |
Description |
1 |
개발 환경 세팅 |
라이브러리, prettier, stylelint 등 세팅 |
2 |
좌표 스크립트 작성 |
지역별 좌표 및 기상청 지역 좌표 데이터 생성 |
3 |
메인 페이지 |
메인 페이지(/) UI 및 기능 개발 |
4 |
검색 페이지 |
검색 페이지(/search) UI 및 기능 개발 |
5 |
피드백 페이지 |
피드백 페이지(/feedback) UI 및 기능 개발 |
No |
Work |
Description |
1 |
API 응답 포맷 |
정상 및 오류 응답 포맷 개발 |
2 |
예외 처리 핸들러 적용 |
전역적으로 예외를 처리할 수 있게 핸들러 개발 |
3 |
디폴트 옷 추천 조회 API |
온도 단계(날씨)에 따라 알맞은 옷차림 조회 기능 개발 |
4 |
옷 추가 API |
운영용으로 사용할 디폴트 옷 추가 기능 개발 |
5 |
고객의 소리 API |
고객의 피드백 추가, 상세 조회, 리스트 조회 기능 개발, 리스트 조회에서 페이지네이션 적용 |
No |
Work |
Description |
1 |
날씨 조회 API |
기상청 단기예보 API를 활용하여 위도, 경도, 시간을 기준으로 날씨 조회 |
2 |
최근 검색어 API |
Redis를 이용한 사용자 최근 검색어 조회, 삭제 |
3 |
게스트 로그인 API |
비회원을 위한 uuid 발급 |
4 |
날씨 데이터 스케쥴러 작업 |
매일 새벽 5시 과거 날씨 데이터 삭제 스케쥴러, QueryDsl를 이용한 벌크 연산 |
5 |
날씨 제공 지역 초기화 작업 |
애플리케이션 실행 시 날씨 제공 지역 csv파일을 읽어 DB에 저장, JdbcTemplate를 이용한 벌크 연산 |
6 |
백엔드 도커라이징 작업 |
docker-compose를 이용한 애플리케이션 도커라이징 |
7 |
이니셜 데이터 마이그레이션 |
Flyway를 이용한 이니셜 데이터 마이그레이션 |
8 |
github 협업 환경 세팅 |
PR Template, Issue Template 작성 |
9 |
restDoc 적용 |
테스트 코드 작성 강제를 위한 RestDocs 적용, adocsTemplate 작성 |
10 |
AWS 개발 및 배포 환경 구축 |
EC2, RDS를 사용하여 dev & prod 환경 구축 |
11 |
백엔드 CI/CD 파이프라인 구축 |
CI/CD 스크립트 작성 및 github actions를 이용한 자동화 |
12 |
백엔드 배포 작업 |
certbot 및 Let's Encrypt 를 사용하여 백엔드 도메인 https 인증서 발급, nginx를 이용하여 백엔드 도메인에 접근 시 스프링부트 애플리케이션으로 reverse proxy |
No |
Work |
Description |
1 |
소셜 로그인 API |
권한이 필요한 페이지에서 사용자 인증 및 예외 처리, 액세스 토큰 만료시 토큰 재발급 기능 |
No |
Work |
Description |
1 |
소셜 로그인 API |
Oauth2를 이용한 카카오, 구글 소셜 로그인 구현, 로그인 성공 시 리프레시 토큰(Cookie) 및 액세스 토큰(body) 발급 |
API 명세서
 |
조현아 |
 |
최태식 |
|
|
| :----------------------------------------------------------------------------------------: | --- |
| 김현재 | |
브랜치 종류/이슈넘버-기능이름
e.g) feature/#5-login
gitflow 전략을 따르지만, release 브랜치가 없는 형태
main : 최종 배포 브랜치
develop : 개발 단계 브랜치 (디폴트)
타입 |
설명 |
feat |
새로운 기능을 추가 |
fix |
버그를 수정 |
docs |
문서와 관련된 변경 사항을 기록 |
style |
코드 포맷팅 |
refactor |
리팩토링 작업을 기록 |
test |
테스트 코드를 추가하거나 수정 |
chore |
초기세팅 및 코드에 영향을 주지 않는 작업 |