프로필

랏 뜨·2025년 1월 7일

🔎 Overview

  실습을 진행하던 중 @ActiveProfiles 라는 어노테이션을 사용할 일이 있었다.
물론 여러가지 추가적인 절차는 필요했지만, 이 어노테이션 하나만 사용해줌으로 테스트를 아예 새로운 환경에서 진행할 수 있었다.

  ActiveProfiles. 직역하면 프로필을 활성화한다는 것인데, 프로필? 생소하지만 생소하지 않은 단어이다.
자바 스프링에서의 프로필도 우리가 흔히 프로필이라는 이름으로 사용하듯, 본인 정보를 의미하는 것일까?

  자바에서의 프로필은 무엇을 이야기하는 것일까?


📕 자바 스프링에서의 프로필

  • 환경에 따라 애플리케이션의 동작이나 빈 설정선택적으로 활성화하거나 비활성화할 수 있는 메커니즘
  • 애플리케이션에서 서로 다른 환경이나 구성을 관리하기 위한 논리적 구분
  • 개발, 테스트, 배포 등 다양한 실행 환경에 따른 설정 및 동작을 지정할 수 있음
  • 여러 프로필을 동시에 등록하는 것도 가능
    • 이 경우, 동일한 타입의 빈이 여러 프로필에서 정의되었으면 충돌 발생
    • @Primary우선순위를 지정해주거나, 프로필별로 독립적인 빈을 생성해야 함


🤔 프로필이 필요한 이유

  • 애플리케이션은 보통 여러 환경에서 실행
    • 개발 환경(dev) : 로컬 개발자 시스템에서 실행
    • 테스트 환경(test) : QA, 통합 테스트용 서버에서 실행
    • 배포 환경(prod) : 실제 운영 환경
  • 이러한 경우, 각 환경마다 요구사항이 다를 수 있음
  • ex) DB 연결 정보, 로깅 설정, API 키 또는 외부 시스템의 연결 정보
  • 스프링 프로필을 사용하여 이러한 환경별 설정을 보다 효율적으로 관리하고 전환할 수 있음

1️⃣ @Profile

  • 특정 환경에서 스프링 빈을 로드 및 활성화
public interface CustomMode {
	public String printMode();
}

@Component
@Profile("dev")
public class DevMode implements CustomMode {
	public String printMode() {
    	return "Now is the dev mode";
    }
}

@Component
@Profile("test")
public class TestMode implements CustomMode {
	public void printMode() {
    	return "Now is the test mode";
    }
}
  • dev 프로필일 때, Devmode 빈만 활성화
  • test 프로필일 때, TestMode 빈만 활성화


2️⃣ @ActiveProfiles

  • 테스트 환경에서 사용
  • 특정 프로필 활성화
@SpringBootTest
@ActiveProfiles("test")
public class CustomModeTest {
	@Autowired
    private CustomMode customMode;
    
    @Test
    void test() {
    	assertEquals(customMode.printMode(), "Now is the test mode");
    }
}
  • test 프로필을 활성화
  • customMode.printMode()TestMode 클래스의 메서드를 호출


⚙️ application.yml 또는 application.properties 설정

  • 환경별 프로필 구분을 위해 application.yml 또는 application.properties 파일에서 환경별 설정을 정의

application.yml 예제

# 공통 설정
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://localhost:3306/common_db
    username: sa
    password:
    
# 개발 환경 (dev)
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db
    username: dev
    password:
    
# 테스트 환경 (test)
spring:
  profiles: test
  datasource:
    url: jdbc:mysql://localhost:3306/test_db
    username: test
    password:  
  • spring.profiles.active 를 사용해, 기본적으로 활성화할 프로필 지정
  • 미사용 시, default 프로필 활성
  • spring.profiles 값의 변경을 통해 프로필 설정 변경
  • 예제는 기본적으로 dev 프로필이 활성화되며, test 프로필을 활성화 할 시의 설정 값도 지정


💡 프로필 별 application.yml 값 불러오기


application.yml 파일

spring:
  profiles:
    active: dev
    
spring:
  profiles: dev
custom.msg: "dev mode message"

spring:
  profiles: test
custom.msg: "test mode message"

Class 파일

@Component
public class CustomMode {
	@Value("${custom.msg}")
    private String msg;
    
    public void printMsg() {
    	System.out.println(msg);
    }
}
  • ymlprofiles 선택에 따라 CustomMode 에서의 msg 이 변경
  • @Value("${custom.msg}") 어노테이션으로, 설정 파일custom.msg 값을 가져옴
  • 현재는 dev 모드가 active 되어 있으므로, "dev mode message" 가 출력

⛓️‍💥 프로필 별로 applictaion.yml 분리

  • 스프링은 기본적으로 application.yml 파일을 먼저 읽음
  • 이후, 활성화된 프로필에 따라 application-{profile}.yml 파일을 추가로 읽음
    • {profile} : 활성화된 프로필 이름
    • ex) application-test.yml , application-dev.yml ...
  • 중복된 설정 값이 있을 경우, application-dev.yml 같은 프로필별 설정 파일의 값이 application.yml , 즉 기본 설정 파일의 값을 덮어씀

➡️ 스프링 프로필 동작 방식

  1. 프로필 정의
  • @Profile 을 이용해 특정 프로필 별로 이용할 빈을 정의

  1. 프로필 활성화
  • spring.profiles.active 를 사용해서 기본적으로 사용할 프로필 활성화
  • 따로 설정이 없다면 default , 즉 기본 프로필 사용

  1. 프로필 선택
  • 여러 방법으로 프로필 선택
  • 필자의 경우 application.yml 설정 값 변경을 이용

✔️ 현재 활성화된 프로필 확인

  • Environment 를 사용하여 현재 활성화된 프로필 확인 가능
@Component
@RequiredArgsConstructor
public class CustomClass {
	private final Environment environment;
    
    public void printActiveProfiles() {
    	String[] profiles = environment.getActiveProfiles();
        System.out.print("활성화된 프로필 : ");
        for (String profile : profiles) {
        	System.out.print(profile + " ");
        }
        
        profiles = environment.getDefaultProfiles();
        System.out.print("디폴트 프로필 : ");
        for (String profile : profiles) {
        	System.out.print(profile + " ")
        }
    }
}
  • environment.getActiveProfiles() : 현재 활성화된 프로필 목록 반환
  • environment.getDefaultProfiles() : 활성화된 프로필이 없을 때 사용할 디폴트 프로필 목록을 반환

참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기록

0개의 댓글