Home [Numble Backend Challenge] 1일차
Post
Cancel

[Numble Backend Challenge] 1일차

요구사항

DB 설계

ERD

개발 환경 설정

  • Local Database
    • MySql 8.0.20 및 Timezone설정(Asia/Seoul)
  • Spring project (boot version : 2.5.6, java version : 1.8)
    • 배포, 개발 환경 분리(application.yml)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      
        spring:
          profiles:
            group:
              dev: dev, common
              
        ---
              
        spring:
          profiles:
            group:
              prod: prod, common
              
        ---
              
        spring:
          config:
            activate:
              on-profile: "common"
            thymeleaf:
              prefix: classpath:/templates/
              cache: false
              check-template-location: true
              suffix: .html
              
        server:
          port: 9091
              
        ---
              
        spring:
          config:
            activate:
              on-profile: "dev"
          devtools:
            livereload:
              enabled: true
            restart:
              enabled: true
          jpa:
            hibernate:
              ddl-auto: create
            show-sql: true
            properties:
              hibernate:
                format_sql: true
          datasource:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/numble
            username: root
            password: 1234
              
        logging:
          level:
            org.springframework.web: trace
              
        ---
              
        spring:
          config:
            activate:
              on-profile: "prod"
          jpa:
            hibernate:
              ddl-auto: update
              
          datasource:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://numble.c2ejxfeifgj5.ap-northeast-2.rds.amazonaws.com:3306/numble?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Seoul
            username: ${DB_USERNAME}
            password: ${DB_PASSWORD}
              
        logging:
          level:
            org.springframework.web: trace
      

배포 환경 설정

  • AWS EC2
    • EC2 인스턴스 생성 및 보안 규칙 설정
      • ssh접속을 위한 22번 포트와 Jenkins용 8080 port, spring 서버 접속 용 9091 port를 인바운드 규칙에 추가

    AWS

    • Jenkins
      • Git Hook을 통해 master branch에 commit이 발생할 경우 Jenkins에서 clone받아 compile해서 서버 실행해 배포할 예정(Jenkins, Github 연동)
      • free tier의 제한때문에 하나의 EC2 인스턴스에서 jenkins서버와 spring서버를 동시에 실행시킬 예정
        • container가 종료 되었을때를 대비해 jenkins_home을 마운트 시킴
        • Plugin은 recommend와 Publish Over SSH를 설치(Jenkins Publish over SSH Plugin 설정(AWS))
        • Build가 성공적으로 진행되면 EC2에 SSH접속을 통해 빌드 된 파일을 보내고 서버 실행 스크립트를 실행해 최종 배포
        • Jenkins Server에서 빌드를 진행하고 테스트까지 수행하게 되므로 환경 변수에 DB ID, PW를 추가
      • Jenkins Dockerfile

        1
        2
        3
        
          FROM jenkins/jenkins:lts
          USER root
          RUN apt-get update && apt-get upgrade -y && apt-get install -y openssh-client
        
      • Jenkins docker-compose.yml

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        
          version: "3"
                    
          services:
                  jenkins:
                          container_name: jenkins
                          image: jenkins/jenkins:lts
                          user: root
                          ports:
                                  - "8080:8080"
                          volumes:
                                  - /home/ubuntu/jenkins-compose/jenkins_home:/var/jenkins_home
                                  - /home/ubuntu/jenkins-compose/.ssh:/root/.ssh
        
      • Jenkins 설정 및 Github Webhook 설정
        • Github Repository webhook 설정을 통해 jenkins서버로 전송
        • Jenkins 프로젝트 설정에 git을 위한 secret 추가 및 git url추가
        • Build는 Use Gradle Warpper를 선택

          1
          2
          
            clean
            build -Pprofile=prod
          
        • 빌드 후 조치 추가

          Jenkins

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          
            ## deploy.sh
            #!/bin/bash
            echo "> 기존 container, image 삭제"
            CONTAINER_ID=`docker ps -a -q --filter ancestor="numble"`
            if [ ${CONTAINER_ID} ];then
              docker stop ${CONTAINER_ID}
              docker rm ${CONTAINER_ID}
              docker rmi -f numble
            fi
                          
            echo "> 최신 빌드 파일로 도커 이미지 생성"
            if docker build -t numble . ; then
              echo "> 성공"
            else
              echo "> 실패"
              exit 1
            fi
                          
            echo "> 최신 도커 이미지로 컨테이너 실행"
            if docker run -d -p 9091:9091 numble; then
              echo "> 성공"
              exit 0
            else
              echo "> 실패"
              exit 1
            fi
          
    • spring docker
      • Dockerfile

        1
        2
        3
        4
        5
        
          FROM openjdk:8
          COPY numble-0.0.1-SNAPSHOT.jar app.jar
          ENV DB_USERNAME (database username)
          ENV DB_PASSWORD (database password)
          ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]
        
  • RDS
    • MySql 인스턴스를 생성하고 인바운드 보안 그룹 설정은 내 Local Ip와 EC2 Instance로 부터만 가능하도록 설정

EC2 서버 접속 화면

LoginPage

This post is licensed under CC BY 4.0 by the author.