author
postNo
status
thumbnail
description
category
tags
createdAt
updatedAt
프로필
프로필이란 무엇일까요? 시스템을 개발하다보면 config파일을 마주하게 됩니다.
DB연결에 필요한 정보들을 담아둘 수 있죠.
그리고 dev에서는 xxx_dev db연결하고 prod에서는 xxx_prod로 연결할 필요가 있습니다.
즉, 개발 환경에 맞는 config파일을 불러와야 합니다.
이를 어떻게 구현할 수 있을까요?
이는 각 환경에 맞는 프로필을 설정해서 프로필 정보에 따라 각기 다른 config파일을 호출하도록 구현합니다.
spring 에서 프로필을 설정하는 방법은 3가지가 있습니다.
- setActiveProfiles()
- 자바 시스템 프로퍼티
- OS 환경 변수
프로필 설정 1. setActiveProfiles()
java코드에서 프로필을 설정하는 방법입니다. 테스트를 위하여 dev와 prod의 프로필 두개를 만들어보도록 하겠습니다.
2개의 클래스를 생성하였습니다. 각 클래스는 환경에 맞게
@Profile을 설정해주고 String을 리턴하는 HelloEnv라는 동일한 이름으로 메서드를 생성하고 각 환경에 맞는 String을 리턴하는 간단한 예제입니다.설정클래스로 가서 HelloEnv를 호출하는 Bean을 등록해보도록 하겠습니다.
@Autowired 어노테이션은 helloEnv라고 등록되어있는 Bean 을 찾아 자동으로 주입해주는 어노테이션 입니다.위 코드에서 HelloEnv가 두개가 있기때문에 일반적인 상황이라면 오류가 발생하겠지만, Profle이 설정되어있어 실행에 오류는 없습니다.
main코드로 가서 프로필을 설정해보도록 하겠습니다.
위 코드를 살펴보면
- 컨테이너 초기화
- getEnvironment()를 통해 env값 조회
- setActiveProfiles()를 통해 프로필 주입
의 순서로 작성되었습니다.
실행해보면
env : Dev라고 출력되는것을 볼 수 있습니다. 프로필 주입할 때 prod로 주입하면 결과값 역시 Prod로 정상 출력됩니다.
프로필 설정 2. 자바 시스템 프로퍼티
자바 시스템 프로퍼티는 JVM이 실행될 때 key-value로 이루어진 JVM 시스템 속성값 입니다. 여기에 프로필을 주입할 수 있습니다.
위 명령어로 주입이 가능합니다.
프로필 설정 3. OS 환경 변수
OS 환경 변수로도 프로필을 주입할 수 있습니다.
프로필 설정의 우선순위
만약 위 1~3 모두 설정되어있다면 프로필은 다음과 같은 우선순위를 가지게 됩니다.
- setActiveProfiles()
- 자바 시스템 프로퍼티
- OS 환경 변수
그 외 다양한 프로필 설정
프로필 설정은
@Profile("dev, staging")과 같이 두개 이상을 쉼표로 구분하여 설정도 가능합니다.@Profile("!prod")와 같이 느낌표를 사용하여 해당 프로필이 아닐 때 라고 표현할 수 있습니다.main코드에서
ctx.getEnvironment().setActiveProfiles("dev", "mysql");와 같이 여러개 주입하는것도 가능합니다.프로퍼티 설정
프로퍼티는 spring 프로젝트를 생성하면
/resources/application-properties라는 파일이 기본적으로 생성되어 있습니다.이 곳에 설정값을 입력해두고 코드에서 불러와 사용할 수 있습니다.
위와 같이 설정했다면
코드와 같이
@Value 어노테이션을 이용하여 경로를 설정해주면 Autowired와 같이 자동으로 주입됩니다.그리고 정상 동작하는지 확인해봅니다.
yaml
기본적으로 생성되어있는
application-properties파일보다는 보기가 더욱 편한 yaml문서로 작성할 수 있습니다.사용법은 동일합니다.
위에서 설명하였던 프로필과 프로퍼티를 사용하여 환경에 맞는 설정값을 불러오도록 구현하면 됩니다.