본문 바로가기
BackEnd/Project

[RealPJ] Ch01. Profile 설정

by 개발 Blog 2024. 8. 30.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

 

Profile이 필요한 이유

실제 회사에서 개발할 때는 여러 개의 Profile을 설정한다. 예를 들어 local, dev, test, prod와 같은 환경에 맞춘 다양한 프로파일을 사용할 수 있다. 이러한 프로파일을 나누는 이유는 환경별로 설정해야 하는 Property 값들이 다르기 때문이다.

 

다양한 환경

동일한 코드와 동일한 로직으로 수행되지만 상황에 따라서는 로컬과 개발 환경일 때는 ADB를, 테스트와 프로덕션 환경에서는 BDB를 바라봐야 할 수 있다. 이렇게 환경에 따라 프로퍼티 값들이 다르다면, 각 환경에 맞춘 프로파일을 설정하는 것이 필요하다.

 

또 다른 예로, 로컬에서는 로깅 레벨을 낮게 설정하고, 운영 환경에서는 로깅 레벨을 높게 설정해야 할 때도 마찬가지로 Profile을 사용하여 설정을 변경할 수 있다.

 

Profile사용 방법

실제 프로젝트에서는 보통 환경별로 다음과 같은 파일들을 통해 Property 값을 구분한다:

  • application-{env}.yaml 예시: application-local.yaml,
  • application-dev.yaml, application-prod.yaml

Profile실습

 

1. 환경별 Property 값 사용

멀티 모듈 프로젝트에서 module-api 모듈에 각 환경에 맞춘 설정 파일을 추가한다.

 

application-local.yaml

profile-name : local

spring:
  main:
    allow-bean-definition-overriding: true
  datasource:
    url: jdbc:mysql://localhost:3306/multiTest
    username: multitester
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true
        jdbc:
          time_zone: Asia/Seoul

 

application-beta.yaml

profile-name : beta

spring:
  main:
    allow-bean-definition-overriding: true
  datasource:
    url: jdbc:mysql://localhost:3306/multiTest
    username: multitester
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true
        jdbc:
          time_zone: Asia/Seoul

 

실제 값을 사용하는지 테스트하기 위해 서비스 로직에 코드를 추가한다.

package dev.be.moduleapi.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import dev.be.moduleapi.exception.CustomException;
import dev.be.modulecommon.domain.Member;
import dev.be.modulecommon.enums.CodeEnum;
import dev.be.modulecommon.repositories.MemberRepository;
import dev.be.modulecommon.service.CommonDemoService;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class DemoService {

    @Value("${profile-name}")
    private String name;

  	...  

    public String save() {
        System.out.println("name : " + name);
        
        return "save";
    }

	...
}

 

2. 인텔리제이에서 Profile 설정

인텔리제이에서 Edit Configurations를 통해 프로파일을 설정할 수 있다. 예를 들어, Active profiles에 local과 beta 프로파일을 각각 설정하여 서버를 실행할 때, 프로파일에 따라 데이터베이스 설정이나 로깅 레벨 등 다양한 설정값이 변경되는 것을 확인할 수 있다.

 

서버가 실행되면 로그에 다음과 같이 출력된다.

 

curl 테스트를 해보면 name: local로 출력되는 것을 볼 수 있다.

 

다음으로 beta 프로파일로 변경하고 실행하면 동일하게 프로파일이 적용되는 것을 확인할 수 있다.

 

curl 테스트를 해보면 name: beta로 출력되는 것을 볼 수 있다.

 

이처럼 동일한 코드인데도, 환경에 따라 다른 Property 값을 적용하고 싶을 때 프로파일을 사용하여 코드의 로직을 분기하거나, 설정된 옵션에 따라 애플리케이션의 행위를 정의할 수 있다. 이는 여러 환경에서 동일한 애플리케이션을 효율적으로 관리하고, 특정 조건에 맞게 동작하도록 설정할 수 있는 중요한 방법이다.

 

3. JAR 실행 시 JVM 옵션으로 Profile 적용

운영 환경에서는 주로 JAR 파일로 서버를 실행하게 되는데, 이때 JVM 옵션을 통해 프로파일을 설정할 수 있다.

먼저, build폴더 생성을 위해 다음과 같은 명령어를 사용한다.

./gradlew clean :module-api:buildNeeded --stacktrace --info --refresh-dependencies -x test

 

이어서 해당 서버를 띄우고자 하는 폴더로 이동한 후 다음 명령어를 입력한다.

Local 환경 실행

libs % java -jar -Dspring.profiles.active=local module-api-0.0.1-SNAPSHOT.jar;

 

 

Beta 환경 실행

libs % java -jar -Dspring.profiles.active=beta module-api-0.0.1-SNAPSHOT.jar;

 

 

이처럼 동일한 코드로도 각기 다른 환경에 맞춰 설정을 달리할 수 있으며, 개발 환경에서는 이를 통해 코드의 로직 분기나 설정 변경을 쉽게 관리할 수 있다.

 

실제 실무에서는 반드시 프로파일을 나누어 사용하게 된다. 인텔리제이를 사용한 설정 방법과, 인텔리제이를 사용하지 않고도 JVM 옵션을 통해 설정을 다루는 방법을 알아봤다. 이를 통해 각 환경에 맞는 설정을 효율적으로 관리할 수 있다.