SpringBoot

외부설정

Jungsoomin :) 2020. 10. 3. 23:37

application.properties 

스프링부트 구동시 자동으로 로딩하는 규약

  • ${random.int} 등으로 랜덤 값 생성가능
  • ${key} 로 기존에 정의된 값 사용가능
soomin.name = soomin
soomin.age = ${random.int}
soomin.fullName = ${soomin.name} Jung

Application.properties 의 다중 빌드와 우선순위

겹치는 것은 우선순위로 재정의

  • file:/config/ (1): 프로젝트 파일 밑의 config 폴더 밑
  • file:./ (2): 프로젝트 루트
  • classpath:/config/ (3): 클래스패스의 config 폴더 밑
  • classpath:/ (4) : 클래스패스

우선 순위

  • 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties (1)
  • @TestPropertySource (2) : properties 속성 값에 키=값 설정 / 별도 properties 파일location 속성에 정의가능
  • @SpringBootTest (3) : properties 속성 값에 키=값을 설정
  • 커맨드 라인 아규먼트 (4) : java -jar target/configuration-0.0.1-SNAPSHOT.jar --키=값
//@TestPropertySource(properties = "soomin.name=soo")
@TestPropertySource(locations = "classpath:/test.properties")
@SpringBootTest
class ConfigurationApplicationTests {

    @Autowired
    private Environment environment;

    @Test
    void contextLoads() {
        Assertions.assertThat(environment.getProperty("soomin.name"))
                .isEqualTo("soo");
        System.out.println(environment.getProperty("soomin.age"));
    }

}

테스트 코드 빌드 과정

  1. src 의 모든 파일을 classpath 에 놓음
  2. test의 모든 파일을 classpath 에 놓음
  3. 이 과정에서 application.properties 가 존재시 덮어씌워짐

이 과정에서 srcprorperties 에 정의돤 내용이 testproperties에 없는 상태에서 테스트에서 참조하려면 테스트는 깨진다.

 

application.properties 는 src 에서 사용하되 별도의 test.properties 파일을 두어 @TestPropertySource 에서 읽어 오는게 좋다.

  • src 의 application.properties 클래스패스로 이동
  • test 의 test.properties 파일이 @TestPropertySource로 읽어짐. 그 과정에서 같은 값우선순위가 높은 값으로 덮어 씀
soomin.name=soo # 덮어씌워지는 값

같은 키로 시작하는 외부설정 묶어 Bean으로 등록하기

 

  1. 자바빈 스팩에 맞는 클래스를 생성 / 키값의 이름을 가진 필드 선언 
  2. @ConfigurationProperties 선언, 속성으로 공통된 키이름 정의 / Spring Bean으로 등록
  3. 메타 정보를 생성하는 플러그인spring-boot-configuration-processor 추가 ( 메타 데이터를 생성 ,자동완성이 가능하게 함 )
	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

   4. 스프링부트 구동클래스@EnableConfigurationProperties 선언, 속성 값으로 @ConfigurationProperties 클래스 등록

 

 

application.properties

soomin.name = soomin
soomin.age = ${random.int(0,100)}
soomin.fullName = ${soomin.name} Jung

JavaBean 클래스 : Bean 등록 , 공통된 키 값 설정 << 프로퍼티에 대한 자료값 선언으로 @Value 보다 Type-Safe

@Component
@ConfigurationProperties("soomin")
public class SoominProperties {

    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;
    }
}

스프링 부트 구동클래스 : @EnableConfigurationProperties 에 @ConfigurationProperties 클래스 등록

@SpringBootApplication
@EnableConfigurationProperties(SoominProperties.class)
public class ConfigurationApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConfigurationApplication.class, args);
    }

}

시간의 properties 컨버전

 

  1. @ConfigurationProperties 클래스에 Duration 타입 필드 선언 (이름주의)
  2. getter, setter 선언 (자바빈)
  3. Duration 클래스의 정적메서드기본 값 설정
  4. properties 파일에 키에 맞는 숫자 정의

Prefix

  • ns : 나노초
  • ms : 밀리초
  • s : 초
  • m : 분
  • h : 시
  • d : 날

** properties 파일의 키값은 굉장히 유연함 , Prefix 로 시간 단위 설정

soomin.name = soomin
soomin.age = ${random.int(0,100)}
soomin.fullName = ${soomin.name} Jung
soomin.sessionTimeout=20s

##케밥케이스
#soomin-name = soomin
#soomin-age = ${random.int(0,100)}
#soomin-fullName = ${soomin.name} Jung
#
##스네이크케이스
#soomin_name = soomin
#soomin_age = ${random.int(0,100)}
#soomin_fullName = ${soomin.name} Jung
#
##카멜케이스
#soominName = soomin
#soominAge = ${random.int(0,100)}
#soominFullName = ${soomin.name} Jung

Duration 클래스 선언 한 것 확인.

@Component
@ConfigurationProperties("soomin")
@Validated
public class SoominProperties {

    @NotEmpty
    String name;

    int age;

    String fullName;

    private Duration sessionTimeout = Duration.ofSeconds(30);//기본값


    public Duration getSessionTimeout() {
        return sessionTimeout;
    }

    public void setSessionTimeout(Duration sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }

    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;
    }
}

 

물론 Hibernate-validator ( jsr 303 ) 적용가능

@Validated
public class SoominProperties {

    @NotEmpty
    String name;

'SpringBoot' 카테고리의 다른 글

스프링부트 기본 로거 설정  (0) 2020.10.07
Profile  (0) 2020.10.04
SpringApplication 클래스  (0) 2020.10.03
독립적으로 실행가능한 JAR  (0) 2020.10.03
내장 웹 서버  (0) 2020.10.02