Spring & Spring Boot/대용량 파일 전송 시스템 개발

[26] 대용량 파일 전송 시스템 개발 - application를 로컬(local), 개발(dev), 운영(prod) 환경으로 분리

carrotweb 2026. 9. 30. 21:34
728x90
반응형

application.properties를 application.yml로 변경

application.properties 파일을 application.yml 파일로 변경합니다.

구분 properties yml(YAML)
Key 포맷 점(.)으로 계층 구분 들여쓰기(Space 2칸)와 콜론(:)으로 계층 구분
Value 구분 이콜(=)로 구분
Key=Value
콜론(:)으로 구분
Key: Value
설명 데이터의 계층이 깊어질수록 상위 계층을 매번 반복해서 입력해야 하기 때문에 복잡해지고 가독성이 떨어집니다. 들여쓰기를 기반으로 데이터의 계층 구조를 명확하게 구분하기 때문에 복잡하지 않아 가독성이 좋습니다.

 

  1. 파일 확장자를 properties에서 yml로 변경합니다.
  2. 점(.)으로 구분된 데이터의 계증 구조를 콜론(:)으로 변경하고 들여쓰기(Space 2칸)합니다.
  3. 이콜(=)를 콜론(:)으로 변경하여 Value를 구분합니다.
  4. 동일한 계층은 제거하면 됩니다.

application.properties 파일

spring.application.name=transmission

# Server
server.port=8080

# Spring
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

# DataSource
spring.datasource.url=jdbc:mysql://localhost:3307/testdb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=kiki@2000

# mybatis
mybatis.mapper-locations=classpath:/mapper/mariadb/*Mapper.xml

# Log
logging.level.org.hibernate.type.descriptor.sql=trace

# Redis
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.password=kiki@2000
spring.data.redis.ssl.enabled=false
spring.data.redis.timeout=5000ms
spring.data.redis.lettuce.shutdown-timeout=100ms
spring.data.redis.lettuce.pool.max-active=5
spring.data.redis.lettuce.pool.max-idle=5
spring.data.redis.lettuce.pool.min-idle=3
spring.data.redis.lettuce.pool.max-wait=2000ms

# Redisson
spring.redis.redisson.file=classpath:redisson.yml

 

application.yml 파일

# Spring
spring:
  application:
    name: transmission
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
  datasource:
    url: jdbc:mysql://localhost:3307/testdb
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: kiki@2000
  data:
    redis:
      host: localhost
      port: 6379
      password: kiki@2000
      ssl:
        enabled: false
      timeout: 5000ms
      lettuce:
        shutdown-timeout: 100ms
        pool:
          max-active: 5
          max-idle: 5
          min-idle: 3
          max-wait: 2000ms
  redis:
    redisson:
      file: classpath:redisson.yml

# mybatis
mybatis:
  mapper-locations: classpath:/mapper/mariadb/*Mapper.xml

# Log
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

# Server
server:
  port: 8080

위에 있는 username과 password는 저의 테스트 계정과 비밀번호이므로 변경하셔야 합니다.

 

 

실행 환경(Environment)별로 분리

  • 로컬 환경 (Local Environment) : 개발자 PC에서 개발 및 테스트를 위한 환경 (로컬 DB 사용)
  • 개발 환경 (Development Environment) : 작업한 코드들을 통합하여 서버에서 테스트하는 환경 (개발 DB 사용, 일부 외부 연동)  - 스테이징 서버에 반영하기 전에 통합(Integration) 테스트 진행
  • 스테이징 환경 (Staging Environment) : 운영 환경과 동일한 환경으로 운영에서 사용되는 데이터로  테스트하는 환경 (운영  DB의 데이터 비식별화(마스킹)하여 사용, 외부 연동) - 운영 서버에 반영하기 전에 QA(Quality Assurance) 테스트 진행
  • 운영 환경(Production Environment) : 실질적으로 운영하는 서버 환경 (운영 DB 사용, 외부 연동, 시스템 환경 변수 사용, 보안 적용)

 

application.yml 파일을 공통과 환경별로 분리합니다.

[공통] 기본 설정 - application.yml
[로컬 환경] 개발 PC 환경 설정 - application-local.yml
[개발 환경] 개발 서버 환경 설정 - application-dev.yml

[스테이징 환경] 스테이징 환경 서버 설정 - application-stag.yml
[운영 환경] 운영 서버 환경 설정 - application-prod.yml

 

application.yml (공통)

# Spring
spring:
  application:
    name: transmission
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
  profiles:
    active: local

# mybatis
mybatis:
  mapper-locations: classpath:/mapper/mariadb/*Mapper.xml

 

application-local.yml (로컬 환경)

# Spring
spring:
  datasource:
    url: jdbc:mysql://localhost:3307/testdb
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: kiki@2000
  data:
    redis:
      host: localhost
      port: 6379
      password: kiki@2000
      ssl:
        enabled: false
      timeout: 5000ms
      lettuce:
        shutdown-timeout: 100ms
        pool:
          max-active: 5
          max-idle: 5
          min-idle: 3
          max-wait: 2000ms
  redis:
    redisson:
      file: classpath:redisson-local.yml

# Log
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

# Server
server:
  port: 8080

 

application-dev.yml (개발 환경)

# Spring
spring:
  datasource:
    url: jdbc:mysql://<개발 DB URL/IP>:3307/testdb
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: <개발 DB username>
    password: <개발 DB password>
  data:
    redis:
      host: <개발 Redis URL/IP>
      port: <개발 Redis port>
      password: <개발 Redis password>
      ssl:
        enabled: false
      timeout: 5000ms
      lettuce:
        shutdown-timeout: 100ms
        pool:
          max-active: 50
          max-idle: 50
          min-idle: 25
          max-wait: 2000ms
  redis:
    redisson:
      file: classpath:redisson-dev.yml

# Log
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

# Server
server:
  address: 0.0.0.0
  port: 80

 

application-stag.yml (스테이징 환경)

# Spring
spring:
  datasource:
    url: jdbc:mysql://<스테이징 DB URL/IP>:3307/testdb
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: <스테이징 DB username>
    password: <스테이징 DB password>
  data:
    redis:
      host: <스테이징 Redis URL/IP>
      port: <스테이징 Redis port>
      password: <스테이징 Redis password>
      ssl:
        enabled: true
      timeout: 5000ms
      lettuce:
        shutdown-timeout: 100ms
        pool:
          max-active: 100
          max-idle: 100
          min-idle: 50
          max-wait: 2000ms
  redis:
    redisson:
      file: classpath:redisson-stag.yml

# Log
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: error

# Server
server:
  address: 0.0.0.0
  port: 80

 

application-prod.yml (운영 환경)

# Spring
spring:
  datasource:
    url: jdbc:mysql://<운영 DB URL/IP>:3307/testdb
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: <운영 DB username>
    password: <운영 DB password>
  data:
    redis:
      host: <운영 Redis URL/IP>
      port: <운영 Redis port>
      password: <운영 Redis password>
      ssl:
        enabled: true
      timeout: 5000ms
      lettuce:
        shutdown-timeout: 100ms
        pool:
          max-active: 100
          max-idle: 100
          min-idle: 50
          max-wait: 2000ms
  redis:
    redisson:
      file: classpath:redisson-prod.yml

# Log
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: error

# Server
server:
  address: 0.0.0.0
  port: 80

 

개발 환경, 스테이징 환경, 운영 환경에 address를 0.0.0.0으로 한 이유는 도커 컨테이너나 클라우드 환경에서는 컨테이너 내부 IP와 외부 호스트 IP가 다릅니다. 이때 address를 0.0.0.0으로 열어두지 않으면 외부에서 보내는 트래픽을 서버가 수신하지 못하고 거부할 수 있기 때문입니다.

# Server
server:
  address: 0.0.0.0

 

 

redisson.yml 파일도 분리합니다.

redisson-local.yml (로컬 환경)

singleServerConfig:
  address: "redis://127.0.0.1:6379"
  password: "kiki@2000"
  connectionPoolSize: 16
  connectionMinimumIdleSize: 6
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000

 

application-dev.yml (개발 환경)

singleServerConfig:
  address: "redis://<개발 Redis URL/IP>:<개발 Redis port>"
  password: "<개발 Redis password>"
  connectionPoolSize: 32
  connectionMinimumIdleSize: 12
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000

 

application-stag.yml (스테이징 환경)

singleServerConfig:
  address: "redis://<스테이징 Redis URL/IP>:<운영 Redis port>"
  password: "<스테이징 Redis password>"
  connectionPoolSize: 64
  connectionMinimumIdleSize: 24
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000

 

application -prod.yml (운영 환경)

singleServerConfig:
  address: "redis://<운영 Redis URL/IP>:<운영 Redis port>"
  password: "<운영 Redis password>"
  connectionPoolSize: 64
  connectionMinimumIdleSize: 24
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000

 

 

IntelliJ에서 실행(Run/Debug)하면 application에서 profiles.active로 설정된 [local] 환경으로 정보를 가져와 실행됩니다.

INFO 2568 --- [transmission] [           main] c.example.transmission.DemoApplication   :
The following 1 profile is active: "local"

 

 

IntelliJ IDEA에서 실행 환경(local/dev/stag/prod)별로 선택하여 빌드 및 실행하는 방법

 

1. pom.xml 파일에 profile를 추가합니다.

<project> 내부에 실행 환경별로 추가합니다. <profile>은 하나의 실행 환경입니다.

<activeByDefault>true</activeByDefault>는 Profile를 선택하지 않으면 기본으로 선택되게 합니다.

<profiles>
    <profile>
        <id>Local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <activatedProperties>local</activatedProperties>
        </properties>
    </profile>
    <profile>
        <id>Development</id>
        <properties>
            <activatedProperties>dev</activatedProperties>
        </properties>
    </profile>
    <profile>
        <id>Staging</id>
        <properties>
            <activatedProperties>stag</activatedProperties>
        </properties>
    </profile>
    <profile>
        <id>Production</id>
        <properties>
            <activatedProperties>prod</activatedProperties>
        </properties>
    </profile>
</profiles>

 

pom.xml 파일에 profile를 추가되면 우측 Maven 탭 → {Profiles}에 노출됩니다.

 

2. application.yml 파일에서 Maven이 선택한 프로필로 active 되도록 수정합니다.

@activatedProperties@이 우측 Maven 탭 → {Profiles}에서 선택된 프로필 값(<properties>의 <activatedProperties>)입니다.

# Spring
spring:
  application:
    name: transmission
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
  profiles:
    active: @activatedProperties@

# mybatis
mybatis:
  mapper-locations: classpath:/mapper/mariadb/*Mapper.xml

 

우측 Maven 탭 → {Profiles}에서 선택된 프로필(실행 환경)로 IntelliJ에서 실행(Run/Debug)하고 Maven Bulid를 할 수 있습니다.

 

 

728x90
반응형