728x90

 

이 친구와 친해지고싶다

 

 

우선 다음과 같이 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

 

 

 

 

잘 출력 되는것을 볼 수 있다

 

새벽에 갑자기 즉흥적으로 알아봣는데 해소되었다..

 

간다...

 

728x90

'개발 > 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

+ Recent posts