본문 바로가기

Side Project

사이드 프로젝트 시작 하기

개인적으로 개발자로 성장하기 가장 좋은 방법중에 하나는 사이프로젝트를 진행하는 것이라고 생각한다.
내가 만들고 싶은것을 내 마음데로 만들 수 있다는 장점이 있으며 (팀원들과 협의하에)
회사에서 업무 내용과 맞지 않아서 써보지 못했던 기술이라던가, 궁금했던 기술들에 과감하게 시도해볼 수 있기 때문이다.
그리고 이러한 프로젝트 과정에서 많은 문제들을 만나고 해결하면서 많은 성장을 이루어 낼 수 있다고 생각한다.

 

대학생때 대외활동을 하면서 미완성으로 끝났던 프로젝트가 있었는데
올해 새해 목표로 당시에 함께했던 팀원과함께 그 당시에 못끝냈던 프로젝트를 마무리 해보려한다.
프로젝트를 진행하는 과정중에서 기본적으로 셋팅이 필요한 부분들에 대해서는
다른 누군가가 도움을 받을 수 있도록 기본적인 셋팅 내용에 대해 간단하게 정리를 해보려고 한다.

프로젝트 기본 개발 환경 준비 (백엔드 개발자 관점)

  • github 저장소 만들기
  • aws 활용하는법
  • git action으로 배포 파이프라인 만들기

1. github 저장소 만들기

프로젝트를 진행하면서 가장 기본적인것 중에 하나는 소스코드를 저장하고 버전을 관리하면서
같이 프로젝트를 진행하는 동료들과 내용을 공유 할 수 있는 저장소를 만드는 것이다.
github를 기준으로 설명하면 아래와 같은 순서로 프로젝트를 진해하면 된다.

  • http://github.com/ 회원 가입
  • Home 화면에서 New 버튼을 클릭하여 신규 repository생성
  • repository 화면에서 녹색 Code 버튼을 클릭해서 repository clone에 필요한 url 저장
  • 이후 로컬 환경에서 신규 프로젝트를(ex, spring boot 프로젝트) 생성한뒤 아래의 명령어 수행
git init 
git remote add origin "복사했던 repository url"
git add .
git commit -m "first init"
git push --set-upstream origin main

 

 

2. AWS 활용하기 

프로젝트를 진행하면서 만들어진 결과물을 내 피씨에만 보관하고 싶은 사람은 없을 것이다. 

만들어진 기능을 외부 사용자가 사용할 수 있도록하려면 서버가 필요하다. 

 

유료로 돈을 쓰면서 사이드 프로젝트를 진행하고 싶은 사람은 많지 않을것이라고 생각하는데 

요즘에는 그래도 작은 사양의 경우는 무료로 서비스를 할 수 있도록 해주는 사이트도 여러곳이 있는것 같다.

 

하지만 그 중에서도 많은 회사에서 사용하고 또한 많은 후기가 있는 AWS가 사용하기에는 가장 편하다고 생각한다. 

신규로 가입을하면 1년간 프리티어로 다양한 서비스들을 이용할 수 있는데 (ec2, ecr, s3 등등) 

물론 특정 사용량을 넘어가면 유로로 비용이 청구 될 수 있기 때문에 조심해야한다. 

 

기본적으로 내가 사이드 프로젝트를 위해서 사용했던 프리티어 aws resource들은 아래와 같다 

프리티어 기준은 정확하지 않고 대략적으로 적어두었다 . 

- ec2 (일년에 750 시간정도는 무료, 메모리 1g 정도의 t2.micro 서버) 

- ecr (500mb 까지 사용가능, 생각보다 용량이작아서 latest 태그 하나로 덮어쓰기로 사용)

- s3 (5g까지 사용가능) 

- rds (750시간 동안 db.t2.micro 사용가능 20GB의 범용스토리지) 

 

3. Git action으로 배포 파이프라인 만들기 

개발된 코드를 서버로 자동으로 배포해주는 배포 파이프라인을 설정해두면 내가 수정한 사항을 github에 push 만 하면 알아서 빌드 하고

도커 이미지를 생성하고 서버로 배포시켜주는 처리를 할 수 있다.

git action 을 사용하면 이러한 과정을 정말 빠르고 쉽게 만들 수 있다 (github repository를 사용하는 사람이면 쓸 수 있다.) 

해당 기능을 만들기 위해서 내가 했던 프로세스는 아래와 같으며 완성된 git action yml은 주석을 달아서 첨부해 두었다. 

 

  • 프로젝트에 이미지를 생성할 수 있도록  Dockerfile 생성 
  • 이미지를 저장하기 위한 ecr 생성 
  • 생성한 ec2 서버에 docker 설치 
sudo yum install docker -y #도커설치
sudo service docker start #도커실행
sudo usermod -aG docker ec2-user #도커그룹에 인스턴스 기본 유저 추가, 접속후 바로 도커 제어 가능하도록
  • 생성한 ec2 서버에 aws cli 설치
  • aws user 생성 (ecr 과 s3에 대한 권한 부여), 해당 유저의 acces key, secret access key 생성 후 저장
  • ec2 서버의 public ip, 서버 생성시 사용한 pem 키의 내용 확인 (pem 파일을 열어보면 내용 읽을 수 있음 )  

 

Git action yml 예시 

- 소스 build 

- 생성된 api 문서 artifact에 저장 

- docker image파일 ecr push 

- ec2 서버에 접속

- ecr에서 업로드된 image pull 

- image 실행 

- artifact에 저장된 html api 명세서 s3에 저장 

 

name: side project CICD

on:
  push:
    branches: # main branch에 push가 발생하면 아래의 job이 실행한다 
      - main

jobs:
  push_to_registry:
    name: push image to ecr
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3  # 소스를 가져오는 부분으로 알고 있음 

      - name: Set up JDK 21 
        uses: actions/setup-java@v3 # 프로젝트에서 사용하는 jdk 버전을 가져온다 
        with:
          java-version: '21'
          distribution: 'corretto'

      - name: Grant execute permission for gradlew # 빌드 명령을 실행할 수 있도록 실행 권한 부여 
        run: chmod +x gradlew

      - name: Setup Gradle
        uses: gradle/gradle-build-action@v2 # build 진행 
        with:
         arguments: clean build
         cache-read-only: ${{ github.ref != 'refs/heads/master' }}

      - name: save docs file
        uses: actions/upload-artifact@v3 # 빌드과정에서 생성된 결과물 artifact저장 
        with:
          name: api-docs
          path: build/docs/asciidoc # 해당 경로에 있는 파일이 api-docs라는 이름으로 저장됨 

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1 # aws cli에서 사용할 계정의 정보 입력 
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1  #ecr로그인 

      - name: docker build and push
        uses: docker/build-push-action@v3
        with:
          context: .
          file: ./Dockerfile  #기본 루크 경로의 dockerfile 실행시킴 
          push: true
          tags: ${{ secrets.ECR_REPOSITORY }}/sideproject:latest
          cache-from: type=registry,ref=${{ secrets.ECR_REPOSITORY }}/sideproject:latest
          cache-to: type=inline
  
  pull_from_registry:
    name: Connect server ssh and pull from container registry
    needs: push_to_registry
    runs-on: ubuntu-latest
    steps:
      - name: connect ssh to run image
        uses: appleboy/ssh-action@master #ssh 접속없이 run 명령어만 사용하면 제대로 명령어 수행이 안되서 사용
        with:
          host: ${{ secrets.AWS_SSH_HOST }} #ec2의 public ip
          username: ${{ secrets.AWS_SSH_USERNAME }} # 기본 유저 ec2-user 
          key: ${{ secrets.AWS_SSH_KEY }} # pem키 읽어서 해당 내용 넣기 
          port: ${{ secrets.AWS_SSH_PORT }} # 기본 ssh 접근이 22 포트 
          script: |
          	# 이렇게 하면 docker 명령어를 통해서 ecr에 접근해서 이미지를 가져올 수 있게 하는거 (aws 문서보면 가이드 나옴)
            aws ecr get-login-password --region ap-northeast-2 | docker login  --username AWS --password-stdin ${{ secrets.ECR_REPOSITORY }}
            # ecr 에서 이미지 땡겨오기 
            docker pull ${{ secrets.ECR_REPOSITORY }}/sideproject:latest
            # 이미 해당 서버가 실행되어있다면 종료하기 
            docker stop sideproject && docker rm sideproject
            # 다운받은 이미지를 통해서 애플리케이션 run 
            docker run -d --name bevvy -p 80:8081 --restart unless-stopped ${{ secrets.ECR_REPOSITORY }}/sideproject:latest
            # 다운받은 이미지 중에서 사용안하는 이미지는 제거 
            docker image prune -f

  upload_docs:
    name: upload api docs
    needs: pull_from_registry
    runs-on: ubuntu-latest
    steps:
      - name: Download Artifact
        uses: actions/download-artifact@v3 # 위쪽에서 artifact에서 저장했던 파일 가져오기 위함 
        with:
          name: api-docs  # 저장한 Artifact파일 이름
          path: artifact
      - name: Upload Files to S3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ap-northeast-2
        run: |
          aws s3 cp artifact/index.html s3://sideproject-docs #artifact에 저장된 파일을 앞에 뒤쪽에는 저장하는 s3폴더 입력

 

 

 

 

 

 

 

 

 

 

 

 

 

'Side Project' 카테고리의 다른 글

맥주 추천 서비스 애플리케이션  (16) 2024.10.17