1. 개발 환경 및 기술 스택

2. 설정 파일 및 환경 변수 정보

  1. Spring boot

    server:
      base-url: localhost
      fastapi-url: <http://localhost:8001>
    
    spring:
      servlet:
        # file 업로드 관련 세팅 (명시적으로 설정 안할 시 Spring boot는 기본적으로 1MB로 설정됨)
        multipart:
          max-file-size: 10MB  # 최대 파일 크기
          max-request-size: 10MB  # 최대 요청 크기
    
      jpa:
        open-in-view: false
        defer-datasource-initialization: false
        generate-ddl: false
        hibernate:
          ddl-auto: none                # ddl 자동 작성 여부
        properties:
          hibernate:
            format_sql: true             # 하이버네이트가 실행한 SQL을 출력할 때 보기 좋게 정렬
            use_sql_comments: true
            show_sql: true               # 하이버네이트가 실행한 SQL을 출력
            jdbc:
              batch_size: 100              #   insert/update 쿼리를 원하는 개수만큼 모아서 DB에 날릴 수 있는 옵션
            default_batch_fetch_size: 100
    
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver  # DB 드라이버
        url: jdbc:mysql://${server.base-url}:3306/nowdoboss?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true       # 데이터베이스 URL
        username: ENC(/u0+l2qNJvB7yNP4g9pITQ==)                     # 데이터베이스 계정명
        password: ENC(8ZO2KjT7dEI3sWWMRNGIfg==)                     # 데이터베이스 계정 비밀번호
    
      # data_테이블명.sql 관련 실행 setting (더미데이터)
    #  sql:
    #    init:
    #      mode: always
    #      data-locations:
    #        - 'classpath:/db/dummy/FOREIGN_KEY_CHECKS_0.sql'
    #        - 'classpath:/db/dummy/db_dump.sql'
    #        - 'classpath:/db/dummy/db_dump1.sql'
    #        - 'classpath:/db/dummy/db_dump2.sql'
    #        - 'classpath:/db/dummy/FOREIGN_KEY_CHECKS_1.sql'
    
      # NoSQL setting
      data:
        # Redis setting
        redis:
          host: ${server.base-url}
          port: 6379
    
        # MongoDB setting
        mongodb:
          auto-index-creation: true
          host: localhost
          port: 27017
          database: nowdoboss
    
      # Java Mail Sender setting (Google Mail)
      mail:
        host: smtp.gmail.com
        port: 587
        username: ENC(9zcJxzMJjdfsV97O7BJQvAtUCYHyAV12FmzBkDqpDW8=)
        password: ENC(bad9dzuo4Yv1McadA8EOSn13JEEl/6UeyvsknQfCXyQ=)
        properties:
          mail:
            smtp:
              auth: true
              starttls:
                enable: true
    
      # Kafka setting
      kafka:
        bootstrap-servers: ${server.base-url}:9092, ${server.base-url}:9093, ${server.base-url}:9094
        consumer:
          group-id: NowDoBossGroup
          auto-offset-reset: earliest
          key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
          properties:
            spring:
              json:
                trusted:
                  packages: '*'
        producer:
          key-serializer: org.apache.kafka.common.serialization.StringSerializer
          value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    
      # flyway setting
      flyway:
        enabled: false  # Flyway 비활성화
    
      mvc:
        async:
          request-timeout: 3000000
    
    # log 관리
    logging:
      level:
        org.hibernate:
          type.descriptor.sql: trace
          org.hibernate.SQLQuery: debug
    
    # jwt setting
    jwt:
      accessKey: ENC(s0vsxAuXmlzr6DjkUVLrlIS+MdTML5arOQyKWar2qbFPkVVJ1zZoR09t83GnhFYhzIvLDaD119HeajudDJS4GXxVTkd+M/zQ/q1ssX4aw00y+52LOysZk/q/I3T4a3zYmOxfYI4aCslih6D5TTl5rQnPeZV2rmjdJXAg1X7owfGsquBPnuUptjuKxteIdEjtFFp1SF9QZ/+TvWyYrlwH1Q==)
      refreshKey: ENC(gE+DTAeZ7HD32Rd6u5HcfJu+bg4kgdULucqZWVJCbHG5q5SE53YWhNuQcSyE61MVF8Cow5idsgt1RoMi3w0ri7Bq57Fr6+m6qr5bi+kXL+nQOv/GWoPcj2DxteTB5izXHEp5fzC5uq1m8QrltRiQa1WfY8s1w6myZFWqPzn4S8FjoR/7/4oG7XU/Q/+HV1I0viF/51ziOKJFVn0nPAyMnQ==)
      accessExpiration: PT420M  # 420분 (PT420M)
      refreshExpiration: PT10080M  # 10080분 (7일) (PT10080M)
    
    # firebase setting
    app:
      firebase-configuration-file: classpath:serviceAccountKey.json
      firebase-bucket: ENC(kEjE5eNrPFCEldmd4VOt0mXnXI2qkPVNJIhOBdW8K60=)
      firebase-project-id: nowdoboss
    
    # OAUTH2.0 Setting
    oauth:
      kakao:
        client-id: ENC(BXCwf0NtueMIhhv565w/js6mYPVy/ydnEixfuH4untZmrP3mi6qKEPCRUvPYZSTQ)   # REST API 키
        client-secret: ENC(Vt6Pop34W0MzRbM/vmr0uqASBu2KA78aqShRqWv7weGoNHzwkayNeCkxo11QeeTP) # 보안 -> Client Secret 키
        redirect-uri: <http://$>{server.base-url}:5173/member/loading/kakao
        scope:
          - profile_nickname
          - profile_image
          - account_email
          - name
    
      naver:
        client-id: ENC(+VjRqdSmB6m1Jvl1ZJGJRW+bTtY4tJNh123J0sHB4QU=)
        client-secret: ENC(0BeyGmHNDHLJW5hudtEfpEpq+0hFiGaO)
        redirect_uri: <http://$>{server.base-url}:5173/member/loading/naver
        scope:
          - nickname
          - name
          - email
          - profile_image
    
      google:
        client_id: ENC(cDBVfDvLY03EnW9oNtZ9XqgVTS1otEDtR+jbK/4o2cK67zN1bWTfsX/bBJNwjKW3pP2iu0LzCLwG3LUVn8AJyZb5ENsfeN3DavnK+k0SeASHOTrlvZWPxA==)
        client_secret: ENC(FEWnh24Bb7QzhYBqVbWowEN+fJkgt0qVchd8MVcwNBwdBl8oRKn9qIz7Ff22gtNI)
        redirect_uri: <http://$>{server.base-url}:5173/member/loading/google
        scope:
          - profile
          - email
    
    
    server:
      base-url: k10c208.p.ssafy.io
      https-url: <https://k10c208.p.ssafy.io>
      fastapi-url: <http://13.124.23.220:8000>
    
    spring:
      servlet:
        # file 업로드 관련 세팅 (명시적으로 설정 안할 시 Spring boot는 기본적으로 1MB로 설정됨)
        multipart:
          max-file-size: 10MB  # 최대 파일 크기
          max-request-size: 10MB  # 최대 요청 크기
    
      jpa:
        open-in-view: false
        defer-datasource-initialization: false  # flyway 관련 마이그레이션 이슈 -> false로 변경
        generate-ddl: false
        hibernate:
          ddl-auto: none                # ddl 자동 작성 여부
        properties:
          hibernate:
            format_sql: true             # 하이버네이트가 실행한 SQL을 출력할 때 보기 좋게 정렬
            use_sql_comments: true
            show_sql: true               # 하이버네이트가 실행한 SQL을 출력
            jdbc:
              batch_size: 100              #   insert/update 쿼리를 원하는 개수만큼 모아서 DB에 날릴 수 있는 옵션
            default_batch_fetch_size: 100
    
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver  # DB 드라이버
        url: jdbc:mysql://${server.base-url}:3306/nowdoboss?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true       # 데이터베이스 URL
        username: ENC(CIv9gIlHdeV0RVfvISnt1Q==)                     # 데이터베이스 계정명
        password: ENC(8JDguUr+RtTPfR+4re7EluKRxKLKmaLb)             # 데이터베이스 계정 비밀번호
    
      # NoSQL setting
      data:
        # Redis setting
        redis:
          host: ${server.base-url}
          port: 6379
    
        # MongoDB setting
        mongodb:
          host: ${server.base-url}
          port: 27017
          database: nowdoboss
    
      # Java Mail Sender setting (Google Mail)
      mail:
        host: smtp.gmail.com
        port: 587
        username: ENC(9zcJxzMJjdfsV97O7BJQvAtUCYHyAV12FmzBkDqpDW8=)
        password: ENC(bad9dzuo4Yv1McadA8EOSn13JEEl/6UeyvsknQfCXyQ=)
        properties:
          mail:
            smtp:
              auth: true
              starttls:
                enable: true
    
      # Kafka setting
      kafka:
        bootstrap-servers: kafka-1:29092, kafka-2:29093, kafka-3:29094 # 도커에서 설정한 내부 서비스명으로 접근 (내부 네트워크 이용)
        consumer:
          group-id: NowDoBossGroup
          auto-offset-reset: earliest
          key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
          properties:
            spring:
              json:
                trusted:
                  packages: '*'
        producer:
          key-serializer: org.apache.kafka.common.serialization.StringSerializer
          value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    
      # flyway setting
      flyway:
        enabled: true
        locations: classpath:db/migration
        baseline-on-migrate: true
        out-of-order: false
    
      mvc:
        async:
          request-timeout: 3000000
    
    # log 관리
    logging:
      level:
        org.hibernate:
          type.descriptor.sql: trace
          org.hibernate.SQLQuery: debug
    
    # jwt setting
    jwt:
      accessKey: ENC(s0vsxAuXmlzr6DjkUVLrlIS+MdTML5arOQyKWar2qbFPkVVJ1zZoR09t83GnhFYhzIvLDaD119HeajudDJS4GXxVTkd+M/zQ/q1ssX4aw00y+52LOysZk/q/I3T4a3zYmOxfYI4aCslih6D5TTl5rQnPeZV2rmjdJXAg1X7owfGsquBPnuUptjuKxteIdEjtFFp1SF9QZ/+TvWyYrlwH1Q==)
      refreshKey: ENC(gE+DTAeZ7HD32Rd6u5HcfJu+bg4kgdULucqZWVJCbHG5q5SE53YWhNuQcSyE61MVF8Cow5idsgt1RoMi3w0ri7Bq57Fr6+m6qr5bi+kXL+nQOv/GWoPcj2DxteTB5izXHEp5fzC5uq1m8QrltRiQa1WfY8s1w6myZFWqPzn4S8FjoR/7/4oG7XU/Q/+HV1I0viF/51ziOKJFVn0nPAyMnQ==)
      accessExpiration: PT420M  # 420분 (PT420M)
      refreshExpiration: PT10080M  # 10080분 (7일) (PT10080M)
    
    # firebase setting
    app:
      firebase-configuration-file: classpath:serviceAccountKey.json
      firebase-bucket: ENC(kEjE5eNrPFCEldmd4VOt0mXnXI2qkPVNJIhOBdW8K60=)
      firebase-project-id: nowdoboss
    
    # OAUTH2.0 Setting
    oauth:
      kakao:
        client-id: ENC(Er9vs53WOnigwpkw3PMICW6PwM0fN0m1xbjy9AIEqdSqyMhgFAKQkFnG2E1xxNFE)   # REST API 키
        client-secret: ENC(15fElLNo9a/0jmRDVVdspIQYQQemm1JLA6ZW8G28x8J1PgPsbsRgwdol46dAfuug) # 보안 -> Client Secret 키
        redirect-uri: ${server.https-url}/member/loading/kakao
        scope:
          - profile_nickname
          - profile_image
          - account_email
    #      - name
    
      naver:
        client-id: ENC(+VjRqdSmB6m1Jvl1ZJGJRW+bTtY4tJNh123J0sHB4QU=)
        client-secret: ENC(0BeyGmHNDHLJW5hudtEfpEpq+0hFiGaO)
        redirect_uri: ${server.https-url}/member/loading/naver
        scope:
          - nickname
          - name
          - email
          - profile_image
    
      google:
        client_id: ENC(cDBVfDvLY03EnW9oNtZ9XqgVTS1otEDtR+jbK/4o2cK67zN1bWTfsX/bBJNwjKW3pP2iu0LzCLwG3LUVn8AJyZb5ENsfeN3DavnK+k0SeASHOTrlvZWPxA==)
        client_secret: ENC(FEWnh24Bb7QzhYBqVbWowEN+fJkgt0qVchd8MVcwNBwdBl8oRKn9qIz7Ff22gtNI)
        redirect_uri: ${server.https-url}/member/loading/google
        scope:
          - profile
          - email
    
    
  2. React

    # API URL settings for PJT
    VITE_REACT_API_URL=http://localhost:8080/api/v1
    
    # 카카오 맵 API 키
    VITE_REACT_APP_KAKAOMAP_API_KEY=23e6ac283713cfc6d7967f461691b3f0
    
    # 웹소켓 URL 설정
    VITE_REACT_WS_URL=ws://localhost:8080/ws
    
    # 클라이언트 기본 URL 설정
    BASE_URL=/
    
    # Firebase 설정
    VITE_REACT_FIREBASE_API_KEY=AIzaSyB15gX6ROz46ojhJThVJhdNdgjnPO130Nk
    VITE_REACT_FIREBASE_MESSAGING_SENDER_ID=88151658182
    VITE_REACT_FIREBASE_APP_ID=1:88151658182:web:12ecd86a23bffa11a291c7
    VITE_REACT_FIREBASE_MEASUREMENT_ID=G-6340LC2GSM
    
    VITE_REACT_FIREBASE_VAPID_KEY=BHyCqnVZHrtKUz3je8uIGipOkfhqfQavkWqw0J5I9eDkleWimvxWrVn6CG2AC_BPXEtQvYqVfU66CXWGye5ifUQ
    
    # API URL 설정
    VITE_REACT_API_URL=https://k10c208.p.ssafy.io/api/v1
    
    # 카카오 맵 API 키
    VITE_REACT_APP_KAKAOMAP_API_KEY=e55da734c04c78fcc069c3dab68f3c1e
    
    # 웹소켓 URL 설정
    VITE_REACT_WS_URL=wss://k10c208.p.ssafy.io/ws
    
    # 클라이언트 URL 설정
    BASE_URL=/
    
    # Firebase 설정
    VITE_REACT_FIREBASE_API_KEY=AIzaSyB15gX6ROz46ojhJThVJhdNdgjnPO130Nk
    VITE_REACT_FIREBASE_MESSAGING_SENDER_ID=88151658182
    VITE_REACT_FIREBASE_APP_ID=1:88151658182:web:12ecd86a23bffa11a291c7
    VITE_REACT_FIREBASE_MEASUREMENT_ID=G-6340LC2GSM
    
    VITE_REACT_FIREBASE_VAPID_KEY=BHyCqnVZHrtKUz3je8uIGipOkfhqfQavkWqw0J5I9eDkleWimvxWrVn6CG2AC_BPXEtQvYqVfU66CXWGye5ifUQ
    

3. 빌드 및 배포

1) 배포용 서버에 Docker + Docker compose 설치

  1. 배포용 서버에 해당 VI 편집기를 이용하여 쉘 스크립트를 작성한 뒤 실행시킵니다.

install_docker.sh

#!/bin/bash

# 기존 도커 패키지 제거 (이전 버전이 설치된 경우)
sudo apt-get remove docker docker-engine docker.io containerd runc

# 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

# 도커 GPG 키 추가
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 도커 저장소 추가
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] <https://download.docker.com/linux/ubuntu> $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 도커 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# 도커 컴포즈 최신 버전 다운로드
sudo curl -L "<https://github.com/docker/compose/releases/latest/download/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 도커 사용자 그룹에 현재 사용자 추가
sudo usermod -aG docker $USER
newgrp docker
sudo service docker restart

# 설치 확인
docker --version
docker-compose --version

2) Jenkins 컨테이너 실행

  1. 배포용 서버에 해당 VI 편집기를 이용하여 쉘 스크립트를 작성한 뒤 실행시킵니다.
  2. 젠킨스가 실행되면 <해당 도메인>:8888로 접속하여 설정을 합니다.