1. 개발 환경

EC2 서버 인스턴스 사양

UI / UX Design

형상 관리

OS

이슈 관리

커뮤니케이션

Mobile App

Tech Version
Flutter
SecurityStore

Watch App

Tech Version
Kotlin
Retrofit

BackEnd

Tech Version
Java JDK 17
Spring boot 3.2.5
Gradle
Swagger

Infra

IDE

Database

Monitoring

2. 설정 파일

BackEnd

application.yml

server:
  port: 8081

spring:
  application:
    name: member-service

  datasource:
    url: jdbc:mysql://${DATABASE_URL}:${DATABASE_PORT}/${DATABASE_USER_DB_NAME}
    username: ${DATABASE_USERNAME}
    password: ${DATABASE_PASSWORD}

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    generate-ddl: true
    properties:
      hibernate:
        format_sql: true
    defer-datasource-initialization: true

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: <https://eureka.gaenari.kr/eureka>

springdoc:
  api-docs:
    enabled: true
    version: openapi_3_1
  enable-spring-security: true
  default-consumes-media-type: application/json
  default-produces-media-type: application/json

token:
  expiration_time: 86400000 # 60*60*24*1000
  secret: ${SECRET_TOKEN} # 임의의 값

feign:
  url:
    member-service: <http://member-service.member.svc.cluster.local>
    inventory-service: <http://inventory-service.inventory.svc.cluster.local>
    program-service: <http://program-service.program.svc.cluster.local>
    exercise-record-service: <http://exercise-record-service.exercise-record.svc.cluster.local>
    challenge-service: <http://challenge-service.challenge.svc.cluster.local>
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
    circuitbreaker:
      enabled: true

resilience4j:
  circuitbreaker:
    configs:
      default:
        failure-rate-threshold: 50 # 실패율 임계값 설정 (50%)
        slow-call-rate-threshold: 80 # slowCall 발생 시 서버 스레드 점유로 인해 장애가 생길 수 있으므로 기본값(100)보다 조금 작게 설정
        slow-call-duration-threshold: 5s # 위와 같은 이유로 5초를 slowCall로 판단함. 해당 값은 TimeLimiter의 timeoutDuration보다 작아야 함
        register-health-indicator: true # 회로 차단기의 상태를 헬스 인디케이터(Health Indicator)로 등록할지 여부
        wait-duration-in-open-state: 10s # HALF_OPEN 상태로 빨리 전환되어 장애가 복구 될 수 있도록 기본값(60s)보다 작게 설정
        automaticTransitionFromOpenToHalfOpenEnabled: true # OPEN 상태가 10초 지속되면 HALFOPEN 상태로 변경
        sliding-window-type: COUNT_BASED # 윈도우 타입: COUNT_BASED 또는 TIME_BASED
        sliding-window-size: 100 # 최근 100번의 호출을 분석하여 결정
        minimum-number-of-calls: 10 # 최소 호출 횟수, 이 수를 넘어야 통계가 적용됨
    instances:
      default:
        baseConfig: default
      member-service-circuit-breaker:
        baseConfig: default
      inventory-service-circuit-breaker:
        baseConfig: default
      program-service-circuit-breaker:
        baseConfig: default
      exercise-record-service-circuit-breaker:
        baseConfig: default
      challenge-service-circuit-breaker:
        baseConfig: default
  timelimiter:
    configs:
      default:
        timeoutDuration: 6s # slowCallDurationThreshold보다는 크게 설정되어야 함
        cancelRunningFuture: true
    instances:
      default:
        baseConfig: default
      member-service-circuit-breaker:
        baseConfig: default
      inventory-service-circuit-breaker:
        baseConfig: default
      program-service-circuit-breaker:
        baseConfig: default
      exercise-record-service-circuit-breaker:
        baseConfig: default
      challenge-service-circuit-breaker:
        baseConfig: default

3. CI/CD 구축

Docker

DockerFile

FROM openjdk:17-ea-jdk-slim
VOLUME /tmp
ARG JAR_FILE=./build/libs/*.jar
COPY ${JAR_FILE} MemberService.jar
ENTRYPOINT ["java", "-jar", "MemberService.jar", "--spring.profiles.active=prod"]

Jenkins

Credential

Untitled