[활용]_05_프로파일

1 minute read

프로파일

@Profile 애노테이션은 어디에?

  • @Configuration
  • @Component

어떤 프로파일을 활성화 할 것인가?

  • spring.profiles.active

어떤 프로파일을 추가할 것인가?

  • spring.profiles.include

프로파일용 프로퍼티

  • application-{profile}.properties

프로파일

특정 프로파일에서만 특정한 빈을 등록하고 싶다.

애플리케이션 동작을 특정 프로파일에서 다르게 하고 싶은 경우에 사용

@Profile 어노테이션은 어디에?

※ [실습]

패키지하위에 config 디렉토리 생성 후, 2가지 종류의 빈을 생성

prod 프로파일인 경우와 test 프로파일인 경우에 사용할 hello 빈의 설정이 다르다.

@Profile("prod") //prod 프로파일인 경우에만 hello 빈 사용 가능
@Configuration
public class BaseConfiguration {

    @Bean
    public String hello() {
        return "hello";
    }
}
@Profile("test") //test 프로파일인 경우에만 hello 빈 사용 가능
@Configuration
public class TestConfiguration {

    @Bean
    public String hello() {
        return "hello test";
    }
}

ApplicationRunner로 빈을 사용해보자

@Component
public class SampleRunner implements ApplicationRunner {

    @Autowired
    private String hello;

    @Override
    public void run(ApplicationArguments args) {
        System.out.println("=============================");
        System.out.println(hello);
        System.out.println("=============================");
    }
}

⇒ 지금 상태로 실행하면 에러 발생

why?

hello 빈을 찾을 수 없어서, hello 빈을 생성하고있는 prodtest 프로파일 설정을 해줘야한다.

프로파일 활성화

  • application.properties 파일에서 활성화하려는 빈의 프로파일을 설정할 수 있다.

  • spring.profiles.active

이 설정 또한 property이다. 이전에 학습한 프로퍼티 우선순위에 모두 적용된다.

프로파일 설정에 따라 사용되는 빈이 달라지는 것 확인

image-20200907133555090

image-20200907133638743

프로파일 설정을 test라고 개발했지만, 프로그램을 외부에서 실행하면서 커맨드 라인 아규먼트로 다른 프로파일 설정값을 넘겨주면 ?

※ 별도의 웹서버나 도커에 배포시 다음과 같이 CLI 환경에서 값을 넘겨줄 수 있음

mvn clean package -DskipTests
java -jar target/spring-application-1-1.0-SNAPSHOT.jar --spring.profiles.active=prod

커맨드라인 아규먼트가 application.properties 보다 우선순위가 높기 때문에 prod 프로파일이 적용된다.

image-20200907134059316

프로파일용 프로퍼티

  • application-{profile}.properties

application-prod.properties, application-test.properties 두 개 파일 생성

- application-prod.properties

person.name= Solari Prod

- application-test.properties

person.name= Solari Test

PersonProperties의 name값을 출력해보자

System.out.println(personProperties.getName());

새로 만든 파일을 JAR 파일 내에 없으므로 새로 패키징 후, 커맨드 라인 아규먼트로 프로파일을 지정해서 실행해보자

mvn clean package -DskipTests
java -jar target/spring-application-1-1.0-SNAPSHOT.jar --spring.profiles.active=test
=============================
hello test
Solari Test 							<------
=============================

※ 프로파일에 관련된 properties파일의 우선순위가 기본 application.properties보다 높다.

application.properties의 내용이 application-test.properties의 내용으로 오버라이딩되므로 application.name이 “Solar Test”로 출력된다.

어떤 프로파일을 추가할 것인가?

  • spring.profiles.include

  • 이 설정이 읽혀졌을 때 추가할 프로파일을 명세

- application-prod.properties

spring.profiles.include=proddb

​ → application-prod.properties 파일이 읽혀지면 proddb 프로파일도 같이 읽혀진다.

- application-proddb.properties

person.name=proddb

- SampleRunner

@Component
public class SampleRunner implements ApplicationRunner {

    @Autowired
    private PersonProperties personProperties;

    @Autowired
    private String hello;

    @Override
    public void run(ApplicationArguments args) {
        System.out.println("=============================");
        System.out.println(hello);
        System.out.println(personProperties.getName());
        System.out.println(personProperties.getFullName());
        System.out.println("=============================");
    }
}

prod 프로파일로 실행

=============================
hello
proddb									<--- proddb 프로파일도 같이 읽혀져서 속성값이 오버라이딩 됨
proddb Kim
=============================

※ 개발 환경에서 프로퍼티 추가 시, IDE에서 Program arguments를 줄 수 있음

image-20200907140842998