[Project - 빌릴건대] KUIT 4기 해커톤

2025. 1. 10. 02:59·Projects

교내 동아리에서 진행하는 해커톤에 참여하고 기여한 내용을 간단히 정리해보고자 한다.

 

동아리에서 스터디한 내용으로 프로젝트를 구현해본다는 취지의 해커톤이었고, 사전 준비기간 4일과 1박의 해커톤 본 행사로 이루어진 짧은 프로젝트를 진행하였다.

PM 없이 안드로이드 3명 / 서버 3명이서 진행하였고, 팀원분들 대부분 프로젝트 경험이 많지는 않았어서 기본적인 CRUD 위주의 간단한 프로젝트를 기획하였다.

 

KUIT-4th-Hackathon-Team2/backend

 

GitHub - KUIT-4th-Hackathon-Team2/backend

Contribute to KUIT-4th-Hackathon-Team2/backend development by creating an account on GitHub.

github.com

 

 

프로젝트 개요 / 요구 명세

학생회나 복지위원회 측에서 물품 대여 사업을 하는 경우가 많은데, 기존에는 다음과 같은 불편함이 있었다.

1. 물품 내역과 대여자 현황을 수기로 관리하여야 한다.

2. 대여자가 해당 물품의 재고가 있는지 확인하려면 직접 찾아가거나 전화하여야 한다.

 

이와 같은 불편함을 개선하고, 체계적이고 효율적으로 물품 관리를 할 수 있는 어플리케이션을 개발하고자 하였다.

 

우리 팀에 PM이 따로 없었기 때문에, 요구 명세는 팀원들과 함께 기획하였다.

 

요구 명세는 다음과 같다.

 

공통 기능

- 회원가입

- 로그인, 로그아웃

 

관리자 기능

- 물품 항목 추가 (종류, 총 개수, 대여 가능 기간)

- 사용자가 등록한 물품 대여 예약 확정

 

사용자 기능

- 대여 가능한 물품 조회

- 물품 대여 예약 및 예약 취소

- 현재 대여한 물품 및 남은 대여 기간 조회

 

 

사용한 기술 스택

- Spring

- Mysql

- Notion, erdcloud

- Docker, Github Actions

- AWS (EC2, RDS)

 

소규모 프로젝트이기 때문에, Main과 Feature 브랜치로만 이루어진 Github Flow 전략을 사용하였다. 

 

ERD 설계

사전준비기간에 같이 화상으로 작업할 수 있는 시간이 있어서, ERD 설계는 백엔드 측 팀원들이 모두 모여 함께 진행하였다.

 

erdcloud link: 빌릴건대

 

빌릴건대

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

 

users: 가입한 유저 정보

products: 관리자가 등록한 물품 정보 (종류, 총 개수, 대여 가능 기간)

reservations: 대여를 하기 전 예약 정보

rentals: 예약이 확정되어 물품이 대여되었을 때의 정보

 

 

API 설계

API 설계

 

API 설계 | Notion

Made with Notion, the all-in-one connected workspace with publishing capabilities.

available-lunaria-66f.notion.site

ERD 테이블과 매칭되는 4개의 도메인으로 설계하였다.

 

나는 `reservations` 도메인을 맡아 개발하였다.

 

각 예약 데이터는 [예약 시점, 예약 만료 시간, 예약자, 예약한 물품] 데이터를 가지고 있다.

 

자동 배포 구현 (Git Actions, Docker)

Docker와 Git Actions를 이용하여 자동 배포와 구현도 연습해보았다.

 

Dockerfile

 

자바 버전은 21 slim으로 지정하였고, 컨테이너 포트는 8080으로 지정하였다.

 

Git actions

main 브랜치에 push(merge) 혹은 PR될 때, Git actions 파일이 작동되어 빌드하고 EC2에 배포하도록 하였다.

DockerHub와 RDS, EC2 정보는 Github Secrets에 저장하여 가져오도록 하였다.

name: Build and Deploy to EC2

on:
  push:
    branches:
      - main  # main 브랜치에 푸시할 때 실행
  pull_request:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      # 코드 체크아웃
      - name: Checkout code
        uses: actions/checkout@v4

      # JDK 설정
      - name: ☕️ set up JDK 21
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '21'

      # DockerHub 로그인
      - name: Login to DockerHub
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

      # Maven 빌드
      - name: Build JAR File
        run: |
          mvn clean package
        env:
            SPRING_DATASOURCE_URL: ${{ secrets.SPRING_DATASOURCE_URL }}
            SPRING_DATASOURCE_USERNAME: ${{ secrets.SPRING_DATASOURCE_USERNAME }}
            SPRING_DATASOURCE_PASSWORD: ${{ secrets.SPRING_DATASOURCE_PASSWORD }}

      # Docker 이미지 빌드
      - name: Build and Push Docker Image
        run: |
          docker build -t ${{ secrets.DOCKER_USERNAME }}/demo:latest .
          docker push ${{ secrets.DOCKER_USERNAME }}/demo:latest

      # EC2에 배포
      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_KEY }}
          script: |
            sudo docker pull ${{ secrets.DOCKER_USERNAME }}/demo:latest
            sudo docker stop my-spring-container || true
            sudo docker rm my-spring-container || true
            sudo docker run -d \
              -p 8080:8080 \
              --name my-spring-container \
              -e SPRING_DATASOURCE_URL="$SPRING_DATASOURCE_URL" \
              -e SPRING_DATASOURCE_USERNAME="$SPRING_DATASOURCE_USERNAME" \
              -e SPRING_DATASOURCE_PASSWORD="$SPRING_DATASOURCE_PASSWORD" \
              ${{ secrets.DOCKER_USERNAME }}/demo:latest

 

 

프로젝트 구조

프로젝트 빌드 & 배포 프로세스를 정리해보았다.

Github Actions, Docker / DockerHub를 이용하여 빌드 및 자동 배포하였고,

AWS의 EC2와 RDS를 이용하여 배포하였다.

 

기여

이번 해커톤 프로젝트에서 이런 역할들을 맡았다.

 

1. 아이디어 제시 및 요구사항 명세 작성 (팀원 전원 참여)

2. 전체적인 ERD 구조 작성 (팀원 전원 참여)

3. API 명세서 작성 (팀원 전원 참여)

4. 애플리케이션의 의존성 및 전체적인 구조 설계

5. Reservation 파트 구현

6. Swagger 의존성 설정 및 어노테이션을 통해 문서화

7. AWS EC2 설정 및 배포

8. Docker와 Github Actions를 이용하여 자동으로 빌드 및 EC2에 배포

 

Commits · KUIT-4th-Hackathon-Team2/backend

 

GitHub - KUIT-4th-Hackathon-Team2/backend

Contribute to KUIT-4th-Hackathon-Team2/backend development by creating an account on GitHub.

github.com

 

간략 회고

사람들과 팀을 이뤄서 역할을 분배하여 협업을 해 보는 좋은 경험이었다.

 

깃으로 브랜치를 나눠 버전 관리를 하는 것도 이론으로만 공부했고 개인 프로젝트에만 사용했었는데 팀원들에게도 알려주면서 진행하는 경험이 되어 좋았다. 브랜치 분리 - 개발 - PR - Squash merge라는 프로세스를 확실히 연습할 수 있었고, fetch를 통해 로컬과 원격을 동기화하는 과정도 잘 체화된 것 같다.

 

또 단순하게 빌드된 파일을 EC2로 전송하여 배포하는 것이 아니라, Github actions와 DockerHub의 대략적인 작동 과정과 사용법에 대해서도 공부할 수 있었다. 이후 개인 프로젝트에도 적용해 볼 계획이다.

 

해커톤 시간이 조금 부족하여 안드로이드(프론트) 앱이 완성되지는 않았지만, 내 짧은 지식으로 병아리 팀원께 알려드린 것도 많아 뿌듯하였다. 동아리에서 제공해준 튜토리얼 자료들도 퀄리티가 좋아서 공부도 많이 된 것 같다.

'Projects' 카테고리의 다른 글

[Project - Whenwhen] 2. ERD 작성기  (2) 2024.11.12
[Project - Whenwhen] 1. 프로젝트 개요  (3) 2024.11.10
'Projects' 카테고리의 다른 글
  • [Project - Whenwhen] 2. ERD 작성기
  • [Project - Whenwhen] 1. 프로젝트 개요
j30ngwoo
j30ngwoo
  • j30ngwoo
    Jeongwoo's Dev Blog
    j30ngwoo
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (15)
      • 정리 및 생각 (4)
      • Problem Solving (2)
      • 해결 및 개선 (4)
      • Projects (3)
  • 인기 글

  • 태그

    오블완
    kupc2023
    backend
    whenwhen
    spring
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
j30ngwoo
[Project - 빌릴건대] KUIT 4기 해커톤
상단으로

티스토리툴바