2022년 04월 07일 TIL

yshjft·2022년 4월 7일
0

데브코스 TIL

목록 보기
14/45

Spring에서 제공하는 기능과 Spring Boot에서 제공되는 기능 구분 주의!!

Environment

  • Spring의 ApplicationContext에서 제공하는 기능
  • ApplicationContext → Bean 관리
  • Environment → Bean에게 영향을 주는 무언가
    • Properties
    • Profile

properties

  • .properties
  • .yml OR .yaml

.properties

  • application.properties
kdt.version=v1.0.0
kdt.support-vendors=a, b, c, d
kdt.minimum-order-amount=1
  • @PropertySource
    PropertySource를 Spring에 추가하기(Spring의 Environment에 프로퍼티 파일의 속성을 주입)위해서 @Configuration와 함께 사용된다.

    @Configuration
    @PropertySource("application.properties")
  • 설정된 protperties 사용

    • by applicationContext
    var applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class);
    var environment = applicationContext.getEnvironment();
    
    var version = environment.getProperty("kdt.version");
    
    // Integer로 읽어오겠다.
    var minimumOrderAmount = environment.getProperty("kdt.minimum-order-amount", Integer.class); 
    
    // List로 읽어 오겠다.
    var supportVendors = environment.getProperty("kdt.support-vendors", List.class); 
    • by @Value

      @Component
      public class OrderProperties {
        @Value("${kdt.version}")
        private String version;
        ...
      }
      • property의 값을 객체에 필드에 주입하여 사용하는 방법

      • @Value()는 환경 변수 값을 읽어올 수도 있다.
        환경 변수에 해당하는 값이 있는지 먼저 확인하고 properties 파일을 확인한다.

      • @Value()는 Bean에서만 사용할 수 있는가?
        YES! 또한 생성자와 함수의 인자에도 적용할 수 있습니다.

        This annotation can be used for injecting values into fields in Spring-managed beans, and it can be applied at the field or constructor/method parameter level.
        출처

      • @Value("${key}")가 타입이 맞지 않는 경우
        exception 발생

      • @Value("${key}")가 존재하지 않는 key일 경우
        key가 문자열로 들어간다

      • @Value("${key:default_value}")
        key에 해당하는 값이 없는 경우 default_value 넣어라

YAML

  • YAML의 핵심은 데이터 중심이다. property를 작성하기 위해 사용한다.

  • 작성 방식

    kdt:
      version: "v1.0"
      minimum-order-amount: 1
      # 배열 작성 방식
      support-vendors:
        - a
        - b
        - c
        - d
      # 멀티 라인 작성 방법:|을 이용해 작성
      description: |
        line 1 hello world
        line 2 xxxxx 
  • 사용 방법

    • PropertySourceFactory

      • Spring의 @PropertySource는 yaml을 지원하지 않는다.(Spring Boot는 지원함)
      • PropertySourceFactory와 @ConfigurationProperties를 이용해서 읽어야 한다.
      • Spring Boot의 기능을 사용한 것이기 때문에 @EnableConfigurationProperties를 통해 @ConfigurationProperties를 사용할 수 있도록 해야한다.
      @Configuration
      @PropertySource(value = "application.yml", factory = YamlPropertiesFactory.class)
      
      ...
      
      public class YamlPropertiesFactory implements PropertySourceFactory {
        @Override
        public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
            var yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
            yamlPropertiesFactoryBean.setResources(resource.getResource());
      
            var properties = yamlPropertiesFactoryBean.getObject();
            return new PropertiesPropertySource(resource.getResource().getFilename(), properties);
        }
      }
      
      ...
      
      @Configuration
      @ConfigurationProperties(prefix = "kdt") // kdt 하위 내용 필드로 주입
      public class OrderProperties {
      	private String version;
          ...
      }

Profile

설정의 일부를 분리하여 특정 환경에서만 사용 가능하도록 한다.

  • @Profile + @Component → profile과 함께 Bean 등록

    • 특정 profile에만 Bean이 등록
    @Repository
    @Profile("dev")
    public class JdbcVoucherRepository implements VoucherRepository {...}
    
    @Repository
    @Profile({"local", "default"})
    public class MemoryVoucherRepository implements VoucherRepository { ... }

특정 profile 사용

  • by applicationContext
var applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(AppConfiguration.class);
var environment = applicationContext.getEnvironment();
environment.setActiveProfiles("local"); // local 프로파일 사용
applicationContext.refresh();
  • by yaml
# 공통 설정: 모든 profile에서 사용
servers:
  - dev.bar.com
  - foo.bar.com
---

# local profile인 경우 사용
spring.config.activate.on-profile: local
kdt:
  version: "v1.0"
  minimum-order-amount: 1
  support-vendors:
    - a
    - b
    - c
    - d
  description: |
    line 1 hello world
    line 2 xxxxx

---

# dev profile인 경우 사용
spring.config.activate.on-profile: dev
kdt:
  version: "v1.0"
  minimum-order-amount: 1
  support-vendors:
    - deva
    - devb
    - devc
    - devd
  description: |
    dev line 1 hello world
    dev line 2 xxxxx
  • spring.config.activate.on-profile은 Spring Boot의 기능이다.
    • Spring 에서는 프로파일에 대한 Bean 정의만 지원한다. profile에 따른 property의 변경은 Spring Boot가 지원한다.
      • 따라서 profile에 따른 property 변경을 사용하고 싶으면 Spring Boot를 사용해라!
      • @SpringBootApplication 사용
        • 직접 입력
         var springApplication = new SpringApplication(KdtApplication.class);
          springApplication.setAdditionalProfiles("local");
        • IDE의 환경 설정에서 원하는 profile을 설정
        • argument로 profile 전달
          --spring.profiles.active=dev
  • yaml 파일 분리
    application-local.yml, application-dev.yml, application.yml

Resource

모든 ApplicationContext가 ResourceLoader를 구현하고 있다 → ApplicationContext에서 Resource 객체를 가져올 수 잇다.

  • Resource와 Resource Loader를 통해 하나의 API로 이미지 파일, 텍스트 파일 등의 외부 리소스를 읽을 수 있도록 하였다.

    var resource = applicationContext.getResource("classpath:application.yml");
    var resource2 = applicationContext.getResource("file:test/sample.txt");
    var resource3 = applicationContext.getResource("https://stackoverflow.com");
  • classpath

    • 클래스나 패키지를 찾을 때 기준이 되는 경로
    • (자바 사용시 JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일경로)
    • 잘 모르겠다면 여길 보자(build path)
  • file
    working directory 경로

profile
꾸준히 나아가자 🐢

0개의 댓글