외부설정 파일이란 애플리케이션에서 사용하는 여러 설정값들을 애플리케이션 안 혹은 밖에서 정의할 수 있는 기능이다.
Classpath란?
Classpath란 자바 가상머신이 실행할 때 class파일을 찾는데 그 때 기준이 되는 경로를 의미한다.
Spring에서는 이 classpath를 통해 필요한 resources를 가져와 사용한다.
application.properties는 흔히 볼 수 있는 가장 중요한 설정 파일이다. Spring boot는 애플리케이션을 구동할 때 자동으로 이 파일을 로딩한다. (규약)
dsunni.name = dsunni
@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("========");
}
}
유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
테스트에 있는 @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");
}
}
@SpringBootTest 애노테이션의 properties 애트리뷰트
커맨드 라인 아규먼트
mvn package
로 빌드 하고 jar 파일 생성java -jar target/spring-boot-inflearn-1.0-SNAPSHOT.jar --dsunni.name=fourth
SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
ServletConfig 파라미터
ServletContext 파라미터
java:comp/env JNDI 애트리뷰트
System.getProperties() 자바 시스템 프로퍼티
OS 환경 변수
RandomValuePropertySource
JAR 밖에 있는 특정 프로파일용 application properties
JAR 안에 있는 특정 프로파일용 application properties
JAR 밖에 있는 application properties
JAR 안에 있는 application properties
@PropertySource
기본 프로퍼티 (SpringApplication.setDefaultProperties)
application.properties는 네 곳에 넣을 수 있는데 우선순위가 높은위치에 있는 파일이 낮은걸 덮어 쓴다.
dsunni.age = ${random.int}
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를 주입 받아서 사용하면 된다.
Profile이란 스프링에서 특정 Profile에서만 특정한 빈을 등록하고 싶다거나, 애플리케이션 동작을 특정 Profile에서 설정을 다르게 하고 싶을 때 사용하는 기능이다.
@Profile("prod")
@Configuration
public class BaseConfiguration {
@Bean
public String dsunni() {
return "dsunni";
}
}
이 Bean설정 파일은 prod
라는 Profile에서만 실행된다.
@Profile("test")
@Configuration
public class TestConfiguration {
@Bean
public String dsunni() {
return "dsunni test!";
}
}
@Profile 애노테이션은 보통 @Configuration @Component와 함께 쓰인다.
@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 설정을 해보자
spring.profiles.active=prod
spring.profiles.active
spring.profiles.include
Profile을 설정해줬기 때문에 dsunni에 해당하는 bean을 주입받아 사용할 수 있다.