2022-04-07 TIL
26737 단어 Spring bootprofileyamlSpring boot
프로그래머스 백엔드 데브코스 18일차
팀면담
- 잘 활용해라
- 개발에 재미를 느낄 수 있게 한다.
- 코드리뷰
- 다음주부터 오프라인 코드리뷰
- 팀원들에게 리뷰요청을 해도 무관 -> 서로 조율하는 과정
SpringBoot part1
PropertySource
- EnvironmentCapable
package org.springframework.core.env;
public interface EnvironmentCapable {
Environment getEnvironment();
}
- application.properties
version = v1.0.0
kdt.version = v1.0.0
kdt.support-vendors = a, b, c, d, e, f, g
kdt.minimun-order-amount = 1
- getEnvironment();
var applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class);
// 환경설정 property 값을 가져 올 수 있다.
var environment = applicationContext.getEnvironment();
var version = environment.getProperty("kdt.version");
var vendors = environment.getProperty("kdt.support-vendors", List.class);
var minimumOrderAmount = environment.getProperty("kdt.minimun-order-amount", Integer.class);
- @Value
// 만약 찾는 property가 없다면 기본값 지정도 가능
@Value("${kdt.version:v.0.0.0}")
private String version;
@Value("${kdt.minimum-order-amount:0}")
private int minimumOrderAmount;
@Value("${kdt.support-vendors:a, b, c, d, e, f, g}")
private List<String> supportVendors;
// System에 설정된 값도 불러 올 수 있다.
@Value("${JAVA_HOME}")
private String javaHome;
// 생성자의 매개변수에도 가능
public constructor(@Value("${version:v0.0.0}") String version) { ... }
- @Configuaration, @ConfigurationProperties, @EnableConfigurationProperties
// @Value 없이도 properties를 찾을 수 있게 해줌
@Configuration
@ConfigurationProperties(prefix = "kdt")
public class OrderProperties {
private String version;
private int minimumOrderAmount;
private List<String> supportVendors;
private String description;
// 예외는 있음
@Value("${JAVA_HOME}")
private String javaHome;
...
}
// SpringBoot에서 사용하는 기능이라 @EnableConfigurationProperties을 붙여야 함
@Configuration
@PropertySource(value = "...", factory = ...)
@ComponentScan(basePackages = {"...", "...", "..."})
@EnableConfigurationProperties
public class AppConfiguration { ... }
- propertyHierarchy
출처:docs.spring.io
YAML
- factory
// springframework의 @propertySource는 yaml을 기본적으로 지원하지 않기 때문에
// 따로 factory를 만들어서 사용해야 한다.
@PropertySource(value = "application.yaml", factory = YamlPropertiesFactory.class)
public class AppConfiguration { ... }
// yaml을 가져오기 위한 factory 코드
public class YamlPropertiesFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
var yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
yamlPropertiesFactoryBean.setResources(encodedResource.getResource());
var properties = yamlPropertiesFactoryBean.getObject();
return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
}
}
Profile
// Qualifier 대신 Profile을 사용 할 수 있다.
@Profile({"local", "default"})
public class ... { ... }
@Profile("dev")
public class ... { ... }
// applicationContext의 environment에서 profile을 지정 할 수 있다.
// profile을 지정한 후에는 새로고침을 해줘야 한다.
public class ... {
var applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(AppConfiguration.class);
var environment = applicationContext.getEnvironment();
environment.setActiveProfiles("dev");
applicationContext.refresh();
}
// @Bean @Configuration에도 @Profile을 사용 할 수 있다.
// 어플리케이션 시작 단계에서 프로파일을 지정 할 수 있다.
@SpringBootApplication
@ComponentScan(basePackages = {"...", "...", "..."})
public class Application {
public static void main(String[] args) {
var springApplication = new SpringApplication(KdtApplication.class);
springApplication.setAdditionalProfiles("local");
var applicationContext = springApplication.run(args);
}
}
- 개발에 재미를 느낄 수 있게 한다.
- 다음주부터 오프라인 코드리뷰
- 팀원들에게 리뷰요청을 해도 무관 -> 서로 조율하는 과정
package org.springframework.core.env;
public interface EnvironmentCapable {
Environment getEnvironment();
}
version = v1.0.0
kdt.version = v1.0.0
kdt.support-vendors = a, b, c, d, e, f, g
kdt.minimun-order-amount = 1
var applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class);
// 환경설정 property 값을 가져 올 수 있다.
var environment = applicationContext.getEnvironment();
var version = environment.getProperty("kdt.version");
var vendors = environment.getProperty("kdt.support-vendors", List.class);
var minimumOrderAmount = environment.getProperty("kdt.minimun-order-amount", Integer.class);
// 만약 찾는 property가 없다면 기본값 지정도 가능
@Value("${kdt.version:v.0.0.0}")
private String version;
@Value("${kdt.minimum-order-amount:0}")
private int minimumOrderAmount;
@Value("${kdt.support-vendors:a, b, c, d, e, f, g}")
private List<String> supportVendors;
// System에 설정된 값도 불러 올 수 있다.
@Value("${JAVA_HOME}")
private String javaHome;
// 생성자의 매개변수에도 가능
public constructor(@Value("${version:v0.0.0}") String version) { ... }
// @Value 없이도 properties를 찾을 수 있게 해줌
@Configuration
@ConfigurationProperties(prefix = "kdt")
public class OrderProperties {
private String version;
private int minimumOrderAmount;
private List<String> supportVendors;
private String description;
// 예외는 있음
@Value("${JAVA_HOME}")
private String javaHome;
...
}
// SpringBoot에서 사용하는 기능이라 @EnableConfigurationProperties을 붙여야 함
@Configuration
@PropertySource(value = "...", factory = ...)
@ComponentScan(basePackages = {"...", "...", "..."})
@EnableConfigurationProperties
public class AppConfiguration { ... }
출처:docs.spring.io
// springframework의 @propertySource는 yaml을 기본적으로 지원하지 않기 때문에
// 따로 factory를 만들어서 사용해야 한다.
@PropertySource(value = "application.yaml", factory = YamlPropertiesFactory.class)
public class AppConfiguration { ... }
// yaml을 가져오기 위한 factory 코드
public class YamlPropertiesFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
var yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
yamlPropertiesFactoryBean.setResources(encodedResource.getResource());
var properties = yamlPropertiesFactoryBean.getObject();
return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
}
}
// Qualifier 대신 Profile을 사용 할 수 있다.
@Profile({"local", "default"})
public class ... { ... }
@Profile("dev")
public class ... { ... }
// applicationContext의 environment에서 profile을 지정 할 수 있다.
// profile을 지정한 후에는 새로고침을 해줘야 한다.
public class ... {
var applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(AppConfiguration.class);
var environment = applicationContext.getEnvironment();
environment.setActiveProfiles("dev");
applicationContext.refresh();
}
// @Bean @Configuration에도 @Profile을 사용 할 수 있다.
// 어플리케이션 시작 단계에서 프로파일을 지정 할 수 있다.
@SpringBootApplication
@ComponentScan(basePackages = {"...", "...", "..."})
public class Application {
public static void main(String[] args) {
var springApplication = new SpringApplication(KdtApplication.class);
springApplication.setAdditionalProfiles("local");
var applicationContext = springApplication.run(args);
}
}
아래는 yaml 파일 코드다.
kdt:
version: "default-v1.0.0"
minimum-order-amount: 1
support-vendors:
- default
description: |-
line 1 hello world
line 2 xxxx
line 3
---
spring.config.activate.on-profile: :local
kdt:
version: "v1.0.0"
minimum-order-amount: 1
support-vendors:
- a
- b
- c
- d
description: |-
line 1 hello world
line 2 xxxx
line 3
---
spring.config.activate.on-profile: :dev
kdt:
version: "v1.0.0-dev"
minimum-order-amount: 1
support-vendors:
- dev-a
- dev-b
description: |-
dev
dev
Resource
- 거의 대부분의 ApplicationContext가 ResourceLoader를 구현하고 있다.
var resource = applicationContext.getResource("application.yaml");
var resource2 = applicationContext.getResource("file:sample.txt");
System.out.println("resource = " + resource.getClass().getCanonicalName());
var file = resource.getFile();
var strings = Files.readAllLines(file.toPath());
System.out.println(strings.stream().reduce("", (a, b) -> a + "\n" + b));
var resource3 = applicationContext.getResource("https://stackoverflow.com/");
var readableByteChannel = Channels.newChannel(resource3.getURL().openStream());
var bufferedReader = new BufferedReader(Channels.newReader(readableByteChannel, StandardCharsets.UTF_8));
var contents = bufferedReader.lines().collect(Collectors.joining("\n"));
System.out.println("contents = " + contents);
꿀팁
- crtl + space
Author And Source
이 문제에 관하여(2022-04-07 TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nnagman/2022-04-07-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)