이 친구와 친해지고싶다
우선 다음과 같이 yml 파일에 server의 port를 적어놧다 치자
property나 yml(yaml) 두 방식 다
@Value("${}") 이 문법을 써서 프로퍼티 값을 가져오는건 잘안다
근데 이게 많아질 수록 클래스에는 필드가 많아지는 샘이다(인스턴스 멤버)
물론 스프링은 싱글톤 이긴 하지만
여러 서비스에서 서버의 포트를 사용한다면 그것도 중복이긴 할 것 같다(우기기)
그래서 원하는것은 yml 파일에서 실시간으로 "server.port" 와 같이
문자열을 파라미터로 넘겨서 리턴 받고싶었다.
또한
@PropertySource 라는 어노테이션에 application.properties 나 특정 프로퍼티를 지정하고
클래스의 멤버에 매핑하는방법도 있는데 (가끔 써봣다)
스프링 공식 문서에서는 yml(yaml)에서는 사용할 수 없다 나왓다
그리고 YAML 파일을 직접 로드하려면
이런 내용이 있다
여기서 눈여겨 봐야할건 YamlPropertiesFactoryBean 이다
내용은 YamlPropertiesFactoryBean은 yaml 파일을properties 파일로 로드한다는 것 같다
내용은 얼마안되니 보자
일단 생성자로 생성할 수 있고, 기본 전략은 싱글톤이다.
YamlProcessor을 확장했기에 YamlProcessor에서 열려있는것은 사용할 수 있다
그래서 다음과 같은 코드를 작성했다
우선 결론적으로 사용할 내가만든 클래스이다, 키를 주면 꺼내는 메서드가 있다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import java.util.*; public class MyYmlProperty { private final YamlPropertiesFactoryBean yamlBean; public MyYmlProperty(YamlPropertiesFactoryBean yamlBean) { this.yamlBean = yamlBean; } public String getKey(String keyName) { Properties properties = yamlBean.getObject(); return properties.getProperty(keyName); } } | cs |
여기가 실제로 Bean을 등록하는 부분이다
setter로 Resource 위치를 알려주면 되는데 application.yml 파일명을 지정했다 (클래스패스)
(참고로 ClassPathResource는 Resource의 구현체이다)
그리고 위에 있는 MyYmlProperty에 생성자 주입하여 Bean을 등록했다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import com.myjwt.ksj.common.MyYmlProperty; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @Configuration public class TestConfig { @Bean public MyYmlProperty myYmlProperty() { YamlPropertiesFactoryBean propertiesFactoryBean = new YamlPropertiesFactoryBean(); // Resource classPathResource = new ClassPathResource("application.yml"); ClassPathResource classPathResource = new ClassPathResource("application.yml"); propertiesFactoryBean.setResources(classPathResource); MyYmlProperty myYmlProperty = new MyYmlProperty(propertiesFactoryBean); return myYmlProperty; } } | cs |
그렇다면 다음과 같이 사용할수있다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Controller @RequiredArgsConstructor public class MainController { // 첫번째 방법 @Value("${server.port}") private Integer port; // 두번째 방법 private final MyYmlProperty myYmlProperty; @GetMapping("/") public String main() { // 첫번째 방법의 필드에서 가져오기 System.out.println("port = " + port); // 두번째 방법의 메서드로 가져오기 String serverPort = myYmlProperty.getKey("server.port"); System.out.println("serverPort = " + serverPort); return "main"; } } | cs |
잘 출력 되는것을 볼 수 있다
새벽에 갑자기 즉흥적으로 알아봣는데 해소되었다..
간다...
'개발 > spring' 카테고리의 다른 글
JUnit5 배워보자 (0) | 2024.05.05 |
---|---|
Junit 5 설정하기 (0) | 2024.04.28 |
Test 코드에서 lombok 사용하기 (0) | 2024.02.13 |
[트랜잭션] 트랜잭션을 위한 Exception 종류 알아보기 (0) | 2022.12.28 |
message source사용하기 (0) | 2021.03.05 |