[Spring Boot] 스프링부트 활용 - 외부설정, Profile

dsunni·2020년 8월 6일
4

🌵 스프링부트 핵심 기능

외부설정

외부설정 파일이란 애플리케이션에서 사용하는 여러 설정값들을 애플리케이션 안 혹은 밖에서 정의할 수 있는 기능이다.


Classpath란?

Classpath란 자바 가상머신이 실행할 때 class파일을 찾는데 그 때 기준이 되는 경로를 의미한다.

Spring에서는 이 classpath를 통해 필요한 resources를 가져와 사용한다.

1. application.properties

application.properties는 흔히 볼 수 있는 가장 중요한 설정 파일이다. Spring boot는 애플리케이션을 구동할 때 자동으로 이 파일을 로딩한다. (규약)

  • key - value 형태로 값을 정의해두면 application에서 참조해서 사용할 수 있다.

application.properties

dsunni.name = dsunni

SampleRunner.java

@Component
public class SampleRunner implements ApplicationRunner {
    @Value("${dsunni.name}")
    private String name;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("========");
        System.out.println(name);
        System.out.println("========");
    }
}
  • ${dsunni.name}을 통해 properties파일에서 선언했던 값을 사용할 수 있다.

image



2. 프로퍼티 우선 순위

  1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties

  2. 테스트에 있는 @TestPropertySource

    @RunWith(SpringRunner.class)
    @TestPropertySource(locations = "classpath:/test.properties")
    @SpringBootTest
    public class springInitApplicationTests {
      @Autowired
      Environment environment;
      
      @Test
      public void contextLoads() {
      		assertThat(environment.getProperty("dsunni.name"))
            		.isEqualTo("dsunni2");
      }
    }
    • Environment로 아규먼트를 사용할 수 있다
    • Test 하위 패키지의 resources에 test.properties 파일로 여러 아규먼트들을 동시에 관리할 수 있다
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트

  4. 커맨드 라인 아규먼트

    • mvn package 로 빌드 하고 jar 파일 생성
    • java -jar target/spring-boot-inflearn-1.0-SNAPSHOT.jar --dsunni.name=fourth
      • 커맨드 라인에서 아규먼트를 fourth로 직접적으로 줄 수 있다
      • properties 안의 값을 overriding

    image

  5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티

  6. ServletConfig 파라미터

  7. ServletContext 파라미터

  8. java:comp/env JNDI 애트리뷰트

  9. System.getProperties() 자바 시스템 프로퍼티

  10. OS 환경 변수

  11. RandomValuePropertySource

  12. JAR 밖에 있는 특정 프로파일용 application properties

  13. JAR 안에 있는 특정 프로파일용 application properties

  14. JAR 밖에 있는 application properties

  15. JAR 안에 있는 application properties

  16. @PropertySource

  17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)


application.properties 자체의 우선 순위

application.properties는 네 곳에 넣을 수 있는데 우선순위가 높은위치에 있는 파일이 낮은걸 덮어 쓴다.

  1. file:./config/
  2. file:./
  3. classpath:/config
  4. classpath:/

랜덤값 설정하기 ${random.*}

dsunni.age = ${random.int}
  • 참고로 서버 포트를 랜덤으로 주려면 server.port = 0 과 같이 0을 주면 된다


3. 타입 세이프 프로퍼티 @ConfigurationProperties

dsunni.name = dsunni
dsunni.age = ${random.int(0,100)}
dsunni.fullName = ${dsunni.name} Lee

위와 같이 같은 key로 시작하는 외부 설정이 많은 경우에는 하나의 Bean으로 묶어서 등록할 수 있다.


@Component
@ConfigurationProperties("dsunni")
public class DsunniProperties {
    private String name;
    int age;
    String fullName;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

@ConfigurationProperties("dsunni") 로 프로퍼티의 키값(dsunni)로 마크해주면 Java Bean Spec을 따라 프로퍼티의 값들을 클래스에 자동으로 바인딩을 해준다.


@SpringBootApplication
@EnableConfigurationProperties(DsunniProperties.class)
public class springInitApplication {
    public static void main(String[] args) {
        SpringApplication.run(springInitApplication.class, args);
    }
}

EnableConfigurationProperties를 통해 ConfigurationProperties를 달고 있는 클래스들을 Bean으로 등록해줘야한다.

DsunniProperties.java 파일은 @Component 어노테이션을 붙여서 빈으로 등록해주면다른 빈에 주입할 수 있다.


@Component
public class SampleRunner implements ApplicationRunner {
//    @Value("${dsunni.name}")
//    private String name;
    
    @Autowired
    DsunniProperties dsunniProperties;
    
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("========");
        System.out.println(dsunniProperties.getName());
        System.out.println("========");
        System.out.println(dsunniProperties.getAge());
    }
}

SampleRunner에 DsunniProperties를 주입 받아서 사용하면 된다.

image



@Profile

Profile이란 스프링에서 특정 Profile에서만 특정한 빈을 등록하고 싶다거나, 애플리케이션 동작을 특정 Profile에서 설정을 다르게 하고 싶을 때 사용하는 기능이다.

BaseConfiguration.java

@Profile("prod")
@Configuration
public class BaseConfiguration {
    @Bean
    public String dsunni() {
        return "dsunni";
    }
}

이 Bean설정 파일은 prod라는 Profile에서만 실행된다.


TestConfiguration.java

@Profile("test")
@Configuration
public class TestConfiguration {
    @Bean
    public String dsunni() {
        return "dsunni test!";
    }
}

@Profile 애노테이션은 보통 @Configuration @Component와 함께 쓰인다.


SampleRunner.java

@Component
public class SampleRunner implements ApplicationRunner {
    @Autowired
    private String dsunni;

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

이렇게만 하고 실행시키면 에러가 뜬다. Profile 설정을 따로 안해줬기 때문이다.

프로퍼티 파일에서 Profile 설정을 해보자


application.properties

spring.profiles.active=prod
  • 어떤 프로파일을 활성화 할 것인가?
    • spring.profiles.active
  • 어떤 프로파일을 추가할 것인가?
    • spring.profiles.include

image

Profile을 설정해줬기 때문에 dsunni에 해당하는 bean을 주입받아 사용할 수 있다.



profile
https://dsunni.tistory.com/ 이사갑니답

0개의 댓글